gologin-agent-browser-cli 0.2.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/LICENSE +21 -0
- package/README.md +318 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +336 -0
- package/dist/commands/back.d.ts +2 -0
- package/dist/commands/back.js +12 -0
- package/dist/commands/check.d.ts +2 -0
- package/dist/commands/check.js +17 -0
- package/dist/commands/click.d.ts +2 -0
- package/dist/commands/click.js +17 -0
- package/dist/commands/close.d.ts +2 -0
- package/dist/commands/close.js +12 -0
- package/dist/commands/cookies.d.ts +2 -0
- package/dist/commands/cookies.js +23 -0
- package/dist/commands/cookiesClear.d.ts +2 -0
- package/dist/commands/cookiesClear.js +12 -0
- package/dist/commands/cookiesImport.d.ts +2 -0
- package/dist/commands/cookiesImport.js +18 -0
- package/dist/commands/current.d.ts +2 -0
- package/dist/commands/current.js +9 -0
- package/dist/commands/dblclick.d.ts +2 -0
- package/dist/commands/dblclick.js +17 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +31 -0
- package/dist/commands/eval.d.ts +2 -0
- package/dist/commands/eval.js +30 -0
- package/dist/commands/fill.d.ts +2 -0
- package/dist/commands/fill.js +18 -0
- package/dist/commands/find.d.ts +2 -0
- package/dist/commands/find.js +86 -0
- package/dist/commands/focus.d.ts +2 -0
- package/dist/commands/focus.js +17 -0
- package/dist/commands/forward.d.ts +2 -0
- package/dist/commands/forward.js +12 -0
- package/dist/commands/get.d.ts +2 -0
- package/dist/commands/get.js +19 -0
- package/dist/commands/hover.d.ts +2 -0
- package/dist/commands/hover.js +17 -0
- package/dist/commands/open.d.ts +2 -0
- package/dist/commands/open.js +67 -0
- package/dist/commands/pdf.d.ts +2 -0
- package/dist/commands/pdf.js +18 -0
- package/dist/commands/press.d.ts +2 -0
- package/dist/commands/press.js +19 -0
- package/dist/commands/reload.d.ts +2 -0
- package/dist/commands/reload.js +12 -0
- package/dist/commands/screenshot.d.ts +2 -0
- package/dist/commands/screenshot.js +22 -0
- package/dist/commands/scroll.d.ts +2 -0
- package/dist/commands/scroll.js +25 -0
- package/dist/commands/scrollIntoView.d.ts +2 -0
- package/dist/commands/scrollIntoView.js +17 -0
- package/dist/commands/select.d.ts +2 -0
- package/dist/commands/select.js +18 -0
- package/dist/commands/sessions.d.ts +2 -0
- package/dist/commands/sessions.js +15 -0
- package/dist/commands/shared.d.ts +7 -0
- package/dist/commands/shared.js +51 -0
- package/dist/commands/snapshot.d.ts +2 -0
- package/dist/commands/snapshot.js +16 -0
- package/dist/commands/storageClear.d.ts +2 -0
- package/dist/commands/storageClear.js +13 -0
- package/dist/commands/storageExport.d.ts +2 -0
- package/dist/commands/storageExport.js +24 -0
- package/dist/commands/storageImport.d.ts +2 -0
- package/dist/commands/storageImport.js +20 -0
- package/dist/commands/tabClose.d.ts +2 -0
- package/dist/commands/tabClose.js +21 -0
- package/dist/commands/tabFocus.d.ts +2 -0
- package/dist/commands/tabFocus.js +21 -0
- package/dist/commands/tabOpen.d.ts +2 -0
- package/dist/commands/tabOpen.js +13 -0
- package/dist/commands/tabs.d.ts +2 -0
- package/dist/commands/tabs.js +17 -0
- package/dist/commands/type.d.ts +2 -0
- package/dist/commands/type.js +18 -0
- package/dist/commands/uncheck.d.ts +2 -0
- package/dist/commands/uncheck.js +17 -0
- package/dist/commands/upload.d.ts +2 -0
- package/dist/commands/upload.js +18 -0
- package/dist/commands/wait.d.ts +2 -0
- package/dist/commands/wait.js +41 -0
- package/dist/daemon/browser.d.ts +67 -0
- package/dist/daemon/browser.js +818 -0
- package/dist/daemon/refStore.d.ts +9 -0
- package/dist/daemon/refStore.js +26 -0
- package/dist/daemon/server.d.ts +1 -0
- package/dist/daemon/server.js +313 -0
- package/dist/daemon/sessionManager.d.ts +66 -0
- package/dist/daemon/sessionManager.js +684 -0
- package/dist/daemon/snapshot.d.ts +8 -0
- package/dist/daemon/snapshot.js +285 -0
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.js +58 -0
- package/dist/lib/daemon.d.ts +9 -0
- package/dist/lib/daemon.js +197 -0
- package/dist/lib/errors.d.ts +12 -0
- package/dist/lib/errors.js +63 -0
- package/dist/lib/types.d.ts +407 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/utils.d.ts +27 -0
- package/dist/lib/utils.js +165 -0
- package/examples/agent-flow.sh +19 -0
- package/package.json +61 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runBackCommand = runBackCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
const shared_1 = require("./shared");
|
|
6
|
+
async function runBackCommand(context, argv) {
|
|
7
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
8
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
9
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
10
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/back`);
|
|
11
|
+
context.stdout.write(`session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCheckCommand = runCheckCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runCheckCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const target = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
if (!target) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser check <target> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
15
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/check`, { target });
|
|
16
|
+
(0, shared_1.writeActionResult)(context, "checked", target, response);
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runClickCommand = runClickCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runClickCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const target = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
if (!target) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser click <target> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
15
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/click`, { target });
|
|
16
|
+
(0, shared_1.writeActionResult)(context, "clicked", target, response);
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCloseCommand = runCloseCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
async function runCloseCommand(context, argv) {
|
|
6
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
7
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
8
|
+
const resolvedSessionId = sessionId ??
|
|
9
|
+
(await context.client.request("GET", "/sessions/current")).sessionId;
|
|
10
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/close`);
|
|
11
|
+
context.stdout.write(`closed session=${response.sessionId}\n`);
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCookiesCommand = runCookiesCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
const shared_1 = require("./shared");
|
|
6
|
+
async function runCookiesCommand(context, argv) {
|
|
7
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
8
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
9
|
+
const outputPath = (0, utils_1.getFlagString)(parsed, "output");
|
|
10
|
+
const json = (0, utils_1.getFlagBoolean)(parsed, "json");
|
|
11
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
12
|
+
const response = await context.client.request("GET", `/sessions/${resolvedSessionId}/cookies`);
|
|
13
|
+
if (outputPath) {
|
|
14
|
+
const savedPath = (0, shared_1.writeJsonFile)(context, outputPath, response.cookies);
|
|
15
|
+
context.stdout.write(`${savedPath}\n`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (json) {
|
|
19
|
+
(0, shared_1.writeJsonStdout)(context, response.cookies);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
context.stdout.write(`${JSON.stringify(response.cookies, null, 2)}\n`);
|
|
23
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCookiesClearCommand = runCookiesClearCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
const shared_1 = require("./shared");
|
|
6
|
+
async function runCookiesClearCommand(context, argv) {
|
|
7
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
8
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
9
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
10
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/cookies-clear`);
|
|
11
|
+
context.stdout.write(`cleared=${response.cleared} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
12
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCookiesImportCommand = runCookiesImportCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runCookiesImportCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
10
|
+
const cookiesPath = parsed.positional[0];
|
|
11
|
+
if (!cookiesPath) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser cookies-import <cookies.json> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const cookies = (0, shared_1.readJsonFile)(context, cookiesPath);
|
|
15
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
16
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/cookies-import`, { cookies });
|
|
17
|
+
context.stdout.write(`imported=${response.imported} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
18
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCurrentCommand = runCurrentCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
async function runCurrentCommand(context, argv) {
|
|
6
|
+
(0, utils_1.parseArgs)(argv);
|
|
7
|
+
const response = await context.client.request("GET", "/sessions/current");
|
|
8
|
+
context.stdout.write(`${(0, utils_1.formatCurrentLine)(response)}\n`);
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDoubleClickCommand = runDoubleClickCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runDoubleClickCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const target = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
if (!target) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser dblclick <target> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
15
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/dblclick`, { target });
|
|
16
|
+
(0, shared_1.writeActionResult)(context, "double-clicked", target, response);
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDoctorCommand = runDoctorCommand;
|
|
4
|
+
const daemon_1 = require("../lib/daemon");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
function writeJson(context, payload) {
|
|
7
|
+
context.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
8
|
+
}
|
|
9
|
+
function writeDoctorReport(context, report) {
|
|
10
|
+
context.stdout.write(`ok=${report.ok}\n`);
|
|
11
|
+
context.stdout.write(`tokenConfigured=${report.tokenConfigured}\n`);
|
|
12
|
+
if (report.defaultProfileId) {
|
|
13
|
+
context.stdout.write(`defaultProfileId=${report.defaultProfileId}\n`);
|
|
14
|
+
}
|
|
15
|
+
context.stdout.write(`connectBase=${report.connectBase}\n`);
|
|
16
|
+
context.stdout.write(`configPath=${report.configPath}\n`);
|
|
17
|
+
context.stdout.write(`daemonLogPath=${report.daemonLogPath}\n`);
|
|
18
|
+
for (const transport of report.transports) {
|
|
19
|
+
context.stdout.write(`transport=${transport.label} reachable=${transport.reachable}\n`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function runDoctorCommand(context, argv) {
|
|
23
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
24
|
+
const json = (0, utils_1.getFlagBoolean)(parsed, "json");
|
|
25
|
+
const report = await (0, daemon_1.inspectDaemon)(context.config);
|
|
26
|
+
if (json) {
|
|
27
|
+
writeJson(context, report);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
writeDoctorReport(context, report);
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runEvalCommand = runEvalCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runEvalCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
10
|
+
const json = (0, utils_1.getFlagBoolean)(parsed, "json");
|
|
11
|
+
const expression = parsed.positional.join(" ").trim();
|
|
12
|
+
if (!expression) {
|
|
13
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser eval <expression> [--json] [--session <sessionId>]", 400);
|
|
14
|
+
}
|
|
15
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
16
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/eval`, { expression });
|
|
17
|
+
if (json) {
|
|
18
|
+
(0, shared_1.writeJsonStdout)(context, response.value);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (typeof response.value === "string") {
|
|
22
|
+
context.stdout.write(`${response.value}\n`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (response.value === undefined) {
|
|
26
|
+
context.stdout.write("undefined\n");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
context.stdout.write(`${JSON.stringify(response.value)}\n`);
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runFillCommand = runFillCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runFillCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const target = parsed.positional[0];
|
|
10
|
+
const text = parsed.positional.slice(1).join(" ");
|
|
11
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
12
|
+
if (!target || !text) {
|
|
13
|
+
throw new errors_1.AppError("BAD_REQUEST", 'Usage: gologin-agent-browser fill <target> <text> [--session <sessionId>]', 400);
|
|
14
|
+
}
|
|
15
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
16
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/fill`, { target, text });
|
|
17
|
+
(0, shared_1.writeActionResult)(context, "filled", target, response);
|
|
18
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runFindCommand = runFindCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
const ACTIONS = new Set(["click", "fill", "type", "hover", "text"]);
|
|
8
|
+
function parseFindLocator(positional) {
|
|
9
|
+
const mode = positional[0];
|
|
10
|
+
if (mode === "role") {
|
|
11
|
+
const role = positional[1];
|
|
12
|
+
const action = positional[2];
|
|
13
|
+
const value = positional.slice(3).join(" ") || undefined;
|
|
14
|
+
if (!role || !action || !ACTIONS.has(action)) {
|
|
15
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser find role <role> <action> [value] [--name <name>]", 400);
|
|
16
|
+
}
|
|
17
|
+
return { locator: { strategy: "role", role }, action, value };
|
|
18
|
+
}
|
|
19
|
+
if (mode === "text") {
|
|
20
|
+
const text = positional[1];
|
|
21
|
+
const action = positional[2];
|
|
22
|
+
const value = positional.slice(3).join(" ") || undefined;
|
|
23
|
+
if (!text || !action || !ACTIONS.has(action)) {
|
|
24
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser find text <text> <action> [value]", 400);
|
|
25
|
+
}
|
|
26
|
+
return { locator: { strategy: "text", text }, action, value };
|
|
27
|
+
}
|
|
28
|
+
if (mode === "label") {
|
|
29
|
+
const label = positional[1];
|
|
30
|
+
const action = positional[2];
|
|
31
|
+
const value = positional.slice(3).join(" ") || undefined;
|
|
32
|
+
if (!label || !action || !ACTIONS.has(action)) {
|
|
33
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser find label <label> <action> [value]", 400);
|
|
34
|
+
}
|
|
35
|
+
return { locator: { strategy: "label", label }, action, value };
|
|
36
|
+
}
|
|
37
|
+
if (mode === "placeholder") {
|
|
38
|
+
const placeholder = positional[1];
|
|
39
|
+
const action = positional[2];
|
|
40
|
+
const value = positional.slice(3).join(" ") || undefined;
|
|
41
|
+
if (!placeholder || !action || !ACTIONS.has(action)) {
|
|
42
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser find placeholder <placeholder> <action> [value]", 400);
|
|
43
|
+
}
|
|
44
|
+
return { locator: { strategy: "placeholder", placeholder }, action, value };
|
|
45
|
+
}
|
|
46
|
+
if (mode === "first" || mode === "last") {
|
|
47
|
+
const selector = positional[1];
|
|
48
|
+
const action = positional[2];
|
|
49
|
+
const value = positional.slice(3).join(" ") || undefined;
|
|
50
|
+
if (!selector || !action || !ACTIONS.has(action)) {
|
|
51
|
+
throw new errors_1.AppError("BAD_REQUEST", `Usage: gologin-agent-browser find ${mode} <selector> <action> [value]`, 400);
|
|
52
|
+
}
|
|
53
|
+
return { locator: { strategy: mode, selector }, action, value };
|
|
54
|
+
}
|
|
55
|
+
if (mode === "nth") {
|
|
56
|
+
const nth = positional[1];
|
|
57
|
+
const selector = positional[2];
|
|
58
|
+
const action = positional[3];
|
|
59
|
+
const value = positional.slice(4).join(" ") || undefined;
|
|
60
|
+
if (!nth || !selector || !action || !ACTIONS.has(action) || Number.isNaN(Number(nth))) {
|
|
61
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser find nth <n> <selector> <action> [value]", 400);
|
|
62
|
+
}
|
|
63
|
+
return { locator: { strategy: "nth", selector, nth: Number(nth) }, action, value };
|
|
64
|
+
}
|
|
65
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser find <role|text|label|placeholder|first|last|nth> ...", 400);
|
|
66
|
+
}
|
|
67
|
+
async function runFindCommand(context, argv) {
|
|
68
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
69
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
70
|
+
const name = (0, utils_1.getFlagString)(parsed, "name");
|
|
71
|
+
const exact = (0, utils_1.getFlagBoolean)(parsed, "exact");
|
|
72
|
+
const { locator, action, value } = parseFindLocator(parsed.positional);
|
|
73
|
+
if (locator.strategy === "role" && name) {
|
|
74
|
+
locator.name = name;
|
|
75
|
+
}
|
|
76
|
+
if (exact) {
|
|
77
|
+
locator.exact = true;
|
|
78
|
+
}
|
|
79
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
80
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/find`, { locator, action, value });
|
|
81
|
+
if (action === "text") {
|
|
82
|
+
context.stdout.write(`${response.value ?? ""}\n`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
context.stdout.write(`find ${action} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
86
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runFocusCommand = runFocusCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runFocusCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const target = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
if (!target) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser focus <target> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
15
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/focus`, { target });
|
|
16
|
+
(0, shared_1.writeActionResult)(context, "focused", target, response);
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runForwardCommand = runForwardCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
const shared_1 = require("./shared");
|
|
6
|
+
async function runForwardCommand(context, argv) {
|
|
7
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
8
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
9
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
10
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/forward`);
|
|
11
|
+
context.stdout.write(`session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runGetCommand = runGetCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
const GET_KINDS = new Set(["text", "value", "html", "title", "url"]);
|
|
8
|
+
async function runGetCommand(context, argv) {
|
|
9
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
10
|
+
const kind = parsed.positional[0];
|
|
11
|
+
const target = parsed.positional[1];
|
|
12
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
13
|
+
if (!kind || !GET_KINDS.has(kind)) {
|
|
14
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser get <text|value|html|title|url> [target] [--session <sessionId>]", 400);
|
|
15
|
+
}
|
|
16
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
17
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/get`, { kind, target });
|
|
18
|
+
context.stdout.write(`${response.value}\n`);
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runHoverCommand = runHoverCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runHoverCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const target = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
if (!target) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser hover <target> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
15
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/hover`, { target });
|
|
16
|
+
(0, shared_1.writeActionResult)(context, "hovered", target, response);
|
|
17
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runOpenCommand = runOpenCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
function parseIdleTimeout(value) {
|
|
7
|
+
if (!value) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const timeout = Number(value);
|
|
11
|
+
if (!Number.isInteger(timeout) || timeout <= 0) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "--idle-timeout-ms must be a positive integer", 400);
|
|
13
|
+
}
|
|
14
|
+
return timeout;
|
|
15
|
+
}
|
|
16
|
+
function parseProxy(parsed) {
|
|
17
|
+
const country = (0, utils_1.getFlagString)(parsed, "proxy-country");
|
|
18
|
+
const mode = (0, utils_1.getFlagString)(parsed, "proxy-mode");
|
|
19
|
+
const host = (0, utils_1.getFlagString)(parsed, "proxy-host");
|
|
20
|
+
const portRaw = (0, utils_1.getFlagString)(parsed, "proxy-port");
|
|
21
|
+
const username = (0, utils_1.getFlagString)(parsed, "proxy-user");
|
|
22
|
+
const password = (0, utils_1.getFlagString)(parsed, "proxy-pass");
|
|
23
|
+
if (country) {
|
|
24
|
+
throw new errors_1.AppError("BAD_REQUEST", "--proxy-country is not available for temporary cloud profiles yet; use a preconfigured --profile or a custom proxy host/port", 400);
|
|
25
|
+
}
|
|
26
|
+
if (host || portRaw || username || password || mode) {
|
|
27
|
+
const port = Number(portRaw);
|
|
28
|
+
if (!host || !portRaw || !Number.isInteger(port) || port <= 0) {
|
|
29
|
+
throw new errors_1.AppError("BAD_REQUEST", "Custom proxy requires --proxy-host and a valid --proxy-port", 400);
|
|
30
|
+
}
|
|
31
|
+
const resolvedMode = mode ?? "http";
|
|
32
|
+
if (!["http", "socks4", "socks5"].includes(resolvedMode)) {
|
|
33
|
+
throw new errors_1.AppError("BAD_REQUEST", "--proxy-mode must be one of http, socks4, or socks5", 400);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
mode: resolvedMode,
|
|
37
|
+
host,
|
|
38
|
+
port,
|
|
39
|
+
username,
|
|
40
|
+
password
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
async function runOpenCommand(context, argv) {
|
|
46
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
47
|
+
const url = parsed.positional[0];
|
|
48
|
+
const profileId = (0, utils_1.getFlagString)(parsed, "profile");
|
|
49
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
50
|
+
const proxy = parseProxy(parsed);
|
|
51
|
+
const idleTimeoutMs = parseIdleTimeout((0, utils_1.getFlagString)(parsed, "idle-timeout-ms"));
|
|
52
|
+
if (!url) {
|
|
53
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser open <url> [--profile <profileId>] [--session <sessionId>] [--idle-timeout-ms <ms>] [--proxy-host <host> --proxy-port <port>]", 400);
|
|
54
|
+
}
|
|
55
|
+
const response = await context.client.request("POST", "/sessions/open", {
|
|
56
|
+
url,
|
|
57
|
+
profileId,
|
|
58
|
+
sessionId,
|
|
59
|
+
proxy,
|
|
60
|
+
idleTimeoutMs
|
|
61
|
+
});
|
|
62
|
+
const proxyLabel = (0, utils_1.formatProxyLabel)(response.proxy);
|
|
63
|
+
const proxyToken = proxyLabel ? ` proxy=${proxyLabel}` : "";
|
|
64
|
+
const liveView = response.liveViewUrl ? ` liveview=${response.liveViewUrl}` : "";
|
|
65
|
+
const idleTimeout = response.idleTimeoutMs !== undefined ? ` idleTimeoutMs=${response.idleTimeoutMs}` : "";
|
|
66
|
+
context.stdout.write(`session=${response.sessionId} url=${response.url}${proxyToken}${idleTimeout}${liveView}\n`);
|
|
67
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPdfCommand = runPdfCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runPdfCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const inputPath = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
if (!inputPath) {
|
|
12
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser pdf <path> [--session <sessionId>]", 400);
|
|
13
|
+
}
|
|
14
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
15
|
+
const path = (0, utils_1.ensureAbsolutePath)(context.cwd, inputPath);
|
|
16
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/pdf`, { path });
|
|
17
|
+
context.stdout.write(`pdf=${response.path} session=${response.sessionId}\n`);
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPressCommand = runPressCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runPressCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const key = parsed.positional[0];
|
|
10
|
+
const target = parsed.positional[1];
|
|
11
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
12
|
+
if (!key) {
|
|
13
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser press <key> [target] [--session <sessionId>]", 400);
|
|
14
|
+
}
|
|
15
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
16
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/press`, { key, target });
|
|
17
|
+
const targetSuffix = target ? ` target=${target}` : "";
|
|
18
|
+
context.stdout.write(`pressed key=${key}${targetSuffix} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
19
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runReloadCommand = runReloadCommand;
|
|
4
|
+
const utils_1 = require("../lib/utils");
|
|
5
|
+
const shared_1 = require("./shared");
|
|
6
|
+
async function runReloadCommand(context, argv) {
|
|
7
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
8
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
9
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
10
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/reload`);
|
|
11
|
+
context.stdout.write(`session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
|
|
12
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runScreenshotCommand = runScreenshotCommand;
|
|
4
|
+
const errors_1 = require("../lib/errors");
|
|
5
|
+
const utils_1 = require("../lib/utils");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
async function runScreenshotCommand(context, argv) {
|
|
8
|
+
const parsed = (0, utils_1.parseArgs)(argv);
|
|
9
|
+
const inputPath = parsed.positional[0];
|
|
10
|
+
const sessionId = (0, utils_1.getFlagString)(parsed, "session");
|
|
11
|
+
const annotate = (0, utils_1.getFlagBoolean)(parsed, "annotate");
|
|
12
|
+
const pressEscape = (0, utils_1.getFlagBoolean)(parsed, "press-escape");
|
|
13
|
+
if (!inputPath) {
|
|
14
|
+
throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-agent-browser screenshot <path> [--annotate] [--press-escape] [--session <sessionId>]", 400);
|
|
15
|
+
}
|
|
16
|
+
const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
|
|
17
|
+
const targetPath = (0, utils_1.ensureAbsolutePath)(context.cwd, inputPath);
|
|
18
|
+
const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/screenshot`, { path: targetPath, annotate, pressEscape });
|
|
19
|
+
const annotated = response.annotated ? " annotated=yes" : "";
|
|
20
|
+
const escaped = response.pressedEscape ? " escape=yes" : "";
|
|
21
|
+
context.stdout.write(`screenshot=${response.path} session=${response.sessionId}${annotated}${escaped}\n`);
|
|
22
|
+
}
|