@fusengine/browser-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/actions/act-by-ref.d.ts +13 -0
  4. package/dist/actions/act-by-ref.d.ts.map +1 -0
  5. package/dist/actions/act-by-ref.js +25 -0
  6. package/dist/actions/act-by-ref.js.map +1 -0
  7. package/dist/actions/human.d.ts +8 -0
  8. package/dist/actions/human.d.ts.map +1 -0
  9. package/dist/actions/human.js +6 -0
  10. package/dist/actions/human.js.map +1 -0
  11. package/dist/actions/login.d.ts +17 -0
  12. package/dist/actions/login.d.ts.map +1 -0
  13. package/dist/actions/login.js +11 -0
  14. package/dist/actions/login.js.map +1 -0
  15. package/dist/actions/navigation.d.ts +15 -0
  16. package/dist/actions/navigation.d.ts.map +1 -0
  17. package/dist/actions/navigation.js +33 -0
  18. package/dist/actions/navigation.js.map +1 -0
  19. package/dist/actions/perform.d.ts +15 -0
  20. package/dist/actions/perform.d.ts.map +1 -0
  21. package/dist/actions/perform.js +41 -0
  22. package/dist/actions/perform.js.map +1 -0
  23. package/dist/actions/smart-click.d.ts +9 -0
  24. package/dist/actions/smart-click.d.ts.map +1 -0
  25. package/dist/actions/smart-click.js +55 -0
  26. package/dist/actions/smart-click.js.map +1 -0
  27. package/dist/actions/smart-fill.d.ts +9 -0
  28. package/dist/actions/smart-fill.d.ts.map +1 -0
  29. package/dist/actions/smart-fill.js +46 -0
  30. package/dist/actions/smart-fill.js.map +1 -0
  31. package/dist/actions/wait-for.d.ts +21 -0
  32. package/dist/actions/wait-for.d.ts.map +1 -0
  33. package/dist/actions/wait-for.js +28 -0
  34. package/dist/actions/wait-for.js.map +1 -0
  35. package/dist/agent/actions-loop.d.ts +18 -0
  36. package/dist/agent/actions-loop.d.ts.map +1 -0
  37. package/dist/agent/actions-loop.js +44 -0
  38. package/dist/agent/actions-loop.js.map +1 -0
  39. package/dist/agent/browser-agent.d.ts +24 -0
  40. package/dist/agent/browser-agent.d.ts.map +1 -0
  41. package/dist/agent/browser-agent.js +36 -0
  42. package/dist/agent/browser-agent.js.map +1 -0
  43. package/dist/agent/compact.d.ts +8 -0
  44. package/dist/agent/compact.d.ts.map +1 -0
  45. package/dist/agent/compact.js +24 -0
  46. package/dist/agent/compact.js.map +1 -0
  47. package/dist/agent/config.d.ts +30 -0
  48. package/dist/agent/config.d.ts.map +1 -0
  49. package/dist/agent/config.js +49 -0
  50. package/dist/agent/config.js.map +1 -0
  51. package/dist/agent/detect.d.ts +17 -0
  52. package/dist/agent/detect.d.ts.map +1 -0
  53. package/dist/agent/detect.js +9 -0
  54. package/dist/agent/detect.js.map +1 -0
  55. package/dist/agent/network.d.ts +16 -0
  56. package/dist/agent/network.d.ts.map +1 -0
  57. package/dist/agent/network.js +16 -0
  58. package/dist/agent/network.js.map +1 -0
  59. package/dist/agent/probe-run.d.ts +6 -0
  60. package/dist/agent/probe-run.d.ts.map +1 -0
  61. package/dist/agent/probe-run.js +90 -0
  62. package/dist/agent/probe-run.js.map +1 -0
  63. package/dist/agent/report.d.ts +29 -0
  64. package/dist/agent/report.d.ts.map +1 -0
  65. package/dist/agent/report.js +53 -0
  66. package/dist/agent/report.js.map +1 -0
  67. package/dist/agent/run-steps.d.ts +22 -0
  68. package/dist/agent/run-steps.d.ts.map +1 -0
  69. package/dist/agent/run-steps.js +59 -0
  70. package/dist/agent/run-steps.js.map +1 -0
  71. package/dist/bin/cli.d.ts +3 -0
  72. package/dist/bin/cli.d.ts.map +1 -0
  73. package/dist/bin/cli.js +84 -0
  74. package/dist/bin/cli.js.map +1 -0
  75. package/dist/bin/mcp.d.ts +3 -0
  76. package/dist/bin/mcp.d.ts.map +1 -0
  77. package/dist/bin/mcp.js +28 -0
  78. package/dist/bin/mcp.js.map +1 -0
  79. package/dist/captcha/solve.d.ts +17 -0
  80. package/dist/captcha/solve.d.ts.map +1 -0
  81. package/dist/captcha/solve.js +42 -0
  82. package/dist/captcha/solve.js.map +1 -0
  83. package/dist/consent/booking-currency.d.ts +14 -0
  84. package/dist/consent/booking-currency.d.ts.map +1 -0
  85. package/dist/consent/booking-currency.js +82 -0
  86. package/dist/consent/booking-currency.js.map +1 -0
  87. package/dist/consent/consent.d.ts +11 -0
  88. package/dist/consent/consent.d.ts.map +1 -0
  89. package/dist/consent/consent.js +27 -0
  90. package/dist/consent/consent.js.map +1 -0
  91. package/dist/consent/currency-url.d.ts +10 -0
  92. package/dist/consent/currency-url.d.ts.map +1 -0
  93. package/dist/consent/currency-url.js +18 -0
  94. package/dist/consent/currency-url.js.map +1 -0
  95. package/dist/consent/currency.d.ts +14 -0
  96. package/dist/consent/currency.d.ts.map +1 -0
  97. package/dist/consent/currency.js +48 -0
  98. package/dist/consent/currency.js.map +1 -0
  99. package/dist/engine/cdp-engine.d.ts +21 -0
  100. package/dist/engine/cdp-engine.d.ts.map +1 -0
  101. package/dist/engine/cdp-engine.js +36 -0
  102. package/dist/engine/cdp-engine.js.map +1 -0
  103. package/dist/engine/cdp-launch.d.ts +11 -0
  104. package/dist/engine/cdp-launch.d.ts.map +1 -0
  105. package/dist/engine/cdp-launch.js +54 -0
  106. package/dist/engine/cdp-launch.js.map +1 -0
  107. package/dist/engine/context.d.ts +14 -0
  108. package/dist/engine/context.d.ts.map +1 -0
  109. package/dist/engine/context.js +22 -0
  110. package/dist/engine/context.js.map +1 -0
  111. package/dist/engine/launch.d.ts +6 -0
  112. package/dist/engine/launch.d.ts.map +1 -0
  113. package/dist/engine/launch.js +53 -0
  114. package/dist/engine/launch.js.map +1 -0
  115. package/dist/engine/loader.d.ts +13 -0
  116. package/dist/engine/loader.d.ts.map +1 -0
  117. package/dist/engine/loader.js +24 -0
  118. package/dist/engine/loader.js.map +1 -0
  119. package/dist/engine/patchright-engine.d.ts +4 -0
  120. package/dist/engine/patchright-engine.d.ts.map +1 -0
  121. package/dist/engine/patchright-engine.js +10 -0
  122. package/dist/engine/patchright-engine.js.map +1 -0
  123. package/dist/engine/playwright-engine.d.ts +8 -0
  124. package/dist/engine/playwright-engine.d.ts.map +1 -0
  125. package/dist/engine/playwright-engine.js +24 -0
  126. package/dist/engine/playwright-engine.js.map +1 -0
  127. package/dist/engine/registry.d.ts +13 -0
  128. package/dist/engine/registry.d.ts.map +1 -0
  129. package/dist/engine/registry.js +18 -0
  130. package/dist/engine/registry.js.map +1 -0
  131. package/dist/extraction/challenges.d.ts +9 -0
  132. package/dist/extraction/challenges.d.ts.map +1 -0
  133. package/dist/extraction/challenges.js +24 -0
  134. package/dist/extraction/challenges.js.map +1 -0
  135. package/dist/extraction/hotel-offers.d.ts +11 -0
  136. package/dist/extraction/hotel-offers.d.ts.map +1 -0
  137. package/dist/extraction/hotel-offers.js +63 -0
  138. package/dist/extraction/hotel-offers.js.map +1 -0
  139. package/dist/extraction/main-text.d.ts +13 -0
  140. package/dist/extraction/main-text.d.ts.map +1 -0
  141. package/dist/extraction/main-text.js +20 -0
  142. package/dist/extraction/main-text.js.map +1 -0
  143. package/dist/extraction/prices.d.ts +18 -0
  144. package/dist/extraction/prices.d.ts.map +1 -0
  145. package/dist/extraction/prices.js +74 -0
  146. package/dist/extraction/prices.js.map +1 -0
  147. package/dist/extraction/snapshot-diff.d.ts +28 -0
  148. package/dist/extraction/snapshot-diff.d.ts.map +1 -0
  149. package/dist/extraction/snapshot-diff.js +30 -0
  150. package/dist/extraction/snapshot-diff.js.map +1 -0
  151. package/dist/extraction/snapshot.d.ts +14 -0
  152. package/dist/extraction/snapshot.d.ts.map +1 -0
  153. package/dist/extraction/snapshot.js +26 -0
  154. package/dist/extraction/snapshot.js.map +1 -0
  155. package/dist/extraction/structured.d.ts +26 -0
  156. package/dist/extraction/structured.d.ts.map +1 -0
  157. package/dist/extraction/structured.js +28 -0
  158. package/dist/extraction/structured.js.map +1 -0
  159. package/dist/extraction/visual.d.ts +9 -0
  160. package/dist/extraction/visual.d.ts.map +1 -0
  161. package/dist/extraction/visual.js +29 -0
  162. package/dist/extraction/visual.js.map +1 -0
  163. package/dist/guardrails/preflight.d.ts +25 -0
  164. package/dist/guardrails/preflight.d.ts.map +1 -0
  165. package/dist/guardrails/preflight.js +27 -0
  166. package/dist/guardrails/preflight.js.map +1 -0
  167. package/dist/identity/country-profiles.d.ts +12 -0
  168. package/dist/identity/country-profiles.d.ts.map +1 -0
  169. package/dist/identity/country-profiles.js +58 -0
  170. package/dist/identity/country-profiles.js.map +1 -0
  171. package/dist/identity/identity.d.ts +19 -0
  172. package/dist/identity/identity.d.ts.map +1 -0
  173. package/dist/identity/identity.js +31 -0
  174. package/dist/identity/identity.js.map +1 -0
  175. package/dist/identity/resolve.d.ts +25 -0
  176. package/dist/identity/resolve.d.ts.map +1 -0
  177. package/dist/identity/resolve.js +21 -0
  178. package/dist/identity/resolve.js.map +1 -0
  179. package/dist/index.d.ts +12 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +10 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/interfaces/engine-types.d.ts +15 -0
  184. package/dist/interfaces/engine-types.d.ts.map +1 -0
  185. package/dist/interfaces/engine-types.js +6 -0
  186. package/dist/interfaces/engine-types.js.map +1 -0
  187. package/dist/interfaces/engine.d.ts +30 -0
  188. package/dist/interfaces/engine.d.ts.map +1 -0
  189. package/dist/interfaces/engine.js +2 -0
  190. package/dist/interfaces/engine.js.map +1 -0
  191. package/dist/interfaces/extraction.d.ts +63 -0
  192. package/dist/interfaces/extraction.d.ts.map +1 -0
  193. package/dist/interfaces/extraction.js +6 -0
  194. package/dist/interfaces/extraction.js.map +1 -0
  195. package/dist/interfaces/net.d.ts +48 -0
  196. package/dist/interfaces/net.d.ts.map +1 -0
  197. package/dist/interfaces/net.js +6 -0
  198. package/dist/interfaces/net.js.map +1 -0
  199. package/dist/interfaces/report.d.ts +87 -0
  200. package/dist/interfaces/report.d.ts.map +1 -0
  201. package/dist/interfaces/report.js +2 -0
  202. package/dist/interfaces/report.js.map +1 -0
  203. package/dist/interfaces/types.d.ts +90 -0
  204. package/dist/interfaces/types.d.ts.map +1 -0
  205. package/dist/interfaces/types.js +6 -0
  206. package/dist/interfaces/types.js.map +1 -0
  207. package/dist/lib/errors.d.ts +19 -0
  208. package/dist/lib/errors.d.ts.map +1 -0
  209. package/dist/lib/errors.js +30 -0
  210. package/dist/lib/errors.js.map +1 -0
  211. package/dist/lib/evaluate.d.ts +17 -0
  212. package/dist/lib/evaluate.d.ts.map +1 -0
  213. package/dist/lib/evaluate.js +10 -0
  214. package/dist/lib/evaluate.js.map +1 -0
  215. package/dist/lib/fs.d.ts +11 -0
  216. package/dist/lib/fs.d.ts.map +1 -0
  217. package/dist/lib/fs.js +34 -0
  218. package/dist/lib/fs.js.map +1 -0
  219. package/dist/lib/logger.d.ts +14 -0
  220. package/dist/lib/logger.d.ts.map +1 -0
  221. package/dist/lib/logger.js +22 -0
  222. package/dist/lib/logger.js.map +1 -0
  223. package/dist/lib/output-dir.d.ts +12 -0
  224. package/dist/lib/output-dir.d.ts.map +1 -0
  225. package/dist/lib/output-dir.js +37 -0
  226. package/dist/lib/output-dir.js.map +1 -0
  227. package/dist/lib/retry.d.ts +28 -0
  228. package/dist/lib/retry.d.ts.map +1 -0
  229. package/dist/lib/retry.js +41 -0
  230. package/dist/lib/retry.js.map +1 -0
  231. package/dist/lib/text.d.ts +9 -0
  232. package/dist/lib/text.d.ts.map +1 -0
  233. package/dist/lib/text.js +13 -0
  234. package/dist/lib/text.js.map +1 -0
  235. package/dist/net/captcha-client.d.ts +10 -0
  236. package/dist/net/captcha-client.d.ts.map +1 -0
  237. package/dist/net/captcha-client.js +48 -0
  238. package/dist/net/captcha-client.js.map +1 -0
  239. package/dist/net/captcha-inject.d.ts +10 -0
  240. package/dist/net/captcha-inject.d.ts.map +1 -0
  241. package/dist/net/captcha-inject.js +24 -0
  242. package/dist/net/captcha-inject.js.map +1 -0
  243. package/dist/net/navigate.d.ts +19 -0
  244. package/dist/net/navigate.d.ts.map +1 -0
  245. package/dist/net/navigate.js +32 -0
  246. package/dist/net/navigate.js.map +1 -0
  247. package/dist/net/throttle.d.ts +3 -0
  248. package/dist/net/throttle.d.ts.map +1 -0
  249. package/dist/net/throttle.js +23 -0
  250. package/dist/net/throttle.js.map +1 -0
  251. package/dist/proxy/country-map.d.ts +13 -0
  252. package/dist/proxy/country-map.d.ts.map +1 -0
  253. package/dist/proxy/country-map.js +38 -0
  254. package/dist/proxy/country-map.js.map +1 -0
  255. package/dist/server/env-defaults.d.ts +11 -0
  256. package/dist/server/env-defaults.d.ts.map +1 -0
  257. package/dist/server/env-defaults.js +20 -0
  258. package/dist/server/env-defaults.js.map +1 -0
  259. package/dist/server/map-options.d.ts +6 -0
  260. package/dist/server/map-options.d.ts.map +1 -0
  261. package/dist/server/map-options.js +43 -0
  262. package/dist/server/map-options.js.map +1 -0
  263. package/dist/server/resources.d.ts +4 -0
  264. package/dist/server/resources.d.ts.map +1 -0
  265. package/dist/server/resources.js +28 -0
  266. package/dist/server/resources.js.map +1 -0
  267. package/dist/server/result.d.ts +12 -0
  268. package/dist/server/result.d.ts.map +1 -0
  269. package/dist/server/result.js +18 -0
  270. package/dist/server/result.js.map +1 -0
  271. package/dist/server/schemas.d.ts +191 -0
  272. package/dist/server/schemas.d.ts.map +1 -0
  273. package/dist/server/schemas.js +72 -0
  274. package/dist/server/schemas.js.map +1 -0
  275. package/dist/server/server.d.ts +14 -0
  276. package/dist/server/server.d.ts.map +1 -0
  277. package/dist/server/server.js +37 -0
  278. package/dist/server/server.js.map +1 -0
  279. package/dist/server/tools/act.d.ts +10 -0
  280. package/dist/server/tools/act.d.ts.map +1 -0
  281. package/dist/server/tools/act.js +62 -0
  282. package/dist/server/tools/act.js.map +1 -0
  283. package/dist/server/tools/connect.d.ts +10 -0
  284. package/dist/server/tools/connect.d.ts.map +1 -0
  285. package/dist/server/tools/connect.js +37 -0
  286. package/dist/server/tools/connect.js.map +1 -0
  287. package/dist/server/tools/extract-schema.d.ts +9 -0
  288. package/dist/server/tools/extract-schema.d.ts.map +1 -0
  289. package/dist/server/tools/extract-schema.js +29 -0
  290. package/dist/server/tools/extract-schema.js.map +1 -0
  291. package/dist/server/tools/extract.d.ts +9 -0
  292. package/dist/server/tools/extract.d.ts.map +1 -0
  293. package/dist/server/tools/extract.js +35 -0
  294. package/dist/server/tools/extract.js.map +1 -0
  295. package/dist/server/tools/navigate.d.ts +9 -0
  296. package/dist/server/tools/navigate.d.ts.map +1 -0
  297. package/dist/server/tools/navigate.js +27 -0
  298. package/dist/server/tools/navigate.js.map +1 -0
  299. package/dist/server/tools/probe.d.ts +8 -0
  300. package/dist/server/tools/probe.d.ts.map +1 -0
  301. package/dist/server/tools/probe.js +44 -0
  302. package/dist/server/tools/probe.js.map +1 -0
  303. package/dist/server/tools/run.d.ts +10 -0
  304. package/dist/server/tools/run.d.ts.map +1 -0
  305. package/dist/server/tools/run.js +30 -0
  306. package/dist/server/tools/run.js.map +1 -0
  307. package/dist/server/tools/screenshot.d.ts +10 -0
  308. package/dist/server/tools/screenshot.d.ts.map +1 -0
  309. package/dist/server/tools/screenshot.js +26 -0
  310. package/dist/server/tools/screenshot.js.map +1 -0
  311. package/dist/server/tools/session.d.ts +9 -0
  312. package/dist/server/tools/session.d.ts.map +1 -0
  313. package/dist/server/tools/session.js +33 -0
  314. package/dist/server/tools/session.js.map +1 -0
  315. package/dist/server/tools/snapshot.d.ts +12 -0
  316. package/dist/server/tools/snapshot.d.ts.map +1 -0
  317. package/dist/server/tools/snapshot.js +59 -0
  318. package/dist/server/tools/snapshot.js.map +1 -0
  319. package/dist/server/tools/wait.d.ts +9 -0
  320. package/dist/server/tools/wait.d.ts.map +1 -0
  321. package/dist/server/tools/wait.js +32 -0
  322. package/dist/server/tools/wait.js.map +1 -0
  323. package/dist/server/tools/with-session.d.ts +10 -0
  324. package/dist/server/tools/with-session.d.ts.map +1 -0
  325. package/dist/server/tools/with-session.js +16 -0
  326. package/dist/server/tools/with-session.js.map +1 -0
  327. package/dist/session/manager.d.ts +39 -0
  328. package/dist/session/manager.d.ts.map +1 -0
  329. package/dist/session/manager.js +76 -0
  330. package/dist/session/manager.js.map +1 -0
  331. package/dist/session/session.d.ts +28 -0
  332. package/dist/session/session.d.ts.map +1 -0
  333. package/dist/session/session.js +51 -0
  334. package/dist/session/session.js.map +1 -0
  335. package/dist/state/dom-signature.d.ts +8 -0
  336. package/dist/state/dom-signature.d.ts.map +1 -0
  337. package/dist/state/dom-signature.js +13 -0
  338. package/dist/state/dom-signature.js.map +1 -0
  339. package/dist/state/realtime.d.ts +11 -0
  340. package/dist/state/realtime.d.ts.map +1 -0
  341. package/dist/state/realtime.js +34 -0
  342. package/dist/state/realtime.js.map +1 -0
  343. package/dist/state/replay.d.ts +4 -0
  344. package/dist/state/replay.d.ts.map +1 -0
  345. package/dist/state/replay.js +21 -0
  346. package/dist/state/replay.js.map +1 -0
  347. package/dist/state/site-memory.d.ts +35 -0
  348. package/dist/state/site-memory.d.ts.map +1 -0
  349. package/dist/state/site-memory.js +56 -0
  350. package/dist/state/site-memory.js.map +1 -0
  351. package/package.json +70 -0
  352. package/proxies.example.json +9 -0
  353. package/scripts/postinstall.mjs +24 -0
@@ -0,0 +1,12 @@
1
+ /** Project-root config dirs of common AI coding agents, by preference. */
2
+ export declare const AGENT_DIRS: string[];
3
+ /**
4
+ * Pick the default output dir: `<agent-dir>/fuse-browser` when a known agent
5
+ * config dir exists in `cwd`, otherwise `~/.fuse-browser`.
6
+ *
7
+ * @param cwd - Directory scanned for an agent config dir (defaults to process cwd).
8
+ * @param home - Home directory used for the fallback (defaults to OS home).
9
+ * @returns The chosen output directory path.
10
+ */
11
+ export declare function resolveDefaultOutputDir(cwd?: string, home?: string): string;
12
+ //# sourceMappingURL=output-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-dir.d.ts","sourceRoot":"","sources":["../../src/lib/output-dir.ts"],"names":[],"mappings":"AAWA,0EAA0E;AAC1E,eAAO,MAAM,UAAU,UAStB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,GAAE,MAAsB,EAC3B,IAAI,GAAE,MAAkB,GACvB,MAAM,CAKR"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Resolve a safe default output directory, nested under the host agent's
3
+ * project config dir (`.claude`, `.cursor`, …) when present, otherwise under
4
+ * `$HOME`. Keeps probe artifacts (reports, screenshots, cookies) out of the
5
+ * repository root so they are never committed by accident.
6
+ * @module lib/output-dir
7
+ */
8
+ import { existsSync } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { join } from "node:path";
11
+ /** Project-root config dirs of common AI coding agents, by preference. */
12
+ export const AGENT_DIRS = [
13
+ ".claude",
14
+ ".cursor",
15
+ ".codex",
16
+ ".windsurf",
17
+ ".gemini",
18
+ ".continue",
19
+ ".junie",
20
+ ".github",
21
+ ];
22
+ /**
23
+ * Pick the default output dir: `<agent-dir>/fuse-browser` when a known agent
24
+ * config dir exists in `cwd`, otherwise `~/.fuse-browser`.
25
+ *
26
+ * @param cwd - Directory scanned for an agent config dir (defaults to process cwd).
27
+ * @param home - Home directory used for the fallback (defaults to OS home).
28
+ * @returns The chosen output directory path.
29
+ */
30
+ export function resolveDefaultOutputDir(cwd = process.cwd(), home = homedir()) {
31
+ for (const dir of AGENT_DIRS) {
32
+ if (existsSync(join(cwd, dir)))
33
+ return join(cwd, dir, "fuse-browser");
34
+ }
35
+ return join(home, ".fuse-browser");
36
+ }
37
+ //# sourceMappingURL=output-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-dir.js","sourceRoot":"","sources":["../../src/lib/output-dir.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS;IACT,SAAS;IACT,QAAQ;IACR,WAAW;IACX,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;CACV,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,OAAe,OAAO,EAAE;IAExB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** Pause for `ms` milliseconds. */
2
+ export declare function sleep(ms: number): Promise<void>;
3
+ /** Full-jitter exponential backoff delay (ms) for a zero-based attempt index. */
4
+ export declare function backoffDelay(attempt: number, baseMs: number, capMs: number): number;
5
+ /** Outcome of one attempt passed to the classifier. */
6
+ export interface RetryOutcome<T> {
7
+ value?: T;
8
+ error?: unknown;
9
+ }
10
+ /** Classifier decision: whether to retry and an optional fixed delay override. */
11
+ export interface RetryDecision {
12
+ retry: boolean;
13
+ delayMs?: number;
14
+ }
15
+ /** Options for {@link withRetry}. */
16
+ export interface RetryOpts<T> {
17
+ maxAttempts: number;
18
+ baseMs: number;
19
+ capMs: number;
20
+ classify: (outcome: RetryOutcome<T>, attempt: number) => RetryDecision;
21
+ }
22
+ /**
23
+ * Run `fn` up to `maxAttempts` times. The classifier inspects each attempt's
24
+ * value or thrown error and decides whether to retry; backoff is full-jitter
25
+ * unless the classifier supplies a `delayMs` (e.g. from a `Retry-After` header).
26
+ */
27
+ export declare function withRetry<T>(fn: (attempt: number) => Promise<T>, opts: RetryOpts<T>): Promise<T>;
28
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/lib/retry.ts"],"names":[],"mappings":"AAMA,mCAAmC;AACnC,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnF;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qCAAqC;AACrC,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,aAAa,CAAC;CACxE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Generic async retry with full-jitter exponential backoff.
3
+ * @module lib/retry
4
+ */
5
+ import { randInt } from "./text.js";
6
+ /** Pause for `ms` milliseconds. */
7
+ export function sleep(ms) {
8
+ return new Promise((resolve) => setTimeout(resolve, ms));
9
+ }
10
+ /** Full-jitter exponential backoff delay (ms) for a zero-based attempt index. */
11
+ export function backoffDelay(attempt, baseMs, capMs) {
12
+ const expo = Math.min(capMs, baseMs * 2 ** attempt);
13
+ return randInt(0, expo);
14
+ }
15
+ /**
16
+ * Run `fn` up to `maxAttempts` times. The classifier inspects each attempt's
17
+ * value or thrown error and decides whether to retry; backoff is full-jitter
18
+ * unless the classifier supplies a `delayMs` (e.g. from a `Retry-After` header).
19
+ */
20
+ export async function withRetry(fn, opts) {
21
+ let lastError;
22
+ for (let attempt = 0; attempt < opts.maxAttempts; attempt += 1) {
23
+ const last = attempt === opts.maxAttempts - 1;
24
+ try {
25
+ const value = await fn(attempt);
26
+ const decision = opts.classify({ value }, attempt);
27
+ if (!decision.retry || last)
28
+ return value;
29
+ await sleep(decision.delayMs ?? backoffDelay(attempt, opts.baseMs, opts.capMs));
30
+ }
31
+ catch (error) {
32
+ lastError = error;
33
+ const decision = opts.classify({ error }, attempt);
34
+ if (!decision.retry || last)
35
+ throw error;
36
+ await sleep(decision.delayMs ?? backoffDelay(attempt, opts.baseMs, opts.capMs));
37
+ }
38
+ }
39
+ throw lastError;
40
+ }
41
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/lib/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,mCAAmC;AACnC,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAAc,EAAE,KAAa;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAsBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAmC,EACnC,IAAkB;IAElB,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC1C,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI;gBAAE,MAAM,KAAK,CAAC;YACzC,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utilitaires texte/regex.
3
+ * @module lib/text
4
+ */
5
+ /** Échappe une chaîne pour une insertion littérale dans une RegExp. */
6
+ export declare function escapeRegExp(input: string): string;
7
+ /** Entier pseudo-aléatoire dans [min, max] (jitter « humain », non cryptographique). */
8
+ export declare function randInt(min: number, max: number): number;
9
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/lib/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wFAAwF;AACxF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Utilitaires texte/regex.
3
+ * @module lib/text
4
+ */
5
+ /** Échappe une chaîne pour une insertion littérale dans une RegExp. */
6
+ export function escapeRegExp(input) {
7
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8
+ }
9
+ /** Entier pseudo-aléatoire dans [min, max] (jitter « humain », non cryptographique). */
10
+ export function randInt(min, max) {
11
+ return Math.floor(Math.random() * (max - min + 1)) + min;
12
+ }
13
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/lib/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAW;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Unified captcha-provider client (2captcha / Anti-Captcha / CapMonster).
3
+ * These providers share the createTask/getTaskResult JSON API, so one adapter
4
+ * only parameterizes the base URL. For authorized testing use only.
5
+ * @module net/captcha-client
6
+ */
7
+ import type { CaptchaConfig, CaptchaTask } from "../interfaces/net.js";
8
+ /** Solve a captcha task and return the response token, or throw on failure. */
9
+ export declare function solveToken(cfg: CaptchaConfig, task: CaptchaTask): Promise<string>;
10
+ //# sourceMappingURL=captcha-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-client.d.ts","sourceRoot":"","sources":["../../src/net/captcha-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAmB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAwBxF,+EAA+E;AAC/E,wBAAsB,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvF"}
@@ -0,0 +1,48 @@
1
+ import { sleep } from "../lib/retry.js";
2
+ const BASE_URL = {
3
+ "2captcha": "https://api.2captcha.com",
4
+ anticaptcha: "https://api.anti-captcha.com",
5
+ capmonster: "https://api.capmonster.cloud",
6
+ };
7
+ const TASK_TYPE = {
8
+ recaptcha: "RecaptchaV2TaskProxyless",
9
+ turnstile: "TurnstileTaskProxyless",
10
+ };
11
+ async function postJson(url, body) {
12
+ const res = await fetch(url, {
13
+ method: "POST",
14
+ headers: { "content-type": "application/json" },
15
+ body: JSON.stringify(body),
16
+ });
17
+ if (!res.ok)
18
+ throw new Error(`HTTP ${res.status} ${res.statusText} from ${url}`);
19
+ return (await res.json());
20
+ }
21
+ /** Solve a captcha task and return the response token, or throw on failure. */
22
+ export async function solveToken(cfg, task) {
23
+ const base = cfg.baseUrl ?? BASE_URL[cfg.provider];
24
+ const created = await postJson(`${base}/createTask`, {
25
+ clientKey: cfg.apiKey,
26
+ task: { type: TASK_TYPE[task.kind], websiteURL: task.websiteURL, websiteKey: task.websiteKey },
27
+ });
28
+ if (created.errorId)
29
+ throw new Error(`createTask failed: ${created.errorCode ?? created.errorId}`);
30
+ const { taskId } = created;
31
+ const deadline = Date.now() + (cfg.timeoutMs ?? 180_000);
32
+ const pollMs = cfg.pollMs ?? 5_000;
33
+ while (Date.now() < deadline) {
34
+ await sleep(pollMs);
35
+ const result = await postJson(`${base}/getTaskResult`, { clientKey: cfg.apiKey, taskId });
36
+ if (result.errorId)
37
+ throw new Error(`getTaskResult failed: ${result.errorCode ?? result.errorId}`);
38
+ if (result.status === "ready") {
39
+ const solution = result.solution;
40
+ const token = solution?.gRecaptchaResponse ?? solution?.token;
41
+ if (!token)
42
+ throw new Error("captcha solution missing token");
43
+ return token;
44
+ }
45
+ }
46
+ throw new Error("captcha solve timed out");
47
+ }
48
+ //# sourceMappingURL=captcha-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-client.js","sourceRoot":"","sources":["../../src/net/captcha-client.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,QAAQ,GAAoC;IAChD,UAAU,EAAE,0BAA0B;IACtC,WAAW,EAAE,8BAA8B;IAC3C,UAAU,EAAE,8BAA8B;CAC3C,CAAC;AAEF,MAAM,SAAS,GAAwC;IACrD,SAAS,EAAE,0BAA0B;IACrC,SAAS,EAAE,wBAAwB;CACpC,CAAC;AAEF,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAa;IAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,SAAS,GAAG,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAkB,EAAE,IAAiB;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,IAAI,aAAa,EAAE;QACnD,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC/F,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,IAAI,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnG,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAuE,CAAC;YAChG,MAAM,KAAK,GAAG,QAAQ,EAAE,kBAAkB,IAAI,QAAQ,EAAE,KAAK,CAAC;YAC9D,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Read a captcha sitekey from the page and inject a solved token.
3
+ * @module net/captcha-inject
4
+ */
5
+ import type { Page } from "playwright";
6
+ /** Read the captcha sitekey from the page DOM, or null if none is present. */
7
+ export declare function readSitekey(page: Page): Promise<string | null>;
8
+ /** Inject a solved token into the page's captcha response field(s). */
9
+ export declare function injectToken(page: Page, token: string): Promise<boolean>;
10
+ //# sourceMappingURL=captcha-inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-inject.d.ts","sourceRoot":"","sources":["../../src/net/captcha-inject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAmBvC,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE9D;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE"}
@@ -0,0 +1,24 @@
1
+ import { evalScript, evalScriptArg } from "../lib/evaluate.js";
2
+ const SITEKEY_SCRIPT = `() => {
3
+ const el = document.querySelector('[data-sitekey]');
4
+ return el ? el.getAttribute('data-sitekey') : null;
5
+ }`;
6
+ const INJECT_SCRIPT = `(token) => {
7
+ let injected = false;
8
+ for (const id of ['g-recaptcha-response', 'cf-turnstile-response']) {
9
+ const byId = document.getElementById(id);
10
+ if (byId) { byId.value = token; byId.dispatchEvent(new Event('input', { bubbles: true })); injected = true; }
11
+ }
12
+ const byName = document.querySelector('[name="cf-turnstile-response"], [name="g-recaptcha-response"]');
13
+ if (byName) { byName.value = token; injected = true; }
14
+ return injected;
15
+ }`;
16
+ /** Read the captcha sitekey from the page DOM, or null if none is present. */
17
+ export function readSitekey(page) {
18
+ return evalScript(page, SITEKEY_SCRIPT);
19
+ }
20
+ /** Inject a solved token into the page's captcha response field(s). */
21
+ export function injectToken(page, token) {
22
+ return evalScriptArg(page, INJECT_SCRIPT, token);
23
+ }
24
+ //# sourceMappingURL=captcha-inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-inject.js","sourceRoot":"","sources":["../../src/net/captcha-inject.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,cAAc,GAAG;;;EAGrB,CAAC;AAEH,MAAM,aAAa,GAAG;;;;;;;;;EASpB,CAAC;AAEH,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,IAAU;IACpC,OAAO,UAAU,CAAgB,IAAI,EAAE,cAAc,CAAC,CAAC;AACzD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,IAAU,EAAE,KAAa;IACnD,OAAO,aAAa,CAAkB,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Navigation with retry/backoff that honors HTTP 429/5xx and `Retry-After`.
3
+ * `page.goto` does not throw on 4xx/5xx, so the status is inspected explicitly.
4
+ * @module net/navigate
5
+ */
6
+ import type { Page, Response } from "playwright";
7
+ import type { RetryConfig } from "../interfaces/net.js";
8
+ /** Default navigation resilience (3 attempts, no throttle). */
9
+ export declare const DEFAULT_RETRY: RetryConfig;
10
+ /** Parse an RFC 7231 `Retry-After` value (delta-seconds or HTTP-date) to ms. */
11
+ export declare function parseRetryAfterMs(value: string | undefined, nowMs: number): number | null;
12
+ /** Options forwarded to `page.goto`. */
13
+ export interface GotoOptions {
14
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | "commit";
15
+ timeout?: number;
16
+ }
17
+ /** Navigate to `url`, retrying transient failures and rate-limit responses. */
18
+ export declare function gotoWithRetry(page: Page, url: string, opts: GotoOptions, retry?: RetryConfig): Promise<Response | null>;
19
+ //# sourceMappingURL=navigate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../src/net/navigate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,+DAA+D;AAC/D,eAAO,MAAM,aAAa,EAAE,WAA2E,CAAC;AAMxG,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKzF;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,aAAa,GAAG,QAAQ,CAAC;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,KAAK,GAAE,WAA2B,GACjC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAa1B"}
@@ -0,0 +1,32 @@
1
+ import { withRetry } from "../lib/retry.js";
2
+ /** Default navigation resilience (3 attempts, no throttle). */
3
+ export const DEFAULT_RETRY = { maxAttempts: 3, baseMs: 300, capMs: 10_000, throttleMs: 0 };
4
+ const RETRY_STATUS = new Set([429, 502, 503, 504]);
5
+ const RETRYABLE_ERROR = /timeout|ERR_CONNECTION|ERR_NETWORK_CHANGED|ERR_INTERNET_DISCONNECTED|ERR_ABORTED/i;
6
+ /** Parse an RFC 7231 `Retry-After` value (delta-seconds or HTTP-date) to ms. */
7
+ export function parseRetryAfterMs(value, nowMs) {
8
+ if (!value)
9
+ return null;
10
+ if (/^\d+$/.test(value))
11
+ return Math.min(300_000, Number(value) * 1000);
12
+ const delta = Date.parse(value) - nowMs;
13
+ return delta > 0 ? Math.min(300_000, delta) : null;
14
+ }
15
+ /** Navigate to `url`, retrying transient failures and rate-limit responses. */
16
+ export function gotoWithRetry(page, url, opts, retry = DEFAULT_RETRY) {
17
+ return withRetry(() => page.goto(url, opts), {
18
+ maxAttempts: retry.maxAttempts,
19
+ baseMs: retry.baseMs,
20
+ capMs: retry.capMs,
21
+ classify: ({ value, error }) => {
22
+ if (error)
23
+ return { retry: RETRYABLE_ERROR.test(String(error?.message ?? error)) };
24
+ const status = value?.status() ?? 0;
25
+ if (!RETRY_STATUS.has(status))
26
+ return { retry: false };
27
+ const after = parseRetryAfterMs(value?.headers()["retry-after"], Date.now());
28
+ return { retry: true, delayMs: after ?? undefined };
29
+ },
30
+ });
31
+ }
32
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/net/navigate.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAgB,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AAExG,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACnD,MAAM,eAAe,GACnB,mFAAmF,CAAC;AAEtF,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,KAAyB,EAAE,KAAa;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAQD,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAC3B,IAAU,EACV,GAAW,EACX,IAAiB,EACjB,QAAqB,aAAa;IAElC,OAAO,SAAS,CAAkB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;QAC5D,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7B,IAAI,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;QACtD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Wait so consecutive hits on the same host stay at least `minGapMs` apart. */
2
+ export declare function throttleHost(url: string, minGapMs: number): Promise<void>;
3
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/net/throttle.ts"],"names":[],"mappings":"AAQA,gFAAgF;AAChF,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/E"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Per-host request throttle (fixed minimum gap between navigations).
3
+ * @module net/throttle
4
+ */
5
+ import { sleep } from "../lib/retry.js";
6
+ const lastHit = new Map();
7
+ /** Wait so consecutive hits on the same host stay at least `minGapMs` apart. */
8
+ export async function throttleHost(url, minGapMs) {
9
+ if (minGapMs <= 0)
10
+ return;
11
+ let host;
12
+ try {
13
+ host = new URL(url).hostname;
14
+ }
15
+ catch {
16
+ return;
17
+ }
18
+ const wait = minGapMs - (Date.now() - (lastHit.get(host) ?? 0));
19
+ if (wait > 0)
20
+ await sleep(wait);
21
+ lastHit.set(host, Date.now());
22
+ }
23
+ //# sourceMappingURL=throttle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../src/net/throttle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE1C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,QAAgB;IAC9D,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO;IAC1B,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Charge la table pays->proxy depuis un fichier JSON puis fusionne une table
3
+ * inline (cette dernière a priorité).
4
+ */
5
+ export declare function loadProxyCountryMap(inline?: Record<string, string>, mapPath?: string): Record<string, string>;
6
+ /** Source de sélection du proxy effectif. */
7
+ export type ProxySource = "explicit" | "country_map" | null;
8
+ /** Sélectionne le proxy effectif : explicite > table pays. */
9
+ export declare function resolveProxy(explicit: string | undefined, countryCode: string, map: Record<string, string>): {
10
+ proxyUrl: string | null;
11
+ proxySource: ProxySource;
12
+ };
13
+ //# sourceMappingURL=country-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country-map.d.ts","sourceRoot":"","sources":["../../src/proxy/country-map.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAC;AAE5D,8DAA8D;AAC9D,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAKvD"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Routeur proxy par pays.
3
+ * @module proxy/country-map
4
+ */
5
+ import { existsSync } from "node:fs";
6
+ import { readJsonSafe } from "../lib/fs.js";
7
+ /** Normalise une table pays->proxy (clés en majuscules, valeurs non vides). */
8
+ function normalize(raw) {
9
+ const out = {};
10
+ for (const [k, v] of Object.entries(raw)) {
11
+ if (v)
12
+ out[k.toUpperCase()] = String(v);
13
+ }
14
+ return out;
15
+ }
16
+ /**
17
+ * Charge la table pays->proxy depuis un fichier JSON puis fusionne une table
18
+ * inline (cette dernière a priorité).
19
+ */
20
+ export function loadProxyCountryMap(inline, mapPath) {
21
+ let loaded = {};
22
+ if (mapPath && existsSync(mapPath)) {
23
+ loaded = normalize(readJsonSafe(mapPath, {}));
24
+ }
25
+ if (inline)
26
+ loaded = { ...loaded, ...normalize(inline) };
27
+ return loaded;
28
+ }
29
+ /** Sélectionne le proxy effectif : explicite > table pays. */
30
+ export function resolveProxy(explicit, countryCode, map) {
31
+ if (explicit)
32
+ return { proxyUrl: explicit, proxySource: "explicit" };
33
+ const fromMap = map[countryCode];
34
+ if (fromMap)
35
+ return { proxyUrl: fromMap, proxySource: "country_map" };
36
+ return { proxyUrl: null, proxySource: null };
37
+ }
38
+ //# sourceMappingURL=country-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country-map.js","sourceRoot":"","sources":["../../src/proxy/country-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,+EAA+E;AAC/E,SAAS,SAAS,CAAC,GAA4B;IAC7C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA+B,EAC/B,OAAgB;IAEhB,IAAI,MAAM,GAA2B,EAAE,CAAC;IACxC,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,SAAS,CAAC,YAAY,CAA0B,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,MAAM;QAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAC1B,QAA4B,EAC5B,WAAmB,EACnB,GAA2B;IAE3B,IAAI,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,IAAI,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;IACtE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Server-wide browser defaults read from `FUSE_*` environment variables.
3
+ * Each value is a fallback: an explicit per-tool-call argument always wins.
4
+ * Lets a single MCP config pin a default engine / installed channel / CDP
5
+ * endpoint without the agent repeating it on every call.
6
+ * @module server/env-defaults
7
+ */
8
+ import type { AgentOptions } from "../interfaces/types.js";
9
+ /** Read `FUSE_*` env vars into partial agent options (undefined when unset). */
10
+ export declare function envAgentDefaults(env?: NodeJS.ProcessEnv): Partial<AgentOptions>;
11
+ //# sourceMappingURL=env-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-defaults.d.ts","sourceRoot":"","sources":["../../src/server/env-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO3D,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CAa5F"}
@@ -0,0 +1,20 @@
1
+ /** Map a boolean-ish env var to `boolean | undefined` (unset stays undefined). */
2
+ function envBool(value) {
3
+ return value ? value !== "false" : undefined;
4
+ }
5
+ /** Read `FUSE_*` env vars into partial agent options (undefined when unset). */
6
+ export function envAgentDefaults(env = process.env) {
7
+ return {
8
+ engine: env.FUSE_ENGINE,
9
+ channel: env.FUSE_CHANNEL,
10
+ cdpEndpoint: env.FUSE_CDP_ENDPOINT,
11
+ executablePath: env.FUSE_EXECUTABLE_PATH,
12
+ headless: envBool(env.FUSE_HEADLESS),
13
+ countryCode: env.FUSE_COUNTRY,
14
+ currency: env.FUSE_CURRENCY,
15
+ userDataDir: env.FUSE_USER_DATA_DIR,
16
+ storageStatePath: env.FUSE_STORAGE_STATE,
17
+ outputDir: env.FUSE_OUTPUT_DIR,
18
+ };
19
+ }
20
+ //# sourceMappingURL=env-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-defaults.js","sourceRoot":"","sources":["../../src/server/env-defaults.ts"],"names":[],"mappings":"AASA,kFAAkF;AAClF,SAAS,OAAO,CAAC,KAAyB;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,WAAqC;QACjD,OAAO,EAAE,GAAG,CAAC,YAAuC;QACpD,WAAW,EAAE,GAAG,CAAC,iBAAiB;QAClC,cAAc,EAAE,GAAG,CAAC,oBAAoB;QACxC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACpC,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,QAAQ,EAAE,GAAG,CAAC,aAAa;QAC3B,WAAW,EAAE,GAAG,CAAC,kBAAkB;QACnC,gBAAgB,EAAE,GAAG,CAAC,kBAAkB;QACxC,SAAS,EAAE,GAAG,CAAC,eAAe;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AgentOptions, ProbeOptions } from "../interfaces/types.js";
2
+ /** Extract {@link AgentOptions} from raw tool arguments, falling back to env. */
3
+ export declare function toAgentOptions(a: Record<string, unknown>): AgentOptions;
4
+ /** Extract {@link ProbeOptions} from raw tool arguments. */
5
+ export declare function toProbeOptions(a: Record<string, unknown>): ProbeOptions;
6
+ //# sourceMappingURL=map-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-options.d.ts","sourceRoot":"","sources":["../../src/server/map-options.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMxF,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAwBvE;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAWvE"}
@@ -0,0 +1,43 @@
1
+ import { envAgentDefaults } from "./env-defaults.js";
2
+ /** Server-wide browser defaults from `FUSE_*` env (per-call args override these). */
3
+ const ENV = envAgentDefaults();
4
+ /** Extract {@link AgentOptions} from raw tool arguments, falling back to env. */
5
+ export function toAgentOptions(a) {
6
+ return {
7
+ engine: a.engine ?? ENV.engine,
8
+ channel: a.channel ?? ENV.channel,
9
+ executablePath: a.executablePath ?? ENV.executablePath,
10
+ cdpEndpoint: a.cdpEndpoint ?? ENV.cdpEndpoint,
11
+ headless: a.headless ?? ENV.headless,
12
+ humanMode: a.humanMode,
13
+ locale: a.locale,
14
+ timezoneId: a.timezoneId,
15
+ countryCode: a.countryCode ?? ENV.countryCode,
16
+ currency: a.currency ?? ENV.currency,
17
+ userDataDir: a.userDataDir ?? ENV.userDataDir,
18
+ proxyUrl: a.proxyUrl,
19
+ proxyMapPath: a.proxyMapPath,
20
+ storageStatePath: a.storageStatePath ?? ENV.storageStatePath,
21
+ realisticProfile: a.realisticProfile,
22
+ replayEnabled: a.replayEnabled,
23
+ replayDir: a.replayDir,
24
+ siteMemoryDir: a.siteMemoryDir,
25
+ outputDir: a.outputDir ?? ENV.outputDir,
26
+ retry: a.retry,
27
+ captcha: a.captcha,
28
+ };
29
+ }
30
+ /** Extract {@link ProbeOptions} from raw tool arguments. */
31
+ export function toProbeOptions(a) {
32
+ return {
33
+ actions: a.actions,
34
+ humanApproved: a.humanApproved,
35
+ autoConsent: a.autoConsent,
36
+ extractPrices: a.extractPrices,
37
+ waitMs: a.waitMs,
38
+ detectChallenges: a.detectChallenges,
39
+ observeVisual: a.observeVisual,
40
+ solveCaptcha: a.solveCaptcha,
41
+ };
42
+ }
43
+ //# sourceMappingURL=map-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-options.js","sourceRoot":"","sources":["../../src/server/map-options.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,qFAAqF;AACrF,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;AAE/B,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO;QACL,MAAM,EAAG,CAAC,CAAC,MAAiC,IAAI,GAAG,CAAC,MAAM;QAC1D,OAAO,EAAG,CAAC,CAAC,OAAsC,IAAI,GAAG,CAAC,OAAO;QACjE,cAAc,EAAG,CAAC,CAAC,cAAqC,IAAI,GAAG,CAAC,cAAc;QAC9E,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAG,CAAC,CAAC,QAAgC,IAAI,GAAG,CAAC,QAAQ;QAC7D,SAAS,EAAE,CAAC,CAAC,SAAgC;QAC7C,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,UAAU,EAAE,CAAC,CAAC,UAAgC;QAC9C,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAG,CAAC,CAAC,QAA+B,IAAI,GAAG,CAAC,QAAQ;QAC5D,WAAW,EAAG,CAAC,CAAC,WAAkC,IAAI,GAAG,CAAC,WAAW;QACrE,QAAQ,EAAE,CAAC,CAAC,QAA8B;QAC1C,YAAY,EAAE,CAAC,CAAC,YAAkC;QAClD,gBAAgB,EAAG,CAAC,CAAC,gBAAuC,IAAI,GAAG,CAAC,gBAAgB;QACpF,gBAAgB,EAAE,CAAC,CAAC,gBAAuC;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,SAAS,EAAE,CAAC,CAAC,SAA+B;QAC5C,aAAa,EAAE,CAAC,CAAC,aAAmC;QACpD,SAAS,EAAG,CAAC,CAAC,SAAgC,IAAI,GAAG,CAAC,SAAS;QAC/D,KAAK,EAAE,CAAC,CAAC,KAA8B;QACvC,OAAO,EAAE,CAAC,CAAC,OAAkC;KAC9C,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,CAA0B;IACvD,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAsC;QACjD,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,WAAW,EAAE,CAAC,CAAC,WAAkC;QACjD,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,MAAM,EAAE,CAAC,CAAC,MAA4B;QACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAuC;QAC3D,aAAa,EAAE,CAAC,CAAC,aAAoC;QACrD,YAAY,EAAE,CAAC,CAAC,YAAmC;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /** Register a resource listing probe run artifacts (reports + screenshots). */
3
+ export declare function registerResources(server: McpServer): void;
4
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/server/resources.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAezD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Expose the run artifacts directory as an MCP resource.
3
+ * @module server/resources
4
+ */
5
+ import { readdirSync } from "node:fs";
6
+ const RUNS_DIR = "runs";
7
+ const RUNS_URI = "fuse-browser://runs";
8
+ function listRuns() {
9
+ try {
10
+ return readdirSync(RUNS_DIR);
11
+ }
12
+ catch {
13
+ return [];
14
+ }
15
+ }
16
+ /** Register a resource listing probe run artifacts (reports + screenshots). */
17
+ export function registerResources(server) {
18
+ server.registerResource("runs-index", RUNS_URI, {
19
+ title: "Run artifacts",
20
+ description: "Probe reports (JSON) and screenshots (PNG) produced under runs/.",
21
+ mimeType: "application/json",
22
+ }, async (uri) => ({
23
+ contents: [
24
+ { uri: uri.href, mimeType: "application/json", text: JSON.stringify(listRuns(), null, 2) },
25
+ ],
26
+ }));
27
+ }
28
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/server/resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAEvC,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,QAAQ,EACR;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,kEAAkE;QAC/E,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SAC3F;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Helpers to build MCP CallToolResult payloads.
3
+ * @module server/result
4
+ */
5
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
6
+ /** Text + structured JSON result. */
7
+ export declare function jsonResult(payload: Record<string, unknown>): CallToolResult;
8
+ /** Error result (isError flag set). */
9
+ export declare function errorResult(message: string): CallToolResult;
10
+ /** Image result (PNG base64) with an optional text note. */
11
+ export declare function imageResult(base64: string, note?: string): CallToolResult;
12
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/server/result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAK3E;AAED,uCAAuC;AACvC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAE3D;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAIzE"}