@sonisoft/now-sdk-ext-cli 5.6.0 → 5.7.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.
@@ -1,6 +1,6 @@
1
1
  import { Command, Flags } from '@oclif/core';
2
- import { logger as sdkLogger } from '@servicenow/sdk-cli/dist/logger/index.js';
3
2
  import { createBrowserSession } from '@sonisoft/now-sdk-ext-core';
3
+ import { silenceSdkLoggers } from '../../common/sdk-logger.js';
4
4
  import { writeBrowserSession } from '../../services/browser-session-writer.js';
5
5
  export default class BrowserSessionCommand extends Command {
6
6
  static description = 'Create a verified Playwright cookie session using a stored SDK alias.';
@@ -13,7 +13,7 @@ export default class BrowserSessionCommand extends Command {
13
13
  };
14
14
  async run() {
15
15
  const { flags } = await this.parse(BrowserSessionCommand);
16
- sdkLogger.setLevel('silent');
16
+ silenceSdkLoggers();
17
17
  if ((flags['cred-store'] || process.env.SN_CRED_STORE_ENABLE) && process.env.NOW_SDK_KEYCHAIN_PATCHED !== '1') {
18
18
  this.error('The requested credential store is inactive. Unset SN_CRED_STORE_DISABLE and check nex auth doctor.');
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../../src/commands/auth/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAC,MAAM,IAAI,SAAS,EAAC,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAC,oBAAoB,EAAC,MAAM,4BAA4B,CAAA;AAE/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,0CAA0C,CAAA;AAE5E,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,OAAO;IACxD,MAAM,CAAC,WAAW,GAAG,uEAAuE,CAAA;IAC5F,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IAC5B,MAAM,CAAC,KAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,8BAA8B,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;QAC5F,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,WAAW,EAAE,oCAAoC,EAAC,CAAC;QAChF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,WAAW,EAAE,0CAA0C,EAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,2CAA2C,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;KACjG,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACvD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;YAC9G,IAAI,CAAC,KAAK,CAAC,oGAAoG,CAAC,CAAA;QAClH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAC,CAAC,CAAA;QAC/D,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW;YACpF,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI;SAC7C,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,QAAQ,CAAA;IACjB,CAAC"}
1
+ {"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../../src/commands/auth/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAC,oBAAoB,EAAC,MAAM,4BAA4B,CAAA;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAC,mBAAmB,EAAC,MAAM,0CAA0C,CAAA;AAE5E,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,OAAO;IACxD,MAAM,CAAC,WAAW,GAAG,uEAAuE,CAAA;IAC5F,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IAC5B,MAAM,CAAC,KAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,8BAA8B,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;QAC5F,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,WAAW,EAAE,oCAAoC,EAAC,CAAC;QAChF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAC,WAAW,EAAE,0CAA0C,EAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,WAAW,EAAE,2CAA2C,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;KACjG,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACvD,iBAAiB,EAAE,CAAA;QACnB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;YAC9G,IAAI,CAAC,KAAK,CAAC,oGAAoG,CAAC,CAAA;QAClH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAC,CAAC,CAAA;QAC/D,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW;YACpF,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI;SAC7C,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,QAAQ,CAAA;IACjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class AuthOpen extends Command {
3
+ static description: string;
4
+ static enableJsonFlag: boolean;
5
+ static examples: {
6
+ command: string;
7
+ description: string;
8
+ }[];
9
+ static flags: {
10
+ auth: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ browser: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<"brave" | "chrome" | "edge", import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ cdp: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ 'cred-store': import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
14
+ force: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
15
+ output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
+ };
17
+ run(): Promise<unknown>;
18
+ }
19
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAQ,MAAM,aAAa,CAAA;AAwB1C,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAC,WAAW,SAAwF;IAC1G,MAAM,CAAC,cAAc,UAAO;IAC5B,MAAM,CAAC,QAAQ;;;QAId;IACD,MAAM,CAAC,KAAK;;;;;;;MAWX;IAEK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAmD9B"}
@@ -0,0 +1,88 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { createBrowserSession, injectBrowserSessionCdp } from '@sonisoft/now-sdk-ext-core';
3
+ import { mkdir } from 'node:fs/promises';
4
+ import { silenceSdkLoggers } from '../../common/sdk-logger.js';
5
+ import { writeBrowserSession } from '../../services/browser-session-writer.js';
6
+ import { allocateLoopbackPort, BROWSER_LABELS, isWindowsBrowserBinary, isWsl, profileDirectory, resolveBrowserBinary, spawnDedicatedBrowser, startWslWindowsCdpBridge, } from '../../services/desktop-browser.service.js';
7
+ function remediationOf(error) {
8
+ if (!error || typeof error !== 'object')
9
+ return;
10
+ const value = error;
11
+ return typeof value.remediation === 'string' ? value.remediation : undefined;
12
+ }
13
+ export default class AuthOpen extends Command {
14
+ static description = 'Open a verified UI session in a dedicated desktop browser using a stored SDK alias.';
15
+ static enableJsonFlag = true;
16
+ static examples = [
17
+ { command: '<%= config.bin %> <%= command.id %> -a bcbsscdev --cred-store', description: 'Open the alias in Edge' },
18
+ { command: '<%= config.bin %> <%= command.id %> -a dev206299 --browser chrome', description: 'Open in Chrome' },
19
+ { command: '<%= config.bin %> <%= command.id %> -a dev206299 --cdp http://127.0.0.1:9222', description: 'Inject into an already-debuggable browser' },
20
+ ];
21
+ static flags = {
22
+ auth: Flags.string({ char: 'a', description: 'Stored SDK credential alias.', required: true }),
23
+ browser: Flags.option({
24
+ default: 'edge',
25
+ description: 'Desktop browser to launch. Ignored when --cdp is set.',
26
+ options: ['edge', 'chrome', 'brave'],
27
+ })(),
28
+ cdp: Flags.string({ description: 'Existing DevTools URL. Skips launching a browser.' }),
29
+ 'cred-store': Flags.boolean({ description: 'Use the headless credential store.' }),
30
+ force: Flags.boolean({ description: 'Replace an existing regular output file.' }),
31
+ output: Flags.string({ description: 'Optional owner-only Playwright storage-state file.' }),
32
+ };
33
+ async run() {
34
+ const { flags } = await this.parse(AuthOpen);
35
+ silenceSdkLoggers();
36
+ if ((flags['cred-store'] || process.env.SN_CRED_STORE_ENABLE) && process.env.NOW_SDK_KEYCHAIN_PATCHED !== '1') {
37
+ this.error('The requested credential store is inactive. Unset SN_CRED_STORE_DISABLE and check nex auth doctor.');
38
+ }
39
+ const browser = flags.browser;
40
+ let disposeBridge;
41
+ try {
42
+ const session = await createBrowserSession({ alias: flags.auth });
43
+ const path = flags.output ? await writeBrowserSession(session, flags.output, flags.force) : undefined;
44
+ let cdpUrl = flags.cdp;
45
+ if (!cdpUrl) {
46
+ const binary = await resolveBrowserBinary(browser);
47
+ if (isWsl() && isWindowsBrowserBinary(binary)) {
48
+ const bridge = await startWslWindowsCdpBridge(flags.auth, binary);
49
+ cdpUrl = bridge.cdpUrl;
50
+ disposeBridge = bridge.dispose;
51
+ }
52
+ else {
53
+ const port = await allocateLoopbackPort();
54
+ const userDataDir = profileDirectory(flags.auth);
55
+ await mkdir(userDataDir, { mode: 0o700, recursive: true });
56
+ spawnDedicatedBrowser({ binary, port, userDataDir });
57
+ cdpUrl = `http://127.0.0.1:${port}`;
58
+ }
59
+ }
60
+ await injectBrowserSessionCdp({
61
+ cdpUrl,
62
+ session,
63
+ ...(disposeBridge ? { timeoutMs: 30_000 } : {}),
64
+ });
65
+ const metadata = {
66
+ alias: session.alias,
67
+ browser,
68
+ cdpUrl,
69
+ instanceUrl: session.instanceUrl,
70
+ ...(path ? { path } : {}),
71
+ ...(session.oauthExpiresAt ? { oauthExpiresAt: session.oauthExpiresAt } : {}),
72
+ };
73
+ if (!this.jsonEnabled())
74
+ this.log(`Opened ${session.instanceUrl} in ${BROWSER_LABELS[browser]}`);
75
+ return metadata;
76
+ }
77
+ catch (error) {
78
+ const remediation = remediationOf(error);
79
+ if (remediation)
80
+ this.error(remediation);
81
+ throw error;
82
+ }
83
+ finally {
84
+ disposeBridge?.();
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/auth/open.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Silence every installed SDK logger copy.
3
+ *
4
+ * Core 6.6.0 may nest `@servicenow/sdk-cli` 4.12 beside the CLI's own copy.
5
+ * `createBrowserSession` logs through that nested logger, so silencing only
6
+ * the top-level import leaks `[now-sdk]` refresh lines onto stdout.
7
+ */
8
+ export declare function silenceSdkLoggers(): void;
9
+ //# sourceMappingURL=sdk-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-logger.d.ts","sourceRoot":"","sources":["../../src/common/sdk-logger.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC"}
@@ -0,0 +1,21 @@
1
+ import { logger as sdkLogger } from '@servicenow/sdk-cli/dist/logger/index.js';
2
+ import { createRequire } from 'node:module';
3
+ const require = createRequire(import.meta.url);
4
+ /**
5
+ * Silence every installed SDK logger copy.
6
+ *
7
+ * Core 6.6.0 may nest `@servicenow/sdk-cli` 4.12 beside the CLI's own copy.
8
+ * `createBrowserSession` logs through that nested logger, so silencing only
9
+ * the top-level import leaks `[now-sdk]` refresh lines onto stdout.
10
+ */
11
+ export function silenceSdkLoggers() {
12
+ sdkLogger.setLevel('silent');
13
+ try {
14
+ const coreRequire = createRequire(require.resolve('@sonisoft/now-sdk-ext-core/package.json'));
15
+ coreRequire('@servicenow/sdk-cli/dist/logger/index.js').logger.setLevel('silent');
16
+ }
17
+ catch {
18
+ // A single sdk-cli copy is enough.
19
+ }
20
+ }
21
+ //# sourceMappingURL=sdk-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-logger.js","sourceRoot":"","sources":["../../src/common/sdk-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,IAAI,SAAS,EAAC,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAA;AAEzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,CAAA;QAC7F,WAAW,CAAC,0CAA0C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { type ChildProcess, execFile, spawn } from 'node:child_process';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ export type DesktopBrowserName = 'brave' | 'chrome' | 'edge';
4
+ export declare const BROWSER_LABELS: Record<DesktopBrowserName, string>;
5
+ declare const execFileAsync: typeof execFile.__promisify__;
6
+ /** User-mode TCP pipe so WSL can reach a Windows-loopback DevTools port. */
7
+ export declare const CDP_RELAY_SOURCE = "'use strict';\nconst net = require('net');\nconst listenHost = process.argv[2];\nconst port = Number(process.argv[3]);\nif (!listenHost || !Number.isInteger(port)) process.exit(2);\nconst server = net.createServer((client) => {\n const upstream = net.connect(port, '127.0.0.1');\n const close = () => { client.destroy(); upstream.destroy(); };\n client.pipe(upstream);\n upstream.pipe(client);\n client.on('error', close);\n upstream.on('error', close);\n});\nserver.on('error', () => process.exit(1));\nserver.listen(port, listenHost);\n";
8
+ export declare function isWsl(env?: NodeJS.ProcessEnv): boolean;
9
+ export declare function isWindowsBrowserBinary(binary: string): boolean;
10
+ export declare function profileDirectory(alias: string, env?: NodeJS.ProcessEnv): string;
11
+ export declare function toWslPath(windowsPath: string): string;
12
+ export declare function browserCandidates(name: DesktopBrowserName, options?: {
13
+ env?: NodeJS.ProcessEnv;
14
+ platform?: NodeJS.Platform;
15
+ }): string[];
16
+ export declare function resolveBrowserBinary(name: DesktopBrowserName, options?: {
17
+ env?: NodeJS.ProcessEnv;
18
+ exists?: (path: string) => Promise<boolean>;
19
+ platform?: NodeJS.Platform;
20
+ }): Promise<string>;
21
+ export declare function allocateLoopbackPort(): Promise<number>;
22
+ export declare function browserLaunchArgs(port: number, userDataDir: string): string[];
23
+ export declare function spawnDedicatedBrowser(options: {
24
+ binary: string;
25
+ port: number;
26
+ spawn?: typeof spawn;
27
+ userDataDir: string;
28
+ }): ChildProcess;
29
+ export declare function parseDedicatedBrowserPort(commandLine: string, alias: string): number | undefined;
30
+ export declare function findDedicatedWindowsBrowserPort(alias: string, options?: {
31
+ commandLines?: string[];
32
+ execFile?: typeof execFileAsync;
33
+ }): Promise<number | undefined>;
34
+ export declare function windowsProfileDirectory(alias: string, localAppData: string): string;
35
+ export declare function parseProcNetRouteGateway(table: string): string | undefined;
36
+ export declare function wslWindowsHost(env?: NodeJS.ProcessEnv, routeTable?: string): string | undefined;
37
+ export declare function resolveWindowsLocalAppData(env?: NodeJS.ProcessEnv): Promise<string>;
38
+ export declare function readWslWindowsHost(env?: NodeJS.ProcessEnv): Promise<string>;
39
+ export declare function startWslWindowsCdpBridge(alias: string, binary: string, options?: {
40
+ env?: NodeJS.ProcessEnv;
41
+ existingPort?: number;
42
+ exists?: (path: string) => Promise<boolean>;
43
+ host?: string;
44
+ localAppData?: string;
45
+ mkdir?: typeof mkdir;
46
+ nodeBinary?: string;
47
+ port?: number;
48
+ spawn?: typeof spawn;
49
+ writeFile?: typeof writeFile;
50
+ }): Promise<{
51
+ cdpUrl: string;
52
+ dispose: () => void;
53
+ userDataDir: string;
54
+ }>;
55
+ export {};
56
+ //# sourceMappingURL=desktop-browser.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-browser.service.d.ts","sourceRoot":"","sources":["../../src/services/desktop-browser.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ import { execFile, spawn } from 'node:child_process';
2
+ import { constants as fsConstants } from 'node:fs';
3
+ import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { createServer } from 'node:net';
5
+ import { homedir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { promisify } from 'node:util';
8
+ export const BROWSER_LABELS = {
9
+ brave: 'Brave',
10
+ chrome: 'Chrome',
11
+ edge: 'Edge',
12
+ };
13
+ const ALIAS_PATTERN = /^[A-Za-z0-9._-]+$/;
14
+ const execFileAsync = promisify(execFile);
15
+ /** User-mode TCP pipe so WSL can reach a Windows-loopback DevTools port. */
16
+ export const CDP_RELAY_SOURCE = `'use strict';
17
+ const net = require('net');
18
+ const listenHost = process.argv[2];
19
+ const port = Number(process.argv[3]);
20
+ if (!listenHost || !Number.isInteger(port)) process.exit(2);
21
+ const server = net.createServer((client) => {
22
+ const upstream = net.connect(port, '127.0.0.1');
23
+ const close = () => { client.destroy(); upstream.destroy(); };
24
+ client.pipe(upstream);
25
+ upstream.pipe(client);
26
+ client.on('error', close);
27
+ upstream.on('error', close);
28
+ });
29
+ server.on('error', () => process.exit(1));
30
+ server.listen(port, listenHost);
31
+ `;
32
+ export function isWsl(env = process.env) {
33
+ return Boolean(env.WSL_DISTRO_NAME || env.WSL_INTEROP);
34
+ }
35
+ export function isWindowsBrowserBinary(binary) {
36
+ return /\.exe$/i.test(binary) || /^\/mnt\/[a-z]\//i.test(binary);
37
+ }
38
+ export function profileDirectory(alias, env = process.env) {
39
+ if (!ALIAS_PATTERN.test(alias)) {
40
+ throw new Error('Auth alias must contain only letters, digits, dots, underscores, or hyphens.');
41
+ }
42
+ const root = env.XDG_STATE_HOME || join(homedir(), '.local', 'state');
43
+ return join(root, 'nex', 'ui-profiles', alias);
44
+ }
45
+ export function toWslPath(windowsPath) {
46
+ const match = /^([A-Za-z]):[\\/](.*)$/.exec(windowsPath);
47
+ if (!match)
48
+ return windowsPath.replaceAll('\\', '/');
49
+ return `/mnt/${match[1].toLowerCase()}/${match[2].replaceAll('\\', '/')}`;
50
+ }
51
+ function windowsPaths(name, env) {
52
+ const programFiles = env.PROGRAMFILES || String.raw `C:\Program Files`;
53
+ const programFilesX86 = env['PROGRAMFILES(X86)'] || String.raw `C:\Program Files (x86)`;
54
+ const localAppData = env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local');
55
+ if (name === 'edge') {
56
+ return [
57
+ `${programFilesX86}\\Microsoft\\Edge\\Application\\msedge.exe`,
58
+ `${programFiles}\\Microsoft\\Edge\\Application\\msedge.exe`,
59
+ ];
60
+ }
61
+ if (name === 'chrome') {
62
+ return [
63
+ `${programFiles}\\Google\\Chrome\\Application\\chrome.exe`,
64
+ `${programFilesX86}\\Google\\Chrome\\Application\\chrome.exe`,
65
+ ];
66
+ }
67
+ return [
68
+ `${programFiles}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
69
+ `${programFilesX86}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
70
+ `${localAppData}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
71
+ ];
72
+ }
73
+ function macPaths(name) {
74
+ if (name === 'edge')
75
+ return ['/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge'];
76
+ if (name === 'chrome')
77
+ return ['/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'];
78
+ return ['/Applications/Brave Browser.app/Contents/MacOS/Brave Browser'];
79
+ }
80
+ function linuxPaths(name) {
81
+ if (name === 'edge')
82
+ return ['/usr/bin/microsoft-edge', '/usr/bin/microsoft-edge-stable', '/usr/bin/msedge'];
83
+ if (name === 'chrome') {
84
+ return ['/usr/bin/google-chrome', '/usr/bin/google-chrome-stable', '/usr/bin/chromium', '/usr/bin/chromium-browser'];
85
+ }
86
+ return ['/usr/bin/brave-browser', '/usr/bin/brave'];
87
+ }
88
+ export function browserCandidates(name, options = {}) {
89
+ const env = options.env ?? process.env;
90
+ const platform = options.platform ?? process.platform;
91
+ const windows = windowsPaths(name, env);
92
+ if (platform === 'win32')
93
+ return windows;
94
+ if (platform === 'darwin')
95
+ return [...macPaths(name), ...linuxPaths(name)];
96
+ const linux = linuxPaths(name);
97
+ if (isWsl(env))
98
+ return [...windows.map(path => toWslPath(path)), ...linux];
99
+ return linux;
100
+ }
101
+ async function defaultExists(path) {
102
+ try {
103
+ await access(path, fsConstants.F_OK);
104
+ return true;
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ }
110
+ export async function resolveBrowserBinary(name, options = {}) {
111
+ const exists = options.exists ?? defaultExists;
112
+ const matches = await Promise.all(browserCandidates(name, options).map(async (candidate) => ({ candidate, ok: await exists(candidate) })));
113
+ const hit = matches.find(item => item.ok);
114
+ if (hit)
115
+ return hit.candidate;
116
+ throw new Error(`Could not find ${BROWSER_LABELS[name]}. Install it, or pass --cdp after starting the browser with --remote-debugging-port.`);
117
+ }
118
+ export async function allocateLoopbackPort() {
119
+ return new Promise((resolve, reject) => {
120
+ const server = createServer();
121
+ server.once('error', reject);
122
+ server.listen(0, '127.0.0.1', () => {
123
+ const address = server.address();
124
+ server.close(error => {
125
+ if (error)
126
+ reject(error);
127
+ else if (!address || typeof address === 'string')
128
+ reject(new Error('Could not allocate a loopback port.'));
129
+ else
130
+ resolve(address.port);
131
+ });
132
+ });
133
+ });
134
+ }
135
+ export function browserLaunchArgs(port, userDataDir) {
136
+ return [
137
+ `--user-data-dir=${userDataDir}`,
138
+ `--remote-debugging-port=${port}`,
139
+ '--remote-allow-origins=*',
140
+ '--no-first-run',
141
+ '--no-default-browser-check',
142
+ 'about:blank',
143
+ ];
144
+ }
145
+ export function spawnDedicatedBrowser(options) {
146
+ const child = (options.spawn ?? spawn)(options.binary, browserLaunchArgs(options.port, options.userDataDir), {
147
+ detached: true,
148
+ stdio: 'ignore',
149
+ });
150
+ child.unref();
151
+ return child;
152
+ }
153
+ export function parseDedicatedBrowserPort(commandLine, alias) {
154
+ if (!ALIAS_PATTERN.test(alias))
155
+ return;
156
+ const marker = `nex\\ui-profiles\\${alias}`;
157
+ const posix = `nex/ui-profiles/${alias}`;
158
+ if (!commandLine.includes(marker) && !commandLine.includes(posix))
159
+ return;
160
+ const match = /--remote-debugging-port=(\d+)/.exec(commandLine);
161
+ if (!match)
162
+ return;
163
+ const port = Number(match[1]);
164
+ return Number.isInteger(port) && port > 0 ? port : undefined;
165
+ }
166
+ export async function findDedicatedWindowsBrowserPort(alias, options = {}) {
167
+ const lines = options.commandLines ?? await listWindowsBrowserCommandLines(options.execFile);
168
+ for (const line of lines) {
169
+ const port = parseDedicatedBrowserPort(line, alias);
170
+ if (port)
171
+ return port;
172
+ }
173
+ }
174
+ async function listWindowsBrowserCommandLines(execFileImpl = execFileAsync) {
175
+ try {
176
+ const { stdout } = await execFileImpl('powershell.exe', ['-NoProfile', '-Command', 'Get-CimInstance Win32_Process -Filter "name=\'msedge.exe\'" | Select-Object -ExpandProperty CommandLine'], { cwd: '/mnt/c/Windows', timeout: 10_000 });
177
+ return stdout.split(/\r?\n/).map(line => line.trim()).filter(Boolean);
178
+ }
179
+ catch {
180
+ return [];
181
+ }
182
+ }
183
+ export function windowsProfileDirectory(alias, localAppData) {
184
+ if (!ALIAS_PATTERN.test(alias)) {
185
+ throw new Error('Auth alias must contain only letters, digits, dots, underscores, or hyphens.');
186
+ }
187
+ return `${localAppData}\\nex\\ui-profiles\\${alias}`;
188
+ }
189
+ export function parseProcNetRouteGateway(table) {
190
+ for (const line of table.split(/\r?\n/)) {
191
+ const columns = line.trim().split(/\s+/);
192
+ if (columns[1] !== '00000000' || !columns[2] || columns[2] === '00000000')
193
+ continue;
194
+ const hex = columns[2];
195
+ if (!/^[0-9A-Fa-f]{8}$/.test(hex))
196
+ continue;
197
+ return [hex.slice(6, 8), hex.slice(4, 6), hex.slice(2, 4), hex.slice(0, 2)]
198
+ .map(part => Number.parseInt(part, 16))
199
+ .join('.');
200
+ }
201
+ }
202
+ export function wslWindowsHost(env = process.env, routeTable) {
203
+ const override = env.NEX_WSL_HOST?.trim();
204
+ if (override)
205
+ return override;
206
+ if (routeTable === undefined)
207
+ return;
208
+ return parseProcNetRouteGateway(routeTable);
209
+ }
210
+ export async function resolveWindowsLocalAppData(env = process.env) {
211
+ const fromEnv = env.LOCALAPPDATA?.trim();
212
+ if (fromEnv)
213
+ return fromEnv;
214
+ const { stdout } = await execFileAsync('cmd.exe', ['/c', 'echo %LOCALAPPDATA%'], {
215
+ cwd: '/mnt/c/Windows',
216
+ timeout: 10_000,
217
+ });
218
+ const value = stdout.trim();
219
+ if (!value || value.includes('%LOCALAPPDATA%')) {
220
+ throw new Error('Could not resolve %LOCALAPPDATA% for a Windows browser profile.');
221
+ }
222
+ return value;
223
+ }
224
+ function windowsNodeCandidates(localAppData) {
225
+ return [
226
+ '/mnt/c/Program Files/nodejs/node.exe',
227
+ `${toWslPath(localAppData)}/hermes/node/node.exe`,
228
+ ];
229
+ }
230
+ async function resolveWindowsNodeBinary(localAppData, exists) {
231
+ const matches = await Promise.all(windowsNodeCandidates(localAppData).map(async (candidate) => ({ candidate, ok: await exists(candidate) })));
232
+ const hit = matches.find(item => item.ok);
233
+ if (hit)
234
+ return hit.candidate;
235
+ throw new Error('WSL cannot reach Windows Edge DevTools on 127.0.0.1. Install Node.js on Windows for the localhost relay, or pass --cdp after starting Edge with --remote-debugging-port.');
236
+ }
237
+ export async function readWslWindowsHost(env = process.env) {
238
+ const override = wslWindowsHost(env);
239
+ if (override)
240
+ return override;
241
+ const table = await readFile('/proc/net/route', 'utf8');
242
+ const host = parseProcNetRouteGateway(table);
243
+ if (!host) {
244
+ throw new Error('Could not find the Windows host address from WSL. Set NEX_WSL_HOST or pass --cdp after starting the browser with --remote-debugging-port.');
245
+ }
246
+ return host;
247
+ }
248
+ export async function startWslWindowsCdpBridge(alias, binary, options = {}) {
249
+ const env = options.env ?? process.env;
250
+ const exists = options.exists ?? defaultExists;
251
+ const makeDirectory = options.mkdir ?? mkdir;
252
+ const write = options.writeFile ?? writeFile;
253
+ const localAppData = options.localAppData ?? await resolveWindowsLocalAppData(env);
254
+ const host = options.host ?? await readWslWindowsHost(env);
255
+ const existingPort = options.existingPort ?? (options.port === undefined ? await findDedicatedWindowsBrowserPort(alias) : undefined);
256
+ const port = options.port ?? existingPort ?? await allocateLoopbackPort();
257
+ const userDataDir = windowsProfileDirectory(alias, localAppData);
258
+ const profileOnWsl = toWslPath(userDataDir);
259
+ await makeDirectory(profileOnWsl, { mode: 0o700, recursive: true });
260
+ if (existingPort === undefined) {
261
+ spawnDedicatedBrowser({
262
+ binary,
263
+ port,
264
+ spawn: options.spawn,
265
+ userDataDir,
266
+ });
267
+ }
268
+ const nodeBinary = options.nodeBinary ?? await resolveWindowsNodeBinary(localAppData, exists);
269
+ const relayWindowsPath = `${localAppData}\\Temp\\nex-cdp-relay.cjs`;
270
+ await write(toWslPath(relayWindowsPath), CDP_RELAY_SOURCE, 'utf8');
271
+ const relay = (options.spawn ?? spawn)(nodeBinary, [relayWindowsPath, host, String(port)], {
272
+ stdio: 'ignore',
273
+ windowsHide: true,
274
+ });
275
+ return {
276
+ cdpUrl: `http://${host}:${port}`,
277
+ dispose() {
278
+ relay.kill();
279
+ },
280
+ userDataDir,
281
+ };
282
+ }
283
+ //# sourceMappingURL=desktop-browser.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-browser.service.js","sourceRoot":"","sources":["../../src/services/desktop-browser.service.ts"],"names":[],"mappings":"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"}