dsh-inner-browser-use 0.45.0 → 0.47.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.
@@ -0,0 +1,523 @@
1
+ {
2
+ "generated_at": "2026-11-01T17:15:17.022Z",
3
+ "machine": {
4
+ "arch": "arm64",
5
+ "os": "macOS 27.2",
6
+ "os_build": "26B123",
7
+ "node": "v24.16.0",
8
+ "npm": "11.13.0",
9
+ "chrome": "156.0.8078.80 (Google Chrome.app, arm64)",
10
+ "note": "No other browser was running during the measurements (see method.failure_points)."
11
+ },
12
+ "competitors": {
13
+ "playwright_mcp": {
14
+ "package": "@playwright/mcp",
15
+ "package_version": "0.0.84",
16
+ "launch_command": "npx -y @playwright/mcp@latest --headless --isolated --config /tmp/compbench/pw-config.json",
17
+ "mcp_server_info": {
18
+ "name": "Playwright",
19
+ "version": "1.65.0-alpha-2026-10-30"
20
+ },
21
+ "cold_start_ms": {
22
+ "runs_ms": [
23
+ 2887,
24
+ 2755,
25
+ 2464
26
+ ],
27
+ "min": 2464,
28
+ "median": 2755,
29
+ "max": 2887,
30
+ "definition": "wall clock from spawn(npx) to the navigate tool call returning the page URL, npx package cache warm (already downloaded). For chrome-devtools-mcp this includes the mandatory list_pages call that the tool schema requires to obtain a pageId; that extra round trip is inherent to its API."
31
+ },
32
+ "first_npx_ms": 3439,
33
+ "first_npx_ms_method": "wall clock of the very first `npx -y <pkg>@latest --help` on a cold npm cache (download + install + start); later runs reuse the npx cache",
34
+ "idle_rss_mb": {
35
+ "total_mb": 1414,
36
+ "chrome_tree_mb": 1290.1,
37
+ "node_npx_mb": 123.9,
38
+ "chrome_process_count": 8,
39
+ "total_process_count": 10,
40
+ "chrome_processes": [
41
+ {
42
+ "pid": 27560,
43
+ "rss_mb": 581.3
44
+ },
45
+ {
46
+ "pid": 29419,
47
+ "rss_mb": 134.8
48
+ },
49
+ {
50
+ "pid": 27575,
51
+ "rss_mb": 125.2
52
+ },
53
+ {
54
+ "pid": 27572,
55
+ "rss_mb": 121.7
56
+ },
57
+ {
58
+ "pid": 27566,
59
+ "rss_mb": 101.5
60
+ },
61
+ {
62
+ "pid": 27567,
63
+ "rss_mb": 82
64
+ },
65
+ {
66
+ "pid": 27574,
67
+ "rss_mb": 78.8
68
+ },
69
+ {
70
+ "pid": 27568,
71
+ "rss_mb": 65.4
72
+ }
73
+ ],
74
+ "method": "sum of `ps -Ao rss=` (KB) over every descendant of the spawned npx pid, 180 s after navigate returned; chrome_tree_mb restricts that sum to the subtree rooted at the launched Google Chrome binary. macOS RSS counts private + shared mapped pages per process, so summing over Chrome helpers (each mapping the same Chrome Framework) overstates true memory use; the per-process list is included so the double counting is visible. No dedup is applied because the task asks for the RSS sum."
75
+ },
76
+ "restart_ms": 5133,
77
+ "tab_switch_ms": {
78
+ "total_ms": 3416,
79
+ "open_second_page_ms": 3392,
80
+ "switch_back_and_read_ms": 24,
81
+ "second_page_url": "https://en.wikipedia.org/wiki/Main_Page",
82
+ "second_page_loaded": true,
83
+ "read_ok": true,
84
+ "control_open_second_page_same_tool_example_com_ms": 65
85
+ },
86
+ "idle_cpu_pct": {
87
+ "avg_pct_all_windows": 38.07,
88
+ "steady_state_avg_pct_after_60s": 40.38,
89
+ "peak_window_pct": 62.87,
90
+ "windows": [
91
+ {
92
+ "window": "0-30s after navigate",
93
+ "avg_cpu_pct_of_one_core": 6.37,
94
+ "pids": 9,
95
+ "top": [
96
+ {
97
+ "pid": 33217,
98
+ "sec": 1.77
99
+ },
100
+ {
101
+ "pid": 33223,
102
+ "sec": 0.04
103
+ },
104
+ {
105
+ "pid": 33229,
106
+ "sec": 0.04
107
+ }
108
+ ]
109
+ },
110
+ {
111
+ "window": "30-60s after navigate",
112
+ "avg_cpu_pct_of_one_core": 62.87,
113
+ "pids": 9,
114
+ "top": [
115
+ {
116
+ "pid": 33217,
117
+ "sec": 18.85
118
+ },
119
+ {
120
+ "pid": 33224,
121
+ "sec": 0.01
122
+ }
123
+ ]
124
+ },
125
+ {
126
+ "window": "60-90s after navigate",
127
+ "avg_cpu_pct_of_one_core": 7.13,
128
+ "pids": 9,
129
+ "top": [
130
+ {
131
+ "pid": 33217,
132
+ "sec": 2.09
133
+ },
134
+ {
135
+ "pid": 33216,
136
+ "sec": 0.01
137
+ },
138
+ {
139
+ "pid": 33223,
140
+ "sec": 0.01
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "window": "90-120s after navigate",
146
+ "avg_cpu_pct_of_one_core": 52.6,
147
+ "pids": 9,
148
+ "top": [
149
+ {
150
+ "pid": 33217,
151
+ "sec": 15.67
152
+ },
153
+ {
154
+ "pid": 33199,
155
+ "sec": 0.06
156
+ },
157
+ {
158
+ "pid": 33216,
159
+ "sec": 0.05
160
+ }
161
+ ]
162
+ },
163
+ {
164
+ "window": "120-150s after navigate",
165
+ "avg_cpu_pct_of_one_core": 61.4,
166
+ "pids": 9,
167
+ "top": [
168
+ {
169
+ "pid": 33217,
170
+ "sec": 18.42
171
+ }
172
+ ]
173
+ }
174
+ ],
175
+ "cross_check_bench_run_avg_pct": 35.75,
176
+ "cross_check_top_instantaneous_pct": [
177
+ {
178
+ "window": "0-15s",
179
+ "delta_method_pct": 28.7,
180
+ "top_l2_pct": 0
181
+ },
182
+ {
183
+ "window": "15-30s",
184
+ "delta_method_pct": 59.6,
185
+ "top_l2_pct": 49.6
186
+ },
187
+ {
188
+ "window": "30-45s",
189
+ "delta_method_pct": 26.5,
190
+ "top_l2_pct": 45.1
191
+ },
192
+ {
193
+ "window": "45-60s",
194
+ "delta_method_pct": 0.2,
195
+ "top_l2_pct": 0
196
+ },
197
+ {
198
+ "window": "60-75s",
199
+ "delta_method_pct": 64,
200
+ "top_l2_pct": 61.4
201
+ },
202
+ {
203
+ "window": "75-90s",
204
+ "delta_method_pct": 50.6,
205
+ "top_l2_pct": 48.3
206
+ },
207
+ {
208
+ "window": "90-105s",
209
+ "delta_method_pct": 29.7,
210
+ "top_l2_pct": 0
211
+ },
212
+ {
213
+ "window": "105-120s",
214
+ "delta_method_pct": 86.7,
215
+ "top_l2_pct": 53.4
216
+ }
217
+ ],
218
+ "method_controls": {
219
+ "sleep_process_cpu_seconds": 0,
220
+ "note": "The same ps-time delta applied to a plain `sleep 8` yields 0.00 CPU s, and top -l 2 (instantaneous per-process %CPU) on the Chrome main process tracks the delta method within sampling noise, so the numbers are CPU actually burned by the tree and not an accounting artifact."
221
+ },
222
+ "error": null,
223
+ "method": "Instantaneous CPU of the benchmark process tree, not the ps %cpu column. Every 30 s the cumulative CPU seconds of all tree pids are read from `ps -Ao pid=,time=`, and the delta divided by the 30 s wall window gives the average fraction of one core used by the whole tree (npx + node + all Chrome processes). Each window starts where the previous ended, from navigate +0 s; the early windows include Chrome post-load work and the ones after 60 s are the settled state. The ps %cpu column is a lifetime average and inflates for short-lived helpers, so it is only kept for reference."
224
+ },
225
+ "auto_release": {
226
+ "has_mechanism": true,
227
+ "parameter": "--idle-timeout <ms> | env PLAYWRIGHT_MCP_IDLE_TIMEOUT | config browser.idle",
228
+ "default_behavior": "one hour for headless browsers it launched, no timeout for headed or attached ones, 0 disables; the next tool call relaunches the browser",
229
+ "evidence": [
230
+ "https://github.com/microsoft/playwright-mcp/blob/main/README.md (README.md:431 in @playwright/mcp@0.0.84): \"--idle-timeout <timeout> | close the browser after this many milliseconds without a completed tool call, the next tool call relaunches it.\"",
231
+ "config.d.ts:240 in @playwright/mcp@0.0.84: \"idle?: number;\" with the comment \"Close the browser after this many milliseconds without a tool call, and relaunch it on the next one.\""
232
+ ],
233
+ "empirical": {
234
+ "flag_used": "--idle-timeout=6000",
235
+ "browser_auto_closed": true,
236
+ "details": "navigate, then 14 s without any tool call: chrome roots alive = 0, MCP process alive = true"
237
+ }
238
+ },
239
+ "notes": [
240
+ "cold_start run1 2887ms",
241
+ "cpu interval 1: 65.11% (ps %cpu sum for reference 63.5%) pids=9",
242
+ "cpu interval 2: 62.38% (ps %cpu sum for reference 63.7%) pids=9",
243
+ "cpu interval 3: 57.41% (ps %cpu sum for reference 13.1%) pids=9",
244
+ "cpu interval 4: 0.4% (ps %cpu sum for reference 0%) pids=9",
245
+ "cpu interval 5: 0.2% (ps %cpu sum for reference 0%) pids=9",
246
+ "cpu interval 6: 29.02% (ps %cpu sum for reference 64.3%) pids=9",
247
+ "idle rss total=1414MB chrome=1290.1MB node=123.9MB procs=10",
248
+ "tab_switch total 3416ms (open2 3392, back+read 24)",
249
+ "control second tab to example.com 65ms",
250
+ "kill tree pids 11, chrome roots 1, survivors after kill 1",
251
+ "restart_ms 5133ms (kill -> navigate return), cold run2 2755ms",
252
+ "cold_start run3 2464ms"
253
+ ],
254
+ "error": null
255
+ },
256
+ "chrome_devtools_mcp": {
257
+ "package": "chrome-devtools-mcp",
258
+ "package_version": "1.12.0",
259
+ "launch_command": "npx -y chrome-devtools-mcp@latest --headless --chromeArg=--use-mock-keychain",
260
+ "mcp_server_info": {
261
+ "name": "chrome_devtools",
262
+ "title": "Chrome DevTools MCP server",
263
+ "version": "1.12.0"
264
+ },
265
+ "cold_start_ms": {
266
+ "runs_ms": [
267
+ 1596,
268
+ 2185,
269
+ 2337
270
+ ],
271
+ "min": 1596,
272
+ "median": 2185,
273
+ "max": 2337,
274
+ "definition": "wall clock from spawn(npx) to the navigate tool call returning the page URL, npx package cache warm (already downloaded). For chrome-devtools-mcp this includes the mandatory list_pages call that the tool schema requires to obtain a pageId; that extra round trip is inherent to its API."
275
+ },
276
+ "first_npx_ms": 17891,
277
+ "first_npx_ms_method": "wall clock of the very first `npx -y <pkg>@latest --help` on a cold npm cache (download + install + start); later runs reuse the npx cache",
278
+ "idle_rss_mb": {
279
+ "total_mb": 1279.8,
280
+ "chrome_tree_mb": 1108.8,
281
+ "node_npx_mb": 171,
282
+ "chrome_process_count": 7,
283
+ "total_process_count": 10,
284
+ "chrome_processes": [
285
+ {
286
+ "pid": 29867,
287
+ "rss_mb": 512.5
288
+ },
289
+ {
290
+ "pid": 30891,
291
+ "rss_mb": 132.5
292
+ },
293
+ {
294
+ "pid": 29877,
295
+ "rss_mb": 128
296
+ },
297
+ {
298
+ "pid": 29871,
299
+ "rss_mb": 102
300
+ },
301
+ {
302
+ "pid": 29872,
303
+ "rss_mb": 83.1
304
+ },
305
+ {
306
+ "pid": 29876,
307
+ "rss_mb": 79.9
308
+ },
309
+ {
310
+ "pid": 29873,
311
+ "rss_mb": 64.2
312
+ }
313
+ ],
314
+ "method": "sum of `ps -Ao rss=` (KB) over every descendant of the spawned npx pid, 180 s after navigate returned; chrome_tree_mb restricts that sum to the subtree rooted at the launched Google Chrome binary. macOS RSS counts private + shared mapped pages per process, so summing over Chrome helpers (each mapping the same Chrome Framework) overstates true memory use; the per-process list is included so the double counting is visible. No dedup is applied because the task asks for the RSS sum."
315
+ },
316
+ "restart_ms": 4585,
317
+ "tab_switch_ms": {
318
+ "total_ms": 2918,
319
+ "open_second_page_ms": 2903,
320
+ "switch_back_and_read_ms": 15,
321
+ "second_page_url": "https://en.wikipedia.org/wiki/Main_Page",
322
+ "second_page_loaded": true,
323
+ "read_ok": true,
324
+ "control_open_second_page_same_tool_example_com_ms": 151
325
+ },
326
+ "idle_cpu_pct": {
327
+ "avg_pct_all_windows": 36.29,
328
+ "steady_state_avg_pct_after_60s": 38.87,
329
+ "peak_window_pct": 60.27,
330
+ "windows": [
331
+ {
332
+ "window": "0-30s after navigate",
333
+ "avg_cpu_pct_of_one_core": 4.57,
334
+ "pids": 11,
335
+ "top": [
336
+ {
337
+ "pid": 34503,
338
+ "sec": 1.26
339
+ },
340
+ {
341
+ "pid": 34510,
342
+ "sec": 0.03
343
+ },
344
+ {
345
+ "pid": 34509,
346
+ "sec": 0.02
347
+ }
348
+ ]
349
+ },
350
+ {
351
+ "window": "30-60s after navigate",
352
+ "avg_cpu_pct_of_one_core": 60.27,
353
+ "pids": 10,
354
+ "top": [
355
+ {
356
+ "pid": 34503,
357
+ "sec": 18.07
358
+ },
359
+ {
360
+ "pid": 34510,
361
+ "sec": 0.01
362
+ }
363
+ ]
364
+ },
365
+ {
366
+ "window": "60-90s after navigate",
367
+ "avg_cpu_pct_of_one_core": 3.77,
368
+ "pids": 9,
369
+ "top": [
370
+ {
371
+ "pid": 34503,
372
+ "sec": 1.1
373
+ },
374
+ {
375
+ "pid": 34509,
376
+ "sec": 0.01
377
+ },
378
+ {
379
+ "pid": 34510,
380
+ "sec": 0.01
381
+ }
382
+ ]
383
+ },
384
+ {
385
+ "window": "90-120s after navigate",
386
+ "avg_cpu_pct_of_one_core": 56.87,
387
+ "pids": 9,
388
+ "top": [
389
+ {
390
+ "pid": 34503,
391
+ "sec": 16.93
392
+ },
393
+ {
394
+ "pid": 34466,
395
+ "sec": 0.06
396
+ },
397
+ {
398
+ "pid": 34500,
399
+ "sec": 0.06
400
+ }
401
+ ]
402
+ },
403
+ {
404
+ "window": "120-150s after navigate",
405
+ "avg_cpu_pct_of_one_core": 55.97,
406
+ "pids": 9,
407
+ "top": [
408
+ {
409
+ "pid": 34503,
410
+ "sec": 16.78
411
+ },
412
+ {
413
+ "pid": 34512,
414
+ "sec": 0.01
415
+ }
416
+ ]
417
+ }
418
+ ],
419
+ "cross_check_bench_run_avg_pct": 33.55,
420
+ "cross_check_top_instantaneous_pct": [
421
+ {
422
+ "window": "0-15s",
423
+ "delta_method_pct": 28.7,
424
+ "top_l2_pct": 0
425
+ },
426
+ {
427
+ "window": "15-30s",
428
+ "delta_method_pct": 59.6,
429
+ "top_l2_pct": 49.6
430
+ },
431
+ {
432
+ "window": "30-45s",
433
+ "delta_method_pct": 26.5,
434
+ "top_l2_pct": 45.1
435
+ },
436
+ {
437
+ "window": "45-60s",
438
+ "delta_method_pct": 0.2,
439
+ "top_l2_pct": 0
440
+ },
441
+ {
442
+ "window": "60-75s",
443
+ "delta_method_pct": 64,
444
+ "top_l2_pct": 61.4
445
+ },
446
+ {
447
+ "window": "75-90s",
448
+ "delta_method_pct": 50.6,
449
+ "top_l2_pct": 48.3
450
+ },
451
+ {
452
+ "window": "90-105s",
453
+ "delta_method_pct": 29.7,
454
+ "top_l2_pct": 0
455
+ },
456
+ {
457
+ "window": "105-120s",
458
+ "delta_method_pct": 86.7,
459
+ "top_l2_pct": 53.4
460
+ }
461
+ ],
462
+ "method_controls": {
463
+ "sleep_process_cpu_seconds": 0,
464
+ "note": "The same ps-time delta applied to a plain `sleep 8` yields 0.00 CPU s, and top -l 2 (instantaneous per-process %CPU) on the Chrome main process tracks the delta method within sampling noise, so the numbers are CPU actually burned by the tree and not an accounting artifact."
465
+ },
466
+ "error": null,
467
+ "method": "Instantaneous CPU of the benchmark process tree, not the ps %cpu column. Every 30 s the cumulative CPU seconds of all tree pids are read from `ps -Ao pid=,time=`, and the delta divided by the 30 s wall window gives the average fraction of one core used by the whole tree (npx + node + all Chrome processes). Each window starts where the previous ended, from navigate +0 s; the early windows include Chrome post-load work and the ones after 60 s are the settled state. The ps %cpu column is a lifetime average and inflates for short-lived helpers, so it is only kept for reference."
468
+ },
469
+ "auto_release": {
470
+ "has_mechanism": false,
471
+ "parameter": null,
472
+ "default_behavior": "browser starts on the first tool call that needs it and stays alive until the MCP client disconnects the CDP session or the server process exits; no idle timer",
473
+ "evidence": [
474
+ "https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/README.md (README.md:101 in chrome-devtools-mcp@1.12.0): \"The MCP server will start the browser automatically once the MCP client uses a tool that requires a running browser instance.\"",
475
+ "`chrome-devtools-mcp --help` (v1.12.0) lists no idle/close/timeout flag; the only flag mentioning cleanup is --isolated (\"temporary user-data-dir that is automatically cleaned up after the browser is closed\").",
476
+ "build/src/BrowserManager.js:476 in chrome-devtools-mcp@1.12.0 defines #closeBrowser(), reached from the shutdown path (line 184) and from the disconnected handler (#evictIfCurrent, line 442); nothing schedules it on idleness."
477
+ ],
478
+ "empirical": {
479
+ "flag_used": null,
480
+ "browser_auto_closed": null,
481
+ "details": "no flag exists to shorten a timeout, so this side was established from --help and source only, not by waiting an hour."
482
+ }
483
+ },
484
+ "notes": [
485
+ "cold_start run1 1596ms",
486
+ "cpu interval 1: 63.49% (ps %cpu sum for reference 62.8%) pids=10",
487
+ "cpu interval 2: 59.24% (ps %cpu sum for reference 63.4%) pids=10",
488
+ "cpu interval 3: 56.53% (ps %cpu sum for reference 50%) pids=10",
489
+ "cpu interval 4: 21.45% (ps %cpu sum for reference 0.4%) pids=10",
490
+ "cpu interval 5: 0.3% (ps %cpu sum for reference 0%) pids=9",
491
+ "cpu interval 6: 0.3% (ps %cpu sum for reference 0%) pids=9",
492
+ "idle rss total=1279.8MB chrome=1108.8MB node=171MB procs=10",
493
+ "tab_switch total 2918ms (open2 2903, back+read 15)",
494
+ "control second tab to example.com 151ms",
495
+ "kill tree pids 12, chrome roots 1, survivors after kill 1",
496
+ "restart_ms 4585ms (kill -> navigate return), cold run2 2185ms",
497
+ "cold_start run3 2337ms"
498
+ ],
499
+ "error": null
500
+ }
501
+ },
502
+ "method": {
503
+ "overview": "macOS arm64, one competitor at a time, no other Chrome running. Each competitor was driven over MCP stdio (newline-delimited JSON-RPC: initialize with protocolVersion 2024-11-05, notifications/initialized, then tools/call) by a ~200-line Node client with no dependencies (/tmp/compbench/mcp_client.mjs). Both were launched exactly the way a user would launch them with npx, headless, plus --use-mock-keychain so macOS does not open a keychain dialog. The navigated page was always https://example.com.",
504
+ "steps": {
505
+ "first_npx_ms": "Before any measurement, `time npx -y <pkg>@latest --help` was run once for each package against a cold npm cache; that number is first_npx_ms (download + install + start). All later runs reused the npx cache, so cold_start_ms excludes the download.",
506
+ "package_version": "The version npx resolves is what `npm view <pkg> version` reports at measurement time: @playwright/mcp 0.0.84, chrome-devtools-mcp 1.12.0. The MCP serverInfo is recorded alongside it.",
507
+ "cold_start_ms": "Timer starts immediately before spawn(npx) and stops when the navigate tool call returns. Three repetitions per competitor, each from a freshly spawned server; min/median/max over the three. For chrome-devtools-mcp the tool schema requires a pageId, so the flow includes one list_pages round trip before navigate_page.",
508
+ "idle_rss_mb": "After navigate returned the process tree was left alone for 180 s, then every descendant of the spawned npx pid was read with `ps -Ao pid=,ppid=,rss=` and RSS summed (total_mb). chrome_tree_mb is the same sum restricted to the subtree rooted at the launched Google Chrome binary; node_npx_mb is the remainder. macOS RSS counts shared mapped pages in every process, so a Chrome helper set that maps the same framework inflates the sum; the per-process list is kept in the report so that double counting stays visible, and no dedup is applied because the requested metric is the RSS sum.",
509
+ "idle_cpu_pct": "Cumulative CPU seconds (`ps -Ao time=`) of every tree pid were sampled every 30 s and differenced, giving the fraction of one core burned by npx+node+Chrome in each window, from the moment navigate returned. The method was validated twice: a plain `sleep 8` shows 0.00 CPU s under the same delta, and `top -l 2` (instantaneous %CPU) on the Chrome main process matches the delta values window by window. The ps %cpu column was not used because it is a lifetime average. The measured CPU is not near zero even with no tool call issued: the Chrome main process alone swings between ~0 and ~87 % of one core, which is Chrome background work, not benchmark overhead.",
510
+ "tab_switch_ms": "With example.com already open, a second page was opened at https://en.wikipedia.org/wiki/Main_Page (Playwright MCP: browser_tabs new + browser_navigate; chrome-devtools-mcp: new_page), then the browser switched back to the first page and read it (browser_tabs select index 0 + browser_snapshot / list_pages + select_page + take_snapshot). total_ms covers the whole cycle. Because wikipedia load time dominates, the same \"open a second page\" call was repeated against example.com as a control, which isolates tool overhead from page load.",
511
+ "restart_ms": "The whole spawned tree was SIGKILLed deepest-first, the death was verified with a fresh ps snapshot (any survivor re-killed), then a new npx process was spawned, initialized and navigated to example.com; restart_ms is kill-start to navigate-return.",
512
+ "auto_release": "Documented behaviour was read from the shipped README and source of the exact installed versions, with line numbers. For Playwright MCP the idle timeout was additionally verified empirically: server started with --idle-timeout=6000, navigate, then 14 s without any tool call, then a fresh process-tree snapshot to see whether Chrome was gone.",
513
+ "process_hygiene": "Every kill was scoped to the descendants of the npx pid this benchmark spawned (tree walk from ps ppid, deepest first) plus the Chrome roots recorded in that tree; no name-based kill was used against system Chrome, and after each kill a fresh snapshot verified that nothing was left."
514
+ },
515
+ "failure_points": [
516
+ "chrome-devtools-mcp navigate_page requires a pageId, and the id is 1-based: pageId 0 returns \"Error: No page found\". Its list_pages result is human-formatted Markdown (\"1: Example Domain (https://example.com/) [selected]\"), not JSON, so the id has to be parsed from the text. Two early probe runs failed on these two points before the driver was fixed.",
517
+ "An early smoke test cleaned up by SIGKILLing every process whose command line matched \"Contents/MacOS/Google Chrome\"; that killed the user's own Chrome main process (pid 97712) instead of only the benchmark tree. It was replaced by the tree-scoped kill now used everywhere. Consequence for this report: no user Chrome was running for any of the measurements below, which removes browser noise from CPU and memory, and the machine was otherwise idle.",
518
+ "A first version of the idle CPU metric summed the ps %cpu column; with freshly forked Chrome helpers that column reports a lifetime average and produced implausible values (up to 98.7 % in an early run). It was replaced by the CPU-seconds-delta method.",
519
+ "wikipedia.org load time varied between runs (3.4 s and 2.9 s in the reported run, 10 s in an earlier run on the same machine and network), which is why tab_switch_ms is reported together with its example.com control and not as tool overhead.",
520
+ "No measurement required a system-level change; nothing outside /tmp/compbench was written and no project repository was touched."
521
+ ]
522
+ }
523
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-inner-browser-use",
3
- "version": "0.45.0",
3
+ "version": "0.47.0",
4
4
  "description": "An agent-owned Chromium sidecar mirrored into the DeepSeek Harness right column: the agent drives it, the person watches and can take the mouse, and logins survive restarts.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -14,6 +14,7 @@
14
14
  "files": [
15
15
  "index.js",
16
16
  "sidecar.js",
17
+ "rest.js",
17
18
  "tools.js",
18
19
  "read.js",
19
20
  "review.js",
@@ -33,6 +34,8 @@
33
34
  "scripts/check-look.mjs",
34
35
  "scripts/check-sites.mjs",
35
36
  "scripts/soak.mjs",
37
+ "scripts/check-rest.mjs",
38
+ "scripts/bench-resource.mjs",
36
39
  "runtime/",
37
40
  "docs/",
38
41
  "README.md",
@@ -55,7 +58,7 @@
55
58
  "dsh": ">=0.2.0"
56
59
  },
57
60
  "scripts": {
58
- "test": "node --test test/artifacts.test.mjs test/client.test.mjs test/cookies.test.mjs test/diff.test.mjs test/fresh.test.mjs test/host.test.mjs test/input.test.mjs test/isolation.test.mjs test/keyboard.test.mjs test/leak.test.mjs test/login.test.mjs test/media.test.mjs test/no-duplicate.test.mjs test/package.test.mjs test/blocks.test.mjs test/readfault.test.mjs test/refs.test.mjs test/review.test.mjs test/session.test.mjs test/settle.test.mjs test/sidecar.test.mjs test/swf.test.mjs test/tabs.test.mjs test/trouble.test.mjs test/vault.test.mjs",
61
+ "test": "node --test test/artifacts.test.mjs test/client.test.mjs test/cookies.test.mjs test/diff.test.mjs test/fresh.test.mjs test/host.test.mjs test/input.test.mjs test/isolation.test.mjs test/keyboard.test.mjs test/leak.test.mjs test/login.test.mjs test/media.test.mjs test/no-duplicate.test.mjs test/package.test.mjs test/blocks.test.mjs test/rest.test.mjs test/readfault.test.mjs test/refs.test.mjs test/review.test.mjs test/session.test.mjs test/settle.test.mjs test/sidecar.test.mjs test/swf.test.mjs test/tabs.test.mjs test/trouble.test.mjs test/vault.test.mjs",
59
62
  "doctor": "node scripts/doctor.mjs",
60
63
  "breadth": "node scripts/breadth.mjs",
61
64
  "live": "node scripts/live.mjs",
@@ -72,7 +75,9 @@
72
75
  "keys": "node scripts/keyboard.mjs",
73
76
  "look": "node scripts/check-look.mjs",
74
77
  "sites": "node scripts/check-sites.mjs",
75
- "soak": "node scripts/soak.mjs"
78
+ "soak": "node scripts/soak.mjs",
79
+ "rest": "node scripts/check-rest.mjs",
80
+ "bench": "node scripts/bench-resource.mjs"
76
81
  },
77
82
  "license": "MIT",
78
83
  "author": {