webpeel 0.12.0 → 0.12.2

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 (148) hide show
  1. package/README.md +82 -9
  2. package/dist/cli.js +97 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/actions.d.ts +28 -0
  5. package/dist/core/actions.d.ts.map +1 -1
  6. package/dist/core/actions.js +60 -0
  7. package/dist/core/actions.js.map +1 -1
  8. package/dist/core/bm25-filter.d.ts +10 -0
  9. package/dist/core/bm25-filter.d.ts.map +1 -1
  10. package/dist/core/bm25-filter.js +40 -0
  11. package/dist/core/bm25-filter.js.map +1 -1
  12. package/dist/core/content-pruner.d.ts +12 -5
  13. package/dist/core/content-pruner.d.ts.map +1 -1
  14. package/dist/core/content-pruner.js +247 -190
  15. package/dist/core/content-pruner.js.map +1 -1
  16. package/dist/core/research.d.ts +67 -0
  17. package/dist/core/research.d.ts.map +1 -0
  18. package/dist/core/research.js +254 -0
  19. package/dist/core/research.js.map +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +37 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp/server.js +107 -2
  24. package/dist/mcp/server.js.map +1 -1
  25. package/dist/server/app.d.ts +14 -0
  26. package/dist/server/app.d.ts.map +1 -0
  27. package/dist/server/app.js +189 -0
  28. package/dist/server/app.js.map +1 -0
  29. package/dist/server/auth-store.d.ts +28 -0
  30. package/dist/server/auth-store.d.ts.map +1 -0
  31. package/dist/server/auth-store.js +89 -0
  32. package/dist/server/auth-store.js.map +1 -0
  33. package/dist/server/job-queue.d.ts +93 -0
  34. package/dist/server/job-queue.d.ts.map +1 -0
  35. package/dist/server/job-queue.js +144 -0
  36. package/dist/server/job-queue.js.map +1 -0
  37. package/dist/server/middleware/auth.d.ts +28 -0
  38. package/dist/server/middleware/auth.d.ts.map +1 -0
  39. package/dist/server/middleware/auth.js +183 -0
  40. package/dist/server/middleware/auth.js.map +1 -0
  41. package/dist/server/middleware/rate-limit.d.ts +23 -0
  42. package/dist/server/middleware/rate-limit.d.ts.map +1 -0
  43. package/dist/server/middleware/rate-limit.js +126 -0
  44. package/dist/server/middleware/rate-limit.js.map +1 -0
  45. package/dist/server/middleware/url-validator.d.ts +16 -0
  46. package/dist/server/middleware/url-validator.d.ts.map +1 -0
  47. package/dist/server/middleware/url-validator.js +187 -0
  48. package/dist/server/middleware/url-validator.js.map +1 -0
  49. package/dist/server/pg-auth-store.d.ts +129 -0
  50. package/dist/server/pg-auth-store.d.ts.map +1 -0
  51. package/dist/server/pg-auth-store.js +457 -0
  52. package/dist/server/pg-auth-store.js.map +1 -0
  53. package/dist/server/pg-job-queue.d.ts +60 -0
  54. package/dist/server/pg-job-queue.d.ts.map +1 -0
  55. package/dist/server/pg-job-queue.js +365 -0
  56. package/dist/server/pg-job-queue.js.map +1 -0
  57. package/dist/server/premium/domain-intel.d.ts +17 -0
  58. package/dist/server/premium/domain-intel.d.ts.map +1 -0
  59. package/dist/server/premium/domain-intel.js +134 -0
  60. package/dist/server/premium/domain-intel.js.map +1 -0
  61. package/dist/server/premium/index.d.ts +18 -0
  62. package/dist/server/premium/index.d.ts.map +1 -0
  63. package/dist/server/premium/index.js +36 -0
  64. package/dist/server/premium/index.js.map +1 -0
  65. package/dist/server/premium/swr-cache.d.ts +15 -0
  66. package/dist/server/premium/swr-cache.d.ts.map +1 -0
  67. package/dist/server/premium/swr-cache.js +35 -0
  68. package/dist/server/premium/swr-cache.js.map +1 -0
  69. package/dist/server/routes/activity.d.ts +7 -0
  70. package/dist/server/routes/activity.d.ts.map +1 -0
  71. package/dist/server/routes/activity.js +66 -0
  72. package/dist/server/routes/activity.js.map +1 -0
  73. package/dist/server/routes/agent.d.ts +12 -0
  74. package/dist/server/routes/agent.d.ts.map +1 -0
  75. package/dist/server/routes/agent.js +356 -0
  76. package/dist/server/routes/agent.js.map +1 -0
  77. package/dist/server/routes/answer.d.ts +6 -0
  78. package/dist/server/routes/answer.d.ts.map +1 -0
  79. package/dist/server/routes/answer.js +124 -0
  80. package/dist/server/routes/answer.js.map +1 -0
  81. package/dist/server/routes/batch.d.ts +7 -0
  82. package/dist/server/routes/batch.d.ts.map +1 -0
  83. package/dist/server/routes/batch.js +287 -0
  84. package/dist/server/routes/batch.js.map +1 -0
  85. package/dist/server/routes/cli-usage.d.ts +7 -0
  86. package/dist/server/routes/cli-usage.d.ts.map +1 -0
  87. package/dist/server/routes/cli-usage.js +121 -0
  88. package/dist/server/routes/cli-usage.js.map +1 -0
  89. package/dist/server/routes/compat.d.ts +24 -0
  90. package/dist/server/routes/compat.d.ts.map +1 -0
  91. package/dist/server/routes/compat.js +651 -0
  92. package/dist/server/routes/compat.js.map +1 -0
  93. package/dist/server/routes/extract.d.ts +9 -0
  94. package/dist/server/routes/extract.d.ts.map +1 -0
  95. package/dist/server/routes/extract.js +121 -0
  96. package/dist/server/routes/extract.js.map +1 -0
  97. package/dist/server/routes/fetch.d.ts +7 -0
  98. package/dist/server/routes/fetch.d.ts.map +1 -0
  99. package/dist/server/routes/fetch.js +537 -0
  100. package/dist/server/routes/fetch.js.map +1 -0
  101. package/dist/server/routes/health.d.ts +8 -0
  102. package/dist/server/routes/health.d.ts.map +1 -0
  103. package/dist/server/routes/health.js +36 -0
  104. package/dist/server/routes/health.js.map +1 -0
  105. package/dist/server/routes/jobs.d.ts +8 -0
  106. package/dist/server/routes/jobs.d.ts.map +1 -0
  107. package/dist/server/routes/jobs.js +374 -0
  108. package/dist/server/routes/jobs.js.map +1 -0
  109. package/dist/server/routes/mcp.d.ts +16 -0
  110. package/dist/server/routes/mcp.d.ts.map +1 -0
  111. package/dist/server/routes/mcp.js +475 -0
  112. package/dist/server/routes/mcp.js.map +1 -0
  113. package/dist/server/routes/oauth.d.ts +10 -0
  114. package/dist/server/routes/oauth.d.ts.map +1 -0
  115. package/dist/server/routes/oauth.js +296 -0
  116. package/dist/server/routes/oauth.js.map +1 -0
  117. package/dist/server/routes/screenshot.d.ts +10 -0
  118. package/dist/server/routes/screenshot.d.ts.map +1 -0
  119. package/dist/server/routes/screenshot.js +217 -0
  120. package/dist/server/routes/screenshot.js.map +1 -0
  121. package/dist/server/routes/search.d.ts +7 -0
  122. package/dist/server/routes/search.d.ts.map +1 -0
  123. package/dist/server/routes/search.js +287 -0
  124. package/dist/server/routes/search.js.map +1 -0
  125. package/dist/server/routes/stats.d.ts +7 -0
  126. package/dist/server/routes/stats.d.ts.map +1 -0
  127. package/dist/server/routes/stats.js +65 -0
  128. package/dist/server/routes/stats.js.map +1 -0
  129. package/dist/server/routes/stripe.d.ts +9 -0
  130. package/dist/server/routes/stripe.d.ts.map +1 -0
  131. package/dist/server/routes/stripe.js +233 -0
  132. package/dist/server/routes/stripe.js.map +1 -0
  133. package/dist/server/routes/users.d.ts +9 -0
  134. package/dist/server/routes/users.d.ts.map +1 -0
  135. package/dist/server/routes/users.js +954 -0
  136. package/dist/server/routes/users.js.map +1 -0
  137. package/dist/server/routes/webhooks.d.ts +15 -0
  138. package/dist/server/routes/webhooks.d.ts.map +1 -0
  139. package/dist/server/routes/webhooks.js +73 -0
  140. package/dist/server/routes/webhooks.js.map +1 -0
  141. package/dist/server/sentry.d.ts +14 -0
  142. package/dist/server/sentry.d.ts.map +1 -0
  143. package/dist/server/sentry.js +39 -0
  144. package/dist/server/sentry.js.map +1 -0
  145. package/dist/types.d.ts +13 -0
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/types.js.map +1 -1
  148. package/package.json +3 -2
@@ -0,0 +1,374 @@
1
+ /**
2
+ * Async jobs API - crawl endpoints with SSE support
3
+ */
4
+ import { Router } from 'express';
5
+ import { crawl } from '../../index.js';
6
+ import { searchJobs } from '../../core/jobs.js';
7
+ import { sendWebhook } from './webhooks.js';
8
+ export function createJobsRouter(jobQueue, authStore) {
9
+ const router = Router();
10
+ /**
11
+ * POST /v1/crawl - Start async crawl job
12
+ */
13
+ router.post('/v1/crawl', async (req, res) => {
14
+ try {
15
+ const { url, limit, maxDepth, scrapeOptions, webhook, location, languages } = req.body;
16
+ // Validate required parameters
17
+ if (!url || typeof url !== 'string') {
18
+ res.status(400).json({
19
+ error: 'invalid_request',
20
+ message: 'Missing or invalid "url" parameter',
21
+ });
22
+ return;
23
+ }
24
+ // Validate URL
25
+ try {
26
+ new URL(url);
27
+ }
28
+ catch {
29
+ res.status(400).json({
30
+ error: 'invalid_url',
31
+ message: 'Invalid URL format',
32
+ });
33
+ return;
34
+ }
35
+ // Create job (with owner for authorization)
36
+ const ownerId = req.auth?.keyInfo?.accountId;
37
+ const job = await jobQueue.createJob('crawl', webhook, ownerId);
38
+ // Start crawl in background
39
+ setImmediate(async () => {
40
+ try {
41
+ // Update job to processing
42
+ jobQueue.updateJob(job.id, { status: 'processing' });
43
+ // Send started webhook
44
+ if (webhook) {
45
+ await sendWebhook(webhook, 'started', {
46
+ jobId: job.id,
47
+ url,
48
+ });
49
+ }
50
+ // Build crawl options
51
+ const crawlOptions = {
52
+ maxPages: limit || 100,
53
+ maxDepth: maxDepth || 3,
54
+ onProgress: (progress) => {
55
+ // Update job progress
56
+ const total = progress.crawled + progress.queued;
57
+ jobQueue.updateJob(job.id, {
58
+ total,
59
+ completed: progress.crawled,
60
+ creditsUsed: progress.crawled,
61
+ });
62
+ // Send page webhook
63
+ if (webhook && progress.currentUrl) {
64
+ sendWebhook(webhook, 'page', {
65
+ jobId: job.id,
66
+ url: progress.currentUrl,
67
+ completed: progress.crawled,
68
+ total,
69
+ }).catch(() => { }); // Fire and forget
70
+ }
71
+ },
72
+ // Spread existing scrapeOptions
73
+ ...scrapeOptions,
74
+ // Add location support if provided (CrawlOptions extends PeelOptions)
75
+ location: location || languages ? {
76
+ country: location,
77
+ languages: Array.isArray(languages) ? languages : (languages ? [languages] : undefined),
78
+ } : undefined,
79
+ };
80
+ // Run crawl
81
+ const results = await crawl(url, crawlOptions);
82
+ // Update job with results
83
+ jobQueue.updateJob(job.id, {
84
+ status: 'completed',
85
+ data: results,
86
+ total: results.length,
87
+ completed: results.length,
88
+ creditsUsed: results.length,
89
+ });
90
+ // Send completed webhook
91
+ if (webhook) {
92
+ await sendWebhook(webhook, 'completed', {
93
+ jobId: job.id,
94
+ total: results.length,
95
+ });
96
+ }
97
+ }
98
+ catch (error) {
99
+ // Update job with error
100
+ jobQueue.updateJob(job.id, {
101
+ status: 'failed',
102
+ error: error.message || 'Unknown error',
103
+ });
104
+ // Send failed webhook
105
+ if (webhook) {
106
+ await sendWebhook(webhook, 'failed', {
107
+ jobId: job.id,
108
+ error: error.message || 'Unknown error',
109
+ });
110
+ }
111
+ }
112
+ });
113
+ // Return job ID immediately
114
+ res.status(202).json({
115
+ success: true,
116
+ id: job.id,
117
+ url: `/v1/crawl/${job.id}`,
118
+ });
119
+ }
120
+ catch (error) {
121
+ console.error('Crawl job creation error:', error);
122
+ res.status(500).json({
123
+ error: 'internal_error',
124
+ message: 'Failed to create crawl job',
125
+ });
126
+ }
127
+ });
128
+ /**
129
+ * GET /v1/crawl/:id - Get crawl job status + results (with SSE support)
130
+ */
131
+ router.get('/v1/crawl/:id', async (req, res) => {
132
+ try {
133
+ const id = req.params.id;
134
+ const job = await jobQueue.getJob(id);
135
+ if (!job) {
136
+ res.status(404).json({
137
+ error: 'not_found',
138
+ message: 'Job not found',
139
+ });
140
+ return;
141
+ }
142
+ // SECURITY: Verify the requester owns this job
143
+ const requestOwnerId = req.auth?.keyInfo?.accountId;
144
+ if (job.ownerId && requestOwnerId && job.ownerId !== requestOwnerId) {
145
+ res.status(404).json({
146
+ error: 'not_found',
147
+ message: 'Job not found',
148
+ });
149
+ return;
150
+ }
151
+ // Check for SSE request
152
+ const acceptHeader = req.get('Accept');
153
+ const isSSE = acceptHeader?.includes('text/event-stream');
154
+ if (isSSE) {
155
+ // Set SSE headers
156
+ res.setHeader('Content-Type', 'text/event-stream');
157
+ res.setHeader('Cache-Control', 'no-cache');
158
+ res.setHeader('Connection', 'keep-alive');
159
+ // Send initial event
160
+ const sendEvent = (data) => {
161
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
162
+ };
163
+ sendEvent({
164
+ event: 'status',
165
+ ...job,
166
+ });
167
+ // Poll for updates every second
168
+ const interval = setInterval(async () => {
169
+ const updatedJob = await jobQueue.getJob(id);
170
+ if (!updatedJob) {
171
+ clearInterval(interval);
172
+ res.end();
173
+ return;
174
+ }
175
+ sendEvent({
176
+ event: 'status',
177
+ ...updatedJob,
178
+ });
179
+ // End stream if job is complete
180
+ if (updatedJob.status === 'completed' || updatedJob.status === 'failed' || updatedJob.status === 'cancelled') {
181
+ clearInterval(interval);
182
+ res.end();
183
+ }
184
+ }, 1000);
185
+ // Clean up on client disconnect
186
+ req.on('close', () => {
187
+ clearInterval(interval);
188
+ });
189
+ }
190
+ else {
191
+ // Return JSON response
192
+ res.json({
193
+ success: true,
194
+ status: job.status,
195
+ progress: job.progress,
196
+ total: job.total,
197
+ completed: job.completed,
198
+ creditsUsed: job.creditsUsed,
199
+ data: job.data,
200
+ error: job.error,
201
+ expiresAt: job.expiresAt,
202
+ });
203
+ }
204
+ }
205
+ catch (error) {
206
+ console.error('Get crawl job error:', error);
207
+ res.status(500).json({
208
+ error: 'internal_error',
209
+ message: 'Failed to retrieve job',
210
+ });
211
+ }
212
+ });
213
+ /**
214
+ * DELETE /v1/crawl/:id - Cancel crawl job
215
+ */
216
+ router.delete('/v1/crawl/:id', async (req, res) => {
217
+ try {
218
+ const id = req.params.id;
219
+ // SECURITY: Verify the requester owns this job before cancelling
220
+ const job = await jobQueue.getJob(id);
221
+ const requestOwnerId = req.auth?.keyInfo?.accountId;
222
+ if (job?.ownerId && requestOwnerId && job.ownerId !== requestOwnerId) {
223
+ res.status(404).json({
224
+ error: 'not_found',
225
+ message: 'Job not found or cannot be cancelled',
226
+ });
227
+ return;
228
+ }
229
+ const cancelled = await jobQueue.cancelJob(id);
230
+ if (!cancelled) {
231
+ res.status(404).json({
232
+ error: 'not_found',
233
+ message: 'Job not found or cannot be cancelled',
234
+ });
235
+ return;
236
+ }
237
+ res.json({
238
+ success: true,
239
+ message: 'Job cancelled',
240
+ });
241
+ }
242
+ catch (error) {
243
+ console.error('Cancel crawl job error:', error);
244
+ res.status(500).json({
245
+ error: 'internal_error',
246
+ message: 'Failed to cancel job',
247
+ });
248
+ }
249
+ });
250
+ /**
251
+ * GET /v1/jobs - List all jobs
252
+ */
253
+ router.get('/v1/jobs', async (req, res) => {
254
+ try {
255
+ const { type, status, limit } = req.query;
256
+ // SECURITY: Filter jobs by the authenticated user's ownership
257
+ const ownerId = req.auth?.keyInfo?.accountId;
258
+ const jobs = await jobQueue.listJobs({
259
+ type: type,
260
+ status: status,
261
+ limit: limit ? parseInt(limit, 10) : 50,
262
+ ownerId,
263
+ });
264
+ res.json({
265
+ success: true,
266
+ count: jobs.length,
267
+ jobs,
268
+ });
269
+ }
270
+ catch (error) {
271
+ console.error('List jobs error:', error);
272
+ res.status(500).json({
273
+ error: 'internal_error',
274
+ message: 'Failed to list jobs',
275
+ });
276
+ }
277
+ });
278
+ /**
279
+ * POST /v1/jobs — Search job boards (LinkedIn, Indeed, Glassdoor)
280
+ *
281
+ * Credits: 1 for the search + 1 per detail page fetched.
282
+ */
283
+ router.post('/v1/jobs', async (req, res) => {
284
+ try {
285
+ const { url, keywords, location, source, limit, fetchDetails, timeout, } = req.body;
286
+ // Must provide either url or keywords
287
+ if (!url && !keywords) {
288
+ res.status(400).json({
289
+ error: 'invalid_request',
290
+ message: 'Provide either "url" or "keywords" in the request body.',
291
+ docs: 'https://webpeel.dev/docs/api-reference#jobs',
292
+ });
293
+ return;
294
+ }
295
+ // Validate source
296
+ const validSources = ['glassdoor', 'indeed', 'linkedin'];
297
+ if (source && !validSources.includes(source)) {
298
+ res.status(400).json({
299
+ error: 'invalid_request',
300
+ message: `Invalid "source": must be one of ${validSources.join(', ')}`,
301
+ });
302
+ return;
303
+ }
304
+ // Validate numeric params
305
+ const resolvedLimit = typeof limit === 'number' ? Math.min(Math.max(limit, 1), 100) : 25;
306
+ const resolvedDetails = typeof fetchDetails === 'number' ? Math.min(Math.max(fetchDetails, 0), resolvedLimit) : 0;
307
+ const resolvedTimeout = typeof timeout === 'number' ? Math.min(Math.max(timeout, 5000), 120000) : 30000;
308
+ const searchOpts = {
309
+ url: url || undefined,
310
+ keywords: keywords || undefined,
311
+ location: location || undefined,
312
+ source: source || undefined,
313
+ limit: resolvedLimit,
314
+ fetchDetails: resolvedDetails,
315
+ timeout: resolvedTimeout,
316
+ };
317
+ const startTime = Date.now();
318
+ const result = await searchJobs(searchOpts);
319
+ const elapsed = Date.now() - startTime;
320
+ // Credits: 1 for the search + 1 per detail page fetched
321
+ const creditsUsed = 1 + result.detailsFetched;
322
+ // Track usage
323
+ const isSoftLimited = req.auth?.softLimited === true;
324
+ const hasExtraUsage = req.auth?.extraUsageAvailable === true;
325
+ const pgStore = authStore;
326
+ if (req.auth?.keyInfo?.accountId && typeof pgStore.pool !== 'undefined') {
327
+ pgStore.pool.query(`INSERT INTO usage_logs
328
+ (user_id, endpoint, url, method, processing_time_ms, status_code, ip_address, user_agent)
329
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, [
330
+ req.auth.keyInfo.accountId,
331
+ 'jobs',
332
+ result.searchUrl || keywords || url || '',
333
+ 'basic',
334
+ elapsed,
335
+ 200,
336
+ req.ip || req.socket.remoteAddress,
337
+ req.get('user-agent'),
338
+ ]).catch((err) => {
339
+ console.error('Failed to log jobs request to usage_logs:', err);
340
+ });
341
+ }
342
+ if (req.auth?.keyInfo?.key && typeof pgStore.trackBurstUsage === 'function') {
343
+ await pgStore.trackBurstUsage(req.auth.keyInfo.key);
344
+ if (isSoftLimited && hasExtraUsage) {
345
+ const extraResult = await pgStore.trackExtraUsage(req.auth.keyInfo.key, 'search', result.searchUrl || keywords || url || '', elapsed, 200);
346
+ if (extraResult.success) {
347
+ res.setHeader('X-Extra-Usage-Charged', `$${extraResult.cost.toFixed(4)}`);
348
+ res.setHeader('X-Extra-Usage-New-Balance', extraResult.newBalance.toFixed(2));
349
+ }
350
+ }
351
+ else if (!isSoftLimited) {
352
+ await pgStore.trackUsage(req.auth.keyInfo.key, 'search');
353
+ }
354
+ }
355
+ res.setHeader('X-Credits-Used', creditsUsed.toString());
356
+ res.setHeader('X-Processing-Time', elapsed.toString());
357
+ res.json({
358
+ success: true,
359
+ data: result,
360
+ creditsUsed,
361
+ });
362
+ }
363
+ catch (error) {
364
+ console.error('POST /v1/jobs error:', error);
365
+ res.status(500).json({
366
+ error: 'internal_error',
367
+ message: 'Job search failed. Please try again.',
368
+ docs: 'https://webpeel.dev/docs/api-reference#jobs',
369
+ });
370
+ }
371
+ });
372
+ return router;
373
+ }
374
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/server/routes/jobs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,QAAmB,EAAE,SAAoB;IACxE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAEvF,+BAA+B;YAC/B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,oCAAoC;iBAC9C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,eAAe;YACf,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,aAAa;oBACpB,OAAO,EAAE,oBAAoB;iBAC9B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,4CAA4C;YAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhE,4BAA4B;YAC5B,YAAY,CAAC,KAAK,IAAI,EAAE;gBACtB,IAAI,CAAC;oBACH,2BAA2B;oBAC3B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;oBAErD,uBAAuB;oBACvB,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE;4BACpC,KAAK,EAAE,GAAG,CAAC,EAAE;4BACb,GAAG;yBACJ,CAAC,CAAC;oBACL,CAAC;oBAED,sBAAsB;oBACtB,MAAM,YAAY,GAAiB;wBACjC,QAAQ,EAAE,KAAK,IAAI,GAAG;wBACtB,QAAQ,EAAE,QAAQ,IAAI,CAAC;wBACvB,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;4BACvB,sBAAsB;4BACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;4BACjD,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;gCACzB,KAAK;gCACL,SAAS,EAAE,QAAQ,CAAC,OAAO;gCAC3B,WAAW,EAAE,QAAQ,CAAC,OAAO;6BAC9B,CAAC,CAAC;4BAEH,oBAAoB;4BACpB,IAAI,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gCACnC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE;oCAC3B,KAAK,EAAE,GAAG,CAAC,EAAE;oCACb,GAAG,EAAE,QAAQ,CAAC,UAAU;oCACxB,SAAS,EAAE,QAAQ,CAAC,OAAO;oCAC3B,KAAK;iCACN,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB;4BACxC,CAAC;wBACH,CAAC;wBACD,gCAAgC;wBAChC,GAAG,aAAa;wBAChB,sEAAsE;wBACtE,QAAQ,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC;4BAChC,OAAO,EAAE,QAAQ;4BACjB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;yBACxF,CAAC,CAAC,CAAC,SAAS;qBACd,CAAC;oBAEF,YAAY;oBACZ,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;oBAE/C,0BAA0B;oBAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;wBACzB,MAAM,EAAE,WAAW;wBACnB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,OAAO,CAAC,MAAM;wBACrB,SAAS,EAAE,OAAO,CAAC,MAAM;wBACzB,WAAW,EAAE,OAAO,CAAC,MAAM;qBAC5B,CAAC,CAAC;oBAEH,yBAAyB;oBACzB,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE;4BACtC,KAAK,EAAE,GAAG,CAAC,EAAE;4BACb,KAAK,EAAE,OAAO,CAAC,MAAM;yBACtB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,wBAAwB;oBACxB,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;wBACzB,MAAM,EAAE,QAAQ;wBAChB,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;qBACxC,CAAC,CAAC;oBAEH,sBAAsB;oBACtB,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE;4BACnC,KAAK,EAAE,GAAG,CAAC,EAAE;4BACb,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;yBACxC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,4BAA4B;YAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,IAAI;gBACb,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,GAAG,EAAE,aAAa,GAAG,CAAC,EAAE,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAY,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEtC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,eAAe;iBACzB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,+CAA+C;YAC/C,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;YACpD,IAAI,GAAG,CAAC,OAAO,IAAI,cAAc,IAAI,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,eAAe;iBACzB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,wBAAwB;YACxB,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,YAAY,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAE1D,IAAI,KAAK,EAAE,CAAC;gBACV,kBAAkB;gBAClB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;gBACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBAE1C,qBAAqB;gBACrB,MAAM,SAAS,GAAG,CAAC,IAAS,EAAE,EAAE;oBAC9B,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjD,CAAC,CAAC;gBAEF,SAAS,CAAC;oBACR,KAAK,EAAE,QAAQ;oBACf,GAAG,GAAG;iBACP,CAAC,CAAC;gBAEH,gCAAgC;gBAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;oBACtC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,aAAa,CAAC,QAAQ,CAAC,CAAC;wBACxB,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBAED,SAAS,CAAC;wBACR,KAAK,EAAE,QAAQ;wBACf,GAAG,UAAU;qBACd,CAAC,CAAC;oBAEH,gCAAgC;oBAChC,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;wBAC7G,aAAa,CAAC,QAAQ,CAAC,CAAC;wBACxB,GAAG,CAAC,GAAG,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,EAAE,IAAI,CAAC,CAAC;gBAET,gCAAgC;gBAChC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACnB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,SAAS,EAAE,GAAG,CAAC,SAAS;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAY,CAAC;YAEnC,iEAAiE;YACjE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;YACpD,IAAI,GAAG,EAAE,OAAO,IAAI,cAAc,IAAI,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;gBACrE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,sCAAsC;iBAChD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAE/C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,sCAAsC;iBAChD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,eAAe;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;YAE1C,8DAA8D;YAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;YAE7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBACnC,IAAI,EAAE,IAA0B;gBAChC,MAAM,EAAE,MAA4B;gBACpC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACjD,OAAO;aACR,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,qBAAqB;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,EACJ,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,KAAK,EACL,YAAY,EACZ,OAAO,GACR,GAAG,GAAG,CAAC,IAQP,CAAC;YAEF,sCAAsC;YACtC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,yDAAyD;oBAClE,IAAI,EAAE,6CAA6C;iBACpD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,kBAAkB;YAClB,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACzD,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,oCAAoC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACvE,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,eAAe,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClH,MAAM,eAAe,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAExG,MAAM,UAAU,GAAqB;gBACnC,GAAG,EAAE,GAAG,IAAI,SAAS;gBACrB,QAAQ,EAAE,QAAQ,IAAI,SAAS;gBAC/B,QAAQ,EAAE,QAAQ,IAAI,SAAS;gBAC/B,MAAM,EAAE,MAAM,IAAI,SAAS;gBAC3B,KAAK,EAAE,aAAa;gBACpB,YAAY,EAAE,eAAe;gBAC7B,OAAO,EAAE,eAAe;aACzB,CAAC;YAEF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEvC,wDAAwD;YACxD,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;YAE9C,cAAc;YACd,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;YACrD,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;YAC7D,MAAM,OAAO,GAAG,SAAgB,CAAC;YAEjC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,KAAK,CAChB;;kDAEwC,EACxC;oBACE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;oBAC1B,MAAM;oBACN,MAAM,CAAC,SAAS,IAAI,QAAQ,IAAI,GAAG,IAAI,EAAE;oBACzC,OAAO;oBACP,OAAO;oBACP,GAAG;oBACH,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa;oBAClC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;iBACtB,CACF,CAAC,KAAK,CAAC,CAAC,GAAQ,EAAE,EAAE;oBACnB,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;gBAC5E,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAEpD,IAAI,aAAa,IAAI,aAAa,EAAE,CAAC;oBACnC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,eAAe,CAC/C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EACpB,QAAQ,EACR,MAAM,CAAC,SAAS,IAAI,QAAQ,IAAI,GAAG,IAAI,EAAE,EACzC,OAAO,EACP,GAAG,CACJ,CAAC;oBACF,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACxB,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAC1E,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChF,CAAC;gBACH,CAAC;qBAAM,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC1B,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxD,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM;gBACZ,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,sCAAsC;gBAC/C,IAAI,EAAE,6CAA6C;aACpD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Hosted MCP endpoint — POST /mcp, POST /v2/mcp, POST /:apiKey/v2/mcp
3
+ *
4
+ * Accepts MCP Streamable HTTP transport (JSON-RPC over HTTP).
5
+ * Users connect with:
6
+ * { "url": "https://api.webpeel.dev/mcp" }
7
+ * { "url": "https://api.webpeel.dev/v2/mcp" }
8
+ * { "url": "https://api.webpeel.dev/<API_KEY>/v2/mcp" } ← key in URL (Firecrawl-style)
9
+ *
10
+ * Each request creates a stateless MCP server, processes the JSON-RPC
11
+ * message(s), and returns the response.
12
+ */
13
+ import { Router } from 'express';
14
+ import type { AuthStore } from '../auth-store.js';
15
+ export declare function createMcpRouter(authStore?: AuthStore): Router;
16
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/server/routes/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAyblD,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAqE7D"}