agent-browser 0.3.0 → 0.3.2

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 (220) hide show
  1. package/bin/agent-browser +0 -0
  2. package/bin/agent-browser-darwin-arm64 +0 -0
  3. package/bin/agent-browser-darwin-x64 +0 -0
  4. package/bin/agent-browser-linux-arm64 +0 -0
  5. package/bin/agent-browser-linux-x64 +0 -0
  6. package/bin/agent-browser.cmd +35 -0
  7. package/dist/cli-light.d.ts +1 -1
  8. package/dist/cli-light.js +1 -1
  9. package/package.json +10 -4
  10. package/scripts/build-all-platforms.sh +68 -0
  11. package/scripts/copy-native.js +35 -0
  12. package/scripts/postinstall.js +113 -15
  13. package/.prettierrc +0 -7
  14. package/AGENTS.md +0 -26
  15. package/benchmark/benchmark.ts +0 -521
  16. package/benchmark/run.ts +0 -322
  17. package/cli/Cargo.lock +0 -114
  18. package/cli/Cargo.toml +0 -17
  19. package/cli/src/main.rs +0 -332
  20. package/cli/target/.rustc_info.json +0 -1
  21. package/cli/target/CACHEDIR.TAG +0 -3
  22. package/cli/target/release/.cargo-lock +0 -0
  23. package/cli/target/release/.fingerprint/agent-browser-5894536b887e2ce7/bin-agent-browser +0 -1
  24. package/cli/target/release/.fingerprint/agent-browser-5894536b887e2ce7/bin-agent-browser.json +0 -1
  25. package/cli/target/release/.fingerprint/agent-browser-5894536b887e2ce7/dep-bin-agent-browser +0 -0
  26. package/cli/target/release/.fingerprint/agent-browser-5894536b887e2ce7/invoked.timestamp +0 -1
  27. package/cli/target/release/.fingerprint/agent-browser-5894536b887e2ce7/output-bin-agent-browser +0 -2
  28. package/cli/target/release/.fingerprint/itoa-653b9192107a1caa/dep-lib-itoa +0 -0
  29. package/cli/target/release/.fingerprint/itoa-653b9192107a1caa/invoked.timestamp +0 -1
  30. package/cli/target/release/.fingerprint/itoa-653b9192107a1caa/lib-itoa +0 -1
  31. package/cli/target/release/.fingerprint/itoa-653b9192107a1caa/lib-itoa.json +0 -1
  32. package/cli/target/release/.fingerprint/libc-0303d277881093f4/build-script-build-script-build +0 -1
  33. package/cli/target/release/.fingerprint/libc-0303d277881093f4/build-script-build-script-build.json +0 -1
  34. package/cli/target/release/.fingerprint/libc-0303d277881093f4/dep-build-script-build-script-build +0 -0
  35. package/cli/target/release/.fingerprint/libc-0303d277881093f4/invoked.timestamp +0 -1
  36. package/cli/target/release/.fingerprint/libc-b8c0d8e35a1980d3/run-build-script-build-script-build +0 -1
  37. package/cli/target/release/.fingerprint/libc-b8c0d8e35a1980d3/run-build-script-build-script-build.json +0 -1
  38. package/cli/target/release/.fingerprint/libc-d843359d3dd4757b/dep-lib-libc +0 -0
  39. package/cli/target/release/.fingerprint/libc-d843359d3dd4757b/invoked.timestamp +0 -1
  40. package/cli/target/release/.fingerprint/libc-d843359d3dd4757b/lib-libc +0 -1
  41. package/cli/target/release/.fingerprint/libc-d843359d3dd4757b/lib-libc.json +0 -1
  42. package/cli/target/release/.fingerprint/memchr-dcaf8011940d18dd/dep-lib-memchr +0 -0
  43. package/cli/target/release/.fingerprint/memchr-dcaf8011940d18dd/invoked.timestamp +0 -1
  44. package/cli/target/release/.fingerprint/memchr-dcaf8011940d18dd/lib-memchr +0 -1
  45. package/cli/target/release/.fingerprint/memchr-dcaf8011940d18dd/lib-memchr.json +0 -1
  46. package/cli/target/release/.fingerprint/proc-macro2-291b57751730d5b3/build-script-build-script-build +0 -1
  47. package/cli/target/release/.fingerprint/proc-macro2-291b57751730d5b3/build-script-build-script-build.json +0 -1
  48. package/cli/target/release/.fingerprint/proc-macro2-291b57751730d5b3/dep-build-script-build-script-build +0 -0
  49. package/cli/target/release/.fingerprint/proc-macro2-291b57751730d5b3/invoked.timestamp +0 -1
  50. package/cli/target/release/.fingerprint/proc-macro2-a753b344a6b4aa98/dep-lib-proc_macro2 +0 -0
  51. package/cli/target/release/.fingerprint/proc-macro2-a753b344a6b4aa98/invoked.timestamp +0 -1
  52. package/cli/target/release/.fingerprint/proc-macro2-a753b344a6b4aa98/lib-proc_macro2 +0 -1
  53. package/cli/target/release/.fingerprint/proc-macro2-a753b344a6b4aa98/lib-proc_macro2.json +0 -1
  54. package/cli/target/release/.fingerprint/proc-macro2-fc2999f6676f03db/run-build-script-build-script-build +0 -1
  55. package/cli/target/release/.fingerprint/proc-macro2-fc2999f6676f03db/run-build-script-build-script-build.json +0 -1
  56. package/cli/target/release/.fingerprint/quote-352ae41707d371c9/run-build-script-build-script-build +0 -1
  57. package/cli/target/release/.fingerprint/quote-352ae41707d371c9/run-build-script-build-script-build.json +0 -1
  58. package/cli/target/release/.fingerprint/quote-7d13be3cbe4f9de4/build-script-build-script-build +0 -1
  59. package/cli/target/release/.fingerprint/quote-7d13be3cbe4f9de4/build-script-build-script-build.json +0 -1
  60. package/cli/target/release/.fingerprint/quote-7d13be3cbe4f9de4/dep-build-script-build-script-build +0 -0
  61. package/cli/target/release/.fingerprint/quote-7d13be3cbe4f9de4/invoked.timestamp +0 -1
  62. package/cli/target/release/.fingerprint/quote-833e6725e0f7d298/dep-lib-quote +0 -0
  63. package/cli/target/release/.fingerprint/quote-833e6725e0f7d298/invoked.timestamp +0 -1
  64. package/cli/target/release/.fingerprint/quote-833e6725e0f7d298/lib-quote +0 -1
  65. package/cli/target/release/.fingerprint/quote-833e6725e0f7d298/lib-quote.json +0 -1
  66. package/cli/target/release/.fingerprint/serde-b8c046c16de48f41/run-build-script-build-script-build +0 -1
  67. package/cli/target/release/.fingerprint/serde-b8c046c16de48f41/run-build-script-build-script-build.json +0 -1
  68. package/cli/target/release/.fingerprint/serde-d35d32ab52b82a81/build-script-build-script-build +0 -1
  69. package/cli/target/release/.fingerprint/serde-d35d32ab52b82a81/build-script-build-script-build.json +0 -1
  70. package/cli/target/release/.fingerprint/serde-d35d32ab52b82a81/dep-build-script-build-script-build +0 -0
  71. package/cli/target/release/.fingerprint/serde-d35d32ab52b82a81/invoked.timestamp +0 -1
  72. package/cli/target/release/.fingerprint/serde-d6fb44202dad3efd/dep-lib-serde +0 -0
  73. package/cli/target/release/.fingerprint/serde-d6fb44202dad3efd/invoked.timestamp +0 -1
  74. package/cli/target/release/.fingerprint/serde-d6fb44202dad3efd/lib-serde +0 -1
  75. package/cli/target/release/.fingerprint/serde-d6fb44202dad3efd/lib-serde.json +0 -1
  76. package/cli/target/release/.fingerprint/serde_core-0f7ba2581c8c0423/dep-lib-serde_core +0 -0
  77. package/cli/target/release/.fingerprint/serde_core-0f7ba2581c8c0423/invoked.timestamp +0 -1
  78. package/cli/target/release/.fingerprint/serde_core-0f7ba2581c8c0423/lib-serde_core +0 -1
  79. package/cli/target/release/.fingerprint/serde_core-0f7ba2581c8c0423/lib-serde_core.json +0 -1
  80. package/cli/target/release/.fingerprint/serde_core-74db491143173930/run-build-script-build-script-build +0 -1
  81. package/cli/target/release/.fingerprint/serde_core-74db491143173930/run-build-script-build-script-build.json +0 -1
  82. package/cli/target/release/.fingerprint/serde_core-f043ae3f4b601577/build-script-build-script-build +0 -1
  83. package/cli/target/release/.fingerprint/serde_core-f043ae3f4b601577/build-script-build-script-build.json +0 -1
  84. package/cli/target/release/.fingerprint/serde_core-f043ae3f4b601577/dep-build-script-build-script-build +0 -0
  85. package/cli/target/release/.fingerprint/serde_core-f043ae3f4b601577/invoked.timestamp +0 -1
  86. package/cli/target/release/.fingerprint/serde_derive-a5d13e0e658ceae3/dep-lib-serde_derive +0 -0
  87. package/cli/target/release/.fingerprint/serde_derive-a5d13e0e658ceae3/invoked.timestamp +0 -1
  88. package/cli/target/release/.fingerprint/serde_derive-a5d13e0e658ceae3/lib-serde_derive +0 -1
  89. package/cli/target/release/.fingerprint/serde_derive-a5d13e0e658ceae3/lib-serde_derive.json +0 -1
  90. package/cli/target/release/.fingerprint/serde_json-a8467019a959068f/run-build-script-build-script-build +0 -1
  91. package/cli/target/release/.fingerprint/serde_json-a8467019a959068f/run-build-script-build-script-build.json +0 -1
  92. package/cli/target/release/.fingerprint/serde_json-bfa3f43b57842d41/build-script-build-script-build +0 -1
  93. package/cli/target/release/.fingerprint/serde_json-bfa3f43b57842d41/build-script-build-script-build.json +0 -1
  94. package/cli/target/release/.fingerprint/serde_json-bfa3f43b57842d41/dep-build-script-build-script-build +0 -0
  95. package/cli/target/release/.fingerprint/serde_json-bfa3f43b57842d41/invoked.timestamp +0 -1
  96. package/cli/target/release/.fingerprint/serde_json-f61651a65bf0eb31/dep-lib-serde_json +0 -0
  97. package/cli/target/release/.fingerprint/serde_json-f61651a65bf0eb31/invoked.timestamp +0 -1
  98. package/cli/target/release/.fingerprint/serde_json-f61651a65bf0eb31/lib-serde_json +0 -1
  99. package/cli/target/release/.fingerprint/serde_json-f61651a65bf0eb31/lib-serde_json.json +0 -1
  100. package/cli/target/release/.fingerprint/syn-6f9a22f8c7f909b0/dep-lib-syn +0 -0
  101. package/cli/target/release/.fingerprint/syn-6f9a22f8c7f909b0/invoked.timestamp +0 -1
  102. package/cli/target/release/.fingerprint/syn-6f9a22f8c7f909b0/lib-syn +0 -1
  103. package/cli/target/release/.fingerprint/syn-6f9a22f8c7f909b0/lib-syn.json +0 -1
  104. package/cli/target/release/.fingerprint/unicode-ident-60c57228d30a23d0/dep-lib-unicode_ident +0 -0
  105. package/cli/target/release/.fingerprint/unicode-ident-60c57228d30a23d0/invoked.timestamp +0 -1
  106. package/cli/target/release/.fingerprint/unicode-ident-60c57228d30a23d0/lib-unicode_ident +0 -1
  107. package/cli/target/release/.fingerprint/unicode-ident-60c57228d30a23d0/lib-unicode_ident.json +0 -1
  108. package/cli/target/release/.fingerprint/zmij-60b0e0e9d7c08f71/run-build-script-build-script-build +0 -1
  109. package/cli/target/release/.fingerprint/zmij-60b0e0e9d7c08f71/run-build-script-build-script-build.json +0 -1
  110. package/cli/target/release/.fingerprint/zmij-9501bcbd6d8b933c/dep-lib-zmij +0 -0
  111. package/cli/target/release/.fingerprint/zmij-9501bcbd6d8b933c/invoked.timestamp +0 -1
  112. package/cli/target/release/.fingerprint/zmij-9501bcbd6d8b933c/lib-zmij +0 -1
  113. package/cli/target/release/.fingerprint/zmij-9501bcbd6d8b933c/lib-zmij.json +0 -1
  114. package/cli/target/release/.fingerprint/zmij-aa602f885104061e/build-script-build-script-build +0 -1
  115. package/cli/target/release/.fingerprint/zmij-aa602f885104061e/build-script-build-script-build.json +0 -1
  116. package/cli/target/release/.fingerprint/zmij-aa602f885104061e/dep-build-script-build-script-build +0 -0
  117. package/cli/target/release/.fingerprint/zmij-aa602f885104061e/invoked.timestamp +0 -1
  118. package/cli/target/release/agent-browser +0 -0
  119. package/cli/target/release/agent-browser.d +0 -1
  120. package/cli/target/release/build/libc-0303d277881093f4/build-script-build +0 -0
  121. package/cli/target/release/build/libc-0303d277881093f4/build_script_build-0303d277881093f4 +0 -0
  122. package/cli/target/release/build/libc-0303d277881093f4/build_script_build-0303d277881093f4.d +0 -5
  123. package/cli/target/release/build/libc-b8c0d8e35a1980d3/invoked.timestamp +0 -1
  124. package/cli/target/release/build/libc-b8c0d8e35a1980d3/output +0 -25
  125. package/cli/target/release/build/libc-b8c0d8e35a1980d3/root-output +0 -1
  126. package/cli/target/release/build/libc-b8c0d8e35a1980d3/stderr +0 -0
  127. package/cli/target/release/build/proc-macro2-291b57751730d5b3/build-script-build +0 -0
  128. package/cli/target/release/build/proc-macro2-291b57751730d5b3/build_script_build-291b57751730d5b3 +0 -0
  129. package/cli/target/release/build/proc-macro2-291b57751730d5b3/build_script_build-291b57751730d5b3.d +0 -5
  130. package/cli/target/release/build/proc-macro2-fc2999f6676f03db/invoked.timestamp +0 -1
  131. package/cli/target/release/build/proc-macro2-fc2999f6676f03db/output +0 -23
  132. package/cli/target/release/build/proc-macro2-fc2999f6676f03db/root-output +0 -1
  133. package/cli/target/release/build/proc-macro2-fc2999f6676f03db/stderr +0 -0
  134. package/cli/target/release/build/quote-352ae41707d371c9/invoked.timestamp +0 -1
  135. package/cli/target/release/build/quote-352ae41707d371c9/output +0 -2
  136. package/cli/target/release/build/quote-352ae41707d371c9/root-output +0 -1
  137. package/cli/target/release/build/quote-352ae41707d371c9/stderr +0 -0
  138. package/cli/target/release/build/quote-7d13be3cbe4f9de4/build-script-build +0 -0
  139. package/cli/target/release/build/quote-7d13be3cbe4f9de4/build_script_build-7d13be3cbe4f9de4 +0 -0
  140. package/cli/target/release/build/quote-7d13be3cbe4f9de4/build_script_build-7d13be3cbe4f9de4.d +0 -5
  141. package/cli/target/release/build/serde-b8c046c16de48f41/invoked.timestamp +0 -1
  142. package/cli/target/release/build/serde-b8c046c16de48f41/out/private.rs +0 -6
  143. package/cli/target/release/build/serde-b8c046c16de48f41/output +0 -13
  144. package/cli/target/release/build/serde-b8c046c16de48f41/root-output +0 -1
  145. package/cli/target/release/build/serde-b8c046c16de48f41/stderr +0 -0
  146. package/cli/target/release/build/serde-d35d32ab52b82a81/build-script-build +0 -0
  147. package/cli/target/release/build/serde-d35d32ab52b82a81/build_script_build-d35d32ab52b82a81 +0 -0
  148. package/cli/target/release/build/serde-d35d32ab52b82a81/build_script_build-d35d32ab52b82a81.d +0 -5
  149. package/cli/target/release/build/serde_core-74db491143173930/invoked.timestamp +0 -1
  150. package/cli/target/release/build/serde_core-74db491143173930/out/private.rs +0 -5
  151. package/cli/target/release/build/serde_core-74db491143173930/output +0 -11
  152. package/cli/target/release/build/serde_core-74db491143173930/root-output +0 -1
  153. package/cli/target/release/build/serde_core-74db491143173930/stderr +0 -0
  154. package/cli/target/release/build/serde_core-f043ae3f4b601577/build-script-build +0 -0
  155. package/cli/target/release/build/serde_core-f043ae3f4b601577/build_script_build-f043ae3f4b601577 +0 -0
  156. package/cli/target/release/build/serde_core-f043ae3f4b601577/build_script_build-f043ae3f4b601577.d +0 -5
  157. package/cli/target/release/build/serde_json-a8467019a959068f/invoked.timestamp +0 -1
  158. package/cli/target/release/build/serde_json-a8467019a959068f/output +0 -3
  159. package/cli/target/release/build/serde_json-a8467019a959068f/root-output +0 -1
  160. package/cli/target/release/build/serde_json-a8467019a959068f/stderr +0 -0
  161. package/cli/target/release/build/serde_json-bfa3f43b57842d41/build-script-build +0 -0
  162. package/cli/target/release/build/serde_json-bfa3f43b57842d41/build_script_build-bfa3f43b57842d41 +0 -0
  163. package/cli/target/release/build/serde_json-bfa3f43b57842d41/build_script_build-bfa3f43b57842d41.d +0 -5
  164. package/cli/target/release/build/zmij-60b0e0e9d7c08f71/invoked.timestamp +0 -1
  165. package/cli/target/release/build/zmij-60b0e0e9d7c08f71/output +0 -3
  166. package/cli/target/release/build/zmij-60b0e0e9d7c08f71/root-output +0 -1
  167. package/cli/target/release/build/zmij-60b0e0e9d7c08f71/stderr +0 -0
  168. package/cli/target/release/build/zmij-aa602f885104061e/build-script-build +0 -0
  169. package/cli/target/release/build/zmij-aa602f885104061e/build_script_build-aa602f885104061e +0 -0
  170. package/cli/target/release/build/zmij-aa602f885104061e/build_script_build-aa602f885104061e.d +0 -5
  171. package/cli/target/release/deps/agent_browser-5894536b887e2ce7 +0 -0
  172. package/cli/target/release/deps/agent_browser-5894536b887e2ce7.d +0 -5
  173. package/cli/target/release/deps/itoa-653b9192107a1caa.d +0 -8
  174. package/cli/target/release/deps/libc-d843359d3dd4757b.d +0 -45
  175. package/cli/target/release/deps/libitoa-653b9192107a1caa.rlib +0 -0
  176. package/cli/target/release/deps/libitoa-653b9192107a1caa.rmeta +0 -0
  177. package/cli/target/release/deps/liblibc-d843359d3dd4757b.rlib +0 -0
  178. package/cli/target/release/deps/liblibc-d843359d3dd4757b.rmeta +0 -0
  179. package/cli/target/release/deps/libmemchr-dcaf8011940d18dd.rlib +0 -0
  180. package/cli/target/release/deps/libmemchr-dcaf8011940d18dd.rmeta +0 -0
  181. package/cli/target/release/deps/libproc_macro2-a753b344a6b4aa98.rlib +0 -0
  182. package/cli/target/release/deps/libproc_macro2-a753b344a6b4aa98.rmeta +0 -0
  183. package/cli/target/release/deps/libquote-833e6725e0f7d298.rlib +0 -0
  184. package/cli/target/release/deps/libquote-833e6725e0f7d298.rmeta +0 -0
  185. package/cli/target/release/deps/libserde-d6fb44202dad3efd.rlib +0 -0
  186. package/cli/target/release/deps/libserde-d6fb44202dad3efd.rmeta +0 -0
  187. package/cli/target/release/deps/libserde_core-0f7ba2581c8c0423.rlib +0 -0
  188. package/cli/target/release/deps/libserde_core-0f7ba2581c8c0423.rmeta +0 -0
  189. package/cli/target/release/deps/libserde_derive-a5d13e0e658ceae3.dylib +0 -0
  190. package/cli/target/release/deps/libserde_json-f61651a65bf0eb31.rlib +0 -0
  191. package/cli/target/release/deps/libserde_json-f61651a65bf0eb31.rmeta +0 -0
  192. package/cli/target/release/deps/libsyn-6f9a22f8c7f909b0.rlib +0 -0
  193. package/cli/target/release/deps/libsyn-6f9a22f8c7f909b0.rmeta +0 -0
  194. package/cli/target/release/deps/libunicode_ident-60c57228d30a23d0.rlib +0 -0
  195. package/cli/target/release/deps/libunicode_ident-60c57228d30a23d0.rmeta +0 -0
  196. package/cli/target/release/deps/libzmij-9501bcbd6d8b933c.rlib +0 -0
  197. package/cli/target/release/deps/libzmij-9501bcbd6d8b933c.rmeta +0 -0
  198. package/cli/target/release/deps/memchr-dcaf8011940d18dd.d +0 -30
  199. package/cli/target/release/deps/proc_macro2-a753b344a6b4aa98.d +0 -17
  200. package/cli/target/release/deps/quote-833e6725e0f7d298.d +0 -13
  201. package/cli/target/release/deps/serde-d6fb44202dad3efd.d +0 -14
  202. package/cli/target/release/deps/serde_core-0f7ba2581c8c0423.d +0 -27
  203. package/cli/target/release/deps/serde_derive-a5d13e0e658ceae3.d +0 -34
  204. package/cli/target/release/deps/serde_json-f61651a65bf0eb31.d +0 -22
  205. package/cli/target/release/deps/syn-6f9a22f8c7f909b0.d +0 -49
  206. package/cli/target/release/deps/unicode_ident-60c57228d30a23d0.d +0 -8
  207. package/cli/target/release/deps/zmij-9501bcbd6d8b933c.d +0 -8
  208. package/src/actions.ts +0 -1670
  209. package/src/browser.test.ts +0 -157
  210. package/src/browser.ts +0 -686
  211. package/src/cli-light.ts +0 -457
  212. package/src/client.ts +0 -150
  213. package/src/daemon.ts +0 -187
  214. package/src/index.ts +0 -1185
  215. package/src/protocol.test.ts +0 -216
  216. package/src/protocol.ts +0 -852
  217. package/src/snapshot.ts +0 -380
  218. package/src/types.ts +0 -913
  219. package/tsconfig.json +0 -28
  220. package/vitest.config.ts +0 -9
package/src/snapshot.ts DELETED
@@ -1,380 +0,0 @@
1
- /**
2
- * Enhanced snapshot with element refs for deterministic element selection.
3
- *
4
- * This module generates accessibility snapshots with embedded refs that can be
5
- * used to click/fill/interact with elements without re-querying the DOM.
6
- *
7
- * Example output:
8
- * - heading "Example Domain" [ref=e1] [level=1]
9
- * - paragraph: Some text content
10
- * - button "Submit" [ref=e2]
11
- * - textbox "Email" [ref=e3]
12
- *
13
- * Usage:
14
- * agent-browser snapshot # Full snapshot
15
- * agent-browser snapshot -i # Interactive elements only
16
- * agent-browser snapshot --depth 3 # Limit depth
17
- * agent-browser click @e2 # Click element by ref
18
- */
19
-
20
- import type { Page, Locator } from 'playwright-core';
21
-
22
- export interface RefMap {
23
- [ref: string]: {
24
- selector: string;
25
- role: string;
26
- name?: string;
27
- };
28
- }
29
-
30
- export interface EnhancedSnapshot {
31
- tree: string;
32
- refs: RefMap;
33
- }
34
-
35
- export interface SnapshotOptions {
36
- /** Only include interactive elements (buttons, links, inputs, etc.) */
37
- interactive?: boolean;
38
- /** Maximum depth of tree to include (0 = root only) */
39
- maxDepth?: number;
40
- /** Remove structural elements without meaningful content */
41
- compact?: boolean;
42
- /** CSS selector to scope the snapshot */
43
- selector?: string;
44
- }
45
-
46
- // Counter for generating refs
47
- let refCounter = 0;
48
-
49
- /**
50
- * Reset ref counter (call at start of each snapshot)
51
- */
52
- export function resetRefs(): void {
53
- refCounter = 0;
54
- }
55
-
56
- /**
57
- * Generate next ref ID
58
- */
59
- function nextRef(): string {
60
- return `e${++refCounter}`;
61
- }
62
-
63
- /**
64
- * Roles that are interactive and should get refs
65
- */
66
- const INTERACTIVE_ROLES = new Set([
67
- 'button',
68
- 'link',
69
- 'textbox',
70
- 'checkbox',
71
- 'radio',
72
- 'combobox',
73
- 'listbox',
74
- 'menuitem',
75
- 'menuitemcheckbox',
76
- 'menuitemradio',
77
- 'option',
78
- 'searchbox',
79
- 'slider',
80
- 'spinbutton',
81
- 'switch',
82
- 'tab',
83
- 'treeitem',
84
- ]);
85
-
86
- /**
87
- * Roles that provide structure/context (get refs for text extraction)
88
- */
89
- const CONTENT_ROLES = new Set([
90
- 'heading',
91
- 'cell',
92
- 'gridcell',
93
- 'columnheader',
94
- 'rowheader',
95
- 'listitem',
96
- 'article',
97
- 'region',
98
- 'main',
99
- 'navigation',
100
- ]);
101
-
102
- /**
103
- * Roles that are purely structural (can be filtered in compact mode)
104
- */
105
- const STRUCTURAL_ROLES = new Set([
106
- 'generic',
107
- 'group',
108
- 'list',
109
- 'table',
110
- 'row',
111
- 'rowgroup',
112
- 'grid',
113
- 'treegrid',
114
- 'menu',
115
- 'menubar',
116
- 'toolbar',
117
- 'tablist',
118
- 'tree',
119
- 'directory',
120
- 'document',
121
- 'application',
122
- 'presentation',
123
- 'none',
124
- ]);
125
-
126
- /**
127
- * Build a selector string for storing in ref map
128
- */
129
- function buildSelector(role: string, name?: string): string {
130
- if (name) {
131
- const escapedName = name.replace(/"/g, '\\"');
132
- return `getByRole('${role}', { name: "${escapedName}" })`;
133
- }
134
- return `getByRole('${role}')`;
135
- }
136
-
137
- /**
138
- * Get enhanced snapshot with refs and optional filtering
139
- */
140
- export async function getEnhancedSnapshot(
141
- page: Page,
142
- options: SnapshotOptions = {}
143
- ): Promise<EnhancedSnapshot> {
144
- resetRefs();
145
- const refs: RefMap = {};
146
-
147
- // Get ARIA snapshot from Playwright
148
- const locator = options.selector ? page.locator(options.selector) : page.locator(':root');
149
- const ariaTree = await locator.ariaSnapshot();
150
-
151
- if (!ariaTree) {
152
- return {
153
- tree: '(empty)',
154
- refs: {},
155
- };
156
- }
157
-
158
- // Parse and enhance the ARIA tree
159
- const enhancedTree = processAriaTree(ariaTree, refs, options);
160
-
161
- return { tree: enhancedTree, refs };
162
- }
163
-
164
- /**
165
- * Process ARIA snapshot: add refs and apply filters
166
- */
167
- function processAriaTree(ariaTree: string, refs: RefMap, options: SnapshotOptions): string {
168
- const lines = ariaTree.split('\n');
169
- const result: string[] = [];
170
-
171
- // For interactive-only mode, we collect just interactive elements
172
- if (options.interactive) {
173
- for (const line of lines) {
174
- const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);
175
- if (!match) continue;
176
-
177
- const [, , role, name, suffix] = match;
178
- const roleLower = role.toLowerCase();
179
-
180
- if (INTERACTIVE_ROLES.has(roleLower)) {
181
- const ref = nextRef();
182
- refs[ref] = {
183
- selector: buildSelector(roleLower, name),
184
- role: roleLower,
185
- name,
186
- };
187
-
188
- let enhanced = `- ${role}`;
189
- if (name) enhanced += ` "${name}"`;
190
- enhanced += ` [ref=${ref}]`;
191
- if (suffix && suffix.includes('[')) enhanced += suffix;
192
-
193
- result.push(enhanced);
194
- }
195
- }
196
- return result.join('\n') || '(no interactive elements)';
197
- }
198
-
199
- // Normal processing with depth/compact filters
200
- for (const line of lines) {
201
- const processed = processLine(line, refs, options);
202
- if (processed !== null) {
203
- result.push(processed);
204
- }
205
- }
206
-
207
- // If compact mode, remove empty structural elements
208
- if (options.compact) {
209
- return compactTree(result.join('\n'));
210
- }
211
-
212
- return result.join('\n');
213
- }
214
-
215
- /**
216
- * Get indentation level (number of spaces / 2)
217
- */
218
- function getIndentLevel(line: string): number {
219
- const match = line.match(/^(\s*)/);
220
- return match ? Math.floor(match[1].length / 2) : 0;
221
- }
222
-
223
- /**
224
- * Process a single line: add ref if needed, filter if requested
225
- */
226
- function processLine(
227
- line: string,
228
- refs: RefMap,
229
- options: SnapshotOptions
230
- ): string | null {
231
- const depth = getIndentLevel(line);
232
-
233
- // Check max depth
234
- if (options.maxDepth !== undefined && depth > options.maxDepth) {
235
- return null;
236
- }
237
-
238
- // Match lines like:
239
- // - button "Submit"
240
- // - heading "Title" [level=1]
241
- // - link "Click me":
242
- const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);
243
-
244
- if (!match) {
245
- // Metadata lines (like /url:) or text content
246
- if (options.interactive) {
247
- // In interactive mode, only keep metadata under interactive elements
248
- return null;
249
- }
250
- return line;
251
- }
252
-
253
- const [, prefix, role, name, suffix] = match;
254
- const roleLower = role.toLowerCase();
255
-
256
- // Skip metadata lines (like /url:)
257
- if (role.startsWith('/')) {
258
- return line;
259
- }
260
-
261
- const isInteractive = INTERACTIVE_ROLES.has(roleLower);
262
- const isContent = CONTENT_ROLES.has(roleLower);
263
- const isStructural = STRUCTURAL_ROLES.has(roleLower);
264
-
265
- // In interactive-only mode, filter non-interactive elements
266
- if (options.interactive && !isInteractive) {
267
- return null;
268
- }
269
-
270
- // In compact mode, skip unnamed structural elements
271
- if (options.compact && isStructural && !name) {
272
- return null;
273
- }
274
-
275
- // Add ref for interactive or named content elements
276
- const shouldHaveRef = isInteractive || (isContent && name);
277
-
278
- if (shouldHaveRef) {
279
- const ref = nextRef();
280
-
281
- refs[ref] = {
282
- selector: buildSelector(roleLower, name),
283
- role: roleLower,
284
- name,
285
- };
286
-
287
- // Build enhanced line with ref
288
- let enhanced = `${prefix}${role}`;
289
- if (name) enhanced += ` "${name}"`;
290
- enhanced += ` [ref=${ref}]`;
291
- if (suffix) enhanced += suffix;
292
-
293
- return enhanced;
294
- }
295
-
296
- return line;
297
- }
298
-
299
- /**
300
- * Remove empty structural branches in compact mode
301
- */
302
- function compactTree(tree: string): string {
303
- const lines = tree.split('\n');
304
- const result: string[] = [];
305
-
306
- // Simple pass: keep lines that have content or refs
307
- for (let i = 0; i < lines.length; i++) {
308
- const line = lines[i];
309
-
310
- // Always keep lines with refs
311
- if (line.includes('[ref=')) {
312
- result.push(line);
313
- continue;
314
- }
315
-
316
- // Keep lines with text content (after :)
317
- if (line.includes(':') && !line.endsWith(':')) {
318
- result.push(line);
319
- continue;
320
- }
321
-
322
- // Check if this structural element has children with refs
323
- const currentIndent = getIndentLevel(line);
324
- let hasRelevantChildren = false;
325
-
326
- for (let j = i + 1; j < lines.length; j++) {
327
- const childIndent = getIndentLevel(lines[j]);
328
- if (childIndent <= currentIndent) break;
329
- if (lines[j].includes('[ref=')) {
330
- hasRelevantChildren = true;
331
- break;
332
- }
333
- }
334
-
335
- if (hasRelevantChildren) {
336
- result.push(line);
337
- }
338
- }
339
-
340
- return result.join('\n');
341
- }
342
-
343
- /**
344
- * Parse a ref from command argument (e.g., "@e1" -> "e1")
345
- */
346
- export function parseRef(arg: string): string | null {
347
- if (arg.startsWith('@')) {
348
- return arg.slice(1);
349
- }
350
- if (arg.startsWith('ref=')) {
351
- return arg.slice(4);
352
- }
353
- if (/^e\d+$/.test(arg)) {
354
- return arg;
355
- }
356
- return null;
357
- }
358
-
359
- /**
360
- * Get snapshot statistics
361
- */
362
- export function getSnapshotStats(tree: string, refs: RefMap): {
363
- lines: number;
364
- chars: number;
365
- tokens: number;
366
- refs: number;
367
- interactive: number;
368
- } {
369
- const interactive = Object.values(refs).filter(r =>
370
- INTERACTIVE_ROLES.has(r.role)
371
- ).length;
372
-
373
- return {
374
- lines: tree.split('\n').length,
375
- chars: tree.length,
376
- tokens: Math.ceil(tree.length / 4),
377
- refs: Object.keys(refs).length,
378
- interactive,
379
- };
380
- }