@everydaydevopsio/pilot 0.5.0 → 0.6.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 (280) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/CLAUDE.md +9 -9
  3. package/README.md +108 -53
  4. package/dist/browser/browser-manager.d.ts +60 -0
  5. package/dist/browser/browser-manager.d.ts.map +1 -0
  6. package/dist/browser/browser-manager.js +348 -0
  7. package/dist/browser/browser-manager.js.map +1 -0
  8. package/dist/browser/chrome-launcher.d.ts +30 -0
  9. package/dist/browser/chrome-launcher.d.ts.map +1 -0
  10. package/dist/browser/chrome-launcher.js +217 -0
  11. package/dist/browser/chrome-launcher.js.map +1 -0
  12. package/dist/browser/connection.d.ts +23 -0
  13. package/dist/browser/connection.d.ts.map +1 -0
  14. package/dist/browser/connection.js +53 -0
  15. package/dist/browser/connection.js.map +1 -0
  16. package/dist/browser/events.d.ts +9 -0
  17. package/dist/browser/events.d.ts.map +1 -0
  18. package/dist/browser/events.js +99 -0
  19. package/dist/browser/events.js.map +1 -0
  20. package/dist/browser/index.d.ts +4 -0
  21. package/dist/browser/index.d.ts.map +1 -0
  22. package/dist/browser/index.js +4 -0
  23. package/dist/browser/index.js.map +1 -0
  24. package/dist/browser/inspect/element-ref.d.ts +23 -0
  25. package/dist/browser/inspect/element-ref.d.ts.map +1 -0
  26. package/dist/browser/inspect/element-ref.js +52 -0
  27. package/dist/browser/inspect/element-ref.js.map +1 -0
  28. package/dist/browser/inspect/snapshot.d.ts +11 -0
  29. package/dist/browser/inspect/snapshot.d.ts.map +1 -0
  30. package/dist/browser/inspect/snapshot.js +282 -0
  31. package/dist/browser/inspect/snapshot.js.map +1 -0
  32. package/dist/browser/inspect/styles.d.ts +45 -0
  33. package/dist/browser/inspect/styles.d.ts.map +1 -0
  34. package/dist/browser/inspect/styles.js +190 -0
  35. package/dist/browser/inspect/styles.js.map +1 -0
  36. package/dist/browser/inspect/types.d.ts +35 -0
  37. package/dist/browser/inspect/types.d.ts.map +1 -0
  38. package/dist/browser/inspect/types.js +2 -0
  39. package/dist/browser/inspect/types.js.map +1 -0
  40. package/dist/browser/interaction/dialogs.d.ts +18 -0
  41. package/dist/browser/interaction/dialogs.d.ts.map +1 -0
  42. package/dist/browser/interaction/dialogs.js +35 -0
  43. package/dist/browser/interaction/dialogs.js.map +1 -0
  44. package/dist/browser/interaction/downloads.d.ts +23 -0
  45. package/dist/browser/interaction/downloads.d.ts.map +1 -0
  46. package/dist/browser/interaction/downloads.js +87 -0
  47. package/dist/browser/interaction/downloads.js.map +1 -0
  48. package/dist/browser/interaction/events.d.ts +17 -0
  49. package/dist/browser/interaction/events.d.ts.map +1 -0
  50. package/dist/browser/interaction/events.js +66 -0
  51. package/dist/browser/interaction/events.js.map +1 -0
  52. package/dist/browser/interaction/ref-resolver.d.ts +18 -0
  53. package/dist/browser/interaction/ref-resolver.d.ts.map +1 -0
  54. package/dist/browser/interaction/ref-resolver.js +32 -0
  55. package/dist/browser/interaction/ref-resolver.js.map +1 -0
  56. package/dist/browser/interaction/uploads.d.ts +4 -0
  57. package/dist/browser/interaction/uploads.d.ts.map +1 -0
  58. package/dist/browser/interaction/uploads.js +43 -0
  59. package/dist/browser/interaction/uploads.js.map +1 -0
  60. package/dist/browser/network/network-buffer.d.ts +19 -0
  61. package/dist/browser/network/network-buffer.d.ts.map +1 -0
  62. package/dist/browser/network/network-buffer.js +118 -0
  63. package/dist/browser/network/network-buffer.js.map +1 -0
  64. package/dist/browser/network/network-monitor.d.ts +8 -0
  65. package/dist/browser/network/network-monitor.d.ts.map +1 -0
  66. package/dist/browser/network/network-monitor.js +85 -0
  67. package/dist/browser/network/network-monitor.js.map +1 -0
  68. package/dist/browser/network/redaction.d.ts +3 -0
  69. package/dist/browser/network/redaction.d.ts.map +1 -0
  70. package/dist/browser/network/redaction.js +36 -0
  71. package/dist/browser/network/redaction.js.map +1 -0
  72. package/dist/browser/network/types.d.ts +45 -0
  73. package/dist/browser/network/types.d.ts.map +1 -0
  74. package/dist/browser/network/types.js +2 -0
  75. package/dist/browser/network/types.js.map +1 -0
  76. package/dist/browser/performance/analyze.d.ts +5 -0
  77. package/dist/browser/performance/analyze.d.ts.map +1 -0
  78. package/dist/browser/performance/analyze.js +230 -0
  79. package/dist/browser/performance/analyze.js.map +1 -0
  80. package/dist/browser/performance/trace.d.ts +10 -0
  81. package/dist/browser/performance/trace.d.ts.map +1 -0
  82. package/dist/browser/performance/trace.js +38 -0
  83. package/dist/browser/performance/trace.js.map +1 -0
  84. package/dist/browser/performance/types.d.ts +31 -0
  85. package/dist/browser/performance/types.d.ts.map +1 -0
  86. package/dist/browser/performance/types.js +2 -0
  87. package/dist/browser/performance/types.js.map +1 -0
  88. package/dist/browser/security/origins.d.ts +18 -0
  89. package/dist/browser/security/origins.d.ts.map +1 -0
  90. package/dist/browser/security/origins.js +84 -0
  91. package/dist/browser/security/origins.js.map +1 -0
  92. package/dist/browser/tabs.d.ts +15 -0
  93. package/dist/browser/tabs.d.ts.map +1 -0
  94. package/dist/browser/tabs.js +71 -0
  95. package/dist/browser/tabs.js.map +1 -0
  96. package/dist/browser/types.d.ts +31 -0
  97. package/dist/browser/types.d.ts.map +1 -0
  98. package/dist/browser/types.js +2 -0
  99. package/dist/browser/types.js.map +1 -0
  100. package/dist/browser.d.ts +2 -99
  101. package/dist/browser.d.ts.map +1 -1
  102. package/dist/browser.js +3 -653
  103. package/dist/browser.js.map +1 -1
  104. package/dist/commands/check.d.ts +17 -0
  105. package/dist/commands/check.d.ts.map +1 -0
  106. package/dist/commands/check.js +38 -0
  107. package/dist/commands/check.js.map +1 -0
  108. package/dist/commands/click.d.ts +3 -1
  109. package/dist/commands/click.d.ts.map +1 -1
  110. package/dist/commands/click.js +16 -4
  111. package/dist/commands/click.js.map +1 -1
  112. package/dist/commands/connect.d.ts +14 -0
  113. package/dist/commands/connect.d.ts.map +1 -0
  114. package/dist/commands/connect.js +19 -0
  115. package/dist/commands/connect.js.map +1 -0
  116. package/dist/commands/dialog.d.ts +19 -0
  117. package/dist/commands/dialog.d.ts.map +1 -0
  118. package/dist/commands/dialog.js +51 -0
  119. package/dist/commands/dialog.js.map +1 -0
  120. package/dist/commands/downloads.d.ts +30 -0
  121. package/dist/commands/downloads.d.ts.map +1 -0
  122. package/dist/commands/downloads.js +66 -0
  123. package/dist/commands/downloads.js.map +1 -0
  124. package/dist/commands/fill.d.ts +16 -0
  125. package/dist/commands/fill.d.ts.map +1 -0
  126. package/dist/commands/fill.js +15 -0
  127. package/dist/commands/fill.js.map +1 -0
  128. package/dist/commands/find.d.ts +14 -0
  129. package/dist/commands/find.d.ts.map +1 -0
  130. package/dist/commands/find.js +26 -0
  131. package/dist/commands/find.js.map +1 -0
  132. package/dist/commands/hover.d.ts +13 -0
  133. package/dist/commands/hover.d.ts.map +1 -0
  134. package/dist/commands/hover.js +24 -0
  135. package/dist/commands/hover.js.map +1 -0
  136. package/dist/commands/navigate.d.ts.map +1 -1
  137. package/dist/commands/navigate.js +13 -0
  138. package/dist/commands/navigate.js.map +1 -1
  139. package/dist/commands/network.d.ts +33 -0
  140. package/dist/commands/network.d.ts.map +1 -0
  141. package/dist/commands/network.js +84 -0
  142. package/dist/commands/network.js.map +1 -0
  143. package/dist/commands/performance.d.ts +12 -0
  144. package/dist/commands/performance.d.ts.map +1 -0
  145. package/dist/commands/performance.js +26 -0
  146. package/dist/commands/performance.js.map +1 -0
  147. package/dist/commands/press_key.d.ts +10 -0
  148. package/dist/commands/press_key.d.ts.map +1 -0
  149. package/dist/commands/press_key.js +103 -0
  150. package/dist/commands/press_key.js.map +1 -0
  151. package/dist/commands/scroll.d.ts +21 -0
  152. package/dist/commands/scroll.d.ts.map +1 -0
  153. package/dist/commands/scroll.js +54 -0
  154. package/dist/commands/scroll.js.map +1 -0
  155. package/dist/commands/select.d.ts +18 -0
  156. package/dist/commands/select.d.ts.map +1 -0
  157. package/dist/commands/select.js +53 -0
  158. package/dist/commands/select.js.map +1 -0
  159. package/dist/commands/snapshot.d.ts +9 -0
  160. package/dist/commands/snapshot.d.ts.map +1 -0
  161. package/dist/commands/snapshot.js +7 -0
  162. package/dist/commands/snapshot.js.map +1 -0
  163. package/dist/commands/styles.d.ts +13 -0
  164. package/dist/commands/styles.d.ts.map +1 -0
  165. package/dist/commands/styles.js +7 -0
  166. package/dist/commands/styles.js.map +1 -0
  167. package/dist/commands/type.d.ts +3 -1
  168. package/dist/commands/type.d.ts.map +1 -1
  169. package/dist/commands/type.js +11 -2
  170. package/dist/commands/type.js.map +1 -1
  171. package/dist/commands/upload.d.ts +12 -0
  172. package/dist/commands/upload.d.ts.map +1 -0
  173. package/dist/commands/upload.js +13 -0
  174. package/dist/commands/upload.js.map +1 -0
  175. package/dist/mcp/console-buffer.d.ts +9 -0
  176. package/dist/mcp/console-buffer.d.ts.map +1 -1
  177. package/dist/mcp/console-buffer.js.map +1 -1
  178. package/dist/mcp/server.d.ts +10 -0
  179. package/dist/mcp/server.d.ts.map +1 -1
  180. package/dist/mcp/server.js +63 -2
  181. package/dist/mcp/server.js.map +1 -1
  182. package/dist/mcp/tools/browser.d.ts.map +1 -1
  183. package/dist/mcp/tools/browser.js +99 -8
  184. package/dist/mcp/tools/browser.js.map +1 -1
  185. package/dist/mcp/tools/connect.d.ts +5 -0
  186. package/dist/mcp/tools/connect.d.ts.map +1 -0
  187. package/dist/mcp/tools/connect.js +48 -0
  188. package/dist/mcp/tools/connect.js.map +1 -0
  189. package/dist/mcp/tools/files.d.ts +4 -0
  190. package/dist/mcp/tools/files.d.ts.map +1 -0
  191. package/dist/mcp/tools/files.js +85 -0
  192. package/dist/mcp/tools/files.js.map +1 -0
  193. package/dist/mcp/tools/interaction.d.ts +4 -0
  194. package/dist/mcp/tools/interaction.d.ts.map +1 -0
  195. package/dist/mcp/tools/interaction.js +176 -0
  196. package/dist/mcp/tools/interaction.js.map +1 -0
  197. package/dist/mcp/tools/names.d.ts +1 -1
  198. package/dist/mcp/tools/names.d.ts.map +1 -1
  199. package/dist/mcp/tools/names.js +19 -1
  200. package/dist/mcp/tools/names.js.map +1 -1
  201. package/dist/mcp/tools/network.d.ts +4 -0
  202. package/dist/mcp/tools/network.d.ts.map +1 -0
  203. package/dist/mcp/tools/network.js +68 -0
  204. package/dist/mcp/tools/network.js.map +1 -0
  205. package/dist/mcp/tools/performance.d.ts +4 -0
  206. package/dist/mcp/tools/performance.d.ts.map +1 -0
  207. package/dist/mcp/tools/performance.js +26 -0
  208. package/dist/mcp/tools/performance.js.map +1 -0
  209. package/dist/mcp/tools/runtime.d.ts +4 -0
  210. package/dist/mcp/tools/runtime.d.ts.map +1 -0
  211. package/dist/mcp/tools/runtime.js +128 -0
  212. package/dist/mcp/tools/runtime.js.map +1 -0
  213. package/dist/mcp/tools/snapshot.d.ts +4 -0
  214. package/dist/mcp/tools/snapshot.d.ts.map +1 -0
  215. package/dist/mcp/tools/snapshot.js +42 -0
  216. package/dist/mcp/tools/snapshot.js.map +1 -0
  217. package/dist/mcp/tools/styles.d.ts +4 -0
  218. package/dist/mcp/tools/styles.d.ts.map +1 -0
  219. package/dist/mcp/tools/styles.js +27 -0
  220. package/dist/mcp/tools/styles.js.map +1 -0
  221. package/dist/util/config.d.ts.map +1 -1
  222. package/dist/util/config.js +3 -2
  223. package/dist/util/config.js.map +1 -1
  224. package/package.json +7 -3
  225. package/src/browser/browser-manager.ts +457 -0
  226. package/src/browser/chrome-launcher.ts +271 -0
  227. package/src/browser/connection.ts +84 -0
  228. package/src/browser/events.ts +121 -0
  229. package/src/browser/index.ts +20 -0
  230. package/src/browser/inspect/element-ref.ts +68 -0
  231. package/src/browser/inspect/snapshot.ts +348 -0
  232. package/src/browser/inspect/styles.ts +258 -0
  233. package/src/browser/inspect/types.ts +37 -0
  234. package/src/browser/interaction/dialogs.ts +54 -0
  235. package/src/browser/interaction/downloads.ts +116 -0
  236. package/src/browser/interaction/events.ts +79 -0
  237. package/src/browser/interaction/ref-resolver.ts +53 -0
  238. package/src/browser/interaction/uploads.ts +60 -0
  239. package/src/browser/network/network-buffer.ts +133 -0
  240. package/src/browser/network/network-monitor.ts +107 -0
  241. package/src/browser/network/redaction.ts +42 -0
  242. package/src/browser/network/types.ts +47 -0
  243. package/src/browser/performance/analyze.ts +298 -0
  244. package/src/browser/performance/trace.ts +60 -0
  245. package/src/browser/performance/types.ts +34 -0
  246. package/src/browser/security/origins.ts +102 -0
  247. package/src/browser/tabs.ts +110 -0
  248. package/src/browser/types.ts +31 -0
  249. package/src/browser.ts +22 -798
  250. package/src/commands/check.ts +59 -0
  251. package/src/commands/click.ts +18 -4
  252. package/src/commands/connect.ts +40 -0
  253. package/src/commands/dialog.ts +79 -0
  254. package/src/commands/downloads.ts +111 -0
  255. package/src/commands/fill.ts +34 -0
  256. package/src/commands/find.ts +52 -0
  257. package/src/commands/hover.ts +42 -0
  258. package/src/commands/navigate.ts +20 -0
  259. package/src/commands/network.ts +141 -0
  260. package/src/commands/performance.ts +51 -0
  261. package/src/commands/press_key.ts +134 -0
  262. package/src/commands/scroll.ts +79 -0
  263. package/src/commands/select.ts +78 -0
  264. package/src/commands/snapshot.ts +18 -0
  265. package/src/commands/styles.ts +24 -0
  266. package/src/commands/type.ts +12 -2
  267. package/src/commands/upload.ts +36 -0
  268. package/src/mcp/console-buffer.ts +10 -0
  269. package/src/mcp/server.ts +74 -2
  270. package/src/mcp/tools/browser.ts +113 -7
  271. package/src/mcp/tools/connect.ts +62 -0
  272. package/src/mcp/tools/files.ts +120 -0
  273. package/src/mcp/tools/interaction.ts +232 -0
  274. package/src/mcp/tools/names.ts +19 -1
  275. package/src/mcp/tools/network.ts +86 -0
  276. package/src/mcp/tools/performance.ts +40 -0
  277. package/src/mcp/tools/runtime.ts +164 -0
  278. package/src/mcp/tools/snapshot.ts +64 -0
  279. package/src/mcp/tools/styles.ts +41 -0
  280. package/src/util/config.ts +3 -2
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../../src/browser/interaction/uploads.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,oBAAoB,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAE7C,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC3C,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,GAAG;aACP,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,KAAe;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,6EAA6E;IAC7E,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,sFAAsF,CAC3G,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,aAAqB,EACrB,KAAe;IAEf,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACjC,KAAK,EAAE,QAAQ;QACf,aAAa;KACd,CAAC,CAAC;AACL,CAAC"}