@xbrowser/cli 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +858 -0
  2. package/dist/admin-6UTU2RZ2.js +281 -0
  3. package/dist/admin-MDGF4CET.js +285 -0
  4. package/dist/admin-RPJJ5CAF.js +282 -0
  5. package/dist/browser-GWBH6OJK.js +46 -0
  6. package/dist/browser-I2HJZ7IP.js +48 -0
  7. package/dist/browser-R7B255ML.js +46 -0
  8. package/dist/chunk-2ONMTDLK.js +2050 -0
  9. package/dist/chunk-3RG5ZIWI.js +10 -0
  10. package/dist/chunk-43VX3TYN.js +83 -0
  11. package/dist/chunk-ATFTAKMN.js +267 -0
  12. package/dist/chunk-DESA2KMG.js +77 -0
  13. package/dist/chunk-DTJRVA76.js +206 -0
  14. package/dist/chunk-F3ZWFCJJ.js +2051 -0
  15. package/dist/chunk-FF5WHQHN.js +135 -0
  16. package/dist/chunk-HINTG75P.js +77 -0
  17. package/dist/chunk-KDYXFLAC.js +1503 -0
  18. package/dist/chunk-KTSQU4QT.js +29 -0
  19. package/dist/chunk-L53IDAWK.js +68 -0
  20. package/dist/chunk-M7CMBPCA.js +100 -0
  21. package/dist/chunk-NFGO7J2I.js +29 -0
  22. package/dist/chunk-OLB6UJ25.js +438 -0
  23. package/dist/chunk-OPRXFZVE.js +52 -0
  24. package/dist/chunk-RS6YYWTK.js +685 -0
  25. package/dist/chunk-VEDJ5XSQ.js +196 -0
  26. package/dist/chunk-VEKPHQBR.js +47 -0
  27. package/dist/chunk-VUJDJCIN.js +437 -0
  28. package/dist/chunk-YEN2ODUI.js +14 -0
  29. package/dist/chunk-ZZ2TFWIV.js +1382 -0
  30. package/dist/cli.js +11012 -0
  31. package/dist/convert-4DUWZIKH.js +205 -0
  32. package/dist/convert-EKQVHKB4.js +11 -0
  33. package/dist/daemon-client-3IJD6X4B.js +59 -0
  34. package/dist/daemon-client-GX2UYIW4.js +241 -0
  35. package/dist/daemon-client-XWSSQBEA.js +58 -0
  36. package/dist/daemon-main.js +9910 -0
  37. package/dist/extract-EGRXZSSK.js +67 -0
  38. package/dist/extract-JUOQQX4V.js +11 -0
  39. package/dist/filter-OLAE26HN.js +51 -0
  40. package/dist/filter-VID2GGZ7.js +9 -0
  41. package/dist/human-interaction-QPHNDD76.js +8 -0
  42. package/dist/index.d.ts +2313 -0
  43. package/dist/index.js +13839 -0
  44. package/dist/marketplace-FCVN5OTZ.js +706 -0
  45. package/dist/marketplace-FPT5YLKB.js +351 -0
  46. package/dist/marketplace-W545W4FR.js +706 -0
  47. package/dist/network-store-2S5HATEV.js +194 -0
  48. package/dist/network-store-BN6QEZ7R.js +196 -0
  49. package/dist/network-store-YAF5OIBH.js +12 -0
  50. package/dist/parse-action-dsl-DRSPBALP.js +72 -0
  51. package/dist/parse-action-dsl-T3DYC33D.js +74 -0
  52. package/dist/proxy-WKGUCH2C.js +7 -0
  53. package/dist/session-recorder-ILSSV2UC.js +6 -0
  54. package/dist/session-recorder-XET3DNML.js +7 -0
  55. package/package.json +111 -0
@@ -0,0 +1,205 @@
1
+ // src/commands/convert.ts
2
+ function escapeString(str) {
3
+ return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");
4
+ }
5
+ function generateJSScript(recording) {
6
+ const events = aggregateEvents(recording.events || []);
7
+ let script = `#!/usr/bin/env node
8
+ // Auto-generated replay script from xbrowser
9
+ // Start URL: ${recording.startUrl}
10
+ // Events: ${events.length}
11
+
12
+ import { chromium } from 'playwright';
13
+
14
+ const START_URL = '${escapeString(recording.startUrl)}';
15
+
16
+ async function main() {
17
+ const browser = await chromium.launch({ headless: true });
18
+ const context = await browser.newContext();
19
+ const page = await context.newPage();
20
+
21
+ console.log('Navigating to', START_URL);
22
+ await page.goto(START_URL, { waitUntil: 'domcontentloaded' });
23
+ await page.waitForTimeout(1000);
24
+ `;
25
+ for (const event of events) {
26
+ script += generateJSEvent(event);
27
+ }
28
+ script += `
29
+ console.log('Replay completed!');
30
+ await browser.close();
31
+ }
32
+
33
+ main().catch((e) => { console.error(e); process.exit(1); });
34
+ `;
35
+ return script;
36
+ }
37
+ function generateJSEvent(event) {
38
+ switch (event.type) {
39
+ case "click":
40
+ return `
41
+ // Click: ${event.selector}
42
+ await page.click('${escapeString(event.selector || "body")}');
43
+ await page.waitForTimeout(100);
44
+ `;
45
+ case "type":
46
+ case "input":
47
+ return `
48
+ // Input: ${event.selector}
49
+ await page.fill('${escapeString(event.selector || "input")}', '${escapeString(event.data?.value || "")}');
50
+ await page.waitForTimeout(100);
51
+ `;
52
+ case "keydown":
53
+ case "keypress":
54
+ if (event.data?.key === "Enter") {
55
+ return `
56
+ // Press Enter
57
+ await page.keyboard.press('Enter');
58
+ await page.waitForTimeout(100);
59
+ `;
60
+ }
61
+ return "";
62
+ case "scroll":
63
+ return `
64
+ // Scroll
65
+ await page.evaluate(() => window.scrollTo(${event.data?.x || 0}, ${event.data?.y || 0}));
66
+ await page.waitForTimeout(50);
67
+ `;
68
+ case "navigate":
69
+ case "page_load":
70
+ return "";
71
+ default:
72
+ return "";
73
+ }
74
+ }
75
+ function generatePythonScript(recording) {
76
+ const events = recording.events || [];
77
+ let script = `#!/usr/bin/env python3
78
+ # Auto-generated replay script from xbrowser
79
+ # Start URL: ${recording.startUrl}
80
+
81
+ import asyncio
82
+ from playwright.async_api import async_playwright
83
+
84
+ START_URL = "${recording.startUrl}"
85
+
86
+ async def main():
87
+ async with async_playwright() as p:
88
+ browser = await p.chromium.launch(headless=True)
89
+ context = await browser.new_context()
90
+ page = await context.new_page()
91
+
92
+ print(f"Navigating to {START_URL}")
93
+ await page.goto(START_URL)
94
+ await asyncio.sleep(1)
95
+ `;
96
+ for (const event of events) {
97
+ script += generatePythonEvent(event);
98
+ }
99
+ script += `
100
+ print("Replay completed!")
101
+ await browser.close()
102
+
103
+ asyncio.run(main())
104
+ `;
105
+ return script;
106
+ }
107
+ function generatePythonEvent(event) {
108
+ switch (event.type) {
109
+ case "click":
110
+ return ` # Click: ${event.selector}
111
+ await page.click('${escapeString(event.selector || "body")}')
112
+ await asyncio.sleep(0.1)
113
+ `;
114
+ case "type":
115
+ case "input":
116
+ return ` # Input: ${event.selector}
117
+ await page.fill('${escapeString(event.selector || "input")}', '${escapeString(event.data?.value || "")}')
118
+ await asyncio.sleep(0.1)
119
+ `;
120
+ case "keydown":
121
+ case "keypress":
122
+ if (event.data?.key === "Enter") {
123
+ return ` # Press Enter
124
+ await page.keyboard.press('Enter')
125
+ await asyncio.sleep(0.1)
126
+ `;
127
+ }
128
+ return "";
129
+ default:
130
+ return "";
131
+ }
132
+ }
133
+ function generateBashScript(recording) {
134
+ const events = recording.events || [];
135
+ let script = `#!/bin/bash
136
+ # Auto-generated replay script from xbrowser
137
+ # Start URL: ${recording.startUrl}
138
+
139
+ CDP_URL="\${CDP_URL:-http://localhost:9222}"
140
+
141
+ echo "Navigating to ${recording.startUrl}..."
142
+ curl -s "$CDP_URL/json/new?${encodeURIComponent(recording.startUrl)}" > /dev/null
143
+ sleep 2
144
+ `;
145
+ for (const event of events) {
146
+ script += generateBashEvent(event);
147
+ }
148
+ script += `
149
+ echo "Replay completed!"
150
+ `;
151
+ return script;
152
+ }
153
+ function generateBashEvent(event) {
154
+ switch (event.type) {
155
+ case "click":
156
+ return `# Click: ${event.selector}
157
+ curl -s "$CDP_URL/json/execute" -d '{
158
+ "method": "Runtime.evaluate",
159
+ "params": { "expression": "document.querySelector('${escapeString(event.selector || "body")}').click()" }
160
+ }' > /dev/null
161
+ sleep 0.1
162
+ `;
163
+ case "type":
164
+ case "input":
165
+ return `# Input: ${event.selector}
166
+ curl -s "$CDP_URL/json/execute" -d '{
167
+ "method": "Runtime.evaluate",
168
+ "params": { "expression": "document.querySelector('${escapeString(event.selector || "input")}').value = '${escapeString(event.data?.value || "")}'" }
169
+ }' > /dev/null
170
+ sleep 0.1
171
+ `;
172
+ default:
173
+ return "";
174
+ }
175
+ }
176
+ function aggregateEvents(events) {
177
+ const aggregated = [];
178
+ let lastInput = null;
179
+ for (const event of events) {
180
+ if (event.type === "input" || event.type === "type") {
181
+ lastInput = event;
182
+ } else if (event.type === "keydown" || event.type === "keypress") {
183
+ if (lastInput) {
184
+ aggregated.push(lastInput);
185
+ lastInput = null;
186
+ }
187
+ aggregated.push(event);
188
+ } else {
189
+ if (lastInput) {
190
+ aggregated.push(lastInput);
191
+ lastInput = null;
192
+ }
193
+ aggregated.push(event);
194
+ }
195
+ }
196
+ if (lastInput) {
197
+ aggregated.push(lastInput);
198
+ }
199
+ return aggregated;
200
+ }
201
+ export {
202
+ generateBashScript,
203
+ generateJSScript,
204
+ generatePythonScript
205
+ };
@@ -0,0 +1,11 @@
1
+ import {
2
+ generateBashScript,
3
+ generateJSScript,
4
+ generatePythonScript
5
+ } from "./chunk-DTJRVA76.js";
6
+ import "./chunk-3RG5ZIWI.js";
7
+ export {
8
+ generateBashScript,
9
+ generateJSScript,
10
+ generatePythonScript
11
+ };
@@ -0,0 +1,59 @@
1
+ import {
2
+ daemonPing,
3
+ forwardChain,
4
+ forwardCommandLog,
5
+ forwardExec,
6
+ forwardNetworkAnalyze,
7
+ forwardNetworkAround,
8
+ forwardNetworkClear,
9
+ forwardNetworkCurl,
10
+ forwardNetworkDislike,
11
+ forwardNetworkExport,
12
+ forwardNetworkInspect,
13
+ forwardNetworkLike,
14
+ forwardNetworkList,
15
+ forwardNetworkReplay,
16
+ forwardNetworkTop,
17
+ forwardRecordCheckpoint,
18
+ forwardRecordStart,
19
+ forwardRecordStatus,
20
+ forwardRecordStop,
21
+ forwardRecordSummary,
22
+ forwardReplay,
23
+ forwardReplayResume,
24
+ forwardSessionClose,
25
+ forwardSessionCreate,
26
+ forwardSessionList,
27
+ forwardViewerCheckSelector,
28
+ isDaemonRunning
29
+ } from "./chunk-ATFTAKMN.js";
30
+ import "./chunk-3RG5ZIWI.js";
31
+ export {
32
+ daemonPing,
33
+ forwardChain,
34
+ forwardCommandLog,
35
+ forwardExec,
36
+ forwardNetworkAnalyze,
37
+ forwardNetworkAround,
38
+ forwardNetworkClear,
39
+ forwardNetworkCurl,
40
+ forwardNetworkDislike,
41
+ forwardNetworkExport,
42
+ forwardNetworkInspect,
43
+ forwardNetworkLike,
44
+ forwardNetworkList,
45
+ forwardNetworkReplay,
46
+ forwardNetworkTop,
47
+ forwardRecordCheckpoint,
48
+ forwardRecordStart,
49
+ forwardRecordStatus,
50
+ forwardRecordStop,
51
+ forwardRecordSummary,
52
+ forwardReplay,
53
+ forwardReplayResume,
54
+ forwardSessionClose,
55
+ forwardSessionCreate,
56
+ forwardSessionList,
57
+ forwardViewerCheckSelector,
58
+ isDaemonRunning
59
+ };
@@ -0,0 +1,241 @@
1
+ // src/daemon/daemon.ts
2
+ import { spawn } from "child_process";
3
+ import { join, dirname } from "path";
4
+ import { homedir } from "os";
5
+ import { fileURLToPath } from "url";
6
+ import { stopDaemon as xcliStopDaemon, isDaemonRunning, getDaemonStatus, killAllDaemon } from "@dyyz1993/xcli-core";
7
+ var CONFIG_DIR = join(homedir(), ".xbrowser");
8
+ var __dirname = dirname(fileURLToPath(import.meta.url));
9
+ var WORKER_PATH = join(__dirname, "daemon-main.js");
10
+ function getDaemonConfig() {
11
+ return {
12
+ configDir: CONFIG_DIR,
13
+ workerEntryPath: WORKER_PATH,
14
+ basePort: 9224
15
+ };
16
+ }
17
+ async function startDaemonProcess(port = 9224) {
18
+ const config = getDaemonConfig();
19
+ if (isDaemonRunning(config)) {
20
+ const status = getDaemonStatus(config);
21
+ if (status.port === port && status.pid) {
22
+ return { pid: status.pid, port: status.port, startedAt: (/* @__PURE__ */ new Date()).toISOString() };
23
+ }
24
+ await xcliStopDaemon(config);
25
+ }
26
+ const child = spawn("node", [WORKER_PATH], {
27
+ detached: true,
28
+ stdio: "ignore",
29
+ env: {
30
+ ...process.env,
31
+ XBROWSER_DAEMON_PORT: String(port)
32
+ }
33
+ });
34
+ child.unref();
35
+ return new Promise((resolve, reject) => {
36
+ let resolved = false;
37
+ const timeout = setTimeout(() => {
38
+ if (!resolved) {
39
+ resolved = true;
40
+ reject(new Error("Daemon start timeout after 15s"));
41
+ }
42
+ }, 15e3);
43
+ const checkInterval = setInterval(() => {
44
+ if (isDaemonRunning(config)) {
45
+ const s = getDaemonStatus(config);
46
+ if (s.port === port && s.pid) {
47
+ resolved = true;
48
+ clearTimeout(timeout);
49
+ clearInterval(checkInterval);
50
+ resolve({ pid: s.pid, port: s.port, startedAt: (/* @__PURE__ */ new Date()).toISOString() });
51
+ }
52
+ }
53
+ }, 200);
54
+ child.on("error", (err) => {
55
+ if (!resolved) {
56
+ resolved = true;
57
+ clearTimeout(timeout);
58
+ clearInterval(checkInterval);
59
+ reject(err);
60
+ }
61
+ });
62
+ });
63
+ }
64
+
65
+ // src/client/daemon-client.ts
66
+ var DAEMON_PORT = 9224;
67
+ var DAEMON_BASE = `http://localhost:${DAEMON_PORT}`;
68
+ var _ensurePromise = null;
69
+ async function ensureDaemonRunning() {
70
+ if (_ensurePromise) {
71
+ try {
72
+ await _ensurePromise;
73
+ } catch {
74
+ }
75
+ _ensurePromise = null;
76
+ }
77
+ for (let attempt = 0; attempt < 3; attempt++) {
78
+ const healthOk = await fetch(`${DAEMON_BASE}/health`, { signal: AbortSignal.timeout(2e3) }).then((r) => r.ok ? r.json() : null).then((d) => d?.status === "ok").catch(() => false);
79
+ if (healthOk) return;
80
+ if (attempt < 2) await new Promise((r) => setTimeout(r, 500));
81
+ }
82
+ _ensurePromise = startDaemonProcess(DAEMON_PORT).then(() => {
83
+ });
84
+ _ensurePromise.catch(() => {
85
+ _ensurePromise = null;
86
+ });
87
+ try {
88
+ await _ensurePromise;
89
+ } catch {
90
+ _ensurePromise = null;
91
+ throw new Error("Daemon not available");
92
+ }
93
+ }
94
+ async function rpcCall(method, params = {}, timeoutMs = 1e4) {
95
+ await ensureDaemonRunning();
96
+ const resp = await fetch(`${DAEMON_BASE}/rpc`, {
97
+ method: "POST",
98
+ headers: { "Content-Type": "application/json" },
99
+ body: JSON.stringify({ method, params }),
100
+ signal: AbortSignal.timeout(timeoutMs)
101
+ });
102
+ if (!resp.ok) {
103
+ throw new Error(`Daemon error: ${resp.statusText}`);
104
+ }
105
+ return resp.json();
106
+ }
107
+ async function isDaemonRunning2() {
108
+ try {
109
+ const resp = await fetch(`${DAEMON_BASE}/health`, { signal: AbortSignal.timeout(2e3) });
110
+ if (!resp.ok) return false;
111
+ const data = await resp.json();
112
+ return data.status === "ok";
113
+ } catch {
114
+ return false;
115
+ }
116
+ }
117
+ async function daemonPing() {
118
+ try {
119
+ return await rpcCall("ping", {}, 2e3);
120
+ } catch {
121
+ return null;
122
+ }
123
+ }
124
+ async function forwardSessionCreate(name, url, cdpEndpoint) {
125
+ const params = { name, url };
126
+ if (cdpEndpoint) params.cdpEndpoint = cdpEndpoint;
127
+ return rpcCall("session:create", params, 3e4);
128
+ }
129
+ async function forwardSessionClose(name) {
130
+ return rpcCall("session:close", { name }, 1e4);
131
+ }
132
+ async function forwardSessionList() {
133
+ return rpcCall("session:list", {}, 5e3);
134
+ }
135
+ async function forwardExec(command, params, session = "default", cdpEndpoint, timeoutMs = 12e4) {
136
+ const rpcParams = { command, params, session };
137
+ if (cdpEndpoint) rpcParams.cdpEndpoint = cdpEndpoint;
138
+ try {
139
+ return await rpcCall("exec", rpcParams, timeoutMs);
140
+ } catch {
141
+ return { success: false, data: null, message: `Daemon error: exec failed`, duration: 0 };
142
+ }
143
+ }
144
+ async function forwardChain(input, session = "default", cdpEndpoint) {
145
+ const params = { chain: input, session };
146
+ if (cdpEndpoint) params.cdpEndpoint = cdpEndpoint;
147
+ try {
148
+ return await rpcCall("chain", params, 12e4);
149
+ } catch {
150
+ return { success: false, steps: [], totalDuration: 0, stoppedReason: "Daemon error" };
151
+ }
152
+ }
153
+ async function forwardNetworkList(sessionName, options) {
154
+ return rpcCall("network:list", { session: sessionName, ...options }, 3e4);
155
+ }
156
+ async function forwardNetworkClear(sessionName) {
157
+ return rpcCall("network:clear", { session: sessionName }, 1e4);
158
+ }
159
+ async function forwardNetworkTop(sessionName, options) {
160
+ return rpcCall("network:top", { session: sessionName, ...options }, 3e4);
161
+ }
162
+ async function forwardCommandLog(sessionName, limit) {
163
+ return rpcCall("command:log", { session: sessionName, limit }, 1e4);
164
+ }
165
+ async function forwardNetworkAnalyze(sessionName) {
166
+ return rpcCall("network:analyze", { session: sessionName }, 3e4);
167
+ }
168
+ async function forwardNetworkAround(sessionName, commandId, windowMs) {
169
+ return rpcCall("network:around", { session: sessionName, commandId, window: windowMs }, 1e4);
170
+ }
171
+ async function forwardNetworkCurl(sessionName, id) {
172
+ return rpcCall("network:curl", { session: sessionName, id }, 1e4);
173
+ }
174
+ async function forwardNetworkReplay(sessionName, id) {
175
+ return rpcCall("network:replay", { session: sessionName, id }, 3e4);
176
+ }
177
+ async function forwardNetworkLike(sessionName, id) {
178
+ return rpcCall("network:like", { session: sessionName, id }, 5e3);
179
+ }
180
+ async function forwardNetworkDislike(sessionName, id) {
181
+ return rpcCall("network:dislike", { session: sessionName, id }, 5e3);
182
+ }
183
+ async function forwardNetworkExport(sessionName, id, lang) {
184
+ return rpcCall("network:export", { session: sessionName, id, lang }, 1e4);
185
+ }
186
+ async function forwardNetworkInspect(sessionName, id) {
187
+ return rpcCall("network:inspect", { session: sessionName, id }, 1e4);
188
+ }
189
+ async function forwardRecordStart(session, url) {
190
+ return rpcCall("record:start", { session, url }, 15e3);
191
+ }
192
+ async function forwardRecordStop(session) {
193
+ return rpcCall("record:stop", { session }, 1e4);
194
+ }
195
+ async function forwardRecordStatus(session) {
196
+ return rpcCall("record:status", { session }, 5e3);
197
+ }
198
+ async function forwardRecordSummary(session) {
199
+ return rpcCall("record:summary", { session }, 5e3);
200
+ }
201
+ async function forwardReplay(file, session, slowMo) {
202
+ return rpcCall("replay", { file, session, slowMo }, 12e4);
203
+ }
204
+ async function forwardRecordCheckpoint(session, type, hint, selector) {
205
+ return rpcCall("record:checkpoint", { session, type, hint, selector }, 1e4);
206
+ }
207
+ async function forwardReplayResume(session) {
208
+ return rpcCall("replay:resume", { session }, 1e4);
209
+ }
210
+ async function forwardViewerCheckSelector(name, selector) {
211
+ return rpcCall("viewer:check-selector", { name, selector }, 5e3);
212
+ }
213
+ export {
214
+ daemonPing,
215
+ forwardChain,
216
+ forwardCommandLog,
217
+ forwardExec,
218
+ forwardNetworkAnalyze,
219
+ forwardNetworkAround,
220
+ forwardNetworkClear,
221
+ forwardNetworkCurl,
222
+ forwardNetworkDislike,
223
+ forwardNetworkExport,
224
+ forwardNetworkInspect,
225
+ forwardNetworkLike,
226
+ forwardNetworkList,
227
+ forwardNetworkReplay,
228
+ forwardNetworkTop,
229
+ forwardRecordCheckpoint,
230
+ forwardRecordStart,
231
+ forwardRecordStatus,
232
+ forwardRecordStop,
233
+ forwardRecordSummary,
234
+ forwardReplay,
235
+ forwardReplayResume,
236
+ forwardSessionClose,
237
+ forwardSessionCreate,
238
+ forwardSessionList,
239
+ forwardViewerCheckSelector,
240
+ isDaemonRunning2 as isDaemonRunning
241
+ };
@@ -0,0 +1,58 @@
1
+ import {
2
+ daemonPing,
3
+ forwardChain,
4
+ forwardCommandLog,
5
+ forwardExec,
6
+ forwardNetworkAnalyze,
7
+ forwardNetworkAround,
8
+ forwardNetworkClear,
9
+ forwardNetworkCurl,
10
+ forwardNetworkDislike,
11
+ forwardNetworkExport,
12
+ forwardNetworkInspect,
13
+ forwardNetworkLike,
14
+ forwardNetworkList,
15
+ forwardNetworkReplay,
16
+ forwardNetworkTop,
17
+ forwardRecordCheckpoint,
18
+ forwardRecordStart,
19
+ forwardRecordStatus,
20
+ forwardRecordStop,
21
+ forwardRecordSummary,
22
+ forwardReplay,
23
+ forwardReplayResume,
24
+ forwardSessionClose,
25
+ forwardSessionCreate,
26
+ forwardSessionList,
27
+ forwardViewerCheckSelector,
28
+ isDaemonRunning
29
+ } from "./chunk-ATFTAKMN.js";
30
+ export {
31
+ daemonPing,
32
+ forwardChain,
33
+ forwardCommandLog,
34
+ forwardExec,
35
+ forwardNetworkAnalyze,
36
+ forwardNetworkAround,
37
+ forwardNetworkClear,
38
+ forwardNetworkCurl,
39
+ forwardNetworkDislike,
40
+ forwardNetworkExport,
41
+ forwardNetworkInspect,
42
+ forwardNetworkLike,
43
+ forwardNetworkList,
44
+ forwardNetworkReplay,
45
+ forwardNetworkTop,
46
+ forwardRecordCheckpoint,
47
+ forwardRecordStart,
48
+ forwardRecordStatus,
49
+ forwardRecordStop,
50
+ forwardRecordSummary,
51
+ forwardReplay,
52
+ forwardReplayResume,
53
+ forwardSessionClose,
54
+ forwardSessionCreate,
55
+ forwardSessionList,
56
+ forwardViewerCheckSelector,
57
+ isDaemonRunning
58
+ };