@xbrowser/cli 1.12.0 → 1.13.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.
@@ -20,8 +20,8 @@ import {
20
20
  saveSessionDiskMeta,
21
21
  setActivePage,
22
22
  touchSession
23
- } from "./chunk-KJTABK3Z.js";
24
- import "./chunk-Z6CUR3VG.js";
23
+ } from "./chunk-HD4FX2N5.js";
24
+ import "./chunk-T2CNKWPV.js";
25
25
  import "./chunk-3FWLW7FS.js";
26
26
  import "./chunk-TNEN6VQ2.js";
27
27
  import "./chunk-GDKLH7ZY.js";
@@ -20,7 +20,7 @@ import {
20
20
  saveSessionDiskMeta,
21
21
  setActivePage,
22
22
  touchSession
23
- } from "./chunk-OVW2UEWN.js";
23
+ } from "./chunk-BY5TT6WZ.js";
24
24
  import "./chunk-TNEN6VQ2.js";
25
25
  import "./chunk-GDKLH7ZY.js";
26
26
  import "./chunk-KFQGP6VL.js";
@@ -20,8 +20,8 @@ import {
20
20
  saveSessionDiskMeta,
21
21
  setActivePage,
22
22
  touchSession
23
- } from "./chunk-R6IJ6PIV.js";
24
- import "./chunk-DKM2JOZL.js";
23
+ } from "./chunk-CW7L53JE.js";
24
+ import "./chunk-R2POF2GP.js";
25
25
  import "./chunk-TNEN6VQ2.js";
26
26
  import "./chunk-GDKLH7ZY.js";
27
27
  import "./chunk-A6LPGFAL.js";
@@ -144,7 +144,9 @@ function buildStealthInitScript() {
144
144
  ' Object.defineProperty(Screen.prototype,"height",{get:_gh,configurable:true});',
145
145
  ' Object.defineProperty(Screen.prototype,"availWidth",{get:_gw,configurable:true});',
146
146
  ' Object.defineProperty(Screen.prototype,"availHeight",{get:_gah,configurable:true});',
147
- " document.hasFocus=function(){return true};",
147
+ // hasFocus 与 visibilityState 联动(d29):恒 true 在 hidden 标签下暴露
148
+ // —— 真实浏览器失焦/后台时 hasFocus=false
149
+ ' document.hasFocus=function(){return document.visibilityState==="visible";};',
148
150
  // 4. Canvas/WebGL fingerprint: per-session stable noise (d20).
149
151
  // Headless software raster differs subtly from Chrome GPU raster —
150
152
  // toDataURL hashes fingerprint the rasterizer. Inject a stable
@@ -220,9 +222,32 @@ function buildStealthInitScript() {
220
222
  " var _sv=speechSynthesis.getVoices.bind(speechSynthesis);",
221
223
  " speechSynthesis.getVoices=function(){",
222
224
  " var real=_sv();",
223
- " if(real&&real.length)return real;",
225
+ " if(real&&real.length>50)return real;",
226
+ // 注意阈值从 0 改 50:iframe 原生约 10 个 —— 原阈值下 iframe 返回原生 10 个
227
+ // 而不是伪装 180(d33 暴露)。>50 = 主文档伪装列表已生效,其余返回伪装。
224
228
  ' return _fakeVoices.map(function(n,i){return {name:n,lang:i<2?"en-US":i<6?"en-GB":"zh-TW",localService:true,default:i===0,voiceURI:n};});',
225
229
  " };",
230
+ // d33 修复:iframe 的 speechSynthesis 是独立实例(主文档 hook 不可达)——
231
+ // 轮询同源 iframe,对其 contentWindow.speechSynthesis 同样 patch
232
+ " try{",
233
+ " var _piv=function(){",
234
+ ' var frs=document.querySelectorAll("iframe");',
235
+ " for(var i=0;i<frs.length;i++){try{",
236
+ " var cw=frs[i].contentWindow;",
237
+ " if(!cw||!cw.speechSynthesis||cw.speechSynthesis.__xbP)continue;",
238
+ " cw.speechSynthesis.__xbP=true;",
239
+ " var _sv2=cw.speechSynthesis.getVoices.bind(cw.speechSynthesis);",
240
+ " cw.speechSynthesis.getVoices=function(){var r=_sv2();if(r&&r.length>50)return r;",
241
+ ' return _fakeVoices.map(function(n,j){return{name:n,lang:j<2?"en-US":j<6?"en-GB":"zh-TW",localService:true,default:j===0,voiceURI:n};});};',
242
+ " }catch(e2){}}",
243
+ " };",
244
+ " setInterval(_piv,2000);",
245
+ " var _mo=new MutationObserver(function(muts){",
246
+ " for(var k=0;k<muts.length;k++){var ns=muts[k].addedNodes;",
247
+ ' for(var q=0;q<ns.length;q++){if(ns[q].tagName==="IFRAME")setTimeout(_piv,20);}}',
248
+ " });",
249
+ " _mo.observe(document.documentElement,{childList:true,subtree:true});",
250
+ " }catch(e){}",
226
251
  " }catch(e){}",
227
252
  " try{",
228
253
  " var _gb=navigator.getBattery.bind(navigator);",
@@ -244,6 +269,14 @@ function buildStealthInitScript() {
244
269
  " return offer;});",
245
270
  " };",
246
271
  " }catch(e){}",
272
+ // 3d-2. performance.now precision clamp (d34): full-precision timestamps
273
+ // (11 decimals) differ from site-isolation-clamped real Chrome (~100μs).
274
+ " try{",
275
+ " var _pn=performance.now.bind(performance);",
276
+ " performance.now=function(){return Math.round(_pn()*10)/10;};",
277
+ ' var _pto=Object.getOwnPropertyDescriptor(Performance.prototype,"timeOrigin");',
278
+ ' if(_pto&&_pto.get){Object.defineProperty(performance,"timeOrigin",{get:function(){return _pto.get.call(performance);},configurable:true});}',
279
+ " }catch(e){}",
247
280
  // 3d. Chrome object depth (d24): automation fakes usually only set
248
281
  // window.chrome = {}; deep checks hit app.run/runtime/csi/loadTimes.
249
282
  " try{",
@@ -14,7 +14,7 @@ import {
14
14
  scrollIntoView,
15
15
  waitForActionable,
16
16
  waitForNetworkIdle
17
- } from "./chunk-DKM2JOZL.js";
17
+ } from "./chunk-R2POF2GP.js";
18
18
  import {
19
19
  connectToCDP,
20
20
  findChrome,
@@ -14,7 +14,7 @@ import {
14
14
  scrollIntoView,
15
15
  waitForActionable,
16
16
  waitForNetworkIdle
17
- } from "./chunk-Z6CUR3VG.js";
17
+ } from "./chunk-T2CNKWPV.js";
18
18
  import "./chunk-3FWLW7FS.js";
19
19
  import {
20
20
  connectToCDP,
@@ -149,7 +149,9 @@ function buildStealthInitScript() {
149
149
  ' Object.defineProperty(Screen.prototype,"height",{get:_gh,configurable:true});',
150
150
  ' Object.defineProperty(Screen.prototype,"availWidth",{get:_gw,configurable:true});',
151
151
  ' Object.defineProperty(Screen.prototype,"availHeight",{get:_gah,configurable:true});',
152
- " document.hasFocus=function(){return true};",
152
+ // hasFocus 与 visibilityState 联动(d29):恒 true 在 hidden 标签下暴露
153
+ // —— 真实浏览器失焦/后台时 hasFocus=false
154
+ ' document.hasFocus=function(){return document.visibilityState==="visible";};',
153
155
  // 4. Canvas/WebGL fingerprint: per-session stable noise (d20).
154
156
  // Headless software raster differs subtly from Chrome GPU raster —
155
157
  // toDataURL hashes fingerprint the rasterizer. Inject a stable
@@ -225,9 +227,32 @@ function buildStealthInitScript() {
225
227
  " var _sv=speechSynthesis.getVoices.bind(speechSynthesis);",
226
228
  " speechSynthesis.getVoices=function(){",
227
229
  " var real=_sv();",
228
- " if(real&&real.length)return real;",
230
+ " if(real&&real.length>50)return real;",
231
+ // 注意阈值从 0 改 50:iframe 原生约 10 个 —— 原阈值下 iframe 返回原生 10 个
232
+ // 而不是伪装 180(d33 暴露)。>50 = 主文档伪装列表已生效,其余返回伪装。
229
233
  ' return _fakeVoices.map(function(n,i){return {name:n,lang:i<2?"en-US":i<6?"en-GB":"zh-TW",localService:true,default:i===0,voiceURI:n};});',
230
234
  " };",
235
+ // d33 修复:iframe 的 speechSynthesis 是独立实例(主文档 hook 不可达)——
236
+ // 轮询同源 iframe,对其 contentWindow.speechSynthesis 同样 patch
237
+ " try{",
238
+ " var _piv=function(){",
239
+ ' var frs=document.querySelectorAll("iframe");',
240
+ " for(var i=0;i<frs.length;i++){try{",
241
+ " var cw=frs[i].contentWindow;",
242
+ " if(!cw||!cw.speechSynthesis||cw.speechSynthesis.__xbP)continue;",
243
+ " cw.speechSynthesis.__xbP=true;",
244
+ " var _sv2=cw.speechSynthesis.getVoices.bind(cw.speechSynthesis);",
245
+ " cw.speechSynthesis.getVoices=function(){var r=_sv2();if(r&&r.length>50)return r;",
246
+ ' return _fakeVoices.map(function(n,j){return{name:n,lang:j<2?"en-US":j<6?"en-GB":"zh-TW",localService:true,default:j===0,voiceURI:n};});};',
247
+ " }catch(e2){}}",
248
+ " };",
249
+ " setInterval(_piv,2000);",
250
+ " var _mo=new MutationObserver(function(muts){",
251
+ " for(var k=0;k<muts.length;k++){var ns=muts[k].addedNodes;",
252
+ ' for(var q=0;q<ns.length;q++){if(ns[q].tagName==="IFRAME")setTimeout(_piv,20);}}',
253
+ " });",
254
+ " _mo.observe(document.documentElement,{childList:true,subtree:true});",
255
+ " }catch(e){}",
231
256
  " }catch(e){}",
232
257
  " try{",
233
258
  " var _gb=navigator.getBattery.bind(navigator);",
@@ -249,6 +274,14 @@ function buildStealthInitScript() {
249
274
  " return offer;});",
250
275
  " };",
251
276
  " }catch(e){}",
277
+ // 3d-2. performance.now precision clamp (d34): full-precision timestamps
278
+ // (11 decimals) differ from site-isolation-clamped real Chrome (~100μs).
279
+ " try{",
280
+ " var _pn=performance.now.bind(performance);",
281
+ " performance.now=function(){return Math.round(_pn()*10)/10;};",
282
+ ' var _pto=Object.getOwnPropertyDescriptor(Performance.prototype,"timeOrigin");',
283
+ ' if(_pto&&_pto.get){Object.defineProperty(performance,"timeOrigin",{get:function(){return _pto.get.call(performance);},configurable:true});}',
284
+ " }catch(e){}",
252
285
  // 3d. Chrome object depth (d24): automation fakes usually only set
253
286
  // window.chrome = {}; deep checks hit app.run/runtime/csi/loadTimes.
254
287
  " try{",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  launch
3
- } from "./chunk-DKM2JOZL.js";
3
+ } from "./chunk-R2POF2GP.js";
4
4
  import {
5
5
  errMsg
6
6
  } from "./chunk-GDKLH7ZY.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createRuleEngine,
3
3
  launch
4
- } from "./chunk-Z6CUR3VG.js";
4
+ } from "./chunk-T2CNKWPV.js";
5
5
  import {
6
6
  errMsg
7
7
  } from "./chunk-GDKLH7ZY.js";
@@ -146,7 +146,9 @@ function buildStealthInitScript() {
146
146
  ' Object.defineProperty(Screen.prototype,"height",{get:_gh,configurable:true});',
147
147
  ' Object.defineProperty(Screen.prototype,"availWidth",{get:_gw,configurable:true});',
148
148
  ' Object.defineProperty(Screen.prototype,"availHeight",{get:_gah,configurable:true});',
149
- " document.hasFocus=function(){return true};",
149
+ // hasFocus 与 visibilityState 联动(d29):恒 true 在 hidden 标签下暴露
150
+ // —— 真实浏览器失焦/后台时 hasFocus=false
151
+ ' document.hasFocus=function(){return document.visibilityState==="visible";};',
150
152
  // 4. Canvas/WebGL fingerprint: per-session stable noise (d20).
151
153
  // Headless software raster differs subtly from Chrome GPU raster —
152
154
  // toDataURL hashes fingerprint the rasterizer. Inject a stable
@@ -222,9 +224,32 @@ function buildStealthInitScript() {
222
224
  " var _sv=speechSynthesis.getVoices.bind(speechSynthesis);",
223
225
  " speechSynthesis.getVoices=function(){",
224
226
  " var real=_sv();",
225
- " if(real&&real.length)return real;",
227
+ " if(real&&real.length>50)return real;",
228
+ // 注意阈值从 0 改 50:iframe 原生约 10 个 —— 原阈值下 iframe 返回原生 10 个
229
+ // 而不是伪装 180(d33 暴露)。>50 = 主文档伪装列表已生效,其余返回伪装。
226
230
  ' return _fakeVoices.map(function(n,i){return {name:n,lang:i<2?"en-US":i<6?"en-GB":"zh-TW",localService:true,default:i===0,voiceURI:n};});',
227
231
  " };",
232
+ // d33 修复:iframe 的 speechSynthesis 是独立实例(主文档 hook 不可达)——
233
+ // 轮询同源 iframe,对其 contentWindow.speechSynthesis 同样 patch
234
+ " try{",
235
+ " var _piv=function(){",
236
+ ' var frs=document.querySelectorAll("iframe");',
237
+ " for(var i=0;i<frs.length;i++){try{",
238
+ " var cw=frs[i].contentWindow;",
239
+ " if(!cw||!cw.speechSynthesis||cw.speechSynthesis.__xbP)continue;",
240
+ " cw.speechSynthesis.__xbP=true;",
241
+ " var _sv2=cw.speechSynthesis.getVoices.bind(cw.speechSynthesis);",
242
+ " cw.speechSynthesis.getVoices=function(){var r=_sv2();if(r&&r.length>50)return r;",
243
+ ' return _fakeVoices.map(function(n,j){return{name:n,lang:j<2?"en-US":j<6?"en-GB":"zh-TW",localService:true,default:j===0,voiceURI:n};});};',
244
+ " }catch(e2){}}",
245
+ " };",
246
+ " setInterval(_piv,2000);",
247
+ " var _mo=new MutationObserver(function(muts){",
248
+ " for(var k=0;k<muts.length;k++){var ns=muts[k].addedNodes;",
249
+ ' for(var q=0;q<ns.length;q++){if(ns[q].tagName==="IFRAME")setTimeout(_piv,20);}}',
250
+ " });",
251
+ " _mo.observe(document.documentElement,{childList:true,subtree:true});",
252
+ " }catch(e){}",
228
253
  " }catch(e){}",
229
254
  " try{",
230
255
  " var _gb=navigator.getBattery.bind(navigator);",
@@ -246,6 +271,14 @@ function buildStealthInitScript() {
246
271
  " return offer;});",
247
272
  " };",
248
273
  " }catch(e){}",
274
+ // 3d-2. performance.now precision clamp (d34): full-precision timestamps
275
+ // (11 decimals) differ from site-isolation-clamped real Chrome (~100μs).
276
+ " try{",
277
+ " var _pn=performance.now.bind(performance);",
278
+ " performance.now=function(){return Math.round(_pn()*10)/10;};",
279
+ ' var _pto=Object.getOwnPropertyDescriptor(Performance.prototype,"timeOrigin");',
280
+ ' if(_pto&&_pto.get){Object.defineProperty(performance,"timeOrigin",{get:function(){return _pto.get.call(performance);},configurable:true});}',
281
+ " }catch(e){}",
249
282
  // 3d. Chrome object depth (d24): automation fakes usually only set
250
283
  // window.chrome = {}; deep checks hit app.run/runtime/csi/loadTimes.
251
284
  " try{",
@@ -147,7 +147,9 @@ function buildStealthInitScript() {
147
147
  ' Object.defineProperty(Screen.prototype,"height",{get:_gh,configurable:true});',
148
148
  ' Object.defineProperty(Screen.prototype,"availWidth",{get:_gw,configurable:true});',
149
149
  ' Object.defineProperty(Screen.prototype,"availHeight",{get:_gah,configurable:true});',
150
- " document.hasFocus=function(){return true};",
150
+ // hasFocus 与 visibilityState 联动(d29):恒 true 在 hidden 标签下暴露
151
+ // —— 真实浏览器失焦/后台时 hasFocus=false
152
+ ' document.hasFocus=function(){return document.visibilityState==="visible";};',
151
153
  // 4. Canvas/WebGL fingerprint: per-session stable noise (d20).
152
154
  // Headless software raster differs subtly from Chrome GPU raster —
153
155
  // toDataURL hashes fingerprint the rasterizer. Inject a stable
@@ -223,9 +225,32 @@ function buildStealthInitScript() {
223
225
  " var _sv=speechSynthesis.getVoices.bind(speechSynthesis);",
224
226
  " speechSynthesis.getVoices=function(){",
225
227
  " var real=_sv();",
226
- " if(real&&real.length)return real;",
228
+ " if(real&&real.length>50)return real;",
229
+ // 注意阈值从 0 改 50:iframe 原生约 10 个 —— 原阈值下 iframe 返回原生 10 个
230
+ // 而不是伪装 180(d33 暴露)。>50 = 主文档伪装列表已生效,其余返回伪装。
227
231
  ' return _fakeVoices.map(function(n,i){return {name:n,lang:i<2?"en-US":i<6?"en-GB":"zh-TW",localService:true,default:i===0,voiceURI:n};});',
228
232
  " };",
233
+ // d33 修复:iframe 的 speechSynthesis 是独立实例(主文档 hook 不可达)——
234
+ // 轮询同源 iframe,对其 contentWindow.speechSynthesis 同样 patch
235
+ " try{",
236
+ " var _piv=function(){",
237
+ ' var frs=document.querySelectorAll("iframe");',
238
+ " for(var i=0;i<frs.length;i++){try{",
239
+ " var cw=frs[i].contentWindow;",
240
+ " if(!cw||!cw.speechSynthesis||cw.speechSynthesis.__xbP)continue;",
241
+ " cw.speechSynthesis.__xbP=true;",
242
+ " var _sv2=cw.speechSynthesis.getVoices.bind(cw.speechSynthesis);",
243
+ " cw.speechSynthesis.getVoices=function(){var r=_sv2();if(r&&r.length>50)return r;",
244
+ ' return _fakeVoices.map(function(n,j){return{name:n,lang:j<2?"en-US":j<6?"en-GB":"zh-TW",localService:true,default:j===0,voiceURI:n};});};',
245
+ " }catch(e2){}}",
246
+ " };",
247
+ " setInterval(_piv,2000);",
248
+ " var _mo=new MutationObserver(function(muts){",
249
+ " for(var k=0;k<muts.length;k++){var ns=muts[k].addedNodes;",
250
+ ' for(var q=0;q<ns.length;q++){if(ns[q].tagName==="IFRAME")setTimeout(_piv,20);}}',
251
+ " });",
252
+ " _mo.observe(document.documentElement,{childList:true,subtree:true});",
253
+ " }catch(e){}",
229
254
  " }catch(e){}",
230
255
  " try{",
231
256
  " var _gb=navigator.getBattery.bind(navigator);",
@@ -247,6 +272,14 @@ function buildStealthInitScript() {
247
272
  " return offer;});",
248
273
  " };",
249
274
  " }catch(e){}",
275
+ // 3d-2. performance.now precision clamp (d34): full-precision timestamps
276
+ // (11 decimals) differ from site-isolation-clamped real Chrome (~100μs).
277
+ " try{",
278
+ " var _pn=performance.now.bind(performance);",
279
+ " performance.now=function(){return Math.round(_pn()*10)/10;};",
280
+ ' var _pto=Object.getOwnPropertyDescriptor(Performance.prototype,"timeOrigin");',
281
+ ' if(_pto&&_pto.get){Object.defineProperty(performance,"timeOrigin",{get:function(){return _pto.get.call(performance);},configurable:true});}',
282
+ " }catch(e){}",
250
283
  // 3d. Chrome object depth (d24): automation fakes usually only set
251
284
  // window.chrome = {}; deep checks hit app.run/runtime/csi/loadTimes.
252
285
  " try{",
package/dist/cli.js CHANGED
@@ -59,7 +59,7 @@ import {
59
59
  resolveLaunchOpts,
60
60
  saveSessionDiskMeta,
61
61
  setActivePage
62
- } from "./chunk-OVW2UEWN.js";
62
+ } from "./chunk-BY5TT6WZ.js";
63
63
  import "./chunk-TNEN6VQ2.js";
64
64
  import {
65
65
  errMsg
@@ -7523,7 +7523,7 @@ async function executeCommand(commandName, params, sessionName = "default", extr
7523
7523
  }
7524
7524
  let targetPageOverride = null;
7525
7525
  if (_target && extraOpts?.cdpEndpoint) {
7526
- const { findTargetPage } = await import("./browser-ILXTEWH4.js");
7526
+ const { findTargetPage } = await import("./browser-OMGJMSBB.js");
7527
7527
  targetPageOverride = await findTargetPage(extraOpts.cdpEndpoint, _target);
7528
7528
  if (!targetPageOverride) {
7529
7529
  return errorResult(`Target "${_target}" not found. Use 'xbrowser targets --cdp ${extraOpts.cdpEndpoint}' to list available pages.`);
@@ -13663,7 +13663,7 @@ Run "xbrowser ${command} ${subCommand} --help" to see available parameters.`
13663
13663
  const targetPage = pages[cmdTabIndex];
13664
13664
  await targetPage.bringToFront().catch(() => {
13665
13665
  });
13666
- const { setActivePage: setActivePage2 } = await import("./browser-ILXTEWH4.js");
13666
+ const { setActivePage: setActivePage2 } = await import("./browser-OMGJMSBB.js");
13667
13667
  setActivePage2(session, targetPage);
13668
13668
  }
13669
13669
  }
@@ -13939,7 +13939,7 @@ async function main() {
13939
13939
  const command = process.argv[2];
13940
13940
  const isLongRunning = command === "preview" || command === "serve";
13941
13941
  if (!isLongRunning) {
13942
- const { ensureProcessCanExit } = await import("./browser-ILXTEWH4.js");
13942
+ const { ensureProcessCanExit } = await import("./browser-OMGJMSBB.js");
13943
13943
  await ensureProcessCanExit().catch(() => {
13944
13944
  });
13945
13945
  process.exit(process.exitCode || exitCode);
@@ -30,10 +30,10 @@ import {
30
30
  resolveLaunchOpts,
31
31
  saveSessionDiskMeta,
32
32
  setActivePage
33
- } from "./chunk-KJTABK3Z.js";
33
+ } from "./chunk-HD4FX2N5.js";
34
34
  import {
35
35
  createRuleEngine
36
- } from "./chunk-Z6CUR3VG.js";
36
+ } from "./chunk-T2CNKWPV.js";
37
37
  import {
38
38
  queryJS
39
39
  } from "./chunk-3FWLW7FS.js";
@@ -7041,7 +7041,7 @@ async function executeCommand(commandName, params, sessionName = "default", extr
7041
7041
  }
7042
7042
  let targetPageOverride = null;
7043
7043
  if (_target && extraOpts?.cdpEndpoint) {
7044
- const { findTargetPage } = await import("./browser-XPDMY2NX.js");
7044
+ const { findTargetPage } = await import("./browser-AQ2AT2YZ.js");
7045
7045
  targetPageOverride = await findTargetPage(extraOpts.cdpEndpoint, _target);
7046
7046
  if (!targetPageOverride) {
7047
7047
  return errorResult(`Target "${_target}" not found. Use 'xbrowser targets --cdp ${extraOpts.cdpEndpoint}' to list available pages.`);
@@ -8857,7 +8857,7 @@ function createRPCHandler() {
8857
8857
  if (isNewFormat) {
8858
8858
  try {
8859
8859
  const replayErrors = [];
8860
- const { SessionReplayer } = await import("./session-replayer-K4A6OI4M.js");
8860
+ const { SessionReplayer } = await import("./session-replayer-UVH5FGY2.js");
8861
8861
  const replayer = new SessionReplayer({
8862
8862
  page: session.page,
8863
8863
  stepDelay: slowMo * 500,
package/dist/index.js CHANGED
@@ -92,8 +92,8 @@ import {
92
92
  resolveLaunchOpts,
93
93
  saveSessionDiskMeta,
94
94
  setActivePage
95
- } from "./chunk-R6IJ6PIV.js";
96
- import "./chunk-DKM2JOZL.js";
95
+ } from "./chunk-CW7L53JE.js";
96
+ import "./chunk-R2POF2GP.js";
97
97
  import "./chunk-TNEN6VQ2.js";
98
98
  import {
99
99
  errMsg
@@ -7873,7 +7873,7 @@ async function executeCommand(commandName, params, sessionName = "default", extr
7873
7873
  }
7874
7874
  let targetPageOverride = null;
7875
7875
  if (_target && extraOpts?.cdpEndpoint) {
7876
- const { findTargetPage } = await import("./browser-3HQKDZQ6.js");
7876
+ const { findTargetPage } = await import("./browser-T7OVLAEC.js");
7877
7877
  targetPageOverride = await findTargetPage(extraOpts.cdpEndpoint, _target);
7878
7878
  if (!targetPageOverride) {
7879
7879
  return errorResult(`Target "${_target}" not found. Use 'xbrowser targets --cdp ${extraOpts.cdpEndpoint}' to list available pages.`);
@@ -14051,7 +14051,7 @@ Run "xbrowser ${command} ${subCommand} --help" to see available parameters.`
14051
14051
  const targetPage = pages[cmdTabIndex];
14052
14052
  await targetPage.bringToFront().catch(() => {
14053
14053
  });
14054
- const { setActivePage: setActivePage2 } = await import("./browser-3HQKDZQ6.js");
14054
+ const { setActivePage: setActivePage2 } = await import("./browser-T7OVLAEC.js");
14055
14055
  setActivePage2(session, targetPage);
14056
14056
  }
14057
14057
  }
@@ -17224,7 +17224,7 @@ var DataCollector = class {
17224
17224
  return results;
17225
17225
  }
17226
17226
  async createBrowserContext() {
17227
- const { launch } = await import("./cdp-driver-YIKR4BUX.js");
17227
+ const { launch } = await import("./cdp-driver-HYCLE4YP.js");
17228
17228
  const { browser } = await launch({
17229
17229
  headless: true,
17230
17230
  args: ["--no-sandbox", "--disable-setuid-sandbox"]
@@ -34,7 +34,7 @@ var SessionReplayer = class {
34
34
  if (this.opts.page) {
35
35
  this.page = this.opts.page;
36
36
  } else if (this.opts.cdpUrl) {
37
- const { launch } = await import("./cdp-driver-ESH3PDE6.js");
37
+ const { launch } = await import("./cdp-driver-VS7Z7W7Y.js");
38
38
  const { browser } = await launch({ cdpEndpoint: this.opts.cdpUrl });
39
39
  let contexts = browser.contexts();
40
40
  for (let i = 0; i < 10 && contexts.length === 0; i++) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xbrowser/cli",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "Browser automation CLI for web scraping, headless browsing, SEO analysis, and AI agent workflows. A command-line alternative to Playwright, Puppeteer, and Selenium.",
5
5
  "type": "module",
6
6
  "bin": {