@staticn0va/wigolo 0.3.0 → 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.
Files changed (184) hide show
  1. package/README.md +67 -2
  2. package/SKILL.md +149 -0
  3. package/dist/cache/change-detector.d.ts +7 -0
  4. package/dist/cache/change-detector.d.ts.map +1 -0
  5. package/dist/cache/change-detector.js +43 -0
  6. package/dist/cache/change-detector.js.map +1 -0
  7. package/dist/cache/diff-summary.d.ts +2 -0
  8. package/dist/cache/diff-summary.d.ts.map +1 -0
  9. package/dist/cache/diff-summary.js +87 -0
  10. package/dist/cache/diff-summary.js.map +1 -0
  11. package/dist/cache/store.d.ts +2 -0
  12. package/dist/cache/store.d.ts.map +1 -1
  13. package/dist/cache/store.js +10 -0
  14. package/dist/cache/store.js.map +1 -1
  15. package/dist/cli/auth.d.ts +2 -0
  16. package/dist/cli/auth.d.ts.map +1 -0
  17. package/dist/cli/auth.js +95 -0
  18. package/dist/cli/auth.js.map +1 -0
  19. package/dist/cli/daemon.d.ts +6 -1
  20. package/dist/cli/daemon.d.ts.map +1 -1
  21. package/dist/cli/daemon.js +56 -3
  22. package/dist/cli/daemon.js.map +1 -1
  23. package/dist/cli/doctor.d.ts +8 -0
  24. package/dist/cli/doctor.d.ts.map +1 -0
  25. package/dist/cli/doctor.js +153 -0
  26. package/dist/cli/doctor.js.map +1 -0
  27. package/dist/cli/health.d.ts +1 -1
  28. package/dist/cli/health.d.ts.map +1 -1
  29. package/dist/cli/health.js +41 -3
  30. package/dist/cli/health.js.map +1 -1
  31. package/dist/cli/index.d.ts +1 -1
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +1 -1
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/plugin.d.ts +5 -0
  36. package/dist/cli/plugin.d.ts.map +1 -0
  37. package/dist/cli/plugin.js +188 -0
  38. package/dist/cli/plugin.js.map +1 -0
  39. package/dist/cli/shell.d.ts +2 -0
  40. package/dist/cli/shell.d.ts.map +1 -0
  41. package/dist/cli/shell.js +86 -0
  42. package/dist/cli/shell.js.map +1 -0
  43. package/dist/cli/warmup.d.ts +4 -0
  44. package/dist/cli/warmup.d.ts.map +1 -1
  45. package/dist/cli/warmup.js +78 -2
  46. package/dist/cli/warmup.js.map +1 -1
  47. package/dist/config.d.ts +10 -0
  48. package/dist/config.d.ts.map +1 -1
  49. package/dist/config.js +27 -0
  50. package/dist/config.js.map +1 -1
  51. package/dist/daemon/health-check.d.ts +16 -0
  52. package/dist/daemon/health-check.d.ts.map +1 -0
  53. package/dist/daemon/health-check.js +36 -0
  54. package/dist/daemon/health-check.js.map +1 -0
  55. package/dist/daemon/http-server.d.ts +26 -0
  56. package/dist/daemon/http-server.d.ts.map +1 -0
  57. package/dist/daemon/http-server.js +282 -0
  58. package/dist/daemon/http-server.js.map +1 -0
  59. package/dist/daemon/proxy.d.ts +10 -0
  60. package/dist/daemon/proxy.d.ts.map +1 -0
  61. package/dist/daemon/proxy.js +99 -0
  62. package/dist/daemon/proxy.js.map +1 -0
  63. package/dist/fetch/action-executor.d.ts +28 -0
  64. package/dist/fetch/action-executor.d.ts.map +1 -0
  65. package/dist/fetch/action-executor.js +86 -0
  66. package/dist/fetch/action-executor.js.map +1 -0
  67. package/dist/fetch/auth.d.ts +2 -1
  68. package/dist/fetch/auth.d.ts.map +1 -1
  69. package/dist/fetch/auth.js +30 -2
  70. package/dist/fetch/auth.js.map +1 -1
  71. package/dist/fetch/browser-pool.d.ts +30 -11
  72. package/dist/fetch/browser-pool.d.ts.map +1 -1
  73. package/dist/fetch/browser-pool.js +165 -49
  74. package/dist/fetch/browser-pool.js.map +1 -1
  75. package/dist/fetch/browser-selector.d.ts +17 -0
  76. package/dist/fetch/browser-selector.d.ts.map +1 -0
  77. package/dist/fetch/browser-selector.js +70 -0
  78. package/dist/fetch/browser-selector.js.map +1 -0
  79. package/dist/fetch/browser-types.d.ts +3 -0
  80. package/dist/fetch/browser-types.d.ts.map +1 -0
  81. package/dist/fetch/browser-types.js +45 -0
  82. package/dist/fetch/browser-types.js.map +1 -0
  83. package/dist/fetch/cdp-client.d.ts +9 -0
  84. package/dist/fetch/cdp-client.d.ts.map +1 -0
  85. package/dist/fetch/cdp-client.js +90 -0
  86. package/dist/fetch/cdp-client.js.map +1 -0
  87. package/dist/fetch/router.d.ts +4 -1
  88. package/dist/fetch/router.d.ts.map +1 -1
  89. package/dist/fetch/router.js +8 -2
  90. package/dist/fetch/router.js.map +1 -1
  91. package/dist/index.js +39 -3
  92. package/dist/index.js.map +1 -1
  93. package/dist/instructions.d.ts +26 -0
  94. package/dist/instructions.d.ts.map +1 -0
  95. package/dist/instructions.js +101 -0
  96. package/dist/instructions.js.map +1 -0
  97. package/dist/logger.d.ts +1 -1
  98. package/dist/logger.d.ts.map +1 -1
  99. package/dist/plugins/loader.d.ts +20 -0
  100. package/dist/plugins/loader.d.ts.map +1 -0
  101. package/dist/plugins/loader.js +162 -0
  102. package/dist/plugins/loader.js.map +1 -0
  103. package/dist/plugins/registry.d.ts +26 -0
  104. package/dist/plugins/registry.d.ts.map +1 -0
  105. package/dist/plugins/registry.js +68 -0
  106. package/dist/plugins/registry.js.map +1 -0
  107. package/dist/plugins/validate.d.ts +9 -0
  108. package/dist/plugins/validate.d.ts.map +1 -0
  109. package/dist/plugins/validate.js +70 -0
  110. package/dist/plugins/validate.js.map +1 -0
  111. package/dist/repl/commands/cache.d.ts +4 -0
  112. package/dist/repl/commands/cache.d.ts.map +1 -0
  113. package/dist/repl/commands/cache.js +44 -0
  114. package/dist/repl/commands/cache.js.map +1 -0
  115. package/dist/repl/commands/crawl.d.ts +7 -0
  116. package/dist/repl/commands/crawl.d.ts.map +1 -0
  117. package/dist/repl/commands/crawl.js +42 -0
  118. package/dist/repl/commands/crawl.js.map +1 -0
  119. package/dist/repl/commands/extract.d.ts +5 -0
  120. package/dist/repl/commands/extract.d.ts.map +1 -0
  121. package/dist/repl/commands/extract.js +37 -0
  122. package/dist/repl/commands/extract.js.map +1 -0
  123. package/dist/repl/commands/fetch.d.ts +5 -0
  124. package/dist/repl/commands/fetch.d.ts.map +1 -0
  125. package/dist/repl/commands/fetch.js +53 -0
  126. package/dist/repl/commands/fetch.js.map +1 -0
  127. package/dist/repl/commands/search.d.ts +5 -0
  128. package/dist/repl/commands/search.d.ts.map +1 -0
  129. package/dist/repl/commands/search.js +62 -0
  130. package/dist/repl/commands/search.js.map +1 -0
  131. package/dist/repl/commands/types.d.ts +9 -0
  132. package/dist/repl/commands/types.d.ts.map +1 -0
  133. package/dist/repl/commands/types.js +2 -0
  134. package/dist/repl/commands/types.js.map +1 -0
  135. package/dist/repl/formatters.d.ts +10 -0
  136. package/dist/repl/formatters.d.ts.map +1 -0
  137. package/dist/repl/formatters.js +209 -0
  138. package/dist/repl/formatters.js.map +1 -0
  139. package/dist/repl/parser.d.ts +9 -0
  140. package/dist/repl/parser.d.ts.map +1 -0
  141. package/dist/repl/parser.js +84 -0
  142. package/dist/repl/parser.js.map +1 -0
  143. package/dist/repl/shell.d.ts +8 -0
  144. package/dist/repl/shell.d.ts.map +1 -0
  145. package/dist/repl/shell.js +156 -0
  146. package/dist/repl/shell.js.map +1 -0
  147. package/dist/search/context-formatter.d.ts +3 -0
  148. package/dist/search/context-formatter.d.ts.map +1 -0
  149. package/dist/search/context-formatter.js +56 -0
  150. package/dist/search/context-formatter.js.map +1 -0
  151. package/dist/search/engines/bing.d.ts +1 -0
  152. package/dist/search/engines/bing.d.ts.map +1 -1
  153. package/dist/search/engines/bing.js +27 -1
  154. package/dist/search/engines/bing.js.map +1 -1
  155. package/dist/searxng/bootstrap.d.ts +30 -0
  156. package/dist/searxng/bootstrap.d.ts.map +1 -1
  157. package/dist/searxng/bootstrap.js +150 -23
  158. package/dist/searxng/bootstrap.js.map +1 -1
  159. package/dist/searxng/process.d.ts +13 -1
  160. package/dist/searxng/process.d.ts.map +1 -1
  161. package/dist/searxng/process.js +52 -2
  162. package/dist/searxng/process.js.map +1 -1
  163. package/dist/server/backend-status.d.ts +11 -0
  164. package/dist/server/backend-status.d.ts.map +1 -0
  165. package/dist/server/backend-status.js +27 -0
  166. package/dist/server/backend-status.js.map +1 -0
  167. package/dist/server.d.ts +17 -0
  168. package/dist/server.d.ts.map +1 -1
  169. package/dist/server.js +228 -91
  170. package/dist/server.js.map +1 -1
  171. package/dist/tools/cache.d.ts +2 -1
  172. package/dist/tools/cache.d.ts.map +1 -1
  173. package/dist/tools/cache.js +56 -1
  174. package/dist/tools/cache.js.map +1 -1
  175. package/dist/tools/fetch.d.ts.map +1 -1
  176. package/dist/tools/fetch.js +16 -1
  177. package/dist/tools/fetch.js.map +1 -1
  178. package/dist/tools/search.d.ts +2 -1
  179. package/dist/tools/search.d.ts.map +1 -1
  180. package/dist/tools/search.js +26 -4
  181. package/dist/tools/search.js.map +1 -1
  182. package/dist/types.d.ts +49 -0
  183. package/dist/types.d.ts.map +1 -1
  184. package/package.json +36 -3
package/dist/server.js CHANGED
@@ -5,7 +5,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
5
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
6
  import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
7
7
  import { SmartRouter } from './fetch/router.js';
8
- import { BrowserPool } from './fetch/browser-pool.js';
8
+ import { MultiBrowserPool } from './fetch/browser-pool.js';
9
9
  import { httpFetch } from './fetch/http-client.js';
10
10
  import { initDatabase, closeDatabase } from './cache/db.js';
11
11
  import { handleFetch } from './tools/fetch.js';
@@ -20,8 +20,13 @@ import { StartpageEngine } from './search/engines/startpage.js';
20
20
  import { resolveSearchBackend, bootstrapNativeSearxng, getBootstrapState } from './searxng/bootstrap.js';
21
21
  import { SearxngProcess } from './searxng/process.js';
22
22
  import { DockerSearxng } from './searxng/docker.js';
23
+ import { BackendStatus } from './server/backend-status.js';
23
24
  import { getConfig } from './config.js';
24
25
  import { createLogger } from './logger.js';
26
+ import { WIGOLO_INSTRUCTIONS, TOOL_DESCRIPTIONS } from './instructions.js';
27
+ import { loadPlugins } from './plugins/loader.js';
28
+ import { PluginRegistry } from './plugins/registry.js';
29
+ import { registerExtractor } from './extraction/pipeline.js';
25
30
  const log = createLogger('server');
26
31
  function readPackageVersion() {
27
32
  try {
@@ -70,6 +75,47 @@ const FETCH_TOOL_SCHEMA = {
70
75
  description: 'Additional HTTP headers',
71
76
  additionalProperties: { type: 'string' },
72
77
  },
78
+ actions: {
79
+ type: 'array',
80
+ description: 'Sequential browser actions to perform before extracting content. ' +
81
+ 'When present, forces Playwright rendering (bypasses HTTP-first routing).',
82
+ items: {
83
+ type: 'object',
84
+ properties: {
85
+ type: {
86
+ type: 'string',
87
+ enum: ['click', 'type', 'wait', 'wait_for', 'scroll', 'screenshot'],
88
+ description: 'Action type',
89
+ },
90
+ selector: {
91
+ type: 'string',
92
+ description: 'CSS selector (required for click, type, wait_for)',
93
+ },
94
+ text: {
95
+ type: 'string',
96
+ description: 'Text to type (required for type action)',
97
+ },
98
+ ms: {
99
+ type: 'number',
100
+ description: 'Milliseconds to wait (required for wait action)',
101
+ },
102
+ timeout: {
103
+ type: 'number',
104
+ description: 'Timeout in ms for wait_for action (default: 5000)',
105
+ },
106
+ direction: {
107
+ type: 'string',
108
+ enum: ['down', 'up'],
109
+ description: 'Scroll direction (required for scroll action)',
110
+ },
111
+ amount: {
112
+ type: 'number',
113
+ description: 'Scroll amount in pixels (default: viewport height)',
114
+ },
115
+ },
116
+ required: ['type'],
117
+ },
118
+ },
73
119
  },
74
120
  required: ['url'],
75
121
  };
@@ -107,6 +153,11 @@ const SEARCH_TOOL_SCHEMA = {
107
153
  enum: ['general', 'news', 'code', 'docs', 'papers', 'images'],
108
154
  description: 'Category of search (general, news, code, docs, papers, images)',
109
155
  },
156
+ format: {
157
+ type: 'string',
158
+ enum: ['full', 'context'],
159
+ description: "Output format: 'full' returns structured results (default), 'context' returns a single token-budgeted string ready for LLM context injection",
160
+ },
110
161
  },
111
162
  required: ['query'],
112
163
  };
@@ -157,6 +208,12 @@ const CACHE_TOOL_SCHEMA = {
157
208
  type: 'boolean',
158
209
  description: 'Return cache statistics (total URLs, size, date range)',
159
210
  },
211
+ check_changes: {
212
+ type: 'boolean',
213
+ description: 'Re-fetch all matching cached URLs and report which ones have changed. ' +
214
+ 'Returns a list of URLs with changed/unchanged status and diff summaries. ' +
215
+ 'Use with query or url_pattern to scope which cached entries to check.',
216
+ },
160
217
  },
161
218
  };
162
219
  const EXTRACT_TOOL_SCHEMA = {
@@ -183,57 +240,193 @@ const EXTRACT_TOOL_SCHEMA = {
183
240
  },
184
241
  },
185
242
  };
186
- export async function startServer() {
243
+ export async function initSubsystems() {
187
244
  const config = getConfig();
188
245
  mkdirSync(config.dataDir, { recursive: true });
189
246
  initDatabase(join(config.dataDir, 'wigolo.db'));
190
247
  const httpClient = {
191
248
  fetch: (url, options) => httpFetch(url, options),
192
249
  };
193
- const browserPool = new BrowserPool();
250
+ const browserPool = new MultiBrowserPool({
251
+ browserTypes: config.browserTypes,
252
+ selectionStrategy: 'round-robin',
253
+ });
194
254
  const router = new SmartRouter(httpClient, browserPool);
195
- // Direct scraping engines work without any bootstrap — always available so
196
- // search() succeeds immediately even before SearXNG finishes setup.
255
+ const backendStatus = new BackendStatus();
197
256
  const searchEngines = [
198
257
  new BingEngine(),
199
258
  new DuckDuckGoEngine(),
200
259
  new StartpageEngine(),
201
260
  ];
261
+ // Load plugins from ~/.wigolo/plugins/
262
+ const pluginRegistry = new PluginRegistry();
263
+ try {
264
+ const pluginResult = await loadPlugins();
265
+ for (const ext of pluginResult.extractors) {
266
+ pluginRegistry.registerExtractor(ext, ext.name);
267
+ registerExtractor(ext);
268
+ }
269
+ for (const eng of pluginResult.searchEngines) {
270
+ pluginRegistry.registerSearchEngine(eng, eng.name);
271
+ searchEngines.push(eng);
272
+ }
273
+ if (pluginResult.errors.length > 0) {
274
+ log.warn('some plugins failed to load', {
275
+ errors: pluginResult.errors.map(e => `${e.pluginName}: ${e.message}`),
276
+ });
277
+ }
278
+ if (pluginResult.loaded.length > 0) {
279
+ log.info('plugins loaded', {
280
+ count: pluginResult.loaded.length,
281
+ names: pluginResult.loaded.map(p => p.name),
282
+ });
283
+ }
284
+ }
285
+ catch (err) {
286
+ log.error('plugin loading failed', { error: String(err) });
287
+ }
202
288
  let searxngProcess = null;
203
289
  let dockerSearxng = null;
204
- const server = new Server({ name: 'wigolo', version: SERVER_VERSION }, { capabilities: { tools: {} } });
290
+ let searxngBootstrap = null;
291
+ async function bootstrapSearxng() {
292
+ try {
293
+ const backend = await resolveSearchBackend();
294
+ if (backend.type === 'external' && backend.url) {
295
+ searchEngines.unshift(new SearxngClient(backend.url));
296
+ backendStatus.markHealthy();
297
+ log.info('using external SearXNG', { url: backend.url });
298
+ return;
299
+ }
300
+ if (backend.type === 'native' && backend.searxngPath) {
301
+ const state = getBootstrapState(config.dataDir);
302
+ if (state?.status !== 'ready') {
303
+ log.info('SearXNG not ready — bootstrapping in background; search uses direct engines until ready');
304
+ try {
305
+ await bootstrapNativeSearxng(config.dataDir);
306
+ }
307
+ catch (err) {
308
+ log.warn('SearXNG bootstrap failed, continuing with direct scraping fallback');
309
+ backendStatus.markUnhealthy(`bootstrap exception: ${String(err)}`);
310
+ return;
311
+ }
312
+ }
313
+ const postBootstrapState = getBootstrapState(config.dataDir);
314
+ if (postBootstrapState?.status === 'ready') {
315
+ searxngProcess = new SearxngProcess(backend.searxngPath, config.dataDir, {
316
+ onUnhealthy: (reason) => {
317
+ backendStatus.markUnhealthy(reason);
318
+ const idx = searchEngines.findIndex(e => e.name === 'searxng');
319
+ if (idx >= 0)
320
+ searchEngines.splice(idx, 1);
321
+ log.warn('SearXNG marked unhealthy', { reason });
322
+ },
323
+ onHealthy: () => {
324
+ const url = searxngProcess?.getUrl();
325
+ if (!url)
326
+ return;
327
+ backendStatus.markHealthy();
328
+ if (!searchEngines.some(e => e.name === 'searxng')) {
329
+ searchEngines.unshift(new SearxngClient(url));
330
+ }
331
+ log.info('SearXNG recovered');
332
+ },
333
+ });
334
+ const url = await searxngProcess.start();
335
+ if (url) {
336
+ searchEngines.unshift(new SearxngClient(url));
337
+ backendStatus.markHealthy();
338
+ log.info('SearXNG ready and added to search engines', { url });
339
+ }
340
+ else {
341
+ log.warn('SearXNG failed to start, using direct scraping fallback');
342
+ backendStatus.markUnhealthy('SearXNG process failed to start');
343
+ }
344
+ }
345
+ return;
346
+ }
347
+ if (backend.type === 'docker') {
348
+ dockerSearxng = new DockerSearxng();
349
+ const url = await dockerSearxng.start();
350
+ if (url) {
351
+ searchEngines.unshift(new SearxngClient(url));
352
+ backendStatus.markHealthy();
353
+ log.info('Docker SearXNG ready', { url });
354
+ }
355
+ else {
356
+ log.warn('Docker SearXNG failed to start, using direct scraping fallback');
357
+ backendStatus.markUnhealthy('Docker SearXNG failed to start');
358
+ }
359
+ }
360
+ if (backend.type === 'scraping') {
361
+ const state = getBootstrapState(config.dataDir);
362
+ const reason = state?.lastError?.message ?? state?.error ?? 'no SearXNG backend available';
363
+ backendStatus.markUnhealthy(reason);
364
+ }
365
+ }
366
+ catch (err) {
367
+ log.warn('background backend setup failed', { error: String(err) });
368
+ backendStatus.markUnhealthy(`backend setup failed: ${String(err)}`);
369
+ }
370
+ }
371
+ async function shutdown() {
372
+ log.info('Shutting down');
373
+ if (searxngBootstrap) {
374
+ await Promise.race([
375
+ searxngBootstrap.catch(() => { }),
376
+ new Promise((r) => setTimeout(r, 2000)),
377
+ ]);
378
+ }
379
+ if (searxngProcess)
380
+ await searxngProcess.stop();
381
+ if (dockerSearxng)
382
+ await dockerSearxng.stop();
383
+ await browserPool.shutdown();
384
+ closeDatabase();
385
+ }
386
+ return {
387
+ searchEngines,
388
+ browserPool,
389
+ router,
390
+ backendStatus,
391
+ pluginRegistry,
392
+ shutdown,
393
+ bootstrapSearxng: () => {
394
+ searxngBootstrap = bootstrapSearxng();
395
+ return searxngBootstrap;
396
+ },
397
+ };
398
+ }
399
+ export function createMcpServer(subsystems) {
400
+ const { searchEngines, router, backendStatus } = subsystems;
401
+ const server = new Server({ name: 'wigolo', version: SERVER_VERSION }, {
402
+ capabilities: { tools: {} },
403
+ instructions: WIGOLO_INSTRUCTIONS,
404
+ });
205
405
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
206
406
  tools: [
207
407
  {
208
408
  name: 'fetch',
209
- description: 'Fetch a web page and return its content as clean markdown. ' +
210
- 'Supports JavaScript rendering, auth, section extraction, and caching.',
409
+ description: TOOL_DESCRIPTIONS.fetch,
211
410
  inputSchema: FETCH_TOOL_SCHEMA,
212
411
  },
213
412
  {
214
413
  name: 'search',
215
- description: 'Search the web and return results with optional full content extraction. ' +
216
- 'One call: query in, clean markdown out.',
414
+ description: TOOL_DESCRIPTIONS.search,
217
415
  inputSchema: SEARCH_TOOL_SCHEMA,
218
416
  },
219
417
  {
220
418
  name: 'crawl',
221
- description: 'Crawl a website starting from a seed URL. Supports BFS, DFS, and sitemap strategies ' +
222
- 'with depth/page limits, URL filtering, and cross-page content deduplication.',
419
+ description: TOOL_DESCRIPTIONS.crawl,
223
420
  inputSchema: CRAWL_TOOL_SCHEMA,
224
421
  },
225
422
  {
226
423
  name: 'cache',
227
- description: 'Query the local knowledge base of previously fetched content. ' +
228
- 'Search cached pages by full-text query, URL pattern, or date. ' +
229
- 'Can also return cache statistics or clear entries.',
424
+ description: TOOL_DESCRIPTIONS.cache,
230
425
  inputSchema: CACHE_TOOL_SCHEMA,
231
426
  },
232
427
  {
233
428
  name: 'extract',
234
- description: 'Extract structured data from a web page. Supports CSS selector extraction, ' +
235
- 'table-to-JSON conversion, metadata extraction (title, author, date, JSON-LD), ' +
236
- 'and schema-based extraction (provide a JSON Schema to heuristically extract matching fields).',
429
+ description: TOOL_DESCRIPTIONS.extract,
237
430
  inputSchema: EXTRACT_TOOL_SCHEMA,
238
431
  },
239
432
  ],
@@ -250,9 +443,14 @@ export async function startServer() {
250
443
  }
251
444
  if (name === 'search') {
252
445
  const input = (args ?? {});
253
- const result = await handleSearch(input, searchEngines, router);
446
+ const result = await handleSearch(input, searchEngines, router, backendStatus);
447
+ const blocks = [];
448
+ if (result.warning) {
449
+ blocks.push({ type: 'text', text: `[wigolo notice] ${result.warning}` });
450
+ }
451
+ blocks.push({ type: 'text', text: JSON.stringify(result, null, 2) });
254
452
  return {
255
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
453
+ content: blocks,
256
454
  isError: !!result.error,
257
455
  };
258
456
  }
@@ -266,7 +464,7 @@ export async function startServer() {
266
464
  }
267
465
  if (name === 'cache') {
268
466
  const input = (args ?? {});
269
- const result = handleCache(input);
467
+ const result = await handleCache(input, router);
270
468
  return {
271
469
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
272
470
  isError: !!result.error,
@@ -285,80 +483,19 @@ export async function startServer() {
285
483
  isError: true,
286
484
  };
287
485
  });
486
+ return server;
487
+ }
488
+ export async function startServer() {
489
+ const subs = await initSubsystems();
490
+ const server = createMcpServer(subs);
288
491
  const transport = new StdioServerTransport();
289
492
  await server.connect(transport);
290
493
  log.info('MCP server started');
291
- // Bootstrap SearXNG in the background. The MCP server is already responding
292
- // to initialize/tools/list/tools/call. search() falls back to direct engines
293
- // until SearXNG becomes available, at which point it is unshifted to the
294
- // front of the engine list and used preferentially on subsequent calls.
295
- let searxngBootstrap = null;
296
- searxngBootstrap = (async () => {
297
- try {
298
- const backend = await resolveSearchBackend();
299
- if (backend.type === 'external' && backend.url) {
300
- searchEngines.unshift(new SearxngClient(backend.url));
301
- log.info('using external SearXNG', { url: backend.url });
302
- return;
303
- }
304
- if (backend.type === 'native' && backend.searxngPath) {
305
- const state = getBootstrapState(config.dataDir);
306
- if (state?.status !== 'ready') {
307
- log.info('SearXNG not ready — bootstrapping in background; search uses direct engines until ready');
308
- try {
309
- await bootstrapNativeSearxng(config.dataDir);
310
- }
311
- catch {
312
- log.warn('SearXNG bootstrap failed, continuing with direct scraping fallback');
313
- return;
314
- }
315
- }
316
- const postBootstrapState = getBootstrapState(config.dataDir);
317
- if (postBootstrapState?.status === 'ready') {
318
- searxngProcess = new SearxngProcess(backend.searxngPath, config.dataDir);
319
- const url = await searxngProcess.start();
320
- if (url) {
321
- searchEngines.unshift(new SearxngClient(url));
322
- log.info('SearXNG ready and added to search engines', { url });
323
- }
324
- else {
325
- log.warn('SearXNG failed to start, using direct scraping fallback');
326
- }
327
- }
328
- return;
329
- }
330
- if (backend.type === 'docker') {
331
- dockerSearxng = new DockerSearxng();
332
- const url = await dockerSearxng.start();
333
- if (url) {
334
- searchEngines.unshift(new SearxngClient(url));
335
- log.info('Docker SearXNG ready', { url });
336
- }
337
- else {
338
- log.warn('Docker SearXNG failed to start, using direct scraping fallback');
339
- }
340
- }
341
- }
342
- catch (err) {
343
- log.warn('background backend setup failed', { error: String(err) });
344
- }
345
- })();
494
+ subs.bootstrapSearxng().catch((err) => {
495
+ log.warn('SearXNG bootstrap failed', { error: String(err) });
496
+ });
346
497
  const shutdown = async () => {
347
- log.info('Shutting down');
348
- if (searxngBootstrap) {
349
- // Let an in-flight bootstrap settle so we don't kill venv/pip mid-install
350
- // and corrupt ~/.wigolo/searxng. Bounded so we don't hang forever.
351
- await Promise.race([
352
- searxngBootstrap.catch(() => { }),
353
- new Promise((r) => setTimeout(r, 2000)),
354
- ]);
355
- }
356
- if (searxngProcess)
357
- await searxngProcess.stop();
358
- if (dockerSearxng)
359
- await dockerSearxng.stop();
360
- await browserPool.shutdown();
361
- closeDatabase();
498
+ await subs.shutdown();
362
499
  await server.close();
363
500
  process.exit(0);
364
501
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { CacheInput, CacheOutput } from '../types.js';
2
- export declare function handleCache(input: CacheInput): CacheOutput;
2
+ import type { SmartRouter } from '../fetch/router.js';
3
+ export declare function handleCache(input: CacheInput, router?: SmartRouter): Promise<CacheOutput>;
3
4
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/tools/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CA+C1D"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/tools/cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAuG/F"}
@@ -1,8 +1,63 @@
1
1
  import { searchCacheFiltered, getCacheStats, clearCacheEntries } from '../cache/store.js';
2
+ import { detectChange } from '../cache/change-detector.js';
3
+ import { extractContent } from '../extraction/pipeline.js';
2
4
  import { createLogger } from '../logger.js';
3
5
  const log = createLogger('cache');
4
- export function handleCache(input) {
6
+ export async function handleCache(input, router) {
5
7
  try {
8
+ if (input.check_changes) {
9
+ log.info('Checking for content changes', {
10
+ query: input.query,
11
+ urlPattern: input.url_pattern,
12
+ since: input.since,
13
+ });
14
+ const entries = searchCacheFiltered({
15
+ query: input.query,
16
+ urlPattern: input.url_pattern,
17
+ since: input.since,
18
+ });
19
+ const changes = [];
20
+ for (const entry of entries) {
21
+ try {
22
+ if (!router) {
23
+ changes.push({
24
+ url: entry.url,
25
+ changed: false,
26
+ current_hash: entry.contentHash,
27
+ error: 'no router available for re-fetch',
28
+ });
29
+ continue;
30
+ }
31
+ const raw = await router.fetch(entry.url, { renderJs: 'auto' });
32
+ const extraction = await extractContent(raw.html, raw.finalUrl, {
33
+ contentType: raw.contentType,
34
+ });
35
+ const changeResult = detectChange(entry.url, extraction.markdown);
36
+ changes.push({
37
+ url: entry.url,
38
+ changed: changeResult.changed,
39
+ current_hash: entry.contentHash,
40
+ ...(changeResult.changed ? {
41
+ previous_hash: changeResult.previousHash,
42
+ diff_summary: changeResult.diffSummary,
43
+ } : {}),
44
+ });
45
+ }
46
+ catch (err) {
47
+ log.warn('change check failed for URL', {
48
+ url: entry.url,
49
+ error: err instanceof Error ? err.message : String(err),
50
+ });
51
+ changes.push({
52
+ url: entry.url,
53
+ changed: false,
54
+ current_hash: entry.contentHash,
55
+ error: err instanceof Error ? err.message : String(err),
56
+ });
57
+ }
58
+ }
59
+ return { changes };
60
+ }
6
61
  if (input.stats) {
7
62
  log.debug('Cache stats requested');
8
63
  return { stats: getCacheStats() };
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/tools/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAElC,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC;QACpC,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACvD,OAAO,EAAE,KAAK,EAAE,mEAAmE,EAAE,CAAC;YACxF,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBACjC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,iBAAiB,CAAC;gBAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,WAAW;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,WAAW;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,UAAU,EAAE,CAAC,CAAC,SAAS;aACxB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/tools/cache.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAoCtD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAgDtB"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqCtD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA8DtB"}
@@ -1,6 +1,7 @@
1
1
  import { extractContent } from '../extraction/pipeline.js';
2
2
  import { getCachedContent, cacheContent, isExpired } from '../cache/store.js';
3
3
  import { extractSection } from '../extraction/markdown.js';
4
+ import { detectChange } from '../cache/change-detector.js';
4
5
  import { createLogger } from '../logger.js';
5
6
  const log = createLogger('fetch');
6
7
  function formatCachedResponse(cached, input) {
@@ -30,7 +31,7 @@ function formatCachedResponse(cached, input) {
30
31
  export async function handleFetch(input, router) {
31
32
  try {
32
33
  const cached = getCachedContent(input.url);
33
- if (cached && !isExpired(cached)) {
34
+ if (cached && !isExpired(cached) && (!input.actions || input.actions.length === 0)) {
34
35
  log.info('Serving from cache', { url: input.url });
35
36
  return formatCachedResponse(cached, input);
36
37
  }
@@ -39,6 +40,7 @@ export async function handleFetch(input, router) {
39
40
  useAuth: input.use_auth ?? false,
40
41
  headers: input.headers,
41
42
  screenshot: input.screenshot,
43
+ actions: input.actions,
42
44
  });
43
45
  const extraction = await extractContent(raw.html, raw.finalUrl, {
44
46
  maxChars: input.max_chars,
@@ -47,6 +49,13 @@ export async function handleFetch(input, router) {
47
49
  contentType: raw.contentType,
48
50
  pdfBuffer: raw.rawBuffer,
49
51
  });
52
+ let changeResult;
53
+ try {
54
+ changeResult = detectChange(raw.finalUrl, extraction.markdown);
55
+ }
56
+ catch (err) {
57
+ log.warn('change detection failed', { url: raw.finalUrl, error: String(err) });
58
+ }
50
59
  cacheContent(raw, extraction);
51
60
  return {
52
61
  url: raw.finalUrl,
@@ -57,6 +66,12 @@ export async function handleFetch(input, router) {
57
66
  images: extraction.images,
58
67
  screenshot: raw.screenshot,
59
68
  cached: false,
69
+ action_results: raw.actionResults,
70
+ ...(changeResult?.changed ? {
71
+ changed: true,
72
+ previous_hash: changeResult.previousHash,
73
+ diff_summary: changeResult.diffSummary,
74
+ } : {}),
60
75
  };
61
76
  }
62
77
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/tools/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAElC,SAAS,oBAAoB,CAAC,MAAqB,EAAE,KAAiB;IACpE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,IAAI,cAAmC,CAAC;IAExC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5E,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1B,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACzD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ;QACR,QAAQ,EAAE;YACR,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;YACtC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E;QACD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;QACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;QACzC,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,MAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACnD,OAAO,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,MAAM;YACnC,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE;YAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,aAAa;YACjC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,IAAI,YAA2F,CAAC;QAChG,IAAI,CAAC;YACH,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAE9B,OAAO;YACL,GAAG,EAAE,GAAG,CAAC,QAAQ;YACjB,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,GAAG,CAAC,aAAa;YACjC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1B,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,YAAY,CAAC,YAAY;gBACxC,YAAY,EAAE,YAAY,CAAC,WAAW;aACvC,CAAC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC"}