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,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RefStore = void 0;
4
+ class RefStore {
5
+ store = new Map();
6
+ set(sessionId, refs) {
7
+ const map = new Map();
8
+ for (const descriptor of refs) {
9
+ map.set(descriptor.ref, descriptor);
10
+ }
11
+ this.store.set(sessionId, map);
12
+ }
13
+ get(sessionId, ref) {
14
+ return this.store.get(sessionId)?.get(ref);
15
+ }
16
+ list(sessionId) {
17
+ return Array.from(this.store.get(sessionId)?.values() ?? []);
18
+ }
19
+ clear(sessionId) {
20
+ this.store.delete(sessionId);
21
+ }
22
+ has(sessionId) {
23
+ return this.store.has(sessionId);
24
+ }
25
+ }
26
+ exports.RefStore = RefStore;
@@ -0,0 +1,330 @@
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 node_path_1 = __importDefault(require("node:path"));
9
+ const config_1 = require("../lib/config");
10
+ const errors_1 = require("../lib/errors");
11
+ const utils_1 = require("../lib/utils");
12
+ const sessionManager_1 = require("./sessionManager");
13
+ const config = (0, config_1.loadConfig)();
14
+ (0, config_1.ensureStateDir)(config);
15
+ const sessionManager = new sessionManager_1.SessionManager(config);
16
+ const activeServers = [];
17
+ const daemonProjectRoot = node_path_1.default.resolve(__dirname, "..", "..", "..");
18
+ const daemonVersion = readPackageVersion(daemonProjectRoot);
19
+ const daemonStartedAt = new Date().toISOString();
20
+ function logInfo(message) {
21
+ (0, utils_1.appendLog)(config.logPath, `[INFO] ${message}`);
22
+ }
23
+ function logError(message, error) {
24
+ const suffix = error instanceof Error ? ` ${error.stack ?? error.message}` : error ? ` ${String(error)}` : "";
25
+ (0, utils_1.appendLog)(config.logPath, `[ERROR] ${message}${suffix}`);
26
+ }
27
+ function matchSessionRoute(pathname, suffix) {
28
+ const match = pathname.match(new RegExp(`^/sessions/([^/]+)/${suffix}$`));
29
+ return match?.[1];
30
+ }
31
+ async function handleRequest(request, response) {
32
+ try {
33
+ const method = request.method ?? "GET";
34
+ const url = new URL(request.url ?? "/", "http://127.0.0.1");
35
+ const pathname = url.pathname;
36
+ if (method === "GET" && pathname === "/health") {
37
+ const payload = {
38
+ ok: true,
39
+ pid: process.pid,
40
+ transports: process.platform === "win32" ? ["http"] : ["socket", "http"],
41
+ projectRoot: daemonProjectRoot,
42
+ version: daemonVersion,
43
+ startedAt: daemonStartedAt
44
+ };
45
+ (0, utils_1.writeJsonResponse)(response, 200, payload);
46
+ return;
47
+ }
48
+ if (method === "GET" && pathname === "/sessions") {
49
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.listSessions());
50
+ return;
51
+ }
52
+ if (method === "GET" && pathname === "/sessions/current") {
53
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.currentSession());
54
+ return;
55
+ }
56
+ if (method === "POST" && pathname === "/sessions/open") {
57
+ const body = (await (0, utils_1.readJsonBody)(request));
58
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.open(body));
59
+ return;
60
+ }
61
+ const tabsSessionId = matchSessionRoute(pathname, "tabs");
62
+ if (method === "GET" && tabsSessionId) {
63
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.tabs(tabsSessionId));
64
+ return;
65
+ }
66
+ const tabOpenSessionId = matchSessionRoute(pathname, "tabopen");
67
+ if (method === "POST" && tabOpenSessionId) {
68
+ const body = (await (0, utils_1.readJsonBody)(request));
69
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.tabOpen(tabOpenSessionId, body?.url));
70
+ return;
71
+ }
72
+ const tabFocusSessionId = matchSessionRoute(pathname, "tabfocus");
73
+ if (method === "POST" && tabFocusSessionId) {
74
+ const body = (await (0, utils_1.readJsonBody)(request));
75
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.tabFocus(tabFocusSessionId, body.index));
76
+ return;
77
+ }
78
+ const tabCloseSessionId = matchSessionRoute(pathname, "tabclose");
79
+ if (method === "POST" && tabCloseSessionId) {
80
+ const body = (await (0, utils_1.readJsonBody)(request));
81
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.tabClose(tabCloseSessionId, body?.index));
82
+ return;
83
+ }
84
+ const snapshotSessionId = matchSessionRoute(pathname, "snapshot");
85
+ if (method === "POST" && snapshotSessionId) {
86
+ const body = (await (0, utils_1.readJsonBody)(request));
87
+ const payload = await sessionManager.snapshot(snapshotSessionId, body?.interactive === true);
88
+ (0, utils_1.writeJsonResponse)(response, 200, payload);
89
+ return;
90
+ }
91
+ const clickSessionId = matchSessionRoute(pathname, "click");
92
+ if (method === "POST" && clickSessionId) {
93
+ const body = (await (0, utils_1.readJsonBody)(request));
94
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.click(clickSessionId, body.target));
95
+ return;
96
+ }
97
+ const typeSessionId = matchSessionRoute(pathname, "type");
98
+ if (method === "POST" && typeSessionId) {
99
+ const body = (await (0, utils_1.readJsonBody)(request));
100
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.type(typeSessionId, body.target, body.text));
101
+ return;
102
+ }
103
+ const fillSessionId = matchSessionRoute(pathname, "fill");
104
+ if (method === "POST" && fillSessionId) {
105
+ const body = (await (0, utils_1.readJsonBody)(request));
106
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.fill(fillSessionId, body.target, body.text));
107
+ return;
108
+ }
109
+ const hoverSessionId = matchSessionRoute(pathname, "hover");
110
+ if (method === "POST" && hoverSessionId) {
111
+ const body = (await (0, utils_1.readJsonBody)(request));
112
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.hover(hoverSessionId, body.target));
113
+ return;
114
+ }
115
+ const focusSessionId = matchSessionRoute(pathname, "focus");
116
+ if (method === "POST" && focusSessionId) {
117
+ const body = (await (0, utils_1.readJsonBody)(request));
118
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.focus(focusSessionId, body.target));
119
+ return;
120
+ }
121
+ const doubleClickSessionId = matchSessionRoute(pathname, "dblclick");
122
+ if (method === "POST" && doubleClickSessionId) {
123
+ const body = (await (0, utils_1.readJsonBody)(request));
124
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.doubleClick(doubleClickSessionId, body.target));
125
+ return;
126
+ }
127
+ const selectSessionId = matchSessionRoute(pathname, "select");
128
+ if (method === "POST" && selectSessionId) {
129
+ const body = (await (0, utils_1.readJsonBody)(request));
130
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.select(selectSessionId, body.target, body.value));
131
+ return;
132
+ }
133
+ const checkSessionId = matchSessionRoute(pathname, "check");
134
+ if (method === "POST" && checkSessionId) {
135
+ const body = (await (0, utils_1.readJsonBody)(request));
136
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.check(checkSessionId, body.target));
137
+ return;
138
+ }
139
+ const uncheckSessionId = matchSessionRoute(pathname, "uncheck");
140
+ if (method === "POST" && uncheckSessionId) {
141
+ const body = (await (0, utils_1.readJsonBody)(request));
142
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.uncheck(uncheckSessionId, body.target));
143
+ return;
144
+ }
145
+ const pressSessionId = matchSessionRoute(pathname, "press");
146
+ if (method === "POST" && pressSessionId) {
147
+ const body = (await (0, utils_1.readJsonBody)(request));
148
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.press(pressSessionId, body.key, body.target));
149
+ return;
150
+ }
151
+ const waitSessionId = matchSessionRoute(pathname, "wait");
152
+ if (method === "POST" && waitSessionId) {
153
+ const body = (await (0, utils_1.readJsonBody)(request));
154
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.wait(waitSessionId, body));
155
+ return;
156
+ }
157
+ const scrollSessionId = matchSessionRoute(pathname, "scroll");
158
+ if (method === "POST" && scrollSessionId) {
159
+ const body = (await (0, utils_1.readJsonBody)(request));
160
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.scroll(scrollSessionId, body.direction, body.pixels, body.target));
161
+ return;
162
+ }
163
+ const scrollIntoViewSessionId = matchSessionRoute(pathname, "scrollintoview");
164
+ if (method === "POST" && scrollIntoViewSessionId) {
165
+ const body = (await (0, utils_1.readJsonBody)(request));
166
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.scrollIntoView(scrollIntoViewSessionId, body.target));
167
+ return;
168
+ }
169
+ const getSessionId = matchSessionRoute(pathname, "get");
170
+ if (method === "POST" && getSessionId) {
171
+ const body = (await (0, utils_1.readJsonBody)(request));
172
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.get(getSessionId, body.kind, body.target));
173
+ return;
174
+ }
175
+ const backSessionId = matchSessionRoute(pathname, "back");
176
+ if (method === "POST" && backSessionId) {
177
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.back(backSessionId));
178
+ return;
179
+ }
180
+ const forwardSessionId = matchSessionRoute(pathname, "forward");
181
+ if (method === "POST" && forwardSessionId) {
182
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.forward(forwardSessionId));
183
+ return;
184
+ }
185
+ const reloadSessionId = matchSessionRoute(pathname, "reload");
186
+ if (method === "POST" && reloadSessionId) {
187
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.reload(reloadSessionId));
188
+ return;
189
+ }
190
+ const cookiesSessionId = matchSessionRoute(pathname, "cookies");
191
+ if (method === "GET" && cookiesSessionId) {
192
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.cookies(cookiesSessionId));
193
+ return;
194
+ }
195
+ const cookiesImportSessionId = matchSessionRoute(pathname, "cookies-import");
196
+ if (method === "POST" && cookiesImportSessionId) {
197
+ const body = (await (0, utils_1.readJsonBody)(request));
198
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.cookiesImport(cookiesImportSessionId, body.cookies));
199
+ return;
200
+ }
201
+ const cookiesClearSessionId = matchSessionRoute(pathname, "cookies-clear");
202
+ if (method === "POST" && cookiesClearSessionId) {
203
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.cookiesClear(cookiesClearSessionId));
204
+ return;
205
+ }
206
+ const storageExportSessionId = matchSessionRoute(pathname, "storage-export");
207
+ if (method === "POST" && storageExportSessionId) {
208
+ const body = (await (0, utils_1.readJsonBody)(request));
209
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.storageExport(storageExportSessionId, body?.scope));
210
+ return;
211
+ }
212
+ const storageImportSessionId = matchSessionRoute(pathname, "storage-import");
213
+ if (method === "POST" && storageImportSessionId) {
214
+ const body = (await (0, utils_1.readJsonBody)(request));
215
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.storageImport(storageImportSessionId, body.state, body.scope, body.clear === true));
216
+ return;
217
+ }
218
+ const storageClearSessionId = matchSessionRoute(pathname, "storage-clear");
219
+ if (method === "POST" && storageClearSessionId) {
220
+ const body = (await (0, utils_1.readJsonBody)(request));
221
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.storageClear(storageClearSessionId, body?.scope));
222
+ return;
223
+ }
224
+ const evalSessionId = matchSessionRoute(pathname, "eval");
225
+ if (method === "POST" && evalSessionId) {
226
+ const body = (await (0, utils_1.readJsonBody)(request));
227
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.eval(evalSessionId, body.expression));
228
+ return;
229
+ }
230
+ const findSessionId = matchSessionRoute(pathname, "find");
231
+ if (method === "POST" && findSessionId) {
232
+ const body = (await (0, utils_1.readJsonBody)(request));
233
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.find(findSessionId, body));
234
+ return;
235
+ }
236
+ const screenshotSessionId = matchSessionRoute(pathname, "screenshot");
237
+ if (method === "POST" && screenshotSessionId) {
238
+ const body = (await (0, utils_1.readJsonBody)(request));
239
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.screenshot(screenshotSessionId, body.path, body.annotate === true, body.pressEscape === true));
240
+ return;
241
+ }
242
+ const uploadSessionId = matchSessionRoute(pathname, "upload");
243
+ if (method === "POST" && uploadSessionId) {
244
+ const body = (await (0, utils_1.readJsonBody)(request));
245
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.upload(uploadSessionId, body.target, body.files));
246
+ return;
247
+ }
248
+ const pdfSessionId = matchSessionRoute(pathname, "pdf");
249
+ if (method === "POST" && pdfSessionId) {
250
+ const body = (await (0, utils_1.readJsonBody)(request));
251
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.pdf(pdfSessionId, body.path));
252
+ return;
253
+ }
254
+ const closeSessionId = matchSessionRoute(pathname, "close");
255
+ if (method === "POST" && closeSessionId) {
256
+ (0, utils_1.writeJsonResponse)(response, 200, await sessionManager.close(closeSessionId));
257
+ return;
258
+ }
259
+ throw new errors_1.AppError("BAD_REQUEST", `Unsupported route ${method} ${pathname}`, 404);
260
+ }
261
+ catch (error) {
262
+ const payload = (0, errors_1.serializeError)(error);
263
+ logError(`Request failed for ${request.method} ${request.url}`, error);
264
+ (0, utils_1.writeJsonResponse)(response, payload.status, payload);
265
+ }
266
+ }
267
+ function createServer() {
268
+ return node_http_1.default.createServer((request, response) => {
269
+ handleRequest(request, response).catch((error) => {
270
+ const payload = (0, errors_1.serializeError)(error);
271
+ logError("Unhandled request failure", error);
272
+ (0, utils_1.writeJsonResponse)(response, payload.status, payload);
273
+ });
274
+ });
275
+ }
276
+ function readPackageVersion(projectRoot) {
277
+ try {
278
+ const raw = node_fs_1.default.readFileSync(node_path_1.default.join(projectRoot, "package.json"), "utf8");
279
+ const parsed = JSON.parse(raw);
280
+ return typeof parsed.version === "string" ? parsed.version : undefined;
281
+ }
282
+ catch {
283
+ return undefined;
284
+ }
285
+ }
286
+ async function startServers() {
287
+ if (process.platform !== "win32" && node_fs_1.default.existsSync(config.socketPath)) {
288
+ node_fs_1.default.unlinkSync(config.socketPath);
289
+ }
290
+ if (process.platform !== "win32") {
291
+ const socketServer = createServer();
292
+ activeServers.push(socketServer);
293
+ await new Promise((resolve, reject) => {
294
+ socketServer.once("error", reject);
295
+ socketServer.listen(config.socketPath, () => resolve());
296
+ });
297
+ logInfo(`Socket server listening at ${config.socketPath}`);
298
+ }
299
+ const httpServer = createServer();
300
+ activeServers.push(httpServer);
301
+ await new Promise((resolve, reject) => {
302
+ httpServer.once("error", reject);
303
+ httpServer.listen(config.daemonPort, config.daemonHost, () => resolve());
304
+ });
305
+ logInfo(`HTTP server listening at http://${config.daemonHost}:${config.daemonPort}`);
306
+ }
307
+ async function shutdown(signal) {
308
+ logInfo(`Received ${signal}, shutting down`);
309
+ await sessionManager.closeAll();
310
+ await Promise.all(activeServers.map((server) => new Promise((resolve) => {
311
+ server.close(() => resolve());
312
+ })));
313
+ if (process.platform !== "win32" && node_fs_1.default.existsSync(config.socketPath)) {
314
+ node_fs_1.default.unlinkSync(config.socketPath);
315
+ }
316
+ }
317
+ process.on("SIGINT", () => {
318
+ shutdown("SIGINT").finally(() => process.exit(0));
319
+ });
320
+ process.on("SIGTERM", () => {
321
+ shutdown("SIGTERM").finally(() => process.exit(0));
322
+ });
323
+ startServers()
324
+ .then(() => {
325
+ logInfo("Gologin Agent daemon started");
326
+ })
327
+ .catch((error) => {
328
+ logError("Failed to start daemon", error);
329
+ process.exit(1);
330
+ });