@everydaydevopsio/pilot 0.5.2 → 0.6.1

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 (306) hide show
  1. package/.mcp.json +9 -0
  2. package/AGENTS.md +9 -0
  3. package/CHANGELOG.md +64 -0
  4. package/CLAUDE.md +7 -7
  5. package/README.md +282 -69
  6. package/dist/browser/browser-manager.d.ts +60 -0
  7. package/dist/browser/browser-manager.d.ts.map +1 -0
  8. package/dist/browser/browser-manager.js +355 -0
  9. package/dist/browser/browser-manager.js.map +1 -0
  10. package/dist/browser/chrome-launcher.d.ts +31 -0
  11. package/dist/browser/chrome-launcher.d.ts.map +1 -0
  12. package/dist/browser/chrome-launcher.js +225 -0
  13. package/dist/browser/chrome-launcher.js.map +1 -0
  14. package/dist/browser/connection.d.ts +23 -0
  15. package/dist/browser/connection.d.ts.map +1 -0
  16. package/dist/browser/connection.js +53 -0
  17. package/dist/browser/connection.js.map +1 -0
  18. package/dist/browser/events.d.ts +9 -0
  19. package/dist/browser/events.d.ts.map +1 -0
  20. package/dist/browser/events.js +99 -0
  21. package/dist/browser/events.js.map +1 -0
  22. package/dist/browser/index.d.ts +4 -0
  23. package/dist/browser/index.d.ts.map +1 -0
  24. package/dist/browser/index.js +4 -0
  25. package/dist/browser/index.js.map +1 -0
  26. package/dist/browser/inspect/element-ref.d.ts +23 -0
  27. package/dist/browser/inspect/element-ref.d.ts.map +1 -0
  28. package/dist/browser/inspect/element-ref.js +52 -0
  29. package/dist/browser/inspect/element-ref.js.map +1 -0
  30. package/dist/browser/inspect/snapshot.d.ts +11 -0
  31. package/dist/browser/inspect/snapshot.d.ts.map +1 -0
  32. package/dist/browser/inspect/snapshot.js +282 -0
  33. package/dist/browser/inspect/snapshot.js.map +1 -0
  34. package/dist/browser/inspect/styles.d.ts +45 -0
  35. package/dist/browser/inspect/styles.d.ts.map +1 -0
  36. package/dist/browser/inspect/styles.js +190 -0
  37. package/dist/browser/inspect/styles.js.map +1 -0
  38. package/dist/browser/inspect/types.d.ts +35 -0
  39. package/dist/browser/inspect/types.d.ts.map +1 -0
  40. package/dist/browser/inspect/types.js +2 -0
  41. package/dist/browser/inspect/types.js.map +1 -0
  42. package/dist/browser/interaction/dialogs.d.ts +18 -0
  43. package/dist/browser/interaction/dialogs.d.ts.map +1 -0
  44. package/dist/browser/interaction/dialogs.js +35 -0
  45. package/dist/browser/interaction/dialogs.js.map +1 -0
  46. package/dist/browser/interaction/downloads.d.ts +23 -0
  47. package/dist/browser/interaction/downloads.d.ts.map +1 -0
  48. package/dist/browser/interaction/downloads.js +87 -0
  49. package/dist/browser/interaction/downloads.js.map +1 -0
  50. package/dist/browser/interaction/events.d.ts +17 -0
  51. package/dist/browser/interaction/events.d.ts.map +1 -0
  52. package/dist/browser/interaction/events.js +66 -0
  53. package/dist/browser/interaction/events.js.map +1 -0
  54. package/dist/browser/interaction/ref-resolver.d.ts +18 -0
  55. package/dist/browser/interaction/ref-resolver.d.ts.map +1 -0
  56. package/dist/browser/interaction/ref-resolver.js +32 -0
  57. package/dist/browser/interaction/ref-resolver.js.map +1 -0
  58. package/dist/browser/interaction/uploads.d.ts +4 -0
  59. package/dist/browser/interaction/uploads.d.ts.map +1 -0
  60. package/dist/browser/interaction/uploads.js +43 -0
  61. package/dist/browser/interaction/uploads.js.map +1 -0
  62. package/dist/browser/network/network-buffer.d.ts +19 -0
  63. package/dist/browser/network/network-buffer.d.ts.map +1 -0
  64. package/dist/browser/network/network-buffer.js +118 -0
  65. package/dist/browser/network/network-buffer.js.map +1 -0
  66. package/dist/browser/network/network-monitor.d.ts +8 -0
  67. package/dist/browser/network/network-monitor.d.ts.map +1 -0
  68. package/dist/browser/network/network-monitor.js +85 -0
  69. package/dist/browser/network/network-monitor.js.map +1 -0
  70. package/dist/browser/network/redaction.d.ts +3 -0
  71. package/dist/browser/network/redaction.d.ts.map +1 -0
  72. package/dist/browser/network/redaction.js +36 -0
  73. package/dist/browser/network/redaction.js.map +1 -0
  74. package/dist/browser/network/types.d.ts +45 -0
  75. package/dist/browser/network/types.d.ts.map +1 -0
  76. package/dist/browser/network/types.js +2 -0
  77. package/dist/browser/network/types.js.map +1 -0
  78. package/dist/browser/performance/analyze.d.ts +5 -0
  79. package/dist/browser/performance/analyze.d.ts.map +1 -0
  80. package/dist/browser/performance/analyze.js +230 -0
  81. package/dist/browser/performance/analyze.js.map +1 -0
  82. package/dist/browser/performance/trace.d.ts +10 -0
  83. package/dist/browser/performance/trace.d.ts.map +1 -0
  84. package/dist/browser/performance/trace.js +38 -0
  85. package/dist/browser/performance/trace.js.map +1 -0
  86. package/dist/browser/performance/types.d.ts +31 -0
  87. package/dist/browser/performance/types.d.ts.map +1 -0
  88. package/dist/browser/performance/types.js +2 -0
  89. package/dist/browser/performance/types.js.map +1 -0
  90. package/dist/browser/preflight.d.ts +20 -0
  91. package/dist/browser/preflight.d.ts.map +1 -0
  92. package/dist/browser/preflight.js +105 -0
  93. package/dist/browser/preflight.js.map +1 -0
  94. package/dist/browser/security/origins.d.ts +18 -0
  95. package/dist/browser/security/origins.d.ts.map +1 -0
  96. package/dist/browser/security/origins.js +84 -0
  97. package/dist/browser/security/origins.js.map +1 -0
  98. package/dist/browser/tabs.d.ts +15 -0
  99. package/dist/browser/tabs.d.ts.map +1 -0
  100. package/dist/browser/tabs.js +71 -0
  101. package/dist/browser/tabs.js.map +1 -0
  102. package/dist/browser/types.d.ts +32 -0
  103. package/dist/browser/types.d.ts.map +1 -0
  104. package/dist/browser/types.js +2 -0
  105. package/dist/browser/types.js.map +1 -0
  106. package/dist/browser.d.ts +2 -99
  107. package/dist/browser.d.ts.map +1 -1
  108. package/dist/browser.js +3 -653
  109. package/dist/browser.js.map +1 -1
  110. package/dist/cli/init.d.ts +3 -0
  111. package/dist/cli/init.d.ts.map +1 -1
  112. package/dist/cli/init.js +33 -48
  113. package/dist/cli/init.js.map +1 -1
  114. package/dist/cli/linux-check.d.ts +2 -0
  115. package/dist/cli/linux-check.d.ts.map +1 -0
  116. package/dist/cli/linux-check.js +20 -0
  117. package/dist/cli/linux-check.js.map +1 -0
  118. package/dist/cli/skill-template.d.ts +1 -1
  119. package/dist/cli/skill-template.d.ts.map +1 -1
  120. package/dist/cli/skill-template.js +3 -113
  121. package/dist/cli/skill-template.js.map +1 -1
  122. package/dist/commands/check.d.ts +17 -0
  123. package/dist/commands/check.d.ts.map +1 -0
  124. package/dist/commands/check.js +38 -0
  125. package/dist/commands/check.js.map +1 -0
  126. package/dist/commands/click.d.ts +3 -1
  127. package/dist/commands/click.d.ts.map +1 -1
  128. package/dist/commands/click.js +16 -4
  129. package/dist/commands/click.js.map +1 -1
  130. package/dist/commands/connect.d.ts +14 -0
  131. package/dist/commands/connect.d.ts.map +1 -0
  132. package/dist/commands/connect.js +19 -0
  133. package/dist/commands/connect.js.map +1 -0
  134. package/dist/commands/dialog.d.ts +19 -0
  135. package/dist/commands/dialog.d.ts.map +1 -0
  136. package/dist/commands/dialog.js +51 -0
  137. package/dist/commands/dialog.js.map +1 -0
  138. package/dist/commands/downloads.d.ts +30 -0
  139. package/dist/commands/downloads.d.ts.map +1 -0
  140. package/dist/commands/downloads.js +66 -0
  141. package/dist/commands/downloads.js.map +1 -0
  142. package/dist/commands/fill.d.ts +16 -0
  143. package/dist/commands/fill.d.ts.map +1 -0
  144. package/dist/commands/fill.js +15 -0
  145. package/dist/commands/fill.js.map +1 -0
  146. package/dist/commands/find.d.ts +14 -0
  147. package/dist/commands/find.d.ts.map +1 -0
  148. package/dist/commands/find.js +26 -0
  149. package/dist/commands/find.js.map +1 -0
  150. package/dist/commands/hover.d.ts +13 -0
  151. package/dist/commands/hover.d.ts.map +1 -0
  152. package/dist/commands/hover.js +24 -0
  153. package/dist/commands/hover.js.map +1 -0
  154. package/dist/commands/navigate.d.ts.map +1 -1
  155. package/dist/commands/navigate.js +13 -0
  156. package/dist/commands/navigate.js.map +1 -1
  157. package/dist/commands/network.d.ts +33 -0
  158. package/dist/commands/network.d.ts.map +1 -0
  159. package/dist/commands/network.js +84 -0
  160. package/dist/commands/network.js.map +1 -0
  161. package/dist/commands/performance.d.ts +12 -0
  162. package/dist/commands/performance.d.ts.map +1 -0
  163. package/dist/commands/performance.js +26 -0
  164. package/dist/commands/performance.js.map +1 -0
  165. package/dist/commands/press_key.d.ts +10 -0
  166. package/dist/commands/press_key.d.ts.map +1 -0
  167. package/dist/commands/press_key.js +103 -0
  168. package/dist/commands/press_key.js.map +1 -0
  169. package/dist/commands/scroll.d.ts +21 -0
  170. package/dist/commands/scroll.d.ts.map +1 -0
  171. package/dist/commands/scroll.js +54 -0
  172. package/dist/commands/scroll.js.map +1 -0
  173. package/dist/commands/select.d.ts +18 -0
  174. package/dist/commands/select.d.ts.map +1 -0
  175. package/dist/commands/select.js +53 -0
  176. package/dist/commands/select.js.map +1 -0
  177. package/dist/commands/snapshot.d.ts +9 -0
  178. package/dist/commands/snapshot.d.ts.map +1 -0
  179. package/dist/commands/snapshot.js +7 -0
  180. package/dist/commands/snapshot.js.map +1 -0
  181. package/dist/commands/styles.d.ts +13 -0
  182. package/dist/commands/styles.d.ts.map +1 -0
  183. package/dist/commands/styles.js +7 -0
  184. package/dist/commands/styles.js.map +1 -0
  185. package/dist/commands/type.d.ts +3 -1
  186. package/dist/commands/type.d.ts.map +1 -1
  187. package/dist/commands/type.js +11 -2
  188. package/dist/commands/type.js.map +1 -1
  189. package/dist/commands/upload.d.ts +12 -0
  190. package/dist/commands/upload.d.ts.map +1 -0
  191. package/dist/commands/upload.js +13 -0
  192. package/dist/commands/upload.js.map +1 -0
  193. package/dist/mcp/console-buffer.d.ts +9 -0
  194. package/dist/mcp/console-buffer.d.ts.map +1 -1
  195. package/dist/mcp/console-buffer.js.map +1 -1
  196. package/dist/mcp/index.js +20 -2
  197. package/dist/mcp/index.js.map +1 -1
  198. package/dist/mcp/server.d.ts +10 -0
  199. package/dist/mcp/server.d.ts.map +1 -1
  200. package/dist/mcp/server.js +63 -2
  201. package/dist/mcp/server.js.map +1 -1
  202. package/dist/mcp/tools/browser.d.ts.map +1 -1
  203. package/dist/mcp/tools/browser.js +109 -11
  204. package/dist/mcp/tools/browser.js.map +1 -1
  205. package/dist/mcp/tools/connect.d.ts +5 -0
  206. package/dist/mcp/tools/connect.d.ts.map +1 -0
  207. package/dist/mcp/tools/connect.js +48 -0
  208. package/dist/mcp/tools/connect.js.map +1 -0
  209. package/dist/mcp/tools/files.d.ts +4 -0
  210. package/dist/mcp/tools/files.d.ts.map +1 -0
  211. package/dist/mcp/tools/files.js +85 -0
  212. package/dist/mcp/tools/files.js.map +1 -0
  213. package/dist/mcp/tools/interaction.d.ts +4 -0
  214. package/dist/mcp/tools/interaction.d.ts.map +1 -0
  215. package/dist/mcp/tools/interaction.js +176 -0
  216. package/dist/mcp/tools/interaction.js.map +1 -0
  217. package/dist/mcp/tools/names.d.ts +1 -1
  218. package/dist/mcp/tools/names.d.ts.map +1 -1
  219. package/dist/mcp/tools/names.js +19 -1
  220. package/dist/mcp/tools/names.js.map +1 -1
  221. package/dist/mcp/tools/network.d.ts +4 -0
  222. package/dist/mcp/tools/network.d.ts.map +1 -0
  223. package/dist/mcp/tools/network.js +68 -0
  224. package/dist/mcp/tools/network.js.map +1 -0
  225. package/dist/mcp/tools/performance.d.ts +4 -0
  226. package/dist/mcp/tools/performance.d.ts.map +1 -0
  227. package/dist/mcp/tools/performance.js +26 -0
  228. package/dist/mcp/tools/performance.js.map +1 -0
  229. package/dist/mcp/tools/runtime.d.ts +4 -0
  230. package/dist/mcp/tools/runtime.d.ts.map +1 -0
  231. package/dist/mcp/tools/runtime.js +128 -0
  232. package/dist/mcp/tools/runtime.js.map +1 -0
  233. package/dist/mcp/tools/snapshot.d.ts +4 -0
  234. package/dist/mcp/tools/snapshot.d.ts.map +1 -0
  235. package/dist/mcp/tools/snapshot.js +42 -0
  236. package/dist/mcp/tools/snapshot.js.map +1 -0
  237. package/dist/mcp/tools/styles.d.ts +4 -0
  238. package/dist/mcp/tools/styles.d.ts.map +1 -0
  239. package/dist/mcp/tools/styles.js +27 -0
  240. package/dist/mcp/tools/styles.js.map +1 -0
  241. package/dist/util/config.d.ts.map +1 -1
  242. package/dist/util/config.js +3 -2
  243. package/dist/util/config.js.map +1 -1
  244. package/package.json +5 -4
  245. package/skills/pilot/SKILL.md +48 -0
  246. package/src/browser/browser-manager.ts +465 -0
  247. package/src/browser/chrome-launcher.ts +282 -0
  248. package/src/browser/connection.ts +84 -0
  249. package/src/browser/events.ts +121 -0
  250. package/src/browser/index.ts +20 -0
  251. package/src/browser/inspect/element-ref.ts +68 -0
  252. package/src/browser/inspect/snapshot.ts +348 -0
  253. package/src/browser/inspect/styles.ts +258 -0
  254. package/src/browser/inspect/types.ts +37 -0
  255. package/src/browser/interaction/dialogs.ts +54 -0
  256. package/src/browser/interaction/downloads.ts +116 -0
  257. package/src/browser/interaction/events.ts +79 -0
  258. package/src/browser/interaction/ref-resolver.ts +53 -0
  259. package/src/browser/interaction/uploads.ts +60 -0
  260. package/src/browser/network/network-buffer.ts +133 -0
  261. package/src/browser/network/network-monitor.ts +107 -0
  262. package/src/browser/network/redaction.ts +42 -0
  263. package/src/browser/network/types.ts +47 -0
  264. package/src/browser/performance/analyze.ts +298 -0
  265. package/src/browser/performance/trace.ts +60 -0
  266. package/src/browser/performance/types.ts +34 -0
  267. package/src/browser/preflight.ts +144 -0
  268. package/src/browser/security/origins.ts +102 -0
  269. package/src/browser/tabs.ts +110 -0
  270. package/src/browser/types.ts +32 -0
  271. package/src/browser.ts +22 -798
  272. package/src/cli/init.ts +40 -49
  273. package/src/cli/linux-check.ts +23 -0
  274. package/src/cli/skill-template.ts +4 -113
  275. package/src/commands/check.ts +59 -0
  276. package/src/commands/click.ts +18 -4
  277. package/src/commands/connect.ts +40 -0
  278. package/src/commands/dialog.ts +79 -0
  279. package/src/commands/downloads.ts +111 -0
  280. package/src/commands/fill.ts +34 -0
  281. package/src/commands/find.ts +52 -0
  282. package/src/commands/hover.ts +42 -0
  283. package/src/commands/navigate.ts +20 -0
  284. package/src/commands/network.ts +141 -0
  285. package/src/commands/performance.ts +51 -0
  286. package/src/commands/press_key.ts +134 -0
  287. package/src/commands/scroll.ts +79 -0
  288. package/src/commands/select.ts +78 -0
  289. package/src/commands/snapshot.ts +18 -0
  290. package/src/commands/styles.ts +24 -0
  291. package/src/commands/type.ts +12 -2
  292. package/src/commands/upload.ts +36 -0
  293. package/src/mcp/console-buffer.ts +10 -0
  294. package/src/mcp/index.ts +24 -2
  295. package/src/mcp/server.ts +74 -2
  296. package/src/mcp/tools/browser.ts +125 -9
  297. package/src/mcp/tools/connect.ts +62 -0
  298. package/src/mcp/tools/files.ts +120 -0
  299. package/src/mcp/tools/interaction.ts +232 -0
  300. package/src/mcp/tools/names.ts +19 -1
  301. package/src/mcp/tools/network.ts +86 -0
  302. package/src/mcp/tools/performance.ts +40 -0
  303. package/src/mcp/tools/runtime.ts +164 -0
  304. package/src/mcp/tools/snapshot.ts +64 -0
  305. package/src/mcp/tools/styles.ts +41 -0
  306. package/src/util/config.ts +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/browser/inspect/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAoDtD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAWD,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAsCD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,YAAY,CAAC,CA0EvB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoDzD"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Default diagnostic properties returned when no filter is specified.
3
+ * Covers the most common layout/visibility debugging needs.
4
+ */
5
+ const DEFAULT_PROPERTIES = new Set([
6
+ 'display',
7
+ 'visibility',
8
+ 'opacity',
9
+ 'position',
10
+ 'width',
11
+ 'height',
12
+ 'min-width',
13
+ 'min-height',
14
+ 'max-width',
15
+ 'max-height',
16
+ 'margin-top',
17
+ 'margin-right',
18
+ 'margin-bottom',
19
+ 'margin-left',
20
+ 'padding-top',
21
+ 'padding-right',
22
+ 'padding-bottom',
23
+ 'padding-left',
24
+ 'overflow',
25
+ 'overflow-x',
26
+ 'overflow-y',
27
+ 'z-index',
28
+ 'transform',
29
+ 'color',
30
+ 'background-color',
31
+ 'font-size',
32
+ 'font-weight',
33
+ 'text-align',
34
+ 'flex-direction',
35
+ 'flex-wrap',
36
+ 'justify-content',
37
+ 'align-items',
38
+ 'align-self',
39
+ 'flex-grow',
40
+ 'flex-shrink',
41
+ 'gap',
42
+ 'grid-template-columns',
43
+ 'grid-template-rows',
44
+ 'border',
45
+ 'border-radius',
46
+ 'box-sizing',
47
+ 'pointer-events',
48
+ 'cursor'
49
+ ]);
50
+ let cssEnabledFor = null;
51
+ async function ensureCssEnabled(client) {
52
+ if (cssEnabledFor?.deref() === client)
53
+ return;
54
+ await client.CSS.enable();
55
+ cssEnabledFor = new WeakRef(client);
56
+ }
57
+ // Reset CSS enabled state (for reconnection)
58
+ export function resetCssState() {
59
+ cssEnabledFor = null;
60
+ }
61
+ function parseQuad(quad) {
62
+ const x = Math.min(quad[0], quad[2], quad[4], quad[6]);
63
+ const y = Math.min(quad[1], quad[3], quad[5], quad[7]);
64
+ const maxX = Math.max(quad[0], quad[2], quad[4], quad[6]);
65
+ const maxY = Math.max(quad[1], quad[3], quad[5], quad[7]);
66
+ return {
67
+ x: Math.round(x),
68
+ y: Math.round(y),
69
+ width: Math.round(maxX - x),
70
+ height: Math.round(maxY - y)
71
+ };
72
+ }
73
+ function computeBoxEdges(outer, inner) {
74
+ const outerRect = parseQuad(outer);
75
+ const innerRect = parseQuad(inner);
76
+ return {
77
+ top: Math.round(innerRect.y - outerRect.y),
78
+ right: Math.round(outerRect.x + outerRect.width - (innerRect.x + innerRect.width)),
79
+ bottom: Math.round(outerRect.y + outerRect.height - (innerRect.y + innerRect.height)),
80
+ left: Math.round(innerRect.x - outerRect.x)
81
+ };
82
+ }
83
+ export async function getStyles(client, refMap, ref, properties) {
84
+ const backendNodeId = refMap.resolve(ref);
85
+ await ensureCssEnabled(client);
86
+ await client.DOM.enable({});
87
+ // We need a nodeId for CSS APIs — push the backend node to the frontend
88
+ const { nodeIds } = await client.DOM.pushNodesByBackendIdsToFrontend({
89
+ backendNodeIds: [backendNodeId]
90
+ });
91
+ const nodeId = nodeIds[0];
92
+ if (!nodeId) {
93
+ throw new Error(`Could not resolve ref "${ref}" to a DOM node`);
94
+ }
95
+ // Get computed styles
96
+ const { computedStyle } = await client.CSS.getComputedStyleForNode({
97
+ nodeId
98
+ });
99
+ const filterSet = properties
100
+ ? new Set(properties.map((p) => p.toLowerCase()))
101
+ : DEFAULT_PROPERTIES;
102
+ const computed = {};
103
+ for (const prop of computedStyle) {
104
+ if (filterSet.has(prop.name)) {
105
+ computed[prop.name] = prop.value;
106
+ }
107
+ }
108
+ // Get matched CSS rules
109
+ const matched = [];
110
+ try {
111
+ const { matchedCSSRules } = await client.CSS.getMatchedStylesForNode({
112
+ nodeId
113
+ });
114
+ if (matchedCSSRules) {
115
+ for (const match of matchedCSSRules) {
116
+ const rule = match.rule;
117
+ const selector = rule.selectorList?.text ?? '';
118
+ const source = rule.origin ?? 'regular';
119
+ const ruleProps = {};
120
+ for (const prop of rule.style.cssProperties) {
121
+ if (filterSet.has(prop.name) && prop.value) {
122
+ ruleProps[prop.name] = prop.value;
123
+ }
124
+ }
125
+ if (Object.keys(ruleProps).length > 0) {
126
+ matched.push({ selector, source, properties: ruleProps });
127
+ }
128
+ }
129
+ }
130
+ }
131
+ catch {
132
+ // getMatchedStylesForNode can fail for some node types
133
+ }
134
+ // Get box model
135
+ let boxModel;
136
+ try {
137
+ const { model } = await client.DOM.getBoxModel({ backendNodeId });
138
+ boxModel = {
139
+ content: parseQuad(model.content),
140
+ padding: computeBoxEdges(model.padding, model.content),
141
+ border: computeBoxEdges(model.border, model.padding),
142
+ margin: computeBoxEdges(model.margin, model.border),
143
+ width: model.width,
144
+ height: model.height
145
+ };
146
+ }
147
+ catch {
148
+ // Element may not have a box model (display:none)
149
+ }
150
+ return { ref, computed, matched, boxModel };
151
+ }
152
+ export function formatStyles(result) {
153
+ const lines = [`Styles for ${result.ref}:\n`];
154
+ // Computed styles (sorted for stable output)
155
+ lines.push('Computed:');
156
+ const entries = Object.entries(result.computed).sort(([a], [b]) => a.localeCompare(b));
157
+ if (entries.length === 0) {
158
+ lines.push(' (none)');
159
+ }
160
+ else {
161
+ for (const [name, value] of entries) {
162
+ lines.push(` ${name}: ${value}`);
163
+ }
164
+ }
165
+ // Box model
166
+ if (result.boxModel) {
167
+ const bm = result.boxModel;
168
+ lines.push('');
169
+ lines.push('Box Model:');
170
+ lines.push(` content: ${bm.content.width}x${bm.content.height} at (${bm.content.x}, ${bm.content.y})`);
171
+ lines.push(` padding: ${bm.padding.top} ${bm.padding.right} ${bm.padding.bottom} ${bm.padding.left}`);
172
+ lines.push(` border: ${bm.border.top} ${bm.border.right} ${bm.border.bottom} ${bm.border.left}`);
173
+ lines.push(` margin: ${bm.margin.top} ${bm.margin.right} ${bm.margin.bottom} ${bm.margin.left}`);
174
+ lines.push(` total: ${bm.width}x${bm.height}`);
175
+ }
176
+ // Matched rules
177
+ if (result.matched.length > 0) {
178
+ lines.push('');
179
+ lines.push('Matched Rules:');
180
+ for (const rule of result.matched) {
181
+ lines.push(` ${rule.selector} (${rule.source}):`);
182
+ const sortedProps = Object.entries(rule.properties).sort(([a], [b]) => a.localeCompare(b));
183
+ for (const [name, value] of sortedProps) {
184
+ lines.push(` ${name}: ${value}`);
185
+ }
186
+ }
187
+ }
188
+ return lines.join('\n');
189
+ }
190
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/browser/inspect/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface ElementBounds {
2
+ x: number;
3
+ y: number;
4
+ width: number;
5
+ height: number;
6
+ }
7
+ export interface ElementInfo {
8
+ ref: string;
9
+ role: string;
10
+ name: string;
11
+ tag: string;
12
+ type?: string;
13
+ value?: string;
14
+ checked?: boolean;
15
+ disabled?: boolean;
16
+ required?: boolean;
17
+ selected?: boolean;
18
+ expanded?: boolean;
19
+ level?: number;
20
+ visible: boolean;
21
+ bounds?: ElementBounds;
22
+ description?: string;
23
+ }
24
+ export interface SnapshotResult {
25
+ url: string;
26
+ title: string;
27
+ timestamp: number;
28
+ elements: ElementInfo[];
29
+ }
30
+ export interface StaleElementError {
31
+ code: 'STALE_ELEMENT_REFERENCE';
32
+ ref: string;
33
+ message: string;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser/inspect/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,yBAAyB,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/browser/inspect/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { Client } from 'chrome-remote-interface';
2
+ export interface PendingDialog {
3
+ type: string;
4
+ message: string;
5
+ defaultPrompt?: string;
6
+ timestamp: number;
7
+ }
8
+ export declare class DialogQueue {
9
+ private pending;
10
+ push(dialog: PendingDialog): void;
11
+ list(): PendingDialog[];
12
+ shift(): PendingDialog | undefined;
13
+ size(): number;
14
+ clear(): void;
15
+ }
16
+ export declare function attachDialogHandler(client: Client, queue: DialogQueue): void;
17
+ export declare function handleDialog(client: Client, accept: boolean, promptText?: string): Promise<void>;
18
+ //# sourceMappingURL=dialogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../../src/browser/interaction/dialogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAuB;IAEtC,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIjC,IAAI,IAAI,aAAa,EAAE;IAIvB,KAAK,IAAI,aAAa,GAAG,SAAS;IAIlC,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAS5E;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -0,0 +1,35 @@
1
+ export class DialogQueue {
2
+ pending = [];
3
+ push(dialog) {
4
+ this.pending.push(dialog);
5
+ }
6
+ list() {
7
+ return [...this.pending];
8
+ }
9
+ shift() {
10
+ return this.pending.shift();
11
+ }
12
+ size() {
13
+ return this.pending.length;
14
+ }
15
+ clear() {
16
+ this.pending = [];
17
+ }
18
+ }
19
+ export function attachDialogHandler(client, queue) {
20
+ client.Page.javascriptDialogOpening((params) => {
21
+ queue.push({
22
+ type: params.type,
23
+ message: params.message,
24
+ defaultPrompt: params.defaultPrompt ?? undefined,
25
+ timestamp: Date.now()
26
+ });
27
+ });
28
+ }
29
+ export async function handleDialog(client, accept, promptText) {
30
+ await client.Page.handleJavaScriptDialog({
31
+ accept,
32
+ promptText
33
+ });
34
+ }
35
+ //# sourceMappingURL=dialogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../../src/browser/interaction/dialogs.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,WAAW;IACd,OAAO,GAAoB,EAAE,CAAC;IAEtC,IAAI,CAAC,MAAqB;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,KAAkB;IACpE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,SAAS;YAChD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,MAAe,EACf,UAAmB;IAEnB,MAAM,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACvC,MAAM;QACN,UAAU;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Client } from 'chrome-remote-interface';
2
+ export interface DownloadRecord {
3
+ guid: string;
4
+ url: string;
5
+ suggestedFilename: string;
6
+ state: 'inProgress' | 'completed' | 'canceled';
7
+ receivedBytes: number;
8
+ totalBytes: number;
9
+ timestamp: number;
10
+ }
11
+ export declare class DownloadTracker {
12
+ private downloads;
13
+ track(record: DownloadRecord): void;
14
+ update(guid: string, patch: Partial<DownloadRecord>): void;
15
+ get(guid: string): DownloadRecord | undefined;
16
+ list(): DownloadRecord[];
17
+ clear(): number;
18
+ size(): number;
19
+ }
20
+ export declare function enableDownloads(client: Client): Promise<string>;
21
+ export declare function attachDownloadHandler(client: Client, tracker: DownloadTracker): void;
22
+ export declare function waitForDownload(tracker: DownloadTracker, guid: string, timeoutMs?: number): Promise<DownloadRecord>;
23
+ //# sourceMappingURL=downloads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloads.d.ts","sourceRoot":"","sources":["../../../src/browser/interaction/downloads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAItD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAqC;IAEtD,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAInC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAO1D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,cAAc,EAAE;IAIxB,KAAK,IAAI,MAAM;IAMf,IAAI,IAAI,MAAM;CAGf;AAQD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GACvB,IAAI,CA0BN;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,MAAM,EACZ,SAAS,SAAQ,GAChB,OAAO,CAAC,cAAc,CAAC,CAiBzB"}
@@ -0,0 +1,87 @@
1
+ import { tmpdir } from 'os';
2
+ import { resolve } from 'path';
3
+ export class DownloadTracker {
4
+ downloads = new Map();
5
+ track(record) {
6
+ this.downloads.set(record.guid, record);
7
+ }
8
+ update(guid, patch) {
9
+ const existing = this.downloads.get(guid);
10
+ if (existing) {
11
+ Object.assign(existing, patch);
12
+ }
13
+ }
14
+ get(guid) {
15
+ return this.downloads.get(guid);
16
+ }
17
+ list() {
18
+ return [...this.downloads.values()];
19
+ }
20
+ clear() {
21
+ const count = this.downloads.size;
22
+ this.downloads.clear();
23
+ return count;
24
+ }
25
+ size() {
26
+ return this.downloads.size;
27
+ }
28
+ }
29
+ function getDownloadDir() {
30
+ const env = process.env.PILOT_DOWNLOAD_DIR;
31
+ if (env)
32
+ return resolve(env);
33
+ return resolve(tmpdir(), 'pilot-downloads');
34
+ }
35
+ export async function enableDownloads(client) {
36
+ const downloadPath = getDownloadDir();
37
+ await client.Browser.setDownloadBehavior({
38
+ behavior: 'allowAndName',
39
+ downloadPath,
40
+ eventsEnabled: true
41
+ });
42
+ return downloadPath;
43
+ }
44
+ export function attachDownloadHandler(client, tracker) {
45
+ client.Browser.downloadWillBegin((params) => {
46
+ tracker.track({
47
+ guid: params.guid,
48
+ url: params.url,
49
+ suggestedFilename: params.suggestedFilename,
50
+ state: 'inProgress',
51
+ receivedBytes: 0,
52
+ totalBytes: 0,
53
+ timestamp: Date.now()
54
+ });
55
+ });
56
+ client.Browser.downloadProgress((params) => {
57
+ const state = params.state === 'completed'
58
+ ? 'completed'
59
+ : params.state === 'canceled'
60
+ ? 'canceled'
61
+ : 'inProgress';
62
+ tracker.update(params.guid, {
63
+ state,
64
+ receivedBytes: params.receivedBytes ?? 0,
65
+ totalBytes: params.totalBytes ?? 0
66
+ });
67
+ });
68
+ }
69
+ export function waitForDownload(tracker, guid, timeoutMs = 30000) {
70
+ return new Promise((resolve, reject) => {
71
+ const start = Date.now();
72
+ const check = () => {
73
+ const record = tracker.get(guid);
74
+ if (record && record.state !== 'inProgress') {
75
+ resolve(record);
76
+ return;
77
+ }
78
+ if (Date.now() - start > timeoutMs) {
79
+ reject(new Error(`Download ${guid} timed out after ${timeoutMs}ms`));
80
+ return;
81
+ }
82
+ setTimeout(check, 200);
83
+ };
84
+ check();
85
+ });
86
+ }
87
+ //# sourceMappingURL=downloads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloads.js","sourceRoot":"","sources":["../../../src/browser/interaction/downloads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Client } from 'chrome-remote-interface';
2
+ /**
3
+ * Fire framework-compatible input events on an element.
4
+ * Uses the native value setter to work with React's synthetic event system,
5
+ * then dispatches native DOM events with bubbling enabled for Vue/Svelte.
6
+ */
7
+ export declare function fireInputEvents(client: Client, objectId: string): Promise<void>;
8
+ /**
9
+ * Set a form field value using the native setter for React compatibility,
10
+ * then fire input/change events.
11
+ */
12
+ export declare function setFieldValue(client: Client, objectId: string, value: string): Promise<void>;
13
+ /**
14
+ * Get the tag name of an element by its remote object ID.
15
+ */
16
+ export declare function getTagName(client: Client, objectId: string): Promise<string>;
17
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/browser/interaction/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAQjB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Fire framework-compatible input events on an element.
3
+ * Uses the native value setter to work with React's synthetic event system,
4
+ * then dispatches native DOM events with bubbling enabled for Vue/Svelte.
5
+ */
6
+ export async function fireInputEvents(client, objectId) {
7
+ await client.Runtime.callFunctionOn({
8
+ objectId,
9
+ functionDeclaration: `function() {
10
+ this.dispatchEvent(new Event('input', { bubbles: true }));
11
+ this.dispatchEvent(new Event('change', { bubbles: true }));
12
+ }`,
13
+ awaitPromise: false
14
+ });
15
+ }
16
+ /**
17
+ * Set a form field value using the native setter for React compatibility,
18
+ * then fire input/change events.
19
+ */
20
+ export async function setFieldValue(client, objectId, value) {
21
+ await client.Runtime.callFunctionOn({
22
+ objectId,
23
+ functionDeclaration: `function(newValue) {
24
+ var tag = this.tagName.toLowerCase();
25
+ if (tag === 'select') {
26
+ // Select element — set by value
27
+ for (var i = 0; i < this.options.length; i++) {
28
+ if (this.options[i].value === newValue) {
29
+ this.selectedIndex = i;
30
+ break;
31
+ }
32
+ }
33
+ } else if (this.getAttribute('contenteditable') !== null) {
34
+ this.textContent = newValue;
35
+ } else {
36
+ // Use native setter for React compatibility
37
+ var proto = tag === 'textarea'
38
+ ? HTMLTextAreaElement.prototype
39
+ : HTMLInputElement.prototype;
40
+ var setter = Object.getOwnPropertyDescriptor(proto, 'value');
41
+ if (setter && setter.set) {
42
+ setter.set.call(this, newValue);
43
+ } else {
44
+ this.value = newValue;
45
+ }
46
+ }
47
+ this.dispatchEvent(new Event('input', { bubbles: true }));
48
+ this.dispatchEvent(new Event('change', { bubbles: true }));
49
+ }`,
50
+ arguments: [{ value }],
51
+ awaitPromise: false
52
+ });
53
+ }
54
+ /**
55
+ * Get the tag name of an element by its remote object ID.
56
+ */
57
+ export async function getTagName(client, objectId) {
58
+ const { result } = await client.Runtime.callFunctionOn({
59
+ objectId,
60
+ functionDeclaration: `function() { return this.tagName ? this.tagName.toLowerCase() : ''; }`,
61
+ returnByValue: true,
62
+ awaitPromise: false
63
+ });
64
+ return String(result.value ?? '');
65
+ }
66
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/browser/interaction/events.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,QAAgB;IAEhB,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,QAAQ;QACR,mBAAmB,EAAE;;;MAGnB;QACF,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,QAAgB,EAChB,KAAa;IAEb,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,QAAQ;QACR,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;MA0BnB;QACF,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QACtB,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,QAAgB;IAEhB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QACrD,QAAQ;QACR,mBAAmB,EAAE,uEAAuE;QAC5F,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Client } from 'chrome-remote-interface';
2
+ import type { ElementRefMap } from '../inspect/element-ref.js';
3
+ export interface ResolvedElement {
4
+ backendNodeId: number;
5
+ objectId: string;
6
+ x: number;
7
+ y: number;
8
+ }
9
+ /**
10
+ * Resolve an element ref to coordinates and a remote object ID.
11
+ * Scrolls the element into view first so click coordinates are valid.
12
+ */
13
+ export declare function resolveRef(client: Client, refMap: ElementRefMap, ref: string): Promise<ResolvedElement>;
14
+ /**
15
+ * Focus an element by ref.
16
+ */
17
+ export declare function focusRef(client: Client, backendNodeId: number): Promise<void>;
18
+ //# sourceMappingURL=ref-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-resolver.d.ts","sourceRoot":"","sources":["../../../src/browser/interaction/ref-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAwB1B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Resolve an element ref to coordinates and a remote object ID.
3
+ * Scrolls the element into view first so click coordinates are valid.
4
+ */
5
+ export async function resolveRef(client, refMap, ref) {
6
+ const backendNodeId = refMap.resolve(ref);
7
+ // Scroll into view
8
+ await client.DOM.scrollIntoViewIfNeeded({ backendNodeId });
9
+ // Get center coordinates from box model
10
+ const { model } = await client.DOM.getBoxModel({ backendNodeId });
11
+ const content = model.content;
12
+ const x = (content[0] + content[2] + content[4] + content[6]) / 4;
13
+ const y = (content[1] + content[3] + content[5] + content[7]) / 4;
14
+ // Get remote object for Runtime.callFunctionOn
15
+ const { object } = await client.DOM.resolveNode({ backendNodeId });
16
+ if (!object.objectId) {
17
+ throw new Error(`Could not resolve ref "${ref}" to a remote object`);
18
+ }
19
+ return {
20
+ backendNodeId,
21
+ objectId: object.objectId,
22
+ x: Math.round(x),
23
+ y: Math.round(y)
24
+ };
25
+ }
26
+ /**
27
+ * Focus an element by ref.
28
+ */
29
+ export async function focusRef(client, backendNodeId) {
30
+ await client.DOM.focus({ backendNodeId });
31
+ }
32
+ //# sourceMappingURL=ref-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-resolver.js","sourceRoot":"","sources":["../../../src/browser/interaction/ref-resolver.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,MAAqB,EACrB,GAAW;IAEX,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1C,mBAAmB;IACnB,MAAM,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAE3D,wCAAwC;IACxC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAElE,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,sBAAsB,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,aAAa;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,aAAqB;IAErB,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Client } from 'chrome-remote-interface';
2
+ export declare function validateUploadFiles(files: string[]): void;
3
+ export declare function uploadFiles(client: Client, backendNodeId: number, files: string[]): Promise<void>;
4
+ //# sourceMappingURL=uploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../src/browser/interaction/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AA0BtD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAqBzD;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,43 @@
1
+ import { existsSync, statSync, realpathSync } from 'fs';
2
+ import { resolve, normalize } from 'path';
3
+ const DEFAULT_UPLOAD_ROOTS = [process.cwd()];
4
+ function getUploadRoots() {
5
+ const env = process.env.PILOT_UPLOAD_ROOTS;
6
+ if (env) {
7
+ return env
8
+ .split(',')
9
+ .map((p) => p.trim())
10
+ .filter((p) => p.length > 0)
11
+ .map((p) => resolve(p));
12
+ }
13
+ return DEFAULT_UPLOAD_ROOTS;
14
+ }
15
+ function isUnderAllowedRoot(filePath, roots) {
16
+ const resolved = realpathSync(filePath);
17
+ // Use path separator boundary to prevent "/allowed" matching "/allowed_evil"
18
+ return roots.some((root) => resolved === root || resolved.startsWith(root + '/'));
19
+ }
20
+ export function validateUploadFiles(files) {
21
+ const roots = getUploadRoots();
22
+ for (const file of files) {
23
+ const normalized = normalize(resolve(file));
24
+ if (!existsSync(normalized)) {
25
+ throw new Error(`Upload file not found: ${file}`);
26
+ }
27
+ const stat = statSync(normalized);
28
+ if (!stat.isFile()) {
29
+ throw new Error(`Upload path is not a regular file: ${file}`);
30
+ }
31
+ if (!isUnderAllowedRoot(normalized, roots)) {
32
+ throw new Error(`Upload file "${file}" is outside allowed roots. Set PILOT_UPLOAD_ROOTS to configure allowed directories.`);
33
+ }
34
+ }
35
+ }
36
+ export async function uploadFiles(client, backendNodeId, files) {
37
+ const resolved = files.map((f) => resolve(f));
38
+ await client.DOM.setFileInputFiles({
39
+ files: resolved,
40
+ backendNodeId
41
+ });
42
+ }
43
+ //# sourceMappingURL=uploads.js.map