@intuned/runtime-dev 1.3.18-interface.12 → 1.3.18-interface.15

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 (61) hide show
  1. package/.babelrc +27 -0
  2. package/.claude/settings.local.json +7 -0
  3. package/.eslintignore +10 -0
  4. package/.eslintrc.js +39 -0
  5. package/InterfaceTemplate/__utils.ts +63 -0
  6. package/InterfaceTemplate/index.playwright.ts +6 -0
  7. package/WebTemplate.zip +0 -0
  8. package/package.json +19 -72
  9. package/template.tsconfig.json +11 -0
  10. package/tsconfig.eslint.json +5 -0
  11. package/tsconfig.json +25 -0
  12. package/tsup.config.ts +11 -0
  13. package/typedoc.json +49 -0
  14. package/dist/commands/api/run.d.ts +0 -8
  15. package/dist/commands/api/run.js +0 -2094
  16. package/dist/commands/auth-sessions/load.d.ts +0 -1
  17. package/dist/commands/auth-sessions/load.js +0 -1559
  18. package/dist/commands/auth-sessions/run-check.d.ts +0 -1
  19. package/dist/commands/auth-sessions/run-check.js +0 -1964
  20. package/dist/commands/auth-sessions/run-create.d.ts +0 -1
  21. package/dist/commands/auth-sessions/run-create.js +0 -1968
  22. package/dist/commands/browser/save-state.d.ts +0 -1
  23. package/dist/commands/browser/save-state.js +0 -108
  24. package/dist/commands/browser/start-browser.d.ts +0 -1
  25. package/dist/commands/browser/start-browser.js +0 -67
  26. package/dist/commands/build.d.ts +0 -2
  27. package/dist/commands/build.js +0 -203
  28. package/dist/commands/common/tsNodeImport.d.ts +0 -5
  29. package/dist/commands/common/tsNodeImport.js +0 -82
  30. package/dist/commands/get-headless-user-agent.d.ts +0 -2
  31. package/dist/commands/get-headless-user-agent.js +0 -354
  32. package/dist/commands/interface/run.d.ts +0 -3
  33. package/dist/commands/interface/run.js +0 -2084
  34. package/dist/commands/intuned-cli/main.d.ts +0 -2
  35. package/dist/commands/intuned-cli/main.js +0 -5403
  36. package/dist/commands/ts-check.d.ts +0 -1
  37. package/dist/commands/ts-check.js +0 -158
  38. package/dist/common/assets/browser_scripts.js +0 -2580
  39. package/dist/common/asyncLocalStorage/index.d.ts +0 -17
  40. package/dist/common/asyncLocalStorage/index.js +0 -41
  41. package/dist/common/binStartupScript.d.ts +0 -2
  42. package/dist/common/binStartupScript.js +0 -152
  43. package/dist/common/cleanEnvironmentVariables.d.ts +0 -3
  44. package/dist/common/cleanEnvironmentVariables.js +0 -38
  45. package/dist/common/constants.d.ts +0 -13
  46. package/dist/common/constants.js +0 -59
  47. package/dist/common/contextStorageStateHelpers.d.ts +0 -24
  48. package/dist/common/contextStorageStateHelpers.js +0 -108
  49. package/dist/common/jwtTokenManager.d.ts +0 -19
  50. package/dist/common/jwtTokenManager.js +0 -180
  51. package/dist/common/runApi/index.d.ts +0 -11
  52. package/dist/common/runApi/index.js +0 -1873
  53. package/dist/common/settingsSchema.d.ts +0 -540
  54. package/dist/common/settingsSchema.js +0 -92
  55. package/dist/common/telemetry.d.ts +0 -6
  56. package/dist/common/telemetry.js +0 -63
  57. package/dist/export.d-BAUMB-lG.d.ts +0 -140
  58. package/dist/index.d.ts +0 -6
  59. package/dist/index.js +0 -808
  60. package/dist/runtime/index.d.ts +0 -168
  61. package/dist/runtime/index.js +0 -801
@@ -1,1559 +0,0 @@
1
- #!/usr/bin/env node
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __commonJS = (cb, mod) => function __require() {
9
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
-
28
- // ../packages/runtime-interface/dist/errors.js
29
- var require_errors = __commonJS({
30
- "../packages/runtime-interface/dist/errors.js"(exports2) {
31
- "use strict";
32
- Object.defineProperty(exports2, "__esModule", { value: true });
33
- exports2.ResultTooBigError = exports2.InternalInvalidInputError = exports2.AutomationError = exports2.MaxLevelsExceededError = exports2.AuthCheckFailedError = exports2.AuthCheckNotFoundError = exports2.AuthRequiredError = exports2.AbortedError = exports2.InvalidCheckError = exports2.InvalidApiError = exports2.ApiNotFoundError = exports2.RunAutomationError = exports2.runAutomationErrorCodes = exports2.resultTooBigErrorCode = exports2.internalInvalidInputErrorCode = exports2.automationError = exports2.maxLevelsExceededErrorCode = exports2.authCheckFailedErrorCode = exports2.authCheckNotFoundErrorCode = exports2.authRequiredErrorCode = exports2.abortedErrorCode = exports2.invalidCheckErrorCode = exports2.invalidApiErrorCode = exports2.apiNotFoundErrorCode = void 0;
34
- exports2.apiNotFoundErrorCode = "APINotFoundError";
35
- exports2.invalidApiErrorCode = "InvalidAPIError";
36
- exports2.invalidCheckErrorCode = "InvalidCheckError";
37
- exports2.abortedErrorCode = "AbortedError";
38
- exports2.authRequiredErrorCode = "AuthRequiredError";
39
- exports2.authCheckNotFoundErrorCode = "AuthCheckNotFoundError";
40
- exports2.authCheckFailedErrorCode = "AuthCheckFailedError";
41
- exports2.maxLevelsExceededErrorCode = "MaxLevelsExceededError";
42
- exports2.automationError = "AutomationError";
43
- exports2.internalInvalidInputErrorCode = "InternalInvalidInputError";
44
- exports2.resultTooBigErrorCode = "ResultTooBigError";
45
- exports2.runAutomationErrorCodes = [
46
- exports2.apiNotFoundErrorCode,
47
- exports2.invalidApiErrorCode,
48
- exports2.invalidCheckErrorCode,
49
- exports2.abortedErrorCode,
50
- exports2.authRequiredErrorCode,
51
- exports2.authCheckNotFoundErrorCode,
52
- exports2.authCheckFailedErrorCode,
53
- exports2.maxLevelsExceededErrorCode,
54
- exports2.automationError,
55
- exports2.internalInvalidInputErrorCode,
56
- exports2.resultTooBigErrorCode
57
- ];
58
- var RunAutomationError3 = class {
59
- constructor(code, message) {
60
- this.code = code;
61
- this.message = message;
62
- }
63
- get json() {
64
- return {
65
- code: this.code,
66
- details: this.details,
67
- cause: this.cause?.json
68
- };
69
- }
70
- };
71
- exports2.RunAutomationError = RunAutomationError3;
72
- var ApiNotFoundError3 = class extends RunAutomationError3 {
73
- constructor(apiName) {
74
- super(exports2.apiNotFoundErrorCode, `API ${apiName} not found`);
75
- }
76
- };
77
- exports2.ApiNotFoundError = ApiNotFoundError3;
78
- var InvalidApiError2 = class extends RunAutomationError3 {
79
- constructor(message) {
80
- super(exports2.invalidApiErrorCode, `API is invalid: ${message}`);
81
- this.details = {
82
- message
83
- };
84
- }
85
- };
86
- exports2.InvalidApiError = InvalidApiError2;
87
- var InvalidCheckError = class extends RunAutomationError3 {
88
- constructor(message, cause) {
89
- super(exports2.invalidCheckErrorCode, message);
90
- this.cause = cause;
91
- }
92
- };
93
- exports2.InvalidCheckError = InvalidCheckError;
94
- var AbortedError = class extends RunAutomationError3 {
95
- constructor() {
96
- super(exports2.abortedErrorCode, "Operation was aborted");
97
- }
98
- };
99
- exports2.AbortedError = AbortedError;
100
- var AuthRequiredError = class extends RunAutomationError3 {
101
- constructor() {
102
- super(exports2.authRequiredErrorCode, "AuthSessions are required");
103
- }
104
- };
105
- exports2.AuthRequiredError = AuthRequiredError;
106
- var AuthCheckNotFoundError = class extends RunAutomationError3 {
107
- constructor() {
108
- super(exports2.authCheckNotFoundErrorCode, "AuthSession check not found");
109
- }
110
- };
111
- exports2.AuthCheckNotFoundError = AuthCheckNotFoundError;
112
- var AuthCheckFailedError = class extends RunAutomationError3 {
113
- constructor() {
114
- super(exports2.authCheckFailedErrorCode, "AuthSession check failed");
115
- }
116
- };
117
- exports2.AuthCheckFailedError = AuthCheckFailedError;
118
- var MaxLevelsExceededError = class extends RunAutomationError3 {
119
- constructor(levels) {
120
- super(exports2.maxLevelsExceededErrorCode, `Max levels exceeded. Only ${levels} levels are supported`);
121
- this.details = { levels };
122
- }
123
- };
124
- exports2.MaxLevelsExceededError = MaxLevelsExceededError;
125
- var AutomationError3 = class extends RunAutomationError3 {
126
- constructor(error) {
127
- super(exports2.automationError, `[${error?.name ?? error}] ${error?.message}`);
128
- this.details = {
129
- ...error
130
- };
131
- }
132
- };
133
- exports2.AutomationError = AutomationError3;
134
- var InternalInvalidInputError = class extends RunAutomationError3 {
135
- constructor(message, details) {
136
- super(exports2.internalInvalidInputErrorCode, message);
137
- this.details = details;
138
- }
139
- };
140
- exports2.InternalInvalidInputError = InternalInvalidInputError;
141
- var ResultTooBigError = class extends RunAutomationError3 {
142
- constructor(sizeInBytes, maxSizeInBytes) {
143
- super(exports2.resultTooBigErrorCode, `Automation result is too big. Size: ${Math.round(sizeInBytes / 1024 / 1024 * 100) / 100}MB, Max allowed: ${Math.round(maxSizeInBytes / 1024 / 1024 * 100) / 100}MB`);
144
- this.details = { sizeInBytes, maxSizeInBytes };
145
- }
146
- };
147
- exports2.ResultTooBigError = ResultTooBigError;
148
- }
149
- });
150
-
151
- // ../packages/runtime-interface/dist/types.js
152
- var require_types = __commonJS({
153
- "../packages/runtime-interface/dist/types.js"(exports2) {
154
- "use strict";
155
- var __importDefault = exports2 && exports2.__importDefault || function(mod) {
156
- return mod && mod.__esModule ? mod : { "default": mod };
157
- };
158
- Object.defineProperty(exports2, "__esModule", { value: true });
159
- exports2.outputRunApiSchema = exports2.pongMessageSchema = exports2.doneMessageSchema = exports2.extendMessageSchema = exports2.runApiInputSchema = exports2.pingSchema = exports2.tokenUpdateSchema = exports2.abortRunApiSchema = exports2.startRunApiSchema = exports2.startRunApiParametersSchema = exports2.runApiParametersSchema = exports2.runApiRunOptionsSchema = exports2.runApiCdpRunOptionsSchema = exports2.runApiStandaloneRunOptionsSchema = exports2.runApiAuthSchema = exports2.runApiTracingSchema = exports2.runApiAutomationFunctionSchema = exports2.runApiSessionSchema = exports2.runApiStorageStateSchema = void 0;
160
- exports2.runApiResultOkSchema = runApiResultOkSchema;
161
- exports2.runApiResultWithSessionOkSchema = runApiResultWithSessionOkSchema;
162
- var zod_1 = __importDefault(require("zod"));
163
- exports2.runApiStorageStateSchema = zod_1.default.object({
164
- cookies: zod_1.default.array(zod_1.default.object({
165
- name: zod_1.default.string(),
166
- value: zod_1.default.string(),
167
- domain: zod_1.default.string(),
168
- path: zod_1.default.string(),
169
- expires: zod_1.default.number(),
170
- httpOnly: zod_1.default.boolean(),
171
- secure: zod_1.default.boolean(),
172
- sameSite: zod_1.default.enum(["Strict", "Lax", "None"])
173
- })),
174
- origins: zod_1.default.array(zod_1.default.object({
175
- origin: zod_1.default.string(),
176
- localStorage: zod_1.default.array(zod_1.default.object({
177
- name: zod_1.default.string(),
178
- value: zod_1.default.string()
179
- }))
180
- })),
181
- sessionStorage: zod_1.default.array(zod_1.default.object({
182
- origin: zod_1.default.string(),
183
- sessionStorage: zod_1.default.array(zod_1.default.object({
184
- name: zod_1.default.string(),
185
- value: zod_1.default.string()
186
- }))
187
- })).optional()
188
- });
189
- exports2.runApiSessionSchema = zod_1.default.discriminatedUnion("type", [
190
- zod_1.default.object({
191
- type: zod_1.default.literal("file"),
192
- path: zod_1.default.string()
193
- }),
194
- zod_1.default.object({
195
- type: zod_1.default.literal("state"),
196
- state: exports2.runApiStorageStateSchema.nullable().optional()
197
- })
198
- ]);
199
- exports2.runApiAutomationFunctionSchema = zod_1.default.object({
200
- name: zod_1.default.string(),
201
- params: zod_1.default.any().optional()
202
- });
203
- exports2.runApiTracingSchema = zod_1.default.discriminatedUnion("enabled", [
204
- zod_1.default.object({ enabled: zod_1.default.literal(false) }),
205
- zod_1.default.object({ enabled: zod_1.default.literal(true), filePath: zod_1.default.string() })
206
- ]).optional().default({ enabled: false });
207
- exports2.runApiAuthSchema = zod_1.default.object({
208
- session: exports2.runApiSessionSchema,
209
- parameters: zod_1.default.record(zod_1.default.any()).optional()
210
- }).optional();
211
- exports2.runApiStandaloneRunOptionsSchema = zod_1.default.object({
212
- environment: zod_1.default.literal("standalone"),
213
- headless: zod_1.default.boolean().default(true),
214
- proxy: zod_1.default.object({
215
- server: zod_1.default.string(),
216
- username: zod_1.default.string(),
217
- password: zod_1.default.string()
218
- }).optional()
219
- });
220
- exports2.runApiCdpRunOptionsSchema = zod_1.default.object({
221
- environment: zod_1.default.literal("cdp"),
222
- cdpAddress: zod_1.default.string(),
223
- cdpTargetId: zod_1.default.string().optional()
224
- });
225
- exports2.runApiRunOptionsSchema = zod_1.default.discriminatedUnion("environment", [
226
- exports2.runApiStandaloneRunOptionsSchema,
227
- exports2.runApiCdpRunOptionsSchema
228
- ]).default({ environment: "standalone", headless: true });
229
- exports2.runApiParametersSchema = zod_1.default.object({
230
- automationFunction: exports2.runApiAutomationFunctionSchema,
231
- tracing: exports2.runApiTracingSchema,
232
- auth: exports2.runApiAuthSchema,
233
- runOptions: exports2.runApiRunOptionsSchema,
234
- retrieveSession: zod_1.default.boolean().default(false)
235
- });
236
- function runApiResultOkSchema(resultSchema) {
237
- return zod_1.default.object({
238
- result: resultSchema,
239
- extendedPayloads: zod_1.default.array(zod_1.default.object({
240
- api: zod_1.default.string(),
241
- parameters: zod_1.default.record(zod_1.default.any())
242
- })).optional()
243
- });
244
- }
245
- function runApiResultWithSessionOkSchema(resultSchema) {
246
- return runApiResultOkSchema(resultSchema).extend({
247
- session: exports2.runApiStorageStateSchema
248
- });
249
- }
250
- exports2.startRunApiParametersSchema = exports2.runApiParametersSchema.extend({
251
- retrieveSession: zod_1.default.boolean(),
252
- functionsToken: zod_1.default.string().optional(),
253
- context: zod_1.default.object({
254
- jobId: zod_1.default.string().optional(),
255
- jobRunId: zod_1.default.string().optional(),
256
- runId: zod_1.default.string().optional(),
257
- queueId: zod_1.default.string().optional(),
258
- authSessionId: zod_1.default.string().optional()
259
- }).optional()
260
- });
261
- exports2.startRunApiSchema = zod_1.default.object({
262
- type: zod_1.default.literal("start"),
263
- parameters: exports2.startRunApiParametersSchema
264
- });
265
- exports2.abortRunApiSchema = zod_1.default.object({
266
- type: zod_1.default.literal("abort"),
267
- parameters: zod_1.default.object({}).optional()
268
- });
269
- exports2.tokenUpdateSchema = zod_1.default.object({
270
- type: zod_1.default.literal("tokenUpdate"),
271
- parameters: zod_1.default.object({
272
- functionsToken: zod_1.default.string()
273
- })
274
- });
275
- exports2.pingSchema = zod_1.default.object({
276
- type: zod_1.default.literal("ping"),
277
- parameters: zod_1.default.object({}).optional()
278
- });
279
- exports2.runApiInputSchema = zod_1.default.union([
280
- exports2.startRunApiSchema,
281
- exports2.abortRunApiSchema,
282
- exports2.tokenUpdateSchema,
283
- exports2.pingSchema
284
- ]);
285
- exports2.extendMessageSchema = zod_1.default.object({ type: zod_1.default.literal("extend") });
286
- exports2.doneMessageSchema = zod_1.default.object({
287
- type: zod_1.default.literal("done"),
288
- result: zod_1.default.any(),
289
- success: zod_1.default.boolean()
290
- });
291
- exports2.pongMessageSchema = zod_1.default.object({
292
- type: zod_1.default.literal("pong")
293
- });
294
- exports2.outputRunApiSchema = zod_1.default.union([
295
- exports2.extendMessageSchema,
296
- exports2.doneMessageSchema,
297
- exports2.pongMessageSchema
298
- ]);
299
- }
300
- });
301
-
302
- // ../packages/runtime-interface/dist/interfaceClient.js
303
- var require_interfaceClient = __commonJS({
304
- "../packages/runtime-interface/dist/interfaceClient.js"(exports2) {
305
- "use strict";
306
- var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
307
- if (k2 === void 0) k2 = k;
308
- var desc = Object.getOwnPropertyDescriptor(m, k);
309
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
310
- desc = { enumerable: true, get: function() {
311
- return m[k];
312
- } };
313
- }
314
- Object.defineProperty(o, k2, desc);
315
- }) : (function(o, m, k, k2) {
316
- if (k2 === void 0) k2 = k;
317
- o[k2] = m[k];
318
- }));
319
- var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
320
- Object.defineProperty(o, "default", { enumerable: true, value: v });
321
- }) : function(o, v) {
322
- o["default"] = v;
323
- });
324
- var __importStar = exports2 && exports2.__importStar || function(mod) {
325
- if (mod && mod.__esModule) return mod;
326
- var result = {};
327
- if (mod != null) {
328
- for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
329
- }
330
- __setModuleDefault(result, mod);
331
- return result;
332
- };
333
- Object.defineProperty(exports2, "__esModule", { value: true });
334
- exports2.JSONLFileClient = exports2.TCPSocketClient = exports2.UnixSocketClient = exports2.SocketClient = void 0;
335
- var net = __importStar(require("net"));
336
- var fs4 = __importStar(require("fs-extra"));
337
- var readline_1 = require("readline");
338
- var promises_1 = require("timers/promises");
339
- var SocketClient = class _SocketClient {
340
- constructor(socket) {
341
- this.socket = socket;
342
- }
343
- sendJSON(data) {
344
- const dataToSend = JSON.stringify(data);
345
- const length = Buffer.byteLength(dataToSend);
346
- const buffer = Buffer.alloc(_SocketClient.LENGTH_HEADER_LENGTH + length);
347
- buffer.writeUInt32BE(length, 0);
348
- buffer.write(dataToSend, _SocketClient.LENGTH_HEADER_LENGTH);
349
- this.socket.write(buffer);
350
- }
351
- async *receiveJSON() {
352
- let buffer = Buffer.alloc(0);
353
- const endPromise = new Promise((resolve2, reject) => {
354
- this.socket.once("end", () => {
355
- resolve2();
356
- });
357
- this.socket.once("error", reject);
358
- });
359
- while (true) {
360
- const chunk = await Promise.race([
361
- new Promise((resolve2) => this.socket.once("data", (data2) => {
362
- if (typeof data2 === "string") {
363
- return resolve2(Buffer.from(data2));
364
- }
365
- resolve2(data2);
366
- })),
367
- endPromise
368
- ]);
369
- if (!(chunk instanceof Buffer)) {
370
- break;
371
- }
372
- buffer = Buffer.concat([buffer, chunk]);
373
- const length = buffer.readUInt32BE(0);
374
- if (buffer.length < length + _SocketClient.LENGTH_HEADER_LENGTH) {
375
- continue;
376
- }
377
- const data = buffer.subarray(_SocketClient.LENGTH_HEADER_LENGTH, length + _SocketClient.LENGTH_HEADER_LENGTH);
378
- buffer = buffer.subarray(length + _SocketClient.LENGTH_HEADER_LENGTH);
379
- yield JSON.parse(data.toString());
380
- }
381
- }
382
- async close() {
383
- this.socket.end();
384
- await Promise.race([
385
- new Promise((resolve2) => this.socket.once("close", resolve2)),
386
- new Promise((resolve2) => this.socket.once("error", resolve2)),
387
- (0, promises_1.setTimeout)(3e3)
388
- ]);
389
- }
390
- get closed() {
391
- return this.socket.closed;
392
- }
393
- };
394
- exports2.SocketClient = SocketClient;
395
- SocketClient.LENGTH_HEADER_LENGTH = 4;
396
- var UnixSocketClient = class extends SocketClient {
397
- constructor(path3) {
398
- super(net.createConnection(path3));
399
- }
400
- };
401
- exports2.UnixSocketClient = UnixSocketClient;
402
- var TCPSocketClient = class extends SocketClient {
403
- constructor(host, port) {
404
- super(net.createConnection(port, host));
405
- }
406
- };
407
- exports2.TCPSocketClient = TCPSocketClient;
408
- var JSONLFileClient = class {
409
- constructor(filePath) {
410
- this.fileStream = fs4.createReadStream(filePath, { encoding: "utf-8" });
411
- }
412
- sendJSON(data) {
413
- console.log("Sending message", data);
414
- }
415
- async *receiveJSON() {
416
- const rl = (0, readline_1.createInterface)({
417
- input: this.fileStream,
418
- crlfDelay: Infinity
419
- });
420
- for await (const line of rl) {
421
- if (line.trim() === "") {
422
- continue;
423
- }
424
- yield JSON.parse(line);
425
- }
426
- }
427
- async close() {
428
- this.fileStream.close();
429
- await Promise.race([
430
- new Promise((resolve2) => this.fileStream.once("close", resolve2)),
431
- new Promise((resolve2) => this.fileStream.once("error", resolve2)),
432
- (0, promises_1.setTimeout)(3e3)
433
- ]);
434
- }
435
- get closed() {
436
- return this.fileStream.closed;
437
- }
438
- };
439
- exports2.JSONLFileClient = JSONLFileClient;
440
- }
441
- });
442
-
443
- // ../packages/runtime-interface/dist/index.js
444
- var require_dist = __commonJS({
445
- "../packages/runtime-interface/dist/index.js"(exports2) {
446
- "use strict";
447
- var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
448
- if (k2 === void 0) k2 = k;
449
- var desc = Object.getOwnPropertyDescriptor(m, k);
450
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
451
- desc = { enumerable: true, get: function() {
452
- return m[k];
453
- } };
454
- }
455
- Object.defineProperty(o, k2, desc);
456
- }) : (function(o, m, k, k2) {
457
- if (k2 === void 0) k2 = k;
458
- o[k2] = m[k];
459
- }));
460
- var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
461
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
462
- };
463
- Object.defineProperty(exports2, "__esModule", { value: true });
464
- __exportStar(require_errors(), exports2);
465
- __exportStar(require_types(), exports2);
466
- __exportStar(require_interfaceClient(), exports2);
467
- }
468
- });
469
-
470
- // src/commands/auth-sessions/load.ts
471
- var import_commander = require("commander");
472
-
473
- // src/common/contextStorageStateHelpers.ts
474
- async function setStorageState(context, state) {
475
- if ("cookies" in state && state.cookies) {
476
- await context.addCookies(state.cookies);
477
- }
478
- const page = await context.newPage();
479
- if ("origins" in state && state.origins) {
480
- for (const originData of state.origins || []) {
481
- const origin = originData.origin;
482
- await page.route(
483
- `${origin}/*`,
484
- (route) => route.fulfill({
485
- body: "<html><head><title>Set Storage</title></head><body><h1>Set Storage</h1></body></html>",
486
- contentType: "text/html",
487
- status: 200
488
- })
489
- );
490
- try {
491
- await page.goto(origin);
492
- for (const item of originData.localStorage) {
493
- await page.evaluate(
494
- ([key, value]) => {
495
- window.localStorage.setItem(key, value);
496
- },
497
- [item.name, item.value]
498
- );
499
- }
500
- } finally {
501
- await page.unroute(`${origin}/*`);
502
- }
503
- }
504
- }
505
- if ("sessionStorage" in state && state.sessionStorage) {
506
- await context.addInitScript((storage) => {
507
- for (const { origin, sessionStorage } of storage) {
508
- if (window.location.origin === origin) {
509
- for (const item of sessionStorage) {
510
- const value = window.sessionStorage.getItem(item.name);
511
- if (!value) {
512
- window.sessionStorage.setItem(item.name, item.value);
513
- }
514
- }
515
- }
516
- }
517
- }, state.sessionStorage);
518
- }
519
- await page.close();
520
- }
521
-
522
- // src/common/playwrightContext.ts
523
- var fs3 = __toESM(require("fs-extra"));
524
-
525
- // src/commands/common/utils/fileUtils.ts
526
- var path = __toESM(require("path"));
527
- var fs = __toESM(require("fs-extra"));
528
- var import_dotenv = __toESM(require("dotenv"));
529
- import_dotenv.default.config();
530
- function getFullPathInProject(...paths) {
531
- return path.resolve(process.cwd(), process.env.ROOT || "./", ...paths);
532
- }
533
-
534
- // src/common/playwrightContext.ts
535
- var import_neverthrow5 = require("neverthrow");
536
-
537
- // src/common/setupContextHook.ts
538
- var import_neverthrow2 = require("neverthrow");
539
-
540
- // src/common/runApi/importUsingImportFunction.ts
541
- var import_neverthrow = require("neverthrow");
542
- var import_runtime_interface = __toESM(require_dist());
543
- async function importUsingImportFunction({
544
- path: path3,
545
- allowGenerators = true,
546
- importFunction
547
- }) {
548
- try {
549
- const importedResult = await importFunction(path3);
550
- if (importedResult.isErr()) {
551
- if (importedResult.error.type === "not_found") {
552
- return (0, import_neverthrow.err)(new import_runtime_interface.ApiNotFoundError(path3));
553
- }
554
- return (0, import_neverthrow.err)(new import_runtime_interface.AutomationError(importedResult.error.error));
555
- }
556
- const imported = importedResult.value;
557
- if (!imported || !imported.default || !imported.default.constructor) {
558
- return (0, import_neverthrow.err)(new import_runtime_interface.InvalidApiError(`${path3} does not have a default export`));
559
- }
560
- if (imported.default.constructor.name === "AsyncGeneratorFunction") {
561
- if (!allowGenerators) {
562
- return (0, import_neverthrow.err)(
563
- new import_runtime_interface.InvalidApiError(
564
- `${path3} default export must be an async function`
565
- )
566
- );
567
- }
568
- return (0, import_neverthrow.ok)(async (...args) => {
569
- const generator = imported.default(
570
- ...args
571
- );
572
- const result = await generator.next();
573
- if (!result.done) {
574
- throw new Error("Yield is not supported");
575
- }
576
- return result.value;
577
- });
578
- }
579
- if (imported.default.constructor.name === "AsyncFunction") {
580
- return (0, import_neverthrow.ok)(imported.default);
581
- }
582
- return (0, import_neverthrow.err)(
583
- new import_runtime_interface.InvalidApiError(`${path3} default export must be an async function`)
584
- );
585
- } catch (error) {
586
- return (0, import_neverthrow.err)(new import_runtime_interface.AutomationError(error));
587
- }
588
- }
589
-
590
- // src/common/setupContextHook.ts
591
- var import_runtime_interface2 = __toESM(require_dist());
592
- var setupContextHookPath = "hooks/setupContext";
593
- async function loadSetupContextHook({
594
- importFunction
595
- }) {
596
- const importedFunctionResult = await importUsingImportFunction({
597
- path: setupContextHookPath,
598
- importFunction
599
- });
600
- if (importedFunctionResult.isErr() && importedFunctionResult.error instanceof import_runtime_interface2.ApiNotFoundError) {
601
- return (0, import_neverthrow2.ok)(null);
602
- }
603
- return importedFunctionResult;
604
- }
605
-
606
- // src/common/playwrightContext.ts
607
- var import_portfinder2 = require("portfinder");
608
-
609
- // src/common/launchBrowser.ts
610
- var playwright = __toESM(require("playwright"));
611
- var import_fs_extra = require("fs-extra");
612
- var import_path2 = require("path");
613
- var fs2 = __toESM(require("fs-extra"));
614
- var import_wait_on = __toESM(require("wait-on"));
615
- var import_child_process = require("child_process");
616
-
617
- // src/common/settingsSchema.ts
618
- var z = __toESM(require("zod"));
619
- var baseCaptchaSchema = z.object({
620
- enabled: z.boolean()
621
- });
622
- var customCaptchaSchema = baseCaptchaSchema.extend({
623
- imageLocators: z.array(z.string()).min(1, "At least one image locator is required"),
624
- submitLocators: z.array(z.string()).min(1, "At least one submit locator is required"),
625
- inputLocators: z.array(z.string()).min(1, "At least one input locator is required")
626
- });
627
- var textCaptchaSchema = baseCaptchaSchema.extend({
628
- labelLocators: z.array(z.string()).min(1, "At least one image locator is required"),
629
- submitLocators: z.array(z.string()).min(1, "At least one submit locator is required"),
630
- inputLocators: z.array(z.string()).min(1, "At least one input locator is required")
631
- });
632
- var captchaSolverSolveSettingsSchema = z.object({
633
- autoSolve: z.boolean().default(true),
634
- solveDelay: z.number().min(0).default(2e3),
635
- maxRetries: z.number().min(0).default(3),
636
- timeout: z.number().min(0).default(3e4)
637
- });
638
- var captchaSolverSettingsSchema = z.object({
639
- enabled: z.boolean().default(false),
640
- port: z.number().int().min(1).max(65535).optional(),
641
- cloudflare: baseCaptchaSchema.optional(),
642
- googleRecaptchaV2: baseCaptchaSchema.optional(),
643
- googleRecaptchaV3: baseCaptchaSchema.optional(),
644
- awscaptcha: baseCaptchaSchema.optional(),
645
- hcaptcha: baseCaptchaSchema.optional(),
646
- funcaptcha: baseCaptchaSchema.optional(),
647
- geetest: baseCaptchaSchema.optional(),
648
- lemin: baseCaptchaSchema.optional(),
649
- customCaptcha: customCaptchaSchema.optional(),
650
- text: textCaptchaSchema.optional(),
651
- settings: captchaSolverSolveSettingsSchema.default(
652
- captchaSolverSolveSettingsSchema.parse({})
653
- )
654
- }).default({});
655
- var authSessionsSchema = z.object({
656
- enabled: z.boolean()
657
- }).optional().default({
658
- enabled: false
659
- });
660
- var stealthModeSchema = z.object({
661
- enabled: z.boolean()
662
- }).optional().default({
663
- enabled: false
664
- });
665
- var settingsSchema = z.object({
666
- authSessions: authSessionsSchema,
667
- stealthMode: stealthModeSchema,
668
- captchaSolver: captchaSolverSettingsSchema.optional()
669
- });
670
-
671
- // src/commands/common/utils/settings.ts
672
- var import_promises = require("fs/promises");
673
- async function getSettings() {
674
- const settingsFilePath = getFullPathInProject("Intuned.json");
675
- const settings = await (0, import_promises.readFile)(settingsFilePath, { encoding: "utf-8" });
676
- if (settings) {
677
- const parsed = settingsSchema.safeParse(JSON.parse(settings));
678
- if (parsed.success) {
679
- return parsed.data;
680
- } else {
681
- throw new Error(parsed.error.message);
682
- }
683
- }
684
- return {
685
- authSessions: { enabled: false },
686
- stealthMode: { enabled: false }
687
- };
688
- }
689
-
690
- // src/common/constants.ts
691
- var WORKSPACE_ID_ENV_VAR_KEY = "INTUNED_WORKSPACE_ID";
692
- var PROJECT_ID_ENV_VAR_KEY = "INTUNED_PROJECT_ID";
693
- var API_KEY_ENV_VAR_KEY = "INTUNED_API_KEY";
694
- var AUTH_TOKEN_ENV_VAR_KEY = "INTUNED_AUTH_TOKEN";
695
- var API_KEY_HEADER_NAME = "x-api-key";
696
- var CLI_ENV_VAR_KEY = "INTUNED_CLI";
697
-
698
- // src/common/jwtTokenManager.ts
699
- var import_cross_fetch = __toESM(require("cross-fetch"));
700
- var jwt = __toESM(require("jsonwebtoken"));
701
- var import_neverthrow3 = require("neverthrow");
702
- var JwtTokenManager = class {
703
- constructor(refreshTokenPath) {
704
- this.refreshTokenPath = refreshTokenPath;
705
- this._token = void 0;
706
- }
707
- get token() {
708
- return this._token;
709
- }
710
- // When the token is set, the schedule for renewal is issued automatically
711
- // This is currently being set it two places:
712
- // 1. Whenever the runner starts, initializes it from the environment variable (set whenever the api is run from the authoring IDE)
713
- // 2. Whenever a published api is called to run (/api/run/*), it is set to the token received in the run request.
714
- set token(newToken) {
715
- if (this._token != newToken) {
716
- this._token = newToken;
717
- void this.scheduleTokenRefresh();
718
- }
719
- }
720
- get timeToRefresh() {
721
- if (!this._token) return;
722
- const payload = jwt.decode(this._token);
723
- if (!payload || typeof payload == "string") return;
724
- const expiry = payload.expiry;
725
- if (!expiry || typeof expiry !== "number") return;
726
- const timeWindow = 60 * 1e3;
727
- const timeToRefresh = expiry - Date.now() - timeWindow;
728
- return Math.max(timeToRefresh, timeWindow);
729
- }
730
- async scheduleTokenRefresh() {
731
- if (process.env.RUN_ENVIRONMENT?.toLowerCase() !== "authoring") return;
732
- const timeToRefresh = this.timeToRefresh;
733
- if (timeToRefresh === void 0) return;
734
- if (this.tokenRefreshTimeout) clearTimeout(this.tokenRefreshTimeout);
735
- this.tokenRefreshTimeout = setTimeout(async () => {
736
- const result = await this.refreshToken();
737
- if (result && result.isErr()) {
738
- console.error(`[Internal Error] ${result.error}`);
739
- return;
740
- }
741
- await this.scheduleTokenRefresh();
742
- }, timeToRefresh);
743
- }
744
- async refreshToken() {
745
- if (process.env.RUN_ENVIRONMENT?.toLowerCase() !== "authoring") return;
746
- const res = await this.fetchWithToken(
747
- `${this.backendFunctionsBaseUrl}/${this.refreshTokenPath}`,
748
- {
749
- method: "GET"
750
- }
751
- );
752
- if (res.status === 401) {
753
- return (0, import_neverthrow3.err)("Unauthorized");
754
- }
755
- const jsonResult = await import_neverthrow3.ResultAsync.fromPromise(
756
- res.json(),
757
- () => "not json"
758
- );
759
- if (jsonResult.isErr()) return;
760
- const newToken = jsonResult.value.token;
761
- if (newToken) this._token = newToken;
762
- }
763
- async fetchWithToken(...[input, init]) {
764
- const headers = new Headers(init?.headers);
765
- const apiKey = process.env[API_KEY_ENV_VAR_KEY];
766
- if (apiKey) {
767
- headers.set(API_KEY_HEADER_NAME, apiKey);
768
- }
769
- const token = process.env[AUTH_TOKEN_ENV_VAR_KEY];
770
- if (token) {
771
- headers.set("Authorization", `Bearer ${token}`);
772
- }
773
- if (this.token !== void 0) {
774
- headers.set("Authorization", `Bearer ${this.token}`);
775
- }
776
- const result = await (0, import_cross_fetch.default)(input, {
777
- ...init,
778
- headers
779
- });
780
- if (result.status === 401 && process.env[CLI_ENV_VAR_KEY] === "true") {
781
- console.warn(
782
- "Unauthorized backend function call - make sure to provision your project to Intuned to set up the correct API credentials.\nRun 'intuned provision' or see https://docs.intunedhq.com/docs/05-references/cli#provision-project for more information."
783
- );
784
- }
785
- return result;
786
- }
787
- get backendFunctionsBaseUrl() {
788
- try {
789
- if (!process.env.FUNCTIONS_DOMAIN) {
790
- throw new Error(
791
- `Cannot call backend function - FUNCTIONS_DOMAIN not set`
792
- );
793
- }
794
- const domain = process.env.FUNCTIONS_DOMAIN;
795
- if (!process.env[WORKSPACE_ID_ENV_VAR_KEY]) {
796
- throw new Error(
797
- `Cannot call backend function - ${WORKSPACE_ID_ENV_VAR_KEY} not set`
798
- );
799
- }
800
- const workspaceId = process.env[WORKSPACE_ID_ENV_VAR_KEY];
801
- if (!process.env[PROJECT_ID_ENV_VAR_KEY] && !process.env.INTUNED_INTEGRATION_ID) {
802
- throw new Error(
803
- `Cannot call backend function - ${PROJECT_ID_ENV_VAR_KEY} or INTUNED_INTEGRATION_ID not set`
804
- );
805
- }
806
- const projectId = process.env.INTUNED_INTEGRATION_ID ?? process.env[PROJECT_ID_ENV_VAR_KEY];
807
- return `${domain}/api/${workspaceId}/functions/${projectId}`;
808
- } catch (e) {
809
- if (process.env[CLI_ENV_VAR_KEY] === "true") {
810
- throw new Error(
811
- `API credentials not set - make sure to provision your project to Intuned to set up the correct API credentials.
812
- Run 'intuned provision' or see https://docs.intunedhq.com/docs/05-references/cli#provision-project for more information.
813
- Original error: ${e.message}`
814
- );
815
- }
816
- }
817
- }
818
- };
819
- var backendFunctionsTokenManager = new JwtTokenManager(
820
- `refreshBackendFunctionsToken`
821
- );
822
- backendFunctionsTokenManager.token = process.env.INTUNED_AUTHORING_SESSION_BACKEND_FUNCTIONS_TOKEN;
823
-
824
- // src/common/extension/extensionsHelpers.ts
825
- var import_path = __toESM(require("path"));
826
- var import_promises2 = require("fs/promises");
827
-
828
- // src/common/extension/intunedExtensionServer.ts
829
- var import_fastify = __toESM(require("fastify"));
830
-
831
- // src/common/extension/types.ts
832
- var import_zod = require("zod");
833
- var captchaTypeSchema = import_zod.z.enum([
834
- "aws",
835
- "cloudflare",
836
- "customcaptcha",
837
- "funcaptcha",
838
- "geetest",
839
- "hcaptcha",
840
- "lemincaptcha",
841
- "recaptcha",
842
- "textcaptcha"
843
- ]);
844
- var captchaStatusSchema = import_zod.z.enum([
845
- "attached",
846
- "solving",
847
- "solved",
848
- "error",
849
- "detached"
850
- ]);
851
- var captchaErrorCodeSchema = import_zod.z.enum([
852
- "HIT_LIMIT",
853
- "MAX_RETRIES",
854
- "UNEXPECTED_SERVER_RESPONSE",
855
- "UNEXPECTED_ERROR"
856
- ]);
857
- var captchaErrorSchema = import_zod.z.object({
858
- code: captchaErrorCodeSchema,
859
- error: import_zod.z.unknown().optional()
860
- });
861
- var captchaBaseSchema = import_zod.z.object({
862
- id: import_zod.z.string().min(1),
863
- tabId: import_zod.z.number().int().positive(),
864
- type: captchaTypeSchema,
865
- retryCount: import_zod.z.number().int().nonnegative().optional()
866
- });
867
- var captchaNonErrorSchema = captchaBaseSchema.extend({
868
- status: captchaStatusSchema.exclude(["error"])
869
- });
870
- var captchaErrorStatusSchema = captchaBaseSchema.extend({
871
- status: import_zod.z.literal("error"),
872
- error: captchaErrorSchema
873
- });
874
- var captchaSchema = import_zod.z.discriminatedUnion("status", [
875
- captchaBaseSchema.extend({
876
- status: import_zod.z.literal("attached")
877
- }),
878
- captchaBaseSchema.extend({
879
- status: import_zod.z.literal("solving")
880
- }),
881
- captchaBaseSchema.extend({
882
- status: import_zod.z.literal("solved")
883
- }),
884
- captchaBaseSchema.extend({
885
- status: import_zod.z.literal("detached")
886
- }),
887
- captchaErrorStatusSchema
888
- ]);
889
-
890
- // src/common/extension/intunedExtensionServer.ts
891
- var TabCaptchaState = class {
892
- constructor(tabId) {
893
- this.tabId = tabId;
894
- this.captchasById = /* @__PURE__ */ new Map();
895
- this.subscribers = new Array();
896
- }
897
- subscribe(handler) {
898
- this.subscribers.push(handler);
899
- }
900
- unsubscribe(handler, status) {
901
- const index = this.subscribers.findIndex(
902
- (subscriber) => subscriber.handler === handler && (subscriber.status === status || !status)
903
- );
904
- if (index !== -1) {
905
- this.subscribers.splice(index, 1);
906
- }
907
- }
908
- getCaptchas() {
909
- return [...this.captchasById.values()];
910
- }
911
- async upsertCaptcha(captcha) {
912
- this.captchasById.set(captcha.id, captcha);
913
- for (const subscriber of this.subscribers) {
914
- if (!subscriber.status || subscriber.status === captcha.status) {
915
- await subscriber.handler(captcha);
916
- }
917
- }
918
- }
919
- };
920
- var ExtensionServer = class {
921
- constructor() {
922
- this.app = null;
923
- this.tabs = /* @__PURE__ */ new Map();
924
- }
925
- getOrCreateTab(tabId) {
926
- const existing = this.tabs.get(tabId);
927
- if (existing) return existing;
928
- const created = new TabCaptchaState(tabId);
929
- this.tabs.set(tabId, created);
930
- return created;
931
- }
932
- async handleUpsertCaptcha(captcha) {
933
- const tab = this.getOrCreateTab(captcha.tabId);
934
- await tab.upsertCaptcha(captcha);
935
- }
936
- async start({
937
- port,
938
- host = "0.0.0.0"
939
- }) {
940
- if (this.app) {
941
- return;
942
- }
943
- this.app = (0, import_fastify.default)({
944
- logger: false,
945
- bodyLimit: 1e6
946
- });
947
- this.app.post("/state", async (request, reply) => {
948
- try {
949
- const result = captchaSchema.safeParse(request.body);
950
- if (!result.success) {
951
- return reply.code(400).send({
952
- error: "Invalid captcha payload",
953
- details: result.error.flatten().fieldErrors
954
- });
955
- }
956
- await this.handleUpsertCaptcha(result.data);
957
- return reply.code(200).send({});
958
- } catch (error) {
959
- console.error("Error processing captcha state update:", error);
960
- return reply.code(500).send({
961
- error: "Internal server error",
962
- message: error?.message ?? String(error)
963
- });
964
- }
965
- });
966
- this.app.setNotFoundHandler((_request, reply) => {
967
- return reply.code(404).send({ error: "Not found" });
968
- });
969
- await this.app.listen({
970
- port,
971
- host
972
- });
973
- }
974
- async stop() {
975
- if (!this.app) return;
976
- const toClose = this.app;
977
- this.app = null;
978
- await toClose.close();
979
- }
980
- async getCaptchas(page, status) {
981
- const tabId = await getTabId(page);
982
- const tab = this.tabs.get(tabId);
983
- if (!tab) return [];
984
- const captchas = tab.getCaptchas();
985
- if (!status) return captchas;
986
- return captchas.filter((c) => c.status === status && c.tabId === tabId);
987
- }
988
- async subscribe(page, handler, status) {
989
- const tabId = await getTabId(page);
990
- const tab = this.getOrCreateTab(tabId);
991
- tab.subscribe({ handler, status });
992
- }
993
- async unsubscribe(page, handler, status) {
994
- const tabId = await getTabId(page);
995
- const tab = this.tabs.get(tabId);
996
- if (!tab) return;
997
- tab.unsubscribe(handler, status);
998
- }
999
- removeTab(tabId) {
1000
- this.tabs.delete(tabId);
1001
- }
1002
- async getTabId(page) {
1003
- return await getTabId(page);
1004
- }
1005
- };
1006
- var extensionServerSingleton = null;
1007
- async function setupIntunedExtensionServer(captchaSolverSettings2) {
1008
- if (!captchaSolverSettings2) {
1009
- captchaSolverSettings2 = await resolveCaptchaSolverSettings();
1010
- }
1011
- if (!extensionServerSingleton) {
1012
- extensionServerSingleton = new ExtensionServer();
1013
- }
1014
- await extensionServerSingleton.start({
1015
- port: captchaSolverSettings2.port ?? 9e3
1016
- });
1017
- }
1018
- async function cleanIntunedExtensionServer() {
1019
- if (extensionServerSingleton) {
1020
- await extensionServerSingleton.stop();
1021
- extensionServerSingleton = null;
1022
- }
1023
- }
1024
- var TAB_ID_CACHE_KEY = "__INTUNED_CACHED_TAB_ID__";
1025
- async function getTabId(page) {
1026
- const cached = page[TAB_ID_CACHE_KEY];
1027
- if (cached !== void 0 && typeof cached === "number") {
1028
- return cached;
1029
- }
1030
- let tabId;
1031
- try {
1032
- tabId = await page.evaluate("window.__INTUNED_TAB_ID__", { timeout: 100 });
1033
- } catch {
1034
- await page.waitForFunction("window.__INTUNED_TAB_ID__ !== undefined", {
1035
- timeout: 15e3
1036
- });
1037
- tabId = await page.evaluate("window.__INTUNED_TAB_ID__");
1038
- }
1039
- const numericTabId = Number(tabId);
1040
- page[TAB_ID_CACHE_KEY] = numericTabId;
1041
- return numericTabId;
1042
- }
1043
-
1044
- // src/common/extension/extensionsHelpers.ts
1045
- var import_portfinder = require("portfinder");
1046
- var INTUNED_WORKER = "intunedWorker.js";
1047
- var INTUNED_EXTENSION_SETTINGS_FILE_NAME = "intunedSettings.json";
1048
- var captchaSolverSettings = null;
1049
- async function getIntunedCaptchaExtensionPort() {
1050
- if (process.env.INTUNED_CAPTCHA_EXTENSION_PORT) {
1051
- return parseInt(process.env.INTUNED_CAPTCHA_EXTENSION_PORT, 10);
1052
- }
1053
- return await (0, import_portfinder.getPort)({});
1054
- }
1055
- async function resolveCaptchaSolverSettings(input) {
1056
- const parsed = captchaSolverSettingsSchema.parse(input || {});
1057
- if (!parsed.port) {
1058
- parsed.port = await getIntunedCaptchaExtensionPort();
1059
- }
1060
- return parsed;
1061
- }
1062
- function isIntunedExtensionLoaded() {
1063
- return !!getIntunedExtensionPath();
1064
- }
1065
- function buildExtensionsList() {
1066
- const extensionsList = [];
1067
- if (isIntunedExtensionLoaded()) {
1068
- const intunedExtensionPath = getIntunedExtensionPath();
1069
- extensionsList.push(intunedExtensionPath);
1070
- }
1071
- return extensionsList;
1072
- }
1073
- function getIntunedExtensionPath() {
1074
- return process.env.INTUNED_EXTENSION_PATH;
1075
- }
1076
- async function isIntunedExtensionEnabled() {
1077
- const path3 = getIntunedExtensionPath();
1078
- if (!path3) {
1079
- return false;
1080
- }
1081
- const captchaSolverSettings2 = await getIntunedCaptchaSolverSettings();
1082
- return captchaSolverSettings2.enabled;
1083
- }
1084
- async function getIntunedExtensionWorker(context) {
1085
- if (!await isIntunedExtensionEnabled()) {
1086
- return null;
1087
- }
1088
- let attemptCount = 0;
1089
- while (attemptCount < 4) {
1090
- const intunedServiceWorker = context.serviceWorkers().find((serviceWorker) => serviceWorker.url().includes(INTUNED_WORKER));
1091
- if (intunedServiceWorker) {
1092
- return intunedServiceWorker;
1093
- }
1094
- try {
1095
- await context.waitForEvent("serviceworker", { timeout: 3e3 });
1096
- } catch (err5) {
1097
- console.log(`Error accessing service workers (attempt ${attemptCount})`);
1098
- }
1099
- attemptCount++;
1100
- }
1101
- console.error("Failed to get intuned worker after 5 attmepts");
1102
- return null;
1103
- }
1104
- async function getIntunedExtensionSettings(captchaSolverSettings2) {
1105
- const [domain, workspaceId, projectId] = [
1106
- process.env.FUNCTIONS_DOMAIN,
1107
- process.env[WORKSPACE_ID_ENV_VAR_KEY],
1108
- process.env.INTUNED_INTEGRATION_ID ?? process.env[PROJECT_ID_ENV_VAR_KEY]
1109
- ];
1110
- if (!domain || !workspaceId || !projectId) {
1111
- const missingEnvVars = [
1112
- domain && "FUNCTIONS_DOMAIN",
1113
- workspaceId && WORKSPACE_ID_ENV_VAR_KEY,
1114
- projectId && `INTUNED_INTEGRATION_ID OR ${PROJECT_ID_ENV_VAR_KEY}`
1115
- ];
1116
- throw new Error(
1117
- `Missing required environment variables: ${missingEnvVars}`
1118
- );
1119
- }
1120
- const authentication = (() => {
1121
- if (process.env.INTUNED_API_KEY) {
1122
- return { type: "apiKey", apiKey: process.env.INTUNED_API_KEY };
1123
- }
1124
- if (process.env.INTUNED_BASIC_AUTH_USERNAME && process.env.INTUNED_BASIC_AUTH_PASSWORD) {
1125
- const credentials = `${process.env.INTUNED_BASIC_AUTH_USERNAME}:${process.env.INTUNED_BASIC_AUTH_PASSWORD}`;
1126
- const token = Buffer.from(credentials, "utf-8").toString("base64");
1127
- return { type: "basic", token };
1128
- }
1129
- return {
1130
- type: "bearer",
1131
- token: backendFunctionsTokenManager.token
1132
- };
1133
- })();
1134
- const baseUrl = process.env.INTUNED_API_BASE_URL ?? domain;
1135
- return {
1136
- ...captchaSolverSettings2,
1137
- workspaceId,
1138
- projectId,
1139
- baseUrl,
1140
- authentication
1141
- };
1142
- }
1143
- async function getIntunedCaptchaSolverSettings() {
1144
- if (captchaSolverSettings) {
1145
- return captchaSolverSettings;
1146
- }
1147
- const settings = await getSettings();
1148
- captchaSolverSettings = await resolveCaptchaSolverSettings(
1149
- settings.captchaSolver
1150
- );
1151
- return captchaSolverSettings;
1152
- }
1153
- async function setupIntunedExtension() {
1154
- if (!await isIntunedExtensionEnabled()) {
1155
- return;
1156
- }
1157
- const intunedExtensionPath = getIntunedExtensionPath();
1158
- const intunedExtensionSettingsPath = import_path.default.join(
1159
- intunedExtensionPath,
1160
- INTUNED_EXTENSION_SETTINGS_FILE_NAME
1161
- );
1162
- const captchaSolverSettings2 = await getIntunedCaptchaSolverSettings();
1163
- await setupIntunedExtensionServer(captchaSolverSettings2);
1164
- const captchaSolverSettingsWithRunContext = await getIntunedExtensionSettings(
1165
- captchaSolverSettings2
1166
- );
1167
- await (0, import_promises2.writeFile)(
1168
- intunedExtensionSettingsPath,
1169
- JSON.stringify(captchaSolverSettingsWithRunContext)
1170
- );
1171
- }
1172
-
1173
- // src/common/launchBrowser.ts
1174
- var import_util = require("util");
1175
- var import_neverthrow4 = require("neverthrow");
1176
- var import_zod2 = require("zod");
1177
- var execAsync = (0, import_util.promisify)(import_child_process.exec);
1178
- async function createUserDirWithPreferences() {
1179
- const playwrightTempDir = await (0, import_fs_extra.mkdtemp)("/tmp/pw-");
1180
- const userDir = (0, import_path2.join)(playwrightTempDir, "userdir");
1181
- const defaultDir = (0, import_path2.join)(userDir, "Default");
1182
- await (0, import_fs_extra.mkdir)(defaultDir, {
1183
- recursive: true
1184
- });
1185
- const preferences = {
1186
- plugins: {
1187
- always_open_pdf_externally: true
1188
- }
1189
- };
1190
- await (0, import_fs_extra.writeFile)((0, import_path2.join)(defaultDir, "Preferences"), JSON.stringify(preferences));
1191
- return userDir;
1192
- }
1193
- async function launchChromium(options) {
1194
- if ("cdpAddress" in options) {
1195
- if (await isIntunedExtensionEnabled()) {
1196
- await setupIntunedExtensionServer();
1197
- }
1198
- const browser = await playwright.chromium.connectOverCDP(
1199
- options.cdpAddress
1200
- );
1201
- if (browser.contexts().length === 0) {
1202
- throw new Error("No browser contexts found in the connected browser");
1203
- }
1204
- const context2 = browser.contexts()[0];
1205
- let page2 = context2.pages().at(0) ?? await context2.newPage();
1206
- const targetId = options.cdpTargetId;
1207
- if (targetId) {
1208
- for (const p of context2.pages()) {
1209
- let cdp = null;
1210
- try {
1211
- cdp = await context2.newCDPSession(p);
1212
- const result = await cdp.send("Target.getTargetInfo");
1213
- if (result.targetInfo.targetId === targetId) {
1214
- page2 = p;
1215
- break;
1216
- }
1217
- } catch (error) {
1218
- } finally {
1219
- await cdp?.detach();
1220
- }
1221
- }
1222
- }
1223
- return { page: page2, context: context2 };
1224
- }
1225
- const { headless, appModeInitialUrl, cdpPort, proxy, downloadsPath } = options;
1226
- let { executablePath } = options;
1227
- const defaultArgsToIgnore = [
1228
- "--disable-extensions",
1229
- "--disable-component-extensions-with-background-pages",
1230
- "--disable-background-networking",
1231
- "--disable-backgrounding-occluded-windows",
1232
- "--disable-background-timer-throttling"
1233
- ];
1234
- const extraArgs = [];
1235
- const userDataDir = await createUserDirWithPreferences();
1236
- if (isIntunedExtensionLoaded()) {
1237
- const extensionsList = buildExtensionsList();
1238
- const extensions = extensionsList.join(",");
1239
- extraArgs.push(`--disable-extensions-except=${extensions}`);
1240
- extraArgs.push(`--load-extension=${extensions}`);
1241
- }
1242
- if (await isIntunedExtensionEnabled()) {
1243
- await setupIntunedExtension();
1244
- if (proxy) {
1245
- extraArgs.push('--proxy-bypass-list="<-loopback>"');
1246
- }
1247
- }
1248
- if (cdpPort) {
1249
- extraArgs.push(`--remote-debugging-port=${cdpPort}`);
1250
- }
1251
- if (headless) {
1252
- defaultArgsToIgnore.push("--headless=old");
1253
- extraArgs.push("--headless=new");
1254
- }
1255
- if (appModeInitialUrl) {
1256
- extraArgs.push(`--app=${appModeInitialUrl}`);
1257
- }
1258
- if (executablePath) {
1259
- executablePath = await fs2.realpath(executablePath);
1260
- if (!await fs2.exists(executablePath)) {
1261
- console.log(
1262
- `Warning: Executable path ${executablePath} does not exist. Falling back to default.`
1263
- );
1264
- executablePath = void 0;
1265
- }
1266
- }
1267
- const viewport = null;
1268
- const userAgent = process.env.__PLAYWRIGHT_USER_AGENT_OVERRIDE ?? await getHeadlessUserAgent({
1269
- executablePath
1270
- });
1271
- const context = await playwright.chromium.launchPersistentContext(
1272
- userDataDir,
1273
- {
1274
- userAgent,
1275
- executablePath,
1276
- headless,
1277
- viewport,
1278
- proxy,
1279
- downloadsPath,
1280
- args: extraArgs,
1281
- ignoreDefaultArgs: defaultArgsToIgnore
1282
- }
1283
- );
1284
- context.once("close", async () => {
1285
- try {
1286
- await (0, import_fs_extra.rm)(userDataDir, {
1287
- recursive: true,
1288
- force: true,
1289
- retryDelay: 1e3,
1290
- maxRetries: 5
1291
- });
1292
- if (await isIntunedExtensionEnabled()) {
1293
- await cleanIntunedExtensionServer();
1294
- }
1295
- } catch (error) {
1296
- console.error("Failed to remove user data dir", error);
1297
- }
1298
- });
1299
- if (cdpPort) {
1300
- const createdCdpAddress = getLocalCdpAddress(cdpPort);
1301
- await waitOnCdpAddress(createdCdpAddress);
1302
- }
1303
- const page = context.pages().at(0) ?? await context.newPage();
1304
- if (await isIntunedExtensionEnabled()) {
1305
- await getIntunedExtensionWorker(context);
1306
- }
1307
- return {
1308
- page,
1309
- context
1310
- };
1311
- }
1312
- async function getBrowserExecutablePath() {
1313
- const browserType = getBrowserType();
1314
- if (browserType === "brave") {
1315
- return await getBraveExecutablePath();
1316
- }
1317
- }
1318
- async function launchBrowser(options) {
1319
- if ("cdpAddress" in options) {
1320
- return launchChromium(options);
1321
- }
1322
- return launchChromium({
1323
- ...options,
1324
- executablePath: await getBrowserExecutablePath()
1325
- });
1326
- }
1327
- function getBrowserType() {
1328
- if (process.env.BROWSER_TYPE === "brave") {
1329
- return "brave";
1330
- }
1331
- return "chromium";
1332
- }
1333
- async function getBraveExecutablePath() {
1334
- const { stdout } = await execAsync("which brave-browser-stable");
1335
- const bravePath = stdout.trim();
1336
- if (bravePath.length === 0) {
1337
- throw new Error("Brave browser not found");
1338
- }
1339
- return bravePath;
1340
- }
1341
- function getLocalCdpAddress(port) {
1342
- return `http://localhost:${port}`;
1343
- }
1344
- async function getCdpWebSocketUrl(cdpAddress) {
1345
- let response;
1346
- try {
1347
- response = await fetch(`${cdpAddress}/json/version`);
1348
- } catch (error) {
1349
- return (0, import_neverthrow4.err)(
1350
- `Failed to fetch CDP version from ${cdpAddress}: ${error instanceof Error ? error.message : String(error)}`
1351
- );
1352
- }
1353
- if (!response.ok) {
1354
- return (0, import_neverthrow4.err)(
1355
- `Failed to get CDP WebSocket URL from ${cdpAddress}: ${response.status} ${response.statusText}`
1356
- );
1357
- }
1358
- let data;
1359
- try {
1360
- data = await response.json();
1361
- } catch (error) {
1362
- return (0, import_neverthrow4.err)(
1363
- `Invalid CDP version response from ${cdpAddress}: ${error instanceof Error ? error.message : String(error)}`
1364
- );
1365
- }
1366
- const cdpJsonVersionResponseSchema = import_zod2.z.object({
1367
- webSocketDebuggerUrl: import_zod2.z.string().url()
1368
- });
1369
- const parseResult = cdpJsonVersionResponseSchema.safeParse(data);
1370
- if (!parseResult.success) {
1371
- return (0, import_neverthrow4.err)(
1372
- `Invalid CDP version response from ${cdpAddress}: ${JSON.stringify(
1373
- parseResult.error.format()
1374
- )}`
1375
- );
1376
- }
1377
- return (0, import_neverthrow4.ok)(parseResult.data.webSocketDebuggerUrl);
1378
- }
1379
- async function waitOnCdpAddress(cdpAddress) {
1380
- const cdpAddressWithoutProtocol = cdpAddress.replace("http://", "").replace("https://", "").replace("localhost", "127.0.0.1");
1381
- await (0, import_wait_on.default)({
1382
- resources: [`http-get://${cdpAddressWithoutProtocol}/json/version`],
1383
- delay: 100,
1384
- interval: 100,
1385
- timeout: 5e3,
1386
- tcpTimeout: 1e3,
1387
- window: 1e3
1388
- });
1389
- }
1390
- async function getHeadlessUserAgent({
1391
- executablePath,
1392
- args,
1393
- ignoreDefaultArgs
1394
- }) {
1395
- const browser = await playwright.chromium.launch({
1396
- headless: true,
1397
- executablePath,
1398
- args,
1399
- ignoreDefaultArgs
1400
- });
1401
- const context = await browser.newContext();
1402
- const page = await context.newPage();
1403
- let userAgent = await page.evaluate(() => navigator.userAgent);
1404
- await browser.close();
1405
- if (!userAgent || typeof userAgent !== "string") {
1406
- return void 0;
1407
- }
1408
- userAgent = userAgent.replace("HeadlessChrome", "Chrome");
1409
- return userAgent;
1410
- }
1411
-
1412
- // src/common/playwrightContext.ts
1413
- var import_runtime_interface3 = __toESM(require_dist());
1414
- async function withPlaywrightContext({
1415
- cdpAddress,
1416
- cdpTargetId,
1417
- proxy,
1418
- headless = true,
1419
- downloadsPath,
1420
- importFunction,
1421
- apiName,
1422
- apiParameters
1423
- }, fn) {
1424
- let context;
1425
- let page;
1426
- try {
1427
- const setupContextHookResult = importFunction ? await loadSetupContextHook({
1428
- importFunction
1429
- }) : (0, import_neverthrow5.ok)(null);
1430
- if (setupContextHookResult.isErr()) {
1431
- return setupContextHookResult;
1432
- }
1433
- const setupContextHook = setupContextHookResult.value;
1434
- if (setupContextHook === null) {
1435
- if (cdpAddress !== void 0) {
1436
- ({ page, context } = await launchBrowser({ cdpAddress, cdpTargetId }));
1437
- } else {
1438
- ({ page, context } = await launchBrowser({
1439
- proxy,
1440
- headless,
1441
- downloadsPath
1442
- }));
1443
- }
1444
- return await fn(context, page);
1445
- }
1446
- let hookCdpUrl = null;
1447
- if (cdpAddress) {
1448
- hookCdpUrl = cdpAddress;
1449
- ({ context, page } = await launchBrowser({ cdpAddress, cdpTargetId }));
1450
- } else {
1451
- const port = await (0, import_portfinder2.getPort)({
1452
- port: 9222
1453
- });
1454
- ({ context, page } = await launchBrowser({
1455
- proxy,
1456
- headless,
1457
- downloadsPath,
1458
- cdpPort: port
1459
- }));
1460
- hookCdpUrl = getLocalCdpAddress(port);
1461
- }
1462
- let hookResult;
1463
- try {
1464
- const wsUrlResult = await getCdpWebSocketUrl(hookCdpUrl);
1465
- if (wsUrlResult.isOk()) {
1466
- hookCdpUrl = wsUrlResult.value;
1467
- } else {
1468
- throw new Error(wsUrlResult.error);
1469
- }
1470
- hookResult = await setupContextHook({
1471
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1472
- apiName,
1473
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1474
- apiParameters,
1475
- cdpUrl: hookCdpUrl
1476
- });
1477
- } catch (error) {
1478
- return (0, import_neverthrow5.err)(new import_runtime_interface3.AutomationError(error));
1479
- }
1480
- if (!hookResult) {
1481
- return await fn(context, page);
1482
- }
1483
- const { page: newPage, context: newContext, cleanup } = hookResult;
1484
- let result;
1485
- try {
1486
- result = { return: await fn(newContext, newPage ?? page) };
1487
- } catch (e) {
1488
- result = { throw: e };
1489
- }
1490
- try {
1491
- await cleanup?.();
1492
- } catch (e) {
1493
- result = { return: (0, import_neverthrow5.err)(new import_runtime_interface3.AutomationError(e)) };
1494
- }
1495
- if ("throw" in result) {
1496
- throw result.throw;
1497
- }
1498
- return result.return;
1499
- } finally {
1500
- await context?.close();
1501
- }
1502
- }
1503
- async function loadSessionToContext({
1504
- context,
1505
- session
1506
- }) {
1507
- let sessionToLoad;
1508
- if (session.type === "state") {
1509
- const state = session.state;
1510
- if (state === void 0 || state === null) {
1511
- return;
1512
- }
1513
- sessionToLoad = state;
1514
- } else {
1515
- const fullPath = getFullPathInProject(session.path);
1516
- sessionToLoad = await fs3.readJson(fullPath);
1517
- }
1518
- await setStorageState(context, sessionToLoad);
1519
- }
1520
-
1521
- // src/commands/auth-sessions/load.ts
1522
- var import_dotenv2 = __toESM(require("dotenv"));
1523
- var import_neverthrow6 = require("neverthrow");
1524
- import_dotenv2.default.config({
1525
- path: `.env`
1526
- });
1527
- import_commander.program.description("load AuthSession to browser").option("--cdpAddress <cdpAddress>", "CDP address", "http://localhost:9222").option(
1528
- "--authSessionPath <authSession>",
1529
- "AuthSession to use when executing the api"
1530
- ).allowUnknownOption().action(
1531
- async ({
1532
- cdpAddress,
1533
- authSessionPath
1534
- }) => {
1535
- const setting = await getSettings();
1536
- if (!setting.authSessions.enabled) {
1537
- throw new Error(
1538
- "Authentication required but not configured.\nEnable AuthSessions in Intuned.json to use this feature.\nSee https://docs.intunedhq.com/docs/cli/auth-sessions for more information."
1539
- );
1540
- }
1541
- await withPlaywrightContext(
1542
- {
1543
- cdpAddress
1544
- },
1545
- async (context) => {
1546
- await loadSessionToContext({
1547
- context,
1548
- session: {
1549
- type: "file",
1550
- path: authSessionPath
1551
- }
1552
- });
1553
- return (0, import_neverthrow6.ok)({});
1554
- }
1555
- );
1556
- process.exit(0);
1557
- }
1558
- );
1559
- import_commander.program.parse(process.argv);