gologin-agent-browser-cli 0.1.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.

Potentially problematic release.


This version of gologin-agent-browser-cli might be problematic. Click here for more details.

Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +220 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +352 -0
  5. package/dist/commands/check.d.ts +2 -0
  6. package/dist/commands/check.js +17 -0
  7. package/dist/commands/click.d.ts +2 -0
  8. package/dist/commands/click.js +17 -0
  9. package/dist/commands/close.d.ts +2 -0
  10. package/dist/commands/close.js +12 -0
  11. package/dist/commands/current.d.ts +2 -0
  12. package/dist/commands/current.js +9 -0
  13. package/dist/commands/dblclick.d.ts +2 -0
  14. package/dist/commands/dblclick.js +17 -0
  15. package/dist/commands/fill.d.ts +2 -0
  16. package/dist/commands/fill.js +18 -0
  17. package/dist/commands/find.d.ts +2 -0
  18. package/dist/commands/find.js +86 -0
  19. package/dist/commands/focus.d.ts +2 -0
  20. package/dist/commands/focus.js +17 -0
  21. package/dist/commands/get.d.ts +2 -0
  22. package/dist/commands/get.js +19 -0
  23. package/dist/commands/hover.d.ts +2 -0
  24. package/dist/commands/hover.js +17 -0
  25. package/dist/commands/open.d.ts +2 -0
  26. package/dist/commands/open.js +67 -0
  27. package/dist/commands/pdf.d.ts +2 -0
  28. package/dist/commands/pdf.js +18 -0
  29. package/dist/commands/press.d.ts +2 -0
  30. package/dist/commands/press.js +19 -0
  31. package/dist/commands/screenshot.d.ts +2 -0
  32. package/dist/commands/screenshot.js +20 -0
  33. package/dist/commands/scroll.d.ts +2 -0
  34. package/dist/commands/scroll.js +25 -0
  35. package/dist/commands/scrollIntoView.d.ts +2 -0
  36. package/dist/commands/scrollIntoView.js +17 -0
  37. package/dist/commands/select.d.ts +2 -0
  38. package/dist/commands/select.js +18 -0
  39. package/dist/commands/sessions.d.ts +2 -0
  40. package/dist/commands/sessions.js +15 -0
  41. package/dist/commands/shared.d.ts +3 -0
  42. package/dist/commands/shared.js +13 -0
  43. package/dist/commands/snapshot.d.ts +2 -0
  44. package/dist/commands/snapshot.js +16 -0
  45. package/dist/commands/type.d.ts +2 -0
  46. package/dist/commands/type.js +18 -0
  47. package/dist/commands/uncheck.d.ts +2 -0
  48. package/dist/commands/uncheck.js +17 -0
  49. package/dist/commands/upload.d.ts +2 -0
  50. package/dist/commands/upload.js +18 -0
  51. package/dist/commands/wait.d.ts +2 -0
  52. package/dist/commands/wait.js +41 -0
  53. package/dist/daemon/browser.d.ts +37 -0
  54. package/dist/daemon/browser.js +557 -0
  55. package/dist/daemon/refStore.d.ts +9 -0
  56. package/dist/daemon/refStore.js +26 -0
  57. package/dist/daemon/server.d.ts +1 -0
  58. package/dist/daemon/server.js +235 -0
  59. package/dist/daemon/sessionManager.d.ts +50 -0
  60. package/dist/daemon/sessionManager.js +512 -0
  61. package/dist/daemon/snapshot.d.ts +8 -0
  62. package/dist/daemon/snapshot.js +285 -0
  63. package/dist/lib/config.d.ts +3 -0
  64. package/dist/lib/config.js +58 -0
  65. package/dist/lib/errors.d.ts +12 -0
  66. package/dist/lib/errors.js +63 -0
  67. package/dist/lib/types.d.ts +301 -0
  68. package/dist/lib/types.js +2 -0
  69. package/dist/lib/utils.d.ts +27 -0
  70. package/dist/lib/utils.js +165 -0
  71. package/examples/agent-flow.sh +19 -0
  72. package/package.json +59 -0
@@ -0,0 +1,235 @@
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
+ const node_http_1 = __importDefault(require("node:http"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const config_1 = require("../lib/config");
9
+ const errors_1 = require("../lib/errors");
10
+ const utils_1 = require("../lib/utils");
11
+ const sessionManager_1 = require("./sessionManager");
12
+ const config = (0, config_1.loadConfig)();
13
+ (0, config_1.ensureStateDir)(config);
14
+ const sessionManager = new sessionManager_1.SessionManager(config);
15
+ const activeServers = [];
16
+ function logInfo(message) {
17
+ (0, utils_1.appendLog)(config.logPath, `[INFO] ${message}`);
18
+ }
19
+ function logError(message, error) {
20
+ const suffix = error instanceof Error ? ` ${error.stack ?? error.message}` : error ? ` ${String(error)}` : "";
21
+ (0, utils_1.appendLog)(config.logPath, `[ERROR] ${message}${suffix}`);
22
+ }
23
+ function matchSessionRoute(pathname, suffix) {
24
+ const match = pathname.match(new RegExp(`^/sessions/([^/]+)/${suffix}$`));
25
+ return match?.[1];
26
+ }
27
+ async function handleRequest(request, response) {
28
+ try {
29
+ const method = request.method ?? "GET";
30
+ const url = new URL(request.url ?? "/", "http://127.0.0.1");
31
+ const pathname = url.pathname;
32
+ if (method === "GET" && pathname === "/health") {
33
+ const payload = {
34
+ ok: true,
35
+ pid: process.pid,
36
+ transports: process.platform === "win32" ? ["http"] : ["socket", "http"]
37
+ };
38
+ (0, utils_1.writeJsonResponse)(response, 200, payload);
39
+ return;
40
+ }
41
+ if (method === "GET" && pathname === "/sessions") {
42
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.listSessions());
43
+ return;
44
+ }
45
+ if (method === "GET" && pathname === "/sessions/current") {
46
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.currentSession());
47
+ return;
48
+ }
49
+ if (method === "POST" && pathname === "/sessions/open") {
50
+ const body = (await (0, utils_1.readJsonBody)(request));
51
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.open(body));
52
+ return;
53
+ }
54
+ const snapshotSessionId = matchSessionRoute(pathname, "snapshot");
55
+ if (method === "POST" && snapshotSessionId) {
56
+ const body = (await (0, utils_1.readJsonBody)(request));
57
+ const payload = await sessionManager.snapshot(snapshotSessionId, body?.interactive === true);
58
+ (0, utils_1.writeJsonResponse)(response, 200, payload);
59
+ return;
60
+ }
61
+ const clickSessionId = matchSessionRoute(pathname, "click");
62
+ if (method === "POST" && clickSessionId) {
63
+ const body = (await (0, utils_1.readJsonBody)(request));
64
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.click(clickSessionId, body.target));
65
+ return;
66
+ }
67
+ const typeSessionId = matchSessionRoute(pathname, "type");
68
+ if (method === "POST" && typeSessionId) {
69
+ const body = (await (0, utils_1.readJsonBody)(request));
70
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.type(typeSessionId, body.target, body.text));
71
+ return;
72
+ }
73
+ const fillSessionId = matchSessionRoute(pathname, "fill");
74
+ if (method === "POST" && fillSessionId) {
75
+ const body = (await (0, utils_1.readJsonBody)(request));
76
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.fill(fillSessionId, body.target, body.text));
77
+ return;
78
+ }
79
+ const hoverSessionId = matchSessionRoute(pathname, "hover");
80
+ if (method === "POST" && hoverSessionId) {
81
+ const body = (await (0, utils_1.readJsonBody)(request));
82
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.hover(hoverSessionId, body.target));
83
+ return;
84
+ }
85
+ const focusSessionId = matchSessionRoute(pathname, "focus");
86
+ if (method === "POST" && focusSessionId) {
87
+ const body = (await (0, utils_1.readJsonBody)(request));
88
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.focus(focusSessionId, body.target));
89
+ return;
90
+ }
91
+ const doubleClickSessionId = matchSessionRoute(pathname, "dblclick");
92
+ if (method === "POST" && doubleClickSessionId) {
93
+ const body = (await (0, utils_1.readJsonBody)(request));
94
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.doubleClick(doubleClickSessionId, body.target));
95
+ return;
96
+ }
97
+ const selectSessionId = matchSessionRoute(pathname, "select");
98
+ if (method === "POST" && selectSessionId) {
99
+ const body = (await (0, utils_1.readJsonBody)(request));
100
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.select(selectSessionId, body.target, body.value));
101
+ return;
102
+ }
103
+ const checkSessionId = matchSessionRoute(pathname, "check");
104
+ if (method === "POST" && checkSessionId) {
105
+ const body = (await (0, utils_1.readJsonBody)(request));
106
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.check(checkSessionId, body.target));
107
+ return;
108
+ }
109
+ const uncheckSessionId = matchSessionRoute(pathname, "uncheck");
110
+ if (method === "POST" && uncheckSessionId) {
111
+ const body = (await (0, utils_1.readJsonBody)(request));
112
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.uncheck(uncheckSessionId, body.target));
113
+ return;
114
+ }
115
+ const pressSessionId = matchSessionRoute(pathname, "press");
116
+ if (method === "POST" && pressSessionId) {
117
+ const body = (await (0, utils_1.readJsonBody)(request));
118
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.press(pressSessionId, body.key, body.target));
119
+ return;
120
+ }
121
+ const waitSessionId = matchSessionRoute(pathname, "wait");
122
+ if (method === "POST" && waitSessionId) {
123
+ const body = (await (0, utils_1.readJsonBody)(request));
124
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.wait(waitSessionId, body));
125
+ return;
126
+ }
127
+ const scrollSessionId = matchSessionRoute(pathname, "scroll");
128
+ if (method === "POST" && scrollSessionId) {
129
+ const body = (await (0, utils_1.readJsonBody)(request));
130
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.scroll(scrollSessionId, body.direction, body.pixels, body.target));
131
+ return;
132
+ }
133
+ const scrollIntoViewSessionId = matchSessionRoute(pathname, "scrollintoview");
134
+ if (method === "POST" && scrollIntoViewSessionId) {
135
+ const body = (await (0, utils_1.readJsonBody)(request));
136
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.scrollIntoView(scrollIntoViewSessionId, body.target));
137
+ return;
138
+ }
139
+ const getSessionId = matchSessionRoute(pathname, "get");
140
+ if (method === "POST" && getSessionId) {
141
+ const body = (await (0, utils_1.readJsonBody)(request));
142
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.get(getSessionId, body.kind, body.target));
143
+ return;
144
+ }
145
+ const findSessionId = matchSessionRoute(pathname, "find");
146
+ if (method === "POST" && findSessionId) {
147
+ const body = (await (0, utils_1.readJsonBody)(request));
148
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.find(findSessionId, body));
149
+ return;
150
+ }
151
+ const screenshotSessionId = matchSessionRoute(pathname, "screenshot");
152
+ if (method === "POST" && screenshotSessionId) {
153
+ const body = (await (0, utils_1.readJsonBody)(request));
154
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.screenshot(screenshotSessionId, body.path, body.annotate === true));
155
+ return;
156
+ }
157
+ const uploadSessionId = matchSessionRoute(pathname, "upload");
158
+ if (method === "POST" && uploadSessionId) {
159
+ const body = (await (0, utils_1.readJsonBody)(request));
160
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.upload(uploadSessionId, body.target, body.files));
161
+ return;
162
+ }
163
+ const pdfSessionId = matchSessionRoute(pathname, "pdf");
164
+ if (method === "POST" && pdfSessionId) {
165
+ const body = (await (0, utils_1.readJsonBody)(request));
166
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.pdf(pdfSessionId, body.path));
167
+ return;
168
+ }
169
+ const closeSessionId = matchSessionRoute(pathname, "close");
170
+ if (method === "POST" && closeSessionId) {
171
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.close(closeSessionId));
172
+ return;
173
+ }
174
+ throw new errors_1.AppError("BAD_REQUEST", `Unsupported route ${method} ${pathname}`, 404);
175
+ }
176
+ catch (error) {
177
+ const payload = (0, errors_1.serializeError)(error);
178
+ logError(`Request failed for ${request.method} ${request.url}`, error);
179
+ (0, utils_1.writeJsonResponse)(response, payload.status, payload);
180
+ }
181
+ }
182
+ function createServer() {
183
+ return node_http_1.default.createServer((request, response) => {
184
+ handleRequest(request, response).catch((error) => {
185
+ const payload = (0, errors_1.serializeError)(error);
186
+ logError("Unhandled request failure", error);
187
+ (0, utils_1.writeJsonResponse)(response, payload.status, payload);
188
+ });
189
+ });
190
+ }
191
+ async function startServers() {
192
+ if (process.platform !== "win32" && node_fs_1.default.existsSync(config.socketPath)) {
193
+ node_fs_1.default.unlinkSync(config.socketPath);
194
+ }
195
+ if (process.platform !== "win32") {
196
+ const socketServer = createServer();
197
+ activeServers.push(socketServer);
198
+ await new Promise((resolve, reject) => {
199
+ socketServer.once("error", reject);
200
+ socketServer.listen(config.socketPath, () => resolve());
201
+ });
202
+ logInfo(`Socket server listening at ${config.socketPath}`);
203
+ }
204
+ const httpServer = createServer();
205
+ activeServers.push(httpServer);
206
+ await new Promise((resolve, reject) => {
207
+ httpServer.once("error", reject);
208
+ httpServer.listen(config.daemonPort, config.daemonHost, () => resolve());
209
+ });
210
+ logInfo(`HTTP server listening at http://${config.daemonHost}:${config.daemonPort}`);
211
+ }
212
+ async function shutdown(signal) {
213
+ logInfo(`Received ${signal}, shutting down`);
214
+ await sessionManager.closeAll();
215
+ await Promise.all(activeServers.map((server) => new Promise((resolve) => {
216
+ server.close(() => resolve());
217
+ })));
218
+ if (process.platform !== "win32" && node_fs_1.default.existsSync(config.socketPath)) {
219
+ node_fs_1.default.unlinkSync(config.socketPath);
220
+ }
221
+ }
222
+ process.on("SIGINT", () => {
223
+ shutdown("SIGINT").finally(() => process.exit(0));
224
+ });
225
+ process.on("SIGTERM", () => {
226
+ shutdown("SIGTERM").finally(() => process.exit(0));
227
+ });
228
+ startServers()
229
+ .then(() => {
230
+ logInfo("GoLogin Agent daemon started");
231
+ })
232
+ .catch((error) => {
233
+ logError("Failed to start daemon", error);
234
+ process.exit(1);
235
+ });
@@ -0,0 +1,50 @@
1
+ import type { AgentConfig, CheckResponse, ClickResponse, CloseSessionResponse, DoubleClickResponse, FillResponse, FindRequest, FindResponse, FocusResponse, GetKind, GetResponse, HoverResponse, OpenSessionRequest, OpenSessionResponse, PdfResponse, PressResponse, ScrollDirection, ScrollIntoViewResponse, ScrollResponse, ScreenshotResponse, SelectResponse, SessionSummary, SessionsResponse, SnapshotResponse, TypeResponse, UncheckResponse, UploadResponse, WaitResponse } from "../lib/types";
2
+ export declare class SessionManager {
3
+ private readonly config;
4
+ private readonly sessions;
5
+ private activeSessionId?;
6
+ private readonly refStore;
7
+ constructor(config: AgentConfig);
8
+ private nowIso;
9
+ private requireToken;
10
+ private sessionExpired;
11
+ private destroySession;
12
+ private getSessionOrThrow;
13
+ private evictExpiredSessions;
14
+ private toSummary;
15
+ private touchSession;
16
+ private markSessionState;
17
+ private validateIdleTimeout;
18
+ private resolveTargetLocator;
19
+ private runTargetAction;
20
+ open(request: OpenSessionRequest): Promise<OpenSessionResponse>;
21
+ snapshot(sessionId?: string, interactive?: boolean): Promise<SnapshotResponse>;
22
+ click(sessionId: string | undefined, target: string): Promise<ClickResponse>;
23
+ type(sessionId: string | undefined, target: string, text: string): Promise<TypeResponse>;
24
+ fill(sessionId: string | undefined, target: string, text: string): Promise<FillResponse>;
25
+ hover(sessionId: string | undefined, target: string): Promise<HoverResponse>;
26
+ focus(sessionId: string | undefined, target: string): Promise<FocusResponse>;
27
+ doubleClick(sessionId: string | undefined, target: string): Promise<DoubleClickResponse>;
28
+ select(sessionId: string | undefined, target: string, value: string): Promise<SelectResponse>;
29
+ check(sessionId: string | undefined, target: string): Promise<CheckResponse>;
30
+ uncheck(sessionId: string | undefined, target: string): Promise<UncheckResponse>;
31
+ press(sessionId: string | undefined, key: string, target?: string): Promise<PressResponse>;
32
+ scroll(sessionId: string | undefined, direction: ScrollDirection, pixels?: number, target?: string): Promise<ScrollResponse>;
33
+ scrollIntoView(sessionId: string | undefined, target: string): Promise<ScrollIntoViewResponse>;
34
+ upload(sessionId: string | undefined, target: string, files: string[]): Promise<UploadResponse>;
35
+ wait(sessionId: string | undefined, request: {
36
+ target?: string;
37
+ text?: string;
38
+ urlPattern?: string;
39
+ loadState?: "load" | "domcontentloaded" | "networkidle";
40
+ timeoutMs?: number;
41
+ }): Promise<WaitResponse>;
42
+ get(sessionId: string | undefined, kind: GetKind, target?: string): Promise<GetResponse>;
43
+ find(sessionId: string | undefined, request: FindRequest): Promise<FindResponse>;
44
+ screenshot(sessionId: string | undefined, targetPath: string, annotate?: boolean): Promise<ScreenshotResponse>;
45
+ pdf(sessionId: string | undefined, targetPath: string): Promise<PdfResponse>;
46
+ close(sessionId?: string): Promise<CloseSessionResponse>;
47
+ listSessions(): Promise<SessionsResponse>;
48
+ currentSession(): Promise<SessionSummary>;
49
+ closeAll(): Promise<void>;
50
+ }