reddit-mcp-buddy 1.1.10 → 1.1.13

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,10 +1,10 @@
1
- # 🤖 Reddit MCP Buddy
1
+ # <img src="assets/reddit-mcp-buddy-icon-white-background.png" width="48" align="center"/> Reddit MCP Buddy
2
2
 
3
3
  ### Reddit Browser for Claude Desktop and AI Assistants
4
4
 
5
5
  A [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that enables Claude Desktop and other AI assistants to browse Reddit, search posts, and analyze user activity. Clean, fast, and actually works - no API keys required.
6
6
 
7
- [![MCP Registry](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fregistry.modelcontextprotocol.io%2Fv0%2Fservers%3Fsearch%3Dreddit-mcp-buddy&query=%24.servers%5B-1%3A%5D.version&label=MCP%20Registry&color=blue)](https://registry.modelcontextprotocol.io/v0/servers/5677b351-373d-4137-bc58-28f1ba0d105d)
7
+ [![MCP Registry](https://img.shields.io/npm/v/reddit-mcp-buddy?label=MCP%20Registry&color=blue)](https://registry.modelcontextprotocol.io)
8
8
  [![npm version](https://img.shields.io/npm/v/reddit-mcp-buddy.svg)](https://www.npmjs.com/package/reddit-mcp-buddy)
9
9
  [![npm downloads](https://img.shields.io/npm/dm/reddit-mcp-buddy.svg)](https://www.npmjs.com/package/reddit-mcp-buddy)
10
10
  [![GitHub stars](https://img.shields.io/github/stars/karanb192/reddit-mcp-buddy.svg?style=flat&logo=github&color=brightgreen)](https://github.com/karanb192/reddit-mcp-buddy/stargazers)
@@ -12,6 +12,10 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that en
12
12
 
13
13
  ## 🎬 See It In Action
14
14
 
15
+ ![Reddit MCP Buddy Demo - AirPods Max 2 and Dune Part Three](assets/images/reddit-mcp-buddy-demo-2026.gif)
16
+
17
+ *Claude checking Reddit's reaction to the Dune Part Three trailer and whether the AirPods Max 2 are worth $549*
18
+
15
19
  ![Reddit MCP Buddy Demo - Analyzing H1B sentiment across subreddits](assets/images/reddit-mcp-buddy.gif)
16
20
 
17
21
  *Claude analyzing real-time sentiment about H-1B visa changes across r/cscareerquestions and r/india*
@@ -45,7 +49,13 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that en
45
49
 
46
50
  ## Quick Start (30 seconds)
47
51
 
48
- ### For Claude Desktop
52
+ ### For Claude Desktop - Desktop Extension (Easiest!)
53
+
54
+ 1. **Download**: [reddit-mcp-buddy.mcpb](https://github.com/karanb192/reddit-mcp-buddy/releases/latest/download/reddit-mcp-buddy.mcpb)
55
+ 2. **Install**: Open the downloaded file
56
+ 3. **Done!** Reddit tools are now available in Claude
57
+
58
+ ### For Claude Desktop - NPM Method (Alternative)
49
59
 
50
60
  Add this to your `claude_desktop_config.json`:
51
61
 
@@ -54,13 +64,23 @@ Add this to your `claude_desktop_config.json`:
54
64
  "mcpServers": {
55
65
  "reddit": {
56
66
  "command": "npx",
57
- "args": ["reddit-mcp-buddy"]
67
+ "args": ["-y", "reddit-mcp-buddy"]
58
68
  }
59
69
  }
60
70
  }
61
71
  ```
62
72
 
63
- That's it! Reddit MCP Buddy is now available in Claude.
73
+ ### For Claude Code
74
+
75
+ Run this command to add the MCP server (user scope):
76
+
77
+ ```bash
78
+ claude mcp add --transport stdio reddit-mcp-buddy -s user -- npx -y reddit-mcp-buddy
79
+ ```
80
+
81
+ ### For Other MCP Clients
82
+
83
+ Use the NPM method: `npx -y reddit-mcp-buddy`
64
84
 
65
85
  ## What can it do?
66
86
 
@@ -98,9 +118,16 @@ Search across Reddit or specific subreddits.
98
118
  Get a post with all its comments.
99
119
  ```
100
120
  - Input:
101
- - Reddit URL (full URL including subreddit), OR
121
+ - Reddit URL (supports multiple formats), OR
102
122
  - Post ID alone (will auto-detect subreddit, 2 API calls), OR
103
123
  - Post ID + subreddit (most efficient, 1 API call)
124
+ - Supported URL formats:
125
+ - reddit.com, www.reddit.com
126
+ - old.reddit.com, new.reddit.com
127
+ - np.reddit.com (No Participation links)
128
+ - m.reddit.com (mobile links)
129
+ - redd.it short URLs
130
+ - URLs with query params (?utm_source=...) or fragments (#comment)
104
131
  - Options: comment sorting, depth, link extraction
105
132
  ```
106
133
 
@@ -142,7 +169,7 @@ Want more requests? Add Reddit credentials to your Claude Desktop config:
142
169
  "mcpServers": {
143
170
  "reddit": {
144
171
  "command": "npx",
145
- "args": ["reddit-mcp-buddy"],
172
+ "args": ["-y", "reddit-mcp-buddy"],
146
173
  "env": {
147
174
  "REDDIT_CLIENT_ID": "your_client_id",
148
175
  "REDDIT_CLIENT_SECRET": "your_client_secret",
@@ -174,6 +201,47 @@ Reddit MCP Buddy supports three authentication levels, each with different rate
174
201
  - Web apps only support app-only mode (60 rpm maximum)
175
202
  - For 100 requests/minute, you MUST use a script app with username + password
176
203
 
204
+ ## Privacy & Data Handling
205
+
206
+ Reddit MCP Buddy is designed with privacy and transparency in mind. Here's how your data is handled:
207
+
208
+ ### Data Collection
209
+ - **Reddit API Data**: The server fetches public Reddit content (posts, comments, user profiles) through Reddit's official API
210
+ - **No Tracking**: We don't collect, store, or transmit any analytics, telemetry, or usage data
211
+ - **No Third Parties**: All data flows directly between your machine, Reddit's API, and your AI assistant
212
+
213
+ ### Local Storage
214
+ - **Authentication Credentials** (optional):
215
+ - Stored locally in `~/.reddit-mcp-buddy/auth.json` when using `--auth` CLI setup
216
+ - Passwords are **never** written to disk - only used in-memory for OAuth token exchange
217
+ - Environment variables (recommended for Claude Desktop) are never persisted by this server
218
+ - **Cache Data**:
219
+ - Reddit API responses are temporarily cached in memory to improve performance
220
+ - Cache size limited to 50MB maximum
221
+ - All cache data is cleared when the server stops
222
+ - Can be disabled with `REDDIT_BUDDY_NO_CACHE=true`
223
+
224
+ ### Data Transmission
225
+ - **Reddit API Only**: Your credentials are only sent to Reddit's official OAuth endpoints (`https://oauth.reddit.com` and `https://www.reddit.com`)
226
+ - **No External Services**: No data is sent to any other external services, analytics platforms, or third parties
227
+ - **Local Processing**: All data processing happens locally on your machine
228
+
229
+ ### Security Notes
230
+ - **Read-Only Operations**: All tools are read-only - the server never posts, comments, or modifies any Reddit content
231
+ - **Credential Safety**:
232
+ - OAuth tokens are stored in memory and refreshed automatically
233
+ - Client secrets are treated as sensitive and never logged
234
+ - Use environment variables in Claude Desktop config for maximum security
235
+ - **Open Source**: Full source code is available at https://github.com/karanb192/reddit-mcp-buddy for security auditing
236
+
237
+ ### GDPR & Privacy Compliance
238
+ - **No Personal Data Collection**: We don't collect or process any personal data beyond what's necessary to authenticate with Reddit's API
239
+ - **User Control**: You control all credentials and can delete `~/.reddit-mcp-buddy/auth.json` at any time
240
+ - **Right to Erasure**: Simply delete the auth file or uninstall the server to remove all local data
241
+
242
+ ### Questions or Concerns?
243
+ If you have any privacy questions or concerns, please [open an issue](https://github.com/karanb192/reddit-mcp-buddy/issues) on GitHub.
244
+
177
245
  ## Testing & Development
178
246
 
179
247
  ### Testing Your Rate Limits
@@ -206,7 +274,7 @@ The rate limit tester will:
206
274
 
207
275
  For local development and testing, you can set up authentication interactively:
208
276
  ```bash
209
- npx reddit-mcp-buddy --auth
277
+ npx -y reddit-mcp-buddy --auth
210
278
  ```
211
279
 
212
280
  This will prompt you for Reddit app credentials and save them locally. **Note: This does NOT work with Claude Desktop** - use environment variables in your Claude config instead.
@@ -216,10 +284,10 @@ This will prompt you for Reddit app credentials and save them locally. **Note: T
216
284
  To test the server directly in your terminal:
217
285
  ```bash
218
286
  # Run in HTTP mode on port 3000
219
- npx reddit-mcp-buddy --http
287
+ npx -y reddit-mcp-buddy --http
220
288
 
221
289
  # Or with custom port
222
- REDDIT_BUDDY_PORT=8080 npx reddit-mcp-buddy --http
290
+ REDDIT_BUDDY_PORT=8080 npx -y reddit-mcp-buddy --http
223
291
  ```
224
292
 
225
293
  **Note:** The server runs in stdio mode by default (for Claude Desktop). Use `--http` flag for testing with Postman MCP or direct API calls.
@@ -412,6 +480,11 @@ npm run dev
412
480
  # Build
413
481
  npm run build
414
482
 
483
+ # Run tests
484
+ npm test # Unit tests
485
+ npm run test:integration # Integration tests
486
+ npm run test:all # All tests
487
+
415
488
  # Test rate limits
416
489
  npm run test:rate-limit # Test with current environment
417
490
  npm run test:rate-limit:anon # Test anonymous mode (10 rpm)
@@ -456,7 +529,7 @@ We keep things simple:
456
529
  - **[Awesome MCP Servers](https://github.com/modelcontextprotocol/awesome-mcp-servers)** - Community-curated list of MCP servers
457
530
 
458
531
  ### Where to Find This Server
459
- - **[MCP Registry Direct Link](https://registry.modelcontextprotocol.io/v0/servers/5677b351-373d-4137-bc58-28f1ba0d105d)** - Direct API link to v1.1.1
532
+ - **[MCP Registry Direct Link](https://registry.modelcontextprotocol.io/v0/servers/5677b351-373d-4137-bc58-28f1ba0d105d)** - Direct API link to this server
460
533
  - **[MCP Registry Search](https://registry.modelcontextprotocol.io)** - Search for "reddit" to find all versions
461
534
  - **[NPM Package](https://www.npmjs.com/package/reddit-mcp-buddy)** - Install via npm/npx
462
535
  - **[GitHub Repository](https://github.com/karanb192/reddit-mcp-buddy)** - Source code and issues
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@
6
6
  import { AuthManager } from './core/auth.js';
7
7
  import { SERVER_VERSION } from './mcp-server.js';
8
8
  import { spawn } from 'child_process';
9
- import { fileURLToPath } from 'url';
9
+ import { fileURLToPath, pathToFileURL } from 'url';
10
10
  import { dirname, join } from 'path';
11
11
  import readline from 'readline/promises';
12
12
  const __filename = fileURLToPath(import.meta.url);
@@ -49,40 +49,99 @@ async function setupAuth() {
49
49
  const username = await rl.question('Reddit Username (optional): ');
50
50
  let password = '';
51
51
  if (username) {
52
- // Hide password input
52
+ // Hide password input with proper error handling and cleanup
53
53
  const passwordQuestion = 'Reddit Password: ';
54
54
  process.stdout.write(passwordQuestion);
55
- // Disable echo for password
56
- process.stdin.setRawMode(true);
57
- process.stdin.resume();
58
- password = await new Promise((resolve) => {
55
+ password = await new Promise((resolve, reject) => {
56
+ const PASSWORD_TIMEOUT_MS = 60000; // 60 second timeout to prevent hanging
57
+ const MAX_PASSWORD_LENGTH = 256; // Reasonable password length limit
59
58
  let pwd = '';
60
- process.stdin.on('data', (char) => {
59
+ let isResolved = false;
60
+ let timeoutId = null;
61
+ // Set timeout to prevent hanging if user doesn't respond
62
+ timeoutId = setTimeout(() => {
63
+ if (!isResolved) {
64
+ isResolved = true;
65
+ try {
66
+ process.stdin.setRawMode(false);
67
+ }
68
+ catch {
69
+ // Raw mode might already be disabled
70
+ }
71
+ process.stdin.pause();
72
+ process.stdin.removeAllListeners('data');
73
+ process.stdout.write('\n');
74
+ reject(new Error('Password input timeout'));
75
+ }
76
+ }, PASSWORD_TIMEOUT_MS);
77
+ const dataHandler = (char) => {
78
+ if (isResolved)
79
+ return;
61
80
  const charStr = char.toString('utf8');
62
81
  switch (charStr) {
63
82
  case '\n':
64
83
  case '\r':
65
- case '\u0004':
66
- process.stdin.setRawMode(false);
84
+ case '\u0004': // EOF
85
+ if (timeoutId)
86
+ clearTimeout(timeoutId);
87
+ isResolved = true;
88
+ try {
89
+ process.stdin.setRawMode(false);
90
+ }
91
+ catch {
92
+ // Raw mode might already be disabled
93
+ }
67
94
  process.stdin.pause();
95
+ process.stdin.removeAllListeners('data');
68
96
  process.stdout.write('\n');
69
- resolve(pwd);
97
+ // Clear pwd reference and resolve
98
+ const result = pwd;
99
+ pwd = ''; // Try to clear from memory
100
+ resolve(result);
70
101
  break;
71
- case '\u0003':
102
+ case '\u0003': // Ctrl+C
103
+ if (timeoutId)
104
+ clearTimeout(timeoutId);
105
+ try {
106
+ process.stdin.setRawMode(false);
107
+ }
108
+ catch {
109
+ // Raw mode might already be disabled
110
+ }
111
+ process.stdin.pause();
112
+ process.stdin.removeAllListeners('data');
113
+ pwd = ''; // Clear password
72
114
  process.exit();
73
115
  break;
74
- case '\u007f':
116
+ case '\u007f': // Backspace
75
117
  if (pwd.length > 0) {
76
118
  pwd = pwd.slice(0, -1);
77
119
  process.stdout.write('\b \b');
78
120
  }
79
121
  break;
80
122
  default:
81
- pwd += charStr;
82
- process.stdout.write('*');
123
+ // Prevent excessively long passwords
124
+ if (pwd.length < MAX_PASSWORD_LENGTH) {
125
+ pwd += charStr;
126
+ process.stdout.write('*');
127
+ }
83
128
  break;
84
129
  }
85
- });
130
+ };
131
+ try {
132
+ process.stdin.setRawMode(true);
133
+ process.stdin.resume();
134
+ process.stdin.on('data', dataHandler);
135
+ }
136
+ catch (error) {
137
+ if (timeoutId)
138
+ clearTimeout(timeoutId);
139
+ pwd = ''; // Clear password
140
+ reject(error);
141
+ }
142
+ }).catch((error) => {
143
+ console.error('\n❌ Password input error:', error.message);
144
+ process.exit(1);
86
145
  });
87
146
  }
88
147
  // Test the credentials
@@ -119,10 +178,15 @@ async function setupAuth() {
119
178
  console.error(' • Username and password are correct');
120
179
  }
121
180
  console.error('\nError:', error.message);
122
- // Clear invalid config
181
+ // Clear invalid config and password from memory
123
182
  await authManager.clear();
183
+ password = ''; // Clear password from memory
124
184
  process.exit(1);
125
185
  }
186
+ finally {
187
+ // Always clear password from memory after use
188
+ password = '';
189
+ }
126
190
  }
127
191
  finally {
128
192
  rl.close();
@@ -134,27 +198,78 @@ async function startServer() {
134
198
  if (isDev) {
135
199
  // Development mode - run TypeScript directly
136
200
  const serverPath = join(__dirname, 'index.ts');
137
- const child = spawn('tsx', [serverPath], {
138
- stdio: 'inherit',
139
- env: { ...process.env },
140
- });
201
+ // Improved child process error handling
202
+ let child;
203
+ try {
204
+ child = spawn('tsx', [serverPath], {
205
+ stdio: 'inherit',
206
+ env: { ...process.env },
207
+ });
208
+ // Verify child process was created successfully
209
+ if (!child || !child.pid) {
210
+ throw new Error('Failed to create child process');
211
+ }
212
+ }
213
+ catch (error) {
214
+ const errorMsg = error instanceof Error ? error.message : String(error);
215
+ console.error('❌ Failed to spawn development server:', errorMsg);
216
+ // Check if tsx is not installed
217
+ if (errorMsg.includes('ENOENT') || errorMsg.includes('not found')) {
218
+ console.error('\nNote: Development mode requires tsx to be installed.');
219
+ console.error('Run: npm install');
220
+ }
221
+ process.exit(1);
222
+ }
223
+ // Handle errors after spawn
141
224
  child.on('error', (error) => {
142
- console.error('Failed to start server:', error);
225
+ const errorMsg = error instanceof Error ? error.message : String(error);
226
+ console.error('❌ Child process error:', errorMsg);
143
227
  process.exit(1);
144
228
  });
145
- child.on('exit', (code) => {
229
+ // Handle unexpected exit
230
+ child.on('exit', (code, signal) => {
231
+ if (code && code !== 0) {
232
+ console.error(`❌ Server exited with code ${code}`);
233
+ }
234
+ else if (signal) {
235
+ console.error(`❌ Server terminated by signal ${signal}`);
236
+ }
146
237
  process.exit(code || 0);
147
238
  });
148
239
  }
149
240
  else {
150
- // Production mode - run compiled JavaScript
241
+ // Production mode - run compiled JavaScript with improved error handling
151
242
  const serverPath = join(__dirname, 'index.js');
152
- // Dynamic import to run the server
243
+ const serverUrl = pathToFileURL(serverPath).href;
244
+ // Improved dynamic import error handling
153
245
  try {
154
- await import(serverPath);
246
+ // Check if the file exists first
247
+ const { promises: fs } = await import('fs');
248
+ try {
249
+ await fs.access(serverPath);
250
+ }
251
+ catch {
252
+ throw new Error(`Server file not found: ${serverPath}. Run: npm run build`);
253
+ }
254
+ // Attempt dynamic import
255
+ await import(serverUrl);
155
256
  }
156
257
  catch (error) {
157
- console.error('Failed to start server:', error);
258
+ const errorMsg = error instanceof Error ? error.message : String(error);
259
+ if (errorMsg.includes('not found') || errorMsg.includes('ENOENT')) {
260
+ console.error('❌ Server file not found. Run: npm run build');
261
+ }
262
+ else if (errorMsg.includes('Cannot find module')) {
263
+ console.error('❌ Module import error:', errorMsg);
264
+ console.error('Try running: npm install');
265
+ }
266
+ else if (errorMsg.includes('Unexpected token')) {
267
+ console.error('❌ Syntax error in server code:', errorMsg);
268
+ console.error('Try running: npm run typecheck');
269
+ }
270
+ else {
271
+ console.error('❌ Failed to start server:', errorMsg);
272
+ }
158
273
  process.exit(1);
159
274
  }
160
275
  }
@@ -171,7 +286,8 @@ if (args.includes('--auth') || args.includes('-a')) {
171
286
  else if (args.includes('--help') || args.includes('-h')) {
172
287
  console.log('Reddit MCP Buddy - Your AI assistant\'s best friend for browsing Reddit\n');
173
288
  console.log('Usage:');
174
- console.log(' reddit-mcp-buddy Start the MCP server');
289
+ console.log(' reddit-mcp-buddy Start the MCP server (stdio mode)');
290
+ console.log(' reddit-mcp-buddy --http Start the MCP server (HTTP mode)');
175
291
  console.log(' reddit-mcp-buddy --auth Set up Reddit authentication (optional)');
176
292
  console.log(' reddit-mcp-buddy --help Show this help message\n');
177
293
  console.log('Features:');
@@ -186,6 +302,10 @@ else if (args.includes('--version') || args.includes('-v')) {
186
302
  console.log(`Reddit MCP Buddy v${SERVER_VERSION}`);
187
303
  }
188
304
  else {
305
+ // Support --http flag as shorthand for REDDIT_BUDDY_HTTP=true
306
+ if (args.includes('--http')) {
307
+ process.env.REDDIT_BUDDY_HTTP = 'true';
308
+ }
189
309
  // Start the server
190
310
  startServer().catch((error) => {
191
311
  console.error('Failed to start:', error);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export interface AuthConfig {
15
15
  export declare class AuthManager {
16
16
  private config;
17
17
  private configPath;
18
+ private tokenRefreshPromise;
19
+ private readonly TOKEN_EXPIRATION_BUFFER_MS;
18
20
  constructor();
19
21
  /**
20
22
  * Load authentication configuration
@@ -24,6 +26,15 @@ export declare class AuthManager {
24
26
  * Load configuration from environment variables
25
27
  */
26
28
  private loadFromEnv;
29
+ /**
30
+ * Clean environment variable value
31
+ * Handles empty strings, undefined, and unresolved template strings
32
+ */
33
+ private cleanEnvVar;
34
+ /**
35
+ * Check if a string contains unresolved template patterns
36
+ */
37
+ private containsUnresolvedTemplate;
27
38
  /**
28
39
  * Save authentication configuration
29
40
  */
@@ -37,7 +48,11 @@ export declare class AuthManager {
37
48
  */
38
49
  isAuthenticated(): boolean;
39
50
  /**
40
- * Check if token is expired
51
+ * Check if token is expired or will expire soon (including buffer for clock drift)
52
+ * Returns true if:
53
+ * - No expiresAt set
54
+ * - Current time >= expiresAt
55
+ * - Current time >= expiresAt - buffer (to handle clock drift and refresh early)
41
56
  */
42
57
  isTokenExpired(): boolean;
43
58
  /**
@@ -46,8 +61,13 @@ export declare class AuthManager {
46
61
  getAccessToken(): Promise<string | null>;
47
62
  /**
48
63
  * Refresh access token using client credentials
64
+ * Uses a lock to prevent concurrent refresh attempts (race conditions)
49
65
  */
50
66
  refreshAccessToken(): Promise<void>;
67
+ /**
68
+ * Internal implementation of token refresh (protected by lock)
69
+ */
70
+ private doRefreshAccessToken;
51
71
  /**
52
72
  * Clear authentication
53
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAS;;IAM3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA2BxC;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7C;;OAEG;IACH,SAAS,IAAI,UAAU,GAAG,IAAI;IAI9B;;OAEG;IACH,eAAe,IAAI,OAAO;IAM1B;;OAEG;IACH,cAAc,IAAI,OAAO;IAKzB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW9C;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA+DzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgBnD;;OAEG;IACH,YAAY,IAAI,MAAM;IAQtB;;OAEG;IACH,WAAW,IAAI,MAAM;IAMrB;;OAEG;IACH,WAAW,IAAI,OAAO;IAMtB;;OAEG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;CAiCnD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,mBAAmB,CAA8B;IAEzD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAS;;IAMpD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA2BxC;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAoBlC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC7C;;OAEG;IACH,SAAS,IAAI,UAAU,GAAG,IAAI;IAI9B;;OAEG;IACH,eAAe,IAAI,OAAO;IAM1B;;;;;;OAMG;IACH,cAAc,IAAI,OAAO;IAQzB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB9C;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBzC;;OAEG;YACW,oBAAoB;IA0FlC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgBnD;;OAEG;IACH,YAAY,IAAI,MAAM;IAQtB;;OAEG;IACH,WAAW,IAAI,MAAM;IAMrB;;OAEG;IACH,WAAW,IAAI,OAAO;IAMtB;;OAEG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;CAiCnD"}