gologin-web-access 0.3.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.
Files changed (141) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +344 -0
  4. package/dist/cli.js +173 -0
  5. package/dist/commands/back.js +13 -0
  6. package/dist/commands/batch.js +81 -0
  7. package/dist/commands/batchChangeTrack.js +99 -0
  8. package/dist/commands/batchExtract.js +97 -0
  9. package/dist/commands/batchScrape.js +140 -0
  10. package/dist/commands/changeTrack.js +65 -0
  11. package/dist/commands/check.js +14 -0
  12. package/dist/commands/click.js +14 -0
  13. package/dist/commands/close.js +19 -0
  14. package/dist/commands/configInit.js +77 -0
  15. package/dist/commands/configShow.js +23 -0
  16. package/dist/commands/cookies.js +22 -0
  17. package/dist/commands/cookiesClear.js +13 -0
  18. package/dist/commands/cookiesImport.js +14 -0
  19. package/dist/commands/crawl.js +71 -0
  20. package/dist/commands/crawlErrors.js +20 -0
  21. package/dist/commands/crawlResult.js +27 -0
  22. package/dist/commands/crawlStart.js +56 -0
  23. package/dist/commands/crawlStatus.js +25 -0
  24. package/dist/commands/current.js +14 -0
  25. package/dist/commands/dblclick.js +14 -0
  26. package/dist/commands/eval.js +20 -0
  27. package/dist/commands/extract.js +44 -0
  28. package/dist/commands/fill.js +15 -0
  29. package/dist/commands/find.js +16 -0
  30. package/dist/commands/focus.js +14 -0
  31. package/dist/commands/forward.js +13 -0
  32. package/dist/commands/get.js +15 -0
  33. package/dist/commands/hover.js +14 -0
  34. package/dist/commands/jobs.js +47 -0
  35. package/dist/commands/map.js +61 -0
  36. package/dist/commands/open.js +22 -0
  37. package/dist/commands/parseDocument.js +34 -0
  38. package/dist/commands/pdf.js +14 -0
  39. package/dist/commands/press.js +15 -0
  40. package/dist/commands/read.js +51 -0
  41. package/dist/commands/reload.js +13 -0
  42. package/dist/commands/run.js +76 -0
  43. package/dist/commands/scrape.js +19 -0
  44. package/dist/commands/scrapeJson.js +24 -0
  45. package/dist/commands/scrapeMarkdown.js +37 -0
  46. package/dist/commands/scrapeScreenshot.js +65 -0
  47. package/dist/commands/scrapeText.js +37 -0
  48. package/dist/commands/screenshot.js +23 -0
  49. package/dist/commands/scroll.js +23 -0
  50. package/dist/commands/scrollIntoView.js +14 -0
  51. package/dist/commands/search.js +39 -0
  52. package/dist/commands/searchBrowser.js +28 -0
  53. package/dist/commands/select.js +15 -0
  54. package/dist/commands/sessions.js +14 -0
  55. package/dist/commands/shared.js +102 -0
  56. package/dist/commands/snapshot.js +18 -0
  57. package/dist/commands/storageClear.js +18 -0
  58. package/dist/commands/storageExport.js +26 -0
  59. package/dist/commands/storageImport.js +23 -0
  60. package/dist/commands/tabClose.js +18 -0
  61. package/dist/commands/tabFocus.js +15 -0
  62. package/dist/commands/tabOpen.js +19 -0
  63. package/dist/commands/tabs.js +13 -0
  64. package/dist/commands/type.js +15 -0
  65. package/dist/commands/uncheck.js +14 -0
  66. package/dist/commands/upload.js +15 -0
  67. package/dist/commands/wait.js +27 -0
  68. package/dist/config.js +260 -0
  69. package/dist/doctor.js +86 -0
  70. package/dist/internal-agent/cli.js +336 -0
  71. package/dist/internal-agent/commands/back.js +12 -0
  72. package/dist/internal-agent/commands/check.js +17 -0
  73. package/dist/internal-agent/commands/click.js +17 -0
  74. package/dist/internal-agent/commands/close.js +12 -0
  75. package/dist/internal-agent/commands/cookies.js +23 -0
  76. package/dist/internal-agent/commands/cookiesClear.js +12 -0
  77. package/dist/internal-agent/commands/cookiesImport.js +18 -0
  78. package/dist/internal-agent/commands/current.js +9 -0
  79. package/dist/internal-agent/commands/dblclick.js +17 -0
  80. package/dist/internal-agent/commands/doctor.js +53 -0
  81. package/dist/internal-agent/commands/eval.js +30 -0
  82. package/dist/internal-agent/commands/fill.js +18 -0
  83. package/dist/internal-agent/commands/find.js +86 -0
  84. package/dist/internal-agent/commands/focus.js +17 -0
  85. package/dist/internal-agent/commands/forward.js +12 -0
  86. package/dist/internal-agent/commands/get.js +19 -0
  87. package/dist/internal-agent/commands/hover.js +17 -0
  88. package/dist/internal-agent/commands/open.js +67 -0
  89. package/dist/internal-agent/commands/pdf.js +18 -0
  90. package/dist/internal-agent/commands/press.js +19 -0
  91. package/dist/internal-agent/commands/reload.js +12 -0
  92. package/dist/internal-agent/commands/screenshot.js +22 -0
  93. package/dist/internal-agent/commands/scroll.js +25 -0
  94. package/dist/internal-agent/commands/scrollIntoView.js +17 -0
  95. package/dist/internal-agent/commands/select.js +18 -0
  96. package/dist/internal-agent/commands/sessions.js +15 -0
  97. package/dist/internal-agent/commands/shared.js +51 -0
  98. package/dist/internal-agent/commands/snapshot.js +16 -0
  99. package/dist/internal-agent/commands/storageClear.js +13 -0
  100. package/dist/internal-agent/commands/storageExport.js +24 -0
  101. package/dist/internal-agent/commands/storageImport.js +20 -0
  102. package/dist/internal-agent/commands/tabClose.js +21 -0
  103. package/dist/internal-agent/commands/tabFocus.js +21 -0
  104. package/dist/internal-agent/commands/tabOpen.js +13 -0
  105. package/dist/internal-agent/commands/tabs.js +17 -0
  106. package/dist/internal-agent/commands/type.js +18 -0
  107. package/dist/internal-agent/commands/uncheck.js +17 -0
  108. package/dist/internal-agent/commands/upload.js +18 -0
  109. package/dist/internal-agent/commands/wait.js +41 -0
  110. package/dist/internal-agent/daemon/browser.js +818 -0
  111. package/dist/internal-agent/daemon/refStore.js +26 -0
  112. package/dist/internal-agent/daemon/server.js +330 -0
  113. package/dist/internal-agent/daemon/sessionManager.js +684 -0
  114. package/dist/internal-agent/daemon/snapshot.js +285 -0
  115. package/dist/internal-agent/lib/config.js +59 -0
  116. package/dist/internal-agent/lib/daemon.js +300 -0
  117. package/dist/internal-agent/lib/errors.js +63 -0
  118. package/dist/internal-agent/lib/types.js +2 -0
  119. package/dist/internal-agent/lib/utils.js +165 -0
  120. package/dist/jobRunner.js +56 -0
  121. package/dist/lib/agentCli.js +158 -0
  122. package/dist/lib/browserRead.js +125 -0
  123. package/dist/lib/browserStructured.js +77 -0
  124. package/dist/lib/changeTracking.js +117 -0
  125. package/dist/lib/cloudApi.js +41 -0
  126. package/dist/lib/concurrency.js +15 -0
  127. package/dist/lib/crawl.js +313 -0
  128. package/dist/lib/document.js +170 -0
  129. package/dist/lib/errors.js +55 -0
  130. package/dist/lib/extract.js +65 -0
  131. package/dist/lib/extractRunner.js +22 -0
  132. package/dist/lib/jobRegistry.js +164 -0
  133. package/dist/lib/output.js +122 -0
  134. package/dist/lib/readSource.js +297 -0
  135. package/dist/lib/runbooks.js +193 -0
  136. package/dist/lib/search.js +727 -0
  137. package/dist/lib/selfCli.js +136 -0
  138. package/dist/lib/structuredScrape.js +83 -0
  139. package/dist/lib/types.js +2 -0
  140. package/dist/lib/unlocker.js +383 -0
  141. package/package.json +67 -0
@@ -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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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-web-access 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
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runScrollCommand = runScrollCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ const SCROLL_DIRECTIONS = new Set(["up", "down", "left", "right"]);
8
+ async function runScrollCommand(context, argv) {
9
+ const parsed = (0, utils_1.parseArgs)(argv);
10
+ const direction = parsed.positional[0];
11
+ const maybePixels = parsed.positional[1];
12
+ const target = (0, utils_1.getFlagString)(parsed, "target");
13
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
14
+ if (!direction || !SCROLL_DIRECTIONS.has(direction)) {
15
+ throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-web-access scroll <up|down|left|right> [pixels] [--target <target>] [--session <sessionId>]", 400);
16
+ }
17
+ if (maybePixels && !(0, utils_1.isNumericToken)(maybePixels)) {
18
+ throw new errors_1.AppError("BAD_REQUEST", "scroll pixels must be a number", 400);
19
+ }
20
+ const pixels = maybePixels ? Number(maybePixels) : undefined;
21
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
22
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/scroll`, { direction, pixels, target });
23
+ const targetSuffix = response.target ? ` target=${response.target}` : "";
24
+ context.stdout.write(`scrolled direction=${response.direction} pixels=${response.pixels}${targetSuffix} session=${response.sessionId} url=${response.url}\n`);
25
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runScrollIntoViewCommand = runScrollIntoViewCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runScrollIntoViewCommand(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-web-access scrollintoview <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}/scrollintoview`, { target });
16
+ (0, shared_1.writeActionResult)(context, "scrolled-into-view", target, response);
17
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSelectCommand = runSelectCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runSelectCommand(context, argv) {
8
+ const parsed = (0, utils_1.parseArgs)(argv);
9
+ const target = parsed.positional[0];
10
+ const value = parsed.positional.slice(1).join(" ");
11
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
12
+ if (!target || !value) {
13
+ throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-web-access select <target> <value> [--session <sessionId>]", 400);
14
+ }
15
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
16
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/select`, { target, value });
17
+ (0, shared_1.writeActionResult)(context, "selected", target, response);
18
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSessionsCommand = runSessionsCommand;
4
+ const utils_1 = require("../lib/utils");
5
+ async function runSessionsCommand(context, argv) {
6
+ (0, utils_1.parseArgs)(argv);
7
+ const response = await context.client.request("GET", "/sessions");
8
+ if (response.sessions.length === 0) {
9
+ context.stdout.write("no sessions\n");
10
+ return;
11
+ }
12
+ for (const session of response.sessions) {
13
+ context.stdout.write(`${(0, utils_1.formatSessionLine)(session)}\n`);
14
+ }
15
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveSessionId = resolveSessionId;
7
+ exports.writeActionResult = writeActionResult;
8
+ exports.parseStorageScope = parseStorageScope;
9
+ exports.readJsonFile = readJsonFile;
10
+ exports.writeJsonFile = writeJsonFile;
11
+ exports.writeJsonStdout = writeJsonStdout;
12
+ const node_fs_1 = __importDefault(require("node:fs"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ const errors_1 = require("../lib/errors");
15
+ const utils_1 = require("../lib/utils");
16
+ async function resolveSessionId(context, explicitSessionId) {
17
+ if (explicitSessionId) {
18
+ return explicitSessionId;
19
+ }
20
+ return (await context.client.request("GET", "/sessions/current")).sessionId;
21
+ }
22
+ function writeActionResult(context, verb, target, response) {
23
+ context.stdout.write(`${verb} target=${target} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
24
+ }
25
+ function parseStorageScope(value) {
26
+ if (!value) {
27
+ return undefined;
28
+ }
29
+ if (value === "local" || value === "session" || value === "both") {
30
+ return value;
31
+ }
32
+ throw new errors_1.AppError("BAD_REQUEST", "--scope must be one of local, session, or both", 400);
33
+ }
34
+ function readJsonFile(context, targetPath) {
35
+ const absolutePath = (0, utils_1.ensureAbsolutePath)(context.cwd, targetPath);
36
+ try {
37
+ return JSON.parse(node_fs_1.default.readFileSync(absolutePath, "utf8"));
38
+ }
39
+ catch (error) {
40
+ throw new errors_1.AppError("BAD_REQUEST", `Failed to read JSON file ${absolutePath}: ${error instanceof Error ? error.message : String(error)}`, 400);
41
+ }
42
+ }
43
+ function writeJsonFile(context, targetPath, payload) {
44
+ const absolutePath = (0, utils_1.ensureAbsolutePath)(context.cwd, targetPath);
45
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(absolutePath), { recursive: true });
46
+ node_fs_1.default.writeFileSync(absolutePath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
47
+ return absolutePath;
48
+ }
49
+ function writeJsonStdout(context, payload) {
50
+ context.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
51
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSnapshotCommand = runSnapshotCommand;
4
+ const utils_1 = require("../lib/utils");
5
+ async function runSnapshotCommand(context, argv) {
6
+ const parsed = (0, utils_1.parseArgs)(argv);
7
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
8
+ const interactive = (0, utils_1.getFlagBoolean)(parsed, "interactive");
9
+ const resolvedSessionId = sessionId ??
10
+ (await context.client.request("GET", "/sessions/current")).sessionId;
11
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/snapshot`, interactive ? { interactive: true } : {});
12
+ context.stdout.write(`session=${response.sessionId} url=${response.url}\n`);
13
+ for (const item of response.items) {
14
+ context.stdout.write(`${(0, utils_1.formatSnapshotItem)(item)}\n`);
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runStorageClearCommand = runStorageClearCommand;
4
+ const utils_1 = require("../lib/utils");
5
+ const shared_1 = require("./shared");
6
+ async function runStorageClearCommand(context, argv) {
7
+ const parsed = (0, utils_1.parseArgs)(argv);
8
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
9
+ const scope = (0, shared_1.parseStorageScope)((0, utils_1.getFlagString)(parsed, "scope"));
10
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
11
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/storage-clear`, { scope });
12
+ context.stdout.write(`origin=${response.origin} scope=${response.scope} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
13
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runStorageExportCommand = runStorageExportCommand;
4
+ const utils_1 = require("../lib/utils");
5
+ const shared_1 = require("./shared");
6
+ async function runStorageExportCommand(context, argv) {
7
+ const parsed = (0, utils_1.parseArgs)(argv);
8
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
9
+ const outputPath = parsed.positional[0];
10
+ const json = (0, utils_1.getFlagBoolean)(parsed, "json");
11
+ const scope = (0, shared_1.parseStorageScope)((0, utils_1.getFlagString)(parsed, "scope"));
12
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
13
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/storage-export`, { scope });
14
+ if (outputPath) {
15
+ const savedPath = (0, shared_1.writeJsonFile)(context, outputPath, response.state);
16
+ context.stdout.write(`${savedPath}\n`);
17
+ return;
18
+ }
19
+ if (json) {
20
+ (0, shared_1.writeJsonStdout)(context, response.state);
21
+ return;
22
+ }
23
+ context.stdout.write(`${JSON.stringify(response.state, null, 2)}\n`);
24
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runStorageImportCommand = runStorageImportCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runStorageImportCommand(context, argv) {
8
+ const parsed = (0, utils_1.parseArgs)(argv);
9
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
10
+ const storagePath = parsed.positional[0];
11
+ const scope = (0, shared_1.parseStorageScope)((0, utils_1.getFlagString)(parsed, "scope"));
12
+ const clear = (0, utils_1.getFlagBoolean)(parsed, "clear");
13
+ if (!storagePath) {
14
+ throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-web-access storage-import <storage.json> [--scope <local|session|both>] [--clear] [--session <sessionId>]", 400);
15
+ }
16
+ const state = (0, shared_1.readJsonFile)(context, storagePath);
17
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
18
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/storage-import`, { state, scope, clear });
19
+ context.stdout.write(`origin=${response.origin} localKeys=${response.localKeys} sessionKeys=${response.sessionKeys} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
20
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTabCloseCommand = runTabCloseCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runTabCloseCommand(context, argv) {
8
+ const parsed = (0, utils_1.parseArgs)(argv);
9
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
10
+ const rawIndex = parsed.positional[0];
11
+ let index;
12
+ if (rawIndex !== undefined) {
13
+ index = Number(rawIndex);
14
+ if (!Number.isInteger(index) || index <= 0) {
15
+ throw new errors_1.AppError("BAD_REQUEST", "tab index must be a positive integer", 400);
16
+ }
17
+ }
18
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
19
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/tabclose`, { index });
20
+ context.stdout.write(`closedTab=${response.closedTabIndex} activeTab=${response.activeTabIndex} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
21
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTabFocusCommand = runTabFocusCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runTabFocusCommand(context, argv) {
8
+ const parsed = (0, utils_1.parseArgs)(argv);
9
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
10
+ const rawIndex = parsed.positional[0];
11
+ if (!rawIndex) {
12
+ throw new errors_1.AppError("BAD_REQUEST", "Usage: gologin-web-access tabfocus <index> [--session <sessionId>]", 400);
13
+ }
14
+ const index = Number(rawIndex);
15
+ if (!Number.isInteger(index) || index <= 0) {
16
+ throw new errors_1.AppError("BAD_REQUEST", "tab index must be a positive integer", 400);
17
+ }
18
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
19
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/tabfocus`, { index });
20
+ context.stdout.write(`tab=${response.tabIndex} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
21
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTabOpenCommand = runTabOpenCommand;
4
+ const utils_1 = require("../lib/utils");
5
+ const shared_1 = require("./shared");
6
+ async function runTabOpenCommand(context, argv) {
7
+ const parsed = (0, utils_1.parseArgs)(argv);
8
+ const sessionId = (0, utils_1.getFlagString)(parsed, "session");
9
+ const url = parsed.positional[0];
10
+ const resolvedSessionId = await (0, shared_1.resolveSessionId)(context, sessionId);
11
+ const response = await context.client.request("POST", `/sessions/${resolvedSessionId}/tabopen`, { url });
12
+ context.stdout.write(`tab=${response.tabIndex} session=${response.sessionId} url=${response.url} snapshot=${response.staleSnapshot ? "stale" : "fresh"}\n`);
13
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTabsCommand = runTabsCommand;
4
+ const utils_1 = require("../lib/utils");
5
+ const shared_1 = require("./shared");
6
+ async function runTabsCommand(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("GET", `/sessions/${resolvedSessionId}/tabs`);
11
+ context.stdout.write(`session=${response.sessionId} tabs=${response.tabs.length}\n`);
12
+ for (const tab of response.tabs) {
13
+ const prefix = tab.active ? "*" : "-";
14
+ const title = tab.title ? ` title=${JSON.stringify(tab.title)}` : "";
15
+ context.stdout.write(`${prefix} tab=${tab.index} url=${tab.url}${title}\n`);
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTypeCommand = runTypeCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runTypeCommand(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-web-access type <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}/type`, { target, text });
17
+ (0, shared_1.writeActionResult)(context, "typed", target, response);
18
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runUncheckCommand = runUncheckCommand;
4
+ const errors_1 = require("../lib/errors");
5
+ const utils_1 = require("../lib/utils");
6
+ const shared_1 = require("./shared");
7
+ async function runUncheckCommand(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-web-access uncheck <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}/uncheck`, { target });
16
+ (0, shared_1.writeActionResult)(context, "unchecked", target, response);
17
+ }