@xbrowser/cli 1.8.0 → 1.8.2

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.
package/dist/cli.js CHANGED
@@ -5554,7 +5554,7 @@ var InitScriptParams = z24.object({
5554
5554
  stdin: z24.boolean().optional(),
5555
5555
  name: z24.string().optional(),
5556
5556
  list: z24.boolean().optional(),
5557
- remove: z24.string().optional(),
5557
+ remove: z24.union([z24.string(), z24.boolean()]).optional(),
5558
5558
  base64: z24.string().optional()
5559
5559
  });
5560
5560
  var registeredScripts = /* @__PURE__ */ new Map();
@@ -5607,10 +5607,15 @@ var addInitScriptCommand = registerCommand({
5607
5607
  }));
5608
5608
  return ok23({ scripts });
5609
5609
  }
5610
- if (params.remove) {
5610
+ if (params.remove && typeof params.remove === "string") {
5611
5611
  const existed = registeredScripts.delete(params.remove);
5612
5612
  return ok23({ removed: params.remove, existed });
5613
5613
  }
5614
+ const removeTarget = (typeof params.remove === "string" ? params.remove : null) || (params.name && !resolveScriptContent(params) ? params.name : null);
5615
+ if (removeTarget && !resolveScriptContent(params)) {
5616
+ const existed = registeredScripts.delete(removeTarget);
5617
+ return ok23({ removed: removeTarget, existed });
5618
+ }
5614
5619
  let content = params.stdin ? await readStdin() : resolveScriptContent(params);
5615
5620
  if (!content) {
5616
5621
  return ok23({ error: "No script content provided. Use --script, --file, --stdin, or --base64" });
@@ -7903,10 +7908,25 @@ var configBuiltin = {
7903
7908
  }
7904
7909
  if (subcommand === "set") {
7905
7910
  const [key, value] = rest;
7906
- if (!key || !value) {
7911
+ if (!key || value === void 0) {
7907
7912
  console.error("Usage: xbrowser config set <key> <value>");
7908
7913
  process.exit(1);
7909
7914
  }
7915
+ const knownKeys = /* @__PURE__ */ new Set([
7916
+ "browser.executablePath",
7917
+ "browser.headless",
7918
+ "browser.args",
7919
+ "captcha.notifyUrl",
7920
+ "captcha.autoOpen",
7921
+ "captcha.timeout",
7922
+ "captcha.strategy",
7923
+ "preview.port",
7924
+ "preview.quality",
7925
+ "preview.fps"
7926
+ ]);
7927
+ if (!knownKeys.has(key) && !key.startsWith("browser.") && !key.startsWith("captcha.") && !key.startsWith("preview.")) {
7928
+ console.warn(`\u26A0\uFE0F Unknown config key: "${key}". Known keys: browser.*, captcha.*, preview.*`);
7929
+ }
7910
7930
  setConfigValue(key, value);
7911
7931
  console.log(`Set ${key} = ${value}`);
7912
7932
  return;
@@ -10253,13 +10273,29 @@ async function handleSession(args, options, mode, _cdpEndpoint) {
10253
10273
  const sub = args[0];
10254
10274
  switch (sub) {
10255
10275
  case "close": {
10256
- const name = options.session || options.name || process.env.XBROWSER_SESSION || "default";
10257
- try {
10258
- await forwardSessionClose(name);
10259
- } catch {
10276
+ if (options.all) {
10277
+ let count = 0;
10278
+ try {
10279
+ const sessions2 = await forwardSessionList();
10280
+ for (const s of sessions2) {
10281
+ try {
10282
+ await forwardSessionClose(s.name);
10283
+ count++;
10284
+ } catch {
10285
+ }
10286
+ }
10287
+ } catch {
10288
+ }
10289
+ outputResult({ ok: true, closed: count, all: true }, mode);
10290
+ } else {
10291
+ const name = options.session || options.name || process.env.XBROWSER_SESSION || "default";
10292
+ try {
10293
+ await forwardSessionClose(name);
10294
+ } catch {
10295
+ }
10296
+ await closeSession(name);
10297
+ outputResult({ ok: true, name }, mode);
10260
10298
  }
10261
- await closeSession(name);
10262
- outputResult({ ok: true, name }, mode);
10263
10299
  break;
10264
10300
  }
10265
10301
  case "list":
@@ -11316,12 +11352,13 @@ async function handleRun(filePath, options) {
11316
11352
  async function handleViewer(_args, options, mode, _cdpEndpoint) {
11317
11353
  const name = options.name || process.env.XBROWSER_SESSION || "default";
11318
11354
  const selector = options.selector;
11355
+ const userPort = options.port ? Number(options.port) : void 0;
11319
11356
  let status = getDaemonProcessStatus();
11320
11357
  if (!status.running) {
11321
- await startDaemonProcess();
11358
+ await startDaemonProcess(userPort || 9224);
11322
11359
  status = getDaemonProcessStatus();
11323
11360
  }
11324
- const port = status.port || getDaemonConfig().basePort;
11361
+ const port = userPort || status.port || getDaemonConfig().basePort;
11325
11362
  let url = `http://localhost:${port}/preview/${name}`;
11326
11363
  if (selector) {
11327
11364
  try {
@@ -5521,7 +5521,7 @@ var InitScriptParams = z24.object({
5521
5521
  stdin: z24.boolean().optional(),
5522
5522
  name: z24.string().optional(),
5523
5523
  list: z24.boolean().optional(),
5524
- remove: z24.string().optional(),
5524
+ remove: z24.union([z24.string(), z24.boolean()]).optional(),
5525
5525
  base64: z24.string().optional()
5526
5526
  });
5527
5527
  var registeredScripts = /* @__PURE__ */ new Map();
@@ -5574,10 +5574,15 @@ var addInitScriptCommand = registerCommand({
5574
5574
  }));
5575
5575
  return ok23({ scripts });
5576
5576
  }
5577
- if (params.remove) {
5577
+ if (params.remove && typeof params.remove === "string") {
5578
5578
  const existed = registeredScripts.delete(params.remove);
5579
5579
  return ok23({ removed: params.remove, existed });
5580
5580
  }
5581
+ const removeTarget = (typeof params.remove === "string" ? params.remove : null) || (params.name && !resolveScriptContent(params) ? params.name : null);
5582
+ if (removeTarget && !resolveScriptContent(params)) {
5583
+ const existed = registeredScripts.delete(removeTarget);
5584
+ return ok23({ removed: removeTarget, existed });
5585
+ }
5581
5586
  let content = params.stdin ? await readStdin() : resolveScriptContent(params);
5582
5587
  if (!content) {
5583
5588
  return ok23({ error: "No script content provided. Use --script, --file, --stdin, or --base64" });
package/dist/index.js CHANGED
@@ -5871,7 +5871,7 @@ var InitScriptParams = z24.object({
5871
5871
  stdin: z24.boolean().optional(),
5872
5872
  name: z24.string().optional(),
5873
5873
  list: z24.boolean().optional(),
5874
- remove: z24.string().optional(),
5874
+ remove: z24.union([z24.string(), z24.boolean()]).optional(),
5875
5875
  base64: z24.string().optional()
5876
5876
  });
5877
5877
  var registeredScripts = /* @__PURE__ */ new Map();
@@ -5924,10 +5924,15 @@ var addInitScriptCommand = registerCommand({
5924
5924
  }));
5925
5925
  return ok23({ scripts });
5926
5926
  }
5927
- if (params.remove) {
5927
+ if (params.remove && typeof params.remove === "string") {
5928
5928
  const existed = registeredScripts.delete(params.remove);
5929
5929
  return ok23({ removed: params.remove, existed });
5930
5930
  }
5931
+ const removeTarget = (typeof params.remove === "string" ? params.remove : null) || (params.name && !resolveScriptContent(params) ? params.name : null);
5932
+ if (removeTarget && !resolveScriptContent(params)) {
5933
+ const existed = registeredScripts.delete(removeTarget);
5934
+ return ok23({ removed: removeTarget, existed });
5935
+ }
5931
5936
  let content = params.stdin ? await readStdin() : resolveScriptContent(params);
5932
5937
  if (!content) {
5933
5938
  return ok23({ error: "No script content provided. Use --script, --file, --stdin, or --base64" });
@@ -8221,10 +8226,25 @@ var configBuiltin = {
8221
8226
  }
8222
8227
  if (subcommand === "set") {
8223
8228
  const [key, value] = rest;
8224
- if (!key || !value) {
8229
+ if (!key || value === void 0) {
8225
8230
  console.error("Usage: xbrowser config set <key> <value>");
8226
8231
  process.exit(1);
8227
8232
  }
8233
+ const knownKeys = /* @__PURE__ */ new Set([
8234
+ "browser.executablePath",
8235
+ "browser.headless",
8236
+ "browser.args",
8237
+ "captcha.notifyUrl",
8238
+ "captcha.autoOpen",
8239
+ "captcha.timeout",
8240
+ "captcha.strategy",
8241
+ "preview.port",
8242
+ "preview.quality",
8243
+ "preview.fps"
8244
+ ]);
8245
+ if (!knownKeys.has(key) && !key.startsWith("browser.") && !key.startsWith("captcha.") && !key.startsWith("preview.")) {
8246
+ console.warn(`\u26A0\uFE0F Unknown config key: "${key}". Known keys: browser.*, captcha.*, preview.*`);
8247
+ }
8228
8248
  setConfigValue(key, value);
8229
8249
  console.log(`Set ${key} = ${value}`);
8230
8250
  return;
@@ -10576,13 +10596,29 @@ async function handleSession(args, options, mode, _cdpEndpoint) {
10576
10596
  const sub = args[0];
10577
10597
  switch (sub) {
10578
10598
  case "close": {
10579
- const name = options.session || options.name || process.env.XBROWSER_SESSION || "default";
10580
- try {
10581
- await forwardSessionClose(name);
10582
- } catch {
10599
+ if (options.all) {
10600
+ let count = 0;
10601
+ try {
10602
+ const sessions2 = await forwardSessionList();
10603
+ for (const s of sessions2) {
10604
+ try {
10605
+ await forwardSessionClose(s.name);
10606
+ count++;
10607
+ } catch {
10608
+ }
10609
+ }
10610
+ } catch {
10611
+ }
10612
+ outputResult({ ok: true, closed: count, all: true }, mode);
10613
+ } else {
10614
+ const name = options.session || options.name || process.env.XBROWSER_SESSION || "default";
10615
+ try {
10616
+ await forwardSessionClose(name);
10617
+ } catch {
10618
+ }
10619
+ await closeSession(name);
10620
+ outputResult({ ok: true, name }, mode);
10583
10621
  }
10584
- await closeSession(name);
10585
- outputResult({ ok: true, name }, mode);
10586
10622
  break;
10587
10623
  }
10588
10624
  case "list":
@@ -11639,12 +11675,13 @@ async function handleRun(filePath, options) {
11639
11675
  async function handleViewer(_args, options, mode, _cdpEndpoint) {
11640
11676
  const name = options.name || process.env.XBROWSER_SESSION || "default";
11641
11677
  const selector = options.selector;
11678
+ const userPort = options.port ? Number(options.port) : void 0;
11642
11679
  let status = getDaemonProcessStatus();
11643
11680
  if (!status.running) {
11644
- await startDaemonProcess();
11681
+ await startDaemonProcess(userPort || 9224);
11645
11682
  status = getDaemonProcessStatus();
11646
11683
  }
11647
- const port = status.port || getDaemonConfig().basePort;
11684
+ const port = userPort || status.port || getDaemonConfig().basePort;
11648
11685
  let url = `http://localhost:${port}/preview/${name}`;
11649
11686
  if (selector) {
11650
11687
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xbrowser/cli",
3
- "version": "1.8.0",
3
+ "version": "1.8.2",
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": {