@web-auto/camo 0.1.26 → 0.2.1
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.
- package/LICENSE +21 -21
- package/README.md +586 -586
- package/bin/browser-service.mjs +11 -11
- package/bin/camo.mjs +22 -22
- package/package.json +48 -48
- package/scripts/build.mjs +19 -19
- package/scripts/bump-version.mjs +34 -34
- package/scripts/check-file-size.mjs +80 -80
- package/scripts/file-size-policy.json +12 -2
- package/scripts/install.mjs +76 -76
- package/scripts/release.sh +54 -54
- package/src/autoscript/action-providers/index.mjs +6 -6
- package/src/autoscript/impact-engine.mjs +78 -78
- package/src/autoscript/runtime.mjs +1017 -1017
- package/src/autoscript/schema.mjs +376 -376
- package/src/cli.mjs +405 -405
- package/src/commands/attach.mjs +141 -141
- package/src/commands/autoscript.mjs +1011 -1011
- package/src/commands/browser.mjs +1255 -1257
- package/src/commands/container.mjs +401 -401
- package/src/commands/cookies.mjs +69 -69
- package/src/commands/create.mjs +98 -98
- package/src/commands/devtools.mjs +349 -349
- package/src/commands/events.mjs +152 -152
- package/src/commands/highlight-mode.mjs +24 -24
- package/src/commands/init.mjs +68 -68
- package/src/commands/lifecycle.mjs +275 -275
- package/src/commands/mouse.mjs +45 -45
- package/src/commands/profile.mjs +46 -46
- package/src/commands/record.mjs +115 -115
- package/src/commands/system.mjs +14 -14
- package/src/commands/window.mjs +123 -123
- package/src/container/change-notifier.mjs +362 -362
- package/src/container/element-filter.mjs +143 -143
- package/src/container/index.mjs +3 -3
- package/src/container/runtime-core/checkpoint.mjs +209 -209
- package/src/container/runtime-core/index.mjs +21 -21
- package/src/container/runtime-core/operations/index.mjs +774 -774
- package/src/container/runtime-core/operations/selector-scripts.mjs +277 -277
- package/src/container/runtime-core/operations/tab-pool.mjs +746 -746
- package/src/container/runtime-core/operations/viewport.mjs +189 -189
- package/src/container/runtime-core/search.mjs +190 -190
- package/src/container/runtime-core/subscription.mjs +224 -224
- package/src/container/runtime-core/utils.mjs +94 -94
- package/src/container/runtime-core/validation.mjs +127 -184
- package/src/container/runtime-core.mjs +1 -1
- package/src/container/subscription-registry.mjs +459 -459
- package/src/core/actions.mjs +561 -561
- package/src/core/browser.mjs +266 -266
- package/src/core/index.mjs +52 -52
- package/src/core/utils.mjs +91 -91
- package/src/events/daemon-entry.mjs +33 -33
- package/src/events/daemon.mjs +80 -80
- package/src/events/progress-log.mjs +109 -109
- package/src/events/ws-server.mjs +239 -239
- package/src/lib/client.mjs +200 -200
- package/src/lifecycle/cleanup.mjs +83 -83
- package/src/lifecycle/lock.mjs +126 -126
- package/src/lifecycle/session-registry.mjs +279 -279
- package/src/lifecycle/session-view.mjs +76 -76
- package/src/lifecycle/session-watchdog.mjs +281 -281
- package/src/services/browser-service/index.js +671 -674
- package/src/services/browser-service/internal/BrowserSession.input.test.js +389 -389
- package/src/services/browser-service/internal/BrowserSession.js +325 -336
- package/src/services/browser-service/internal/ElementRegistry.js +60 -60
- package/src/services/browser-service/internal/ProfileLock.js +84 -84
- package/src/services/browser-service/internal/SessionManager.js +184 -184
- package/src/services/browser-service/internal/SessionManager.test.js +39 -39
- package/src/services/browser-service/internal/browser-session/cookies.js +144 -144
- package/src/services/browser-service/internal/browser-session/input-ops.js +222 -219
- package/src/services/browser-service/internal/browser-session/input-pipeline.js +144 -144
- package/src/services/browser-service/internal/browser-session/logging.js +46 -46
- package/src/services/browser-service/internal/browser-session/navigation.js +38 -38
- package/src/services/browser-service/internal/browser-session/page-hooks.js +442 -442
- package/src/services/browser-service/internal/browser-session/page-management.js +302 -336
- package/src/services/browser-service/internal/browser-session/page-management.test.js +148 -148
- package/src/services/browser-service/internal/browser-session/recording.js +198 -198
- package/src/services/browser-service/internal/browser-session/runtime-events.js +61 -61
- package/src/services/browser-service/internal/browser-session/session-core.js +84 -84
- package/src/services/browser-service/internal/browser-session/session-state.js +38 -38
- package/src/services/browser-service/internal/browser-session/types.js +14 -14
- package/src/services/browser-service/internal/browser-session/utils.js +95 -95
- package/src/services/browser-service/internal/browser-session/viewport-manager.js +46 -46
- package/src/services/browser-service/internal/browser-session/viewport.js +215 -215
- package/src/services/browser-service/internal/container-matcher.js +851 -851
- package/src/services/browser-service/internal/container-registry.js +182 -182
- package/src/services/browser-service/internal/engine-manager.js +259 -259
- package/src/services/browser-service/internal/fingerprint.js +203 -203
- package/src/services/browser-service/internal/heartbeat.js +137 -137
- package/src/services/browser-service/internal/logging.js +46 -46
- package/src/services/browser-service/internal/page-runtime/runtime.js +1317 -1317
- package/src/services/browser-service/internal/pageRuntime.js +28 -28
- package/src/services/browser-service/internal/runtimeInjector.js +31 -31
- package/src/services/browser-service/internal/service-process-logger.js +140 -140
- package/src/services/browser-service/internal/state-bus.js +45 -45
- package/src/services/browser-service/internal/storage-paths.js +42 -42
- package/src/services/browser-service/internal/ws-server.js +1194 -1194
- package/src/services/browser-service/internal/ws-server.test.js +58 -58
- package/src/services/browser-service/server.mjs +6 -6
- package/src/services/controller/cli-bridge.js +93 -93
- package/src/services/controller/container-index.js +50 -50
- package/src/services/controller/container-storage.js +36 -36
- package/src/services/controller/controller-actions.js +207 -207
- package/src/services/controller/controller.js +1138 -1138
- package/src/services/controller/selectors.js +54 -54
- package/src/services/controller/transport.js +125 -125
- package/src/utils/args.mjs +26 -26
- package/src/utils/browser-service.mjs +544 -544
- package/src/utils/command-log.mjs +64 -64
- package/src/utils/config.mjs +214 -214
- package/src/utils/fingerprint.mjs +181 -181
- package/src/utils/help.mjs +216 -216
- package/src/utils/js-policy.mjs +13 -13
- package/src/utils/ws-client.mjs +30 -30
- package/src/container/runtime-core/operations/tab-pool.mjs.bak +0 -762
- package/src/container/runtime-core/operations/tab-pool.mjs.syntax-error +0 -762
- package/src/services/browser-service/index.js.bak +0 -671
package/src/commands/events.mjs
CHANGED
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
import { createProgressWsServer } from '../events/ws-server.mjs';
|
|
2
|
-
import { getProgressEventsFile, readRecentProgressEvents, safeAppendProgressEvent } from '../events/progress-log.mjs';
|
|
3
|
-
import { ensureProgressEventDaemon } from '../events/daemon.mjs';
|
|
4
|
-
|
|
5
|
-
function readFlagValue(args, names) {
|
|
6
|
-
for (let i = 0; i < args.length; i += 1) {
|
|
7
|
-
if (!names.includes(args[i])) continue;
|
|
8
|
-
const value = args[i + 1];
|
|
9
|
-
if (!value || String(value).startsWith('-')) return null;
|
|
10
|
-
return value;
|
|
11
|
-
}
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function hasFlag(args, name) {
|
|
16
|
-
return args.includes(name);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function buildQuery(args) {
|
|
20
|
-
const profileId = readFlagValue(args, ['--profile', '-p']);
|
|
21
|
-
const runId = readFlagValue(args, ['--run-id']);
|
|
22
|
-
const mode = readFlagValue(args, ['--mode']);
|
|
23
|
-
const events = readFlagValue(args, ['--events']);
|
|
24
|
-
const replay = Math.max(0, Number(readFlagValue(args, ['--replay']) ?? 50) || 50);
|
|
25
|
-
const qs = new URLSearchParams();
|
|
26
|
-
if (profileId) qs.set('profileId', profileId);
|
|
27
|
-
if (runId) qs.set('runId', runId);
|
|
28
|
-
if (mode) qs.set('mode', mode);
|
|
29
|
-
if (events) qs.set('events', events);
|
|
30
|
-
qs.set('replay', String(replay));
|
|
31
|
-
return qs;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async function handleEventsServe(args) {
|
|
35
|
-
const host = readFlagValue(args, ['--host']) || '127.0.0.1';
|
|
36
|
-
const port = Math.max(1, Number(readFlagValue(args, ['--port']) || 7788) || 7788);
|
|
37
|
-
const pollMs = Math.max(80, Number(readFlagValue(args, ['--poll-ms']) || 220) || 220);
|
|
38
|
-
const fromStart = hasFlag(args, '--from-start');
|
|
39
|
-
|
|
40
|
-
const server = createProgressWsServer({ host, port, pollMs, fromStart });
|
|
41
|
-
const info = await server.start();
|
|
42
|
-
console.log(JSON.stringify({
|
|
43
|
-
ok: true,
|
|
44
|
-
command: 'events.serve',
|
|
45
|
-
...info,
|
|
46
|
-
message: 'Progress WS server started. Press Ctrl+C to stop.',
|
|
47
|
-
}, null, 2));
|
|
48
|
-
|
|
49
|
-
const stop = async (reason = 'signal_interrupt') => {
|
|
50
|
-
await server.stop();
|
|
51
|
-
console.log(JSON.stringify({ ok: true, event: 'events.serve.stop', reason }));
|
|
52
|
-
process.exit(0);
|
|
53
|
-
};
|
|
54
|
-
process.once('SIGINT', () => {
|
|
55
|
-
stop('SIGINT');
|
|
56
|
-
});
|
|
57
|
-
process.once('SIGTERM', () => {
|
|
58
|
-
stop('SIGTERM');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
await new Promise(() => {});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async function handleEventsTail(args) {
|
|
65
|
-
const host = readFlagValue(args, ['--host']) || '127.0.0.1';
|
|
66
|
-
const port = Math.max(1, Number(readFlagValue(args, ['--port']) || 7788) || 7788);
|
|
67
|
-
await ensureProgressEventDaemon({ host, port });
|
|
68
|
-
const qs = buildQuery(args);
|
|
69
|
-
const wsUrl = `ws://${host}:${port}/events?${qs.toString()}`;
|
|
70
|
-
if (typeof WebSocket !== 'function') {
|
|
71
|
-
throw new Error('Global WebSocket is unavailable in this Node runtime');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const socket = new WebSocket(wsUrl);
|
|
75
|
-
socket.addEventListener('open', () => {
|
|
76
|
-
console.log(JSON.stringify({ ok: true, command: 'events.tail', wsUrl }));
|
|
77
|
-
});
|
|
78
|
-
socket.addEventListener('message', (event) => {
|
|
79
|
-
const text = typeof event.data === 'string' ? event.data : String(event.data);
|
|
80
|
-
console.log(text);
|
|
81
|
-
});
|
|
82
|
-
socket.addEventListener('close', () => {
|
|
83
|
-
process.exit(0);
|
|
84
|
-
});
|
|
85
|
-
socket.addEventListener('error', (err) => {
|
|
86
|
-
console.error(JSON.stringify({ ok: false, command: 'events.tail', wsUrl, error: err?.message || String(err) }));
|
|
87
|
-
process.exit(1);
|
|
88
|
-
});
|
|
89
|
-
process.once('SIGINT', () => {
|
|
90
|
-
socket.close();
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
await new Promise(() => {});
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function handleEventsRecent(args) {
|
|
97
|
-
const limit = Math.max(1, Number(readFlagValue(args, ['--limit', '-n']) || 50) || 50);
|
|
98
|
-
const rows = readRecentProgressEvents(limit);
|
|
99
|
-
console.log(JSON.stringify({
|
|
100
|
-
ok: true,
|
|
101
|
-
command: 'events.recent',
|
|
102
|
-
file: getProgressEventsFile(),
|
|
103
|
-
count: rows.length,
|
|
104
|
-
events: rows,
|
|
105
|
-
}, null, 2));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function handleEventsEmit(args) {
|
|
109
|
-
const eventName = readFlagValue(args, ['--event']) || 'manual.emit';
|
|
110
|
-
const mode = readFlagValue(args, ['--mode']) || 'normal';
|
|
111
|
-
const profileId = readFlagValue(args, ['--profile', '-p']) || null;
|
|
112
|
-
const runId = readFlagValue(args, ['--run-id']) || null;
|
|
113
|
-
const payloadRaw = readFlagValue(args, ['--payload']) || '{}';
|
|
114
|
-
let payload = null;
|
|
115
|
-
try {
|
|
116
|
-
payload = JSON.parse(payloadRaw);
|
|
117
|
-
} catch {
|
|
118
|
-
payload = { raw: payloadRaw };
|
|
119
|
-
}
|
|
120
|
-
const appended = safeAppendProgressEvent({
|
|
121
|
-
source: 'events.emit',
|
|
122
|
-
mode,
|
|
123
|
-
profileId,
|
|
124
|
-
runId,
|
|
125
|
-
event: eventName,
|
|
126
|
-
payload,
|
|
127
|
-
});
|
|
128
|
-
console.log(JSON.stringify({ ok: Boolean(appended), command: 'events.emit', event: appended }, null, 2));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export async function handleEventsCommand(args) {
|
|
132
|
-
const sub = args[1];
|
|
133
|
-
switch (sub) {
|
|
134
|
-
case 'serve':
|
|
135
|
-
return handleEventsServe(args);
|
|
136
|
-
case 'tail':
|
|
137
|
-
return handleEventsTail(args);
|
|
138
|
-
case 'recent':
|
|
139
|
-
return handleEventsRecent(args);
|
|
140
|
-
case 'emit':
|
|
141
|
-
return handleEventsEmit(args);
|
|
142
|
-
default:
|
|
143
|
-
console.log(`Usage: camo events <serve|tail|recent|emit> [options]
|
|
144
|
-
|
|
145
|
-
Commands:
|
|
146
|
-
serve [--host 127.0.0.1] [--port 7788] [--poll-ms 220] [--from-start]
|
|
147
|
-
tail [--host 127.0.0.1] [--port 7788] [--profile <id>] [--run-id <id>] [--mode <normal|autoscript>] [--events e1,e2] [--replay 50]
|
|
148
|
-
recent [--limit 50]
|
|
149
|
-
emit --event <name> [--mode <normal|autoscript>] [--profile <id>] [--run-id <id>] [--payload '{"k":"v"}']
|
|
150
|
-
`);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
1
|
+
import { createProgressWsServer } from '../events/ws-server.mjs';
|
|
2
|
+
import { getProgressEventsFile, readRecentProgressEvents, safeAppendProgressEvent } from '../events/progress-log.mjs';
|
|
3
|
+
import { ensureProgressEventDaemon } from '../events/daemon.mjs';
|
|
4
|
+
|
|
5
|
+
function readFlagValue(args, names) {
|
|
6
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
7
|
+
if (!names.includes(args[i])) continue;
|
|
8
|
+
const value = args[i + 1];
|
|
9
|
+
if (!value || String(value).startsWith('-')) return null;
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function hasFlag(args, name) {
|
|
16
|
+
return args.includes(name);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function buildQuery(args) {
|
|
20
|
+
const profileId = readFlagValue(args, ['--profile', '-p']);
|
|
21
|
+
const runId = readFlagValue(args, ['--run-id']);
|
|
22
|
+
const mode = readFlagValue(args, ['--mode']);
|
|
23
|
+
const events = readFlagValue(args, ['--events']);
|
|
24
|
+
const replay = Math.max(0, Number(readFlagValue(args, ['--replay']) ?? 50) || 50);
|
|
25
|
+
const qs = new URLSearchParams();
|
|
26
|
+
if (profileId) qs.set('profileId', profileId);
|
|
27
|
+
if (runId) qs.set('runId', runId);
|
|
28
|
+
if (mode) qs.set('mode', mode);
|
|
29
|
+
if (events) qs.set('events', events);
|
|
30
|
+
qs.set('replay', String(replay));
|
|
31
|
+
return qs;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function handleEventsServe(args) {
|
|
35
|
+
const host = readFlagValue(args, ['--host']) || '127.0.0.1';
|
|
36
|
+
const port = Math.max(1, Number(readFlagValue(args, ['--port']) || 7788) || 7788);
|
|
37
|
+
const pollMs = Math.max(80, Number(readFlagValue(args, ['--poll-ms']) || 220) || 220);
|
|
38
|
+
const fromStart = hasFlag(args, '--from-start');
|
|
39
|
+
|
|
40
|
+
const server = createProgressWsServer({ host, port, pollMs, fromStart });
|
|
41
|
+
const info = await server.start();
|
|
42
|
+
console.log(JSON.stringify({
|
|
43
|
+
ok: true,
|
|
44
|
+
command: 'events.serve',
|
|
45
|
+
...info,
|
|
46
|
+
message: 'Progress WS server started. Press Ctrl+C to stop.',
|
|
47
|
+
}, null, 2));
|
|
48
|
+
|
|
49
|
+
const stop = async (reason = 'signal_interrupt') => {
|
|
50
|
+
await server.stop();
|
|
51
|
+
console.log(JSON.stringify({ ok: true, event: 'events.serve.stop', reason }));
|
|
52
|
+
process.exit(0);
|
|
53
|
+
};
|
|
54
|
+
process.once('SIGINT', () => {
|
|
55
|
+
stop('SIGINT');
|
|
56
|
+
});
|
|
57
|
+
process.once('SIGTERM', () => {
|
|
58
|
+
stop('SIGTERM');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await new Promise(() => {});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function handleEventsTail(args) {
|
|
65
|
+
const host = readFlagValue(args, ['--host']) || '127.0.0.1';
|
|
66
|
+
const port = Math.max(1, Number(readFlagValue(args, ['--port']) || 7788) || 7788);
|
|
67
|
+
await ensureProgressEventDaemon({ host, port });
|
|
68
|
+
const qs = buildQuery(args);
|
|
69
|
+
const wsUrl = `ws://${host}:${port}/events?${qs.toString()}`;
|
|
70
|
+
if (typeof WebSocket !== 'function') {
|
|
71
|
+
throw new Error('Global WebSocket is unavailable in this Node runtime');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const socket = new WebSocket(wsUrl);
|
|
75
|
+
socket.addEventListener('open', () => {
|
|
76
|
+
console.log(JSON.stringify({ ok: true, command: 'events.tail', wsUrl }));
|
|
77
|
+
});
|
|
78
|
+
socket.addEventListener('message', (event) => {
|
|
79
|
+
const text = typeof event.data === 'string' ? event.data : String(event.data);
|
|
80
|
+
console.log(text);
|
|
81
|
+
});
|
|
82
|
+
socket.addEventListener('close', () => {
|
|
83
|
+
process.exit(0);
|
|
84
|
+
});
|
|
85
|
+
socket.addEventListener('error', (err) => {
|
|
86
|
+
console.error(JSON.stringify({ ok: false, command: 'events.tail', wsUrl, error: err?.message || String(err) }));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
});
|
|
89
|
+
process.once('SIGINT', () => {
|
|
90
|
+
socket.close();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
await new Promise(() => {});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function handleEventsRecent(args) {
|
|
97
|
+
const limit = Math.max(1, Number(readFlagValue(args, ['--limit', '-n']) || 50) || 50);
|
|
98
|
+
const rows = readRecentProgressEvents(limit);
|
|
99
|
+
console.log(JSON.stringify({
|
|
100
|
+
ok: true,
|
|
101
|
+
command: 'events.recent',
|
|
102
|
+
file: getProgressEventsFile(),
|
|
103
|
+
count: rows.length,
|
|
104
|
+
events: rows,
|
|
105
|
+
}, null, 2));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function handleEventsEmit(args) {
|
|
109
|
+
const eventName = readFlagValue(args, ['--event']) || 'manual.emit';
|
|
110
|
+
const mode = readFlagValue(args, ['--mode']) || 'normal';
|
|
111
|
+
const profileId = readFlagValue(args, ['--profile', '-p']) || null;
|
|
112
|
+
const runId = readFlagValue(args, ['--run-id']) || null;
|
|
113
|
+
const payloadRaw = readFlagValue(args, ['--payload']) || '{}';
|
|
114
|
+
let payload = null;
|
|
115
|
+
try {
|
|
116
|
+
payload = JSON.parse(payloadRaw);
|
|
117
|
+
} catch {
|
|
118
|
+
payload = { raw: payloadRaw };
|
|
119
|
+
}
|
|
120
|
+
const appended = safeAppendProgressEvent({
|
|
121
|
+
source: 'events.emit',
|
|
122
|
+
mode,
|
|
123
|
+
profileId,
|
|
124
|
+
runId,
|
|
125
|
+
event: eventName,
|
|
126
|
+
payload,
|
|
127
|
+
});
|
|
128
|
+
console.log(JSON.stringify({ ok: Boolean(appended), command: 'events.emit', event: appended }, null, 2));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export async function handleEventsCommand(args) {
|
|
132
|
+
const sub = args[1];
|
|
133
|
+
switch (sub) {
|
|
134
|
+
case 'serve':
|
|
135
|
+
return handleEventsServe(args);
|
|
136
|
+
case 'tail':
|
|
137
|
+
return handleEventsTail(args);
|
|
138
|
+
case 'recent':
|
|
139
|
+
return handleEventsRecent(args);
|
|
140
|
+
case 'emit':
|
|
141
|
+
return handleEventsEmit(args);
|
|
142
|
+
default:
|
|
143
|
+
console.log(`Usage: camo events <serve|tail|recent|emit> [options]
|
|
144
|
+
|
|
145
|
+
Commands:
|
|
146
|
+
serve [--host 127.0.0.1] [--port 7788] [--poll-ms 220] [--from-start]
|
|
147
|
+
tail [--host 127.0.0.1] [--port 7788] [--profile <id>] [--run-id <id>] [--mode <normal|autoscript>] [--events e1,e2] [--replay 50]
|
|
148
|
+
recent [--limit 50]
|
|
149
|
+
emit --event <name> [--mode <normal|autoscript>] [--profile <id>] [--run-id <id>] [--payload '{"k":"v"}']
|
|
150
|
+
`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { getHighlightMode, setHighlightMode } from '../utils/config.mjs';
|
|
2
|
-
|
|
3
|
-
export async function handleHighlightModeCommand(args) {
|
|
4
|
-
const sub = String(args[1] || 'status').trim().toLowerCase();
|
|
5
|
-
|
|
6
|
-
if (sub === 'status') {
|
|
7
|
-
console.log(JSON.stringify({ ok: true, highlightMode: getHighlightMode() }, null, 2));
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
if (sub === 'on' || sub === 'enable') {
|
|
12
|
-
const next = setHighlightMode(true);
|
|
13
|
-
console.log(JSON.stringify({ ok: true, highlightMode: next }, null, 2));
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (sub === 'off' || sub === 'disable') {
|
|
18
|
-
const next = setHighlightMode(false);
|
|
19
|
-
console.log(JSON.stringify({ ok: true, highlightMode: next }, null, 2));
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
throw new Error('Usage: camo highlight-mode [status|on|off]');
|
|
24
|
-
}
|
|
1
|
+
import { getHighlightMode, setHighlightMode } from '../utils/config.mjs';
|
|
2
|
+
|
|
3
|
+
export async function handleHighlightModeCommand(args) {
|
|
4
|
+
const sub = String(args[1] || 'status').trim().toLowerCase();
|
|
5
|
+
|
|
6
|
+
if (sub === 'status') {
|
|
7
|
+
console.log(JSON.stringify({ ok: true, highlightMode: getHighlightMode() }, null, 2));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (sub === 'on' || sub === 'enable') {
|
|
12
|
+
const next = setHighlightMode(true);
|
|
13
|
+
console.log(JSON.stringify({ ok: true, highlightMode: next }, null, 2));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (sub === 'off' || sub === 'disable') {
|
|
18
|
+
const next = setHighlightMode(false);
|
|
19
|
+
console.log(JSON.stringify({ ok: true, highlightMode: next }, null, 2));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
throw new Error('Usage: camo highlight-mode [status|on|off]');
|
|
24
|
+
}
|
package/src/commands/init.mjs
CHANGED
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { ensureCamoufox } from '../utils/browser-service.mjs';
|
|
2
|
-
import { listProfiles, getDefaultProfile } from '../utils/config.mjs';
|
|
3
|
-
import { downloadGeoIP, hasGeoIP, listAvailableRegions, listAvailableOS } from '../utils/fingerprint.mjs';
|
|
4
|
-
|
|
5
|
-
export async function handleInitCommand(args) {
|
|
6
|
-
const subCmd = args[1];
|
|
7
|
-
|
|
8
|
-
if (subCmd === 'geoip') {
|
|
9
|
-
await handleInitGeoIP();
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
if (subCmd === 'list') {
|
|
14
|
-
handleInitList();
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Default init: ensure camoufox + browser-service
|
|
19
|
-
ensureCamoufox();
|
|
20
|
-
const { ensureBrowserService } = await import('../utils/browser-service.mjs');
|
|
21
|
-
await ensureBrowserService();
|
|
22
|
-
|
|
23
|
-
const profiles = listProfiles();
|
|
24
|
-
const defaultProfile = getDefaultProfile();
|
|
25
|
-
const geoipReady = hasGeoIP();
|
|
26
|
-
|
|
27
|
-
console.log(JSON.stringify({
|
|
28
|
-
ok: true,
|
|
29
|
-
profiles,
|
|
30
|
-
defaultProfile,
|
|
31
|
-
count: profiles.length,
|
|
32
|
-
geoip: geoipReady,
|
|
33
|
-
camoufox: true,
|
|
34
|
-
browserService: true,
|
|
35
|
-
}, null, 2));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async function handleInitGeoIP() {
|
|
39
|
-
try {
|
|
40
|
-
const path = await downloadGeoIP(console.log);
|
|
41
|
-
console.log(JSON.stringify({
|
|
42
|
-
ok: true,
|
|
43
|
-
path,
|
|
44
|
-
message: 'GeoIP database ready',
|
|
45
|
-
}, null, 2));
|
|
46
|
-
} catch (err) {
|
|
47
|
-
console.error(`Error: ${err.message}`);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function handleInitList() {
|
|
53
|
-
console.log('\n=== Available OS Options ===');
|
|
54
|
-
const osList = listAvailableOS();
|
|
55
|
-
osList.forEach(item => {
|
|
56
|
-
console.log(` ${item.key.padEnd(12)} - ${item.os} ${item.osVersion} (${item.platform})`);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
console.log('\n=== Available Regions ===');
|
|
60
|
-
const regions = listAvailableRegions();
|
|
61
|
-
regions.forEach(item => {
|
|
62
|
-
console.log(` ${item.key.padEnd(12)} - ${item.country}, ${item.city} (${item.timezone})`);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
console.log('\nUsage:');
|
|
66
|
-
console.log(' camo create fingerprint --os mac --region us');
|
|
67
|
-
console.log(' camo create fingerprint --os windows --region uk');
|
|
68
|
-
}
|
|
1
|
+
import { ensureCamoufox } from '../utils/browser-service.mjs';
|
|
2
|
+
import { listProfiles, getDefaultProfile } from '../utils/config.mjs';
|
|
3
|
+
import { downloadGeoIP, hasGeoIP, listAvailableRegions, listAvailableOS } from '../utils/fingerprint.mjs';
|
|
4
|
+
|
|
5
|
+
export async function handleInitCommand(args) {
|
|
6
|
+
const subCmd = args[1];
|
|
7
|
+
|
|
8
|
+
if (subCmd === 'geoip') {
|
|
9
|
+
await handleInitGeoIP();
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (subCmd === 'list') {
|
|
14
|
+
handleInitList();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Default init: ensure camoufox + browser-service
|
|
19
|
+
ensureCamoufox();
|
|
20
|
+
const { ensureBrowserService } = await import('../utils/browser-service.mjs');
|
|
21
|
+
await ensureBrowserService();
|
|
22
|
+
|
|
23
|
+
const profiles = listProfiles();
|
|
24
|
+
const defaultProfile = getDefaultProfile();
|
|
25
|
+
const geoipReady = hasGeoIP();
|
|
26
|
+
|
|
27
|
+
console.log(JSON.stringify({
|
|
28
|
+
ok: true,
|
|
29
|
+
profiles,
|
|
30
|
+
defaultProfile,
|
|
31
|
+
count: profiles.length,
|
|
32
|
+
geoip: geoipReady,
|
|
33
|
+
camoufox: true,
|
|
34
|
+
browserService: true,
|
|
35
|
+
}, null, 2));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function handleInitGeoIP() {
|
|
39
|
+
try {
|
|
40
|
+
const path = await downloadGeoIP(console.log);
|
|
41
|
+
console.log(JSON.stringify({
|
|
42
|
+
ok: true,
|
|
43
|
+
path,
|
|
44
|
+
message: 'GeoIP database ready',
|
|
45
|
+
}, null, 2));
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.error(`Error: ${err.message}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function handleInitList() {
|
|
53
|
+
console.log('\n=== Available OS Options ===');
|
|
54
|
+
const osList = listAvailableOS();
|
|
55
|
+
osList.forEach(item => {
|
|
56
|
+
console.log(` ${item.key.padEnd(12)} - ${item.os} ${item.osVersion} (${item.platform})`);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
console.log('\n=== Available Regions ===');
|
|
60
|
+
const regions = listAvailableRegions();
|
|
61
|
+
regions.forEach(item => {
|
|
62
|
+
console.log(` ${item.key.padEnd(12)} - ${item.country}, ${item.city} (${item.timezone})`);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
console.log('\nUsage:');
|
|
66
|
+
console.log(' camo create fingerprint --os mac --region us');
|
|
67
|
+
console.log(' camo create fingerprint --os windows --region uk');
|
|
68
|
+
}
|