@staticn0va/wigolo 1.0.1 → 1.1.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 (106) hide show
  1. package/dist/agent/executor.d.ts +21 -1
  2. package/dist/agent/executor.d.ts.map +1 -1
  3. package/dist/agent/executor.js +115 -1
  4. package/dist/agent/executor.js.map +1 -1
  5. package/dist/agent/pipeline.js +1 -1
  6. package/dist/agent/pipeline.js.map +1 -1
  7. package/dist/agent/planner.d.ts +4 -0
  8. package/dist/agent/planner.d.ts.map +1 -1
  9. package/dist/agent/planner.js +19 -3
  10. package/dist/agent/planner.js.map +1 -1
  11. package/dist/agent/relevance.d.ts +15 -0
  12. package/dist/agent/relevance.d.ts.map +1 -0
  13. package/dist/agent/relevance.js +62 -0
  14. package/dist/agent/relevance.js.map +1 -0
  15. package/dist/cache/store.d.ts +1 -0
  16. package/dist/cache/store.d.ts.map +1 -1
  17. package/dist/cache/store.js +20 -0
  18. package/dist/cache/store.js.map +1 -1
  19. package/dist/cli/daemon.d.ts.map +1 -1
  20. package/dist/cli/daemon.js +4 -0
  21. package/dist/cli/daemon.js.map +1 -1
  22. package/dist/fetch/playwright-tier.d.ts +19 -0
  23. package/dist/fetch/playwright-tier.d.ts.map +1 -0
  24. package/dist/fetch/playwright-tier.js +78 -0
  25. package/dist/fetch/playwright-tier.js.map +1 -0
  26. package/dist/fetch/router.d.ts +30 -3
  27. package/dist/fetch/router.d.ts.map +1 -1
  28. package/dist/fetch/router.js +107 -8
  29. package/dist/fetch/router.js.map +1 -1
  30. package/dist/instructions.d.ts +2 -2
  31. package/dist/instructions.js +2 -2
  32. package/dist/logger.d.ts +1 -1
  33. package/dist/logger.d.ts.map +1 -1
  34. package/dist/repl/commands/agent.d.ts.map +1 -1
  35. package/dist/repl/commands/agent.js +13 -1
  36. package/dist/repl/commands/agent.js.map +1 -1
  37. package/dist/repl/commands/extract.d.ts.map +1 -1
  38. package/dist/repl/commands/extract.js +9 -1
  39. package/dist/repl/commands/extract.js.map +1 -1
  40. package/dist/repl/commands/fetch.d.ts.map +1 -1
  41. package/dist/repl/commands/fetch.js +14 -1
  42. package/dist/repl/commands/fetch.js.map +1 -1
  43. package/dist/repl/commands/find-similar.d.ts.map +1 -1
  44. package/dist/repl/commands/find-similar.js +13 -1
  45. package/dist/repl/commands/find-similar.js.map +1 -1
  46. package/dist/repl/commands/research.d.ts.map +1 -1
  47. package/dist/repl/commands/research.js +14 -1
  48. package/dist/repl/commands/research.js.map +1 -1
  49. package/dist/repl/commands/search.d.ts.map +1 -1
  50. package/dist/repl/commands/search.js +11 -1
  51. package/dist/repl/commands/search.js.map +1 -1
  52. package/dist/search/answer-synthesis.d.ts +15 -1
  53. package/dist/search/answer-synthesis.d.ts.map +1 -1
  54. package/dist/search/answer-synthesis.js +65 -0
  55. package/dist/search/answer-synthesis.js.map +1 -1
  56. package/dist/search/find-similar.js +6 -1
  57. package/dist/search/find-similar.js.map +1 -1
  58. package/dist/search/language-filter.d.ts +29 -0
  59. package/dist/search/language-filter.d.ts.map +1 -0
  60. package/dist/search/language-filter.js +96 -0
  61. package/dist/search/language-filter.js.map +1 -0
  62. package/dist/search/multi-query.d.ts +1 -0
  63. package/dist/search/multi-query.d.ts.map +1 -1
  64. package/dist/search/multi-query.js +5 -0
  65. package/dist/search/multi-query.js.map +1 -1
  66. package/dist/server/tool-schemas.js +4 -4
  67. package/dist/server/tool-schemas.js.map +1 -1
  68. package/dist/server.d.ts.map +1 -1
  69. package/dist/server.js +58 -20
  70. package/dist/server.js.map +1 -1
  71. package/dist/tools/agent.d.ts +2 -2
  72. package/dist/tools/agent.d.ts.map +1 -1
  73. package/dist/tools/agent.js +26 -17
  74. package/dist/tools/agent.js.map +1 -1
  75. package/dist/tools/crawl.d.ts.map +1 -1
  76. package/dist/tools/crawl.js +16 -1
  77. package/dist/tools/crawl.js.map +1 -1
  78. package/dist/tools/extract.d.ts +2 -2
  79. package/dist/tools/extract.d.ts.map +1 -1
  80. package/dist/tools/extract.js +47 -26
  81. package/dist/tools/extract.js.map +1 -1
  82. package/dist/tools/fetch.d.ts +2 -2
  83. package/dist/tools/fetch.d.ts.map +1 -1
  84. package/dist/tools/fetch.js +35 -13
  85. package/dist/tools/fetch.js.map +1 -1
  86. package/dist/tools/find-similar.d.ts +2 -2
  87. package/dist/tools/find-similar.d.ts.map +1 -1
  88. package/dist/tools/find-similar.js +56 -15
  89. package/dist/tools/find-similar.js.map +1 -1
  90. package/dist/tools/research.d.ts +2 -2
  91. package/dist/tools/research.d.ts.map +1 -1
  92. package/dist/tools/research.js +24 -16
  93. package/dist/tools/research.js.map +1 -1
  94. package/dist/tools/search.d.ts +2 -2
  95. package/dist/tools/search.d.ts.map +1 -1
  96. package/dist/tools/search.js +161 -92
  97. package/dist/tools/search.js.map +1 -1
  98. package/dist/types.d.ts +18 -1
  99. package/dist/types.d.ts.map +1 -1
  100. package/dist/types.js +2 -1
  101. package/dist/types.js.map +1 -1
  102. package/dist/util/mode.d.ts +2 -2
  103. package/dist/util/mode.d.ts.map +1 -1
  104. package/dist/util/mode.js +23 -4
  105. package/dist/util/mode.js.map +1 -1
  106. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-tier.d.ts","sourceRoot":"","sources":["../../src/fetch/playwright-tier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAMzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,aAAa,CAAC,CAQtE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKpD;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC,CAsB/F;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIxD;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAWjI"}
@@ -0,0 +1,78 @@
1
+ import { chromium } from 'playwright';
2
+ import { existsSync } from 'node:fs';
3
+ import { createLogger } from '../logger.js';
4
+ const log = createLogger('playwright-tier');
5
+ export async function detectPlaywrightInstall() {
6
+ try {
7
+ const exec = chromium.executablePath();
8
+ if (exec && existsSync(exec))
9
+ return { installed: true };
10
+ return { installed: false, hint: 'npx playwright install chromium' };
11
+ }
12
+ catch {
13
+ return { installed: false, hint: 'npx playwright install chromium' };
14
+ }
15
+ }
16
+ export function shouldEscalate(body) {
17
+ if (!body)
18
+ return true;
19
+ if (body.length < 500)
20
+ return true;
21
+ if (/enable javascript/i.test(body))
22
+ return true;
23
+ return false;
24
+ }
25
+ let _browser = null;
26
+ let _ctx = null;
27
+ let _launching = null;
28
+ export async function getDaemonBrowser() {
29
+ if (_browser && _ctx)
30
+ return { browser: _browser, context: _ctx };
31
+ if (_launching)
32
+ return _launching;
33
+ _launching = (async () => {
34
+ try {
35
+ const status = await detectPlaywrightInstall();
36
+ if (!status.installed) {
37
+ const err = new Error('playwright_not_installed');
38
+ err.hint = status.hint;
39
+ throw err;
40
+ }
41
+ const browser = await chromium.launch({ headless: true });
42
+ const context = await browser.newContext();
43
+ _browser = browser;
44
+ _ctx = context;
45
+ log.info('Playwright daemon browser launched');
46
+ return { browser, context };
47
+ }
48
+ finally {
49
+ _launching = null;
50
+ }
51
+ })();
52
+ return _launching;
53
+ }
54
+ export async function closeDaemonBrowser() {
55
+ _launching = null;
56
+ if (_ctx) {
57
+ await _ctx.close();
58
+ _ctx = null;
59
+ }
60
+ if (_browser) {
61
+ await _browser.close();
62
+ _browser = null;
63
+ }
64
+ }
65
+ export async function fetchWithPlaywright(url, opts = {}) {
66
+ const { context } = await getDaemonBrowser();
67
+ const page = await context.newPage();
68
+ try {
69
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: opts.timeoutMs ?? 30000 });
70
+ const html = await page.content();
71
+ const text = await page.evaluate(() => document.body?.innerText ?? '');
72
+ return { html, text };
73
+ }
74
+ finally {
75
+ await page.close();
76
+ }
77
+ }
78
+ //# sourceMappingURL=playwright-tier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-tier.js","sourceRoot":"","sources":["../../src/fetch/playwright-tier.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { RawFetchResult, BrowserAction, Mode } from '../types.js';
1
+ import type { RawFetchResult, BrowserAction, Mode, StageError } from '../types.js';
2
2
  export interface RouterFetchOptions {
3
3
  renderJs?: 'auto' | 'always' | 'never';
4
4
  useAuth?: boolean;
@@ -32,15 +32,42 @@ export interface BrowserPoolInterface {
32
32
  cdpUrl?: string;
33
33
  }): Promise<RawFetchResult>;
34
34
  }
35
+ export type HttpFetcher = (url: string, options?: {
36
+ headers?: Record<string, string>;
37
+ timeoutMs?: number;
38
+ }) => Promise<{
39
+ url: string;
40
+ html: string;
41
+ text: string;
42
+ }>;
43
+ export type PlaywrightFetcher = (url: string, options?: {
44
+ timeoutMs?: number;
45
+ }) => Promise<{
46
+ html: string;
47
+ text: string;
48
+ }>;
49
+ export interface SmartRouterOptions {
50
+ httpClient?: HttpClient;
51
+ browserPool?: BrowserPoolInterface;
52
+ httpFetcher?: HttpFetcher;
53
+ playwrightFetcher?: PlaywrightFetcher;
54
+ }
35
55
  interface DomainStats {
36
56
  failureCount: number;
37
57
  preferPlaywright: boolean;
38
58
  }
39
59
  export declare class SmartRouter {
40
- private readonly httpClient;
41
- private readonly browserPool;
42
60
  private readonly domainMap;
61
+ private readonly httpClient?;
62
+ private readonly browserPool?;
63
+ private readonly httpFetcher;
64
+ private readonly playwrightFetcher;
43
65
  constructor(httpClient: HttpClient, browserPool: BrowserPoolInterface);
66
+ constructor(options: SmartRouterOptions);
67
+ private makeDefaultHttpFetcher;
68
+ fetch(url: string, options: RouterFetchOptions & {
69
+ mode: 'stealth';
70
+ }): Promise<RawFetchResult | StageError>;
44
71
  fetch(url: string, options?: RouterFetchOptions): Promise<RawFetchResult>;
45
72
  getDomainStats(domain: string): DomainStats | undefined;
46
73
  private ensureStats;
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/fetch/router.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACjE,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAChK,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AAED,UAAU,WAAW;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;gBAGzC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,oBAAoB;IAG9C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuFnF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIvD,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,gBAAgB;CAczB"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/fetch/router.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,49 @@ import { getConfig } from '../config.js';
2
2
  import { createLogger } from '../logger.js';
3
3
  import { contentAppearsEmpty } from './content-check.js';
4
4
  import { getAuthOptions } from './auth.js';
5
+ import { fetchWithPlaywright, shouldEscalate } from './playwright-tier.js';
5
6
  export class SmartRouter {
7
+ domainMap = new Map();
6
8
  httpClient;
7
9
  browserPool;
8
- domainMap = new Map();
9
- constructor(httpClient, browserPool) {
10
- this.httpClient = httpClient;
11
- this.browserPool = browserPool;
10
+ httpFetcher;
11
+ playwrightFetcher;
12
+ constructor(httpClientOrOptions, browserPool) {
13
+ if (browserPool !== undefined) {
14
+ this.httpClient = httpClientOrOptions;
15
+ this.browserPool = browserPool;
16
+ }
17
+ else if (httpClientOrOptions &&
18
+ typeof httpClientOrOptions === 'object' &&
19
+ ('httpClient' in httpClientOrOptions ||
20
+ 'browserPool' in httpClientOrOptions ||
21
+ 'httpFetcher' in httpClientOrOptions ||
22
+ 'playwrightFetcher' in httpClientOrOptions)) {
23
+ const opts = httpClientOrOptions;
24
+ if (!opts.httpFetcher && !opts.httpClient) {
25
+ throw new Error('SmartRouter: must provide either httpFetcher or httpClient in options');
26
+ }
27
+ this.httpClient = opts.httpClient;
28
+ this.browserPool = opts.browserPool;
29
+ this.httpFetcher = opts.httpFetcher ?? this.makeDefaultHttpFetcher();
30
+ this.playwrightFetcher = opts.playwrightFetcher ?? fetchWithPlaywright;
31
+ return;
32
+ }
33
+ else {
34
+ // Backwards-compat: single HttpClient positional (unusual but safe)
35
+ this.httpClient = httpClientOrOptions;
36
+ }
37
+ this.httpFetcher = this.makeDefaultHttpFetcher();
38
+ this.playwrightFetcher = fetchWithPlaywright;
39
+ }
40
+ makeDefaultHttpFetcher() {
41
+ return async (url, opts) => {
42
+ if (!this.httpClient) {
43
+ throw new Error('SmartRouter: httpClient not configured');
44
+ }
45
+ const r = await this.httpClient.fetch(url, opts);
46
+ return { url: r.url, html: r.html, text: '' };
47
+ };
12
48
  }
13
49
  async fetch(url, options = {}) {
14
50
  const { renderJs = 'auto', useAuth = false, headers, screenshot, actions, mode } = options;
@@ -16,15 +52,64 @@ export class SmartRouter {
16
52
  const logger = createLogger('fetch');
17
53
  const threshold = config.browserFallbackThreshold;
18
54
  const domain = new URL(url).hostname;
19
- // Fast mode: HTTP-only with tight timeout, never escalates to a browser.
20
- if (mode === 'fast') {
55
+ // Stealth mode: static fetch first, escalate to Playwright when content is thin.
56
+ if (mode === 'stealth') {
57
+ logger.debug('routing to stealth (static then escalate)', { url });
58
+ const staticResult = await this.httpFetcher(url, { headers });
59
+ this.ensureStats(domain);
60
+ if (!shouldEscalate(staticResult.text)) {
61
+ return {
62
+ url: staticResult.url,
63
+ finalUrl: staticResult.url,
64
+ html: staticResult.html,
65
+ contentType: 'text/html',
66
+ statusCode: 200,
67
+ method: 'http',
68
+ headers: {},
69
+ };
70
+ }
71
+ try {
72
+ const pw = await this.playwrightFetcher(url);
73
+ return {
74
+ url: staticResult.url,
75
+ finalUrl: staticResult.url,
76
+ html: pw.html,
77
+ contentType: 'text/html',
78
+ statusCode: 200,
79
+ method: 'playwright',
80
+ headers: {},
81
+ escalated: true,
82
+ };
83
+ }
84
+ catch (err) {
85
+ if (err instanceof Error && err.message === 'playwright_not_installed') {
86
+ const hint = err.hint ?? 'npx playwright install chromium';
87
+ return {
88
+ error: 'playwright_not_installed',
89
+ error_reason: 'Stealth mode requested but Playwright chromium is not installed',
90
+ stage: 'fetch',
91
+ hint,
92
+ };
93
+ }
94
+ return {
95
+ error: 'playwright_fetch_failed',
96
+ error_reason: err instanceof Error ? err.message : String(err),
97
+ stage: 'fetch',
98
+ hint: 'Stealth fetch failed; check network or retry',
99
+ };
100
+ }
101
+ }
102
+ // Cache mode: HTTP-only with tight timeout, never escalates to a browser.
103
+ if (mode === 'cache') {
21
104
  if (actions && actions.length > 0) {
22
- logger.warn('mode=fast ignores browser actions; switch to balanced/deep to execute them', {
105
+ logger.warn('mode=cache ignores browser actions; switch to default/stealth to execute them', {
23
106
  url,
24
107
  actionCount: actions.length,
25
108
  });
26
109
  }
27
- logger.debug('routing to http (fast)', { url });
110
+ logger.debug('routing to http (cache)', { url });
111
+ if (!this.httpClient)
112
+ throw new Error('SmartRouter: httpClient not configured');
28
113
  const result = await this.httpClient.fetch(url, {
29
114
  headers,
30
115
  timeoutMs: config.fastTimeoutMs,
@@ -36,18 +121,24 @@ export class SmartRouter {
36
121
  }
37
122
  // Actions always force Playwright --- actions need a live browser page
38
123
  if (actions && actions.length > 0) {
124
+ if (!this.browserPool)
125
+ throw new Error('SmartRouter: browserPool not configured');
39
126
  const authOptions = useAuth ? (await getAuthOptions() ?? {}) : {};
40
127
  logger.debug('routing to playwright', { url, reason: 'actions present' });
41
128
  return this.browserPool.fetchWithBrowser(url, { headers, screenshot, actions, ...authOptions });
42
129
  }
43
130
  // Always Playwright for auth or explicit override
44
131
  if (renderJs === 'always' || useAuth) {
132
+ if (!this.browserPool)
133
+ throw new Error('SmartRouter: browserPool not configured');
45
134
  const authOptions = useAuth ? (await getAuthOptions() ?? {}) : {};
46
135
  logger.debug('routing to playwright', { url, reason: useAuth ? 'auth' : 'render_js=always' });
47
136
  return this.browserPool.fetchWithBrowser(url, { headers, screenshot, ...authOptions });
48
137
  }
49
138
  // HTTP only, no fallback
50
139
  if (renderJs === 'never') {
140
+ if (!this.httpClient)
141
+ throw new Error('SmartRouter: httpClient not configured');
51
142
  logger.debug('routing to http (never)', { url });
52
143
  const result = await this.httpClient.fetch(url, { headers });
53
144
  this.ensureStats(domain);
@@ -56,14 +147,20 @@ export class SmartRouter {
56
147
  // auto: check if domain is already marked for Playwright
57
148
  const stats = this.ensureStats(domain);
58
149
  if (stats.preferPlaywright) {
150
+ if (!this.browserPool)
151
+ throw new Error('SmartRouter: browserPool not configured');
59
152
  logger.debug('routing to playwright (domain marked)', { url, domain });
60
153
  return this.browserPool.fetchWithBrowser(url, { headers, screenshot });
61
154
  }
62
155
  // Try HTTP first
63
156
  try {
157
+ if (!this.httpClient)
158
+ throw new Error('SmartRouter: httpClient not configured');
64
159
  const result = await this.httpClient.fetch(url, { headers });
65
160
  // Check for SPA shell / empty content
66
161
  if (contentAppearsEmpty(result.html)) {
162
+ if (!this.browserPool)
163
+ throw new Error('SmartRouter: browserPool not configured');
67
164
  logger.info('SPA shell detected, marking domain for playwright', { url, domain });
68
165
  stats.preferPlaywright = true;
69
166
  return this.browserPool.fetchWithBrowser(url, { headers, screenshot });
@@ -79,6 +176,8 @@ export class SmartRouter {
79
176
  error: err instanceof Error ? err.message : String(err),
80
177
  });
81
178
  if (stats.failureCount >= threshold) {
179
+ if (!this.browserPool)
180
+ throw new Error('SmartRouter: browserPool not configured');
82
181
  logger.info('failure threshold reached, marking domain for playwright', { url, domain, threshold });
83
182
  stats.preferPlaywright = true;
84
183
  return this.browserPool.fetchWithBrowser(url, { headers, screenshot });
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/fetch/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/fetch/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAyD3E,MAAM,OAAO,WAAW;IACL,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,UAAU,CAAc;IACxB,WAAW,CAAwB;IACnC,WAAW,CAAc;IACzB,iBAAiB,CAAoB;IAItD,YACE,mBAAoD,EACpD,WAAkC;QAElC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,mBAAiC,CAAC;YACpD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACjC,CAAC;aAAM,IACL,mBAAmB;YACnB,OAAO,mBAAmB,KAAK,QAAQ;YACvC,CAAC,YAAY,IAAI,mBAAmB;gBAClC,aAAa,IAAI,mBAAmB;gBACpC,aAAa,IAAI,mBAAmB;gBACpC,mBAAmB,IAAI,mBAAmB,CAAC,EAC7C,CAAC;YACD,MAAM,IAAI,GAAG,mBAAyC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACrE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,mBAAmB,CAAC;YACvE,OAAO;QACT,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,IAAI,CAAC,UAAU,GAAG,mBAAiC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,mBAAmB,CAAC;IAC/C,CAAC;IAEO,sBAAsB;QAC5B,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAChD,CAAC,CAAC;IACJ,CAAC;IAID,KAAK,CAAC,KAAK,CACT,GAAW,EACX,UAA8B,EAAE;QAEhC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAC3F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAErC,iFAAiF;QACjF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO;oBACL,GAAG,EAAE,YAAY,CAAC,GAAG;oBACrB,QAAQ,EAAE,YAAY,CAAC,GAAG;oBAC1B,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,WAAW,EAAE,WAAW;oBACxB,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAC7C,OAAO;oBACL,GAAG,EAAE,YAAY,CAAC,GAAG;oBACrB,QAAQ,EAAE,YAAY,CAAC,GAAG;oBAC1B,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,WAAW,EAAE,WAAW;oBACxB,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,YAAY;oBACpB,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,KAAK,0BAA0B,EAAE,CAAC;oBACvE,MAAM,IAAI,GAAI,GAAiC,CAAC,IAAI,IAAI,iCAAiC,CAAC;oBAC1F,OAAO;wBACL,KAAK,EAAE,0BAA0B;wBACjC,YAAY,EAAE,iEAAiE;wBAC/E,KAAK,EAAE,OAAO;wBACd,IAAI;qBACL,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,KAAK,EAAE,yBAAyB;oBAChC,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;oBAC9D,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,8CAA8C;iBACrD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,+EAA+E,EAAE;oBAC3F,GAAG;oBACH,WAAW,EAAE,OAAO,CAAC,MAAM;iBAC5B,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC9C,OAAO;gBACP,SAAS,EAAE,MAAM,CAAC,aAAa;aAChC,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1C,GAAG,CAAC,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,uEAAuE;QACvE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAClF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;QAClG,CAAC;QAED,kDAAkD;QAClD,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAClF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAC9F,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,yBAAyB;QACzB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAChF,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,yDAAyD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEvC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAClF,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE7D,sCAAsC;YACtC,IAAI,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAClF,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClF,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC/B,GAAG;gBACH,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAClF,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CACtB,MAAgD;QAEhD,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;CACF"}
@@ -16,8 +16,8 @@
16
16
  */
17
17
  export declare const WIGOLO_INSTRUCTIONS = "Wigolo is a local-first web access layer: search the open web, fetch pages, crawl sites, extract structured data, find related content, run multi-step research, and execute agent-driven data gathering. All results land in a local knowledge cache that persists across sessions.\n\n## Host-LLM synthesis pattern (read this first)\n\nWigolo has no internal LLM. It returns *structured evidence* so YOU (the host LLM) write the final answer. Fold structure into your reply:\n\n- `search` \u2192 evidence (title/url/section_heading/excerpt/score/citation_id/source_span) + citations. Quote [N] or {citation_id}.\n- `format: 'answer'|'stream_answer'` \u2192 LLM synthesis when sampling supported; else evidence fallback.\n- `max_tokens_out` caps total output (cl100k-base, ~5-15% drift on non-OpenAI). `include_full_markdown: true` restores full body. `citation_format`: `'numbered'`|`'json'`|`'anthropic_tags'`.\n- `research` \u2192 `brief` with `topics`, `highlights`, `key_findings`, `sections` when sampling unavailable. Use `sections.overview.cross_references` for corroborated findings, `sections.gaps` for coverage limits, `sections.comparison` for entity-vs-entity analysis. `query_type` indicates decomposition strategy used.\n- `find_similar` \u2192 `cold_start` string when local signals are weak. Pass to user verbatim.\n- `extract` `mode: \"structured\"` \u2192 tables + definitions + jsonld + chart_hints + key_value_pairs in one call.\n- `fetch` metadata \u2192 `og_type`, `canonical_url`, `og_image` when present.\n\n## When to use which tool\n\n- `search` -- you need information on a topic but do not have a URL yet. Pass a query string or an array of 3-5 semantically varied keyword forms for broader coverage.\n- `fetch` -- you already have a specific URL to read.\n- `crawl` -- you need multiple pages from the same site (docs, wikis, references).\n- `cache` -- you want to know if the content is already on disk from an earlier read.\n- `extract` -- you need specific data points (tables, metadata, schema-shaped fields) rather than a whole page as markdown.\n- `find_similar` -- you have a URL or concept and want related content from the cache or web. Useful for \"more like this\" discovery.\n- `research` -- you have a complex question that needs multi-step investigation: question decomposition, parallel search, source synthesis into a report. Set `depth` to control thoroughness.\n- `agent` -- you need to gather structured or unstructured data from multiple sources based on a natural-language prompt. Provides full step transparency.\n\n## Routing by intent\n\n| Intent | Tool | Key parameters |\n|--------|------|----------------|\n| Documentation lookup | `search` | `include_domains: [\"react.dev\", \"nextjs.org\"]` -- scope to the project's official site, do not rely on `category: \"docs\"` alone |\n| Error debugging | `search` | exact error string as query, `category: \"code\"` (no domain scoping -- errors appear everywhere) |\n| Library research | `crawl` | seed URL of docs site, `strategy: \"sitemap\"`, then `cache` for later queries |\n| Related content | `find_similar` | `url` of a known good page, or `concept` as free text |\n| Evidence excerpt | `search` | default output; cite [N] or {citation_id} from each evidence item |\n| Direct answer | `search` | `format: \"answer\"` if client supports sampling, else falls back to evidence |\n| Comprehensive research | `research` | `depth: \"comprehensive\"`, optional `include_domains` to scope |\n| Data gathering | `agent` | natural-language `prompt`, optional `schema` for structured output |\n| Structured extraction | `extract` | `mode: \"structured\"` (tables + dl + JSON-LD + chart hints + kv pairs), or `mode: \"schema\"` with a JSON Schema |\n| Site inventory | `crawl` | `strategy: \"map\"` for URL-only discovery, no content fetched |\n\n## Rapidly changing content\n\nFor news, prices, status pages, or release notes, bypass the cache with `force_refresh: true`:\n\n search({ query: \"...\", force_refresh: true })\n fetch({ url: \"...\", force_refresh: true })\n\nFor docs, tutorials, and reference pages, let the cache work -- much faster.\n\n## Check the cache before going to the network\n\nBefore every `search` or `fetch`, consider a `cache` call. Pages read this session or earlier return instantly with full markdown -- no network. `research` and `agent` check the cache internally.\n\n## Multi-query search strategy\n\nFor broad queries, pass an array of 3-5 semantically varied keyword forms rather than one natural-language question. Example: instead of \"how does React handle state management\", pass `[\"react state management\", \"useState useReducer\", \"react hooks state\", \"react context vs redux\"]`. Sub-queries are deduplicated automatically.\n\n## Pick the right strategy\n\n- For docs sites, prefer `crawl` with `strategy: \"sitemap\"` -- faster and more complete than BFS.\n- For URL discovery only, use `crawl` with `strategy: \"map\"` -- URLs only, no content. Follow with targeted `fetch` calls.\n- For structured data (prices, specs, table rows), use `extract` with `mode: \"schema\"` or `mode: \"tables\"`. Use `fetch` only when you want the whole page as markdown.\n- For multi-source synthesis, use `research` instead of chaining `search` + `fetch` manually.\n- For natural-language data gathering, use `agent` with optional `schema`.\n- `crawl` accepts regex `include_patterns` and `exclude_patterns` to stay inside a section of a large site.\n\n## Scope searches by domain\n\nFor library/framework/SDK queries, **always pass `include_domains`** with official sites. Unscoped queries return generic noise. `category: \"docs\"` alone returns generic portals -- pair with `include_domains` or omit. Skip domain scoping for error strings, broad exploration, and news.\n\n## Performance\n\n- `max_results: 3` for focused lookups; `5` default; `10+` only for broad research.\n- `max_tokens_out` caps total response size (cl100k-base BPE); prefer this over `max_chars` for budget-aware agents. When both are set, `max_tokens_out` wins.\n- `max_content_chars: 3000` remains a legitimate per-page budget \u2014 smart-truncates each result's markdown at a paragraph/heading boundary with a `[... content truncated]` marker.\n- `fetch` with `section: \"Heading Name\"` returns content under that heading -- cheaper than the whole page.\n- Repeated fetches of the same URL are free (local cache).\n- `research` with `depth: \"quick\"` (~15s) suits most factual questions; reserve `\"comprehensive\"` for deep investigation.\n- `agent` respects `max_pages` (default 10) and `max_time_ms` (default 60s).\n\n## Extras\n\n- Localhost URLs (`localhost:3000`, `127.0.0.1:8080`) work for local dev servers.\n- `use_auth: true` on `fetch`/`crawl` reuses browser session for logged-in pages.\n- `cache` supports full-text search syntax (`AND`, `OR`, `NOT`, `\"phrase\"`).\n- `research`/`agent` use MCP sampling when supported; fall back to structured data for host-LLM synthesis.";
18
18
  export declare const TOOL_DESCRIPTIONS: {
19
- readonly fetch: "Fetch a single URL and return clean markdown. Use when you have a specific URL to read. Automatically detects if JavaScript rendering is needed.\n\nKey parameters:\n- section: extract content under a specific heading (e.g., section: \"API Reference\") -- faster than reading the whole page\n- max_content_chars: smart-truncate markdown at a paragraph/heading boundary with a `[... content truncated]` marker (e.g., 3000 for compact context). Preferred over max_chars for AI agents.\n- max_tokens_out: token-budget cap on total output (cl100k-base BPE). Takes precedence over max_chars when both are set.\n- include_full_markdown: default false. Set true to include the full markdown body in addition to evidence excerpts.\n- citation_format: 'numbered' (default) | 'json' | 'anthropic_tags'.\n- use_auth: true to use stored browser session for authenticated/private pages\n- render_js: \"auto\" (default, detects JS need), \"always\" (force browser), \"never\" (HTTP only, fastest)\n- headers: custom HTTP headers if needed\n- force_refresh: true to bypass cache and fetch fresh content from the network\n- mode: 'fast' | 'balanced' (default) | 'deep'. fast=HTTP-only, accepts cache up to 24h stale. deep=full render + freshness.\n\nReturns title, markdown, links, images, metadata (og_image, og_type, canonical_url, keywords). Cached locally; repeat fetches are instant. Localhost URLs work.";
20
- readonly search: "Search the web and return scored evidence excerpts (title/url/section_heading/excerpt/score/citation_id/source_span) plus citations. Default shape is evidence-only — no full markdown body.\n\nKey parameters:\n- query: string or string[] array (3-5 keyword variants; deduplicated automatically)\n- include_domains/exclude_domains: scope to specific sites. ALWAYS scope library/framework queries.\n- category: \"general\" | \"news\" | \"code\" | \"docs\" | \"papers\" — coarse filter, pair with include_domains.\n- from_date/to_date: ISO YYYY-MM-DD for time-bounded queries\n- max_results: default 5; use 3 for focused, 10+ for research\n- format: omit for default evidence shape. 'answer'/'stream_answer' = sampling synthesis (falls back to evidence). Retired values 'full'/'context'/'highlights' reject with a migration error.\n- max_tokens_out: token-budget cap on total output (cl100k-base; wins over max_chars).\n- include_full_markdown: true to restore full markdown body alongside evidence (default false).\n- citation_format: 'numbered' (default) | 'json' | 'anthropic_tags'.\n- max_content_chars: smart-truncate per-page markdown at paragraph boundary (e.g., 3000)\n- force_refresh: true to bypass all caches\n- mode: 'fast' | 'balanced' (default) | 'deep'. fast=single-engine, no rerank, 24h-stale cache. deep=multi-query expansion + full-body top-K.\n\nQuote [N] or {citation_id} from the evidence list.";
19
+ readonly fetch: "Fetch a single URL and return clean markdown. Use when you have a specific URL to read. Automatically detects if JavaScript rendering is needed.\n\nKey parameters:\n- section: extract content under a specific heading (e.g., section: \"API Reference\") -- faster than reading the whole page\n- max_content_chars: smart-truncate markdown at a paragraph/heading boundary with a `[... content truncated]` marker (e.g., 3000 for compact context). Preferred over max_chars for AI agents.\n- max_tokens_out: token-budget cap on total output (cl100k-base BPE). Takes precedence over max_chars when both are set.\n- include_full_markdown: default false. Set true to include the full markdown body in addition to evidence excerpts.\n- citation_format: 'numbered' (default) | 'json' | 'anthropic_tags'.\n- use_auth: true to use stored browser session for authenticated/private pages\n- render_js: \"auto\" (default, detects JS need), \"always\" (force browser), \"never\" (HTTP only, fastest)\n- headers: custom HTTP headers if needed\n- force_refresh: true to bypass cache and fetch fresh content from the network\n- mode: 'cache' | 'default' (default) | 'stealth'. cache=HTTP-only, accepts stale cache up to 24h. stealth=full browser render + freshness.\n\nReturns title, markdown, links, images, metadata (og_image, og_type, canonical_url, keywords). Cached locally; repeat fetches are instant. Localhost URLs work.";
20
+ readonly search: "Search the web and return scored evidence excerpts (title/url/section_heading/excerpt/score/citation_id/source_span) plus citations. Default shape is evidence-only — no full markdown body.\n\nKey parameters:\n- query: string or string[] array (3-5 keyword variants; deduplicated automatically)\n- include_domains/exclude_domains: scope to specific sites. ALWAYS scope library/framework queries.\n- category: \"general\" | \"news\" | \"code\" | \"docs\" | \"papers\" — coarse filter, pair with include_domains.\n- from_date/to_date: ISO YYYY-MM-DD for time-bounded queries\n- max_results: default 5; use 3 for focused, 10+ for research\n- format: omit for default evidence shape. 'answer'/'stream_answer' = sampling synthesis (falls back to evidence). Retired values 'full'/'context'/'highlights' reject with a migration error.\n- max_tokens_out: token-budget cap on total output (cl100k-base; wins over max_chars).\n- include_full_markdown: true to restore full markdown body alongside evidence (default false).\n- citation_format: 'numbered' (default) | 'json' | 'anthropic_tags'.\n- max_content_chars: smart-truncate per-page markdown at paragraph boundary (e.g., 3000)\n- force_refresh: true to bypass all caches\n- mode: 'cache' | 'default' (default) | 'stealth'. cache=single-engine, no rerank, 24h-stale cache. stealth=multi-query expansion + full-body top-K.\n\nQuote [N] or {citation_id} from the evidence list.";
21
21
  readonly crawl: "Crawl a website starting from a URL and return content from multiple pages. Use for indexing documentation sites, wikis, or any multi-page resource.\n\nKey parameters:\n- strategy: \"bfs\" (breadth-first, default), \"dfs\" (depth-first), \"sitemap\" (use sitemap.xml -- fastest for doc sites), \"map\" (URL discovery only, no content -- fastest for scoping a site)\n- max_depth: how many links deep to follow (default 2)\n- max_pages: maximum pages to fetch (default 20)\n- include_patterns/exclude_patterns: regex filters on URLs\n- max_tokens_out: token-budget cap on total output (cl100k-base; wins over max_chars).\n- include_full_markdown: default false — pages return evidence excerpts; set true for full bodies.\n- citation_format: 'numbered' (default) | 'json' | 'anthropic_tags'.\n\nReturns an array of pages with title, evidence, and depth. Content is deduplicated across pages. All pages are cached for later cache queries.";
22
22
  readonly cache: "Search previously fetched content without hitting the network. Use before searching the web -- if relevant content was already fetched or crawled, this returns it instantly.\n\nKey parameters:\n- query: full-text search over cached markdown and titles (supports AND, OR, NOT, \"phrase match\")\n- url_pattern: glob filter on URLs (e.g., \"*example.com*\")\n- since: ISO date -- only results cached after this date\n- stats: true to get cache size, entry count, oldest/newest dates\n- clear: true to delete matching entries\n\nReturns matching cached pages with full markdown content. Cache persists across sessions locally.";
23
23
  readonly extract: "Extract structured data from a URL or raw HTML. Use when you need specific data points, tables, or metadata rather than full page markdown.\n\nKey parameters:\n- mode: \"selector\" (CSS selector -> text), \"tables\" (HTML tables only), \"metadata\" (title/author/date/description/og_* + JSON-LD), \"schema\" (JSON Schema -> heuristic field extraction), \"structured\" (ONE-SHOT: tables + <dl> definitions + JSON-LD + chart hints from SVG/figure + microdata/data-attr/grid key-value pairs)\n- css_selector: required for mode=\"selector\" -- any valid CSS selector\n- schema: for mode=\"schema\", a JSON Schema object describing the fields to extract\n- multiple: true to return array of all matches (mode=\"selector\" only)\n\nPrefer mode=\"structured\" over chaining multiple extract calls — it returns every structured pattern on the page in one response:\n { tables, definitions, jsonld, chart_hints, key_value_pairs }\n\nchart_hints surfaces SVG titles, aria-labels, and figcaptions — host LLMs use these to describe data visualizations even when the underlying data is rendered by JavaScript.\n\nFor mode=\"tables\", returns array of table objects with headers and row data. For mode=\"schema\", pass { price: \"string\", name: \"string\" } and get structured fields extracted from the page.";
@@ -113,7 +113,7 @@ Key parameters:
113
113
  - render_js: "auto" (default, detects JS need), "always" (force browser), "never" (HTTP only, fastest)
114
114
  - headers: custom HTTP headers if needed
115
115
  - force_refresh: true to bypass cache and fetch fresh content from the network
116
- - mode: 'fast' | 'balanced' (default) | 'deep'. fast=HTTP-only, accepts cache up to 24h stale. deep=full render + freshness.
116
+ - mode: 'cache' | 'default' (default) | 'stealth'. cache=HTTP-only, accepts stale cache up to 24h. stealth=full browser render + freshness.
117
117
 
118
118
  Returns title, markdown, links, images, metadata (og_image, og_type, canonical_url, keywords). Cached locally; repeat fetches are instant. Localhost URLs work.`,
119
119
  search: `Search the web and return scored evidence excerpts (title/url/section_heading/excerpt/score/citation_id/source_span) plus citations. Default shape is evidence-only — no full markdown body.
@@ -130,7 +130,7 @@ Key parameters:
130
130
  - citation_format: 'numbered' (default) | 'json' | 'anthropic_tags'.
131
131
  - max_content_chars: smart-truncate per-page markdown at paragraph boundary (e.g., 3000)
132
132
  - force_refresh: true to bypass all caches
133
- - mode: 'fast' | 'balanced' (default) | 'deep'. fast=single-engine, no rerank, 24h-stale cache. deep=multi-query expansion + full-body top-K.
133
+ - mode: 'cache' | 'default' (default) | 'stealth'. cache=single-engine, no rerank, 24h-stale cache. stealth=multi-query expansion + full-body top-K.
134
134
 
135
135
  Quote [N] or {citation_id} from the evidence list.`,
136
136
  crawl: `Crawl a website starting from a URL and return content from multiple pages. Use for indexing documentation sites, wikis, or any multi-page resource.
package/dist/logger.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- type Module = 'fetch' | 'search' | 'crawl' | 'cache' | 'extract' | 'searxng' | 'server' | 'cli' | 'jsonld' | 'repl' | 'embedding' | 'research' | 'agent' | 'structured-data' | 'reranker';
1
+ type Module = 'fetch' | 'search' | 'crawl' | 'cache' | 'extract' | 'searxng' | 'server' | 'cli' | 'jsonld' | 'repl' | 'embedding' | 'research' | 'agent' | 'structured-data' | 'reranker' | 'mode' | 'language-filter' | 'playwright-tier';
2
2
  export interface Logger {
3
3
  debug(msg: string, data?: Record<string, unknown>): void;
4
4
  info(msg: string, data?: Record<string, unknown>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,KAAK,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAS1L,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1D;AA+CD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBnD"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,KAAK,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,iBAAiB,GAAG,UAAU,GAAG,MAAM,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAS3O,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1D;AA+CD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CA6CzF"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAyDzF"}
@@ -29,7 +29,19 @@ export async function executeAgent(args, deps) {
29
29
  input.max_time_ms = parseInt(args.flags['max-time-ms'], 10);
30
30
  }
31
31
  log.debug('executing agent command', { prompt, flags: args.flags });
32
- return await handleAgent(input, deps.engines, deps.router, deps.backendStatus);
32
+ const r = await handleAgent(input, deps.engines, deps.router, deps.backendStatus);
33
+ if (!r.ok) {
34
+ return {
35
+ result: '',
36
+ sources: [],
37
+ pages_fetched: 0,
38
+ steps: [],
39
+ total_time_ms: 0,
40
+ sampling_supported: false,
41
+ error: r.error_reason,
42
+ };
43
+ }
44
+ return r.data;
33
45
  }
34
46
  catch (err) {
35
47
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/repl/commands/agent.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,IAAc;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,EAAE;gBACX,aAAa,EAAE,CAAC;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,CAAC;gBAChB,kBAAkB,EAAE,KAAK;gBACzB,KAAK,EAAE,sEAAsE;aAC9E,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAe,EAAE,MAAM,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO;YACL,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,CAAC;YAChB,KAAK,EAAE,EAAE;YACT,aAAa,EAAE,CAAC;YAChB,kBAAkB,EAAE,KAAK;YACzB,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/repl/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAkC7F"}
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CA0C7F"}
@@ -22,7 +22,15 @@ export async function executeExtract(args, deps) {
22
22
  input.multiple = true;
23
23
  }
24
24
  log.debug('executing extract command', { url, flags: args.flags });
25
- return await handleExtract(input, deps.router);
25
+ const r = await handleExtract(input, deps.router);
26
+ if (!r.ok) {
27
+ return {
28
+ data: {},
29
+ mode: input.mode ?? 'metadata',
30
+ error: r.error_reason,
31
+ };
32
+ }
33
+ return r.data;
26
34
  }
27
35
  catch (err) {
28
36
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/repl/commands/extract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAc;IACnE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,gFAAgF;aACxF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAiB,EAAE,GAAG,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAA4B,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,OAAO,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,EAAE;YACR,IAAI,EAAG,IAAI,CAAC,KAAK,CAAC,IAA8B,IAAI,UAAU;YAC9D,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/repl/commands/extract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAc;IACnE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,gFAAgF;aACxF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAiB,EAAE,GAAG,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAA4B,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,UAAU;gBAC9B,KAAK,EAAE,CAAC,CAAC,YAAY;aACtB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,EAAE;YACR,IAAI,EAAG,IAAI,CAAC,KAAK,CAAC,IAA8B,IAAI,UAAU;YAC9D,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAkDzF"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CA+DzF"}
@@ -33,7 +33,20 @@ export async function executeFetch(args, deps) {
33
33
  input.screenshot = true;
34
34
  }
35
35
  log.debug('executing fetch command', { url, flags: args.flags });
36
- return await handleFetch(input, deps.router);
36
+ const r = await handleFetch(input, deps.router);
37
+ if (!r.ok) {
38
+ return {
39
+ url,
40
+ title: '',
41
+ markdown: '',
42
+ metadata: {},
43
+ links: [],
44
+ images: [],
45
+ cached: false,
46
+ error: r.error_reason,
47
+ };
48
+ }
49
+ return r.data;
37
50
  }
38
51
  catch (err) {
39
52
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/repl/commands/fetch.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,IAAc;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,0CAA0C;aAClD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAe,EAAE,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC9B,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YACrC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;YAC7B,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;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/repl/commands/fetch.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,IAAc;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,0CAA0C;aAClD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAe,EAAE,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC9B,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YACrC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO;gBACL,GAAG;gBACH,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,CAAC,CAAC,YAAY;aACtB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;YAC7B,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;SACX,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"find-similar.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/find-similar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,iBAAiB,CAAC,CA2D5B"}
1
+ {"version":3,"file":"find-similar.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/find-similar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,iBAAiB,CAAC,CAuE5B"}
@@ -42,7 +42,19 @@ export async function executeFindSimilar(args, deps) {
42
42
  input.include_web = false;
43
43
  }
44
44
  log.debug('executing find-similar command', { target, flags: args.flags });
45
- return await handleFindSimilar(input, deps.engines, deps.router, deps.backendStatus);
45
+ const r = await handleFindSimilar(input, deps.engines, deps.router, deps.backendStatus);
46
+ if (!r.ok) {
47
+ return {
48
+ results: [],
49
+ method: 'fts5',
50
+ cache_hits: 0,
51
+ search_hits: 0,
52
+ embedding_available: false,
53
+ total_time_ms: 0,
54
+ error: r.error_reason,
55
+ };
56
+ }
57
+ return r.data;
46
58
  }
47
59
  catch (err) {
48
60
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"find-similar.js","sourceRoot":"","sources":["../../../src/repl/commands/find-similar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-similar.js","sourceRoot":"","sources":["../../../src/repl/commands/find-similar.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/research.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CA+C/F"}
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../../src/repl/commands/research.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CA4D/F"}