@vforsh/argus 0.1.11 → 0.1.12

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 (100) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/argus.js +5881 -5892
  3. package/dist/bin.js +4 -47
  4. package/dist/bin.js.map +1 -1
  5. package/dist/cli/program.d.ts.map +1 -1
  6. package/dist/cli/program.js +2 -1
  7. package/dist/cli/program.js.map +1 -1
  8. package/dist/cli/register/domCommandBuilder.d.ts +22 -0
  9. package/dist/cli/register/domCommandBuilder.d.ts.map +1 -0
  10. package/dist/cli/register/domCommandBuilder.js +33 -0
  11. package/dist/cli/register/domCommandBuilder.js.map +1 -0
  12. package/dist/cli/register/index.d.ts +4 -0
  13. package/dist/cli/register/index.d.ts.map +1 -0
  14. package/dist/cli/register/index.js +45 -0
  15. package/dist/cli/register/index.js.map +1 -0
  16. package/dist/cli/register/registerDom.d.ts.map +1 -1
  17. package/dist/cli/register/registerDom.js +138 -121
  18. package/dist/cli/register/registerDom.js.map +1 -1
  19. package/dist/commands/chrome/browser.d.ts +5 -0
  20. package/dist/commands/chrome/browser.d.ts.map +1 -0
  21. package/dist/commands/chrome/browser.js +71 -0
  22. package/dist/commands/chrome/browser.js.map +1 -0
  23. package/dist/commands/chrome/processes.d.ts +24 -0
  24. package/dist/commands/chrome/processes.d.ts.map +1 -0
  25. package/dist/commands/chrome/processes.js +115 -0
  26. package/dist/commands/chrome/processes.js.map +1 -0
  27. package/dist/commands/chrome/shared.d.ts +31 -0
  28. package/dist/commands/chrome/shared.d.ts.map +1 -0
  29. package/dist/commands/chrome/shared.js +48 -0
  30. package/dist/commands/chrome/shared.js.map +1 -0
  31. package/dist/commands/chrome/targets.d.ts +26 -0
  32. package/dist/commands/chrome/targets.d.ts.map +1 -0
  33. package/dist/commands/chrome/targets.js +240 -0
  34. package/dist/commands/chrome/targets.js.map +1 -0
  35. package/dist/commands/chrome.d.ts +6 -63
  36. package/dist/commands/chrome.d.ts.map +1 -1
  37. package/dist/commands/chrome.js +3 -511
  38. package/dist/commands/chrome.js.map +1 -1
  39. package/dist/commands/dom/shared.d.ts +12 -0
  40. package/dist/commands/dom/shared.d.ts.map +1 -0
  41. package/dist/commands/dom/shared.js +42 -0
  42. package/dist/commands/dom/shared.js.map +1 -0
  43. package/dist/commands/domAdd.d.ts.map +1 -1
  44. package/dist/commands/domAdd.js +11 -27
  45. package/dist/commands/domAdd.js.map +1 -1
  46. package/dist/commands/domClick.d.ts.map +1 -1
  47. package/dist/commands/domClick.js +14 -40
  48. package/dist/commands/domClick.js.map +1 -1
  49. package/dist/commands/domFill.d.ts.map +1 -1
  50. package/dist/commands/domFill.js +10 -31
  51. package/dist/commands/domFill.js.map +1 -1
  52. package/dist/commands/domFocus.d.ts.map +1 -1
  53. package/dist/commands/domFocus.js +11 -26
  54. package/dist/commands/domFocus.js.map +1 -1
  55. package/dist/commands/domHover.d.ts.map +1 -1
  56. package/dist/commands/domHover.js +11 -26
  57. package/dist/commands/domHover.js.map +1 -1
  58. package/dist/commands/domInfo.d.ts.map +1 -1
  59. package/dist/commands/domInfo.js +10 -25
  60. package/dist/commands/domInfo.js.map +1 -1
  61. package/dist/commands/domModify.d.ts.map +1 -1
  62. package/dist/commands/domModify.js +14 -26
  63. package/dist/commands/domModify.js.map +1 -1
  64. package/dist/commands/domRemove.d.ts.map +1 -1
  65. package/dist/commands/domRemove.js +10 -25
  66. package/dist/commands/domRemove.js.map +1 -1
  67. package/dist/commands/domScroll.d.ts.map +1 -1
  68. package/dist/commands/domScroll.js +7 -33
  69. package/dist/commands/domScroll.js.map +1 -1
  70. package/dist/commands/domScrollTo.d.ts.map +1 -1
  71. package/dist/commands/domScrollTo.js +7 -33
  72. package/dist/commands/domScrollTo.js.map +1 -1
  73. package/dist/commands/domSetFile.d.ts.map +1 -1
  74. package/dist/commands/domSetFile.js +14 -36
  75. package/dist/commands/domSetFile.js.map +1 -1
  76. package/dist/commands/domTree.d.ts.map +1 -1
  77. package/dist/commands/domTree.js +10 -25
  78. package/dist/commands/domTree.js.map +1 -1
  79. package/dist/commands/extension/setup.js +1 -1
  80. package/dist/commands/extension/setup.js.map +1 -1
  81. package/dist/commands/start.d.ts +1 -1
  82. package/dist/commands/start.d.ts.map +1 -1
  83. package/dist/commands/start.js +15 -42
  84. package/dist/commands/start.js.map +1 -1
  85. package/dist/commands/watcherSession.d.ts +29 -0
  86. package/dist/commands/watcherSession.d.ts.map +1 -0
  87. package/dist/commands/watcherSession.js +64 -0
  88. package/dist/commands/watcherSession.js.map +1 -0
  89. package/dist/commands/watcherStart.d.ts +1 -1
  90. package/dist/commands/watcherStart.d.ts.map +1 -1
  91. package/dist/commands/watcherStart.js +15 -40
  92. package/dist/commands/watcherStart.js.map +1 -1
  93. package/dist/config/argusConfig.d.ts.map +1 -1
  94. package/dist/config/argusConfig.js +69 -81
  95. package/dist/config/argusConfig.js.map +1 -1
  96. package/dist/watchers/requestWatcher.d.ts +13 -1
  97. package/dist/watchers/requestWatcher.d.ts.map +1 -1
  98. package/dist/watchers/requestWatcher.js +32 -0
  99. package/dist/watchers/requestWatcher.js.map +1 -1
  100. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/commands/chrome/browser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGvD,eAAO,MAAM,gBAAgB,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,IAAI,CAmBlF,CAAA;AAED,eAAO,MAAM,eAAe,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,IAAI,CAwBjF,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,IAAI,CAgC/E,CAAA"}
@@ -0,0 +1,71 @@
1
+ import { sendCdpCommand } from '../../cdp/sendCdpCommand.js';
2
+ import { createOutput } from '../../output/io.js';
3
+ import { loadChromeVersion, resolveChromeEndpointOrExit } from './shared.js';
4
+ export const runChromeVersion = async (options) => {
5
+ const output = createOutput(options);
6
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
7
+ if (!endpoint) {
8
+ return;
9
+ }
10
+ const response = await loadChromeVersion(endpoint, output);
11
+ if (!response) {
12
+ return;
13
+ }
14
+ if (options.json) {
15
+ output.writeJson(response);
16
+ return;
17
+ }
18
+ output.writeHuman(`Browser: ${response.Browser}`);
19
+ output.writeHuman(`WebSocket: ${response.webSocketDebuggerUrl}`);
20
+ };
21
+ export const runChromeStatus = async (options) => {
22
+ const output = createOutput(options);
23
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
24
+ if (!endpoint) {
25
+ return;
26
+ }
27
+ const response = await loadChromeVersion(endpoint, output);
28
+ if (!response) {
29
+ return;
30
+ }
31
+ if (!response.Browser) {
32
+ output.writeWarn(`invalid response from ${endpoint.host}:${endpoint.port}`);
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ if (options.json) {
37
+ output.writeJson(response);
38
+ return;
39
+ }
40
+ output.writeHuman(`ok ${endpoint.host}:${endpoint.port} ${response.Browser}`);
41
+ };
42
+ export const runChromeStop = async (options) => {
43
+ const output = createOutput(options);
44
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
45
+ if (!endpoint) {
46
+ return;
47
+ }
48
+ const response = await loadChromeVersion(endpoint, output);
49
+ if (!response) {
50
+ return;
51
+ }
52
+ if (!response.webSocketDebuggerUrl) {
53
+ output.writeWarn(`No browser WebSocket endpoint exposed at ${endpoint.host}:${endpoint.port}.`);
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ try {
58
+ await sendCdpCommand(response.webSocketDebuggerUrl, { id: 1, method: 'Browser.close' });
59
+ }
60
+ catch (error) {
61
+ output.writeWarn(`Failed to close Chrome at ${endpoint.host}:${endpoint.port}: ${error instanceof Error ? error.message : error}`);
62
+ process.exitCode = 1;
63
+ return;
64
+ }
65
+ if (options.json) {
66
+ output.writeJson({ closed: true, host: endpoint.host, port: endpoint.port });
67
+ return;
68
+ }
69
+ output.writeHuman(`closed ${endpoint.host}:${endpoint.port}`);
70
+ };
71
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/commands/chrome/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type ChromeListOptions = {
2
+ json?: boolean;
3
+ pages?: boolean;
4
+ };
5
+ export type ChromeInstanceInfo = {
6
+ port: number;
7
+ pid: number;
8
+ browser: string;
9
+ webSocketDebuggerUrl: string;
10
+ targets: number;
11
+ pages: number;
12
+ pageDetails?: Array<{
13
+ title: string;
14
+ url: string;
15
+ }>;
16
+ };
17
+ /** Discover reachable Chrome instances with CDP enabled. */
18
+ export declare const discoverChromeInstances: (options?: {
19
+ pages?: boolean;
20
+ }) => Promise<ChromeInstanceInfo[]>;
21
+ /** Format a Chrome instance as a human-readable line. */
22
+ export declare const formatChromeInstanceLine: (result: ChromeInstanceInfo) => string;
23
+ export declare const runChromeList: (options: ChromeListOptions) => Promise<void>;
24
+ //# sourceMappingURL=processes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.d.ts","sourceRoot":"","sources":["../../../src/commands/chrome/processes.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEnE,MAAM,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB,EAAE,MAAM,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,uBAAuB,GAAU,UAAU;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,OAAO,CAAC,kBAAkB,EAAE,CA6BzG,CAAA;AAED,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,GAAI,QAAQ,kBAAkB,KAAG,MAC8C,CAAA;AAEpH,eAAO,MAAM,aAAa,GAAU,SAAS,iBAAiB,KAAG,OAAO,CAAC,IAAI,CA6B5E,CAAA"}
@@ -0,0 +1,115 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { fetchJson } from '../../httpClient.js';
3
+ import { createOutput } from '../../output/io.js';
4
+ /** Discover reachable Chrome instances with CDP enabled. */
5
+ export const discoverChromeInstances = async (options) => {
6
+ const ports = await discoverChromeCdpPorts();
7
+ if (ports.length === 0)
8
+ return [];
9
+ const results = await Promise.all(ports.map(async ({ port, pid }) => {
10
+ try {
11
+ const [version, targets] = await Promise.all([
12
+ fetchJson(`http://127.0.0.1:${port}/json/version`, { timeoutMs: 2_000 }),
13
+ fetchJson(`http://127.0.0.1:${port}/json/list`, { timeoutMs: 2_000 }),
14
+ ]);
15
+ const userPages = targets.filter((t) => t.type === 'page' && isUserPage(t.url));
16
+ return {
17
+ port,
18
+ pid,
19
+ reachable: true,
20
+ browser: version.Browser,
21
+ webSocketDebuggerUrl: version.webSocketDebuggerUrl,
22
+ targets: targets.length,
23
+ pages: userPages.length,
24
+ ...(options?.pages && { pageDetails: userPages.map((p) => ({ title: p.title, url: p.url })) }),
25
+ };
26
+ }
27
+ catch {
28
+ return { port, pid, reachable: false };
29
+ }
30
+ }));
31
+ return results.filter((result) => result.reachable);
32
+ };
33
+ /** Format a Chrome instance as a human-readable line. */
34
+ export const formatChromeInstanceLine = (result) => `127.0.0.1:${result.port} pid=${result.pid} ${result.browser} ${result.pages} page${result.pages === 1 ? '' : 's'}`;
35
+ export const runChromeList = async (options) => {
36
+ const output = createOutput(options);
37
+ const ports = await discoverChromeCdpPorts();
38
+ if (ports.length === 0) {
39
+ output.writeHuman('No Chrome instances found listening on TCP ports.');
40
+ return;
41
+ }
42
+ const instances = await discoverChromeInstances(options);
43
+ if (instances.length === 0) {
44
+ output.writeHuman('Found Chrome processes listening on TCP, but none responded to CDP.');
45
+ return;
46
+ }
47
+ if (options.json) {
48
+ output.writeJson(instances);
49
+ return;
50
+ }
51
+ for (const result of instances) {
52
+ output.writeHuman(formatChromeInstanceLine(result));
53
+ if (!result.pageDetails) {
54
+ continue;
55
+ }
56
+ for (const page of result.pageDetails) {
57
+ output.writeHuman(` ${page.title} — ${page.url}`);
58
+ }
59
+ }
60
+ };
61
+ /**
62
+ * Chrome-internal URLs that CDP reports as `type: "page"` but are not user-visible tabs.
63
+ * Covers omnibox popups, NTP sub-frames, side panels, and other top-chrome UI surfaces.
64
+ */
65
+ const CHROME_INTERNAL_URL_PATTERN = /^(devtools|chrome-untrusted):\/\/|\.top-chrome\/|^chrome:\/\/newtab-footer\b/;
66
+ const isUserPage = (url) => !CHROME_INTERNAL_URL_PATTERN.test(url);
67
+ /**
68
+ * Match Chrome/Chromium process names in lsof output.
69
+ * With `+c 0`, macOS lsof escapes spaces as `\x20` (e.g. `Google\x20Chrome`).
70
+ */
71
+ const CHROME_NAME_PATTERN = /\b(google(\s|\\x20)*chrome|chromium|chrome)\b/i;
72
+ const discoverChromeCdpPorts = async () => {
73
+ let stdout;
74
+ try {
75
+ stdout = await new Promise((resolve, reject) => {
76
+ execFile('lsof', ['+c', '0', '-iTCP', '-sTCP:LISTEN', '-P', '-n'], { timeout: 5_000 }, (error, out) => {
77
+ if (error) {
78
+ reject(error);
79
+ return;
80
+ }
81
+ resolve(out);
82
+ });
83
+ });
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ const seen = new Set();
89
+ const results = [];
90
+ for (const line of stdout.split('\n')) {
91
+ if (!CHROME_NAME_PATTERN.test(line)) {
92
+ continue;
93
+ }
94
+ const pidMatch = line.match(/\s+(\d+)\s+/);
95
+ if (!pidMatch) {
96
+ continue;
97
+ }
98
+ const pid = parseInt(pidMatch[1], 10);
99
+ if (isNaN(pid)) {
100
+ continue;
101
+ }
102
+ const portMatch = line.match(/:(\d+)\s+\(LISTEN\)/);
103
+ if (!portMatch) {
104
+ continue;
105
+ }
106
+ const port = parseInt(portMatch[1], 10);
107
+ if (isNaN(port) || seen.has(port)) {
108
+ continue;
109
+ }
110
+ seen.add(port);
111
+ results.push({ port, pid });
112
+ }
113
+ return results;
114
+ };
115
+ //# sourceMappingURL=processes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../../src/commands/chrome/processes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { WatcherRecord } from '@vforsh/argus-core';
2
+ import type { ChromeTargetResponse } from '../../cdp/types.js';
3
+ import type { CdpEndpointOptions } from '../../cdp/resolveCdpEndpoint.js';
4
+ import type { Output } from '../../output/io.js';
5
+ export type ChromeEndpointOptions = CdpEndpointOptions;
6
+ export type ChromeVersionResponse = {
7
+ Browser: string;
8
+ 'Protocol-Version': string;
9
+ 'User-Agent': string;
10
+ 'V8-Version': string;
11
+ 'WebKit-Version': string;
12
+ webSocketDebuggerUrl: string;
13
+ };
14
+ export type ChromeCommandOptions = ChromeEndpointOptions & {
15
+ json?: boolean;
16
+ };
17
+ export declare const normalizeUrl: (url: string) => string;
18
+ export declare const resolveChromeEndpointOrExit: (options: ChromeEndpointOptions, output: Output) => Promise<{
19
+ host: string;
20
+ port: number;
21
+ } | null>;
22
+ export declare const loadChromeVersion: (endpoint: {
23
+ host: string;
24
+ port: number;
25
+ }, output: Output) => Promise<ChromeVersionResponse | null>;
26
+ export declare const loadChromeTargets: (endpoint: {
27
+ host: string;
28
+ port: number;
29
+ }, output: Output) => Promise<ChromeTargetResponse[] | null>;
30
+ export declare const resolveWatcherOrExit: (id: string, output: Output) => Promise<WatcherRecord | null>;
31
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/chrome/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGhD,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,CAAA;AAEtD,MAAM,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAK1C,CAAA;AAED,eAAO,MAAM,2BAA2B,GAAU,SAAS,qBAAqB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS/I,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAU,UAAU;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAQtI,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAU,UAAU;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAQvI,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAU,IAAI,MAAM,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CASnG,CAAA"}
@@ -0,0 +1,48 @@
1
+ import { resolveCdpEndpoint } from '../../cdp/resolveCdpEndpoint.js';
2
+ import { fetchJson } from '../../httpClient.js';
3
+ import { resolveWatcher } from '../../watchers/resolveWatcher.js';
4
+ export const normalizeUrl = (url) => {
5
+ if (url.startsWith('http://') || url.startsWith('https://')) {
6
+ return url;
7
+ }
8
+ return `http://${url}`;
9
+ };
10
+ export const resolveChromeEndpointOrExit = async (options, output) => {
11
+ const endpoint = await resolveCdpEndpoint(options);
12
+ if (!endpoint.ok) {
13
+ output.writeWarn(endpoint.error);
14
+ process.exitCode = endpoint.exitCode;
15
+ return null;
16
+ }
17
+ return endpoint;
18
+ };
19
+ export const loadChromeVersion = async (endpoint, output) => {
20
+ try {
21
+ return await fetchJson(`http://${endpoint.host}:${endpoint.port}/json/version`);
22
+ }
23
+ catch (error) {
24
+ output.writeWarn(`Failed to connect to Chrome at ${endpoint.host}:${endpoint.port}: ${error instanceof Error ? error.message : error}`);
25
+ process.exitCode = 1;
26
+ return null;
27
+ }
28
+ };
29
+ export const loadChromeTargets = async (endpoint, output) => {
30
+ try {
31
+ return await fetchJson(`http://${endpoint.host}:${endpoint.port}/json/list`);
32
+ }
33
+ catch (error) {
34
+ output.writeWarn(`Failed to load targets from ${endpoint.host}:${endpoint.port}: ${error instanceof Error ? error.message : error}`);
35
+ process.exitCode = 1;
36
+ return null;
37
+ }
38
+ };
39
+ export const resolveWatcherOrExit = async (id, output) => {
40
+ const resolved = await resolveWatcher({ id });
41
+ if (!resolved.ok) {
42
+ output.writeWarn(resolved.error);
43
+ process.exitCode = resolved.exitCode;
44
+ return null;
45
+ }
46
+ return resolved.watcher;
47
+ };
48
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/chrome/shared.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAiBjE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE;IACnD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,OAAO,GAAG,CAAA;IACX,CAAC;IACD,OAAO,UAAU,GAAG,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAAE,OAA8B,EAAE,MAAc,EAAkD,EAAE;IACnJ,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAClD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;QACpC,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,OAAO,QAAQ,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAwC,EAAE,MAAc,EAAyC,EAAE;IAC1I,IAAI,CAAC;QACJ,OAAO,MAAM,SAAS,CAAwB,UAAU,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,eAAe,CAAC,CAAA;IACvG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,kCAAkC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACvI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAwC,EAAE,MAAc,EAA0C,EAAE;IAC3I,IAAI,CAAC;QACJ,OAAO,MAAM,SAAS,CAAyB,UAAU,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,YAAY,CAAC,CAAA;IACrG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,+BAA+B,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACpI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EAAU,EAAE,MAAc,EAAiC,EAAE;IACvG,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;QACpC,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAA;AACxB,CAAC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import type { ChromeCommandOptions } from './shared.js';
2
+ export type ChromeTargetsOptions = ChromeCommandOptions & {
3
+ type?: string;
4
+ tree?: boolean;
5
+ };
6
+ export type ChromeOpenOptions = ChromeCommandOptions & {
7
+ url: string;
8
+ };
9
+ export type ChromeActivateOptions = ChromeCommandOptions & {
10
+ targetId?: string;
11
+ title?: string;
12
+ url?: string;
13
+ match?: string;
14
+ };
15
+ export type ChromeCloseOptions = ChromeCommandOptions & {
16
+ targetId: string;
17
+ };
18
+ export type ChromeReloadOptions = ChromeCommandOptions & {
19
+ targetId: string;
20
+ };
21
+ export declare const runChromeTargets: (options: ChromeTargetsOptions) => Promise<void>;
22
+ export declare const runChromeOpen: (options: ChromeOpenOptions) => Promise<void>;
23
+ export declare const runChromeActivate: (options: ChromeActivateOptions) => Promise<void>;
24
+ export declare const runChromeClose: (options: ChromeCloseOptions) => Promise<void>;
25
+ export declare const runChromeReload: (options: ChromeReloadOptions) => Promise<void>;
26
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../../src/commands/chrome/targets.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGvD,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,GAAG;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG;IACtD,GAAG,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,GAAG;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG;IACvD,QAAQ,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG;IACxD,QAAQ,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAU,SAAS,oBAAoB,KAAG,OAAO,CAAC,IAAI,CAiClF,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAyB5E,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAU,SAAS,qBAAqB,KAAG,OAAO,CAAC,IAAI,CA4DpF,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,SAAS,kBAAkB,KAAG,OAAO,CAAC,IAAI,CA4B9E,CAAA;AAED,eAAO,MAAM,eAAe,GAAU,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CA6ChF,CAAA"}
@@ -0,0 +1,240 @@
1
+ import { sendCdpCommand } from '../../cdp/sendCdpCommand.js';
2
+ import { filterTargets, selectTargetFromCandidates } from '../../cdp/selectTarget.js';
3
+ import { fetchJson, fetchText } from '../../httpClient.js';
4
+ import { createOutput } from '../../output/io.js';
5
+ import { loadChromeTargets, normalizeUrl, resolveChromeEndpointOrExit, resolveWatcherOrExit } from './shared.js';
6
+ export const runChromeTargets = async (options) => {
7
+ const output = createOutput(options);
8
+ if (options.id) {
9
+ const watcher = await resolveWatcherOrExit(options.id, output);
10
+ if (!watcher) {
11
+ return;
12
+ }
13
+ if (watcher.source === 'extension') {
14
+ try {
15
+ const response = await fetchJson(`http://${watcher.host}:${watcher.port}/targets`);
16
+ renderTargets(response.targets, { output, type: options.type, tree: options.tree, json: options.json });
17
+ return;
18
+ }
19
+ catch (error) {
20
+ output.writeWarn(`Failed to load watcher targets from ${watcher.id}: ${error instanceof Error ? error.message : error}`);
21
+ process.exitCode = 1;
22
+ return;
23
+ }
24
+ }
25
+ }
26
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
27
+ if (!endpoint) {
28
+ return;
29
+ }
30
+ const targets = await loadChromeTargets(endpoint, output);
31
+ if (!targets) {
32
+ return;
33
+ }
34
+ renderTargets(targets, { output, type: options.type, tree: options.tree, json: options.json });
35
+ };
36
+ export const runChromeOpen = async (options) => {
37
+ const output = createOutput(options);
38
+ if (!options.url || options.url.trim() === '') {
39
+ output.writeWarn('--url is required.');
40
+ process.exitCode = 2;
41
+ return;
42
+ }
43
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
44
+ if (!endpoint) {
45
+ return;
46
+ }
47
+ const encodedUrl = encodeURIComponent(normalizeUrl(options.url.trim()));
48
+ try {
49
+ const target = await fetchJson(`http://${endpoint.host}:${endpoint.port}/json/new?${encodedUrl}`, { method: 'PUT' });
50
+ if (options.json) {
51
+ output.writeJson(target);
52
+ return;
53
+ }
54
+ output.writeHuman(`${target.id} ${target.url}`);
55
+ }
56
+ catch (error) {
57
+ output.writeWarn(`Failed to open tab: ${error instanceof Error ? error.message : error}`);
58
+ process.exitCode = 1;
59
+ }
60
+ };
61
+ export const runChromeActivate = async (options) => {
62
+ const output = createOutput(options);
63
+ const targetIdInput = options.targetId?.trim();
64
+ const hasTargetId = Boolean(targetIdInput);
65
+ const hasFilters = Boolean(options.title || options.url || options.match);
66
+ if (hasTargetId && hasFilters) {
67
+ output.writeWarn('Cannot combine targetId with --title/--url/--match.');
68
+ process.exitCode = 2;
69
+ return;
70
+ }
71
+ if (!hasTargetId && !hasFilters) {
72
+ output.writeWarn('targetId or --title/--url/--match is required.');
73
+ process.exitCode = 2;
74
+ return;
75
+ }
76
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
77
+ if (!endpoint) {
78
+ return;
79
+ }
80
+ let targetId = targetIdInput;
81
+ if (!targetId) {
82
+ const targets = await loadChromeTargets(endpoint, output);
83
+ if (!targets) {
84
+ return;
85
+ }
86
+ const candidates = filterTargets(targets, { title: options.title, url: options.url, match: options.match });
87
+ const selection = await selectTargetFromCandidates(candidates, output, {
88
+ interactive: process.stdin.isTTY === true,
89
+ messages: {
90
+ empty: 'No targets matched the provided filters.',
91
+ ambiguous: 'Multiple targets matched. Provide a narrower filter or a targetId.',
92
+ },
93
+ });
94
+ if (!selection.ok) {
95
+ output.writeWarn(selection.error);
96
+ process.exitCode = selection.exitCode;
97
+ return;
98
+ }
99
+ targetId = selection.target.id;
100
+ }
101
+ try {
102
+ await fetchText(`http://${endpoint.host}:${endpoint.port}/json/activate/${targetId}`);
103
+ }
104
+ catch (error) {
105
+ output.writeWarn(`Failed to activate target: ${error instanceof Error ? error.message : error}`);
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ if (options.json) {
110
+ output.writeJson({ activated: targetId });
111
+ return;
112
+ }
113
+ output.writeHuman(`activated ${targetId}`);
114
+ };
115
+ export const runChromeClose = async (options) => {
116
+ const output = createOutput(options);
117
+ if (!options.targetId || options.targetId.trim() === '') {
118
+ output.writeWarn('targetId is required.');
119
+ process.exitCode = 2;
120
+ return;
121
+ }
122
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
123
+ if (!endpoint) {
124
+ return;
125
+ }
126
+ const targetId = options.targetId.trim();
127
+ try {
128
+ await fetchText(`http://${endpoint.host}:${endpoint.port}/json/close/${targetId}`);
129
+ }
130
+ catch (error) {
131
+ output.writeWarn(`Failed to close target: ${error instanceof Error ? error.message : error}`);
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ if (options.json) {
136
+ output.writeJson({ closed: targetId });
137
+ return;
138
+ }
139
+ output.writeHuman(`closed ${targetId}`);
140
+ };
141
+ export const runChromeReload = async (options) => {
142
+ const output = createOutput(options);
143
+ if (!options.targetId || options.targetId.trim() === '') {
144
+ output.writeWarn('targetId is required.');
145
+ process.exitCode = 2;
146
+ return;
147
+ }
148
+ const endpoint = await resolveChromeEndpointOrExit(options, output);
149
+ if (!endpoint) {
150
+ return;
151
+ }
152
+ const targets = await loadChromeTargets(endpoint, output);
153
+ if (!targets) {
154
+ return;
155
+ }
156
+ const target = targets.find((entry) => entry.id === options.targetId.trim());
157
+ if (!target) {
158
+ output.writeWarn(`Target not found: ${options.targetId.trim()}`);
159
+ process.exitCode = 2;
160
+ return;
161
+ }
162
+ if (!target.webSocketDebuggerUrl) {
163
+ output.writeWarn(`Target ${target.id} has no webSocketDebuggerUrl.`);
164
+ process.exitCode = 1;
165
+ return;
166
+ }
167
+ try {
168
+ await sendCdpCommand(target.webSocketDebuggerUrl, { id: 1, method: 'Page.reload' });
169
+ }
170
+ catch (error) {
171
+ output.writeWarn(`Failed to reload target ${target.id}: ${error instanceof Error ? error.message : error}`);
172
+ process.exitCode = 1;
173
+ return;
174
+ }
175
+ if (options.json) {
176
+ output.writeJson({ reloaded: target.id, url: target.url });
177
+ return;
178
+ }
179
+ output.writeHuman(`reloaded ${target.id}`);
180
+ };
181
+ const renderTargets = (targets, options) => {
182
+ let filteredTargets = targets;
183
+ if (options.type) {
184
+ filteredTargets = filteredTargets.filter((target) => target.type === options.type);
185
+ }
186
+ if (options.json) {
187
+ options.output.writeJson(filteredTargets);
188
+ return;
189
+ }
190
+ if (options.tree) {
191
+ renderTargetTree(filteredTargets, options.output);
192
+ return;
193
+ }
194
+ for (const target of filteredTargets) {
195
+ const title = target.title ? ` ${target.title}` : '';
196
+ const targetUrl = target.url ? ` ${target.url}` : '';
197
+ const parentInfo = target.parentId ? ` [parent: ${target.parentId.slice(0, 8)}...]` : '';
198
+ options.output.writeHuman(`${target.id} ${target.type}${title}${targetUrl}${parentInfo}`);
199
+ }
200
+ };
201
+ const renderTargetTree = (targets, output) => {
202
+ const targetById = new Map(targets.map((target) => [target.id, target]));
203
+ const childrenByParent = new Map();
204
+ for (const target of targets) {
205
+ const parentId = target.parentId ?? null;
206
+ const children = childrenByParent.get(parentId) ?? [];
207
+ children.push(target);
208
+ childrenByParent.set(parentId, children);
209
+ }
210
+ const roots = targets.filter((target) => !target.parentId || !targetById.has(target.parentId));
211
+ if (roots.length === 0) {
212
+ output.writeHuman('(no targets)');
213
+ return;
214
+ }
215
+ const renderNode = (target, prefix, isLast) => {
216
+ const connector = isLast ? '└── ' : '├── ';
217
+ const title = target.title || '(untitled)';
218
+ const shortId = `${target.id.slice(0, 8)}...`;
219
+ output.writeHuman(`${prefix}${connector}${title} (${target.type}, ${shortId})`);
220
+ output.writeHuman(`${prefix}${isLast ? ' ' : '│ '}${target.url}`);
221
+ const children = childrenByParent.get(target.id) ?? [];
222
+ children.forEach((child, index) => {
223
+ renderNode(child, prefix + (isLast ? ' ' : '│ '), index === children.length - 1);
224
+ });
225
+ };
226
+ roots.forEach((root, index) => {
227
+ const title = root.title || '(untitled)';
228
+ const shortId = `${root.id.slice(0, 8)}...`;
229
+ output.writeHuman(`${title} (${root.type}, ${shortId})`);
230
+ output.writeHuman(root.url);
231
+ const children = childrenByParent.get(root.id) ?? [];
232
+ children.forEach((child, childIndex) => {
233
+ renderNode(child, '', childIndex === children.length - 1);
234
+ });
235
+ if (index < roots.length - 1) {
236
+ output.writeHuman('');
237
+ }
238
+ });
239
+ };
240
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../src/commands/chrome/targets.ts"],"names":[],"mappings":"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"}