@xoxoai/checkmate 0.4.27 → 0.5.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 (397) hide show
  1. package/README.md +259 -224
  2. package/bin/checkmate.js +1 -1
  3. package/dist/ai/client.d.ts +45 -30
  4. package/dist/ai/client.d.ts.map +1 -1
  5. package/dist/ai/client.js +198 -129
  6. package/dist/ai/client.js.map +1 -1
  7. package/dist/ai/message-handler.d.ts +5 -7
  8. package/dist/ai/message-handler.d.ts.map +1 -1
  9. package/dist/ai/message-handler.js +38 -21
  10. package/dist/ai/message-handler.js.map +1 -1
  11. package/dist/ai/message-history.d.ts +4 -6
  12. package/dist/ai/message-history.d.ts.map +1 -1
  13. package/dist/ai/message-history.js +18 -21
  14. package/dist/ai/message-history.js.map +1 -1
  15. package/dist/ai/rate-limit-policy.d.ts +5 -3
  16. package/dist/ai/rate-limit-policy.d.ts.map +1 -1
  17. package/dist/ai/rate-limit-policy.js +24 -7
  18. package/dist/ai/rate-limit-policy.js.map +1 -1
  19. package/dist/ai/tool-response-handler.d.ts +11 -16
  20. package/dist/ai/tool-response-handler.d.ts.map +1 -1
  21. package/dist/ai/tool-response-handler.js +59 -28
  22. package/dist/ai/tool-response-handler.js.map +1 -1
  23. package/dist/ai/turn-processor.d.ts +34 -0
  24. package/dist/ai/turn-processor.d.ts.map +1 -0
  25. package/dist/ai/turn-processor.js +107 -0
  26. package/dist/ai/turn-processor.js.map +1 -0
  27. package/dist/api/allocate-run-identity.d.ts +8 -0
  28. package/dist/api/allocate-run-identity.d.ts.map +1 -0
  29. package/dist/api/allocate-run-identity.js +10 -0
  30. package/dist/api/allocate-run-identity.js.map +1 -0
  31. package/dist/api/execute-prepared-run.d.ts +22 -0
  32. package/dist/api/execute-prepared-run.d.ts.map +1 -0
  33. package/dist/api/execute-prepared-run.js +160 -0
  34. package/dist/api/execute-prepared-run.js.map +1 -0
  35. package/dist/api/index.d.ts +25 -0
  36. package/dist/api/index.d.ts.map +1 -0
  37. package/dist/api/index.js +69 -0
  38. package/dist/api/index.js.map +1 -0
  39. package/dist/api/prepare-run.d.ts +44 -0
  40. package/dist/api/prepare-run.d.ts.map +1 -0
  41. package/dist/api/prepare-run.js +261 -0
  42. package/dist/api/prepare-run.js.map +1 -0
  43. package/dist/cli/diagnostic-relay.d.ts +6 -0
  44. package/dist/cli/diagnostic-relay.d.ts.map +1 -0
  45. package/dist/cli/diagnostic-relay.js +6 -0
  46. package/dist/cli/diagnostic-relay.js.map +1 -0
  47. package/dist/cli/main.d.ts +21 -0
  48. package/dist/cli/main.d.ts.map +1 -0
  49. package/dist/cli/main.js +166 -0
  50. package/dist/cli/main.js.map +1 -0
  51. package/dist/cli/protocol.d.ts +57 -0
  52. package/dist/cli/protocol.d.ts.map +1 -0
  53. package/dist/cli/protocol.js +116 -0
  54. package/dist/cli/protocol.js.map +1 -0
  55. package/dist/cli/reconcile-result.d.ts +13 -0
  56. package/dist/cli/reconcile-result.d.ts.map +1 -0
  57. package/dist/cli/reconcile-result.js +300 -0
  58. package/dist/cli/reconcile-result.js.map +1 -0
  59. package/dist/cli/run-parent.d.ts +37 -0
  60. package/dist/cli/run-parent.d.ts.map +1 -0
  61. package/dist/cli/run-parent.js +491 -0
  62. package/dist/cli/run-parent.js.map +1 -0
  63. package/dist/cli/signals.d.ts +36 -0
  64. package/dist/cli/signals.d.ts.map +1 -0
  65. package/dist/cli/signals.js +85 -0
  66. package/dist/cli/signals.js.map +1 -0
  67. package/dist/cli/static-commands.d.ts +11 -0
  68. package/dist/cli/static-commands.d.ts.map +1 -0
  69. package/dist/cli/static-commands.js +83 -0
  70. package/dist/cli/static-commands.js.map +1 -0
  71. package/dist/cli/worker-stream-guard.d.ts +20 -0
  72. package/dist/cli/worker-stream-guard.d.ts.map +1 -0
  73. package/dist/cli/worker-stream-guard.js +41 -0
  74. package/dist/cli/worker-stream-guard.js.map +1 -0
  75. package/dist/cli/worker.d.ts +3 -0
  76. package/dist/cli/worker.d.ts.map +1 -0
  77. package/dist/cli/worker.js +111 -0
  78. package/dist/cli/worker.js.map +1 -0
  79. package/dist/config/ingestion.d.ts +58 -0
  80. package/dist/config/ingestion.d.ts.map +1 -0
  81. package/dist/config/ingestion.js +283 -0
  82. package/dist/config/ingestion.js.map +1 -0
  83. package/dist/config/manifest.d.ts +20 -0
  84. package/dist/config/manifest.d.ts.map +1 -0
  85. package/dist/config/manifest.js +91 -0
  86. package/dist/config/manifest.js.map +1 -0
  87. package/dist/config/model-egress.d.ts +10 -0
  88. package/dist/config/model-egress.d.ts.map +1 -0
  89. package/dist/config/model-egress.js +62 -0
  90. package/dist/config/model-egress.js.map +1 -0
  91. package/dist/config/package-resolution.d.ts +4 -0
  92. package/dist/config/package-resolution.d.ts.map +1 -0
  93. package/dist/config/package-resolution.js +24 -0
  94. package/dist/config/package-resolution.js.map +1 -0
  95. package/dist/config/policy.d.ts +44 -0
  96. package/dist/config/policy.d.ts.map +1 -0
  97. package/dist/config/policy.js +141 -0
  98. package/dist/config/policy.js.map +1 -0
  99. package/dist/config/record.d.ts +4 -0
  100. package/dist/config/record.d.ts.map +1 -0
  101. package/dist/config/record.js +10 -0
  102. package/dist/config/record.js.map +1 -0
  103. package/dist/config/secrets.d.ts +11 -0
  104. package/dist/config/secrets.d.ts.map +1 -0
  105. package/dist/config/secrets.js +42 -0
  106. package/dist/config/secrets.js.map +1 -0
  107. package/dist/contracts/diagnostics.d.ts +4 -0
  108. package/dist/contracts/diagnostics.d.ts.map +1 -0
  109. package/dist/contracts/diagnostics.js +31 -0
  110. package/dist/contracts/diagnostics.js.map +1 -0
  111. package/dist/contracts/serialize.d.ts +2 -0
  112. package/dist/contracts/serialize.d.ts.map +1 -0
  113. package/dist/contracts/serialize.js +90 -0
  114. package/dist/contracts/serialize.js.map +1 -0
  115. package/dist/contracts/types.d.ts +316 -0
  116. package/dist/contracts/types.d.ts.map +1 -0
  117. package/dist/contracts/types.js +74 -0
  118. package/dist/contracts/types.js.map +1 -0
  119. package/dist/contracts/validator.d.ts +8 -0
  120. package/dist/contracts/validator.d.ts.map +1 -0
  121. package/dist/contracts/validator.js +71 -0
  122. package/dist/contracts/validator.js.map +1 -0
  123. package/dist/driver.d.ts +97 -0
  124. package/dist/driver.d.ts.map +1 -0
  125. package/dist/driver.js +24 -0
  126. package/dist/driver.js.map +1 -0
  127. package/dist/drivers/descriptor.d.ts +15 -0
  128. package/dist/drivers/descriptor.d.ts.map +1 -0
  129. package/dist/drivers/descriptor.js +122 -0
  130. package/dist/drivers/descriptor.js.map +1 -0
  131. package/dist/drivers/loader.d.ts +18 -0
  132. package/dist/drivers/loader.d.ts.map +1 -0
  133. package/dist/drivers/loader.js +97 -0
  134. package/dist/drivers/loader.js.map +1 -0
  135. package/dist/drivers/web/checkmate-driver.json +44 -0
  136. package/dist/drivers/web/index.d.ts +6 -0
  137. package/dist/drivers/web/index.d.ts.map +1 -0
  138. package/dist/drivers/web/index.js +27 -0
  139. package/dist/drivers/web/index.js.map +1 -0
  140. package/dist/drivers/web/session.d.ts +22 -0
  141. package/dist/drivers/web/session.d.ts.map +1 -0
  142. package/dist/drivers/web/session.js +130 -0
  143. package/dist/drivers/web/session.js.map +1 -0
  144. package/dist/drivers/web/tools/network-request-recorder.d.ts +46 -0
  145. package/dist/drivers/web/tools/network-request-recorder.d.ts.map +1 -0
  146. package/dist/drivers/web/tools/network-request-recorder.js +164 -0
  147. package/dist/drivers/web/tools/network-request-recorder.js.map +1 -0
  148. package/dist/{tools/browser → drivers/web/tools}/screenshot-service.d.ts +1 -1
  149. package/dist/drivers/web/tools/screenshot-service.d.ts.map +1 -0
  150. package/dist/drivers/web/tools/screenshot-service.js.map +1 -0
  151. package/dist/drivers/web/tools/snapshot-filter/index.d.ts.map +1 -0
  152. package/dist/drivers/web/tools/snapshot-filter/index.js.map +1 -0
  153. package/dist/drivers/web/tools/snapshot-filter/semantic-scorer.d.ts.map +1 -0
  154. package/dist/drivers/web/tools/snapshot-filter/semantic-scorer.js.map +1 -0
  155. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.d.ts +5 -0
  156. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.d.ts.map +1 -0
  157. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.js +56 -0
  158. package/dist/drivers/web/tools/snapshot-filter/snapshot-filter.js.map +1 -0
  159. package/dist/drivers/web/tools/snapshot-filter/tree-reconstructor.d.ts.map +1 -0
  160. package/dist/drivers/web/tools/snapshot-filter/tree-reconstructor.js.map +1 -0
  161. package/dist/drivers/web/tools/snapshot-service.d.ts +31 -0
  162. package/dist/drivers/web/tools/snapshot-service.d.ts.map +1 -0
  163. package/dist/{tools/browser → drivers/web/tools}/snapshot-service.js +36 -7
  164. package/dist/drivers/web/tools/snapshot-service.js.map +1 -0
  165. package/dist/drivers/web/tools/tool.d.ts +76 -0
  166. package/dist/drivers/web/tools/tool.d.ts.map +1 -0
  167. package/dist/drivers/web/tools/tool.js +562 -0
  168. package/dist/drivers/web/tools/tool.js.map +1 -0
  169. package/dist/drivers/web/tools/transient-state-tracker.d.ts +26 -0
  170. package/dist/drivers/web/tools/transient-state-tracker.d.ts.map +1 -0
  171. package/dist/{tools/browser → drivers/web/tools}/transient-state-tracker.js +54 -19
  172. package/dist/drivers/web/tools/transient-state-tracker.js.map +1 -0
  173. package/dist/drivers/web/tools/types.d.ts +11 -0
  174. package/dist/drivers/web/tools/types.d.ts.map +1 -0
  175. package/dist/drivers/web/tools/types.js +2 -0
  176. package/dist/drivers/web/tools/types.js.map +1 -0
  177. package/dist/evidence/atomic-file.d.ts +23 -0
  178. package/dist/evidence/atomic-file.d.ts.map +1 -0
  179. package/dist/evidence/atomic-file.js +104 -0
  180. package/dist/evidence/atomic-file.js.map +1 -0
  181. package/dist/evidence/layout.d.ts +30 -0
  182. package/dist/evidence/layout.d.ts.map +1 -0
  183. package/dist/evidence/layout.js +152 -0
  184. package/dist/evidence/layout.js.map +1 -0
  185. package/dist/evidence/retention.d.ts +5 -0
  186. package/dist/evidence/retention.d.ts.map +1 -0
  187. package/dist/evidence/retention.js +10 -0
  188. package/dist/evidence/retention.js.map +1 -0
  189. package/dist/evidence/store.d.ts +101 -0
  190. package/dist/evidence/store.d.ts.map +1 -0
  191. package/dist/evidence/store.js +375 -0
  192. package/dist/evidence/store.js.map +1 -0
  193. package/dist/evidence/terminal-finalizer.d.ts +19 -0
  194. package/dist/evidence/terminal-finalizer.d.ts.map +1 -0
  195. package/dist/evidence/terminal-finalizer.js +56 -0
  196. package/dist/evidence/terminal-finalizer.js.map +1 -0
  197. package/dist/index.d.ts +8 -1
  198. package/dist/index.d.ts.map +1 -1
  199. package/dist/index.js +11 -1
  200. package/dist/index.js.map +1 -1
  201. package/dist/logging/invocation-logger.d.ts +4 -0
  202. package/dist/logging/invocation-logger.d.ts.map +1 -0
  203. package/dist/logging/invocation-logger.js +25 -0
  204. package/dist/logging/invocation-logger.js.map +1 -0
  205. package/dist/logging/types.d.ts +8 -0
  206. package/dist/logging/types.d.ts.map +1 -0
  207. package/dist/logging/types.js +7 -0
  208. package/dist/logging/types.js.map +1 -0
  209. package/dist/redaction/diagnostic-sanitizer.d.ts +7 -0
  210. package/dist/redaction/diagnostic-sanitizer.d.ts.map +1 -0
  211. package/dist/redaction/diagnostic-sanitizer.js +42 -0
  212. package/dist/redaction/diagnostic-sanitizer.js.map +1 -0
  213. package/dist/redaction/redactor.d.ts +40 -0
  214. package/dist/redaction/redactor.d.ts.map +1 -0
  215. package/dist/redaction/redactor.js +176 -0
  216. package/dist/redaction/redactor.js.map +1 -0
  217. package/dist/redaction/scrub.d.ts +29 -0
  218. package/dist/redaction/scrub.d.ts.map +1 -0
  219. package/dist/redaction/scrub.js +54 -0
  220. package/dist/redaction/scrub.js.map +1 -0
  221. package/dist/runtime/config.d.ts +15 -0
  222. package/dist/runtime/config.d.ts.map +1 -0
  223. package/dist/runtime/config.js +2 -0
  224. package/dist/runtime/config.js.map +1 -0
  225. package/dist/runtime/driver-boundary.d.ts +16 -0
  226. package/dist/runtime/driver-boundary.d.ts.map +1 -0
  227. package/dist/runtime/driver-boundary.js +71 -0
  228. package/dist/runtime/driver-boundary.js.map +1 -0
  229. package/dist/runtime/driver-session.d.ts +9 -0
  230. package/dist/runtime/driver-session.d.ts.map +1 -0
  231. package/dist/runtime/driver-session.js +64 -0
  232. package/dist/runtime/driver-session.js.map +1 -0
  233. package/dist/runtime/internal-step-evidence.d.ts +30 -0
  234. package/dist/runtime/internal-step-evidence.d.ts.map +1 -0
  235. package/dist/runtime/internal-step-evidence.js +82 -0
  236. package/dist/runtime/internal-step-evidence.js.map +1 -0
  237. package/dist/runtime/result-adapter.d.ts +9 -0
  238. package/dist/runtime/result-adapter.d.ts.map +1 -0
  239. package/dist/runtime/result-adapter.js +77 -0
  240. package/dist/runtime/result-adapter.js.map +1 -0
  241. package/dist/runtime/runner.d.ts +35 -88
  242. package/dist/runtime/runner.d.ts.map +1 -1
  243. package/dist/runtime/runner.js +60 -74
  244. package/dist/runtime/runner.js.map +1 -1
  245. package/dist/runtime/scenario-control.d.ts +40 -0
  246. package/dist/runtime/scenario-control.d.ts.map +1 -0
  247. package/dist/runtime/scenario-control.js +94 -0
  248. package/dist/runtime/scenario-control.js.map +1 -0
  249. package/dist/runtime/scenario-runner.d.ts +39 -0
  250. package/dist/runtime/scenario-runner.d.ts.map +1 -0
  251. package/dist/runtime/scenario-runner.js +273 -0
  252. package/dist/runtime/scenario-runner.js.map +1 -0
  253. package/dist/runtime/scenario-state.d.ts +55 -0
  254. package/dist/runtime/scenario-state.d.ts.map +1 -0
  255. package/dist/runtime/scenario-state.js +128 -0
  256. package/dist/runtime/scenario-state.js.map +1 -0
  257. package/dist/runtime/step-execution.d.ts +24 -14
  258. package/dist/runtime/step-execution.d.ts.map +1 -1
  259. package/dist/runtime/step-execution.js +130 -36
  260. package/dist/runtime/step-execution.js.map +1 -1
  261. package/dist/runtime/text.d.ts +10 -0
  262. package/dist/runtime/text.d.ts.map +1 -0
  263. package/dist/runtime/text.js +25 -0
  264. package/dist/runtime/text.js.map +1 -0
  265. package/dist/runtime/types.d.ts +50 -76
  266. package/dist/runtime/types.d.ts.map +1 -1
  267. package/dist/runtime/usage-tracker.d.ts +37 -0
  268. package/dist/runtime/usage-tracker.d.ts.map +1 -0
  269. package/dist/runtime/usage-tracker.js +110 -0
  270. package/dist/runtime/usage-tracker.js.map +1 -0
  271. package/dist/tools/define-agent-tool.d.ts +3 -28
  272. package/dist/tools/define-agent-tool.d.ts.map +1 -1
  273. package/dist/tools/define-agent-tool.js +3 -28
  274. package/dist/tools/define-agent-tool.js.map +1 -1
  275. package/dist/tools/dispatcher.d.ts +11 -3
  276. package/dist/tools/dispatcher.d.ts.map +1 -1
  277. package/dist/tools/dispatcher.js +50 -8
  278. package/dist/tools/dispatcher.js.map +1 -1
  279. package/dist/tools/registry.d.ts +8 -10
  280. package/dist/tools/registry.d.ts.map +1 -1
  281. package/dist/tools/registry.js +19 -11
  282. package/dist/tools/registry.js.map +1 -1
  283. package/dist/tools/step/result-tool.d.ts.map +1 -1
  284. package/dist/tools/step/result-tool.js +8 -6
  285. package/dist/tools/step/result-tool.js.map +1 -1
  286. package/dist/tools/tool-contract.d.ts +1 -1
  287. package/dist/tools/tool-contract.d.ts.map +1 -1
  288. package/dist/tools/tool-contract.js.map +1 -1
  289. package/dist/tools/types.d.ts +77 -6
  290. package/dist/tools/types.d.ts.map +1 -1
  291. package/dist/tools/types.js.map +1 -1
  292. package/docs/CLI.md +59 -0
  293. package/docs/CONFIGURATION.md +91 -0
  294. package/docs/DRIVERS.md +75 -0
  295. package/docs/EVIDENCE.md +62 -0
  296. package/package.json +51 -59
  297. package/schemas/checkmate-config.v1.json +176 -0
  298. package/schemas/describe-result.v1.json +414 -0
  299. package/schemas/driver-descriptor.v1.json +66 -0
  300. package/schemas/run-request.v1.json +67 -0
  301. package/schemas/run-result.v1.json +333 -0
  302. package/schemas/validation-result.v1.json +86 -0
  303. package/dist/ai/response-processor.d.ts +0 -20
  304. package/dist/ai/response-processor.d.ts.map +0 -1
  305. package/dist/ai/response-processor.js +0 -62
  306. package/dist/ai/response-processor.js.map +0 -1
  307. package/dist/ai/token-pricing.d.ts +0 -13
  308. package/dist/ai/token-pricing.d.ts.map +0 -1
  309. package/dist/ai/token-pricing.js +0 -348
  310. package/dist/ai/token-pricing.js.map +0 -1
  311. package/dist/ai/token-tracker.d.ts +0 -33
  312. package/dist/ai/token-tracker.d.ts.map +0 -1
  313. package/dist/ai/token-tracker.js +0 -138
  314. package/dist/ai/token-tracker.js.map +0 -1
  315. package/dist/cli/create-examples.d.ts +0 -21
  316. package/dist/cli/create-examples.d.ts.map +0 -1
  317. package/dist/cli/create-examples.js +0 -116
  318. package/dist/cli/create-examples.js.map +0 -1
  319. package/dist/cli.d.ts +0 -15
  320. package/dist/cli.d.ts.map +0 -1
  321. package/dist/cli.js +0 -69
  322. package/dist/cli.js.map +0 -1
  323. package/dist/config/runtime-config.d.ts +0 -21
  324. package/dist/config/runtime-config.d.ts.map +0 -1
  325. package/dist/config/runtime-config.js +0 -98
  326. package/dist/config/runtime-config.js.map +0 -1
  327. package/dist/core.d.ts +0 -8
  328. package/dist/core.d.ts.map +0 -1
  329. package/dist/core.js +0 -4
  330. package/dist/core.js.map +0 -1
  331. package/dist/integrations/salesforce/authenticator.d.ts +0 -27
  332. package/dist/integrations/salesforce/authenticator.d.ts.map +0 -1
  333. package/dist/integrations/salesforce/authenticator.js +0 -27
  334. package/dist/integrations/salesforce/authenticator.js.map +0 -1
  335. package/dist/integrations/salesforce/cli-handler.d.ts +0 -14
  336. package/dist/integrations/salesforce/cli-handler.d.ts.map +0 -1
  337. package/dist/integrations/salesforce/cli-handler.js +0 -50
  338. package/dist/integrations/salesforce/cli-handler.js.map +0 -1
  339. package/dist/logging/index.d.ts +0 -2
  340. package/dist/logging/index.d.ts.map +0 -1
  341. package/dist/logging/index.js +0 -4
  342. package/dist/logging/index.js.map +0 -1
  343. package/dist/logging/logger.d.ts +0 -5
  344. package/dist/logging/logger.d.ts.map +0 -1
  345. package/dist/logging/logger.js +0 -15
  346. package/dist/logging/logger.js.map +0 -1
  347. package/dist/playwright.d.ts +0 -102
  348. package/dist/playwright.d.ts.map +0 -1
  349. package/dist/playwright.js +0 -116
  350. package/dist/playwright.js.map +0 -1
  351. package/dist/runtime/extension.d.ts +0 -274
  352. package/dist/runtime/extension.d.ts.map +0 -1
  353. package/dist/runtime/extension.js +0 -171
  354. package/dist/runtime/extension.js.map +0 -1
  355. package/dist/salesforce.d.ts +0 -71
  356. package/dist/salesforce.d.ts.map +0 -1
  357. package/dist/salesforce.js +0 -73
  358. package/dist/salesforce.js.map +0 -1
  359. package/dist/tools/browser/screenshot-service.d.ts.map +0 -1
  360. package/dist/tools/browser/screenshot-service.js.map +0 -1
  361. package/dist/tools/browser/snapshot-filter/index.d.ts.map +0 -1
  362. package/dist/tools/browser/snapshot-filter/index.js.map +0 -1
  363. package/dist/tools/browser/snapshot-filter/semantic-scorer.d.ts.map +0 -1
  364. package/dist/tools/browser/snapshot-filter/semantic-scorer.js.map +0 -1
  365. package/dist/tools/browser/snapshot-filter/snapshot-filter.d.ts +0 -4
  366. package/dist/tools/browser/snapshot-filter/snapshot-filter.d.ts.map +0 -1
  367. package/dist/tools/browser/snapshot-filter/snapshot-filter.js +0 -57
  368. package/dist/tools/browser/snapshot-filter/snapshot-filter.js.map +0 -1
  369. package/dist/tools/browser/snapshot-filter/tree-reconstructor.d.ts.map +0 -1
  370. package/dist/tools/browser/snapshot-filter/tree-reconstructor.js.map +0 -1
  371. package/dist/tools/browser/snapshot-service.d.ts +0 -19
  372. package/dist/tools/browser/snapshot-service.d.ts.map +0 -1
  373. package/dist/tools/browser/snapshot-service.js.map +0 -1
  374. package/dist/tools/browser/tool.d.ts +0 -34
  375. package/dist/tools/browser/tool.d.ts.map +0 -1
  376. package/dist/tools/browser/tool.js +0 -226
  377. package/dist/tools/browser/tool.js.map +0 -1
  378. package/dist/tools/browser/transient-state-tracker.d.ts +0 -16
  379. package/dist/tools/browser/transient-state-tracker.d.ts.map +0 -1
  380. package/dist/tools/browser/transient-state-tracker.js.map +0 -1
  381. package/dist/tools/salesforce/login-tool.d.ts +0 -7
  382. package/dist/tools/salesforce/login-tool.d.ts.map +0 -1
  383. package/dist/tools/salesforce/login-tool.js +0 -25
  384. package/dist/tools/salesforce/login-tool.js.map +0 -1
  385. package/docs/EXTENSIONS.md +0 -232
  386. package/docs/GUIDE.md +0 -465
  387. package/docs/ROADMAP.md +0 -47
  388. package/playwright.config.ts +0 -39
  389. package/test/examples/salesforce/trial-dev-org.spec.ts +0 -82
  390. package/test/examples/web/website-testing.spec.ts +0 -281
  391. /package/dist/{tools/browser → drivers/web/tools}/screenshot-service.js +0 -0
  392. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/index.d.ts +0 -0
  393. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/index.js +0 -0
  394. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/semantic-scorer.d.ts +0 -0
  395. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/semantic-scorer.js +0 -0
  396. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/tree-reconstructor.d.ts +0 -0
  397. /package/dist/{tools/browser → drivers/web/tools}/snapshot-filter/tree-reconstructor.js +0 -0
@@ -0,0 +1,76 @@
1
+ import type { BrowserContext, Page } from 'playwright';
2
+ import type { RuntimeLogger } from '../../../logging/types.js';
3
+ import { AgentTool, AgentToolResponse } from '../../../tools/types.js';
4
+ import type { BrowserStepIntent, WebToolSettings } from './types.js';
5
+ type BrowserInputElement = {
6
+ ref: string;
7
+ text: string;
8
+ name: string;
9
+ clear: boolean;
10
+ select: boolean;
11
+ };
12
+ export declare const BrowserTool: {
13
+ readonly TOOL_NAVIGATE: "browser_navigate";
14
+ readonly TOOL_CLICK_OR_HOVER: "browser_click_or_hover";
15
+ readonly TOOL_SET_DIALOG_RESPONSE: "browser_set_dialog_response";
16
+ readonly TOOL_DRAG: "browser_drag";
17
+ readonly TOOL_UPLOAD: "browser_upload";
18
+ readonly TOOL_TYPE_OR_SELECT: "browser_type_or_select";
19
+ readonly TOOL_PRESS_KEY: "browser_press_key";
20
+ readonly TOOL_SNAPSHOT: "browser_snapshot";
21
+ readonly TOOL_WAIT: "browser_wait";
22
+ readonly TOOL_LIST_TABS: "browser_list_tabs";
23
+ readonly TOOL_SELECT_TAB: "browser_select_tab";
24
+ readonly TOOL_CLOSE_TAB: "browser_close_tab";
25
+ readonly TOOL_NETWORK_REQUESTS: "browser_network_requests";
26
+ readonly TOOL_NETWORK_REQUEST: "browser_network_request";
27
+ };
28
+ export declare class BrowserToolRuntime {
29
+ private readonly config;
30
+ private readonly runtimeLogger;
31
+ private readonly browserContext;
32
+ private activePage;
33
+ private nextPageNumber;
34
+ private readonly pageIds;
35
+ private readonly pagesById;
36
+ private pendingDialogHandlingIntent;
37
+ private readonly networkRecorder;
38
+ constructor(page: Page, config: WebToolSettings, runtimeLogger: RuntimeLogger);
39
+ getActivePage(): Page;
40
+ getBrowserContext(): BrowserContext;
41
+ listNetworkRequests(includeStatic: boolean): string;
42
+ inspectNetworkRequest(sequence: number, part: 'detail' | 'request-body' | 'response-body'): Promise<string>;
43
+ dispose(): void;
44
+ listPages(): Promise<string>;
45
+ selectPage(pageId: string, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
46
+ closePage(pageId: string | null | undefined, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
47
+ setDialogResponse(action: 'accept' | 'dismiss', promptText?: string): string;
48
+ navigateToUrl(url: string, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
49
+ clickElement(ref: string, hover: boolean, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
50
+ dragElement(sourceRef: string, targetRef: string, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
51
+ uploadFiles(ref: string, filePaths: string[], step: BrowserStepIntent): Promise<AgentToolResponse | string>;
52
+ typeOrSelectInElement(elements: BrowserInputElement[], step: BrowserStepIntent): Promise<AgentToolResponse | string>;
53
+ pressKey(key: string, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
54
+ captureCurrentSnapshot(step: BrowserStepIntent, options?: {
55
+ skipFilter?: boolean;
56
+ }): Promise<string>;
57
+ wait(seconds: number, step: BrowserStepIntent): Promise<AgentToolResponse | string>;
58
+ private consumePendingDialogHandlingIntent;
59
+ private registerExistingPages;
60
+ private registerPage;
61
+ ensureActivePage(): Promise<Page>;
62
+ private openPages;
63
+ private findOpenPage;
64
+ private setActivePage;
65
+ private selectFallbackActivePage;
66
+ private selectNewestFallbackActivePage;
67
+ private setNewestFallbackActivePage;
68
+ private selectNewPageOpenedAfter;
69
+ private isPageClosed;
70
+ private safeTitle;
71
+ private waitForPageEventLoop;
72
+ private wrapWithTracker;
73
+ }
74
+ export declare function createBrowserTools(runtime: BrowserToolRuntime): AgentTool[];
75
+ export {};
76
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/drivers/web/tools/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,562 @@
1
+ import { z } from 'zod/v4';
2
+ import { defineAgentTool } from '../../../tools/define-agent-tool.js';
3
+ import { NetworkRequestRecorder } from './network-request-recorder.js';
4
+ import { SnapshotService } from './snapshot-service.js';
5
+ import { TransientStateTracker } from './transient-state-tracker.js';
6
+ export const BrowserTool = {
7
+ TOOL_NAVIGATE: 'browser_navigate',
8
+ TOOL_CLICK_OR_HOVER: 'browser_click_or_hover',
9
+ TOOL_SET_DIALOG_RESPONSE: 'browser_set_dialog_response',
10
+ TOOL_DRAG: 'browser_drag',
11
+ TOOL_UPLOAD: 'browser_upload',
12
+ TOOL_TYPE_OR_SELECT: 'browser_type_or_select',
13
+ TOOL_PRESS_KEY: 'browser_press_key',
14
+ TOOL_SNAPSHOT: 'browser_snapshot',
15
+ TOOL_WAIT: 'browser_wait',
16
+ TOOL_LIST_TABS: 'browser_list_tabs',
17
+ TOOL_SELECT_TAB: 'browser_select_tab',
18
+ TOOL_CLOSE_TAB: 'browser_close_tab',
19
+ TOOL_NETWORK_REQUESTS: 'browser_network_requests',
20
+ TOOL_NETWORK_REQUEST: 'browser_network_request',
21
+ };
22
+ const browserInputElementSchema = z
23
+ .object({
24
+ ref: z.string().describe('ref value of the element from the snapshot, example: e123'),
25
+ name: z.string().describe('name of the element to type into, example: Username Input'),
26
+ text: z.string().describe('The text to type into the element, example: Hello World'),
27
+ clear: z
28
+ .boolean()
29
+ .describe('If true, clears existing text before typing. Use false with dropdowns and selects'),
30
+ select: z.boolean().describe('If true, selects the option matching "text" from a dropdown or select element'),
31
+ })
32
+ .strict();
33
+ const dialogResponseSchema = z
34
+ .object({
35
+ action: z.enum(['accept', 'dismiss']).describe('How to answer the next JavaScript alert, confirm, or prompt'),
36
+ promptText: z.string().nullable().describe('Text to submit when accepting a prompt() dialog'),
37
+ goal: z.string().describe('The goal or purpose of handling the next dialog'),
38
+ })
39
+ .strict();
40
+ export class BrowserToolRuntime {
41
+ config;
42
+ runtimeLogger;
43
+ browserContext;
44
+ activePage;
45
+ nextPageNumber = 1;
46
+ pageIds = new Map();
47
+ pagesById = new Map();
48
+ pendingDialogHandlingIntent = null;
49
+ networkRecorder;
50
+ constructor(page, config, runtimeLogger) {
51
+ this.config = config;
52
+ this.runtimeLogger = runtimeLogger;
53
+ this.browserContext = page.context();
54
+ this.activePage = page;
55
+ this.networkRecorder = new NetworkRequestRecorder(this.browserContext);
56
+ this.networkRecorder.attach();
57
+ this.registerExistingPages();
58
+ this.setActivePage(page);
59
+ this.browserContext.on('page', (newPage) => {
60
+ this.registerPage(newPage);
61
+ this.setActivePage(newPage);
62
+ });
63
+ }
64
+ getActivePage() {
65
+ if (this.isPageClosed(this.activePage)) {
66
+ this.selectNewestFallbackActivePage();
67
+ }
68
+ if (this.isPageClosed(this.activePage)) {
69
+ throw new Error('No open browser pages remain in this context.');
70
+ }
71
+ return this.activePage;
72
+ }
73
+ getBrowserContext() {
74
+ return this.browserContext;
75
+ }
76
+ listNetworkRequests(includeStatic) {
77
+ return this.networkRecorder.format({ includeStatic }) || 'No API calls were made since the last browser action.';
78
+ }
79
+ async inspectNetworkRequest(sequence, part) {
80
+ if (part === 'detail') {
81
+ return this.networkRecorder.detail(sequence);
82
+ }
83
+ return this.networkRecorder.body(sequence, part === 'request-body' ? 'request' : 'response');
84
+ }
85
+ dispose() {
86
+ this.networkRecorder.detach();
87
+ }
88
+ async listPages() {
89
+ await this.ensureActivePage();
90
+ const pages = await this.openPages();
91
+ if (pages.length === 0) {
92
+ return 'No open browser tabs.';
93
+ }
94
+ const lines = await Promise.all(pages.map(async (page) => {
95
+ const id = this.registerPage(page);
96
+ const marker = page === this.getActivePage() ? ' (active)' : '';
97
+ return `${id}${marker}: ${page.url()} - ${await this.safeTitle(page)}`;
98
+ }));
99
+ return [`Open browser tabs:`, ...lines].join('\n');
100
+ }
101
+ async selectPage(pageId, step) {
102
+ const page = await this.findOpenPage(pageId);
103
+ if (!page) {
104
+ return `Browser tab '${pageId}' was not found or is closed.`;
105
+ }
106
+ await this.setActivePage(page);
107
+ return {
108
+ response: `Selected browser tab ${pageId}: ${page.url()}`,
109
+ snapshot: await this.captureCurrentSnapshot(step),
110
+ };
111
+ }
112
+ async closePage(pageId, step) {
113
+ const pages = await this.openPages();
114
+ if (pages.length <= 1) {
115
+ return 'Cannot close the last open browser tab.';
116
+ }
117
+ const page = pageId ? await this.findOpenPage(pageId) : await this.ensureActivePage();
118
+ if (!page || this.isPageClosed(page)) {
119
+ return `Browser tab '${pageId}' was not found or is closed.`;
120
+ }
121
+ const closedId = this.registerPage(page);
122
+ await page.close();
123
+ await this.selectFallbackActivePage(page);
124
+ const activePage = this.getActivePage();
125
+ const activeId = this.registerPage(activePage);
126
+ return {
127
+ response: `Closed browser tab ${closedId}. Active tab is now ${activeId}: ${activePage.url()}`,
128
+ snapshot: await this.captureCurrentSnapshot(step),
129
+ };
130
+ }
131
+ setDialogResponse(action, promptText) {
132
+ if (action === 'dismiss') {
133
+ this.pendingDialogHandlingIntent = { action };
134
+ return 'Will dismiss the next JavaScript dialog.';
135
+ }
136
+ this.pendingDialogHandlingIntent = promptText === undefined ? { action } : { action, promptText };
137
+ return promptText === undefined
138
+ ? 'Will accept the next JavaScript dialog.'
139
+ : 'Will accept the next JavaScript dialog with prompt text.';
140
+ }
141
+ async navigateToUrl(url, step) {
142
+ return this.wrapWithTracker(async (page) => {
143
+ if (!url) {
144
+ throw new Error(`valid URL is required for ${BrowserTool.TOOL_NAVIGATE} but received: '${url}'`);
145
+ }
146
+ try {
147
+ await page.goto(url);
148
+ }
149
+ catch (error) {
150
+ throw new Error(`Failed to navigate to URL ${url}`, { cause: error });
151
+ }
152
+ }, `Navigated to: ${url}`, step);
153
+ }
154
+ async clickElement(ref, hover, step) {
155
+ return this.wrapWithTracker(async (page) => {
156
+ try {
157
+ if (hover) {
158
+ await page.hover(`aria-ref=${ref}`);
159
+ }
160
+ else {
161
+ await page.click(`aria-ref=${ref}`);
162
+ }
163
+ }
164
+ catch (error) {
165
+ this.runtimeLogger.error(`error clicking element with ref '${ref}' due to:\n${error}`);
166
+ return `failed to click element with ref '${ref}':\n${error} try with different element type or ref`;
167
+ }
168
+ }, hover ? `Hovered element with ref '${ref}'.` : `Clicked element with ref '${ref}'.`, step);
169
+ }
170
+ async dragElement(sourceRef, targetRef, step) {
171
+ return this.wrapWithTracker(async (page) => {
172
+ try {
173
+ if (!sourceRef || !targetRef) {
174
+ throw new Error(`both 'sourceRef' and 'targetRef' are required for ${BrowserTool.TOOL_DRAG} but received sourceRef='${sourceRef}' and targetRef='${targetRef}'`);
175
+ }
176
+ const source = page.locator(`aria-ref=${sourceRef}`);
177
+ const target = page.locator(`aria-ref=${targetRef}`);
178
+ await source.dragTo(target);
179
+ }
180
+ catch (error) {
181
+ this.runtimeLogger.error(`error dragging element with ref '${sourceRef}' to element with ref '${targetRef}' due to:\n${error}`);
182
+ return `failed to drag element with ref '${sourceRef}' to element with ref '${targetRef}':\n${error}\n try with different element type or ref`;
183
+ }
184
+ }, `Dragged element with ref '${sourceRef}' to element with ref '${targetRef}'.`, step);
185
+ }
186
+ async uploadFiles(ref, filePaths, step) {
187
+ return this.wrapWithTracker(async (page) => {
188
+ try {
189
+ if (!ref || filePaths.length === 0 || filePaths.some((filePath) => !filePath)) {
190
+ throw new Error(`'ref' and at least one file path are required for ${BrowserTool.TOOL_UPLOAD} but received ref='${ref}' and filePaths='${filePaths.join(', ')}'`);
191
+ }
192
+ await page.locator(`aria-ref=${ref}`).setInputFiles(filePaths);
193
+ }
194
+ catch (error) {
195
+ this.runtimeLogger.error(`error uploading files to element with ref '${ref}' due to:\n${error}`);
196
+ return `failed to upload files to element with ref '${ref}':\n${error}\n try with different element type, ref, or file path`;
197
+ }
198
+ }, `Uploaded ${filePaths.length} file${filePaths.length === 1 ? '' : 's'} to element with ref '${ref}'.`, step);
199
+ }
200
+ async typeOrSelectInElement(elements, step) {
201
+ return this.wrapWithTracker(async (page) => {
202
+ for (const element of elements) {
203
+ try {
204
+ if (!element.ref || element.text === undefined || element.text === null) {
205
+ throw new Error(`both 'ref' and 'text' are required for ${BrowserTool.TOOL_TYPE_OR_SELECT} but received ref='${element.ref}' and text='${element.text}'`);
206
+ }
207
+ if (!element.select && element.clear) {
208
+ await page.locator(`aria-ref=${element.ref}`).clear();
209
+ }
210
+ if (element.select && element.text.length > 0) {
211
+ await page.locator(`aria-ref=${element.ref}`).selectOption(element.text);
212
+ continue;
213
+ }
214
+ if (!element.select && element.text.length > 0) {
215
+ await page.locator(`aria-ref=${element.ref}`).pressSequentially(element.text, { delay: 50 });
216
+ }
217
+ }
218
+ catch (error) {
219
+ this.runtimeLogger.error(`error ${element.select ? 'selecting' : 'typing'} '${element.text}' in element with ref '${element.ref}' due to:\n${error}`);
220
+ return `failed to ${element.select ? 'select' : 'type'} '${element.text}' in element with ref '${element.ref}':\n${error}\n try with different element type or ref`;
221
+ }
222
+ }
223
+ }, `Updated ${elements.length} page element${elements.length === 1 ? '' : 's'}.`, step);
224
+ }
225
+ async pressKey(key, step) {
226
+ return this.wrapWithTracker(async (page) => {
227
+ try {
228
+ if (!key) {
229
+ throw new Error(`'key' is required for ${BrowserTool.TOOL_PRESS_KEY} but received: '${key}'`);
230
+ }
231
+ await page.keyboard.press(key);
232
+ }
233
+ catch (error) {
234
+ this.runtimeLogger.error(`error pressing key '${key}' due to:\n${error}`);
235
+ return `failed to press key '${key}':\n${error}`;
236
+ }
237
+ }, `Pressed key '${key}'.`, step);
238
+ }
239
+ async captureCurrentSnapshot(step, options = {}) {
240
+ const page = await this.ensureActivePage();
241
+ return new SnapshotService(page, this.config, this.runtimeLogger, step, {
242
+ skipFilter: options.skipFilter,
243
+ }).get();
244
+ }
245
+ async wait(seconds, step) {
246
+ return this.wrapWithTracker(async (page) => {
247
+ try {
248
+ if (!Number.isFinite(seconds) || seconds <= 0) {
249
+ throw new Error(`invalid seconds value received: ${seconds}. It should be a positive number.`);
250
+ }
251
+ await page.waitForTimeout(seconds * 1000);
252
+ }
253
+ catch (error) {
254
+ this.runtimeLogger.error(`error waiting for ${seconds} seconds due to:\n${error}`);
255
+ return `failed to wait for ${seconds} seconds:\n${error}`;
256
+ }
257
+ }, `Waited ${seconds} seconds.`, step);
258
+ }
259
+ consumePendingDialogHandlingIntent() {
260
+ const intent = this.pendingDialogHandlingIntent;
261
+ this.pendingDialogHandlingIntent = null;
262
+ return intent;
263
+ }
264
+ registerExistingPages() {
265
+ for (const page of this.browserContext.pages()) {
266
+ this.registerPage(page);
267
+ }
268
+ }
269
+ registerPage(page) {
270
+ const existingId = this.pageIds.get(page);
271
+ if (existingId) {
272
+ return existingId;
273
+ }
274
+ const id = `p${this.nextPageNumber++}`;
275
+ this.pageIds.set(page, id);
276
+ this.pagesById.set(id, page);
277
+ return id;
278
+ }
279
+ async ensureActivePage() {
280
+ if (this.isPageClosed(this.activePage)) {
281
+ await this.selectFallbackActivePage(this.activePage);
282
+ }
283
+ return this.getActivePage();
284
+ }
285
+ async openPages() {
286
+ this.registerExistingPages();
287
+ const pages = this.browserContext.pages().filter((page) => !this.isPageClosed(page));
288
+ for (const page of pages) {
289
+ this.registerPage(page);
290
+ }
291
+ if (pages.length > 0 && this.isPageClosed(this.activePage)) {
292
+ await this.selectFallbackActivePage(this.activePage);
293
+ }
294
+ return pages;
295
+ }
296
+ async findOpenPage(pageId) {
297
+ await this.openPages();
298
+ const page = this.pagesById.get(pageId);
299
+ return page && !this.isPageClosed(page) ? page : null;
300
+ }
301
+ async setActivePage(page) {
302
+ this.registerPage(page);
303
+ this.activePage = page;
304
+ await page.bringToFront().catch(() => undefined);
305
+ }
306
+ async selectFallbackActivePage(closedPage) {
307
+ const opener = await closedPage.opener().catch(() => null);
308
+ if (opener && !this.isPageClosed(opener)) {
309
+ await this.setActivePage(opener);
310
+ return;
311
+ }
312
+ await this.setNewestFallbackActivePage();
313
+ }
314
+ selectNewestFallbackActivePage() {
315
+ const page = this.browserContext
316
+ .pages()
317
+ .filter((candidate) => !this.isPageClosed(candidate))
318
+ .at(-1);
319
+ if (page) {
320
+ this.registerPage(page);
321
+ this.activePage = page;
322
+ }
323
+ }
324
+ async setNewestFallbackActivePage() {
325
+ this.selectNewestFallbackActivePage();
326
+ if (!this.isPageClosed(this.activePage)) {
327
+ await this.setActivePage(this.activePage);
328
+ }
329
+ }
330
+ async selectNewPageOpenedAfter(knownPages) {
331
+ await this.waitForPageEventLoop();
332
+ this.registerExistingPages();
333
+ const activePage = this.getActivePage();
334
+ const newPage = !knownPages.has(activePage)
335
+ ? activePage
336
+ : this.browserContext
337
+ .pages()
338
+ .filter((page) => !knownPages.has(page) && !this.isPageClosed(page))
339
+ .at(-1);
340
+ if (!newPage) {
341
+ return '';
342
+ }
343
+ await this.setActivePage(newPage);
344
+ await newPage.waitForLoadState('domcontentloaded', { timeout: 2_000 }).catch(() => undefined);
345
+ const id = this.registerPage(newPage);
346
+ return `Opened new tab ${id}: ${newPage.url()}. Active tab is now ${id}.`;
347
+ }
348
+ isPageClosed(page) {
349
+ return page.isClosed();
350
+ }
351
+ async safeTitle(page) {
352
+ return page.title().catch(() => '');
353
+ }
354
+ async waitForPageEventLoop() {
355
+ await new Promise((resolve) => setTimeout(resolve, 0));
356
+ }
357
+ async wrapWithTracker(action, fallbackResponse, step) {
358
+ const page = await this.ensureActivePage();
359
+ const knownPages = new Set(this.browserContext.pages());
360
+ this.networkRecorder.reset();
361
+ const tracker = new TransientStateTracker(page, {
362
+ consumeDialogHandlingIntent: () => this.consumePendingDialogHandlingIntent(),
363
+ logger: this.runtimeLogger,
364
+ });
365
+ await tracker.start();
366
+ try {
367
+ const actionResult = await action(page);
368
+ const tabChangeResponse = await this.selectNewPageOpenedAfter(knownPages);
369
+ if (typeof actionResult === 'string') {
370
+ await tracker.stop();
371
+ return tabChangeResponse ? `${tabChangeResponse}\n${actionResult}` : actionResult;
372
+ }
373
+ const snapshot = await this.captureCurrentSnapshot(step);
374
+ await tracker.stop();
375
+ const formattedTimeline = tracker.formatTimeline();
376
+ const response = formattedTimeline || fallbackResponse;
377
+ return { response: tabChangeResponse ? `${tabChangeResponse}\n${response}` : response, snapshot };
378
+ }
379
+ catch (error) {
380
+ await tracker.stop();
381
+ throw error;
382
+ }
383
+ finally {
384
+ this.pendingDialogHandlingIntent = null;
385
+ }
386
+ }
387
+ }
388
+ export function createBrowserTools(runtime) {
389
+ return [
390
+ defineAgentTool({
391
+ name: BrowserTool.TOOL_NAVIGATE,
392
+ description: 'Navigate to a specified URL in the browser, example: https://www.example.com',
393
+ schema: z
394
+ .object({
395
+ url: z.string().describe('The URL to navigate to'),
396
+ goal: z.string().describe('The goal or purpose of navigating to this URL'),
397
+ })
398
+ .strict(),
399
+ handler: ({ url }, context) => runtime.navigateToUrl(url, context.step),
400
+ }),
401
+ defineAgentTool({
402
+ name: BrowserTool.TOOL_CLICK_OR_HOVER,
403
+ description: 'Click or hover a specified element reference in the browser',
404
+ schema: z
405
+ .object({
406
+ ref: z.string().describe('ref value of the element from the snapshot, example: e123'),
407
+ name: z.string().describe('name of the element to click or hover, example: Submit Button'),
408
+ hover: z.boolean().describe('If true: hover the element, if false: click element'),
409
+ goal: z.string().describe('The goal or purpose of clicking this element'),
410
+ })
411
+ .strict(),
412
+ handler: ({ ref, hover }, context) => runtime.clickElement(ref, hover, context.step),
413
+ }),
414
+ defineAgentTool({
415
+ name: BrowserTool.TOOL_SET_DIALOG_RESPONSE,
416
+ description: 'Set how to answer the next JavaScript alert, confirm, or prompt. Call this immediately before the browser action expected to open the dialog. Unarmed dialogs are dismissed automatically.',
417
+ schema: dialogResponseSchema,
418
+ handler: ({ action, promptText }) => runtime.setDialogResponse(action, promptText),
419
+ }),
420
+ defineAgentTool({
421
+ name: BrowserTool.TOOL_DRAG,
422
+ description: 'Drag a source element onto a target or drop element in the browser',
423
+ schema: z
424
+ .object({
425
+ sourceRef: z.string().describe('ref value of the element to drag from the snapshot, example: e123'),
426
+ sourceName: z.string().describe('name of the element to drag, example: File card'),
427
+ targetRef: z.string().describe('ref value of the drop target from the snapshot, example: e456'),
428
+ targetName: z.string().describe('name of the element to drop onto, example: Done column'),
429
+ goal: z.string().describe('The goal or purpose of dragging this element'),
430
+ })
431
+ .strict(),
432
+ handler: ({ sourceRef, targetRef }, context) => runtime.dragElement(sourceRef, targetRef, context.step),
433
+ }),
434
+ defineAgentTool({
435
+ name: BrowserTool.TOOL_UPLOAD,
436
+ description: 'Upload one or more local files to a file input element in the browser',
437
+ schema: z
438
+ .object({
439
+ ref: z.string().describe('ref value of the file input element from the snapshot, example: e123'),
440
+ name: z.string().describe('name of the file input element, example: Resume Upload'),
441
+ filePaths: z
442
+ .array(z.string())
443
+ .min(1)
444
+ .describe('local file paths to upload, example: ["fixtures/resume.pdf"]'),
445
+ goal: z.string().describe('The goal or purpose of uploading these files'),
446
+ })
447
+ .strict(),
448
+ handler: ({ ref, filePaths }, context) => runtime.uploadFiles(ref, filePaths, context.step),
449
+ }),
450
+ defineAgentTool({
451
+ name: BrowserTool.TOOL_TYPE_OR_SELECT,
452
+ description: 'Type text into a specified element reference in the browser or select an option from a dropdown.',
453
+ schema: z
454
+ .object({
455
+ elements: z.array(browserInputElementSchema).min(1).describe('array of elements to type into'),
456
+ goal: z.string().describe('The goal or purpose of typing this text into the element'),
457
+ })
458
+ .strict(),
459
+ handler: ({ elements }, context) => runtime.typeOrSelectInElement(elements, context.step),
460
+ }),
461
+ defineAgentTool({
462
+ name: BrowserTool.TOOL_PRESS_KEY,
463
+ description: 'Press a specified key in the browser',
464
+ schema: z
465
+ .object({
466
+ key: z.string().describe('The key to press, example: Enter, Escape, ArrowDown'),
467
+ goal: z.string().describe('The goal or purpose of pressing this key'),
468
+ })
469
+ .strict(),
470
+ handler: ({ key }, context) => runtime.pressKey(key, context.step),
471
+ }),
472
+ defineAgentTool({
473
+ name: BrowserTool.TOOL_SNAPSHOT,
474
+ description: 'Capture the ARIA snapshot of the current page - use only if you miss information from previous snapshot.',
475
+ schema: z
476
+ .object({
477
+ goal: z.string().describe('The goal or purpose of capturing the snapshot'),
478
+ })
479
+ .strict(),
480
+ handler: async (_args, context) => ({
481
+ response: 'Captured latest page snapshot.',
482
+ snapshot: await runtime.captureCurrentSnapshot(context.step, { skipFilter: true }),
483
+ }),
484
+ }),
485
+ defineAgentTool({
486
+ name: BrowserTool.TOOL_WAIT,
487
+ description: 'Wait for a timeout in seconds',
488
+ schema: z
489
+ .object({
490
+ seconds: z.number().describe('Number of seconds to wait, example: 5'),
491
+ goal: z.string().describe('The goal or purpose of waiting'),
492
+ })
493
+ .strict(),
494
+ handler: ({ seconds }, context) => runtime.wait(seconds, context.step),
495
+ }),
496
+ defineAgentTool({
497
+ name: BrowserTool.TOOL_LIST_TABS,
498
+ description: 'List open browser tabs and show which tab is active',
499
+ schema: z
500
+ .object({
501
+ goal: z.string().describe('The goal or purpose of listing browser tabs'),
502
+ })
503
+ .strict(),
504
+ handler: () => runtime.listPages(),
505
+ }),
506
+ defineAgentTool({
507
+ name: BrowserTool.TOOL_SELECT_TAB,
508
+ description: 'Select an open browser tab by pageId and make it active',
509
+ schema: z
510
+ .object({
511
+ pageId: z.string().describe('Browser tab id from browser_list_tabs, example: p2'),
512
+ goal: z.string().describe('The goal or purpose of selecting this browser tab'),
513
+ })
514
+ .strict(),
515
+ handler: ({ pageId }, context) => runtime.selectPage(pageId, context.step),
516
+ }),
517
+ defineAgentTool({
518
+ name: BrowserTool.TOOL_CLOSE_TAB,
519
+ description: 'Close a browser tab by pageId, or close the active tab when pageId is null',
520
+ schema: z
521
+ .object({
522
+ pageId: z
523
+ .string()
524
+ .nullable()
525
+ .describe('Browser tab id from browser_list_tabs, or null for active tab'),
526
+ goal: z.string().describe('The goal or purpose of closing this browser tab'),
527
+ })
528
+ .strict(),
529
+ handler: ({ pageId }, context) => runtime.closePage(pageId, context.step),
530
+ }),
531
+ defineAgentTool({
532
+ name: BrowserTool.TOOL_NETWORK_REQUESTS,
533
+ description: "List the API calls (fetch/XHR) the browser made during the last browser action only - call this again after each new action to see its calls. Set 'static' to true to also include images, fonts, and other non-API resources.",
534
+ schema: z
535
+ .object({
536
+ static: z
537
+ .boolean()
538
+ .describe('If true, also include non-API resource types like images, fonts, and stylesheets'),
539
+ goal: z.string().describe('The goal or purpose of listing network requests'),
540
+ })
541
+ .strict(),
542
+ handler: ({ static: includeStatic }) => runtime.listNetworkRequests(includeStatic),
543
+ }),
544
+ defineAgentTool({
545
+ name: BrowserTool.TOOL_NETWORK_REQUEST,
546
+ description: 'Inspect one network request from the most recent browser_network_requests result, using its number. Only valid until the next browser action resets the list.',
547
+ schema: z
548
+ .object({
549
+ sequence: z
550
+ .number()
551
+ .describe('The number of the request from browser_network_requests, example: 1'),
552
+ part: z
553
+ .enum(['detail', 'request-body', 'response-body'])
554
+ .describe("What to return: 'detail' for headers and timing, or the request/response body"),
555
+ goal: z.string().describe('The goal or purpose of inspecting this network request'),
556
+ })
557
+ .strict(),
558
+ handler: ({ sequence, part }) => runtime.inspectNetworkRequest(sequence, part),
559
+ }),
560
+ ];
561
+ }
562
+ //# sourceMappingURL=tool.js.map