@iflow-mcp/jakeliume-webpeel 0.22.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 (547) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +313 -0
  3. package/dist/cache.d.ts +30 -0
  4. package/dist/cache.js +139 -0
  5. package/dist/cli/commands/auth.d.ts +5 -0
  6. package/dist/cli/commands/auth.js +411 -0
  7. package/dist/cli/commands/doctor.d.ts +37 -0
  8. package/dist/cli/commands/doctor.js +371 -0
  9. package/dist/cli/commands/fetch.d.ts +6 -0
  10. package/dist/cli/commands/fetch.js +1345 -0
  11. package/dist/cli/commands/guide.d.ts +2 -0
  12. package/dist/cli/commands/guide.js +183 -0
  13. package/dist/cli/commands/interact.d.ts +5 -0
  14. package/dist/cli/commands/interact.js +840 -0
  15. package/dist/cli/commands/jobs.d.ts +5 -0
  16. package/dist/cli/commands/jobs.js +997 -0
  17. package/dist/cli/commands/monitor.d.ts +12 -0
  18. package/dist/cli/commands/monitor.js +197 -0
  19. package/dist/cli/commands/observe.d.ts +12 -0
  20. package/dist/cli/commands/observe.js +158 -0
  21. package/dist/cli/commands/screenshot.d.ts +5 -0
  22. package/dist/cli/commands/screenshot.js +282 -0
  23. package/dist/cli/commands/search.d.ts +5 -0
  24. package/dist/cli/commands/search.js +1021 -0
  25. package/dist/cli/commands/setup.d.ts +13 -0
  26. package/dist/cli/commands/setup.js +244 -0
  27. package/dist/cli/commands/skill.d.ts +15 -0
  28. package/dist/cli/commands/skill.js +195 -0
  29. package/dist/cli/utils.d.ts +84 -0
  30. package/dist/cli/utils.js +806 -0
  31. package/dist/cli-auth.d.ts +75 -0
  32. package/dist/cli-auth.js +369 -0
  33. package/dist/cli.d.ts +17 -0
  34. package/dist/cli.js +99 -0
  35. package/dist/core/actions.d.ts +69 -0
  36. package/dist/core/actions.js +495 -0
  37. package/dist/core/agent.d.ts +98 -0
  38. package/dist/core/agent.js +558 -0
  39. package/dist/core/answer.d.ts +42 -0
  40. package/dist/core/answer.js +395 -0
  41. package/dist/core/application-tracker.d.ts +84 -0
  42. package/dist/core/application-tracker.js +184 -0
  43. package/dist/core/apply.d.ts +162 -0
  44. package/dist/core/apply.js +816 -0
  45. package/dist/core/auth-detection.d.ts +35 -0
  46. package/dist/core/auth-detection.js +358 -0
  47. package/dist/core/auto-extract.d.ts +82 -0
  48. package/dist/core/auto-extract.js +604 -0
  49. package/dist/core/auto-interact.d.ts +23 -0
  50. package/dist/core/auto-interact.js +246 -0
  51. package/dist/core/bm25-filter.d.ts +66 -0
  52. package/dist/core/bm25-filter.js +288 -0
  53. package/dist/core/branding.d.ts +54 -0
  54. package/dist/core/branding.js +234 -0
  55. package/dist/core/browser-fetch.d.ts +323 -0
  56. package/dist/core/browser-fetch.js +1600 -0
  57. package/dist/core/browser-pool.d.ts +91 -0
  58. package/dist/core/browser-pool.js +550 -0
  59. package/dist/core/budget.d.ts +42 -0
  60. package/dist/core/budget.js +324 -0
  61. package/dist/core/business-intel.d.ts +47 -0
  62. package/dist/core/business-intel.js +279 -0
  63. package/dist/core/cache.d.ts +13 -0
  64. package/dist/core/cache.js +121 -0
  65. package/dist/core/cf-worker-proxy.d.ts +32 -0
  66. package/dist/core/cf-worker-proxy.js +87 -0
  67. package/dist/core/challenge-detection.d.ts +26 -0
  68. package/dist/core/challenge-detection.js +468 -0
  69. package/dist/core/change-tracking.d.ts +75 -0
  70. package/dist/core/change-tracking.js +276 -0
  71. package/dist/core/chunker.d.ts +46 -0
  72. package/dist/core/chunker.js +249 -0
  73. package/dist/core/chunking.d.ts +42 -0
  74. package/dist/core/chunking.js +181 -0
  75. package/dist/core/circuit-breaker.d.ts +44 -0
  76. package/dist/core/circuit-breaker.js +85 -0
  77. package/dist/core/content-pruner.d.ts +47 -0
  78. package/dist/core/content-pruner.js +425 -0
  79. package/dist/core/cookie-cache.d.ts +60 -0
  80. package/dist/core/cookie-cache.js +163 -0
  81. package/dist/core/crawl-checkpoint.d.ts +54 -0
  82. package/dist/core/crawl-checkpoint.js +104 -0
  83. package/dist/core/crawler.d.ts +84 -0
  84. package/dist/core/crawler.js +349 -0
  85. package/dist/core/cross-verify.d.ts +27 -0
  86. package/dist/core/cross-verify.js +93 -0
  87. package/dist/core/deep-fetch.d.ts +74 -0
  88. package/dist/core/deep-fetch.js +405 -0
  89. package/dist/core/deep-research.d.ts +141 -0
  90. package/dist/core/deep-research.js +972 -0
  91. package/dist/core/design-analysis.d.ts +70 -0
  92. package/dist/core/design-analysis.js +490 -0
  93. package/dist/core/design-compare.d.ts +38 -0
  94. package/dist/core/design-compare.js +264 -0
  95. package/dist/core/diff.d.ts +61 -0
  96. package/dist/core/diff.js +289 -0
  97. package/dist/core/dns-cache.d.ts +20 -0
  98. package/dist/core/dns-cache.js +198 -0
  99. package/dist/core/documents.d.ts +23 -0
  100. package/dist/core/documents.js +123 -0
  101. package/dist/core/domain-memory.d.ts +66 -0
  102. package/dist/core/domain-memory.js +163 -0
  103. package/dist/core/domain-verify.d.ts +40 -0
  104. package/dist/core/domain-verify.js +379 -0
  105. package/dist/core/engine-ranker.d.ts +112 -0
  106. package/dist/core/engine-ranker.js +395 -0
  107. package/dist/core/extract-inline.d.ts +38 -0
  108. package/dist/core/extract-inline.js +215 -0
  109. package/dist/core/extract-listings.d.ts +38 -0
  110. package/dist/core/extract-listings.js +461 -0
  111. package/dist/core/extract.d.ts +9 -0
  112. package/dist/core/extract.js +139 -0
  113. package/dist/core/fetch-cache.d.ts +57 -0
  114. package/dist/core/fetch-cache.js +95 -0
  115. package/dist/core/fetcher.d.ts +13 -0
  116. package/dist/core/fetcher.js +12 -0
  117. package/dist/core/google-cache.d.ts +29 -0
  118. package/dist/core/google-cache.js +180 -0
  119. package/dist/core/google-serp-parser.d.ts +82 -0
  120. package/dist/core/google-serp-parser.js +287 -0
  121. package/dist/core/hotel-search.d.ts +122 -0
  122. package/dist/core/hotel-search.js +382 -0
  123. package/dist/core/http-fetch.d.ts +72 -0
  124. package/dist/core/http-fetch.js +820 -0
  125. package/dist/core/human.d.ts +175 -0
  126. package/dist/core/human.js +680 -0
  127. package/dist/core/image-caption.d.ts +44 -0
  128. package/dist/core/image-caption.js +271 -0
  129. package/dist/core/jobs.d.ts +75 -0
  130. package/dist/core/jobs.js +634 -0
  131. package/dist/core/json-ld.d.ts +15 -0
  132. package/dist/core/json-ld.js +617 -0
  133. package/dist/core/language-detect.d.ts +18 -0
  134. package/dist/core/language-detect.js +135 -0
  135. package/dist/core/links.d.ts +10 -0
  136. package/dist/core/links.js +44 -0
  137. package/dist/core/llm-extract.d.ts +71 -0
  138. package/dist/core/llm-extract.js +507 -0
  139. package/dist/core/llm-provider.d.ts +100 -0
  140. package/dist/core/llm-provider.js +702 -0
  141. package/dist/core/local-search.d.ts +60 -0
  142. package/dist/core/local-search.js +308 -0
  143. package/dist/core/logger.d.ts +28 -0
  144. package/dist/core/logger.js +104 -0
  145. package/dist/core/map.d.ts +33 -0
  146. package/dist/core/map.js +127 -0
  147. package/dist/core/markdown.d.ts +92 -0
  148. package/dist/core/markdown.js +809 -0
  149. package/dist/core/metadata.d.ts +34 -0
  150. package/dist/core/metadata.js +422 -0
  151. package/dist/core/observe.d.ts +113 -0
  152. package/dist/core/observe.js +395 -0
  153. package/dist/core/ocr.d.ts +12 -0
  154. package/dist/core/ocr.js +33 -0
  155. package/dist/core/paginate.d.ts +31 -0
  156. package/dist/core/paginate.js +106 -0
  157. package/dist/core/pdf.d.ts +8 -0
  158. package/dist/core/pdf.js +25 -0
  159. package/dist/core/peel-tls.d.ts +25 -0
  160. package/dist/core/peel-tls.js +220 -0
  161. package/dist/core/pipeline.d.ts +132 -0
  162. package/dist/core/pipeline.js +1666 -0
  163. package/dist/core/profiles.d.ts +61 -0
  164. package/dist/core/profiles.js +350 -0
  165. package/dist/core/prompt-guard.d.ts +30 -0
  166. package/dist/core/prompt-guard.js +119 -0
  167. package/dist/core/proxy-config.d.ts +90 -0
  168. package/dist/core/proxy-config.js +172 -0
  169. package/dist/core/quick-answer.d.ts +53 -0
  170. package/dist/core/quick-answer.js +833 -0
  171. package/dist/core/rate-governor.d.ts +80 -0
  172. package/dist/core/rate-governor.js +238 -0
  173. package/dist/core/readability.d.ts +57 -0
  174. package/dist/core/readability.js +533 -0
  175. package/dist/core/research.d.ts +66 -0
  176. package/dist/core/research.js +270 -0
  177. package/dist/core/retry.d.ts +60 -0
  178. package/dist/core/retry.js +119 -0
  179. package/dist/core/safe-browsing.d.ts +30 -0
  180. package/dist/core/safe-browsing.js +206 -0
  181. package/dist/core/schema-extraction.d.ts +66 -0
  182. package/dist/core/schema-extraction.js +352 -0
  183. package/dist/core/schema-postprocess.d.ts +32 -0
  184. package/dist/core/schema-postprocess.js +469 -0
  185. package/dist/core/schema-templates.d.ts +19 -0
  186. package/dist/core/schema-templates.js +143 -0
  187. package/dist/core/screenshot.d.ts +224 -0
  188. package/dist/core/screenshot.js +207 -0
  189. package/dist/core/search-engines.d.ts +25 -0
  190. package/dist/core/search-engines.js +182 -0
  191. package/dist/core/search-provider.d.ts +243 -0
  192. package/dist/core/search-provider.js +1629 -0
  193. package/dist/core/searxng-provider.d.ts +35 -0
  194. package/dist/core/searxng-provider.js +105 -0
  195. package/dist/core/selective-evidence.d.ts +151 -0
  196. package/dist/core/selective-evidence.js +389 -0
  197. package/dist/core/site-search.d.ts +44 -0
  198. package/dist/core/site-search.js +252 -0
  199. package/dist/core/sitemap.d.ts +23 -0
  200. package/dist/core/sitemap.js +105 -0
  201. package/dist/core/source-credibility.d.ts +29 -0
  202. package/dist/core/source-credibility.js +584 -0
  203. package/dist/core/source-scoring.d.ts +166 -0
  204. package/dist/core/source-scoring.js +396 -0
  205. package/dist/core/stemmer.d.ts +38 -0
  206. package/dist/core/stemmer.js +509 -0
  207. package/dist/core/strategies.d.ts +104 -0
  208. package/dist/core/strategies.js +1044 -0
  209. package/dist/core/strategy-hooks.d.ts +145 -0
  210. package/dist/core/strategy-hooks.js +74 -0
  211. package/dist/core/structured-extract.d.ts +43 -0
  212. package/dist/core/structured-extract.js +550 -0
  213. package/dist/core/summarize.d.ts +17 -0
  214. package/dist/core/summarize.js +78 -0
  215. package/dist/core/synonyms.d.ts +42 -0
  216. package/dist/core/synonyms.js +184 -0
  217. package/dist/core/system-monitor.d.ts +61 -0
  218. package/dist/core/system-monitor.js +133 -0
  219. package/dist/core/table-format.d.ts +30 -0
  220. package/dist/core/table-format.js +146 -0
  221. package/dist/core/threat-feeds.d.ts +23 -0
  222. package/dist/core/threat-feeds.js +104 -0
  223. package/dist/core/timing.d.ts +21 -0
  224. package/dist/core/timing.js +33 -0
  225. package/dist/core/transcript-export.d.ts +47 -0
  226. package/dist/core/transcript-export.js +107 -0
  227. package/dist/core/user-agents.d.ts +82 -0
  228. package/dist/core/user-agents.js +239 -0
  229. package/dist/core/vertical-search.d.ts +54 -0
  230. package/dist/core/vertical-search.js +158 -0
  231. package/dist/core/watch-manager.d.ts +175 -0
  232. package/dist/core/watch-manager.js +416 -0
  233. package/dist/core/watch.d.ts +101 -0
  234. package/dist/core/watch.js +389 -0
  235. package/dist/core/youtube.d.ts +130 -0
  236. package/dist/core/youtube.js +1175 -0
  237. package/dist/ee/challenge-re-export.d.ts +1 -0
  238. package/dist/ee/challenge-re-export.js +1 -0
  239. package/dist/ee/challenge-solver.d.ts +72 -0
  240. package/dist/ee/challenge-solver.js +720 -0
  241. package/dist/ee/domain-extractors.d.ts +8 -0
  242. package/dist/ee/domain-extractors.js +8 -0
  243. package/dist/ee/domain-intel.d.ts +16 -0
  244. package/dist/ee/domain-intel.js +133 -0
  245. package/dist/ee/extractors/allrecipes.d.ts +2 -0
  246. package/dist/ee/extractors/allrecipes.js +120 -0
  247. package/dist/ee/extractors/amazon.d.ts +2 -0
  248. package/dist/ee/extractors/amazon.js +78 -0
  249. package/dist/ee/extractors/arxiv.d.ts +2 -0
  250. package/dist/ee/extractors/arxiv.js +137 -0
  251. package/dist/ee/extractors/bestbuy.d.ts +2 -0
  252. package/dist/ee/extractors/bestbuy.js +78 -0
  253. package/dist/ee/extractors/carscom.d.ts +2 -0
  254. package/dist/ee/extractors/carscom.js +121 -0
  255. package/dist/ee/extractors/coingecko.d.ts +2 -0
  256. package/dist/ee/extractors/coingecko.js +134 -0
  257. package/dist/ee/extractors/craigslist.d.ts +2 -0
  258. package/dist/ee/extractors/craigslist.js +92 -0
  259. package/dist/ee/extractors/devto.d.ts +2 -0
  260. package/dist/ee/extractors/devto.js +135 -0
  261. package/dist/ee/extractors/ebay.d.ts +2 -0
  262. package/dist/ee/extractors/ebay.js +90 -0
  263. package/dist/ee/extractors/espn.d.ts +2 -0
  264. package/dist/ee/extractors/espn.js +260 -0
  265. package/dist/ee/extractors/etsy.d.ts +2 -0
  266. package/dist/ee/extractors/etsy.js +52 -0
  267. package/dist/ee/extractors/facebook.d.ts +2 -0
  268. package/dist/ee/extractors/facebook.js +46 -0
  269. package/dist/ee/extractors/github.d.ts +2 -0
  270. package/dist/ee/extractors/github.js +196 -0
  271. package/dist/ee/extractors/google-flights.d.ts +2 -0
  272. package/dist/ee/extractors/google-flights.js +176 -0
  273. package/dist/ee/extractors/hackernews.d.ts +2 -0
  274. package/dist/ee/extractors/hackernews.js +147 -0
  275. package/dist/ee/extractors/imdb.d.ts +2 -0
  276. package/dist/ee/extractors/imdb.js +172 -0
  277. package/dist/ee/extractors/index.d.ts +26 -0
  278. package/dist/ee/extractors/index.js +247 -0
  279. package/dist/ee/extractors/instagram.d.ts +2 -0
  280. package/dist/ee/extractors/instagram.js +102 -0
  281. package/dist/ee/extractors/kalshi.d.ts +2 -0
  282. package/dist/ee/extractors/kalshi.js +121 -0
  283. package/dist/ee/extractors/kayak-cars.d.ts +2 -0
  284. package/dist/ee/extractors/kayak-cars.js +270 -0
  285. package/dist/ee/extractors/linkedin.d.ts +2 -0
  286. package/dist/ee/extractors/linkedin.js +113 -0
  287. package/dist/ee/extractors/medium.d.ts +2 -0
  288. package/dist/ee/extractors/medium.js +130 -0
  289. package/dist/ee/extractors/news.d.ts +4 -0
  290. package/dist/ee/extractors/news.js +173 -0
  291. package/dist/ee/extractors/npm.d.ts +2 -0
  292. package/dist/ee/extractors/npm.js +86 -0
  293. package/dist/ee/extractors/pdf.d.ts +2 -0
  294. package/dist/ee/extractors/pdf.js +108 -0
  295. package/dist/ee/extractors/pinterest.d.ts +2 -0
  296. package/dist/ee/extractors/pinterest.js +34 -0
  297. package/dist/ee/extractors/polymarket.d.ts +2 -0
  298. package/dist/ee/extractors/polymarket.js +358 -0
  299. package/dist/ee/extractors/producthunt.d.ts +2 -0
  300. package/dist/ee/extractors/producthunt.js +88 -0
  301. package/dist/ee/extractors/pubmed.d.ts +2 -0
  302. package/dist/ee/extractors/pubmed.js +162 -0
  303. package/dist/ee/extractors/pypi.d.ts +2 -0
  304. package/dist/ee/extractors/pypi.js +80 -0
  305. package/dist/ee/extractors/reddit.d.ts +2 -0
  306. package/dist/ee/extractors/reddit.js +438 -0
  307. package/dist/ee/extractors/redfin.d.ts +2 -0
  308. package/dist/ee/extractors/redfin.js +156 -0
  309. package/dist/ee/extractors/semanticscholar.d.ts +2 -0
  310. package/dist/ee/extractors/semanticscholar.js +131 -0
  311. package/dist/ee/extractors/shared.d.ts +12 -0
  312. package/dist/ee/extractors/shared.js +76 -0
  313. package/dist/ee/extractors/soundcloud.d.ts +2 -0
  314. package/dist/ee/extractors/soundcloud.js +34 -0
  315. package/dist/ee/extractors/sportsbetting.d.ts +2 -0
  316. package/dist/ee/extractors/sportsbetting.js +37 -0
  317. package/dist/ee/extractors/spotify.d.ts +2 -0
  318. package/dist/ee/extractors/spotify.js +34 -0
  319. package/dist/ee/extractors/stackoverflow.d.ts +2 -0
  320. package/dist/ee/extractors/stackoverflow.js +61 -0
  321. package/dist/ee/extractors/substack.d.ts +2 -0
  322. package/dist/ee/extractors/substack.js +115 -0
  323. package/dist/ee/extractors/substackroot.d.ts +2 -0
  324. package/dist/ee/extractors/substackroot.js +46 -0
  325. package/dist/ee/extractors/tiktok.d.ts +2 -0
  326. package/dist/ee/extractors/tiktok.js +29 -0
  327. package/dist/ee/extractors/tradingview.d.ts +2 -0
  328. package/dist/ee/extractors/tradingview.js +182 -0
  329. package/dist/ee/extractors/twitch.d.ts +2 -0
  330. package/dist/ee/extractors/twitch.js +36 -0
  331. package/dist/ee/extractors/twitter.d.ts +2 -0
  332. package/dist/ee/extractors/twitter.js +327 -0
  333. package/dist/ee/extractors/types.d.ts +14 -0
  334. package/dist/ee/extractors/types.js +1 -0
  335. package/dist/ee/extractors/walmart.d.ts +2 -0
  336. package/dist/ee/extractors/walmart.js +50 -0
  337. package/dist/ee/extractors/weather.d.ts +2 -0
  338. package/dist/ee/extractors/weather.js +133 -0
  339. package/dist/ee/extractors/wikipedia.d.ts +4 -0
  340. package/dist/ee/extractors/wikipedia.js +235 -0
  341. package/dist/ee/extractors/yelp.d.ts +2 -0
  342. package/dist/ee/extractors/yelp.js +216 -0
  343. package/dist/ee/extractors/youtube.d.ts +2 -0
  344. package/dist/ee/extractors/youtube.js +189 -0
  345. package/dist/ee/extractors/zillow.d.ts +54 -0
  346. package/dist/ee/extractors/zillow.js +247 -0
  347. package/dist/ee/extractors-re-export.d.ts +1 -0
  348. package/dist/ee/extractors-re-export.js +1 -0
  349. package/dist/ee/premium-hooks.d.ts +20 -0
  350. package/dist/ee/premium-hooks.js +50 -0
  351. package/dist/ee/spa-detection.d.ts +2 -0
  352. package/dist/ee/spa-detection.js +2 -0
  353. package/dist/ee/stability.d.ts +4 -0
  354. package/dist/ee/stability.js +29 -0
  355. package/dist/ee/swr-cache.d.ts +14 -0
  356. package/dist/ee/swr-cache.js +34 -0
  357. package/dist/index.d.ts +143 -0
  358. package/dist/index.js +291 -0
  359. package/dist/integrations/index.d.ts +2 -0
  360. package/dist/integrations/index.js +2 -0
  361. package/dist/integrations/langchain.d.ts +64 -0
  362. package/dist/integrations/langchain.js +115 -0
  363. package/dist/integrations/llamaindex.d.ts +50 -0
  364. package/dist/integrations/llamaindex.js +91 -0
  365. package/dist/mcp/handlers/act.d.ts +5 -0
  366. package/dist/mcp/handlers/act.js +34 -0
  367. package/dist/mcp/handlers/definitions.d.ts +6 -0
  368. package/dist/mcp/handlers/definitions.js +395 -0
  369. package/dist/mcp/handlers/extract.d.ts +7 -0
  370. package/dist/mcp/handlers/extract.js +135 -0
  371. package/dist/mcp/handlers/fetch.d.ts +6 -0
  372. package/dist/mcp/handlers/fetch.js +98 -0
  373. package/dist/mcp/handlers/find.d.ts +5 -0
  374. package/dist/mcp/handlers/find.js +137 -0
  375. package/dist/mcp/handlers/index.d.ts +13 -0
  376. package/dist/mcp/handlers/index.js +63 -0
  377. package/dist/mcp/handlers/legacy.d.ts +25 -0
  378. package/dist/mcp/handlers/legacy.js +450 -0
  379. package/dist/mcp/handlers/meta.d.ts +6 -0
  380. package/dist/mcp/handlers/meta.js +40 -0
  381. package/dist/mcp/handlers/monitor.d.ts +5 -0
  382. package/dist/mcp/handlers/monitor.js +41 -0
  383. package/dist/mcp/handlers/observe.d.ts +8 -0
  384. package/dist/mcp/handlers/observe.js +37 -0
  385. package/dist/mcp/handlers/read.d.ts +6 -0
  386. package/dist/mcp/handlers/read.js +78 -0
  387. package/dist/mcp/handlers/see.d.ts +5 -0
  388. package/dist/mcp/handlers/see.js +75 -0
  389. package/dist/mcp/handlers/types.d.ts +29 -0
  390. package/dist/mcp/handlers/types.js +28 -0
  391. package/dist/mcp/server.d.ts +7 -0
  392. package/dist/mcp/server.js +108 -0
  393. package/dist/mcp/smart-router.d.ts +23 -0
  394. package/dist/mcp/smart-router.js +178 -0
  395. package/dist/server/app.d.ts +14 -0
  396. package/dist/server/app.js +632 -0
  397. package/dist/server/auth-store.d.ts +28 -0
  398. package/dist/server/auth-store.js +88 -0
  399. package/dist/server/bull-queues.d.ts +60 -0
  400. package/dist/server/bull-queues.js +90 -0
  401. package/dist/server/email-service.d.ts +55 -0
  402. package/dist/server/email-service.js +291 -0
  403. package/dist/server/job-queue.d.ts +100 -0
  404. package/dist/server/job-queue.js +145 -0
  405. package/dist/server/logger.d.ts +10 -0
  406. package/dist/server/logger.js +37 -0
  407. package/dist/server/middleware/audit-log.d.ts +14 -0
  408. package/dist/server/middleware/audit-log.js +73 -0
  409. package/dist/server/middleware/auth.d.ts +35 -0
  410. package/dist/server/middleware/auth.js +225 -0
  411. package/dist/server/middleware/rate-limit.d.ts +50 -0
  412. package/dist/server/middleware/rate-limit.js +270 -0
  413. package/dist/server/middleware/scope-guard.d.ts +25 -0
  414. package/dist/server/middleware/scope-guard.js +45 -0
  415. package/dist/server/middleware/url-validator.d.ts +15 -0
  416. package/dist/server/middleware/url-validator.js +201 -0
  417. package/dist/server/openapi.yaml +6418 -0
  418. package/dist/server/pg-auth-store.d.ts +146 -0
  419. package/dist/server/pg-auth-store.js +576 -0
  420. package/dist/server/pg-job-queue.d.ts +59 -0
  421. package/dist/server/pg-job-queue.js +375 -0
  422. package/dist/server/routes/activity.d.ts +6 -0
  423. package/dist/server/routes/activity.js +79 -0
  424. package/dist/server/routes/admin-active.d.ts +7 -0
  425. package/dist/server/routes/admin-active.js +120 -0
  426. package/dist/server/routes/admin-stats.d.ts +7 -0
  427. package/dist/server/routes/admin-stats.js +176 -0
  428. package/dist/server/routes/agent.d.ts +24 -0
  429. package/dist/server/routes/agent.js +480 -0
  430. package/dist/server/routes/answer.d.ts +5 -0
  431. package/dist/server/routes/answer.js +125 -0
  432. package/dist/server/routes/ask.d.ts +28 -0
  433. package/dist/server/routes/ask.js +295 -0
  434. package/dist/server/routes/batch.d.ts +6 -0
  435. package/dist/server/routes/batch.js +493 -0
  436. package/dist/server/routes/cache-warm.d.ts +25 -0
  437. package/dist/server/routes/cache-warm.js +212 -0
  438. package/dist/server/routes/cli-usage.d.ts +6 -0
  439. package/dist/server/routes/cli-usage.js +127 -0
  440. package/dist/server/routes/compat.d.ts +23 -0
  441. package/dist/server/routes/compat.js +652 -0
  442. package/dist/server/routes/crawl.d.ts +13 -0
  443. package/dist/server/routes/crawl.js +287 -0
  444. package/dist/server/routes/deep-fetch.d.ts +8 -0
  445. package/dist/server/routes/deep-fetch.js +57 -0
  446. package/dist/server/routes/deep-research.d.ts +11 -0
  447. package/dist/server/routes/deep-research.js +232 -0
  448. package/dist/server/routes/demo.d.ts +24 -0
  449. package/dist/server/routes/demo.js +517 -0
  450. package/dist/server/routes/do.d.ts +8 -0
  451. package/dist/server/routes/do.js +72 -0
  452. package/dist/server/routes/extract.d.ts +14 -0
  453. package/dist/server/routes/extract.js +325 -0
  454. package/dist/server/routes/feed.d.ts +15 -0
  455. package/dist/server/routes/feed.js +311 -0
  456. package/dist/server/routes/fetch-queue.d.ts +13 -0
  457. package/dist/server/routes/fetch-queue.js +357 -0
  458. package/dist/server/routes/fetch.d.ts +7 -0
  459. package/dist/server/routes/fetch.js +1274 -0
  460. package/dist/server/routes/go.d.ts +14 -0
  461. package/dist/server/routes/go.js +81 -0
  462. package/dist/server/routes/health.d.ts +11 -0
  463. package/dist/server/routes/health.js +141 -0
  464. package/dist/server/routes/jobs.d.ts +7 -0
  465. package/dist/server/routes/jobs.js +574 -0
  466. package/dist/server/routes/map.d.ts +11 -0
  467. package/dist/server/routes/map.js +116 -0
  468. package/dist/server/routes/mcp.d.ts +14 -0
  469. package/dist/server/routes/mcp.js +197 -0
  470. package/dist/server/routes/metrics.d.ts +37 -0
  471. package/dist/server/routes/metrics.js +149 -0
  472. package/dist/server/routes/oauth.d.ts +9 -0
  473. package/dist/server/routes/oauth.js +396 -0
  474. package/dist/server/routes/playground.d.ts +17 -0
  475. package/dist/server/routes/playground.js +283 -0
  476. package/dist/server/routes/reader.d.ts +18 -0
  477. package/dist/server/routes/reader.js +192 -0
  478. package/dist/server/routes/research.d.ts +14 -0
  479. package/dist/server/routes/research.js +482 -0
  480. package/dist/server/routes/screenshot.d.ts +22 -0
  481. package/dist/server/routes/screenshot.js +820 -0
  482. package/dist/server/routes/search.d.ts +6 -0
  483. package/dist/server/routes/search.js +874 -0
  484. package/dist/server/routes/session.d.ts +17 -0
  485. package/dist/server/routes/session.js +548 -0
  486. package/dist/server/routes/share.d.ts +18 -0
  487. package/dist/server/routes/share.js +462 -0
  488. package/dist/server/routes/smart-search/handlers/cars.d.ts +2 -0
  489. package/dist/server/routes/smart-search/handlers/cars.js +102 -0
  490. package/dist/server/routes/smart-search/handlers/flights.d.ts +2 -0
  491. package/dist/server/routes/smart-search/handlers/flights.js +72 -0
  492. package/dist/server/routes/smart-search/handlers/general.d.ts +13 -0
  493. package/dist/server/routes/smart-search/handlers/general.js +717 -0
  494. package/dist/server/routes/smart-search/handlers/hotels.d.ts +2 -0
  495. package/dist/server/routes/smart-search/handlers/hotels.js +88 -0
  496. package/dist/server/routes/smart-search/handlers/products.d.ts +2 -0
  497. package/dist/server/routes/smart-search/handlers/products.js +1309 -0
  498. package/dist/server/routes/smart-search/handlers/rental.d.ts +2 -0
  499. package/dist/server/routes/smart-search/handlers/rental.js +154 -0
  500. package/dist/server/routes/smart-search/handlers/restaurants.d.ts +2 -0
  501. package/dist/server/routes/smart-search/handlers/restaurants.js +225 -0
  502. package/dist/server/routes/smart-search/handlers/transit-verdict.d.ts +41 -0
  503. package/dist/server/routes/smart-search/handlers/transit-verdict.js +224 -0
  504. package/dist/server/routes/smart-search/index.d.ts +19 -0
  505. package/dist/server/routes/smart-search/index.js +546 -0
  506. package/dist/server/routes/smart-search/intent.d.ts +3 -0
  507. package/dist/server/routes/smart-search/intent.js +264 -0
  508. package/dist/server/routes/smart-search/llm.d.ts +16 -0
  509. package/dist/server/routes/smart-search/llm.js +70 -0
  510. package/dist/server/routes/smart-search/sources/reddit.d.ts +18 -0
  511. package/dist/server/routes/smart-search/sources/reddit.js +34 -0
  512. package/dist/server/routes/smart-search/sources/yelp.d.ts +25 -0
  513. package/dist/server/routes/smart-search/sources/yelp.js +171 -0
  514. package/dist/server/routes/smart-search/sources/youtube.d.ts +8 -0
  515. package/dist/server/routes/smart-search/sources/youtube.js +9 -0
  516. package/dist/server/routes/smart-search/types.d.ts +81 -0
  517. package/dist/server/routes/smart-search/types.js +1 -0
  518. package/dist/server/routes/smart-search/utils.d.ts +20 -0
  519. package/dist/server/routes/smart-search/utils.js +146 -0
  520. package/dist/server/routes/stats.d.ts +6 -0
  521. package/dist/server/routes/stats.js +71 -0
  522. package/dist/server/routes/stripe.d.ts +15 -0
  523. package/dist/server/routes/stripe.js +296 -0
  524. package/dist/server/routes/transcript-export.d.ts +10 -0
  525. package/dist/server/routes/transcript-export.js +178 -0
  526. package/dist/server/routes/usage.d.ts +9 -0
  527. package/dist/server/routes/usage.js +279 -0
  528. package/dist/server/routes/users.d.ts +8 -0
  529. package/dist/server/routes/users.js +1867 -0
  530. package/dist/server/routes/watch.d.ts +15 -0
  531. package/dist/server/routes/watch.js +309 -0
  532. package/dist/server/routes/webhooks.d.ts +26 -0
  533. package/dist/server/routes/webhooks.js +170 -0
  534. package/dist/server/routes/youtube.d.ts +6 -0
  535. package/dist/server/routes/youtube.js +130 -0
  536. package/dist/server/sentry.d.ts +14 -0
  537. package/dist/server/sentry.js +104 -0
  538. package/dist/server/types.d.ts +15 -0
  539. package/dist/server/types.js +7 -0
  540. package/dist/server/utils/response.d.ts +44 -0
  541. package/dist/server/utils/response.js +69 -0
  542. package/dist/server/utils/sse.d.ts +22 -0
  543. package/dist/server/utils/sse.js +38 -0
  544. package/dist/types.d.ts +552 -0
  545. package/dist/types.js +39 -0
  546. package/llms.txt +105 -0
  547. package/package.json +189 -0
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Synonym expansion for query broadening.
3
+ *
4
+ * Provides stemmed synonym groups and a function to expand a set of stemmed
5
+ * query tokens with related synonyms (at a lower weight).
6
+ *
7
+ * Usage:
8
+ * const queryTerms = tokenizeQuestion(question); // already stemmed
9
+ * const expanded = expandWithSynonyms(queryTerms);
10
+ * // expanded includes originals (weight=1.0) + synonyms (weight=0.5)
11
+ */
12
+ import { stem } from './stemmer.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Synonym groups (raw, unstemmed)
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Raw synonym groups. Each group is a set of words with equivalent or near-
18
+ * equivalent meaning in the context of software/web documentation queries.
19
+ *
20
+ * These are stored in unstemmed form for readability; the build process stems
21
+ * them into STEMMED_SYNONYM_GROUPS and builds an index.
22
+ */
23
+ export const SYNONYM_GROUPS = [
24
+ // Price/cost
25
+ ['price', 'cost', 'fee', 'charge', 'rate', 'pricing', 'subscription', 'plan'],
26
+ // Create/build
27
+ ['create', 'build', 'make', 'develop', 'construct', 'design', 'author', 'write', 'conceive'],
28
+ // Fast/quick
29
+ ['fast', 'quick', 'rapid', 'speedy', 'swift', 'performant', 'efficient'],
30
+ // Big/large
31
+ ['big', 'large', 'huge', 'enormous', 'massive', 'significant', 'substantial'],
32
+ // Small/tiny
33
+ ['small', 'tiny', 'little', 'minor', 'minimal', 'compact', 'lightweight'],
34
+ // Error/bug
35
+ ['error', 'bug', 'issue', 'problem', 'fault', 'defect', 'failure', 'crash'],
36
+ // Start/begin
37
+ ['start', 'begin', 'launch', 'initiate', 'commence', 'found', 'establish', 'release', 'introduce'],
38
+ // Stop/end
39
+ ['stop', 'end', 'finish', 'terminate', 'halt', 'cease', 'conclude'],
40
+ // Use/utilize
41
+ ['use', 'utilize', 'employ', 'leverage', 'apply', 'adopt'],
42
+ // Help/assist
43
+ ['help', 'assist', 'support', 'aid', 'guide', 'facilitate'],
44
+ // Show/display
45
+ ['show', 'display', 'render', 'present', 'exhibit', 'demonstrate'],
46
+ // Get/obtain
47
+ ['get', 'obtain', 'acquire', 'retrieve', 'fetch', 'receive', 'gain'],
48
+ // Send/transmit
49
+ ['send', 'transmit', 'deliver', 'dispatch', 'forward', 'emit'],
50
+ // Change/modify
51
+ ['change', 'modify', 'alter', 'update', 'revise', 'adjust', 'edit'],
52
+ // Delete/remove
53
+ ['delete', 'remove', 'eliminate', 'erase', 'clear', 'purge', 'drop'],
54
+ // Allow/permit
55
+ ['allow', 'permit', 'enable', 'authorize', 'grant', 'let'],
56
+ // Prevent/block
57
+ ['prevent', 'block', 'prohibit', 'restrict', 'deny', 'forbid', 'disable'],
58
+ // Location/place
59
+ ['location', 'place', 'position', 'site', 'area', 'region', 'spot'],
60
+ // Person/individual
61
+ ['person', 'individual', 'user', 'member', 'participant', 'developer'],
62
+ // Feature/capability
63
+ ['feature', 'capability', 'functionality', 'ability', 'function', 'capacity'],
64
+ // Limit/restrict
65
+ ['limit', 'restrict', 'constrain', 'cap', 'bound', 'throttle'],
66
+ // Install/setup
67
+ ['install', 'setup', 'configure', 'deploy', 'provision'],
68
+ // Compare/contrast
69
+ ['compare', 'contrast', 'versus', 'differ', 'distinction', 'difference'],
70
+ // Require/need
71
+ ['require', 'need', 'demand', 'necessitate', 'depend'],
72
+ // Advantage/benefit/feature
73
+ ['advantage', 'benefit', 'pro', 'strength', 'upside', 'merit', 'feature', 'perk'],
74
+ // Disadvantage/drawback
75
+ ['disadvantage', 'drawback', 'con', 'weakness', 'downside', 'limitation'],
76
+ // Learn/study
77
+ ['learn', 'study', 'understand', 'explore', 'discover', 'research'],
78
+ // Test/verify
79
+ ['test', 'verify', 'validate', 'check', 'confirm', 'inspect'],
80
+ // Connect/integrate
81
+ ['connect', 'integrate', 'link', 'combine', 'join', 'merge', 'attach'],
82
+ // Document/describe
83
+ ['document', 'describe', 'explain', 'detail', 'outline', 'specify'],
84
+ // Improve/optimize
85
+ ['improve', 'optimize', 'enhance', 'upgrade', 'refine', 'boost'],
86
+ // Location state (where questions)
87
+ ['base', 'headquarter', 'locate', 'situate'],
88
+ // Software referents (helps with coreference)
89
+ ['platform', 'service', 'product', 'tool', 'application', 'system', 'software'],
90
+ // Movement/direction
91
+ ['move', 'transfer', 'migrate', 'shift', 'relocate', 'transition'],
92
+ // Exist/available
93
+ ['exist', 'available', 'present', 'accessible', 'offered'],
94
+ // Medical/health
95
+ ['symptom', 'sign', 'indication', 'manifestation'],
96
+ ['treatment', 'therapy', 'cure', 'remedy', 'medication', 'medicine'],
97
+ ['diagnosis', 'assessment', 'evaluation', 'examination'],
98
+ ['disease', 'illness', 'condition', 'disorder', 'ailment', 'sickness'],
99
+ // Financial/business
100
+ ['revenue', 'income', 'earnings', 'sales', 'turnover'],
101
+ ['expense', 'cost', 'spending', 'expenditure', 'outlay'],
102
+ ['profit', 'gain', 'return', 'margin', 'surplus'],
103
+ ['invest', 'fund', 'finance', 'capitalize', 'back'],
104
+ // Importance/significance
105
+ ['important', 'significant', 'crucial', 'critical', 'vital', 'essential', 'key'],
106
+ ['minor', 'trivial', 'negligible', 'insignificant', 'marginal'],
107
+ // Communication
108
+ ['say', 'state', 'declare', 'announce', 'claim', 'assert', 'mention'],
109
+ ['ask', 'question', 'inquire', 'query', 'request'],
110
+ ['answer', 'reply', 'respond', 'response'],
111
+ // Think/believe
112
+ ['think', 'believe', 'consider', 'regard', 'view', 'deem'],
113
+ ['decide', 'determine', 'conclude', 'resolve', 'settle'],
114
+ // Outcome/result
115
+ ['result', 'outcome', 'consequence', 'effect', 'impact', 'aftermath'],
116
+ ['cause', 'reason', 'factor', 'trigger', 'source', 'origin'],
117
+ // Amount/quantity
118
+ ['many', 'numerous', 'several', 'multiple', 'various', 'countless'],
119
+ ['few', 'scarce', 'rare', 'limited', 'sparse'],
120
+ // Time
121
+ ['before', 'prior', 'previous', 'preceding', 'earlier', 'former'],
122
+ ['after', 'subsequent', 'following', 'later', 'next', 'succeeding'],
123
+ ['recent', 'latest', 'newest', 'current', 'contemporary', 'modern'],
124
+ ['old', 'ancient', 'historical', 'legacy', 'outdated', 'obsolete'],
125
+ ];
126
+ // ---------------------------------------------------------------------------
127
+ // Build stemmed synonym index
128
+ // ---------------------------------------------------------------------------
129
+ /**
130
+ * Stemmed synonym groups.
131
+ * Each word in each group has been run through the Porter stemmer.
132
+ * Duplicate stems within a group are deduplicated.
133
+ */
134
+ export const STEMMED_SYNONYM_GROUPS = SYNONYM_GROUPS.map(group => {
135
+ const stemmed = group.map(w => stem(w));
136
+ // Deduplicate (multiple words may stem to the same root)
137
+ return [...new Set(stemmed)];
138
+ });
139
+ /**
140
+ * Index: stemmed_word → set of other stemmed words in the same group.
141
+ * A word may appear in only one group (first match wins if duplicates exist).
142
+ */
143
+ const synonymIndex = new Map();
144
+ for (const group of STEMMED_SYNONYM_GROUPS) {
145
+ for (const word of group) {
146
+ if (!synonymIndex.has(word)) {
147
+ // Store all OTHER words in the group as synonyms
148
+ const others = new Set(group.filter(w => w !== word));
149
+ synonymIndex.set(word, others);
150
+ }
151
+ }
152
+ }
153
+ /**
154
+ * Expand a list of stemmed query tokens with their synonyms.
155
+ *
156
+ * @param terms - Already-stemmed tokens from the query
157
+ * @returns Array of ExpandedTerm objects. Original terms have weight=1.0,
158
+ * synonym expansions have weight=0.5.
159
+ * The returned array preserves originals first, then synonyms.
160
+ */
161
+ export function expandWithSynonyms(terms) {
162
+ const result = [];
163
+ const seen = new Set();
164
+ // Add all original terms first
165
+ for (const term of terms) {
166
+ if (!seen.has(term)) {
167
+ seen.add(term);
168
+ result.push({ term, weight: 1.0, isOriginal: true });
169
+ }
170
+ }
171
+ // Add synonyms for each original term
172
+ for (const term of terms) {
173
+ const synonyms = synonymIndex.get(term);
174
+ if (!synonyms)
175
+ continue;
176
+ for (const syn of synonyms) {
177
+ if (!seen.has(syn)) {
178
+ seen.add(syn);
179
+ result.push({ term: syn, weight: 0.5, isOriginal: false });
180
+ }
181
+ }
182
+ }
183
+ return result;
184
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * System resource monitor — cgroup-aware for K8s containers.
3
+ *
4
+ * In K8s, os.freemem() gives WRONG numbers because it reads host memory,
5
+ * not the container's cgroup limit. We read /sys/fs/cgroup directly.
6
+ *
7
+ * Three-tier memory management (from Crawl4AI):
8
+ * - Normal: < threshold (85%) — accept all jobs
9
+ * - Pressure: >= threshold (85%) — log warning, reject new render jobs
10
+ * - Critical: >= critical (95%) — reject ALL new jobs
11
+ *
12
+ * Also tracks: CPU usage, connection count, uptime.
13
+ */
14
+ export interface SystemHealth {
15
+ memory: {
16
+ usedBytes: number;
17
+ totalBytes: number;
18
+ usedPercent: number;
19
+ tier: 'normal' | 'pressure' | 'critical';
20
+ };
21
+ uptime: number;
22
+ isK8s: boolean;
23
+ canAcceptJob: boolean;
24
+ canAcceptRenderJob: boolean;
25
+ }
26
+ export interface SystemMonitorOptions {
27
+ memoryThresholdPercent?: number;
28
+ criticalThresholdPercent?: number;
29
+ recoveryThresholdPercent?: number;
30
+ }
31
+ declare class SystemMonitor {
32
+ private readonly IS_K8S;
33
+ private readonly MEM_CURRENT;
34
+ private readonly MEM_MAX;
35
+ private readonly MEM_CURRENT_V1;
36
+ private readonly MEM_MAX_V1;
37
+ private memoryThreshold;
38
+ private criticalThreshold;
39
+ private recoveryThreshold;
40
+ private inPressureMode;
41
+ private readonly startTime;
42
+ private consecutiveRejects;
43
+ private readonly MAX_CONSECUTIVE_REJECTS;
44
+ constructor(options?: SystemMonitorOptions);
45
+ /** Read memory from cgroups (K8s) or OS */
46
+ getMemoryUsage(): {
47
+ usedBytes: number;
48
+ totalBytes: number;
49
+ usedPercent: number;
50
+ };
51
+ private readCgroupMemory;
52
+ /** Get full health snapshot */
53
+ getHealth(): SystemHealth;
54
+ /** Quick check: can we accept a new job? */
55
+ canAccept(requireRender?: boolean): boolean;
56
+ /** Check if the worker appears stalled */
57
+ isStalled(): boolean;
58
+ }
59
+ /** Singleton system monitor */
60
+ export declare const systemMonitor: SystemMonitor;
61
+ export {};
@@ -0,0 +1,133 @@
1
+ /**
2
+ * System resource monitor — cgroup-aware for K8s containers.
3
+ *
4
+ * In K8s, os.freemem() gives WRONG numbers because it reads host memory,
5
+ * not the container's cgroup limit. We read /sys/fs/cgroup directly.
6
+ *
7
+ * Three-tier memory management (from Crawl4AI):
8
+ * - Normal: < threshold (85%) — accept all jobs
9
+ * - Pressure: >= threshold (85%) — log warning, reject new render jobs
10
+ * - Critical: >= critical (95%) — reject ALL new jobs
11
+ *
12
+ * Also tracks: CPU usage, connection count, uptime.
13
+ */
14
+ import { readFileSync, existsSync } from 'fs';
15
+ import os from 'os';
16
+ import { createLogger } from './logger.js';
17
+ const log = createLogger('monitor');
18
+ class SystemMonitor {
19
+ IS_K8S;
20
+ MEM_CURRENT = '/sys/fs/cgroup/memory.current';
21
+ MEM_MAX = '/sys/fs/cgroup/memory.max';
22
+ // cgroup v1 fallback paths
23
+ MEM_CURRENT_V1 = '/sys/fs/cgroup/memory/memory.usage_in_bytes';
24
+ MEM_MAX_V1 = '/sys/fs/cgroup/memory/memory.limit_in_bytes';
25
+ memoryThreshold;
26
+ criticalThreshold;
27
+ recoveryThreshold;
28
+ inPressureMode = false;
29
+ startTime = Date.now();
30
+ consecutiveRejects = 0;
31
+ MAX_CONSECUTIVE_REJECTS = 25; // Firecrawl-style stall detection
32
+ constructor(options = {}) {
33
+ this.memoryThreshold = (options.memoryThresholdPercent ?? 85) / 100;
34
+ this.criticalThreshold = (options.criticalThresholdPercent ?? 95) / 100;
35
+ this.recoveryThreshold = (options.recoveryThresholdPercent ?? 80) / 100;
36
+ // Detect K8s by checking for cgroup files
37
+ this.IS_K8S = existsSync(this.MEM_CURRENT) || existsSync(this.MEM_CURRENT_V1);
38
+ if (this.IS_K8S) {
39
+ log.info('K8s cgroup memory monitoring active');
40
+ }
41
+ else {
42
+ log.info('Using OS-level memory monitoring (non-K8s)');
43
+ }
44
+ }
45
+ /** Read memory from cgroups (K8s) or OS */
46
+ getMemoryUsage() {
47
+ if (this.IS_K8S) {
48
+ return this.readCgroupMemory();
49
+ }
50
+ const total = os.totalmem();
51
+ const free = os.freemem();
52
+ const used = total - free;
53
+ return { usedBytes: used, totalBytes: total, usedPercent: used / total };
54
+ }
55
+ readCgroupMemory() {
56
+ try {
57
+ // Try cgroup v2 first, then v1
58
+ let currentPath = this.MEM_CURRENT;
59
+ let maxPath = this.MEM_MAX;
60
+ if (!existsSync(currentPath)) {
61
+ currentPath = this.MEM_CURRENT_V1;
62
+ maxPath = this.MEM_MAX_V1;
63
+ }
64
+ const current = parseInt(readFileSync(currentPath, 'utf8').trim(), 10);
65
+ const maxStr = readFileSync(maxPath, 'utf8').trim();
66
+ // 'max' in cgroup v2 means no limit set
67
+ const max = maxStr === 'max' || parseInt(maxStr, 10) > os.totalmem() * 10
68
+ ? os.totalmem()
69
+ : parseInt(maxStr, 10);
70
+ return { usedBytes: current, totalBytes: max, usedPercent: current / max };
71
+ }
72
+ catch (err) {
73
+ // Fallback to OS-level if cgroup read fails
74
+ log.warn('Failed to read cgroup memory, falling back to OS-level');
75
+ const total = os.totalmem();
76
+ const free = os.freemem();
77
+ const used = total - free;
78
+ return { usedBytes: used, totalBytes: total, usedPercent: used / total };
79
+ }
80
+ }
81
+ /** Get full health snapshot */
82
+ getHealth() {
83
+ const mem = this.getMemoryUsage();
84
+ // Three-tier memory management with hysteresis
85
+ let tier;
86
+ if (mem.usedPercent >= this.criticalThreshold) {
87
+ tier = 'critical';
88
+ this.inPressureMode = true;
89
+ }
90
+ else if (mem.usedPercent >= this.memoryThreshold) {
91
+ tier = 'pressure';
92
+ this.inPressureMode = true;
93
+ }
94
+ else if (this.inPressureMode && mem.usedPercent > this.recoveryThreshold) {
95
+ // Hysteresis: stay in pressure until we drop below recovery threshold
96
+ tier = 'pressure';
97
+ }
98
+ else {
99
+ tier = 'normal';
100
+ this.inPressureMode = false;
101
+ }
102
+ const canAcceptJob = tier !== 'critical';
103
+ const canAcceptRenderJob = tier === 'normal'; // render jobs use more memory
104
+ // Track consecutive rejects for stall detection
105
+ if (!canAcceptJob) {
106
+ this.consecutiveRejects++;
107
+ if (this.consecutiveRejects >= this.MAX_CONSECUTIVE_REJECTS) {
108
+ log.error(`WORKER STALLED — ${this.consecutiveRejects} consecutive job rejections. Memory: ${(mem.usedPercent * 100).toFixed(1)}%`);
109
+ }
110
+ }
111
+ else {
112
+ this.consecutiveRejects = 0;
113
+ }
114
+ return {
115
+ memory: { ...mem, tier },
116
+ uptime: (Date.now() - this.startTime) / 1000,
117
+ isK8s: this.IS_K8S,
118
+ canAcceptJob,
119
+ canAcceptRenderJob,
120
+ };
121
+ }
122
+ /** Quick check: can we accept a new job? */
123
+ canAccept(requireRender = false) {
124
+ const health = this.getHealth();
125
+ return requireRender ? health.canAcceptRenderJob : health.canAcceptJob;
126
+ }
127
+ /** Check if the worker appears stalled */
128
+ isStalled() {
129
+ return this.consecutiveRejects >= this.MAX_CONSECUTIVE_REJECTS;
130
+ }
131
+ }
132
+ /** Singleton system monitor */
133
+ export const systemMonitor = new SystemMonitor();
@@ -0,0 +1,30 @@
1
+ /**
2
+ * ASCII table renderer using Unicode box-drawing characters.
3
+ *
4
+ * Renders an array of objects (e.g. {@link ListingItem}) as a neatly formatted
5
+ * table with auto-sized columns.
6
+ *
7
+ * @module table-format
8
+ */
9
+ /**
10
+ * Render an array of row objects as a Unicode box-drawing table.
11
+ *
12
+ * Column order follows the insertion order of keys in the first row.
13
+ * Columns with exclusively `undefined`/empty values are omitted.
14
+ *
15
+ * @param rows - Array of plain objects.
16
+ * @param columns - Optional explicit column keys to include (in order).
17
+ * @returns Multi-line string ready for `console.log`.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { formatTable } from './table-format.js';
22
+ *
23
+ * const table = formatTable([
24
+ * { title: 'Widget A', price: '$10' },
25
+ * { title: 'Widget B', price: '$20' },
26
+ * ]);
27
+ * console.log(table);
28
+ * ```
29
+ */
30
+ export declare function formatTable(rows: Record<string, string | undefined>[], columns?: string[]): string;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * ASCII table renderer using Unicode box-drawing characters.
3
+ *
4
+ * Renders an array of objects (e.g. {@link ListingItem}) as a neatly formatted
5
+ * table with auto-sized columns.
6
+ *
7
+ * @module table-format
8
+ */
9
+ /* ------------------------------------------------------------------ */
10
+ /* Box-drawing character set */
11
+ /* ------------------------------------------------------------------ */
12
+ const BOX = {
13
+ topLeft: '┌',
14
+ topRight: '┐',
15
+ bottomLeft: '└',
16
+ bottomRight: '┘',
17
+ horizontal: '─',
18
+ vertical: '│',
19
+ teeDown: '┬',
20
+ teeUp: '┴',
21
+ teeRight: '├',
22
+ teeLeft: '┤',
23
+ cross: '┼',
24
+ };
25
+ /* ------------------------------------------------------------------ */
26
+ /* Helpers */
27
+ /* ------------------------------------------------------------------ */
28
+ const MAX_COL_WIDTH = 40;
29
+ const MIN_COL_WIDTH = 3;
30
+ /**
31
+ * Truncate a string to `max` visible characters. Adds `…` if truncated.
32
+ */
33
+ function truncate(s, max) {
34
+ if (s.length <= max)
35
+ return s;
36
+ return s.slice(0, max - 1) + '…';
37
+ }
38
+ /**
39
+ * Pad (right) a string to `width` characters.
40
+ */
41
+ function padRight(s, width) {
42
+ if (s.length >= width)
43
+ return s;
44
+ return s + ' '.repeat(width - s.length);
45
+ }
46
+ /**
47
+ * Capitalise the first letter of a string.
48
+ */
49
+ function capitalise(s) {
50
+ if (!s)
51
+ return s;
52
+ return s.charAt(0).toUpperCase() + s.slice(1);
53
+ }
54
+ /* ------------------------------------------------------------------ */
55
+ /* Public API */
56
+ /* ------------------------------------------------------------------ */
57
+ /**
58
+ * Render an array of row objects as a Unicode box-drawing table.
59
+ *
60
+ * Column order follows the insertion order of keys in the first row.
61
+ * Columns with exclusively `undefined`/empty values are omitted.
62
+ *
63
+ * @param rows - Array of plain objects.
64
+ * @param columns - Optional explicit column keys to include (in order).
65
+ * @returns Multi-line string ready for `console.log`.
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * import { formatTable } from './table-format.js';
70
+ *
71
+ * const table = formatTable([
72
+ * { title: 'Widget A', price: '$10' },
73
+ * { title: 'Widget B', price: '$20' },
74
+ * ]);
75
+ * console.log(table);
76
+ * ```
77
+ */
78
+ export function formatTable(rows, columns) {
79
+ if (rows.length === 0)
80
+ return '';
81
+ // Determine columns: explicit list or derive from all rows
82
+ const cols = columns ?? deriveColumns(rows);
83
+ if (cols.length === 0)
84
+ return '';
85
+ // Build header labels
86
+ const headers = cols.map(c => capitalise(c));
87
+ // Compute column widths (bounded by MIN/MAX)
88
+ const widths = cols.map((col, i) => {
89
+ let max = headers[i].length;
90
+ for (const row of rows) {
91
+ const val = row[col] ?? '';
92
+ if (val.length > max)
93
+ max = val.length;
94
+ }
95
+ return Math.max(MIN_COL_WIDTH, Math.min(max, MAX_COL_WIDTH));
96
+ });
97
+ // Build lines
98
+ const lines = [];
99
+ // Top border
100
+ lines.push(BOX.topLeft +
101
+ widths.map(w => BOX.horizontal.repeat(w + 2)).join(BOX.teeDown) +
102
+ BOX.topRight);
103
+ // Header row
104
+ lines.push(BOX.vertical +
105
+ headers.map((h, i) => ' ' + padRight(truncate(h, widths[i]), widths[i]) + ' ').join(BOX.vertical) +
106
+ BOX.vertical);
107
+ // Separator
108
+ lines.push(BOX.teeRight +
109
+ widths.map(w => BOX.horizontal.repeat(w + 2)).join(BOX.cross) +
110
+ BOX.teeLeft);
111
+ // Data rows
112
+ for (const row of rows) {
113
+ lines.push(BOX.vertical +
114
+ cols.map((col, i) => {
115
+ const val = row[col] ?? '';
116
+ return ' ' + padRight(truncate(val, widths[i]), widths[i]) + ' ';
117
+ }).join(BOX.vertical) +
118
+ BOX.vertical);
119
+ }
120
+ // Bottom border
121
+ lines.push(BOX.bottomLeft +
122
+ widths.map(w => BOX.horizontal.repeat(w + 2)).join(BOX.teeUp) +
123
+ BOX.bottomRight);
124
+ return lines.join('\n');
125
+ }
126
+ /* ------------------------------------------------------------------ */
127
+ /* Internals */
128
+ /* ------------------------------------------------------------------ */
129
+ /**
130
+ * Derive the set of columns that have at least one non-empty value across
131
+ * all rows. Preserves insertion order from the first row that provides a key.
132
+ */
133
+ function deriveColumns(rows) {
134
+ const seen = new Set();
135
+ const order = [];
136
+ for (const row of rows) {
137
+ for (const key of Object.keys(row)) {
138
+ if (!seen.has(key)) {
139
+ seen.add(key);
140
+ order.push(key);
141
+ }
142
+ }
143
+ }
144
+ // Filter out columns that are entirely empty
145
+ return order.filter(col => rows.some(r => r[col] && r[col].trim().length > 0));
146
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Community threat intelligence feeds — cached in-memory, refreshed every 6 hours.
3
+ *
4
+ * Sources (all free, no API key):
5
+ * - URLhaus (abuse.ch): ~150K active malware distribution URLs
6
+ * API: https://urlhaus-api.abuse.ch/v1/url/ (POST with url=<url>)
7
+ * - PhishTank: community-verified phishing URLs
8
+ * API: https://checkurl.phishtank.com/checkurl/ (POST with url=<url>&format=json)
9
+ * - OpenPhish: curated phishing feed
10
+ * Feed: https://openphish.com/feed.txt (plain text, one URL per line, ~5K URLs)
11
+ *
12
+ * Strategy:
13
+ * - On startup, fetch OpenPhish feed into a Set (small, fast lookup)
14
+ * - For URLhaus and PhishTank, do real-time API lookups with 2s timeout
15
+ * - Cache results for 1 hour to avoid hammering APIs
16
+ */
17
+ export interface ThreatFeedResult {
18
+ safe: boolean;
19
+ threats: string[];
20
+ source: 'urlhaus' | 'phishtank' | 'openphish' | 'none';
21
+ details?: string;
22
+ }
23
+ export declare function checkThreatFeeds(url: string): Promise<ThreatFeedResult>;