@staticn0va/wigolo 0.6.6 → 1.0.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 (224) hide show
  1. package/dist/cache/store.d.ts +9 -1
  2. package/dist/cache/store.d.ts.map +1 -1
  3. package/dist/cache/store.js +30 -4
  4. package/dist/cache/store.js.map +1 -1
  5. package/dist/cli/doctor.d.ts.map +1 -1
  6. package/dist/cli/doctor.js +56 -2
  7. package/dist/cli/doctor.js.map +1 -1
  8. package/dist/cli/status.js +1 -1
  9. package/dist/cli/status.js.map +1 -1
  10. package/dist/cli/tui/hooks/useInstall.js +1 -1
  11. package/dist/cli/tui/hooks/useInstall.js.map +1 -1
  12. package/dist/cli/tui/hooks/useVerify.js +1 -1
  13. package/dist/cli/tui/hooks/useVerify.js.map +1 -1
  14. package/dist/cli/tui/status-format.d.ts +1 -1
  15. package/dist/cli/tui/status-format.d.ts.map +1 -1
  16. package/dist/cli/tui/status-format.js +1 -1
  17. package/dist/cli/tui/status-format.js.map +1 -1
  18. package/dist/cli/tui/status-python.d.ts +1 -1
  19. package/dist/cli/tui/status-python.d.ts.map +1 -1
  20. package/dist/cli/tui/status-python.js +17 -1
  21. package/dist/cli/tui/status-python.js.map +1 -1
  22. package/dist/cli/tui/verify-suggestions.d.ts +1 -1
  23. package/dist/cli/tui/verify-suggestions.d.ts.map +1 -1
  24. package/dist/cli/tui/verify-suggestions.js +3 -3
  25. package/dist/cli/tui/verify-suggestions.js.map +1 -1
  26. package/dist/cli/tui/verify.d.ts +2 -2
  27. package/dist/cli/tui/verify.d.ts.map +1 -1
  28. package/dist/cli/tui/verify.js +32 -6
  29. package/dist/cli/tui/verify.js.map +1 -1
  30. package/dist/cli/warmup.d.ts.map +1 -1
  31. package/dist/cli/warmup.js +16 -12
  32. package/dist/cli/warmup.js.map +1 -1
  33. package/dist/config.d.ts +6 -1
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +15 -2
  36. package/dist/config.js.map +1 -1
  37. package/dist/crawl/dedup.d.ts +1 -0
  38. package/dist/crawl/dedup.d.ts.map +1 -1
  39. package/dist/crawl/dedup.js +47 -1
  40. package/dist/crawl/dedup.js.map +1 -1
  41. package/dist/extraction/boilerplate.d.ts +15 -0
  42. package/dist/extraction/boilerplate.d.ts.map +1 -0
  43. package/dist/extraction/boilerplate.js +49 -0
  44. package/dist/extraction/boilerplate.js.map +1 -0
  45. package/dist/extraction/defuddle.d.ts.map +1 -1
  46. package/dist/extraction/defuddle.js +7 -3
  47. package/dist/extraction/defuddle.js.map +1 -1
  48. package/dist/extraction/jsonld.js +1 -1
  49. package/dist/extraction/jsonld.js.map +1 -1
  50. package/dist/extraction/lang-hints.d.ts +2 -0
  51. package/dist/extraction/lang-hints.d.ts.map +1 -0
  52. package/dist/extraction/lang-hints.js +28 -0
  53. package/dist/extraction/lang-hints.js.map +1 -0
  54. package/dist/extraction/llm/anthropic.d.ts +3 -0
  55. package/dist/extraction/llm/anthropic.d.ts.map +1 -0
  56. package/dist/extraction/llm/anthropic.js +33 -0
  57. package/dist/extraction/llm/anthropic.js.map +1 -0
  58. package/dist/extraction/llm/cache.d.ts +5 -0
  59. package/dist/extraction/llm/cache.d.ts.map +1 -0
  60. package/dist/extraction/llm/cache.js +35 -0
  61. package/dist/extraction/llm/cache.js.map +1 -0
  62. package/dist/extraction/llm/gemini.d.ts +3 -0
  63. package/dist/extraction/llm/gemini.d.ts.map +1 -0
  64. package/dist/extraction/llm/gemini.js +35 -0
  65. package/dist/extraction/llm/gemini.js.map +1 -0
  66. package/dist/extraction/llm/groq.d.ts +3 -0
  67. package/dist/extraction/llm/groq.d.ts.map +1 -0
  68. package/dist/extraction/llm/groq.js +63 -0
  69. package/dist/extraction/llm/groq.js.map +1 -0
  70. package/dist/extraction/llm/hash.d.ts +3 -0
  71. package/dist/extraction/llm/hash.d.ts.map +1 -0
  72. package/dist/extraction/llm/hash.js +22 -0
  73. package/dist/extraction/llm/hash.js.map +1 -0
  74. package/dist/extraction/llm/openai.d.ts +3 -0
  75. package/dist/extraction/llm/openai.d.ts.map +1 -0
  76. package/dist/extraction/llm/openai.js +38 -0
  77. package/dist/extraction/llm/openai.js.map +1 -0
  78. package/dist/extraction/llm/select.d.ts +5 -0
  79. package/dist/extraction/llm/select.d.ts.map +1 -0
  80. package/dist/extraction/llm/select.js +27 -0
  81. package/dist/extraction/llm/select.js.map +1 -0
  82. package/dist/extraction/llm/types.d.ts +24 -0
  83. package/dist/extraction/llm/types.d.ts.map +1 -0
  84. package/dist/extraction/llm/types.js +2 -0
  85. package/dist/extraction/llm/types.js.map +1 -0
  86. package/dist/extraction/llm/validate.d.ts +6 -0
  87. package/dist/extraction/llm/validate.d.ts.map +1 -0
  88. package/dist/extraction/llm/validate.js +63 -0
  89. package/dist/extraction/llm/validate.js.map +1 -0
  90. package/dist/extraction/llm-fallback.d.ts +17 -0
  91. package/dist/extraction/llm-fallback.d.ts.map +1 -0
  92. package/dist/extraction/llm-fallback.js +129 -0
  93. package/dist/extraction/llm-fallback.js.map +1 -0
  94. package/dist/extraction/markdown.d.ts +9 -0
  95. package/dist/extraction/markdown.d.ts.map +1 -1
  96. package/dist/extraction/markdown.js +52 -3
  97. package/dist/extraction/markdown.js.map +1 -1
  98. package/dist/extraction/pipeline.d.ts.map +1 -1
  99. package/dist/extraction/pipeline.js +17 -5
  100. package/dist/extraction/pipeline.js.map +1 -1
  101. package/dist/extraction/readability.d.ts.map +1 -1
  102. package/dist/extraction/readability.js +2 -3
  103. package/dist/extraction/readability.js.map +1 -1
  104. package/dist/extraction/schema.d.ts +12 -0
  105. package/dist/extraction/schema.d.ts.map +1 -1
  106. package/dist/extraction/schema.js +81 -11
  107. package/dist/extraction/schema.js.map +1 -1
  108. package/dist/extraction/site-extractors/docs-generic.d.ts.map +1 -1
  109. package/dist/extraction/site-extractors/docs-generic.js +2 -3
  110. package/dist/extraction/site-extractors/docs-generic.js.map +1 -1
  111. package/dist/extraction/site-extractors/github.d.ts.map +1 -1
  112. package/dist/extraction/site-extractors/github.js +4 -5
  113. package/dist/extraction/site-extractors/github.js.map +1 -1
  114. package/dist/extraction/site-extractors/mdn.d.ts.map +1 -1
  115. package/dist/extraction/site-extractors/mdn.js +2 -3
  116. package/dist/extraction/site-extractors/mdn.js.map +1 -1
  117. package/dist/extraction/site-extractors/stackoverflow.d.ts.map +1 -1
  118. package/dist/extraction/site-extractors/stackoverflow.js +3 -4
  119. package/dist/extraction/site-extractors/stackoverflow.js.map +1 -1
  120. package/dist/extraction/structured-data.d.ts +4 -0
  121. package/dist/extraction/structured-data.d.ts.map +1 -0
  122. package/dist/extraction/structured-data.js +203 -0
  123. package/dist/extraction/structured-data.js.map +1 -0
  124. package/dist/fetch/router.d.ts +2 -1
  125. package/dist/fetch/router.d.ts.map +1 -1
  126. package/dist/fetch/router.js +19 -1
  127. package/dist/fetch/router.js.map +1 -1
  128. package/dist/instructions.d.ts +7 -7
  129. package/dist/instructions.d.ts.map +1 -1
  130. package/dist/instructions.js +43 -36
  131. package/dist/instructions.js.map +1 -1
  132. package/dist/logger.d.ts +1 -1
  133. package/dist/logger.d.ts.map +1 -1
  134. package/dist/research/brief.js +1 -1
  135. package/dist/research/brief.js.map +1 -1
  136. package/dist/search/evidence.d.ts +25 -0
  137. package/dist/search/evidence.d.ts.map +1 -0
  138. package/dist/search/evidence.js +260 -0
  139. package/dist/search/evidence.js.map +1 -0
  140. package/dist/search/highlights.d.ts +11 -2
  141. package/dist/search/highlights.d.ts.map +1 -1
  142. package/dist/search/highlights.js +131 -48
  143. package/dist/search/highlights.js.map +1 -1
  144. package/dist/search/multi-query.d.ts +1 -0
  145. package/dist/search/multi-query.d.ts.map +1 -1
  146. package/dist/search/multi-query.js +13 -0
  147. package/dist/search/multi-query.js.map +1 -1
  148. package/dist/search/rerank.d.ts +3 -2
  149. package/dist/search/rerank.d.ts.map +1 -1
  150. package/dist/search/rerank.js +16 -44
  151. package/dist/search/rerank.js.map +1 -1
  152. package/dist/search/reranker/download.d.ts +9 -0
  153. package/dist/search/reranker/download.d.ts.map +1 -0
  154. package/dist/search/reranker/download.js +77 -0
  155. package/dist/search/reranker/download.js.map +1 -0
  156. package/dist/search/reranker/models.d.ts +14 -0
  157. package/dist/search/reranker/models.d.ts.map +1 -0
  158. package/dist/search/reranker/models.js +37 -0
  159. package/dist/search/reranker/models.js.map +1 -0
  160. package/dist/search/reranker/onnx.d.ts +13 -0
  161. package/dist/search/reranker/onnx.d.ts.map +1 -0
  162. package/dist/search/reranker/onnx.js +70 -0
  163. package/dist/search/reranker/onnx.js.map +1 -0
  164. package/dist/search/reranker/recency-boost.d.ts +3 -0
  165. package/dist/search/reranker/recency-boost.d.ts.map +1 -0
  166. package/dist/search/reranker/recency-boost.js +12 -0
  167. package/dist/search/reranker/recency-boost.js.map +1 -0
  168. package/dist/search/reranker/recency.d.ts +3 -0
  169. package/dist/search/reranker/recency.d.ts.map +1 -0
  170. package/dist/search/reranker/recency.js +26 -0
  171. package/dist/search/reranker/recency.js.map +1 -0
  172. package/dist/search/reranker/tokenizer.d.ts +30 -0
  173. package/dist/search/reranker/tokenizer.d.ts.map +1 -0
  174. package/dist/search/reranker/tokenizer.js +49 -0
  175. package/dist/search/reranker/tokenizer.js.map +1 -0
  176. package/dist/search/tokens.d.ts +3 -0
  177. package/dist/search/tokens.d.ts.map +1 -0
  178. package/dist/search/tokens.js +38 -0
  179. package/dist/search/tokens.js.map +1 -0
  180. package/dist/search/truncate.d.ts +4 -0
  181. package/dist/search/truncate.d.ts.map +1 -1
  182. package/dist/search/truncate.js +13 -0
  183. package/dist/search/truncate.js.map +1 -1
  184. package/dist/server/tool-schemas.d.ts +503 -0
  185. package/dist/server/tool-schemas.d.ts.map +1 -0
  186. package/dist/server/tool-schemas.js +425 -0
  187. package/dist/server/tool-schemas.js.map +1 -0
  188. package/dist/server.d.ts.map +1 -1
  189. package/dist/server.js +1 -326
  190. package/dist/server.js.map +1 -1
  191. package/dist/tools/agent.d.ts.map +1 -1
  192. package/dist/tools/agent.js +36 -0
  193. package/dist/tools/agent.js.map +1 -1
  194. package/dist/tools/crawl.d.ts.map +1 -1
  195. package/dist/tools/crawl.js +37 -2
  196. package/dist/tools/crawl.js.map +1 -1
  197. package/dist/tools/extract.d.ts.map +1 -1
  198. package/dist/tools/extract.js +19 -3
  199. package/dist/tools/extract.js.map +1 -1
  200. package/dist/tools/fetch.d.ts.map +1 -1
  201. package/dist/tools/fetch.js +44 -7
  202. package/dist/tools/fetch.js.map +1 -1
  203. package/dist/tools/find-similar.d.ts.map +1 -1
  204. package/dist/tools/find-similar.js +32 -1
  205. package/dist/tools/find-similar.js.map +1 -1
  206. package/dist/tools/research.d.ts.map +1 -1
  207. package/dist/tools/research.js +34 -1
  208. package/dist/tools/research.js.map +1 -1
  209. package/dist/tools/search.d.ts.map +1 -1
  210. package/dist/tools/search.js +97 -53
  211. package/dist/tools/search.js.map +1 -1
  212. package/dist/types.d.ts +65 -1
  213. package/dist/types.d.ts.map +1 -1
  214. package/dist/types.js +1 -1
  215. package/dist/types.js.map +1 -1
  216. package/dist/util/mode.d.ts +4 -0
  217. package/dist/util/mode.d.ts.map +1 -0
  218. package/dist/util/mode.js +13 -0
  219. package/dist/util/mode.js.map +1 -0
  220. package/package.json +9 -1
  221. package/dist/search/flashrank.d.ts +0 -12
  222. package/dist/search/flashrank.d.ts.map +0 -1
  223. package/dist/search/flashrank.js +0 -64
  224. package/dist/search/flashrank.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.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;AA2CtD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAiFtB"}
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;AA2EtD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA+FtB"}
@@ -1,11 +1,33 @@
1
1
  import { extractContent } from '../extraction/pipeline.js';
2
- import { getCachedContent, cacheContent, isExpired } from '../cache/store.js';
2
+ import { getCachedContent, cacheContent, isCacheUsable } from '../cache/store.js';
3
+ import { getConfig } from '../config.js';
3
4
  import { extractSection } from '../extraction/markdown.js';
4
5
  import { detectChange } from '../cache/change-detector.js';
5
6
  import { getEmbeddingService } from '../embedding/embed.js';
6
- import { truncateSmartly } from '../search/truncate.js';
7
+ import { truncateSmartly, applyOutputBudget } from '../search/truncate.js';
8
+ import { buildEvidenceFromMarkdown } from '../search/evidence.js';
9
+ import { resolveMode } from '../util/mode.js';
7
10
  import { createLogger } from '../logger.js';
8
11
  const log = createLogger('fetch');
12
+ const DEFAULT_MAX_TOKENS_OUT = 4000;
13
+ async function attachEvidence(output, input, markdown) {
14
+ if (!markdown)
15
+ return;
16
+ const includeFull = input.include_full_markdown ?? false;
17
+ const maxTokensOut = input.max_tokens_out ?? DEFAULT_MAX_TOKENS_OUT;
18
+ const evidence = await buildEvidenceFromMarkdown(output.title || output.url, output.title, output.url, markdown, { maxTokensOut, maxItems: 1 });
19
+ if (evidence.length > 0)
20
+ output.evidence = evidence;
21
+ if (!includeFull) {
22
+ output.markdown = '';
23
+ }
24
+ else if (output.markdown) {
25
+ output.markdown = applyOutputBudget(output.markdown, {
26
+ maxTokensOut: input.max_tokens_out,
27
+ maxChars: input.max_chars,
28
+ });
29
+ }
30
+ }
9
31
  function formatCachedResponse(cached, input) {
10
32
  let markdown = cached.markdown;
11
33
  let sectionMatched;
@@ -31,23 +53,35 @@ function formatCachedResponse(cached, input) {
31
53
  links: JSON.parse(cached.links || '[]'),
32
54
  images: JSON.parse(cached.images || '[]'),
33
55
  cached: true,
56
+ cached_at: cached.fetchedAt,
34
57
  };
35
58
  }
36
59
  export async function handleFetch(input, router) {
60
+ const mode = resolveMode(input.mode);
37
61
  try {
38
62
  if (!input.force_refresh) {
39
63
  const cached = getCachedContent(input.url);
40
- if (cached && !isExpired(cached) && (!input.actions || input.actions.length === 0)) {
41
- log.info('Serving from cache', { url: input.url });
42
- return formatCachedResponse(cached, input);
64
+ if (cached && (!input.actions || input.actions.length === 0)) {
65
+ const staleMaxSeconds = mode === 'fast' ? getConfig().fastStaleMaxHours * 3600 : 0;
66
+ const { usable, stale } = isCacheUsable(cached, { staleMaxSeconds });
67
+ if (usable) {
68
+ log.info('Serving from cache', { url: input.url, stale });
69
+ const out = formatCachedResponse(cached, input);
70
+ if (stale)
71
+ out.stale = true;
72
+ const fullMarkdown = out.markdown;
73
+ await attachEvidence(out, input, fullMarkdown);
74
+ return out;
75
+ }
43
76
  }
44
77
  }
45
78
  const raw = await router.fetch(input.url, {
46
- renderJs: input.render_js ?? 'auto',
79
+ renderJs: mode === 'fast' ? 'never' : (input.render_js ?? 'auto'),
47
80
  useAuth: input.use_auth ?? false,
48
81
  headers: input.headers,
49
82
  screenshot: input.screenshot,
50
83
  actions: input.actions,
84
+ mode,
51
85
  });
52
86
  const extraction = await extractContent(raw.html, raw.finalUrl, {
53
87
  maxChars: input.max_chars,
@@ -81,7 +115,7 @@ export async function handleFetch(input, router) {
81
115
  const finalMarkdown = input.max_content_chars !== undefined
82
116
  ? truncateSmartly(extraction.markdown, input.max_content_chars)
83
117
  : extraction.markdown;
84
- return {
118
+ const out = {
85
119
  url: raw.finalUrl,
86
120
  title: extraction.title,
87
121
  markdown: finalMarkdown,
@@ -91,12 +125,15 @@ export async function handleFetch(input, router) {
91
125
  screenshot: raw.screenshot,
92
126
  cached: false,
93
127
  action_results: raw.actionResults,
128
+ ...(raw.jsRequired ? { js_required: true } : {}),
94
129
  ...(changeResult?.changed ? {
95
130
  changed: true,
96
131
  previous_hash: changeResult.previousHash,
97
132
  diff_summary: changeResult.diffSummary,
98
133
  } : {}),
99
134
  };
135
+ await attachEvidence(out, input, finalMarkdown);
136
+ return out;
100
137
  }
101
138
  catch (err) {
102
139
  log.error('Fetch failed', { url: input.url, error: String(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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"find-similar.d.ts","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAQjE,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA6C5B"}
1
+ {"version":3,"file":"find-similar.d.ts","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EAEb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAcjE,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA+C5B"}
@@ -1,7 +1,9 @@
1
1
  import { findSimilar } from '../search/find-similar.js';
2
+ import { buildEvidenceFromMarkdown, applyTokenBudget, applyAggregateMarkdownBudget, } from '../search/evidence.js';
2
3
  import { createLogger } from '../logger.js';
3
4
  const log = createLogger('search');
4
5
  const MAX_RESULTS_CAP = 50;
6
+ const DEFAULT_MAX_TOKENS_OUT = 4000;
5
7
  export async function handleFindSimilar(input, engines, router, backendStatus) {
6
8
  try {
7
9
  const url = input.url?.trim();
@@ -30,7 +32,9 @@ export async function handleFindSimilar(input, engines, router, backendStatus) {
30
32
  includeCache: sanitizedInput.include_cache,
31
33
  includeWeb: sanitizedInput.include_web,
32
34
  });
33
- return await findSimilar(sanitizedInput, engines, router, backendStatus);
35
+ const out = await findSimilar(sanitizedInput, engines, router, backendStatus);
36
+ await attachEvidence(out, input);
37
+ return out;
34
38
  }
35
39
  catch (err) {
36
40
  log.error('handleFindSimilar failed', { error: String(err) });
@@ -45,4 +49,31 @@ export async function handleFindSimilar(input, engines, router, backendStatus) {
45
49
  };
46
50
  }
47
51
  }
52
+ async function attachEvidence(out, input) {
53
+ if (out.results.length === 0)
54
+ return;
55
+ const includeFull = input.include_full_markdown ?? false;
56
+ const maxTokensOut = input.max_tokens_out ?? DEFAULT_MAX_TOKENS_OUT;
57
+ const query = input.concept?.trim() || input.url?.trim() || out.results[0].title;
58
+ const collected = [];
59
+ for (const r of out.results) {
60
+ if (!r.markdown)
61
+ continue;
62
+ const evs = await buildEvidenceFromMarkdown(query, r.title, r.url, r.markdown, {
63
+ maxItems: 1,
64
+ });
65
+ collected.push(...evs);
66
+ }
67
+ const budgeted = applyTokenBudget(collected, maxTokensOut);
68
+ if (budgeted.length > 0)
69
+ out.evidence = budgeted;
70
+ if (!includeFull) {
71
+ for (const r of out.results) {
72
+ r.markdown = '';
73
+ }
74
+ }
75
+ else {
76
+ applyAggregateMarkdownBudget(out.results, (r) => r.markdown ?? '', (r, body) => { r.markdown = body; }, { maxTokensOut });
77
+ }
78
+ }
48
79
  //# sourceMappingURL=find-similar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-similar.js","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAuB,EACvB,OAAuB,EACvB,MAAmB,EACnB,aAA6B;IAE7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAEtC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,mBAAmB,EAAE,KAAK;gBAC1B,KAAK,EAAE,wCAAwC;gBAC/C,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAqB;YACvC,GAAG,KAAK;YACR,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC5B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC9C,CAAC,CAAC,SAAS;SACd,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC/B,MAAM,EAAE,CAAC,CAAC,GAAG;YACb,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,UAAU,EAAE,cAAc,CAAC,WAAW;YACtC,YAAY,EAAE,cAAc,CAAC,aAAa;YAC1C,UAAU,EAAE,cAAc,CAAC,WAAW;SACvC,CAAC,CAAC;QAEH,OAAO,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,mBAAmB,EAAE,KAAK;YAC1B,KAAK,EAAE,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACxF,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"find-similar.js","sourceRoot":"","sources":["../../src/tools/find-similar.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAOnE,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,OAAO,EACxB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA2CzB"}
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAQnE,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,OAAO,EACxB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA6CzB"}
@@ -1,8 +1,11 @@
1
1
  import { createLogger } from '../logger.js';
2
2
  import { runResearchPipeline } from '../research/pipeline.js';
3
+ import { buildEvidenceFromMarkdown, applyTokenBudget, applyAggregateMarkdownBudget, } from '../search/evidence.js';
4
+ import { applyOutputBudget } from '../search/truncate.js';
3
5
  const log = createLogger('research');
4
6
  const VALID_DEPTHS = new Set(['quick', 'standard', 'comprehensive']);
5
7
  const MAX_SOURCES_LIMIT = 50;
8
+ const DEFAULT_MAX_TOKENS_OUT = 4000;
6
9
  export async function handleResearch(input, engines, router, _backendStatus, server) {
7
10
  const start = Date.now();
8
11
  try {
@@ -25,7 +28,9 @@ export async function handleResearch(input, engines, router, _backendStatus, ser
25
28
  depth: input.depth ?? 'standard',
26
29
  max_sources: input.max_sources,
27
30
  });
28
- return await runResearchPipeline(input, engines, router, server);
31
+ const out = await runResearchPipeline(input, engines, router, server);
32
+ await attachEvidence(out, input);
33
+ return out;
29
34
  }
30
35
  catch (err) {
31
36
  log.error('research handler failed', {
@@ -35,6 +40,34 @@ export async function handleResearch(input, engines, router, _backendStatus, ser
35
40
  return errorResult(err instanceof Error ? err.message : String(err), input, start);
36
41
  }
37
42
  }
43
+ async function attachEvidence(out, input) {
44
+ // Always honour max_tokens_out for the report text, regardless of sources.
45
+ if (input.max_tokens_out !== undefined && out.report) {
46
+ out.report = applyOutputBudget(out.report, { maxTokensOut: input.max_tokens_out });
47
+ }
48
+ if (out.sources.length === 0)
49
+ return;
50
+ const includeFull = input.include_full_markdown ?? false;
51
+ const maxTokensOut = input.max_tokens_out ?? DEFAULT_MAX_TOKENS_OUT;
52
+ const collected = [];
53
+ for (const s of out.sources) {
54
+ if (!s.markdown_content)
55
+ continue;
56
+ const evs = await buildEvidenceFromMarkdown(input.question, s.title, s.url, s.markdown_content, { maxItems: 1 });
57
+ collected.push(...evs);
58
+ }
59
+ const budgeted = applyTokenBudget(collected, maxTokensOut);
60
+ if (budgeted.length > 0)
61
+ out.evidence = budgeted;
62
+ if (!includeFull) {
63
+ for (const s of out.sources) {
64
+ s.markdown_content = '';
65
+ }
66
+ }
67
+ else {
68
+ applyAggregateMarkdownBudget(out.sources, (s) => s.markdown_content ?? '', (s, body) => { s.markdown_content = body; }, { maxTokensOut });
69
+ }
70
+ }
38
71
  function errorResult(error, input, start) {
39
72
  return {
40
73
  report: '',
@@ -1 +1 @@
1
- {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAoB,YAAY,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAOjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAkBnE,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,aAAa,EAC7B,cAAc,CAAC,EAAE,qBAAqB,EACtC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAsVvB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAoB,YAAY,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAOjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAqBnE,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,aAAa,EAC7B,cAAc,CAAC,EAAE,qBAAqB,EACtC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAiYvB"}
@@ -6,23 +6,53 @@ import { applyAllFilters } from '../search/filters.js';
6
6
  import { formatSearchContext } from '../search/context-formatter.js';
7
7
  import { synthesizeAnswer, buildStructuredFallback } from '../search/answer-synthesis.js';
8
8
  import { extractHighlights } from '../search/highlights.js';
9
- import { normalizeQueries, fanOutSearch, synthesizeIntent } from '../search/multi-query.js';
9
+ import { applyEvidenceDefault } from '../search/evidence.js';
10
+ import { normalizeQueries, fanOutSearch, synthesizeIntent, expandQueryHeuristic } from '../search/multi-query.js';
10
11
  import { extractContent } from '../extraction/pipeline.js';
11
12
  import { truncateSmartly } from '../search/truncate.js';
12
13
  import { cacheSearchResults, getCachedSearchResults, cacheContent } from '../cache/store.js';
13
14
  import { getEmbeddingService } from '../embedding/embed.js';
14
15
  import { getConfig } from '../config.js';
16
+ import { resolveMode } from '../util/mode.js';
15
17
  import { createLogger } from '../logger.js';
16
18
  const log = createLogger('search');
17
19
  const DEFAULT_MAX_RESULTS = 5;
18
20
  const MAX_RESULTS_CAP = 20;
19
21
  const DEFAULT_CONTENT_MAX_CHARS = 30000;
20
22
  const DEFAULT_MAX_TOTAL_CHARS = 50000;
23
+ const TOP_K_DEEP = 5;
21
24
  export async function handleSearch(input, engines, router, backendStatus, samplingServer, onProgress) {
25
+ const mode = resolveMode(input.mode);
22
26
  const start = Date.now();
23
27
  const config = getConfig();
28
+ const RETIRED_FORMATS = new Set(['full', 'context', 'highlights']);
29
+ const VALID_FORMATS = new Set(['answer', 'stream_answer']);
30
+ if (input.format != null) {
31
+ const fmt = String(input.format);
32
+ if (RETIRED_FORMATS.has(fmt)) {
33
+ return {
34
+ results: [],
35
+ query: typeof input.query === 'string' ? input.query : (input.query?.[0] ?? ''),
36
+ engines_used: [],
37
+ total_time_ms: Date.now() - start,
38
+ error: `format renamed; pass 'evidence' (default — omit) or 'answer'/'stream_answer' for synthesis`,
39
+ };
40
+ }
41
+ if (!VALID_FORMATS.has(fmt)) {
42
+ return {
43
+ results: [],
44
+ query: typeof input.query === 'string' ? input.query : (input.query?.[0] ?? ''),
45
+ engines_used: [],
46
+ total_time_ms: Date.now() - start,
47
+ error: `unknown format='${fmt}'. Valid: omit (evidence), 'answer', 'stream_answer'`,
48
+ };
49
+ }
50
+ }
24
51
  const maxResults = Math.min(input.max_results ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_CAP);
25
- const includeContent = input.include_content ?? true;
52
+ const includeContent = mode === 'deep' ? true : (input.include_content ?? true);
53
+ const deepFetchCap = mode === 'deep'
54
+ ? Math.min(input.max_results ?? 10, TOP_K_DEEP)
55
+ : undefined;
26
56
  const contentMaxChars = input.content_max_chars ?? DEFAULT_CONTENT_MAX_CHARS;
27
57
  const maxContentChars = input.max_content_chars;
28
58
  const maxTotalChars = input.max_total_chars ?? DEFAULT_MAX_TOTAL_CHARS;
@@ -40,10 +70,16 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
40
70
  log.debug('progress notification failed', { error: String(err) });
41
71
  }
42
72
  };
43
- const isMultiQuery = Array.isArray(input.query);
73
+ let normalizedQuery = input.query;
74
+ let deepAutoExpanded = false;
75
+ if (mode === 'deep' && typeof normalizedQuery === 'string') {
76
+ normalizedQuery = expandQueryHeuristic(normalizedQuery);
77
+ deepAutoExpanded = true;
78
+ }
79
+ const isMultiQuery = Array.isArray(normalizedQuery);
44
80
  // --- Multi-query path ---
45
81
  if (isMultiQuery) {
46
- const normalizedQueries = normalizeQueries(input.query);
82
+ const normalizedQueries = normalizeQueries(normalizedQuery);
47
83
  if (normalizedQueries.length === 0) {
48
84
  const output = {
49
85
  results: [],
@@ -58,13 +94,27 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
58
94
  output.warning = warning;
59
95
  return output;
60
96
  }
61
- const displayQuery = normalizedQueries[0];
97
+ const displayQuery = deepAutoExpanded && typeof input.query === 'string'
98
+ ? input.query
99
+ : normalizedQueries[0];
62
100
  const cacheKey = normalizedQueries.join(' | ');
63
- const cached = input.force_refresh ? null : getCachedSearchResults(cacheKey);
101
+ const staleMaxSeconds = mode === 'fast' ? config.fastStaleMaxHours * 3600 : 0;
102
+ const cached = input.force_refresh
103
+ ? null
104
+ : getCachedSearchResults(cacheKey, { staleMaxSeconds });
64
105
  if (cached && !includeContent) {
65
- log.info('serving multi-query search results from cache', { queries: normalizedQueries });
106
+ log.info('serving multi-query search results from cache', {
107
+ queries: normalizedQueries,
108
+ stale: cached.stale ?? false,
109
+ });
110
+ const stamped = cached.results.slice(0, maxResults).map(r => ({
111
+ ...r,
112
+ cached: true,
113
+ cached_at: cached.searched_at,
114
+ ...(cached.stale ? { stale: true } : {}),
115
+ }));
66
116
  const output = {
67
- results: cached.results.slice(0, maxResults),
117
+ results: stamped,
68
118
  query: displayQuery,
69
119
  engines_used: cached.engines_used,
70
120
  total_time_ms: Date.now() - start,
@@ -73,15 +123,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
73
123
  const warning = backendStatus?.consumeWarning();
74
124
  if (warning)
75
125
  output.warning = warning;
76
- if (input.format === 'context') {
77
- output.context_text = formatSearchContext(output.results, maxTotalChars);
78
- }
79
- if (input.format === 'highlights' && output.results.length > 0) {
80
- await applyHighlightsFormat(output, output.results, displayQuery, input.max_highlights);
81
- }
82
126
  if ((input.format === 'answer' || input.format === 'stream_answer') && output.results.length > 0) {
83
127
  await applyAnswerSynthesis(input, output, output.results, maxTotalChars, samplingServer, streamProgress);
84
128
  }
129
+ else if (output.results.length > 0) {
130
+ await applyEvidenceDefault(input, output, output.results, displayQuery);
131
+ }
85
132
  return output;
86
133
  }
87
134
  let activeEngines = engines;
@@ -93,7 +140,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
93
140
  }
94
141
  }
95
142
  await emit(1, 5, `Running ${normalizedQueries.length} search queries across engines...`);
96
- const { results: rawResults, enginesUsed, errors } = await fanOutSearch(normalizedQueries, activeEngines, {
143
+ const { results: rawResults, enginesUsed, errors } = await fanOutSearch(normalizedQueries, mode === 'fast' ? activeEngines.slice(0, 1) : activeEngines, {
97
144
  maxResults,
98
145
  timeRange: input.time_range,
99
146
  language: input.language,
@@ -115,9 +162,6 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
115
162
  const warning = backendStatus?.consumeWarning();
116
163
  if (warning)
117
164
  output.warning = warning;
118
- if (input.format === 'context') {
119
- output.context_text = '';
120
- }
121
165
  return output;
122
166
  }
123
167
  await emit(2, 5, `Deduplicating and reranking ${rawResults.length} results...`);
@@ -130,7 +174,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
130
174
  category: input.category,
131
175
  });
132
176
  const intentString = synthesizeIntent(normalizedQueries);
133
- merged = await rerankResults(intentString, merged);
177
+ merged = await rerankResults(intentString, merged, { skip: mode === 'fast' });
134
178
  merged = await validateLinks(merged);
135
179
  merged = merged.slice(0, maxResults);
136
180
  const results = merged.map(m => ({
@@ -152,6 +196,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
152
196
  fetchTimeoutMs,
153
197
  totalDeadline: start + totalTimeoutMs,
154
198
  forceRefresh: input.force_refresh ?? false,
199
+ maxFetches: deepFetchCap,
155
200
  });
156
201
  fetchElapsed = Date.now() - fetchStart;
157
202
  }
@@ -173,24 +218,33 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
173
218
  const warning = backendStatus?.consumeWarning();
174
219
  if (warning)
175
220
  output.warning = warning;
176
- if (input.format === 'context') {
177
- output.context_text = formatSearchContext(output.results, maxTotalChars);
178
- }
179
221
  if ((input.format === 'answer' || input.format === 'stream_answer') && results.length > 0) {
180
222
  await applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, streamProgress);
181
223
  }
182
- if (input.format === 'highlights' && results.length > 0) {
183
- await applyHighlightsFormat(output, results, displayQuery, input.max_highlights);
224
+ else if (results.length > 0) {
225
+ await applyEvidenceDefault(input, output, results, displayQuery);
184
226
  }
185
227
  return output;
186
228
  }
187
229
  // --- Single-query path (unchanged from v2) ---
188
230
  const queryStr = input.query;
189
- const cached = input.force_refresh ? null : getCachedSearchResults(queryStr);
231
+ const staleMaxSeconds = mode === 'fast' ? config.fastStaleMaxHours * 3600 : 0;
232
+ const cached = input.force_refresh
233
+ ? null
234
+ : getCachedSearchResults(queryStr, { staleMaxSeconds });
190
235
  if (cached && !includeContent) {
191
- log.info('serving search results from cache', { query: queryStr });
236
+ log.info('serving search results from cache', {
237
+ query: queryStr,
238
+ stale: cached.stale ?? false,
239
+ });
240
+ const stamped = cached.results.slice(0, maxResults).map(r => ({
241
+ ...r,
242
+ cached: true,
243
+ cached_at: cached.searched_at,
244
+ ...(cached.stale ? { stale: true } : {}),
245
+ }));
192
246
  const output = {
193
- results: cached.results.slice(0, maxResults),
247
+ results: stamped,
194
248
  query: queryStr,
195
249
  engines_used: cached.engines_used,
196
250
  total_time_ms: Date.now() - start,
@@ -198,15 +252,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
198
252
  const warning = backendStatus?.consumeWarning();
199
253
  if (warning)
200
254
  output.warning = warning;
201
- if (input.format === 'context') {
202
- output.context_text = formatSearchContext(output.results, maxTotalChars);
203
- }
204
- if (input.format === 'highlights' && output.results.length > 0) {
205
- await applyHighlightsFormat(output, output.results, queryStr, input.max_highlights);
206
- }
207
255
  if ((input.format === 'answer' || input.format === 'stream_answer') && output.results.length > 0) {
208
256
  await applyAnswerSynthesis(input, output, output.results, maxTotalChars, samplingServer, streamProgress);
209
257
  }
258
+ else if (output.results.length > 0) {
259
+ await applyEvidenceDefault(input, output, output.results, queryStr);
260
+ }
210
261
  return output;
211
262
  }
212
263
  let activeEngines = engines;
@@ -219,13 +270,14 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
219
270
  }
220
271
  const subQueries = decomposeQuery(queryStr);
221
272
  log.debug('query decomposition', { original: queryStr, parts: subQueries.length });
222
- await emit(1, 5, `Running ${subQueries.length} search queries across ${activeEngines.length} engines...`);
273
+ const effectiveEngines = mode === 'fast' ? activeEngines.slice(0, 1) : activeEngines;
274
+ await emit(1, 5, `Running ${subQueries.length} search queries across ${effectiveEngines.length} engines...`);
223
275
  const allRaw = [];
224
276
  const enginesUsed = new Set();
225
277
  const errors = [];
226
278
  const hasFilterAttrition = !!(input.include_domains?.length || input.exclude_domains?.length);
227
279
  const overfetchFactor = hasFilterAttrition ? 3 : 2;
228
- const searchPromises = activeEngines.flatMap(engine => subQueries.map(async (query) => {
280
+ const searchPromises = effectiveEngines.flatMap(engine => subQueries.map(async (query) => {
229
281
  try {
230
282
  const results = await engine.search(query, {
231
283
  maxResults: maxResults * overfetchFactor,
@@ -260,9 +312,6 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
260
312
  const warning = backendStatus?.consumeWarning();
261
313
  if (warning)
262
314
  output.warning = warning;
263
- if (input.format === 'context') {
264
- output.context_text = '';
265
- }
266
315
  return output;
267
316
  }
268
317
  await emit(2, 5, `Deduplicating and reranking ${allRaw.length} results...`);
@@ -274,7 +323,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
274
323
  toDate: input.to_date,
275
324
  category: input.category,
276
325
  });
277
- merged = await rerankResults(queryStr, merged);
326
+ merged = await rerankResults(queryStr, merged, { skip: mode === 'fast' });
278
327
  merged = await validateLinks(merged);
279
328
  merged = merged.slice(0, maxResults);
280
329
  const results = merged.map(m => ({
@@ -316,15 +365,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
316
365
  const warning = backendStatus?.consumeWarning();
317
366
  if (warning)
318
367
  output.warning = warning;
319
- if (input.format === 'context') {
320
- output.context_text = formatSearchContext(output.results, maxTotalChars);
321
- }
322
- if (input.format === 'highlights' && results.length > 0) {
323
- await applyHighlightsFormat(output, results, queryStr, input.max_highlights);
324
- }
325
368
  if ((input.format === 'answer' || input.format === 'stream_answer') && results.length > 0) {
326
369
  await applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, streamProgress);
327
370
  }
371
+ else if (results.length > 0) {
372
+ await applyEvidenceDefault(input, output, results, queryStr);
373
+ }
328
374
  return output;
329
375
  }
330
376
  async function applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, onProgress) {
@@ -399,14 +445,12 @@ async function applyHighlightsFallback(output, results, query, maxTotalChars, ma
399
445
  output.warning = fallback.warning;
400
446
  }
401
447
  }
402
- async function applyHighlightsFormat(output, results, query, maxHighlights) {
403
- const { highlights, citations } = await extractHighlights(query, results, maxHighlights ?? 10);
404
- output.highlights = highlights;
405
- output.citations = citations;
406
- }
407
448
  // Parallel fetch all URLs; then apply total-char budget in relevance (input) order.
408
449
  async function fetchContentForResults(results, router, ctx) {
409
- const fetches = results.map(async (result) => {
450
+ const fetchTargets = ctx.maxFetches !== undefined
451
+ ? results.slice(0, ctx.maxFetches)
452
+ : results;
453
+ const fetches = fetchTargets.map(async (result) => {
410
454
  if (Date.now() >= ctx.totalDeadline) {
411
455
  return { error: 'total_timeout' };
412
456
  }
@@ -450,8 +494,8 @@ async function fetchContentForResults(results, router, ctx) {
450
494
  });
451
495
  const fetched = await Promise.all(fetches);
452
496
  let totalCharsUsed = 0;
453
- for (let i = 0; i < results.length; i++) {
454
- const result = results[i];
497
+ for (let i = 0; i < fetchTargets.length; i++) {
498
+ const result = fetchTargets[i];
455
499
  const { content, error } = fetched[i];
456
500
  if (error) {
457
501
  result.fetch_failed = error;