@staticn0va/wigolo 0.6.6 → 1.0.1

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 +101 -55
  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":"AAEA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAEpC,KAAK,UAAU,WAAW,CACxB,KAAmB,EACnB,MAAmB;IAEnB,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QACzD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,EACnB,MAAmB;IAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC;IAEtC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;IACvF,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,mEAAmE,EAAE,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE7D,IAAI,IAA2B,CAAC;QAEhC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU;gBACb,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,YAAa,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;gBAC3E,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,MAAO,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC;gBACZ,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,YAAmC,CAAC;QACxC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU;gBACb,YAAY,GAAG,EAAE,CAAC;gBAClB,MAAM;YACR,KAAK,QAAQ;gBACX,YAAY,GAAG,EAAE,CAAC;gBAClB,MAAM;YACR,KAAK,YAAY;gBACf,YAAY,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;gBACjG,MAAM;YACR;gBACE,YAAY,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,KAAK,CAAC,GAAG;YACrB,IAAI;YACJ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC"}
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 ?? true;
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":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAElC,SAAS,oBAAoB,CAAC,MAAqB,EAAE,KAAiB;IACpE,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,IAAI,cAAmC,CAAC;IAExC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5E,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1B,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACzD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC1C,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ;QACR,QAAQ,EAAE;YACR,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;YACtC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E;QACD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;QACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;QACzC,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,MAAmB;IAEnB,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnF,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnD,OAAO,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,MAAM;YACnC,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE;YAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,aAAa;YACjC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,IAAI,YAA2F,CAAC;QAChG,IAAI,CAAC;YACH,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC;YACH,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;YAC/C,IAAI,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;gBACnC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,iBAAiB,KAAK,SAAS;YACzD,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC;YAC/D,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;QAExB,OAAO;YACL,GAAG,EAAE,GAAG,CAAC,QAAQ;YACjB,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,GAAG,CAAC,aAAa;YACjC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1B,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,YAAY,CAAC,YAAY;gBACxC,YAAY,EAAE,YAAY,CAAC,WAAW;aACvC,CAAC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC"}
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":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,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,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAC9E,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC;IACb,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;AAED,KAAK,UAAU,cAAc,CAC3B,GAAsB,EACtB,KAAuB;IAEvB,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,qBAAqB,IAAI,KAAK,CAAC;IACzD,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEjF,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC1B,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC7E,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5B,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,4BAA4B,CAC1B,GAAG,CAAC,OAAO,EACX,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,EACvB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EACnC,EAAE,YAAY,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -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 && mode !== 'fast') {
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,8 +174,9 @@ 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);
134
- merged = await validateLinks(merged);
177
+ merged = await rerankResults(intentString, merged, { skip: mode === 'fast' });
178
+ if (mode !== 'fast')
179
+ merged = await validateLinks(merged);
135
180
  merged = merged.slice(0, maxResults);
136
181
  const results = merged.map(m => ({
137
182
  title: m.title,
@@ -152,6 +197,7 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
152
197
  fetchTimeoutMs,
153
198
  totalDeadline: start + totalTimeoutMs,
154
199
  forceRefresh: input.force_refresh ?? false,
200
+ maxFetches: deepFetchCap,
155
201
  });
156
202
  fetchElapsed = Date.now() - fetchStart;
157
203
  }
@@ -173,24 +219,33 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
173
219
  const warning = backendStatus?.consumeWarning();
174
220
  if (warning)
175
221
  output.warning = warning;
176
- if (input.format === 'context') {
177
- output.context_text = formatSearchContext(output.results, maxTotalChars);
178
- }
179
222
  if ((input.format === 'answer' || input.format === 'stream_answer') && results.length > 0) {
180
223
  await applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, streamProgress);
181
224
  }
182
- if (input.format === 'highlights' && results.length > 0) {
183
- await applyHighlightsFormat(output, results, displayQuery, input.max_highlights);
225
+ else if (results.length > 0 && mode !== 'fast') {
226
+ await applyEvidenceDefault(input, output, results, displayQuery);
184
227
  }
185
228
  return output;
186
229
  }
187
230
  // --- Single-query path (unchanged from v2) ---
188
231
  const queryStr = input.query;
189
- const cached = input.force_refresh ? null : getCachedSearchResults(queryStr);
232
+ const staleMaxSeconds = mode === 'fast' ? config.fastStaleMaxHours * 3600 : 0;
233
+ const cached = input.force_refresh
234
+ ? null
235
+ : getCachedSearchResults(queryStr, { staleMaxSeconds });
190
236
  if (cached && !includeContent) {
191
- log.info('serving search results from cache', { query: queryStr });
237
+ log.info('serving search results from cache', {
238
+ query: queryStr,
239
+ stale: cached.stale ?? false,
240
+ });
241
+ const stamped = cached.results.slice(0, maxResults).map(r => ({
242
+ ...r,
243
+ cached: true,
244
+ cached_at: cached.searched_at,
245
+ ...(cached.stale ? { stale: true } : {}),
246
+ }));
192
247
  const output = {
193
- results: cached.results.slice(0, maxResults),
248
+ results: stamped,
194
249
  query: queryStr,
195
250
  engines_used: cached.engines_used,
196
251
  total_time_ms: Date.now() - start,
@@ -198,15 +253,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
198
253
  const warning = backendStatus?.consumeWarning();
199
254
  if (warning)
200
255
  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
256
  if ((input.format === 'answer' || input.format === 'stream_answer') && output.results.length > 0) {
208
257
  await applyAnswerSynthesis(input, output, output.results, maxTotalChars, samplingServer, streamProgress);
209
258
  }
259
+ else if (output.results.length > 0 && mode !== 'fast') {
260
+ await applyEvidenceDefault(input, output, output.results, queryStr);
261
+ }
210
262
  return output;
211
263
  }
212
264
  let activeEngines = engines;
@@ -219,13 +271,14 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
219
271
  }
220
272
  const subQueries = decomposeQuery(queryStr);
221
273
  log.debug('query decomposition', { original: queryStr, parts: subQueries.length });
222
- await emit(1, 5, `Running ${subQueries.length} search queries across ${activeEngines.length} engines...`);
274
+ const effectiveEngines = mode === 'fast' ? activeEngines.slice(0, 1) : activeEngines;
275
+ await emit(1, 5, `Running ${subQueries.length} search queries across ${effectiveEngines.length} engines...`);
223
276
  const allRaw = [];
224
277
  const enginesUsed = new Set();
225
278
  const errors = [];
226
279
  const hasFilterAttrition = !!(input.include_domains?.length || input.exclude_domains?.length);
227
280
  const overfetchFactor = hasFilterAttrition ? 3 : 2;
228
- const searchPromises = activeEngines.flatMap(engine => subQueries.map(async (query) => {
281
+ const searchPromises = effectiveEngines.flatMap(engine => subQueries.map(async (query) => {
229
282
  try {
230
283
  const results = await engine.search(query, {
231
284
  maxResults: maxResults * overfetchFactor,
@@ -260,9 +313,6 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
260
313
  const warning = backendStatus?.consumeWarning();
261
314
  if (warning)
262
315
  output.warning = warning;
263
- if (input.format === 'context') {
264
- output.context_text = '';
265
- }
266
316
  return output;
267
317
  }
268
318
  await emit(2, 5, `Deduplicating and reranking ${allRaw.length} results...`);
@@ -274,8 +324,9 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
274
324
  toDate: input.to_date,
275
325
  category: input.category,
276
326
  });
277
- merged = await rerankResults(queryStr, merged);
278
- merged = await validateLinks(merged);
327
+ merged = await rerankResults(queryStr, merged, { skip: mode === 'fast' });
328
+ if (mode !== 'fast')
329
+ merged = await validateLinks(merged);
279
330
  merged = merged.slice(0, maxResults);
280
331
  const results = merged.map(m => ({
281
332
  title: m.title,
@@ -316,15 +367,12 @@ export async function handleSearch(input, engines, router, backendStatus, sampli
316
367
  const warning = backendStatus?.consumeWarning();
317
368
  if (warning)
318
369
  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
370
  if ((input.format === 'answer' || input.format === 'stream_answer') && results.length > 0) {
326
371
  await applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, streamProgress);
327
372
  }
373
+ else if (results.length > 0 && mode !== 'fast') {
374
+ await applyEvidenceDefault(input, output, results, queryStr);
375
+ }
328
376
  return output;
329
377
  }
330
378
  async function applyAnswerSynthesis(input, output, results, maxTotalChars, samplingServer, onProgress) {
@@ -399,14 +447,12 @@ async function applyHighlightsFallback(output, results, query, maxTotalChars, ma
399
447
  output.warning = fallback.warning;
400
448
  }
401
449
  }
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
450
  // Parallel fetch all URLs; then apply total-char budget in relevance (input) order.
408
451
  async function fetchContentForResults(results, router, ctx) {
409
- const fetches = results.map(async (result) => {
452
+ const fetchTargets = ctx.maxFetches !== undefined
453
+ ? results.slice(0, ctx.maxFetches)
454
+ : results;
455
+ const fetches = fetchTargets.map(async (result) => {
410
456
  if (Date.now() >= ctx.totalDeadline) {
411
457
  return { error: 'total_timeout' };
412
458
  }
@@ -450,8 +496,8 @@ async function fetchContentForResults(results, router, ctx) {
450
496
  });
451
497
  const fetched = await Promise.all(fetches);
452
498
  let totalCharsUsed = 0;
453
- for (let i = 0; i < results.length; i++) {
454
- const result = results[i];
499
+ for (let i = 0; i < fetchTargets.length; i++) {
500
+ const result = fetchTargets[i];
455
501
  const { content, error } = fetched[i];
456
502
  if (error) {
457
503
  result.fetch_failed = error;