@xnng/browser-relay 1.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 (79) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +445 -0
  3. package/docs/README.zh-CN.md +421 -0
  4. package/docs/benchmarks/browser-gaps-codex-ax.json +418 -0
  5. package/docs/benchmarks/browser-gaps-relay-after.json +655 -0
  6. package/docs/benchmarks/browser-gaps-relay-baseline.json +679 -0
  7. package/docs/benchmarks/browser-readiness-cost.json +106 -0
  8. package/docs/benchmarks/browser-runtime-balanced-headed.json +412 -0
  9. package/docs/benchmarks/browser-runtime-balanced-rtt50.json +412 -0
  10. package/docs/benchmarks/browser-runtime-balanced.json +412 -0
  11. package/docs/benchmarks/browser-runtime-rtt50.json +194 -0
  12. package/docs/benchmarks/browser-runtime.json +254 -0
  13. package/docs/benchmarks/browser-use-parity.json +54 -0
  14. package/docs/benchmarks/codex-extension-audit.json +131 -0
  15. package/docs/benchmarks/codex-native-protocol.md +69 -0
  16. package/docs/benchmarks/codex-native-replay.js +116 -0
  17. package/docs/benchmarks/codex-native-status.json +81 -0
  18. package/docs/benchmarks/codex-native.json +1003 -0
  19. package/docs/benchmarks/extension-sessions.png +0 -0
  20. package/docs/benchmarks/extension-tasks.png +0 -0
  21. package/docs/benchmarks/iframe-routing-regression.json +37 -0
  22. package/docs/browser-use-comparison.md +331 -0
  23. package/docs/browser-use-gap-audit.md +141 -0
  24. package/docs/browser-use-parity.md +105 -0
  25. package/docs/demo/intranet.html +103 -0
  26. package/docs/releases/v1.5.0.md +59 -0
  27. package/docs/releases/v1.5.1.md +16 -0
  28. package/docs/releases/v1.5.2.md +42 -0
  29. package/docs/releases/v1.5.3.md +33 -0
  30. package/docs/releases/v1.5.4.md +42 -0
  31. package/docs/releases/v1.6.0.md +16 -0
  32. package/docs/remote-control-hub.md +523 -0
  33. package/extension/activity.js +328 -0
  34. package/extension/automation.js +1839 -0
  35. package/extension/background.js +1854 -0
  36. package/extension/i18n.js +149 -0
  37. package/extension/icons/icon128.png +0 -0
  38. package/extension/icons/icon16.png +0 -0
  39. package/extension/icons/icon32.png +0 -0
  40. package/extension/icons/icon48.png +0 -0
  41. package/extension/manifest.json +47 -0
  42. package/extension/observations.js +109 -0
  43. package/extension/options.html +289 -0
  44. package/extension/options.js +269 -0
  45. package/extension/popup.html +74 -0
  46. package/extension/popup.js +105 -0
  47. package/extension/protocol.js +45 -0
  48. package/extension/remote-auth.js +18 -0
  49. package/extension/sessions.js +134 -0
  50. package/extension/snapshot.js +161 -0
  51. package/extension/task-groups.js +108 -0
  52. package/extension/tasks.js +186 -0
  53. package/extension/wait.js +89 -0
  54. package/hub/README.md +42 -0
  55. package/hub/package-lock.json +1544 -0
  56. package/hub/package.json +13 -0
  57. package/hub/src/rpc.js +41 -0
  58. package/hub/src/worker.js +322 -0
  59. package/hub/wrangler.example.toml +19 -0
  60. package/package.json +83 -0
  61. package/server/cdp-bridge.js +200 -0
  62. package/server/cli.js +1798 -0
  63. package/server/hub-server.js +258 -0
  64. package/server/install.js +250 -0
  65. package/server/mcp-server.js +504 -0
  66. package/server/npx-runner.js +96 -0
  67. package/server/relay-server.js +1356 -0
  68. package/server/remote-protocol.js +76 -0
  69. package/server/runtime-worker.js +166 -0
  70. package/server/script-runtime.js +189 -0
  71. package/server/sdk.js +307 -0
  72. package/server/service-state.js +103 -0
  73. package/server/snapshot.js +161 -0
  74. package/server/uninstall.js +61 -0
  75. package/server/windows-service-entry.js +58 -0
  76. package/server/windows-service.js +360 -0
  77. package/skills/browser-relay/SKILL.md +192 -0
  78. package/skills/browser-relay/references/legacy-api.md +163 -0
  79. package/skills/browser-relay/references/runtime.md +240 -0
@@ -0,0 +1,1003 @@
1
+ {
2
+ "measuredAt": "2026-09-09T05:51:09.202Z",
3
+ "backend": "Codex native Chrome extension through mcp__cua_repl",
4
+ "viewport": {
5
+ "height": 925,
6
+ "width": 1466
7
+ },
8
+ "browserVersion": null,
9
+ "browserVersionReason": "chrome://version was blocked by Browser Use URL policy; no workaround attempted",
10
+ "headless": false,
11
+ "scope": "Deterministic replay of a discovered same-page task; inner browser API and script timings exclude model inference and outer tool dispatch; not a blinded model evaluation",
12
+ "outerInvocations": [
13
+ {
14
+ "id": "pair-0",
15
+ "wallMs": 4765.2
16
+ },
17
+ {
18
+ "id": "pair-1",
19
+ "wallMs": 5000.4
20
+ },
21
+ {
22
+ "id": "pair-2",
23
+ "wallMs": 4022.2
24
+ },
25
+ {
26
+ "id": "pair-3",
27
+ "wallMs": 3756.3
28
+ },
29
+ {
30
+ "id": "pair-4",
31
+ "wallMs": 4012.9
32
+ },
33
+ {
34
+ "id": "pw-0",
35
+ "wallMs": 9872.3
36
+ },
37
+ {
38
+ "id": "pw-remaining",
39
+ "wallMs": 8041.9
40
+ }
41
+ ],
42
+ "outerTimingScope": "Each outer invocation includes reload/setup and sometimes multiple trials; it is NOT a single-task latency sample. Raw timing from CUA tool result.",
43
+ "discovery": {
44
+ "single": {
45
+ "success": true,
46
+ "toolApiMs": 1190,
47
+ "sessionElapsedMs": 29552,
48
+ "jsCalls": 5,
49
+ "apiCalls": 9,
50
+ "observations": 5,
51
+ "operationTimesMs": [
52
+ 163,
53
+ 29,
54
+ 177,
55
+ 19,
56
+ 172,
57
+ 12,
58
+ 163,
59
+ 285,
60
+ 170
61
+ ]
62
+ },
63
+ "batch": {
64
+ "success": true,
65
+ "toolApiMsRecovered": 390,
66
+ "sessionElapsedMs": 11990,
67
+ "jsCalls": 2,
68
+ "operationTimesMsRecovered": [
69
+ 169,
70
+ 28,
71
+ 5,
72
+ 6,
73
+ 17,
74
+ 165
75
+ ]
76
+ },
77
+ "excludedFromSummary": true,
78
+ "note": "Initial batch logging reported zero because a cross-REPL variable rebind did not update a closure capture. Recovered operation times from the cumulative trace; then changed instrumentation to mutate a stable object. Both interactive discovery runs excluded from replay summaries."
79
+ },
80
+ "summary": {
81
+ "ax-single": {
82
+ "runs": 5,
83
+ "successes": 5,
84
+ "scriptElapsedMs": 902,
85
+ "toolApiMs": 902,
86
+ "stateBytes": 3287,
87
+ "apiCalls": 9,
88
+ "observations": 5
89
+ },
90
+ "ax-batch": {
91
+ "runs": 5,
92
+ "successes": 5,
93
+ "scriptElapsedMs": 436,
94
+ "toolApiMs": 436,
95
+ "stateBytes": 3178,
96
+ "apiCalls": 6,
97
+ "observations": 2
98
+ },
99
+ "native-playwright": {
100
+ "runs": 5,
101
+ "successes": 5,
102
+ "scriptElapsedMs": 788,
103
+ "toolApiMs": 788,
104
+ "stateBytes": 1706,
105
+ "apiCalls": 7,
106
+ "observations": 2
107
+ }
108
+ },
109
+ "stateDictionary": [
110
+ "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\n1 AXWebArea Browser Relay benchmark, URL: 127.0.0.1:61427/\n\t2 heading Browser Relay benchmark, Value: 1\n\t\t3 text Browser Relay benchmark\n\t4 container form\n\t\t5 container\n\t\t\t6 text Search \n\t\t\t7 text field (settable) Search \n\t\t8 container\n\t\t\t9 text Owner \n\t\t\t10 pop up button (collapsed, settable) Owner , Value: All, Secondary Actions: Expand\n\t\t\t\t11 menu\n\t\t\t\t\t12 (selected) All\n\t\t\t\t\t13 Alice\n\t\t14 checkbox (settable, integer) Description: Active only, Value: 0\n\t\t15 button Search records\n\t16 text Ready\n\t17 button Add row, ID: add\n\t18 content list rows\n\t\t19 container\n\t\t\t20 AXListMarker • \n\t\t\t21 text Initial row\n\t22 container Draft\n\t\t23 text Draft\n\t\t24 button Save\n\t25 container Published\n\t\t26 text Published\n\t\t27 button Save\n\t28 container\n\t\t29 text Password \n\t\t30 text field (settable) Password \n\t31 button Shadow action\n\t32 container Same origin frame\n\t\t33 AXWebArea Frame, URL: 127.0.0.1:61427/frame\n\t\t\t34 button Frame action\n\t35 container Description: Cross origin frame, ID: cross\n\t\t36 AXWebArea Frame, URL: localhost:61427/frame?cross=1\n\t\t\t37 button Cross frame\n\t38 image Description: Drawing surface, ID: canvas\n\t39 text Canvas untouched\n\t40 container Description: Drag handle, ID: drag\n\t41 text Not dragged\n\t42 container Description: Scrollable panel, ID: scrollbox\n\t\t43 text Panel start\n\t\t44 button Panel end\n\t45 button Show delayed, ID: delayed\n\t46 button (disabled) Disabled action, ID: disabled\n\nThe focused UI element is 1 AXWebArea Browser Relay benchmark, URL: 127.0.0.1:61427/",
111
+ "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\nThe following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.\n~\t\t\t7 text field (settable) Search , Value: invoice\nThe focused UI element is 7 text field (settable) Search , Value: invoice",
112
+ "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\nThe following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.\n~\t\t\t10 pop up button (collapsed, settable) Owner , Value: Alice, Secondary Actions: Expand\n~\t\t\t\t\t12 All\n~\t\t\t\t\t13 (selected) Alice\nThe focused UI element is 10 pop up button (collapsed, settable) Owner , Value: Alice, Secondary Actions: Expand",
113
+ "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\nThe following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.\n~\t\t14 checkbox (settable, integer) Description: Active only, Value: 1\nThe focused UI element is 14 checkbox (settable, integer) Description: Active only, Value: 1",
114
+ "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\nThe following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.\nRemoved element IDs: 16\n+\t47 text Found: invoice / alice / active\nThe focused UI element is 15 button Search records",
115
+ "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\n1 AXWebArea Browser Relay benchmark, URL: 127.0.0.1:61427/\n\t2 heading Browser Relay benchmark, Value: 1\n\t\t3 text Browser Relay benchmark\n\t4 container form\n\t\t5 container\n\t\t\t6 text Search \n\t\t\t7 text field (settable) Search , Value: invoice\n\t\t8 container\n\t\t\t9 text Owner \n\t\t\t10 pop up button (collapsed, settable) Owner , Value: Alice, Secondary Actions: Expand\n\t\t\t\t11 menu\n\t\t\t\t\t12 All\n\t\t\t\t\t13 (selected) Alice\n\t\t14 checkbox (settable, integer) Description: Active only, Value: 1\n\t\t15 button Search records\n\t47 text Found: invoice / alice / active\n\t17 button Add row, ID: add\n\t18 content list rows\n\t\t19 container\n\t\t\t20 AXListMarker • \n\t\t\t21 text Initial row\n\t22 container Draft\n\t\t23 text Draft\n\t\t24 button Save\n\t25 container Published\n\t\t26 text Published\n\t\t27 button Save\n\t28 container\n\t\t29 text Password \n\t\t30 text field (settable) Password \n\t31 button Shadow action\n\t32 container Same origin frame\n\t\t33 AXWebArea Frame, URL: 127.0.0.1:61427/frame\n\t\t\t34 button Frame action\n\t35 container Description: Cross origin frame, ID: cross\n\t\t36 AXWebArea Frame, URL: localhost:61427/frame?cross=1\n\t\t\t37 button Cross frame\n\t38 image Description: Drawing surface, ID: canvas\n\t39 text Canvas untouched\n\t40 container Description: Drag handle, ID: drag\n\t41 text Not dragged\n\t42 container Description: Scrollable panel, ID: scrollbox\n\t\t43 text Panel start\n\t\t44 button Panel end\n\t45 button Show delayed, ID: delayed\n\t46 button (disabled) Disabled action, ID: disabled\n\nThe focused UI element is 15 button Search records",
116
+ "- heading \"Browser Relay benchmark\" [level=1]\n- text: Search\n- textbox \"Search\"\n- text: Owner\n- combobox \"Owner\":\n - option \"All\" [selected]\n - option \"Alice\"\n- checkbox \"Active only\"\n- text: Active only\n- button \"Search records\"\n- status: Ready\n- button \"Add row\"\n- list:\n - listitem: Initial row\n- group \"Draft\":\n - generic: Draft\n - button \"Save\"\n- group \"Published\":\n - generic: Published\n - button \"Save\"\n- text: Password\n- textbox \"Password\"\n- button \"Shadow action\"\n- iframe:\n - button \"Frame action\"\n- iframe [id=\"cross\"]:\n - button \"Cross frame\"\n- paragraph:\n - generic \"Drawing surface\"\n- paragraph: Canvas untouched\n- generic \"Drag handle\"\n- paragraph: Not dragged\n- generic \"Scrollable panel\":\n - generic: Panel start\n - button \"Panel end\"\n- button \"Show delayed\"\n- button \"Disabled action\" [disabled]",
117
+ "- heading \"Browser Relay benchmark\" [level=1]\n- text: Search\n- textbox \"Search\": invoice\n- text: Owner\n- combobox \"Owner\":\n - option \"All\"\n - option \"Alice\" [selected]\n- checkbox \"Active only\" [checked]\n- text: Active only\n- button \"Search records\" [active]\n- status: \"Found: invoice / alice / active\"\n- button \"Add row\"\n- list:\n - listitem: Initial row\n- group \"Draft\":\n - generic: Draft\n - button \"Save\"\n- group \"Published\":\n - generic: Published\n - button \"Save\"\n- text: Password\n- textbox \"Password\"\n- button \"Shadow action\"\n- iframe:\n - button \"Frame action\"\n- iframe [id=\"cross\"]:\n - button \"Cross frame\"\n- paragraph:\n - generic \"Drawing surface\"\n- paragraph: Canvas untouched\n- generic \"Drag handle\"\n- paragraph: Not dragged\n- generic \"Scrollable panel\":\n - generic: Panel start\n - button \"Panel end\"\n- button \"Show delayed\"\n- button \"Disabled action\" [disabled]"
118
+ ],
119
+ "samples": [
120
+ {
121
+ "variant": "ax-single",
122
+ "iteration": 0,
123
+ "invocation": "pair-0",
124
+ "phase": "deterministic-replay",
125
+ "success": true,
126
+ "scriptElapsedMs": 910,
127
+ "toolApiMs": 910,
128
+ "stateBytes": 3287,
129
+ "apiCalls": 9,
130
+ "observations": 5,
131
+ "steps": [
132
+ {
133
+ "operation": "getAXState",
134
+ "elapsedMs": 160,
135
+ "success": true,
136
+ "stateId": 0,
137
+ "stateBytes": 1584
138
+ },
139
+ {
140
+ "operation": "setValue(Search)",
141
+ "elapsedMs": 19,
142
+ "success": true
143
+ },
144
+ {
145
+ "operation": "getAXState",
146
+ "elapsedMs": 172,
147
+ "success": true,
148
+ "stateId": 1,
149
+ "stateBytes": 389
150
+ },
151
+ {
152
+ "operation": "setValue(Owner)",
153
+ "elapsedMs": 23,
154
+ "success": true
155
+ },
156
+ {
157
+ "operation": "getAXState",
158
+ "elapsedMs": 183,
159
+ "success": true,
160
+ "stateId": 2,
161
+ "stateBytes": 506
162
+ },
163
+ {
164
+ "operation": "setValue(Active)",
165
+ "elapsedMs": 5,
166
+ "success": true
167
+ },
168
+ {
169
+ "operation": "getAXState",
170
+ "elapsedMs": 164,
171
+ "success": true,
172
+ "stateId": 3,
173
+ "stateBytes": 428
174
+ },
175
+ {
176
+ "operation": "click(Search records)",
177
+ "elapsedMs": 13,
178
+ "success": true
179
+ },
180
+ {
181
+ "operation": "getAXState",
182
+ "elapsedMs": 171,
183
+ "success": true,
184
+ "stateId": 4,
185
+ "stateBytes": 380
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "variant": "ax-batch",
191
+ "iteration": 0,
192
+ "invocation": "pair-0",
193
+ "phase": "deterministic-replay",
194
+ "success": true,
195
+ "scriptElapsedMs": 413,
196
+ "toolApiMs": 413,
197
+ "stateBytes": 3178,
198
+ "apiCalls": 6,
199
+ "observations": 2,
200
+ "steps": [
201
+ {
202
+ "operation": "getAXState",
203
+ "elapsedMs": 166,
204
+ "success": true,
205
+ "stateId": 0,
206
+ "stateBytes": 1584
207
+ },
208
+ {
209
+ "operation": "setValue(Search)",
210
+ "elapsedMs": 15,
211
+ "success": true
212
+ },
213
+ {
214
+ "operation": "setValue(Owner)",
215
+ "elapsedMs": 6,
216
+ "success": true
217
+ },
218
+ {
219
+ "operation": "setValue(Active)",
220
+ "elapsedMs": 26,
221
+ "success": true
222
+ },
223
+ {
224
+ "operation": "click(Search records)",
225
+ "elapsedMs": 33,
226
+ "success": true
227
+ },
228
+ {
229
+ "operation": "getAXState",
230
+ "elapsedMs": 167,
231
+ "success": true,
232
+ "stateId": 5,
233
+ "stateBytes": 1594
234
+ }
235
+ ]
236
+ },
237
+ {
238
+ "variant": "ax-batch",
239
+ "iteration": 1,
240
+ "invocation": "pair-1",
241
+ "phase": "deterministic-replay",
242
+ "success": true,
243
+ "scriptElapsedMs": 443,
244
+ "toolApiMs": 443,
245
+ "stateBytes": 3178,
246
+ "apiCalls": 6,
247
+ "observations": 2,
248
+ "steps": [
249
+ {
250
+ "operation": "getAXState",
251
+ "elapsedMs": 181,
252
+ "success": true,
253
+ "stateId": 0,
254
+ "stateBytes": 1584
255
+ },
256
+ {
257
+ "operation": "setValue(Search)",
258
+ "elapsedMs": 29,
259
+ "success": true
260
+ },
261
+ {
262
+ "operation": "setValue(Owner)",
263
+ "elapsedMs": 12,
264
+ "success": true
265
+ },
266
+ {
267
+ "operation": "setValue(Active)",
268
+ "elapsedMs": 7,
269
+ "success": true
270
+ },
271
+ {
272
+ "operation": "click(Search records)",
273
+ "elapsedMs": 40,
274
+ "success": true
275
+ },
276
+ {
277
+ "operation": "getAXState",
278
+ "elapsedMs": 174,
279
+ "success": true,
280
+ "stateId": 5,
281
+ "stateBytes": 1594
282
+ }
283
+ ]
284
+ },
285
+ {
286
+ "variant": "ax-single",
287
+ "iteration": 1,
288
+ "invocation": "pair-1",
289
+ "phase": "deterministic-replay",
290
+ "success": true,
291
+ "scriptElapsedMs": 902,
292
+ "toolApiMs": 902,
293
+ "stateBytes": 3287,
294
+ "apiCalls": 9,
295
+ "observations": 5,
296
+ "steps": [
297
+ {
298
+ "operation": "getAXState",
299
+ "elapsedMs": 165,
300
+ "success": true,
301
+ "stateId": 0,
302
+ "stateBytes": 1584
303
+ },
304
+ {
305
+ "operation": "setValue(Search)",
306
+ "elapsedMs": 25,
307
+ "success": true
308
+ },
309
+ {
310
+ "operation": "getAXState",
311
+ "elapsedMs": 200,
312
+ "success": true,
313
+ "stateId": 1,
314
+ "stateBytes": 389
315
+ },
316
+ {
317
+ "operation": "setValue(Owner)",
318
+ "elapsedMs": 8,
319
+ "success": true
320
+ },
321
+ {
322
+ "operation": "getAXState",
323
+ "elapsedMs": 157,
324
+ "success": true,
325
+ "stateId": 2,
326
+ "stateBytes": 506
327
+ },
328
+ {
329
+ "operation": "setValue(Active)",
330
+ "elapsedMs": 7,
331
+ "success": true
332
+ },
333
+ {
334
+ "operation": "getAXState",
335
+ "elapsedMs": 160,
336
+ "success": true,
337
+ "stateId": 3,
338
+ "stateBytes": 428
339
+ },
340
+ {
341
+ "operation": "click(Search records)",
342
+ "elapsedMs": 12,
343
+ "success": true
344
+ },
345
+ {
346
+ "operation": "getAXState",
347
+ "elapsedMs": 168,
348
+ "success": true,
349
+ "stateId": 4,
350
+ "stateBytes": 380
351
+ }
352
+ ]
353
+ },
354
+ {
355
+ "variant": "ax-single",
356
+ "iteration": 2,
357
+ "invocation": "pair-2",
358
+ "phase": "deterministic-replay",
359
+ "success": true,
360
+ "scriptElapsedMs": 915,
361
+ "toolApiMs": 915,
362
+ "stateBytes": 3287,
363
+ "apiCalls": 9,
364
+ "observations": 5,
365
+ "steps": [
366
+ {
367
+ "operation": "getAXState",
368
+ "elapsedMs": 172,
369
+ "success": true,
370
+ "stateId": 0,
371
+ "stateBytes": 1584
372
+ },
373
+ {
374
+ "operation": "setValue(Search)",
375
+ "elapsedMs": 29,
376
+ "success": true
377
+ },
378
+ {
379
+ "operation": "getAXState",
380
+ "elapsedMs": 171,
381
+ "success": true,
382
+ "stateId": 1,
383
+ "stateBytes": 389
384
+ },
385
+ {
386
+ "operation": "setValue(Owner)",
387
+ "elapsedMs": 15,
388
+ "success": true
389
+ },
390
+ {
391
+ "operation": "getAXState",
392
+ "elapsedMs": 163,
393
+ "success": true,
394
+ "stateId": 2,
395
+ "stateBytes": 506
396
+ },
397
+ {
398
+ "operation": "setValue(Active)",
399
+ "elapsedMs": 6,
400
+ "success": true
401
+ },
402
+ {
403
+ "operation": "getAXState",
404
+ "elapsedMs": 163,
405
+ "success": true,
406
+ "stateId": 3,
407
+ "stateBytes": 428
408
+ },
409
+ {
410
+ "operation": "click(Search records)",
411
+ "elapsedMs": 20,
412
+ "success": true
413
+ },
414
+ {
415
+ "operation": "getAXState",
416
+ "elapsedMs": 176,
417
+ "success": true,
418
+ "stateId": 4,
419
+ "stateBytes": 380
420
+ }
421
+ ]
422
+ },
423
+ {
424
+ "variant": "ax-batch",
425
+ "iteration": 2,
426
+ "invocation": "pair-2",
427
+ "phase": "deterministic-replay",
428
+ "success": true,
429
+ "scriptElapsedMs": 411,
430
+ "toolApiMs": 411,
431
+ "stateBytes": 3178,
432
+ "apiCalls": 6,
433
+ "observations": 2,
434
+ "steps": [
435
+ {
436
+ "operation": "getAXState",
437
+ "elapsedMs": 163,
438
+ "success": true,
439
+ "stateId": 0,
440
+ "stateBytes": 1584
441
+ },
442
+ {
443
+ "operation": "setValue(Search)",
444
+ "elapsedMs": 23,
445
+ "success": true
446
+ },
447
+ {
448
+ "operation": "setValue(Owner)",
449
+ "elapsedMs": 16,
450
+ "success": true
451
+ },
452
+ {
453
+ "operation": "setValue(Active)",
454
+ "elapsedMs": 15,
455
+ "success": true
456
+ },
457
+ {
458
+ "operation": "click(Search records)",
459
+ "elapsedMs": 22,
460
+ "success": true
461
+ },
462
+ {
463
+ "operation": "getAXState",
464
+ "elapsedMs": 172,
465
+ "success": true,
466
+ "stateId": 5,
467
+ "stateBytes": 1594
468
+ }
469
+ ]
470
+ },
471
+ {
472
+ "variant": "ax-batch",
473
+ "iteration": 3,
474
+ "invocation": "pair-3",
475
+ "phase": "deterministic-replay",
476
+ "success": true,
477
+ "scriptElapsedMs": 441,
478
+ "toolApiMs": 441,
479
+ "stateBytes": 3178,
480
+ "apiCalls": 6,
481
+ "observations": 2,
482
+ "steps": [
483
+ {
484
+ "operation": "getAXState",
485
+ "elapsedMs": 175,
486
+ "success": true,
487
+ "stateId": 0,
488
+ "stateBytes": 1584
489
+ },
490
+ {
491
+ "operation": "setValue(Search)",
492
+ "elapsedMs": 27,
493
+ "success": true
494
+ },
495
+ {
496
+ "operation": "setValue(Owner)",
497
+ "elapsedMs": 14,
498
+ "success": true
499
+ },
500
+ {
501
+ "operation": "setValue(Active)",
502
+ "elapsedMs": 7,
503
+ "success": true
504
+ },
505
+ {
506
+ "operation": "click(Search records)",
507
+ "elapsedMs": 46,
508
+ "success": true
509
+ },
510
+ {
511
+ "operation": "getAXState",
512
+ "elapsedMs": 172,
513
+ "success": true,
514
+ "stateId": 5,
515
+ "stateBytes": 1594
516
+ }
517
+ ]
518
+ },
519
+ {
520
+ "variant": "ax-single",
521
+ "iteration": 3,
522
+ "invocation": "pair-3",
523
+ "phase": "deterministic-replay",
524
+ "success": true,
525
+ "scriptElapsedMs": 900,
526
+ "toolApiMs": 899,
527
+ "stateBytes": 3287,
528
+ "apiCalls": 9,
529
+ "observations": 5,
530
+ "steps": [
531
+ {
532
+ "operation": "getAXState",
533
+ "elapsedMs": 166,
534
+ "success": true,
535
+ "stateId": 0,
536
+ "stateBytes": 1584
537
+ },
538
+ {
539
+ "operation": "setValue(Search)",
540
+ "elapsedMs": 24,
541
+ "success": true
542
+ },
543
+ {
544
+ "operation": "getAXState",
545
+ "elapsedMs": 166,
546
+ "success": true,
547
+ "stateId": 1,
548
+ "stateBytes": 389
549
+ },
550
+ {
551
+ "operation": "setValue(Owner)",
552
+ "elapsedMs": 29,
553
+ "success": true
554
+ },
555
+ {
556
+ "operation": "getAXState",
557
+ "elapsedMs": 164,
558
+ "success": true,
559
+ "stateId": 2,
560
+ "stateBytes": 506
561
+ },
562
+ {
563
+ "operation": "setValue(Active)",
564
+ "elapsedMs": 8,
565
+ "success": true
566
+ },
567
+ {
568
+ "operation": "getAXState",
569
+ "elapsedMs": 162,
570
+ "success": true,
571
+ "stateId": 3,
572
+ "stateBytes": 428
573
+ },
574
+ {
575
+ "operation": "click(Search records)",
576
+ "elapsedMs": 14,
577
+ "success": true
578
+ },
579
+ {
580
+ "operation": "getAXState",
581
+ "elapsedMs": 166,
582
+ "success": true,
583
+ "stateId": 4,
584
+ "stateBytes": 380
585
+ }
586
+ ]
587
+ },
588
+ {
589
+ "variant": "ax-single",
590
+ "iteration": 4,
591
+ "invocation": "pair-4",
592
+ "phase": "deterministic-replay",
593
+ "success": true,
594
+ "scriptElapsedMs": 860,
595
+ "toolApiMs": 860,
596
+ "stateBytes": 3287,
597
+ "apiCalls": 9,
598
+ "observations": 5,
599
+ "steps": [
600
+ {
601
+ "operation": "getAXState",
602
+ "elapsedMs": 167,
603
+ "success": true,
604
+ "stateId": 0,
605
+ "stateBytes": 1584
606
+ },
607
+ {
608
+ "operation": "setValue(Search)",
609
+ "elapsedMs": 20,
610
+ "success": true
611
+ },
612
+ {
613
+ "operation": "getAXState",
614
+ "elapsedMs": 163,
615
+ "success": true,
616
+ "stateId": 1,
617
+ "stateBytes": 389
618
+ },
619
+ {
620
+ "operation": "setValue(Owner)",
621
+ "elapsedMs": 7,
622
+ "success": true
623
+ },
624
+ {
625
+ "operation": "getAXState",
626
+ "elapsedMs": 160,
627
+ "success": true,
628
+ "stateId": 2,
629
+ "stateBytes": 506
630
+ },
631
+ {
632
+ "operation": "setValue(Active)",
633
+ "elapsedMs": 5,
634
+ "success": true
635
+ },
636
+ {
637
+ "operation": "getAXState",
638
+ "elapsedMs": 161,
639
+ "success": true,
640
+ "stateId": 3,
641
+ "stateBytes": 428
642
+ },
643
+ {
644
+ "operation": "click(Search records)",
645
+ "elapsedMs": 13,
646
+ "success": true
647
+ },
648
+ {
649
+ "operation": "getAXState",
650
+ "elapsedMs": 164,
651
+ "success": true,
652
+ "stateId": 4,
653
+ "stateBytes": 380
654
+ }
655
+ ]
656
+ },
657
+ {
658
+ "variant": "ax-batch",
659
+ "iteration": 4,
660
+ "invocation": "pair-4",
661
+ "phase": "deterministic-replay",
662
+ "success": true,
663
+ "scriptElapsedMs": 436,
664
+ "toolApiMs": 436,
665
+ "stateBytes": 3178,
666
+ "apiCalls": 6,
667
+ "observations": 2,
668
+ "steps": [
669
+ {
670
+ "operation": "getAXState",
671
+ "elapsedMs": 162,
672
+ "success": true,
673
+ "stateId": 0,
674
+ "stateBytes": 1584
675
+ },
676
+ {
677
+ "operation": "setValue(Search)",
678
+ "elapsedMs": 27,
679
+ "success": true
680
+ },
681
+ {
682
+ "operation": "setValue(Owner)",
683
+ "elapsedMs": 18,
684
+ "success": true
685
+ },
686
+ {
687
+ "operation": "setValue(Active)",
688
+ "elapsedMs": 16,
689
+ "success": true
690
+ },
691
+ {
692
+ "operation": "click(Search records)",
693
+ "elapsedMs": 35,
694
+ "success": true
695
+ },
696
+ {
697
+ "operation": "getAXState",
698
+ "elapsedMs": 178,
699
+ "success": true,
700
+ "stateId": 5,
701
+ "stateBytes": 1594
702
+ }
703
+ ]
704
+ },
705
+ {
706
+ "variant": "native-playwright",
707
+ "iteration": 0,
708
+ "invocation": "pw-0",
709
+ "phase": "deterministic-replay",
710
+ "success": true,
711
+ "scriptElapsedMs": 816,
712
+ "toolApiMs": 816,
713
+ "stateBytes": 1706,
714
+ "apiCalls": 7,
715
+ "observations": 2,
716
+ "steps": [
717
+ {
718
+ "operation": "domSnapshot",
719
+ "elapsedMs": 94,
720
+ "success": true,
721
+ "stateId": 6,
722
+ "stateBytes": 825
723
+ },
724
+ {
725
+ "operation": "fill(Search)",
726
+ "elapsedMs": 35,
727
+ "success": true
728
+ },
729
+ {
730
+ "operation": "selectOption(Owner)",
731
+ "elapsedMs": 15,
732
+ "success": true
733
+ },
734
+ {
735
+ "operation": "check(Active)",
736
+ "elapsedMs": 280,
737
+ "success": true
738
+ },
739
+ {
740
+ "operation": "click(Search records)",
741
+ "elapsedMs": 272,
742
+ "success": true
743
+ },
744
+ {
745
+ "operation": "waitFor(result)",
746
+ "elapsedMs": 110,
747
+ "success": true
748
+ },
749
+ {
750
+ "operation": "domSnapshot",
751
+ "elapsedMs": 10,
752
+ "success": true,
753
+ "stateId": 7,
754
+ "stateBytes": 881
755
+ }
756
+ ]
757
+ },
758
+ {
759
+ "variant": "native-playwright",
760
+ "iteration": 1,
761
+ "invocation": "pw-remaining",
762
+ "phase": "deterministic-replay",
763
+ "success": true,
764
+ "scriptElapsedMs": 813,
765
+ "toolApiMs": 813,
766
+ "stateBytes": 1706,
767
+ "apiCalls": 7,
768
+ "observations": 2,
769
+ "steps": [
770
+ {
771
+ "operation": "domSnapshot",
772
+ "elapsedMs": 84,
773
+ "success": true,
774
+ "stateId": 6,
775
+ "stateBytes": 825
776
+ },
777
+ {
778
+ "operation": "fill(Search)",
779
+ "elapsedMs": 37,
780
+ "success": true
781
+ },
782
+ {
783
+ "operation": "selectOption(Owner)",
784
+ "elapsedMs": 7,
785
+ "success": true
786
+ },
787
+ {
788
+ "operation": "check(Active)",
789
+ "elapsedMs": 292,
790
+ "success": true
791
+ },
792
+ {
793
+ "operation": "click(Search records)",
794
+ "elapsedMs": 273,
795
+ "success": true
796
+ },
797
+ {
798
+ "operation": "waitFor(result)",
799
+ "elapsedMs": 109,
800
+ "success": true
801
+ },
802
+ {
803
+ "operation": "domSnapshot",
804
+ "elapsedMs": 11,
805
+ "success": true,
806
+ "stateId": 7,
807
+ "stateBytes": 881
808
+ }
809
+ ]
810
+ },
811
+ {
812
+ "variant": "native-playwright",
813
+ "iteration": 2,
814
+ "invocation": "pw-remaining",
815
+ "phase": "deterministic-replay",
816
+ "success": true,
817
+ "scriptElapsedMs": 780,
818
+ "toolApiMs": 780,
819
+ "stateBytes": 1706,
820
+ "apiCalls": 7,
821
+ "observations": 2,
822
+ "steps": [
823
+ {
824
+ "operation": "domSnapshot",
825
+ "elapsedMs": 83,
826
+ "success": true,
827
+ "stateId": 6,
828
+ "stateBytes": 825
829
+ },
830
+ {
831
+ "operation": "fill(Search)",
832
+ "elapsedMs": 8,
833
+ "success": true
834
+ },
835
+ {
836
+ "operation": "selectOption(Owner)",
837
+ "elapsedMs": 7,
838
+ "success": true
839
+ },
840
+ {
841
+ "operation": "check(Active)",
842
+ "elapsedMs": 276,
843
+ "success": true
844
+ },
845
+ {
846
+ "operation": "click(Search records)",
847
+ "elapsedMs": 285,
848
+ "success": true
849
+ },
850
+ {
851
+ "operation": "waitFor(result)",
852
+ "elapsedMs": 110,
853
+ "success": true
854
+ },
855
+ {
856
+ "operation": "domSnapshot",
857
+ "elapsedMs": 11,
858
+ "success": true,
859
+ "stateId": 7,
860
+ "stateBytes": 881
861
+ }
862
+ ]
863
+ },
864
+ {
865
+ "variant": "native-playwright",
866
+ "iteration": 3,
867
+ "invocation": "pw-remaining",
868
+ "phase": "deterministic-replay",
869
+ "success": true,
870
+ "scriptElapsedMs": 788,
871
+ "toolApiMs": 788,
872
+ "stateBytes": 1706,
873
+ "apiCalls": 7,
874
+ "observations": 2,
875
+ "steps": [
876
+ {
877
+ "operation": "domSnapshot",
878
+ "elapsedMs": 80,
879
+ "success": true,
880
+ "stateId": 6,
881
+ "stateBytes": 825
882
+ },
883
+ {
884
+ "operation": "fill(Search)",
885
+ "elapsedMs": 19,
886
+ "success": true
887
+ },
888
+ {
889
+ "operation": "selectOption(Owner)",
890
+ "elapsedMs": 13,
891
+ "success": true
892
+ },
893
+ {
894
+ "operation": "check(Active)",
895
+ "elapsedMs": 279,
896
+ "success": true
897
+ },
898
+ {
899
+ "operation": "click(Search records)",
900
+ "elapsedMs": 276,
901
+ "success": true
902
+ },
903
+ {
904
+ "operation": "waitFor(result)",
905
+ "elapsedMs": 108,
906
+ "success": true
907
+ },
908
+ {
909
+ "operation": "domSnapshot",
910
+ "elapsedMs": 13,
911
+ "success": true,
912
+ "stateId": 7,
913
+ "stateBytes": 881
914
+ }
915
+ ]
916
+ },
917
+ {
918
+ "variant": "native-playwright",
919
+ "iteration": 4,
920
+ "invocation": "pw-remaining",
921
+ "phase": "deterministic-replay",
922
+ "success": true,
923
+ "scriptElapsedMs": 763,
924
+ "toolApiMs": 763,
925
+ "stateBytes": 1706,
926
+ "apiCalls": 7,
927
+ "observations": 2,
928
+ "steps": [
929
+ {
930
+ "operation": "domSnapshot",
931
+ "elapsedMs": 80,
932
+ "success": true,
933
+ "stateId": 6,
934
+ "stateBytes": 825
935
+ },
936
+ {
937
+ "operation": "fill(Search)",
938
+ "elapsedMs": 8,
939
+ "success": true
940
+ },
941
+ {
942
+ "operation": "selectOption(Owner)",
943
+ "elapsedMs": 7,
944
+ "success": true
945
+ },
946
+ {
947
+ "operation": "check(Active)",
948
+ "elapsedMs": 276,
949
+ "success": true
950
+ },
951
+ {
952
+ "operation": "click(Search records)",
953
+ "elapsedMs": 274,
954
+ "success": true
955
+ },
956
+ {
957
+ "operation": "waitFor(result)",
958
+ "elapsedMs": 109,
959
+ "success": true
960
+ },
961
+ {
962
+ "operation": "domSnapshot",
963
+ "elapsedMs": 9,
964
+ "success": true,
965
+ "stateId": 7,
966
+ "stateBytes": 881
967
+ }
968
+ ]
969
+ }
970
+ ],
971
+ "capabilityChecks": {
972
+ "shadowDom": true,
973
+ "sameOriginFrame": true,
974
+ "crossOriginFrame": true,
975
+ "completedFrameNodeIds": [
976
+ 34,
977
+ 37
978
+ ],
979
+ "frameObservation": "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\nThe following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.\n~\t31 button Shadow done\n~\t\t\t34 button Frame done\n~\t\t\t37 button Frame done\nThe focused UI element is 37 button Frame done",
980
+ "screenshotCoordinateClick": {
981
+ "success": true,
982
+ "point": [
983
+ 174,
984
+ 575
985
+ ],
986
+ "expectedText": "Canvas done"
987
+ },
988
+ "drag": {
989
+ "success": true,
990
+ "from": [
991
+ 54,
992
+ 694
993
+ ],
994
+ "to": [
995
+ 175,
996
+ 694
997
+ ],
998
+ "expectedText": "Drag done"
999
+ },
1000
+ "visualObservation": "Browser tab: 395359752, Title: \"Browser Relay benchmark\", URL: \"http://127.0.0.1:61427/\".\nThe following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.\nRemoved element IDs: 39, 41\n+\t47 text Canvas done\n+\t48 text Drag done\nThe focused UI element is 1 AXWebArea Browser Relay benchmark, URL: 127.0.0.1:61427/",
1001
+ "scope": "Untimed additional capability checks; coordinates derived from a fresh screenshot after the frame interactions."
1002
+ }
1003
+ }