@optima-chat/browser-cli 0.13.1 → 0.15.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.
- package/dist/index.js +55 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -183,11 +183,12 @@ async function requestBinary(path) {
|
|
|
183
183
|
return Buffer.from(arrayBuffer);
|
|
184
184
|
}
|
|
185
185
|
var BrowserAPI = class {
|
|
186
|
-
async createSession(url, force, connector, ziniaoProfileId, bitbrowserProfileId, feikuaProfileId) {
|
|
186
|
+
async createSession(url, force, connector, ziniaoProfileId, bitbrowserProfileId, feikuaProfileId, chromeProfile) {
|
|
187
187
|
const body = {};
|
|
188
188
|
if (url) body.url = url;
|
|
189
189
|
if (force) body.force = true;
|
|
190
190
|
if (connector) body.connector = connector;
|
|
191
|
+
if (chromeProfile) body.chrome_profile = chromeProfile;
|
|
191
192
|
if (ziniaoProfileId) body.ziniao_profile_id = ziniaoProfileId;
|
|
192
193
|
if (bitbrowserProfileId) body.bitbrowser_profile_id = bitbrowserProfileId;
|
|
193
194
|
if (feikuaProfileId) body.feikua_profile_id = feikuaProfileId;
|
|
@@ -211,6 +212,10 @@ var BrowserAPI = class {
|
|
|
211
212
|
async getZiNiaoProfiles() {
|
|
212
213
|
return request("/api/user/ziniao-profiles");
|
|
213
214
|
}
|
|
215
|
+
// logged_in 缺席 = 没探(未开 check、无 homeUrl 或探测失败),下游按未知处理,别当 false。
|
|
216
|
+
async getChromeProfiles(check) {
|
|
217
|
+
return request(`/api/user/chrome-profiles${check ? "?check=true" : ""}`);
|
|
218
|
+
}
|
|
214
219
|
async getBitBrowserProfiles() {
|
|
215
220
|
return request("/api/user/bitbrowser-profiles");
|
|
216
221
|
}
|
|
@@ -370,9 +375,10 @@ var BrowserAPI = class {
|
|
|
370
375
|
async deleteScript(name) {
|
|
371
376
|
await request(`/api/scripts/${encodeURIComponent(name)}`, { method: "DELETE" });
|
|
372
377
|
}
|
|
373
|
-
async runScript(scriptName, params = {}, connector, ziniaoProfileId, bitbrowserProfileId, feikuaProfileId) {
|
|
378
|
+
async runScript(scriptName, params = {}, connector, ziniaoProfileId, bitbrowserProfileId, feikuaProfileId, chromeProfile) {
|
|
374
379
|
const payload = { params };
|
|
375
380
|
if (connector) payload.connector = connector;
|
|
381
|
+
if (chromeProfile) payload.chrome_profile = chromeProfile;
|
|
376
382
|
if (ziniaoProfileId) payload.ziniao_profile_id = ziniaoProfileId;
|
|
377
383
|
if (bitbrowserProfileId) payload.bitbrowser_profile_id = bitbrowserProfileId;
|
|
378
384
|
if (feikuaProfileId) payload.feikua_profile_id = feikuaProfileId;
|
|
@@ -458,6 +464,10 @@ function formatStatus(status) {
|
|
|
458
464
|
lines.push(`Status: ${status.status}`);
|
|
459
465
|
lines.push(`Created: ${status.created_at}`);
|
|
460
466
|
lines.push(`Idle: ${status.idle_seconds}s`);
|
|
467
|
+
if (status.execution) {
|
|
468
|
+
const where = status.execution === "sidecar" ? "user's machine" : "server-driven";
|
|
469
|
+
lines.push(`Execution: ${status.execution} (${where})`);
|
|
470
|
+
}
|
|
461
471
|
return lines.join("\n");
|
|
462
472
|
}
|
|
463
473
|
function formatScreenshot(filePath) {
|
|
@@ -511,9 +521,9 @@ function formatTabsInline(tabs) {
|
|
|
511
521
|
|
|
512
522
|
// src/commands/lifecycle.ts
|
|
513
523
|
function registerLifecycleCommands(program2) {
|
|
514
|
-
program2.command("launch").description("Launch a browser session").option("--url <url>", "Navigate to URL after launch").option("--force", "Close existing session before launching").option("--connector <type>", "Browser connector: chrome, ziniao, bitbrowser, or feikua").option("--ziniao-profile <id>", "ZiNiao browser profile ID").option("--bitbrowser-profile <id>", "BitBrowser profile ID").option("--feikua-profile <id>", "Feikua (\u98DE\u8DE8) shop browser instance ID").action(async (opts) => {
|
|
524
|
+
program2.command("launch").description("Launch a browser session").option("--url <url>", "Navigate to URL after launch").option("--force", "Close existing session before launching").option("--connector <type>", "Browser connector: chrome, ziniao, bitbrowser, or feikua").option("--ziniao-profile <id>", "ZiNiao browser profile ID").option("--bitbrowser-profile <id>", "BitBrowser profile ID").option("--feikua-profile <id>", "Feikua (\u98DE\u8DE8) shop browser instance ID").option("--chrome-profile <name>", "Chrome named profile (per-store login state; default: shared profile)").action(async (opts) => {
|
|
515
525
|
try {
|
|
516
|
-
const state = await api.createSession(opts.url, opts.force, opts.connector, opts.ziniaoProfile, opts.bitbrowserProfile, opts.feikuaProfile);
|
|
526
|
+
const state = await api.createSession(opts.url, opts.force, opts.connector, opts.ziniaoProfile, opts.bitbrowserProfile, opts.feikuaProfile, opts.chromeProfile);
|
|
517
527
|
saveSessionId(state.session_id);
|
|
518
528
|
console.log(formatLaunch(state));
|
|
519
529
|
} catch (err) {
|
|
@@ -877,7 +887,7 @@ function registerScriptCommands(program2) {
|
|
|
877
887
|
process.exit(1);
|
|
878
888
|
}
|
|
879
889
|
});
|
|
880
|
-
program2.command("runscript").argument("<name>", "Script name").description("Run a script (polls until complete)").option("--param <params...>", "Parameters as key=value").option("--connector <type>", "Browser connector: chrome, ziniao, bitbrowser, or feikua").option("--ziniao-profile <id>", "ZiNiao browser profile ID (with --connector ziniao)").option("--bitbrowser-profile <id>", "BitBrowser profile ID (with --connector bitbrowser)").option("--feikua-profile <id>", "Feikua (\u98DE\u8DE8) shop browser instance ID (with --connector feikua)").option("--out <path>", "Where to write the script's exported file (default: ./<filename>)").option("--no-poll", "Return immediately without polling").action(async (name, opts) => {
|
|
890
|
+
program2.command("runscript").argument("<name>", "Script name").description("Run a script (polls until complete)").option("--param <params...>", "Parameters as key=value").option("--connector <type>", "Browser connector: chrome, ziniao, bitbrowser, or feikua").option("--ziniao-profile <id>", "ZiNiao browser profile ID (with --connector ziniao)").option("--bitbrowser-profile <id>", "BitBrowser profile ID (with --connector bitbrowser)").option("--feikua-profile <id>", "Feikua (\u98DE\u8DE8) shop browser instance ID (with --connector feikua)").option("--chrome-profile <name>", "Chrome named profile (per-store login state, with --connector chrome)").option("--out <path>", "Where to write the script's exported file (default: ./<filename>)").option("--no-poll", "Return immediately without polling").action(async (name, opts) => {
|
|
881
891
|
try {
|
|
882
892
|
const params = {};
|
|
883
893
|
if (opts.param) {
|
|
@@ -887,7 +897,7 @@ function registerScriptCommands(program2) {
|
|
|
887
897
|
}
|
|
888
898
|
}
|
|
889
899
|
if (opts.out) params.out_path = resolve(opts.out);
|
|
890
|
-
const task = await api.runScript(name, params, opts.connector, opts.ziniaoProfile, opts.bitbrowserProfile, opts.feikuaProfile);
|
|
900
|
+
const task = await api.runScript(name, params, opts.connector, opts.ziniaoProfile, opts.bitbrowserProfile, opts.feikuaProfile, opts.chromeProfile);
|
|
891
901
|
console.log(`Script started (task: ${task.id})`);
|
|
892
902
|
if (!opts.poll) {
|
|
893
903
|
console.log(`Poll with: browser-cli script-task ${task.id}`);
|
|
@@ -1112,6 +1122,44 @@ function registerZiNiaoCommands(program2) {
|
|
|
1112
1122
|
});
|
|
1113
1123
|
}
|
|
1114
1124
|
|
|
1125
|
+
// src/commands/chrome.ts
|
|
1126
|
+
function registerChromeCommands(program2) {
|
|
1127
|
+
const chrome = program2.command("chrome").description("Manage Chrome named profiles (per-store login state)");
|
|
1128
|
+
chrome.command("profiles").description("List Chrome named profiles (requires Desktop app online)").option("--check", "Probe login state for profiles with a homeUrl (opens a headed Chrome per profile, ~10s each)").action(async (opts) => {
|
|
1129
|
+
try {
|
|
1130
|
+
const result = await api.getChromeProfiles(opts.check);
|
|
1131
|
+
if (!result.connected) {
|
|
1132
|
+
console.log(formatDesktopNotConnected(result));
|
|
1133
|
+
process.exit(1);
|
|
1134
|
+
}
|
|
1135
|
+
console.log(`Chrome profiles (${result.profiles.length}):
|
|
1136
|
+
`);
|
|
1137
|
+
for (const p of result.profiles) {
|
|
1138
|
+
const label = p.name === "default" ? "\u5171\u4EAB\u9ED8\u8BA4" : p.label ?? "-";
|
|
1139
|
+
const login = p.logged_in === void 0 ? "-" : p.logged_in ? "\u2705" : "\u274C \u9700\u4EBA\u5DE5\u91CD\u767B";
|
|
1140
|
+
const home = p.homeUrl ? ` ${p.homeUrl}` : "";
|
|
1141
|
+
console.log(` ${p.name.padEnd(12)} ${label.padEnd(18)} running: ${p.running ? "yes" : "no"} logged_in: ${login}${home}`);
|
|
1142
|
+
}
|
|
1143
|
+
console.log("\nUse: browser-cli launch --connector chrome --chrome-profile <name> --url <url>");
|
|
1144
|
+
if (!opts.check) console.log("Add --check to probe login state (profiles with a homeUrl only).");
|
|
1145
|
+
} catch (err) {
|
|
1146
|
+
console.error(formatError(err));
|
|
1147
|
+
process.exit(1);
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1150
|
+
chrome.command("open").description("Open a named profile's headed Chrome for manual login (the official login entry)").requiredOption("--profile <name>", "Chrome named profile to open (created on first use)").option("--url <url>", "Page to open, e.g. the seller center login page").action(async (opts) => {
|
|
1151
|
+
try {
|
|
1152
|
+
const state = await api.createSession(opts.url, false, "chrome", void 0, void 0, void 0, opts.profile);
|
|
1153
|
+
saveSessionId(state.session_id);
|
|
1154
|
+
console.log(`\u2713 Opened Chrome profile "${opts.profile}"${opts.url ? ` at ${opts.url}` : ""} (session: ${state.session_id})`);
|
|
1155
|
+
console.log("\u5728\u5F39\u51FA\u7684 Chrome \u7A97\u53E3\u91CC\u5B8C\u6210\u767B\u5F55;\u767B\u5F55\u6001\u4F1A\u7559\u5728\u8BE5 profile,\u4E4B\u540E\u5E26 --chrome-profile \u7684\u8C03\u7528\u76F4\u63A5\u590D\u7528\u3002");
|
|
1156
|
+
} catch (err) {
|
|
1157
|
+
console.error(formatError(err));
|
|
1158
|
+
process.exit(1);
|
|
1159
|
+
}
|
|
1160
|
+
});
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1115
1163
|
// src/commands/recipes.ts
|
|
1116
1164
|
import { writeFileSync as writeFileSync4 } from "fs";
|
|
1117
1165
|
import { resolve as resolve2 } from "path";
|
|
@@ -1335,6 +1383,7 @@ registerInfoCommands(program);
|
|
|
1335
1383
|
registerTabCommands(program);
|
|
1336
1384
|
registerScriptCommands(program);
|
|
1337
1385
|
registerZiNiaoCommands(program);
|
|
1386
|
+
registerChromeCommands(program);
|
|
1338
1387
|
registerRecipeCommands(program);
|
|
1339
1388
|
registerBitBrowserCommands(program);
|
|
1340
1389
|
registerFeikuaCommands(program);
|