@wrongstack/mcp 0.284.1 → 0.286.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.
@@ -0,0 +1,65 @@
1
+ import { type MCPAuthorizationDiscoveryOptions, type MCPAuthorizationDiscoveryResult, type MCPTokenExchangeOptions, type MCPTokenSet } from './authorization.js';
2
+ import type { MCPAuthorizationStateEvent, MCPVaultTokenStore } from './token-store.js';
3
+ type DiscoverAuthorization = (resource: string, options?: MCPAuthorizationDiscoveryOptions) => Promise<MCPAuthorizationDiscoveryResult>;
4
+ type ExchangeAuthorizationCode = (options: MCPTokenExchangeOptions) => Promise<MCPTokenSet>;
5
+ export interface MCPAuthorizationManagerOptions {
6
+ store: MCPVaultTokenStore;
7
+ pendingTtlMs?: number | undefined;
8
+ discover?: DiscoverAuthorization | undefined;
9
+ exchange?: ExchangeAuthorizationCode | undefined;
10
+ now?: (() => number) | undefined;
11
+ onStateChange?: ((event: MCPAuthorizationStateEvent) => void) | undefined;
12
+ }
13
+ export interface MCPAuthorizationStartInput {
14
+ serverName: string;
15
+ resource: string;
16
+ clientId: string;
17
+ redirectUri: string;
18
+ scopes?: readonly string[] | undefined;
19
+ challengeHeader?: string | null | undefined;
20
+ signal?: AbortSignal | undefined;
21
+ }
22
+ export interface MCPAuthorizationStartResult {
23
+ serverName: string;
24
+ resource: string;
25
+ authorizationUrl: string;
26
+ redirectUri: string;
27
+ scopes: string[];
28
+ expiresAt: number;
29
+ }
30
+ export interface MCPAuthorizationCompleteInput {
31
+ serverName: string;
32
+ resource: string;
33
+ callbackUrl: string;
34
+ signal?: AbortSignal | undefined;
35
+ }
36
+ export interface MCPAuthorizationStatus {
37
+ serverName: string;
38
+ resource: string;
39
+ state: 'not_authorized' | 'pending' | 'authorized' | 'expired';
40
+ expiresAt?: number | undefined;
41
+ scopes: string[];
42
+ canRefresh: boolean;
43
+ }
44
+ /**
45
+ * Surface-neutral manual OAuth coordinator. PKCE verifier/state stay only in
46
+ * this bounded, expiring in-memory map; completed credentials are handed to
47
+ * the host-owned vault store.
48
+ */
49
+ export declare class MCPAuthorizationManager {
50
+ private readonly options;
51
+ private readonly pending;
52
+ private readonly pendingTtlMs;
53
+ private readonly discover;
54
+ private readonly exchange;
55
+ private readonly now;
56
+ constructor(options: MCPAuthorizationManagerOptions);
57
+ begin(input: MCPAuthorizationStartInput): Promise<MCPAuthorizationStartResult>;
58
+ complete(input: MCPAuthorizationCompleteInput): Promise<MCPAuthorizationStatus>;
59
+ status(serverName: string, resource: string): Promise<MCPAuthorizationStatus>;
60
+ disconnect(serverName: string, resource: string): Promise<boolean>;
61
+ private pruneExpired;
62
+ private emit;
63
+ }
64
+ export {};
65
+ //# sourceMappingURL=authorization-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-manager.d.ts","sourceRoot":"","sources":["../src/authorization-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ export interface MCPAccessToken {
2
+ accessToken: string;
3
+ tokenType?: string | undefined;
4
+ /** Exact canonical MCP resource URI this token was minted for. */
5
+ resource: string;
6
+ expiresAt?: number | undefined;
7
+ scopes?: string[] | undefined;
8
+ }
9
+ export interface MCPAuthorizationContext {
10
+ serverName: string;
11
+ resource: string;
12
+ signal?: AbortSignal | undefined;
13
+ }
14
+ export interface MCPAuthorizationChallenge {
15
+ status: 401;
16
+ resource: string;
17
+ resourceMetadataUrl?: string | undefined;
18
+ scopes: string[];
19
+ rawScheme: 'Bearer';
20
+ }
21
+ export interface MCPProtectedResourceMetadata {
22
+ resource: string;
23
+ authorizationServers: string[];
24
+ scopesSupported: string[];
25
+ }
26
+ export interface MCPAuthorizationServerMetadata {
27
+ issuer: string;
28
+ authorizationEndpoint: string;
29
+ tokenEndpoint: string;
30
+ registrationEndpoint?: string | undefined;
31
+ scopesSupported: string[];
32
+ }
33
+ export interface MCPAuthorizationDiscoveryResult {
34
+ resourceMetadataUrl: string;
35
+ authorizationServerMetadataUrl: string;
36
+ protectedResource: MCPProtectedResourceMetadata;
37
+ authorizationServer: MCPAuthorizationServerMetadata;
38
+ }
39
+ export type MCPAuthorizationJsonFetcher = (url: string, signal?: AbortSignal | undefined) => Promise<unknown | undefined>;
40
+ export interface MCPAuthorizationDiscoveryOptions {
41
+ challengeHeader?: string | null | undefined;
42
+ signal?: AbortSignal | undefined;
43
+ timeoutMs?: number | undefined;
44
+ maxResponseBytes?: number | undefined;
45
+ lookup?: BrowserCompatibleDnsLookup | undefined;
46
+ /** Test/host override. Production callers should use the pinned default. */
47
+ fetchJson?: MCPAuthorizationJsonFetcher | undefined;
48
+ }
49
+ export interface MCPAuthorizationSession {
50
+ authorizationUrl: string;
51
+ state: string;
52
+ codeVerifier: string;
53
+ redirectUri: string;
54
+ clientId: string;
55
+ resource: string;
56
+ }
57
+ export interface MCPTokenSet extends MCPAccessToken {
58
+ refreshToken?: string | undefined;
59
+ }
60
+ export interface MCPAuthorizationRequestOptions {
61
+ authorizationServer: MCPAuthorizationServerMetadata;
62
+ clientId: string;
63
+ redirectUri: string;
64
+ resource: string;
65
+ scopes?: readonly string[] | undefined;
66
+ }
67
+ export interface MCPTokenExchangeOptions {
68
+ authorizationServer: MCPAuthorizationServerMetadata;
69
+ clientId: string;
70
+ redirectUri: string;
71
+ resource: string;
72
+ code: string;
73
+ codeVerifier: string;
74
+ signal?: AbortSignal | undefined;
75
+ timeoutMs?: number | undefined;
76
+ maxResponseBytes?: number | undefined;
77
+ lookup?: BrowserCompatibleDnsLookup | undefined;
78
+ }
79
+ export interface MCPTokenRefreshOptions {
80
+ authorizationServer: MCPAuthorizationServerMetadata;
81
+ clientId: string;
82
+ resource: string;
83
+ refreshToken: string;
84
+ signal?: AbortSignal | undefined;
85
+ timeoutMs?: number | undefined;
86
+ maxResponseBytes?: number | undefined;
87
+ lookup?: BrowserCompatibleDnsLookup | undefined;
88
+ }
89
+ type BrowserCompatibleDnsLookup = (hostname: string) => Promise<readonly {
90
+ address: string;
91
+ family: number;
92
+ }[]>;
93
+ /**
94
+ * Host-owned bridge to vault-backed OAuth state. The MCP package never stores
95
+ * access or refresh tokens itself and never exposes them through config.
96
+ */
97
+ export interface MCPAuthorizationProvider {
98
+ getAccessToken(context: MCPAuthorizationContext): Promise<MCPAccessToken | undefined>;
99
+ /** Refresh/discover/reauthorize. Return true to retry the HTTP request once. */
100
+ handleUnauthorized?(challenge: MCPAuthorizationChallenge, context: MCPAuthorizationContext): Promise<boolean>;
101
+ }
102
+ export declare function canonicalMcpResource(rawUrl: string): string;
103
+ export declare function authorizationHeaderForToken(token: MCPAccessToken, expectedResource: string, now?: number): string;
104
+ export declare function parseMcpBearerChallenge(header: string | null, resource: string): MCPAuthorizationChallenge;
105
+ /** RFC 9728 fallback order for an MCP endpoint when no challenge URL exists. */
106
+ export declare function protectedResourceMetadataUrls(resource: string): string[];
107
+ /** RFC 8414 + OIDC discovery order required by the MCP authorization spec. */
108
+ export declare function authorizationServerMetadataUrls(issuer: string): string[];
109
+ export declare function parseProtectedResourceMetadata(value: unknown, expectedResource: string): MCPProtectedResourceMetadata;
110
+ export declare function parseAuthorizationServerMetadata(value: unknown, expectedIssuer: string): MCPAuthorizationServerMetadata;
111
+ /**
112
+ * Re-validate the normalized authorization-server shape before it is accepted
113
+ * from host-owned persistence. PKCE support is established during discovery;
114
+ * this guard protects the persisted endpoints and bounded fields themselves.
115
+ */
116
+ export declare function validateMcpAuthorizationServerMetadata(value: unknown): MCPAuthorizationServerMetadata;
117
+ /**
118
+ * Discover and validate MCP OAuth metadata without following redirects. The
119
+ * default fetcher resolves once and opens the socket to that exact IP, making
120
+ * discovery resistant to DNS rebinding.
121
+ */
122
+ export declare function discoverMcpAuthorization(resource: string, options?: MCPAuthorizationDiscoveryOptions): Promise<MCPAuthorizationDiscoveryResult>;
123
+ export declare function createMcpAuthorizationRequest(options: MCPAuthorizationRequestOptions): MCPAuthorizationSession;
124
+ export declare function parseMcpAuthorizationCallback(callbackUrl: string, session: Pick<MCPAuthorizationSession, 'redirectUri' | 'state'>): string;
125
+ export declare function exchangeMcpAuthorizationCode(options: MCPTokenExchangeOptions): Promise<MCPTokenSet>;
126
+ export declare function refreshMcpAccessToken(options: MCPTokenRefreshOptions): Promise<MCPTokenSet>;
127
+ export {};
128
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import type { MCPAuthorizationProvider } from './authorization.js';
2
+ import { type MCPGetPromptResult, type MCPListPromptsResult, type MCPListResourcesResult, type MCPListResourceTemplatesResult, type MCPReadResourceResult, type MCPServerMetadata } from './protocol.js';
3
+ export type Transport = 'stdio' | 'sse' | 'streamable-http';
4
+ export interface MCPClientOptions {
5
+ name: string;
6
+ transport: Transport;
7
+ command?: string | undefined;
8
+ args?: string[] | undefined;
9
+ env?: Record<string, string> | undefined;
10
+ url?: string | undefined;
11
+ headers?: Record<string, string> | undefined;
12
+ startupTimeoutMs?: number | undefined;
13
+ requestTimeoutMs?: number | undefined;
14
+ /** Host-owned, vault-backed authorization for HTTP transports. */
15
+ authorizationProvider?: MCPAuthorizationProvider | undefined;
16
+ /**
17
+ * Allowlist of env var names to forward from the parent process (process.env)
18
+ * to the child. Values are resolved at spawn time and merged into `env`
19
+ * via the `extra` path of `buildChildEnv` (unfiltered). This is how built-in
20
+ * MCP server presets (GitHub, Slack, Brave Search, …) get their API tokens
21
+ * without storing them in config.json or being scrubbed by the secret filter.
22
+ */
23
+ passthroughEnv?: string[] | undefined;
24
+ }
25
+ export type ConnectionState = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'reconnecting' | 'failed'
26
+ /** Lazy server: registered from a cached manifest, process not spawned. */
27
+ | 'dormant';
28
+ export interface MCPTool {
29
+ name: string;
30
+ description?: string | undefined;
31
+ inputSchema: Record<string, unknown>;
32
+ }
33
+ export interface ToolCallResult {
34
+ content: unknown;
35
+ isError: boolean;
36
+ }
37
+ export interface MCPRequestOptions {
38
+ signal?: AbortSignal | undefined;
39
+ }
40
+ export interface MCPPageOptions extends MCPRequestOptions {
41
+ cursor?: string | undefined;
42
+ }
43
+ export interface JsonRpcResponse {
44
+ jsonrpc: '2.0';
45
+ id: number;
46
+ result?: unknown | undefined;
47
+ error?: {
48
+ code: number | undefined;
49
+ message: string;
50
+ data?: unknown | undefined;
51
+ } | undefined;
52
+ }
53
+ type ExitListener = (name: string, code: number | null, signal: string | null) => void;
54
+ /**
55
+ * Fired when the server sends `notifications/tools/list_changed`. The
56
+ * client refreshes its cached tool list before invoking listeners, so
57
+ * subscribers can call `listTools()` for the fresh set.
58
+ */
59
+ type ToolsChangedListener = (name: string, tools: MCPTool[]) => void;
60
+ export type MCPListChangedListener = (name: string) => void;
61
+ /**
62
+ * Lightweight MCP client supporting three transport types:
63
+ * - stdio: spawns a child process and communicates over pipes
64
+ * - sse: connects to an HTTP SSE endpoint for server events, POST for requests
65
+ * - streamable-http: session-based HTTP transport with NDJSON responses
66
+ */
67
+ export declare class MCPClient {
68
+ readonly opts: MCPClientOptions;
69
+ private state;
70
+ private child?;
71
+ private nextId;
72
+ /**
73
+ * In-flight JSON-RPC calls keyed by id. `resolve` settles the call; `reject`
74
+ * is invoked from {@link failPending} when the underlying transport dies
75
+ * (stdio child exit, `close()`) so callers don't hang forever.
76
+ */
77
+ private readonly pending;
78
+ private rxBuffer;
79
+ private _tools;
80
+ /** Server-declared handshake metadata. Populated for stdio in the first protocol slice. */
81
+ private _serverMetadata?;
82
+ /** Cached tool list — survives reconnects so the registry can re-register without re-discovering. */
83
+ private _toolsCache?;
84
+ private _drainPending;
85
+ private _lastNotifySkipped;
86
+ private sseTransport?;
87
+ private httpTransport?;
88
+ /** Notified when the stdio child process exits so the registry can attempt reconnect. */
89
+ private readonly exitListeners;
90
+ /** Notified when the server announces a tools/list_changed notification. */
91
+ private readonly toolsChangedListeners;
92
+ private readonly resourcesChangedListeners;
93
+ private readonly promptsChangedListeners;
94
+ /** Notified when an HTTP transport (SSE or streamable-http) disconnects. */
95
+ private readonly disconnectListeners;
96
+ constructor(opts: MCPClientOptions);
97
+ getState(): ConnectionState;
98
+ getServerMetadata(): MCPServerMetadata | undefined;
99
+ listTools(): MCPTool[];
100
+ /** Returns true if a prior notify() call was skipped due to backpressure. */
101
+ hadNotifySkipped(): boolean;
102
+ /**
103
+ * Register a listener for child-process exit events.
104
+ * The registry uses this to trigger reconnection.
105
+ */
106
+ addExitListener(listener: ExitListener): void;
107
+ removeExitListener(listener: ExitListener): void;
108
+ /**
109
+ * Register a listener for transport disconnect events (SSE / streamable-http).
110
+ * Used by the registry to trigger reconnection for HTTP-based servers.
111
+ */
112
+ addDisconnectListener(listener: () => void): void;
113
+ removeDisconnectListener(listener: () => void): void;
114
+ connect(): Promise<void>;
115
+ private connectStdio;
116
+ private connectSSE;
117
+ private connectStreamableHTTP;
118
+ callTool(name: string, input: unknown, opts?: {
119
+ signal?: AbortSignal | undefined;
120
+ }): Promise<ToolCallResult>;
121
+ listResources(opts?: MCPPageOptions): Promise<MCPListResourcesResult>;
122
+ listResourceTemplates(opts?: MCPPageOptions): Promise<MCPListResourceTemplatesResult>;
123
+ readResource(uri: string, opts?: MCPRequestOptions): Promise<MCPReadResourceResult>;
124
+ subscribeResource(uri: string, opts?: MCPRequestOptions): Promise<void>;
125
+ unsubscribeResource(uri: string, opts?: MCPRequestOptions): Promise<void>;
126
+ listPrompts(opts?: MCPPageOptions): Promise<MCPListPromptsResult>;
127
+ getPrompt(name: string, args?: Record<string, string> | undefined, opts?: MCPRequestOptions): Promise<MCPGetPromptResult>;
128
+ close(): Promise<void>;
129
+ private request;
130
+ private requestCapability;
131
+ private requireResourceSubscriptions;
132
+ /**
133
+ * Reject every in-flight {@link request} call. Used when the underlying
134
+ * transport dies — without this, callers awaiting `tools/call` over a
135
+ * killed stdio child or a closed transport would hang indefinitely.
136
+ */
137
+ private failPending;
138
+ private notify;
139
+ private onData;
140
+ private onLine;
141
+ private handleServerRequest;
142
+ /**
143
+ * L2-C: refresh the cached tool list when the server announces a
144
+ * `tools/list_changed`. Listeners (the registry) re-wrap and
145
+ * re-register. Failures are swallowed — a stale cache is preferable
146
+ * to a hard crash on a transient notification glitch.
147
+ */
148
+ private handleToolsListChanged;
149
+ addToolsChangedListener(listener: ToolsChangedListener): void;
150
+ removeToolsChangedListener(listener: ToolsChangedListener): void;
151
+ addResourcesChangedListener(listener: MCPListChangedListener): void;
152
+ removeResourcesChangedListener(listener: MCPListChangedListener): void;
153
+ addPromptsChangedListener(listener: MCPListChangedListener): void;
154
+ removePromptsChangedListener(listener: MCPListChangedListener): void;
155
+ private emitCapabilityChanged;
156
+ }
157
+ /**
158
+ * Quote a single argument for `cmd.exe` when spawning with `shell: true` on
159
+ * Windows. Only args containing whitespace or quotes need wrapping; inside
160
+ * double quotes cmd.exe escapes a literal `"` as `""`. Backslashes are literal
161
+ * inside cmd quotes, so paths like `C:\Program Files\x` pass through unharmed.
162
+ */
163
+ export declare function quoteWindowsArg(arg: string): string;
164
+ export {};
165
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Shared constants for the MCP package.
3
+ *
4
+ * Centralizing these values means:
5
+ * - Protocol version and client identity are updated in one place
6
+ * - Reconnect parameters can be overridden via config in the future
7
+ * - No scattered magic values across multiple files
8
+ */
9
+ export declare const MCP_CONSTANTS: Readonly<{
10
+ /** MCP protocol version advertised during handshake. */
11
+ readonly PROTOCOL_VERSION: '2024-11-05';
12
+ /** Identity announced to MCP servers during `initialize`. */
13
+ readonly CLIENT_INFO: Readonly<{
14
+ name: "wrongstack";
15
+ version: "0.1.10";
16
+ }>;
17
+ /** Reconnection behaviour when a transport disconnects. */
18
+ readonly RECONNECT: Readonly<{
19
+ /** Max full reconnect cycles before the slot is marked `failed`. */
20
+ MAX_CYCLES: 5;
21
+ /** Base delay between cycles (exponential backoff applied on top). */
22
+ BASE_DELAY_MS: 1000;
23
+ /** Jitter factor applied to the backoff (0 = no jitter, 1 = full). */
24
+ JITTER_FACTOR: 0.2;
25
+ /** Max connection attempts within a single cycle. */
26
+ MAX_ATTEMPTS: 3;
27
+ /** Base multiplier for the exponential backoff formula (`delay = BASE * multiplier^attempt`). */
28
+ BACKOFF_MULTIPLIER: 2;
29
+ }>;
30
+ /** Timing for graceful / forced disconnect. */
31
+ readonly DISCONNECT: Readonly<{
32
+ /** Ms to wait for in-flight requests to complete before force-closing. */
33
+ GRACEFUL_MS: 800;
34
+ /** Ms after which the force disconnect is triggered. */
35
+ FORCE_TIMEOUT_MS: 1200;
36
+ }>;
37
+ /** Lazy-connect idle lifecycle. */
38
+ readonly IDLE: Readonly<{
39
+ /** Default ms a lazy server stays connected with no tool calls before auto-sleep. */
40
+ DEFAULT_TIMEOUT_MS: 300000;
41
+ /** How often the idle sweep runs (kept well below the timeout). */
42
+ SWEEP_INTERVAL_MS: 30000;
43
+ }>;
44
+ /** JSON-RPC response timeout for outstanding requests. */
45
+ readonly RESPONSE_TIMEOUT_MS: 500;
46
+ /** Max buffer size for the SSE reader. */
47
+ readonly SSE_READER_MAX_BUFFER: number;
48
+ /** Max characters logged from a request body. */
49
+ readonly REQUEST_LOG_CAP: 1024;
50
+ }>;
51
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,33 @@
1
+ import type { MCPGetPromptResult, MCPPromptMessage, MCPReadResourceResult, MCPResourceContents } from './protocol.js';
2
+ export declare const DEFAULT_MCP_INSERTION_MAX_BYTES: number;
3
+ export declare const DEFAULT_MCP_RESOURCE_SCHEMES: readonly ['file', 'git', 'http', 'https', 'mcp', 'mem', 'repo', 'resource'];
4
+ export interface MCPInsertionPolicy {
5
+ maxBytes?: number | undefined;
6
+ allowedUriSchemes?: readonly string[] | undefined;
7
+ }
8
+ export interface MCPContentProvenance {
9
+ origin: 'mcp';
10
+ serverName: string;
11
+ capability: 'resource' | 'prompt';
12
+ resourceUri?: string | undefined;
13
+ promptName?: string | undefined;
14
+ promptArgumentNames?: string[] | undefined;
15
+ }
16
+ export interface MCPResourceInsertion {
17
+ kind: 'resource';
18
+ untrusted: true;
19
+ byteSize: number;
20
+ provenance: MCPContentProvenance;
21
+ contents: MCPResourceContents[];
22
+ }
23
+ export interface MCPPromptInsertion {
24
+ kind: 'prompt';
25
+ untrusted: true;
26
+ byteSize: number;
27
+ provenance: MCPContentProvenance;
28
+ description?: string | undefined;
29
+ messages: MCPPromptMessage[];
30
+ }
31
+ export declare function prepareResourceInsertion(serverName: string, requestedUri: string, result: MCPReadResourceResult, policy?: MCPInsertionPolicy): MCPResourceInsertion;
32
+ export declare function preparePromptInsertion(serverName: string, promptName: string, args: Record<string, string> | undefined, result: MCPGetPromptResult, policy?: MCPInsertionPolicy): MCPPromptInsertion;
33
+ //# sourceMappingURL=content-selection.d.ts.map
@@ -0,0 +1 @@
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"}