@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,27 @@
1
+ import { z } from "zod";
2
+ import { gotoWithRetry } from "../../net/navigate.js";
3
+ import { jsonResult } from "../result.js";
4
+ import { withSession } from "./with-session.js";
5
+ /** Register `browser_navigate`. */
6
+ export function registerNavigateTool(server, sessions) {
7
+ server.registerTool("browser_navigate", {
8
+ title: "Navigate",
9
+ description: "Navigate a live session to a URL and return the resulting title.",
10
+ inputSchema: { sessionId: z.string(), url: z.string(), waitMs: z.number().int().optional() },
11
+ }, async (args) => {
12
+ const a = args;
13
+ return withSession(sessions, String(a.sessionId), async (s) => {
14
+ await gotoWithRetry(s.page, String(a.url), { waitUntil: "domcontentloaded", timeout: 30_000 });
15
+ try {
16
+ await s.page.waitForLoadState("networkidle", { timeout: 10_000 });
17
+ }
18
+ catch {
19
+ /* networkidle is best-effort */
20
+ }
21
+ if (a.waitMs)
22
+ await s.page.waitForTimeout(Number(a.waitMs));
23
+ return jsonResult({ url: s.page.url(), title: await s.page.title() });
24
+ });
25
+ });
26
+ }
27
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../../src/server/tools/navigate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,mCAAmC;AACnC,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,QAAwB;IAC9E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;KAC7F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/F,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;YACD,IAAI,CAAC,CAAC,MAAM;gBAAE,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * One-shot probe tools (parity with the original CLI/MCP).
3
+ * @module server/tools/probe
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ /** Register `browser_probe` and `browser_probe_html`. */
7
+ export declare function registerProbeTools(server: McpServer): void;
8
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../../src/server/tools/probe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyC1D"}
@@ -0,0 +1,44 @@
1
+ import { BrowserAgent } from "../../agent/browser-agent.js";
2
+ import { compactReport } from "../../agent/compact.js";
3
+ import { GuardrailViolation } from "../../lib/errors.js";
4
+ import { toAgentOptions, toProbeOptions } from "../map-options.js";
5
+ import { errorResult, jsonResult } from "../result.js";
6
+ import { probeHtmlShape, probeShape } from "../schemas.js";
7
+ /** Register `browser_probe` and `browser_probe_html`. */
8
+ export function registerProbeTools(server) {
9
+ server.registerTool("browser_probe", {
10
+ title: "Browser probe",
11
+ description: "Open a real browser page and return text, screenshot path, network/console logs, optional prices, visual observation and challenge detection.",
12
+ inputSchema: probeShape,
13
+ }, async (args) => {
14
+ const raw = args;
15
+ const agent = new BrowserAgent(toAgentOptions(raw));
16
+ try {
17
+ const report = await agent.probe(String(raw.url), toProbeOptions(raw));
18
+ return jsonResult(compactReport(report));
19
+ }
20
+ catch (err) {
21
+ if (err instanceof GuardrailViolation)
22
+ return errorResult(err.message);
23
+ throw err;
24
+ }
25
+ });
26
+ server.registerTool("browser_probe_html", {
27
+ title: "Browser probe HTML",
28
+ description: "Probe an inline HTML fixture with the same engine. Useful for tests and dry-runs.",
29
+ inputSchema: probeHtmlShape,
30
+ }, async (args) => {
31
+ const raw = args;
32
+ const agent = new BrowserAgent(toAgentOptions(raw));
33
+ try {
34
+ const report = await agent.probeHtml(String(raw.html), toProbeOptions(raw));
35
+ return jsonResult(compactReport(report));
36
+ }
37
+ catch (err) {
38
+ if (err instanceof GuardrailViolation)
39
+ return errorResult(err.message);
40
+ throw err;
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../../src/server/tools/probe.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3D,yDAAyD;AACzD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,+IAA+I;QACjJ,WAAW,EAAE,UAAU;KACxB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YACvE,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,kBAAkB;gBAAE,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,mFAAmF;QAChG,WAAW,EAAE,cAAc;KAC5B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5E,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,kBAAkB;gBAAE,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `browser_run`: execute a multi-step plan in one call (navigate/act/wait/extract),
3
+ * stopping at the first failed step. Reduces LLM round-trips.
4
+ * @module server/tools/run
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { SessionManager } from "../../session/manager.js";
8
+ /** Register `browser_run`. */
9
+ export declare function registerRunTool(server: McpServer, sessions: SessionManager): void;
10
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/server/tools/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D,8BAA8B;AAC9B,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAyBjF"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { runSteps } from "../../agent/run-steps.js";
3
+ import { preflight } from "../../guardrails/preflight.js";
4
+ import { errorResult, jsonResult } from "../result.js";
5
+ import { withSession } from "./with-session.js";
6
+ const stepSchema = z.object({ type: z.string() }).catchall(z.unknown());
7
+ /** Register `browser_run`. */
8
+ export function registerRunTool(server, sessions) {
9
+ server.registerTool("browser_run", {
10
+ title: "Run multi-step plan",
11
+ description: "Execute an ordered list of steps (navigate, click, fill, scroll, press, select, wait_for, extract) in one call. Stops at the first failed step. Sensitive actions need humanApproved.",
12
+ inputSchema: {
13
+ sessionId: z.string(),
14
+ steps: z.array(stepSchema),
15
+ humanApproved: z.boolean().optional(),
16
+ },
17
+ }, async (args) => {
18
+ const a = args;
19
+ const steps = a.steps ?? [];
20
+ const pf = preflight(steps, Boolean(a.humanApproved));
21
+ if (!pf.allowed)
22
+ return errorResult(`Action blocked: ${pf.reason}: ${pf.blockedActions.join(", ")}`);
23
+ return withSession(sessions, String(a.sessionId), async (s) => {
24
+ const results = await runSteps(s.page, steps, s.config.humanMode);
25
+ const ok = results.every((r) => r.ok) && results.length === steps.length;
26
+ return jsonResult({ ok, steps: results, url: s.page.url() });
27
+ });
28
+ });
29
+ }
30
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/server/tools/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAgB,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAExE,8BAA8B;AAC9B,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,QAAwB;IACzE,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,uLAAuL;QACzL,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;YAC1B,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SACtC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,MAAM,KAAK,GAAI,CAAC,CAAC,KAAmB,IAAI,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,mBAAmB,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrG,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC;YACzE,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Screenshot tool: returns a PNG as MCP image content. Optionally targets a
3
+ * single element by its snapshot `ref` (focused vision, fewer image tokens).
4
+ * @module server/tools/screenshot
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { SessionManager } from "../../session/manager.js";
8
+ /** Register `browser_screenshot`. */
9
+ export declare function registerScreenshotTool(server: McpServer, sessions: SessionManager): void;
10
+ //# sourceMappingURL=screenshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/server/tools/screenshot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,qCAAqC;AACrC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAuBxF"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { REF_ATTRIBUTE } from "../../extraction/snapshot.js";
3
+ import { errorResult, imageResult } from "../result.js";
4
+ import { withSession } from "./with-session.js";
5
+ /** Register `browser_screenshot`. */
6
+ export function registerScreenshotTool(server, sessions) {
7
+ server.registerTool("browser_screenshot", {
8
+ title: "Screenshot",
9
+ description: "Capture the live page as a PNG for vision. Pass `ref` (from browser_snapshot) to capture only that element instead of the page.",
10
+ inputSchema: { sessionId: z.string(), fullPage: z.boolean().optional(), ref: z.number().int().optional() },
11
+ }, async (args) => {
12
+ const a = args;
13
+ return withSession(sessions, String(a.sessionId), async (s) => {
14
+ if (typeof a.ref === "number") {
15
+ const locator = s.page.locator(`[${REF_ATTRIBUTE}="${a.ref}"]`).first();
16
+ if ((await locator.count()) === 0)
17
+ return errorResult("ref_not_found");
18
+ const buf = await locator.screenshot({ timeout: 5_000 });
19
+ return imageResult(buf.toString("base64"), `element ref=${a.ref}`);
20
+ }
21
+ const buffer = await s.page.screenshot({ fullPage: Boolean(a.fullPage) });
22
+ return imageResult(buffer.toString("base64"), `screenshot of ${s.page.url()}`);
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/server/tools/screenshot.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qCAAqC;AACrC,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,QAAwB;IAChF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,iIAAiI;QACnI,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;KAC3G,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5D,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,aAAa,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxE,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;oBAAE,OAAO,WAAW,CAAC,eAAe,CAAC,CAAC;gBACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzD,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1E,OAAO,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Session lifecycle tools: open / status / close.
3
+ * @module server/tools/session
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { SessionManager } from "../../session/manager.js";
7
+ /** Register `browser_open`, `browser_status`, `browser_close`. */
8
+ export declare function registerSessionTools(server: McpServer, sessions: SessionManager): void;
9
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/server/tools/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAuCtF"}
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { resolveConfig } from "../../agent/config.js";
3
+ import { buildIdentity } from "../../identity/identity.js";
4
+ import { toAgentOptions } from "../map-options.js";
5
+ import { jsonResult } from "../result.js";
6
+ import { agentOptionShape } from "../schemas.js";
7
+ import { withSession } from "./with-session.js";
8
+ /** Register `browser_open`, `browser_status`, `browser_close`. */
9
+ export function registerSessionTools(server, sessions) {
10
+ server.registerTool("browser_open", { title: "Open browser session", description: "Open a persistent browser session and return its id.", inputSchema: agentOptionShape }, async (args) => {
11
+ const config = resolveConfig(toAgentOptions(args));
12
+ const s = await sessions.open(config);
13
+ const identity = buildIdentity({
14
+ identity: config.identity,
15
+ realisticProfile: config.realisticProfile,
16
+ userDataDir: config.userDataDir,
17
+ proxyUrl: config.proxyUrl,
18
+ proxySource: config.proxySource,
19
+ });
20
+ return jsonResult({ sessionId: s.id, expiresAt: s.expiresAt, identity });
21
+ });
22
+ server.registerTool("browser_status", { title: "Session status", description: "Status of one session (sessionId) or all sessions.", inputSchema: { sessionId: z.string().optional() } }, async (args) => {
23
+ const id = args.sessionId;
24
+ if (!id) {
25
+ return jsonResult({
26
+ sessions: sessions.list().map((s) => ({ sessionId: s.id, url: s.page.url(), expiresAt: s.expiresAt })),
27
+ });
28
+ }
29
+ return withSession(sessions, id, async (s) => jsonResult({ sessionId: s.id, url: s.page.url(), createdAt: s.createdAt, expiresAt: s.expiresAt }));
30
+ });
31
+ server.registerTool("browser_close", { title: "Close session", description: "Close a browser session by id.", inputSchema: { sessionId: z.string() } }, async (args) => jsonResult({ closed: await sessions.close(String(args.sessionId)) }));
32
+ }
33
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/server/tools/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Snapshot + act-by-ref tools: the agentic targeting layer.
3
+ * `browser_snapshot` returns indexed interactive elements (each with a `ref`);
4
+ * `browser_act` executes an action on a chosen `ref` (or text fallback) and
5
+ * returns a diff of what changed on the page (added/removed/text/url).
6
+ * @module server/tools/snapshot
7
+ */
8
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import type { SessionManager } from "../../session/manager.js";
10
+ /** Register `browser_snapshot` and `browser_act`. */
11
+ export declare function registerSnapshotTools(server: McpServer, sessions: SessionManager): void;
12
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/server/tools/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAiB/D,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CA6CvF"}
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import { actByRef } from "../../actions/act-by-ref.js";
3
+ import { smartClick } from "../../actions/smart-click.js";
4
+ import { smartFill } from "../../actions/smart-fill.js";
5
+ import { captureSnapshot } from "../../extraction/snapshot.js";
6
+ import { diffSnapshots } from "../../extraction/snapshot-diff.js";
7
+ import { errorResult, jsonResult } from "../result.js";
8
+ import { withSession } from "./with-session.js";
9
+ const KIND = z.enum(["click", "fill", "select"]);
10
+ /** Run the chosen action (by ref or text fallback). */
11
+ async function runAct(page, a, human) {
12
+ const kind = a.kind;
13
+ const value = a.value ? String(a.value) : "";
14
+ if (typeof a.ref === "number")
15
+ return actByRef(page, a.ref, kind, value);
16
+ if (typeof a.target !== "string")
17
+ return null;
18
+ return kind === "fill"
19
+ ? smartFill(page, a.target, value, "", human)
20
+ : smartClick(page, a.target, "", human);
21
+ }
22
+ /** Register `browser_snapshot` and `browser_act`. */
23
+ export function registerSnapshotTools(server, sessions) {
24
+ server.registerTool("browser_snapshot", {
25
+ title: "Snapshot",
26
+ description: "Return the indexed interactive elements of the live page. Each element gets a stable `ref` to use with browser_act for deterministic targeting.",
27
+ inputSchema: { sessionId: z.string() },
28
+ }, async (args) => {
29
+ const a = args;
30
+ return withSession(sessions, String(a.sessionId), async (s) => {
31
+ const elements = await captureSnapshot(s.page);
32
+ return jsonResult({ url: s.page.url(), count: elements.length, elements });
33
+ });
34
+ });
35
+ server.registerTool("browser_act", {
36
+ title: "Act on element",
37
+ description: "Execute click/fill/select on an element by `ref` (from browser_snapshot) or by `target` text. Returns a diff of what changed (added/removed/text/url).",
38
+ inputSchema: {
39
+ sessionId: z.string(),
40
+ kind: KIND,
41
+ ref: z.number().int().optional(),
42
+ target: z.string().optional(),
43
+ value: z.string().optional(),
44
+ },
45
+ }, async (args) => {
46
+ const a = args;
47
+ return withSession(sessions, String(a.sessionId), async (s) => {
48
+ const before = await captureSnapshot(s.page);
49
+ const urlBefore = s.page.url();
50
+ const result = await runAct(s.page, a, s.config.humanMode);
51
+ if (!result)
52
+ return errorResult("browser_act requires either `ref` or `target`");
53
+ const after = await captureSnapshot(s.page);
54
+ const diff = diffSnapshots(before, after, s.page.url() !== urlBefore);
55
+ return jsonResult({ result, url: s.page.url(), diff });
56
+ });
57
+ });
58
+ }
59
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/server/tools/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `browser_wait_for`: semantic wait on a live session (text/selector/url/gone).
3
+ * @module server/tools/wait
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { SessionManager } from "../../session/manager.js";
7
+ /** Register `browser_wait_for`. */
8
+ export declare function registerWaitTool(server: McpServer, sessions: SessionManager): void;
9
+ //# sourceMappingURL=wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/server/tools/wait.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CA8BlF"}
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ import { waitForCondition } from "../../actions/wait-for.js";
3
+ import { jsonResult } from "../result.js";
4
+ import { withSession } from "./with-session.js";
5
+ /** Register `browser_wait_for`. */
6
+ export function registerWaitTool(server, sessions) {
7
+ server.registerTool("browser_wait_for", {
8
+ title: "Wait for condition",
9
+ description: "Wait until a condition holds: text appears, selector visible, selector gone, or URL contains a substring. Use instead of fixed delays.",
10
+ inputSchema: {
11
+ sessionId: z.string(),
12
+ text: z.string().optional(),
13
+ selector: z.string().optional(),
14
+ gone: z.string().optional(),
15
+ urlContains: z.string().optional(),
16
+ timeoutMs: z.number().int().optional(),
17
+ },
18
+ }, async (args) => {
19
+ const a = args;
20
+ return withSession(sessions, String(a.sessionId), async (s) => {
21
+ const result = await waitForCondition(s.page, {
22
+ text: a.text,
23
+ selector: a.selector,
24
+ gone: a.gone,
25
+ urlContains: a.urlContains,
26
+ timeoutMs: a.timeoutMs,
27
+ });
28
+ return jsonResult({ result, url: s.page.url() });
29
+ });
30
+ });
31
+ }
32
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/server/tools/wait.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,mCAAmC;AACnC,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,QAAwB;IAC1E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,wIAAwI;QAC1I,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;SACvC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC5C,IAAI,EAAE,CAAC,CAAC,IAA0B;gBAClC,QAAQ,EAAE,CAAC,CAAC,QAA8B;gBAC1C,IAAI,EAAE,CAAC,CAAC,IAA0B;gBAClC,WAAW,EAAE,CAAC,CAAC,WAAiC;gBAChD,SAAS,EAAE,CAAC,CAAC,SAA+B;aAC7C,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared helper: resolve a session or return an error result.
3
+ * @module server/tools/with-session
4
+ */
5
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
6
+ import type { SessionManager } from "../../session/manager.js";
7
+ import type { SessionData } from "../../session/session.js";
8
+ /** Run `fn` with the resolved session, or return an error result if missing. */
9
+ export declare function withSession(sessions: SessionManager, id: string, fn: (session: SessionData) => Promise<CallToolResult>): Promise<CallToolResult>;
10
+ //# sourceMappingURL=with-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-session.d.ts","sourceRoot":"","sources":["../../../src/server/tools/with-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,gFAAgF;AAChF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,cAAc,CAAC,GACpD,OAAO,CAAC,cAAc,CAAC,CASzB"}
@@ -0,0 +1,16 @@
1
+ import { SessionNotFoundError } from "../../lib/errors.js";
2
+ import { errorResult } from "../result.js";
3
+ /** Run `fn` with the resolved session, or return an error result if missing. */
4
+ export async function withSession(sessions, id, fn) {
5
+ let session;
6
+ try {
7
+ session = sessions.get(id);
8
+ }
9
+ catch (err) {
10
+ if (err instanceof SessionNotFoundError)
11
+ return errorResult(err.message);
12
+ throw err;
13
+ }
14
+ return fn(session);
15
+ }
16
+ //# sourceMappingURL=with-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-session.js","sourceRoot":"","sources":["../../../src/server/tools/with-session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAwB,EACxB,EAAU,EACV,EAAqD;IAErD,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB;YAAE,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzE,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Session lifecycle manager with per-session TTL cleanup and a concurrent cap.
3
+ * @module session/manager
4
+ */
5
+ import type { ResolvedConfig } from "../agent/config.js";
6
+ import { type SessionData } from "./session.js";
7
+ /** Options for the session manager. */
8
+ export interface SessionManagerOptions {
9
+ /** Idle TTL before a session is auto-closed (ms). */
10
+ ttlMs?: number;
11
+ /** Maximum concurrent live sessions (guards against OOM). */
12
+ maxSessions?: number;
13
+ }
14
+ /** Holds live sessions and closes them on TTL expiry or shutdown. */
15
+ export declare class SessionManager {
16
+ private readonly sessions;
17
+ private readonly timers;
18
+ private readonly ttlMs;
19
+ private readonly maxSessions;
20
+ private counter;
21
+ constructor(opts?: SessionManagerOptions);
22
+ /**
23
+ * Open a new session and schedule its TTL cleanup.
24
+ * @throws {SessionLimitError} when the concurrent cap is reached.
25
+ */
26
+ open(config: ResolvedConfig): Promise<SessionData>;
27
+ /** Get a session (refreshing its TTL) or throw if missing. */
28
+ get(id: string): SessionData;
29
+ /** Refresh a session's TTL. */
30
+ touch(id: string): void;
31
+ private schedule;
32
+ /** Close and remove a session; returns false if it did not exist. */
33
+ close(id: string): Promise<boolean>;
34
+ /** Close every session (used on shutdown). */
35
+ closeAll(): Promise<void>;
36
+ /** Snapshot of currently open sessions. */
37
+ list(): SessionData[];
38
+ }
39
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3E,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qEAAqE;AACrE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAK;gBAER,IAAI,GAAE,qBAA0B;IAK5C;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAUxD,8DAA8D;IAC9D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW;IAO5B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOvB,OAAO,CAAC,QAAQ;IAQhB,qEAAqE;IAC/D,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAazC,8CAA8C;IACxC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,2CAA2C;IAC3C,IAAI,IAAI,WAAW,EAAE;CAGtB"}
@@ -0,0 +1,76 @@
1
+ import { SessionLimitError, SessionNotFoundError } from "../lib/errors.js";
2
+ import { sha1 } from "../lib/fs.js";
3
+ import { closeSession, openSession } from "./session.js";
4
+ /** Holds live sessions and closes them on TTL expiry or shutdown. */
5
+ export class SessionManager {
6
+ sessions = new Map();
7
+ timers = new Map();
8
+ ttlMs;
9
+ maxSessions;
10
+ counter = 0;
11
+ constructor(opts = {}) {
12
+ this.ttlMs = opts.ttlMs ?? 300_000;
13
+ this.maxSessions = opts.maxSessions ?? 8;
14
+ }
15
+ /**
16
+ * Open a new session and schedule its TTL cleanup.
17
+ * @throws {SessionLimitError} when the concurrent cap is reached.
18
+ */
19
+ async open(config) {
20
+ if (this.sessions.size >= this.maxSessions)
21
+ throw new SessionLimitError(this.maxSessions);
22
+ this.counter += 1;
23
+ const id = sha1(`${config.outputDir}-${Date.now()}-${this.counter}`).slice(0, 12);
24
+ const session = await openSession(id, config, this.ttlMs);
25
+ this.sessions.set(id, session);
26
+ this.schedule(id);
27
+ return session;
28
+ }
29
+ /** Get a session (refreshing its TTL) or throw if missing. */
30
+ get(id) {
31
+ const session = this.sessions.get(id);
32
+ if (!session)
33
+ throw new SessionNotFoundError(id);
34
+ this.touch(id);
35
+ return session;
36
+ }
37
+ /** Refresh a session's TTL. */
38
+ touch(id) {
39
+ const session = this.sessions.get(id);
40
+ if (!session)
41
+ return;
42
+ session.expiresAt = Date.now() + this.ttlMs;
43
+ this.schedule(id);
44
+ }
45
+ schedule(id) {
46
+ const existing = this.timers.get(id);
47
+ if (existing)
48
+ clearTimeout(existing);
49
+ const timer = setTimeout(() => void this.close(id), this.ttlMs);
50
+ timer.unref?.();
51
+ this.timers.set(id, timer);
52
+ }
53
+ /** Close and remove a session; returns false if it did not exist. */
54
+ async close(id) {
55
+ const session = this.sessions.get(id);
56
+ if (!session)
57
+ return false;
58
+ this.sessions.delete(id);
59
+ const timer = this.timers.get(id);
60
+ if (timer) {
61
+ clearTimeout(timer);
62
+ this.timers.delete(id);
63
+ }
64
+ await closeSession(session);
65
+ return true;
66
+ }
67
+ /** Close every session (used on shutdown). */
68
+ async closeAll() {
69
+ await Promise.allSettled([...this.sessions.keys()].map((id) => this.close(id)));
70
+ }
71
+ /** Snapshot of currently open sessions. */
72
+ list() {
73
+ return [...this.sessions.values()];
74
+ }
75
+ }
76
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A live browser session: a context + page kept alive between MCP calls.
3
+ * @module session/session
4
+ */
5
+ import type { Browser, BrowserContext, Page } from "playwright";
6
+ import type { ResolvedConfig } from "../agent/config.js";
7
+ import { type NetworkLog } from "../agent/network.js";
8
+ /** Live session state. */
9
+ export interface SessionData {
10
+ id: string;
11
+ context: BrowserContext;
12
+ browser: Browser | null;
13
+ page: Page;
14
+ config: ResolvedConfig;
15
+ logs: NetworkLog;
16
+ connected: boolean;
17
+ createdAt: number;
18
+ expiresAt: number;
19
+ }
20
+ /** Open a new live session with listeners attached. */
21
+ export declare function openSession(id: string, config: ResolvedConfig, ttlMs: number): Promise<SessionData>;
22
+ /**
23
+ * Close a session. For launched browsers, close context + browser. For a CDP
24
+ * attach (`connected`), only drop the link — never close the user's browser
25
+ * or its default context.
26
+ */
27
+ export declare function closeSession(session: SessionData): Promise<void>;
28
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGvE,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBtE"}