recker 1.0.43 → 1.0.44

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 (459) hide show
  1. package/README.md +47 -0
  2. package/dist/bin/recker-linux-x64 +0 -0
  3. package/dist/bin/recker-macos-x64 +0 -0
  4. package/dist/bin/recker-win-x64.exe +0 -0
  5. package/dist/bin/rek.cjs +85152 -100207
  6. package/dist/browser/ai/adaptive-timeout.d.ts +50 -0
  7. package/dist/browser/ai/adaptive-timeout.js +208 -0
  8. package/dist/browser/ai/client.d.ts +22 -0
  9. package/dist/browser/ai/client.js +294 -0
  10. package/dist/browser/ai/index.d.ts +14 -0
  11. package/dist/browser/ai/index.js +11 -0
  12. package/dist/browser/ai/providers/anthropic.d.ts +63 -0
  13. package/dist/browser/ai/providers/anthropic.js +370 -0
  14. package/dist/browser/ai/providers/base.d.ts +48 -0
  15. package/dist/browser/ai/providers/base.js +150 -0
  16. package/dist/browser/ai/providers/google.d.ts +59 -0
  17. package/dist/browser/ai/providers/google.js +305 -0
  18. package/dist/browser/ai/providers/ollama.d.ts +44 -0
  19. package/dist/browser/ai/providers/ollama.js +240 -0
  20. package/dist/browser/ai/providers/openai.d.ts +64 -0
  21. package/dist/browser/ai/providers/openai.js +298 -0
  22. package/dist/browser/ai/rate-limiter.d.ts +43 -0
  23. package/dist/browser/ai/rate-limiter.js +215 -0
  24. package/dist/browser/ai/vector/index.d.ts +2 -0
  25. package/dist/browser/ai/vector/index.js +2 -0
  26. package/dist/browser/ai/vector/similarity.d.ts +2 -0
  27. package/dist/browser/ai/vector/similarity.js +27 -0
  28. package/dist/browser/ai/vector/store.d.ts +27 -0
  29. package/dist/browser/ai/vector/store.js +82 -0
  30. package/dist/browser/browser/cache.d.ts +2 -40
  31. package/dist/browser/browser/cache.js +2 -199
  32. package/dist/browser/browser/index.d.ts +8 -0
  33. package/dist/browser/browser/index.js +8 -0
  34. package/dist/browser/browser/recker.d.ts +8 -1
  35. package/dist/browser/browser/recker.js +8 -2
  36. package/dist/browser/cache/indexed-db.d.ts +10 -0
  37. package/dist/browser/cache/indexed-db.js +88 -0
  38. package/dist/browser/cache/service-worker-cache.d.ts +18 -0
  39. package/dist/browser/cache/service-worker-cache.js +103 -0
  40. package/dist/browser/cache.d.ts +2 -40
  41. package/dist/browser/cache.js +2 -199
  42. package/dist/browser/constants/user-agents.d.ts +7 -0
  43. package/dist/browser/constants/user-agents.js +7 -0
  44. package/dist/browser/core/client.d.ts +2 -0
  45. package/dist/browser/core/client.js +19 -1
  46. package/dist/browser/index.d.ts +8 -0
  47. package/dist/browser/index.js +8 -0
  48. package/dist/browser/plugins/har-recorder.d.ts +40 -0
  49. package/dist/browser/plugins/har-recorder.js +120 -0
  50. package/dist/browser/plugins/network-simulation.d.ts +7 -0
  51. package/dist/browser/plugins/network-simulation.js +13 -0
  52. package/dist/browser/presets/android.d.ts +2 -0
  53. package/dist/browser/presets/android.js +16 -0
  54. package/dist/browser/presets/anthropic.d.ts +8 -0
  55. package/dist/browser/presets/anthropic.js +27 -0
  56. package/dist/browser/presets/aws.d.ts +19 -0
  57. package/dist/browser/presets/aws.js +68 -0
  58. package/dist/browser/presets/azure-openai.d.ts +10 -0
  59. package/dist/browser/presets/azure-openai.js +35 -0
  60. package/dist/browser/presets/azure.d.ts +41 -0
  61. package/dist/browser/presets/azure.js +104 -0
  62. package/dist/browser/presets/chaturbate.d.ts +2 -0
  63. package/dist/browser/presets/chaturbate.js +17 -0
  64. package/dist/browser/presets/cloudflare.d.ts +12 -0
  65. package/dist/browser/presets/cloudflare.js +39 -0
  66. package/dist/browser/presets/cohere.d.ts +7 -0
  67. package/dist/browser/presets/cohere.js +22 -0
  68. package/dist/browser/presets/deepseek.d.ts +7 -0
  69. package/dist/browser/presets/deepseek.js +22 -0
  70. package/dist/browser/presets/digitalocean.d.ts +5 -0
  71. package/dist/browser/presets/digitalocean.js +16 -0
  72. package/dist/browser/presets/discord.d.ts +6 -0
  73. package/dist/browser/presets/discord.js +17 -0
  74. package/dist/browser/presets/elevenlabs.d.ts +6 -0
  75. package/dist/browser/presets/elevenlabs.js +20 -0
  76. package/dist/browser/presets/enhancers.d.ts +20 -0
  77. package/dist/browser/presets/enhancers.js +85 -0
  78. package/dist/browser/presets/fireworks.d.ts +7 -0
  79. package/dist/browser/presets/fireworks.js +22 -0
  80. package/dist/browser/presets/gcp.d.ts +34 -0
  81. package/dist/browser/presets/gcp.js +91 -0
  82. package/dist/browser/presets/gemini.d.ts +7 -0
  83. package/dist/browser/presets/gemini.js +23 -0
  84. package/dist/browser/presets/github.d.ts +6 -0
  85. package/dist/browser/presets/github.js +17 -0
  86. package/dist/browser/presets/gitlab.d.ts +6 -0
  87. package/dist/browser/presets/gitlab.js +16 -0
  88. package/dist/browser/presets/groq.d.ts +7 -0
  89. package/dist/browser/presets/groq.js +22 -0
  90. package/dist/browser/presets/hubspot.d.ts +9 -0
  91. package/dist/browser/presets/hubspot.js +28 -0
  92. package/dist/browser/presets/huggingface.d.ts +7 -0
  93. package/dist/browser/presets/huggingface.js +23 -0
  94. package/dist/browser/presets/index.d.ts +47 -0
  95. package/dist/browser/presets/index.js +47 -0
  96. package/dist/browser/presets/ios.d.ts +2 -0
  97. package/dist/browser/presets/ios.js +13 -0
  98. package/dist/browser/presets/linear.d.ts +5 -0
  99. package/dist/browser/presets/linear.js +16 -0
  100. package/dist/browser/presets/mailgun.d.ts +7 -0
  101. package/dist/browser/presets/mailgun.js +20 -0
  102. package/dist/browser/presets/meta.d.ts +10 -0
  103. package/dist/browser/presets/meta.js +33 -0
  104. package/dist/browser/presets/mistral.d.ts +7 -0
  105. package/dist/browser/presets/mistral.js +22 -0
  106. package/dist/browser/presets/notion.d.ts +6 -0
  107. package/dist/browser/presets/notion.js +17 -0
  108. package/dist/browser/presets/openai.d.ts +9 -0
  109. package/dist/browser/presets/openai.js +30 -0
  110. package/dist/browser/presets/oracle.d.ts +19 -0
  111. package/dist/browser/presets/oracle.js +117 -0
  112. package/dist/browser/presets/perplexity.d.ts +7 -0
  113. package/dist/browser/presets/perplexity.js +22 -0
  114. package/dist/browser/presets/pinecone.d.ts +8 -0
  115. package/dist/browser/presets/pinecone.js +42 -0
  116. package/dist/browser/presets/registry.d.ts +23 -0
  117. package/dist/browser/presets/registry.js +519 -0
  118. package/dist/browser/presets/replicate.d.ts +7 -0
  119. package/dist/browser/presets/replicate.js +23 -0
  120. package/dist/browser/presets/sendgrid.d.ts +6 -0
  121. package/dist/browser/presets/sendgrid.js +20 -0
  122. package/dist/browser/presets/sentry.d.ts +11 -0
  123. package/dist/browser/presets/sentry.js +48 -0
  124. package/dist/browser/presets/sinch.d.ts +9 -0
  125. package/dist/browser/presets/sinch.js +39 -0
  126. package/dist/browser/presets/slack.d.ts +5 -0
  127. package/dist/browser/presets/slack.js +16 -0
  128. package/dist/browser/presets/square.d.ts +10 -0
  129. package/dist/browser/presets/square.js +33 -0
  130. package/dist/browser/presets/stripe.d.ts +7 -0
  131. package/dist/browser/presets/stripe.js +23 -0
  132. package/dist/browser/presets/supabase.d.ts +6 -0
  133. package/dist/browser/presets/supabase.js +18 -0
  134. package/dist/browser/presets/tiktok.d.ts +10 -0
  135. package/dist/browser/presets/tiktok.js +38 -0
  136. package/dist/browser/presets/together.d.ts +7 -0
  137. package/dist/browser/presets/together.js +22 -0
  138. package/dist/browser/presets/twilio.d.ts +6 -0
  139. package/dist/browser/presets/twilio.js +17 -0
  140. package/dist/browser/presets/vercel.d.ts +6 -0
  141. package/dist/browser/presets/vercel.js +23 -0
  142. package/dist/browser/presets/vultr.d.ts +5 -0
  143. package/dist/browser/presets/vultr.js +16 -0
  144. package/dist/browser/presets/xai.d.ts +8 -0
  145. package/dist/browser/presets/xai.js +23 -0
  146. package/dist/browser/presets/youtube.d.ts +5 -0
  147. package/dist/browser/presets/youtube.js +20 -0
  148. package/dist/browser/recker.d.ts +8 -1
  149. package/dist/browser/recker.js +8 -2
  150. package/dist/browser/scrape/document.d.ts +5 -4
  151. package/dist/browser/scrape/document.js +89 -76
  152. package/dist/browser/scrape/element.d.ts +10 -8
  153. package/dist/browser/scrape/element.js +295 -81
  154. package/dist/browser/scrape/extractors.d.ts +11 -11
  155. package/dist/browser/scrape/extractors.js +145 -113
  156. package/dist/browser/scrape/parser/back.d.ts +1 -0
  157. package/dist/browser/scrape/parser/back.js +3 -0
  158. package/dist/browser/scrape/parser/index.d.ts +20 -0
  159. package/dist/browser/scrape/parser/index.js +19 -0
  160. package/dist/browser/scrape/parser/matcher.d.ts +30 -0
  161. package/dist/browser/scrape/parser/matcher.js +99 -0
  162. package/dist/browser/scrape/parser/nodes/comment.d.ts +12 -0
  163. package/dist/browser/scrape/parser/nodes/comment.js +21 -0
  164. package/dist/browser/scrape/parser/nodes/html.d.ts +110 -0
  165. package/dist/browser/scrape/parser/nodes/html.js +978 -0
  166. package/dist/browser/scrape/parser/nodes/node.d.ts +18 -0
  167. package/dist/browser/scrape/parser/nodes/node.js +31 -0
  168. package/dist/browser/scrape/parser/nodes/text.d.ts +14 -0
  169. package/dist/browser/scrape/parser/nodes/text.js +30 -0
  170. package/dist/browser/scrape/parser/nodes/type.d.ts +6 -0
  171. package/dist/browser/scrape/parser/nodes/type.js +7 -0
  172. package/dist/browser/scrape/parser/parse.d.ts +1 -0
  173. package/dist/browser/scrape/parser/parse.js +1 -0
  174. package/dist/browser/scrape/parser/valid.d.ts +2 -0
  175. package/dist/browser/scrape/parser/valid.js +5 -0
  176. package/dist/browser/scrape/parser/void-tag.d.ts +7 -0
  177. package/dist/browser/scrape/parser/void-tag.js +43 -0
  178. package/dist/browser/scrape/types.d.ts +7 -0
  179. package/dist/browser/seo/analyzer.d.ts +59 -0
  180. package/dist/browser/seo/analyzer.js +1399 -0
  181. package/dist/browser/seo/keywords.d.ts +16 -0
  182. package/dist/browser/seo/keywords.js +55 -0
  183. package/dist/browser/seo/rules/accessibility.d.ts +2 -0
  184. package/dist/browser/seo/rules/accessibility.js +733 -0
  185. package/dist/browser/seo/rules/ai-search.d.ts +2 -0
  186. package/dist/browser/seo/rules/ai-search.js +436 -0
  187. package/dist/browser/seo/rules/analytics.d.ts +2 -0
  188. package/dist/browser/seo/rules/analytics.js +306 -0
  189. package/dist/browser/seo/rules/best-practices.d.ts +2 -0
  190. package/dist/browser/seo/rules/best-practices.js +195 -0
  191. package/dist/browser/seo/rules/canonical.d.ts +12 -0
  192. package/dist/browser/seo/rules/canonical.js +270 -0
  193. package/dist/browser/seo/rules/content.d.ts +2 -0
  194. package/dist/browser/seo/rules/content.js +522 -0
  195. package/dist/browser/seo/rules/crawl.d.ts +2 -0
  196. package/dist/browser/seo/rules/crawl.js +435 -0
  197. package/dist/browser/seo/rules/cwv.d.ts +2 -0
  198. package/dist/browser/seo/rules/cwv.js +248 -0
  199. package/dist/browser/seo/rules/ecommerce.d.ts +2 -0
  200. package/dist/browser/seo/rules/ecommerce.js +312 -0
  201. package/dist/browser/seo/rules/i18n.d.ts +2 -0
  202. package/dist/browser/seo/rules/i18n.js +288 -0
  203. package/dist/browser/seo/rules/images.d.ts +2 -0
  204. package/dist/browser/seo/rules/images.js +255 -0
  205. package/dist/browser/seo/rules/index.d.ts +52 -0
  206. package/dist/browser/seo/rules/index.js +159 -0
  207. package/dist/browser/seo/rules/internal-linking.d.ts +2 -0
  208. package/dist/browser/seo/rules/internal-linking.js +394 -0
  209. package/dist/browser/seo/rules/links.d.ts +2 -0
  210. package/dist/browser/seo/rules/links.js +498 -0
  211. package/dist/browser/seo/rules/local.d.ts +2 -0
  212. package/dist/browser/seo/rules/local.js +289 -0
  213. package/dist/browser/seo/rules/meta.d.ts +2 -0
  214. package/dist/browser/seo/rules/meta.js +805 -0
  215. package/dist/browser/seo/rules/mobile.d.ts +2 -0
  216. package/dist/browser/seo/rules/mobile.js +161 -0
  217. package/dist/browser/seo/rules/performance.d.ts +2 -0
  218. package/dist/browser/seo/rules/performance.js +738 -0
  219. package/dist/browser/seo/rules/pwa.d.ts +2 -0
  220. package/dist/browser/seo/rules/pwa.js +299 -0
  221. package/dist/browser/seo/rules/readability.d.ts +2 -0
  222. package/dist/browser/seo/rules/readability.js +264 -0
  223. package/dist/browser/seo/rules/redirects.d.ts +16 -0
  224. package/dist/browser/seo/rules/redirects.js +199 -0
  225. package/dist/browser/seo/rules/resources.d.ts +2 -0
  226. package/dist/browser/seo/rules/resources.js +390 -0
  227. package/dist/browser/seo/rules/schema.d.ts +2 -0
  228. package/dist/browser/seo/rules/schema.js +379 -0
  229. package/dist/browser/seo/rules/security.d.ts +2 -0
  230. package/dist/browser/seo/rules/security.js +877 -0
  231. package/dist/browser/seo/rules/social.d.ts +2 -0
  232. package/dist/browser/seo/rules/social.js +603 -0
  233. package/dist/browser/seo/rules/structural.d.ts +2 -0
  234. package/dist/browser/seo/rules/structural.js +223 -0
  235. package/dist/browser/seo/rules/technical-advanced.d.ts +10 -0
  236. package/dist/browser/seo/rules/technical-advanced.js +289 -0
  237. package/dist/browser/seo/rules/technical.d.ts +2 -0
  238. package/dist/browser/seo/rules/technical.js +480 -0
  239. package/dist/browser/seo/rules/thresholds.d.ts +196 -0
  240. package/dist/browser/seo/rules/thresholds.js +118 -0
  241. package/dist/browser/seo/rules/types.d.ts +498 -0
  242. package/dist/browser/seo/rules/types.js +11 -0
  243. package/dist/browser/seo/types.d.ts +211 -0
  244. package/dist/browser/seo/types.js +1 -0
  245. package/dist/browser/transport/curl.d.ts +4 -0
  246. package/dist/browser/transport/curl.js +101 -0
  247. package/dist/browser/transport/undici.js +1 -2
  248. package/dist/browser/transport/worker.d.ts +18 -0
  249. package/dist/browser/transport/worker.js +278 -0
  250. package/dist/browser/types/index.d.ts +4 -1
  251. package/dist/browser/utils/binary-manager.d.ts +4 -0
  252. package/dist/browser/utils/binary-manager.js +72 -0
  253. package/dist/browser/utils/user-agent.js +2 -13
  254. package/dist/cache/indexed-db.d.ts +10 -0
  255. package/dist/cache/indexed-db.js +88 -0
  256. package/dist/cache/service-worker-cache.d.ts +18 -0
  257. package/dist/cache/service-worker-cache.js +103 -0
  258. package/dist/cli/commands/ai.d.ts +2 -0
  259. package/dist/cli/commands/ai.js +162 -0
  260. package/dist/cli/commands/bench.d.ts +2 -0
  261. package/dist/cli/commands/bench.js +51 -0
  262. package/dist/cli/commands/dns.d.ts +2 -0
  263. package/dist/cli/commands/dns.js +295 -0
  264. package/dist/cli/commands/har.d.ts +2 -0
  265. package/dist/cli/commands/har.js +171 -0
  266. package/dist/cli/commands/hls.d.ts +2 -0
  267. package/dist/cli/commands/hls.js +192 -0
  268. package/dist/cli/commands/network.d.ts +2 -0
  269. package/dist/cli/commands/network.js +288 -0
  270. package/dist/cli/commands/protocols.d.ts +2 -0
  271. package/dist/cli/commands/protocols.js +344 -0
  272. package/dist/cli/commands/scrape.d.ts +2 -0
  273. package/dist/cli/commands/scrape.js +176 -0
  274. package/dist/cli/commands/security.d.ts +2 -0
  275. package/dist/cli/commands/security.js +57 -0
  276. package/dist/cli/commands/seo.d.ts +2 -0
  277. package/dist/cli/commands/seo.js +125 -0
  278. package/dist/cli/commands/serve.d.ts +2 -0
  279. package/dist/cli/commands/serve.js +531 -0
  280. package/dist/cli/commands/spider.d.ts +3 -0
  281. package/dist/cli/commands/spider.js +456 -0
  282. package/dist/cli/commands/utils.d.ts +2 -0
  283. package/dist/cli/commands/utils.js +176 -0
  284. package/dist/cli/commands/vector.d.ts +2 -0
  285. package/dist/cli/commands/vector.js +158 -0
  286. package/dist/cli/handler.d.ts +2 -2
  287. package/dist/cli/handler.js +6 -6
  288. package/dist/cli/helpers.d.ts +7 -0
  289. package/dist/cli/helpers.js +128 -0
  290. package/dist/cli/index.js +96 -5228
  291. package/dist/cli/parser/help.d.ts +2 -0
  292. package/dist/cli/parser/help.js +52 -0
  293. package/dist/cli/parser/index.d.ts +3 -0
  294. package/dist/cli/parser/index.js +3 -0
  295. package/dist/cli/parser/parser.d.ts +4 -0
  296. package/dist/cli/parser/parser.js +146 -0
  297. package/dist/cli/parser/types.d.ts +41 -0
  298. package/dist/cli/parser/types.js +1 -0
  299. package/dist/cli/presets.d.ts +1 -1
  300. package/dist/cli/presets.js +1 -1
  301. package/dist/cli/router.d.ts +36 -0
  302. package/dist/cli/router.js +195 -0
  303. package/dist/cli/tui/ai-chat.js +1 -1
  304. package/dist/cli/tui/commands/context.d.ts +9 -0
  305. package/dist/cli/tui/commands/context.js +1 -0
  306. package/dist/cli/tui/commands/dns.d.ts +10 -0
  307. package/dist/cli/tui/commands/dns.js +461 -0
  308. package/dist/cli/tui/commands/hls.d.ts +2 -0
  309. package/dist/cli/tui/commands/hls.js +162 -0
  310. package/dist/cli/tui/commands/ip.d.ts +2 -0
  311. package/dist/cli/tui/commands/ip.js +45 -0
  312. package/dist/cli/tui/commands/network.d.ts +3 -0
  313. package/dist/cli/tui/commands/network.js +81 -0
  314. package/dist/cli/tui/commands/protocols.d.ts +6 -0
  315. package/dist/cli/tui/commands/protocols.js +531 -0
  316. package/dist/cli/tui/commands/security.d.ts +2 -0
  317. package/dist/cli/tui/commands/security.js +48 -0
  318. package/dist/cli/tui/commands/seo.d.ts +2 -0
  319. package/dist/cli/tui/commands/seo.js +74 -0
  320. package/dist/cli/tui/context.d.ts +12 -0
  321. package/dist/cli/tui/context.js +1 -0
  322. package/dist/cli/tui/shell.d.ts +11 -20
  323. package/dist/cli/tui/shell.js +216 -1873
  324. package/dist/constants/user-agents.d.ts +7 -0
  325. package/dist/constants/user-agents.js +7 -0
  326. package/dist/core/client.d.ts +2 -0
  327. package/dist/core/client.js +19 -1
  328. package/dist/index.d.ts +1 -0
  329. package/dist/index.js +1 -0
  330. package/dist/mcp/cli.js +2 -3
  331. package/dist/mcp/data/embeddings.json +1 -1
  332. package/dist/mcp/tools/network.js +298 -158
  333. package/dist/plugins/har-player.d.ts +23 -0
  334. package/dist/plugins/har-player.js +49 -0
  335. package/dist/plugins/har-recorder.d.ts +37 -3
  336. package/dist/plugins/har-recorder.js +116 -63
  337. package/dist/plugins/network-simulation.d.ts +7 -0
  338. package/dist/plugins/network-simulation.js +13 -0
  339. package/dist/presets/android.d.ts +2 -0
  340. package/dist/presets/android.js +16 -0
  341. package/dist/presets/chaturbate.d.ts +2 -0
  342. package/dist/presets/chaturbate.js +17 -0
  343. package/dist/presets/elevenlabs.d.ts +6 -0
  344. package/dist/presets/elevenlabs.js +20 -0
  345. package/dist/presets/enhancers.d.ts +20 -0
  346. package/dist/presets/enhancers.js +85 -0
  347. package/dist/presets/hubspot.d.ts +9 -0
  348. package/dist/presets/hubspot.js +28 -0
  349. package/dist/presets/index.d.ts +10 -0
  350. package/dist/presets/index.js +10 -0
  351. package/dist/presets/ios.d.ts +2 -0
  352. package/dist/presets/ios.js +13 -0
  353. package/dist/presets/pinecone.d.ts +8 -0
  354. package/dist/presets/pinecone.js +42 -0
  355. package/dist/presets/registry.js +60 -0
  356. package/dist/presets/sendgrid.d.ts +6 -0
  357. package/dist/presets/sendgrid.js +20 -0
  358. package/dist/presets/sentry.d.ts +11 -0
  359. package/dist/presets/sentry.js +48 -0
  360. package/dist/presets/square.d.ts +10 -0
  361. package/dist/presets/square.js +33 -0
  362. package/dist/recker.d.ts +3 -0
  363. package/dist/recker.js +4 -0
  364. package/dist/scrape/document.d.ts +5 -4
  365. package/dist/scrape/document.js +89 -76
  366. package/dist/scrape/element.d.ts +10 -8
  367. package/dist/scrape/element.js +295 -81
  368. package/dist/scrape/extractors.d.ts +11 -11
  369. package/dist/scrape/extractors.js +145 -113
  370. package/dist/scrape/index.d.ts +2 -0
  371. package/dist/scrape/index.js +1 -0
  372. package/dist/scrape/parser/back.d.ts +1 -0
  373. package/dist/scrape/parser/back.js +3 -0
  374. package/dist/scrape/parser/index.d.ts +20 -0
  375. package/dist/scrape/parser/index.js +19 -0
  376. package/dist/scrape/parser/matcher.d.ts +30 -0
  377. package/dist/scrape/parser/matcher.js +99 -0
  378. package/dist/scrape/parser/nodes/comment.d.ts +12 -0
  379. package/dist/scrape/parser/nodes/comment.js +21 -0
  380. package/dist/scrape/parser/nodes/html.d.ts +110 -0
  381. package/dist/scrape/parser/nodes/html.js +978 -0
  382. package/dist/scrape/parser/nodes/node.d.ts +18 -0
  383. package/dist/scrape/parser/nodes/node.js +31 -0
  384. package/dist/scrape/parser/nodes/text.d.ts +14 -0
  385. package/dist/scrape/parser/nodes/text.js +30 -0
  386. package/dist/scrape/parser/nodes/type.d.ts +6 -0
  387. package/dist/scrape/parser/nodes/type.js +7 -0
  388. package/dist/scrape/parser/parse.d.ts +1 -0
  389. package/dist/scrape/parser/parse.js +1 -0
  390. package/dist/scrape/parser/valid.d.ts +2 -0
  391. package/dist/scrape/parser/valid.js +5 -0
  392. package/dist/scrape/parser/void-tag.d.ts +7 -0
  393. package/dist/scrape/parser/void-tag.js +43 -0
  394. package/dist/scrape/spider.d.ts +19 -0
  395. package/dist/scrape/spider.js +28 -3
  396. package/dist/scrape/types.d.ts +7 -0
  397. package/dist/seo/analyzer.d.ts +15 -5
  398. package/dist/seo/analyzer.js +636 -175
  399. package/dist/seo/formatter.d.ts +16 -0
  400. package/dist/seo/formatter.js +228 -0
  401. package/dist/seo/index.d.ts +2 -0
  402. package/dist/seo/index.js +1 -0
  403. package/dist/seo/keywords.d.ts +16 -0
  404. package/dist/seo/keywords.js +55 -0
  405. package/dist/seo/rules/accessibility.js +96 -57
  406. package/dist/seo/rules/ai-search.js +44 -31
  407. package/dist/seo/rules/analytics.d.ts +2 -0
  408. package/dist/seo/rules/analytics.js +306 -0
  409. package/dist/seo/rules/best-practices.js +21 -14
  410. package/dist/seo/rules/canonical.js +53 -32
  411. package/dist/seo/rules/content.js +317 -31
  412. package/dist/seo/rules/crawl.js +55 -40
  413. package/dist/seo/rules/cwv.js +21 -15
  414. package/dist/seo/rules/ecommerce.js +82 -22
  415. package/dist/seo/rules/i18n.js +75 -36
  416. package/dist/seo/rules/images.js +109 -30
  417. package/dist/seo/rules/index.js +2 -0
  418. package/dist/seo/rules/internal-linking.js +58 -39
  419. package/dist/seo/rules/links.js +79 -52
  420. package/dist/seo/rules/local.js +49 -25
  421. package/dist/seo/rules/meta.js +339 -81
  422. package/dist/seo/rules/mobile.js +112 -2
  423. package/dist/seo/rules/performance.js +434 -66
  424. package/dist/seo/rules/pwa.js +36 -39
  425. package/dist/seo/rules/readability.js +31 -22
  426. package/dist/seo/rules/redirects.js +21 -15
  427. package/dist/seo/rules/resources.js +59 -42
  428. package/dist/seo/rules/schema.js +333 -8
  429. package/dist/seo/rules/security.js +142 -80
  430. package/dist/seo/rules/social.js +277 -47
  431. package/dist/seo/rules/structural.js +87 -19
  432. package/dist/seo/rules/technical-advanced.js +30 -24
  433. package/dist/seo/rules/technical.js +243 -42
  434. package/dist/seo/rules/types.d.ts +53 -1
  435. package/dist/seo/seo-spider.d.ts +22 -0
  436. package/dist/seo/seo-spider.js +77 -13
  437. package/dist/seo/types.d.ts +8 -1
  438. package/dist/seo/validators/llms-txt.js +19 -0
  439. package/dist/seo/validators/rss.d.ts +11 -0
  440. package/dist/seo/validators/rss.js +93 -0
  441. package/dist/seo/validators/sitemap.js +36 -26
  442. package/dist/transport/curl.d.ts +4 -0
  443. package/dist/transport/curl.js +101 -0
  444. package/dist/transport/udp.js +0 -1
  445. package/dist/transport/undici.js +1 -2
  446. package/dist/transport/worker.d.ts +18 -0
  447. package/dist/transport/worker.js +278 -0
  448. package/dist/types/index.d.ts +4 -1
  449. package/dist/utils/binary-manager.d.ts +4 -0
  450. package/dist/utils/binary-manager.js +72 -0
  451. package/dist/utils/optional-require.d.ts +7 -8
  452. package/dist/utils/optional-require.js +2 -21
  453. package/dist/utils/upload.d.ts +6 -0
  454. package/dist/utils/upload.js +11 -0
  455. package/dist/utils/user-agent.js +2 -13
  456. package/dist/version.js +1 -1
  457. package/package.json +12 -6
  458. package/dist/browser/utils/optional-require.d.ts +0 -19
  459. package/dist/browser/utils/optional-require.js +0 -105
@@ -1,8 +1,13 @@
1
1
  import { createClient } from '../../core/client.js';
2
- import { createDNS } from '../../dns/index.js';
3
2
  import { createWhois } from '../../utils/whois.js';
4
3
  import { createConnection } from 'net';
5
- const dnsClient = createDNS({ provider: 'system' });
4
+ import { exec } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { checkPropagation } from '../../dns/propagation.js';
7
+ import { checkDnsHealth, validateSpf, validateDmarc, checkDkim, dig, dnsLookup } from '../../utils/dns-toolkit.js';
8
+ import { inspectTLS } from '../../utils/tls-inspector.js';
9
+ import { rdap } from '../../utils/rdap.js';
10
+ const execAsync = promisify(exec);
6
11
  const whoisClient = createWhois();
7
12
  async function httpRequest(args) {
8
13
  const url = String(args.url || '');
@@ -11,20 +16,10 @@ async function httpRequest(args) {
11
16
  const body = args.body;
12
17
  const timeout = Number(args.timeout) || 10000;
13
18
  const retries = Number(args.retries) || 0;
14
- if (!url) {
15
- return {
16
- content: [{ type: 'text', text: 'Error: url is required' }],
17
- isError: true,
18
- };
19
- }
19
+ if (!url)
20
+ return { content: [{ type: 'text', text: 'Error: url is required' }], isError: true };
20
21
  try {
21
- const client = createClient({
22
- headers,
23
- timeout,
24
- retry: {
25
- maxAttempts: retries,
26
- },
27
- });
22
+ const client = createClient({ headers, timeout, retry: { maxAttempts: retries } });
28
23
  let response;
29
24
  switch (method) {
30
25
  case 'GET':
@@ -45,223 +40,368 @@ async function httpRequest(args) {
45
40
  case 'HEAD':
46
41
  response = await client.head(url);
47
42
  break;
48
- default:
49
- return {
50
- content: [{ type: 'text', text: `Error: Unsupported method ${method}` }],
51
- isError: true,
52
- };
43
+ default: return { content: [{ type: 'text', text: `Error: Unsupported method ${method}` }], isError: true };
53
44
  }
54
- const responseHeaders = {};
55
- response.headers.forEach((val, key) => {
56
- responseHeaders[key] = val;
57
- });
58
45
  const result = {
59
46
  status: response.status,
60
47
  statusText: response.statusText,
61
- headers: responseHeaders,
48
+ headers: Object.fromEntries(response.headers.entries()),
62
49
  data: await response.text(),
63
50
  };
64
51
  try {
65
52
  result.data = JSON.parse(result.data);
66
53
  }
67
- catch {
68
- }
69
- return {
70
- content: [{
71
- type: 'text',
72
- text: JSON.stringify(result, null, 2),
73
- }],
74
- };
54
+ catch { }
55
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
75
56
  }
76
57
  catch (error) {
77
- return {
78
- content: [{
79
- type: 'text',
80
- text: `Request failed: ${error.message}`,
81
- }],
82
- isError: true,
83
- };
58
+ return { content: [{ type: 'text', text: `Request failed: ${error.message}` }], isError: true };
84
59
  }
85
60
  }
86
- async function dnsLookup(args) {
87
- const domain = String(args.domain || '');
88
- const type = String(args.type || 'A').toUpperCase();
89
- if (!domain) {
90
- return {
91
- content: [{ type: 'text', text: 'Error: domain is required' }],
92
- isError: true,
93
- };
61
+ async function dnsResolve(args) {
62
+ const domain = args.domain ? String(args.domain) : '';
63
+ const type = String(args.type || 'A');
64
+ if (!domain)
65
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
66
+ try {
67
+ const results = await dnsLookup(domain, type);
68
+ return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
94
69
  }
70
+ catch (error) {
71
+ return { content: [{ type: 'text', text: `DNS lookup failed: ${error.message}` }], isError: true };
72
+ }
73
+ }
74
+ async function dnsPropagate(args) {
75
+ const domain = args.domain ? String(args.domain) : '';
76
+ const type = String(args.type || 'A');
77
+ if (!domain)
78
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
95
79
  try {
96
- let result;
97
- if (type === 'ALL') {
98
- result = await dnsClient.resolveAll(domain);
99
- }
100
- else {
101
- result = await dnsClient.resolve(domain, type);
102
- }
103
- return {
104
- content: [{
105
- type: 'text',
106
- text: JSON.stringify({ domain, type, result }, null, 2),
107
- }],
108
- };
80
+ const results = await checkPropagation(domain, type);
81
+ return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
109
82
  }
110
83
  catch (error) {
111
- return {
112
- content: [{
113
- type: 'text',
114
- text: `DNS lookup failed: ${error.message}`,
115
- }],
116
- isError: true,
117
- };
84
+ return { content: [{ type: 'text', text: `Propagation check failed: ${error.message}` }], isError: true };
118
85
  }
119
86
  }
120
- async function whoisLookup(args) {
121
- const query = String(args.query || '');
122
- if (!query) {
123
- return {
124
- content: [{ type: 'text', text: 'Error: query is required' }],
125
- isError: true,
126
- };
87
+ async function dnsHealth(args) {
88
+ const domain = args.domain ? String(args.domain) : '';
89
+ if (!domain)
90
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
91
+ try {
92
+ const report = await checkDnsHealth(domain);
93
+ return { content: [{ type: 'text', text: JSON.stringify(report, null, 2) }] };
94
+ }
95
+ catch (error) {
96
+ return { content: [{ type: 'text', text: `Health check failed: ${error.message}` }], isError: true };
97
+ }
98
+ }
99
+ async function dnsSpf(args) {
100
+ const domain = args.domain ? String(args.domain) : '';
101
+ if (!domain)
102
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
103
+ try {
104
+ const result = await validateSpf(domain);
105
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
106
+ }
107
+ catch (error) {
108
+ return { content: [{ type: 'text', text: `SPF check failed: ${error.message}` }], isError: true };
109
+ }
110
+ }
111
+ async function dnsDmarc(args) {
112
+ const domain = args.domain ? String(args.domain) : '';
113
+ if (!domain)
114
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
115
+ try {
116
+ const result = await validateDmarc(domain);
117
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
118
+ }
119
+ catch (error) {
120
+ return { content: [{ type: 'text', text: `DMARC check failed: ${error.message}` }], isError: true };
127
121
  }
122
+ }
123
+ async function dnsDkim(args) {
124
+ const domain = args.domain ? String(args.domain) : '';
125
+ const selector = String(args.selector || 'default');
126
+ if (!domain)
127
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
128
+ try {
129
+ const result = await checkDkim(domain, selector);
130
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
131
+ }
132
+ catch (error) {
133
+ return { content: [{ type: 'text', text: `DKIM check failed: ${error.message}` }], isError: true };
134
+ }
135
+ }
136
+ async function dnsDig(args) {
137
+ const domain = args.domain ? String(args.domain) : '';
138
+ const type = String(args.type || 'A');
139
+ const server = args.server ? String(args.server) : undefined;
140
+ if (!domain)
141
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
142
+ try {
143
+ const result = await dig(domain, { type, server });
144
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
145
+ }
146
+ catch (error) {
147
+ return { content: [{ type: 'text', text: `Dig failed: ${error.message}` }], isError: true };
148
+ }
149
+ }
150
+ async function tlsCheck(args) {
151
+ const host = args.host ? String(args.host) : '';
152
+ const port = Number(args.port) || 443;
153
+ if (!host)
154
+ return { content: [{ type: 'text', text: 'Error: host is required' }], isError: true };
155
+ try {
156
+ const info = await inspectTLS(host, port);
157
+ return { content: [{ type: 'text', text: JSON.stringify(info, null, 2) }] };
158
+ }
159
+ catch (error) {
160
+ return { content: [{ type: 'text', text: `TLS check failed: ${error.message}` }], isError: true };
161
+ }
162
+ }
163
+ async function rdapCheck(args) {
164
+ const domain = args.domain ? String(args.domain) : '';
165
+ if (!domain)
166
+ return { content: [{ type: 'text', text: 'Error: domain is required' }], isError: true };
167
+ try {
168
+ const client = createClient();
169
+ const result = await rdap(client, domain);
170
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
171
+ }
172
+ catch (error) {
173
+ return { content: [{ type: 'text', text: `RDAP lookup failed: ${error.message}` }], isError: true };
174
+ }
175
+ }
176
+ async function whoisCheck(args) {
177
+ const query = args.query ? String(args.query) : '';
178
+ if (!query)
179
+ return { content: [{ type: 'text', text: 'Error: query is required' }], isError: true };
128
180
  try {
129
181
  const result = await whoisClient.lookup(query);
130
- return {
131
- content: [{
132
- type: 'text',
133
- text: JSON.stringify({
134
- server: result.server,
135
- data: result.data,
136
- }, null, 2),
137
- }],
138
- };
182
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
139
183
  }
140
184
  catch (error) {
141
- return {
142
- content: [{
143
- type: 'text',
144
- text: `WHOIS lookup failed: ${error.message}`,
145
- }],
146
- isError: true,
147
- };
185
+ return { content: [{ type: 'text', text: `WHOIS failed: ${error.message}` }], isError: true };
186
+ }
187
+ }
188
+ async function dnsSystemStatus(args) {
189
+ const platform = process.platform;
190
+ let cmd = '';
191
+ if (platform === 'linux')
192
+ cmd = 'resolvectl status';
193
+ else if (platform === 'darwin')
194
+ cmd = 'scutil --dns';
195
+ else if (platform === 'win32')
196
+ cmd = 'ipconfig /all';
197
+ else
198
+ return { content: [{ type: 'text', text: 'Unsupported platform' }], isError: true };
199
+ try {
200
+ const { stdout } = await execAsync(cmd);
201
+ return { content: [{ type: 'text', text: stdout }] };
202
+ }
203
+ catch (error) {
204
+ if (platform === 'linux') {
205
+ try {
206
+ const { stdout } = await execAsync('cat /etc/resolv.conf');
207
+ return { content: [{ type: 'text', text: stdout }] };
208
+ }
209
+ catch { }
210
+ }
211
+ return { content: [{ type: 'text', text: `Failed to get system DNS: ${error.message}` }], isError: true };
148
212
  }
149
213
  }
150
- async function ping(args) {
151
- const host = String(args.host || '');
214
+ async function pingCheck(args) {
215
+ const host = args.host ? String(args.host) : '';
216
+ const count = Number(args.count) || 3;
152
217
  const port = Number(args.port) || 80;
153
218
  const timeout = Number(args.timeout) || 5000;
154
- const count = Number(args.count) || 3;
155
- if (!host) {
156
- return {
157
- content: [{ type: 'text', text: 'Error: host is required' }],
158
- isError: true,
159
- };
160
- }
219
+ if (!host)
220
+ return { content: [{ type: 'text', text: 'Error: host is required' }], isError: true };
161
221
  const results = [];
162
222
  for (let i = 0; i < count; i++) {
163
223
  const start = Date.now();
164
224
  try {
165
225
  await new Promise((resolve, reject) => {
166
226
  const socket = createConnection({ host, port, timeout });
167
- socket.on('connect', () => {
168
- socket.destroy();
169
- resolve();
170
- });
171
- socket.on('timeout', () => {
172
- socket.destroy();
173
- reject(new Error('Timeout'));
174
- });
175
- socket.on('error', (err) => {
176
- socket.destroy();
177
- reject(err);
178
- });
227
+ socket.on('connect', () => { socket.destroy(); resolve(); });
228
+ socket.on('timeout', () => { socket.destroy(); reject(new Error('Timeout')); });
229
+ socket.on('error', (e) => { socket.destroy(); reject(e); });
179
230
  });
180
- results.push({ seq: i + 1, time: Date.now() - start });
231
+ results.push({ seq: i, time: Date.now() - start });
181
232
  }
182
- catch (error) {
183
- results.push({ seq: i + 1, error: error.message });
233
+ catch (e) {
234
+ results.push({ seq: i, error: e.message });
184
235
  }
185
- if (i < count - 1) {
236
+ if (i < count - 1)
186
237
  await new Promise(r => setTimeout(r, 200));
187
- }
188
238
  }
189
239
  const successful = results.filter(r => !r.error);
190
240
  const totalTime = successful.reduce((acc, r) => acc + (r.time || 0), 0);
191
241
  const avg = successful.length > 0 ? totalTime / successful.length : 0;
192
- return {
193
- content: [{
194
- type: 'text',
195
- text: JSON.stringify({
242
+ return { content: [{ type: 'text', text: JSON.stringify({
196
243
  host,
197
244
  port,
198
245
  sent: count,
199
246
  received: successful.length,
200
- loss: `${((count - successful.length) / count * 100).toFixed(1)}%`,
201
- avgLatency: `${avg.toFixed(2)}ms`,
202
- details: results,
203
- }, null, 2),
204
- }],
205
- };
247
+ loss: count > 0 ? ((count - successful.length) / count * 100) : 0,
248
+ avgLatency: avg,
249
+ details: results
250
+ }, null, 2) }] };
206
251
  }
207
252
  export const networkTools = [
208
253
  {
209
254
  name: 'rek_http_request',
210
- description: 'Perform an HTTP request to any URL using Recker\'s robust client. Supports all methods, headers, and automatic JSON parsing.',
255
+ description: 'Perform HTTP request. Useful for calling APIs, fetching pages, etc.',
211
256
  inputSchema: {
212
257
  type: 'object',
213
258
  properties: {
214
- url: { type: 'string', description: 'Target URL' },
215
- method: { type: 'string', description: 'HTTP method (GET, POST, PUT, DELETE, etc.)', default: 'GET' },
216
- headers: { type: 'object', description: 'Request headers' },
217
- body: { type: 'object', description: 'JSON body for POST/PUT/PATCH' },
218
- timeout: { type: 'number', description: 'Timeout in ms', default: 10000 },
219
- retries: { type: 'number', description: 'Number of retries', default: 0 },
259
+ url: { type: 'string' },
260
+ method: { type: 'string', default: 'GET' },
261
+ headers: { type: 'object' },
262
+ body: { type: 'object' }
220
263
  },
221
- required: ['url'],
222
- },
264
+ required: ['url']
265
+ }
223
266
  },
224
267
  {
225
- name: 'rek_dns_lookup',
226
- description: 'Resolve DNS records for a domain. Supports A, AAAA, MX, TXT, NS, etc.',
268
+ name: 'rek_dns',
269
+ description: 'Resolve DNS records (A, AAAA, MX, TXT, etc) using system resolver.',
227
270
  inputSchema: {
228
271
  type: 'object',
229
272
  properties: {
230
- domain: { type: 'string', description: 'Domain name to resolve' },
231
- type: { type: 'string', description: 'Record type (A, AAAA, MX, TXT, NS, ALL)', default: 'A' },
273
+ domain: { type: 'string' },
274
+ type: { type: 'string', default: 'A' }
232
275
  },
233
- required: ['domain'],
234
- },
276
+ required: ['domain']
277
+ }
235
278
  },
236
279
  {
237
- name: 'rek_whois_lookup',
238
- description: 'Perform a WHOIS lookup for a domain or IP address to find registration info.',
280
+ name: 'rek_dns_propagate',
281
+ description: 'Check DNS propagation globally across multiple providers.',
239
282
  inputSchema: {
240
283
  type: 'object',
241
284
  properties: {
242
- query: { type: 'string', description: 'Domain or IP to lookup' },
285
+ domain: { type: 'string' },
286
+ type: { type: 'string', default: 'A' }
243
287
  },
244
- required: ['query'],
245
- },
288
+ required: ['domain']
289
+ }
246
290
  },
247
291
  {
248
- name: 'rek_network_ping',
249
- description: 'Check TCP connectivity to a host and port. Measures latency.',
292
+ name: 'rek_dns_health',
293
+ description: 'Perform a comprehensive DNS health check (Parent NS, SOAs, MX, etc).',
294
+ inputSchema: {
295
+ type: 'object',
296
+ properties: { domain: { type: 'string' } },
297
+ required: ['domain']
298
+ }
299
+ },
300
+ {
301
+ name: 'rek_dns_spf',
302
+ description: 'Validate SPF record for a domain.',
303
+ inputSchema: {
304
+ type: 'object',
305
+ properties: { domain: { type: 'string' } },
306
+ required: ['domain']
307
+ }
308
+ },
309
+ {
310
+ name: 'rek_dns_dmarc',
311
+ description: 'Validate DMARC record for a domain.',
312
+ inputSchema: {
313
+ type: 'object',
314
+ properties: { domain: { type: 'string' } },
315
+ required: ['domain']
316
+ }
317
+ },
318
+ {
319
+ name: 'rek_dns_dkim',
320
+ description: 'Check DKIM record presence.',
250
321
  inputSchema: {
251
322
  type: 'object',
252
323
  properties: {
253
- host: { type: 'string', description: 'Hostname or IP' },
254
- port: { type: 'number', description: 'Target port', default: 80 },
255
- count: { type: 'number', description: 'Number of pings', default: 3 },
256
- timeout: { type: 'number', description: 'Timeout per ping in ms', default: 5000 },
324
+ domain: { type: 'string' },
325
+ selector: { type: 'string', default: 'default' }
257
326
  },
258
- required: ['host'],
259
- },
327
+ required: ['domain']
328
+ }
260
329
  },
330
+ {
331
+ name: 'rek_dns_dig',
332
+ description: 'Advanced DNS lookup (like dig command) supporting specific nameservers.',
333
+ inputSchema: {
334
+ type: 'object',
335
+ properties: {
336
+ domain: { type: 'string' },
337
+ type: { type: 'string', default: 'A' },
338
+ server: { type: 'string', description: 'Optional specific nameserver to query (e.g. 8.8.8.8)' }
339
+ },
340
+ required: ['domain']
341
+ }
342
+ },
343
+ {
344
+ name: 'rek_dns_system',
345
+ description: 'Get system DNS configuration (local resolver status).',
346
+ inputSchema: { type: 'object', properties: {} }
347
+ },
348
+ {
349
+ name: 'rek_tls',
350
+ description: 'Inspect TLS/SSL certificate of a host.',
351
+ inputSchema: {
352
+ type: 'object',
353
+ properties: {
354
+ host: { type: 'string' },
355
+ port: { type: 'number', default: 443 }
356
+ },
357
+ required: ['host']
358
+ }
359
+ },
360
+ {
361
+ name: 'rek_whois',
362
+ description: 'Query WHOIS database for domain info.',
363
+ inputSchema: {
364
+ type: 'object',
365
+ properties: { query: { type: 'string' } },
366
+ required: ['query']
367
+ }
368
+ },
369
+ {
370
+ name: 'rek_rdap',
371
+ description: 'Query RDAP (modern WHOIS) for structured domain info.',
372
+ inputSchema: {
373
+ type: 'object',
374
+ properties: { domain: { type: 'string' } },
375
+ required: ['domain']
376
+ }
377
+ },
378
+ {
379
+ name: 'rek_ping',
380
+ description: 'TCP Ping a host:port to check connectivity.',
381
+ inputSchema: {
382
+ type: 'object',
383
+ properties: {
384
+ host: { type: 'string' },
385
+ port: { type: 'number', default: 80 },
386
+ count: { type: 'number', default: 3 },
387
+ timeout: { type: 'number', default: 5000 }
388
+ },
389
+ required: ['host']
390
+ }
391
+ }
261
392
  ];
262
393
  export const networkToolHandlers = {
263
394
  rek_http_request: httpRequest,
264
- rek_dns_lookup: dnsLookup,
265
- rek_whois_lookup: whoisLookup,
266
- rek_network_ping: ping,
395
+ rek_dns: dnsResolve,
396
+ rek_dns_propagate: dnsPropagate,
397
+ rek_dns_health: dnsHealth,
398
+ rek_dns_spf: dnsSpf,
399
+ rek_dns_dmarc: dnsDmarc,
400
+ rek_dns_dkim: dnsDkim,
401
+ rek_dns_dig: dnsDig,
402
+ rek_dns_system: dnsSystemStatus,
403
+ rek_tls: tlsCheck,
404
+ rek_whois: whoisCheck,
405
+ rek_rdap: rdapCheck,
406
+ rek_ping: pingCheck,
267
407
  };
@@ -1,6 +1,29 @@
1
1
  import { Plugin } from '../types/index.js';
2
+ import type { Client } from '../core/client.js';
2
3
  export interface HarPlayerOptions {
3
4
  path: string;
4
5
  strict?: boolean;
5
6
  }
6
7
  export declare function harPlayerPlugin(options: HarPlayerOptions): Plugin;
8
+ export declare function harInfo(path: string): Promise<{
9
+ entryCount: number;
10
+ startedDateTime: string;
11
+ topHosts: string[];
12
+ }>;
13
+ export declare function harPlayer(client: Client, path: string, options: {
14
+ count?: number;
15
+ delay?: number;
16
+ overrideHeaders?: Record<string, string>;
17
+ onProgress?: (p: {
18
+ completed: number;
19
+ total: number;
20
+ }) => void;
21
+ }): Promise<({
22
+ url: string;
23
+ status: number;
24
+ error?: undefined;
25
+ } | {
26
+ url: string;
27
+ error: unknown;
28
+ status?: undefined;
29
+ })[]>;
@@ -57,3 +57,52 @@ export function harPlayerPlugin(options) {
57
57
  client.use(middleware);
58
58
  };
59
59
  }
60
+ export async function harInfo(path) {
61
+ const content = readFileSync(path, 'utf-8');
62
+ const har = JSON.parse(content);
63
+ const entries = har.log.entries;
64
+ const hosts = new Set();
65
+ entries.forEach((e) => {
66
+ try {
67
+ const url = new URL(e.request.url);
68
+ hosts.add(url.hostname);
69
+ }
70
+ catch { }
71
+ });
72
+ return {
73
+ entryCount: entries.length,
74
+ startedDateTime: entries[0]?.startedDateTime || new Date().toISOString(),
75
+ topHosts: Array.from(hosts).slice(0, 5)
76
+ };
77
+ }
78
+ export async function harPlayer(client, path, options) {
79
+ const content = readFileSync(path, 'utf-8');
80
+ const har = JSON.parse(content);
81
+ const entries = har.log.entries;
82
+ const results = [];
83
+ const count = options.count || 1;
84
+ const total = entries.length * count;
85
+ let completed = 0;
86
+ for (let i = 0; i < count; i++) {
87
+ for (const entry of entries) {
88
+ if (options.delay)
89
+ await new Promise(r => setTimeout(r, options.delay));
90
+ const req = entry.request;
91
+ try {
92
+ const headers = { ...options.overrideHeaders };
93
+ await client.request(req.url, {
94
+ method: req.method,
95
+ headers,
96
+ body: req.postData?.text
97
+ });
98
+ results.push({ url: req.url, status: 200 });
99
+ }
100
+ catch (e) {
101
+ results.push({ url: req.url, error: e });
102
+ }
103
+ completed++;
104
+ options.onProgress?.({ completed, total });
105
+ }
106
+ }
107
+ return results;
108
+ }
@@ -1,6 +1,40 @@
1
1
  import { Plugin } from '../types/index.js';
2
- export interface HarOptions {
2
+ interface HarEntry {
3
+ startedDateTime: string;
4
+ time: number;
5
+ request: any;
6
+ response: any;
7
+ timings: any;
8
+ cache: {};
9
+ }
10
+ export declare class HarRecorder {
11
+ private entries;
12
+ private isRecording;
13
+ private onEntry?;
14
+ start(): void;
15
+ stop(): void;
16
+ clear(): void;
17
+ getEntries(): HarEntry[];
18
+ setOnEntry(cb: (entry: HarEntry) => void): void;
19
+ generateHar(): {
20
+ log: {
21
+ version: string;
22
+ creator: {
23
+ name: string;
24
+ version: string;
25
+ };
26
+ pages: never[];
27
+ entries: HarEntry[];
28
+ };
29
+ };
30
+ download(filename?: string): void;
31
+ save(path: string): Promise<void>;
32
+ plugin(): Plugin;
33
+ private mapHeaders;
34
+ }
35
+ export declare const harRecorder: HarRecorder;
36
+ export declare const harRecorderPlugin: (options?: {
3
37
  path?: string;
4
38
  onEntry?: (entry: any) => void;
5
- }
6
- export declare function harRecorderPlugin(options?: HarOptions): Plugin;
39
+ }) => Plugin;
40
+ export {};