camou 0.1.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.
- package/README.md +229 -0
- package/dist/browser/actions.d.ts +4 -0
- package/dist/browser/actions.js +15 -0
- package/dist/browser/actions.js.map +1 -0
- package/dist/browser/manager.d.ts +85 -0
- package/dist/browser/manager.js +300 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser/snapshot.d.ts +17 -0
- package/dist/browser/snapshot.js +93 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/browser/tabs.d.ts +24 -0
- package/dist/browser/tabs.js +8 -0
- package/dist/browser/tabs.js.map +1 -0
- package/dist/camoufox/config.d.ts +67 -0
- package/dist/camoufox/config.js +121 -0
- package/dist/camoufox/config.js.map +1 -0
- package/dist/camoufox/env.d.ts +3 -0
- package/dist/camoufox/env.js +27 -0
- package/dist/camoufox/env.js.map +1 -0
- package/dist/camoufox/installer.d.ts +24 -0
- package/dist/camoufox/installer.js +291 -0
- package/dist/camoufox/installer.js.map +1 -0
- package/dist/camoufox/launcher.d.ts +22 -0
- package/dist/camoufox/launcher.js +105 -0
- package/dist/camoufox/launcher.js.map +1 -0
- package/dist/camoufox/prefs.d.ts +5 -0
- package/dist/camoufox/prefs.js +27 -0
- package/dist/camoufox/prefs.js.map +1 -0
- package/dist/camoufox/presets.d.ts +14 -0
- package/dist/camoufox/presets.js +73 -0
- package/dist/camoufox/presets.js.map +1 -0
- package/dist/camoufox/registry.d.ts +30 -0
- package/dist/camoufox/registry.js +195 -0
- package/dist/camoufox/registry.js.map +1 -0
- package/dist/camoufox/validation.d.ts +4 -0
- package/dist/camoufox/validation.js +103 -0
- package/dist/camoufox/validation.js.map +1 -0
- package/dist/cli/daemon.d.ts +2 -0
- package/dist/cli/daemon.js +59 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +147 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +1 -0
- package/dist/cli/output.js +108 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/program.d.ts +42 -0
- package/dist/cli/program.js +214 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/daemon/daemon.d.ts +12 -0
- package/dist/daemon/daemon.js +36 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/main.d.ts +2 -0
- package/dist/daemon/main.js +28 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/router.d.ts +7 -0
- package/dist/daemon/router.js +43 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/runtime.d.ts +11 -0
- package/dist/daemon/runtime.js +54 -0
- package/dist/daemon/runtime.js.map +1 -0
- package/dist/doctor/diagnostics.d.ts +38 -0
- package/dist/doctor/diagnostics.js +152 -0
- package/dist/doctor/diagnostics.js.map +1 -0
- package/dist/ipc/client.d.ts +6 -0
- package/dist/ipc/client.js +63 -0
- package/dist/ipc/client.js.map +1 -0
- package/dist/ipc/protocol.d.ts +775 -0
- package/dist/ipc/protocol.js +128 -0
- package/dist/ipc/protocol.js.map +1 -0
- package/dist/ipc/server.d.ts +10 -0
- package/dist/ipc/server.js +99 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/state/paths.d.ts +32 -0
- package/dist/state/paths.js +121 -0
- package/dist/state/paths.js.map +1 -0
- package/dist/state/store.d.ts +4 -0
- package/dist/state/store.js +30 -0
- package/dist/state/store.js.map +1 -0
- package/dist/util/errors.d.ts +45 -0
- package/dist/util/errors.js +82 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/log.d.ts +19 -0
- package/dist/util/log.js +71 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/platform.d.ts +12 -0
- package/dist/util/platform.js +44 -0
- package/dist/util/platform.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
function printInstalledVersions(data) {
|
|
2
|
+
const installs = Array.isArray(data.installedVersions) ? data.installedVersions : [];
|
|
3
|
+
if (installs.length === 0) {
|
|
4
|
+
process.stdout.write('No Camoufox versions installed\n');
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
for (const install of installs) {
|
|
8
|
+
if (!install || typeof install !== 'object') {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
const version = String(install.version ?? 'unknown');
|
|
12
|
+
const current = Boolean(install.current);
|
|
13
|
+
const sourceRepo = String(install.sourceRepo ?? 'unknown');
|
|
14
|
+
const installPath = String(install.path ?? '');
|
|
15
|
+
process.stdout.write(`${current ? '*' : ' '} ${version} ${sourceRepo}${installPath ? ` ${installPath}` : ''}\n`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function printPresets(data) {
|
|
19
|
+
const presets = Array.isArray(data.presets) ? data.presets : [];
|
|
20
|
+
if (presets.length === 0) {
|
|
21
|
+
process.stdout.write('No built-in presets available\n');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
for (const preset of presets) {
|
|
25
|
+
if (!preset || typeof preset !== 'object') {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const record = preset;
|
|
29
|
+
process.stdout.write(`${String(record.name ?? 'unknown')} ${String(record.description ?? '')}\n`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function printBrowserCompatibilityResult(prefix, data) {
|
|
33
|
+
const version = String(data.version ?? 'unknown');
|
|
34
|
+
process.stdout.write(`${prefix} Camoufox ${version}\n`);
|
|
35
|
+
const playwrightCoreVersion = typeof data.playwrightCoreVersion === 'string' ? data.playwrightCoreVersion : undefined;
|
|
36
|
+
const launchCheck = typeof data.launchCheck === 'object' && data.launchCheck ? data.launchCheck : undefined;
|
|
37
|
+
if (!launchCheck) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const versionSuffix = playwrightCoreVersion ? ` with Playwright ${playwrightCoreVersion}` : '';
|
|
41
|
+
const success = launchCheck.success === true;
|
|
42
|
+
if (success) {
|
|
43
|
+
process.stdout.write(`Compatibility: launch check passed${versionSuffix}\n`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
process.stdout.write(`Compatibility warning: launch check failed${versionSuffix}\n`);
|
|
47
|
+
const error = typeof launchCheck.error === 'object' && launchCheck.error
|
|
48
|
+
? launchCheck.error
|
|
49
|
+
: undefined;
|
|
50
|
+
if (typeof error?.message === 'string' && error.message.length > 0) {
|
|
51
|
+
process.stdout.write(`Reason: ${error.message}\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function printOutput(action, data, asJson) {
|
|
55
|
+
if (asJson) {
|
|
56
|
+
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
switch (action) {
|
|
60
|
+
case 'install':
|
|
61
|
+
printBrowserCompatibilityResult('Installed', data);
|
|
62
|
+
return;
|
|
63
|
+
case 'path':
|
|
64
|
+
process.stdout.write(`${String(data.path)}\n`);
|
|
65
|
+
return;
|
|
66
|
+
case 'version':
|
|
67
|
+
process.stdout.write(`${String(data.version)}\n`);
|
|
68
|
+
return;
|
|
69
|
+
case 'use':
|
|
70
|
+
printBrowserCompatibilityResult('Using', data);
|
|
71
|
+
return;
|
|
72
|
+
case 'versions':
|
|
73
|
+
printInstalledVersions(data);
|
|
74
|
+
return;
|
|
75
|
+
case 'presets':
|
|
76
|
+
printPresets(data);
|
|
77
|
+
return;
|
|
78
|
+
case 'doctor':
|
|
79
|
+
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
80
|
+
return;
|
|
81
|
+
case 'snapshot':
|
|
82
|
+
process.stdout.write(`${String(data.snapshot ?? '')}\n`);
|
|
83
|
+
return;
|
|
84
|
+
case 'get.url':
|
|
85
|
+
process.stdout.write(`${String(data.url ?? '')}\n`);
|
|
86
|
+
return;
|
|
87
|
+
case 'get.title':
|
|
88
|
+
process.stdout.write(`${String(data.title ?? '')}\n`);
|
|
89
|
+
return;
|
|
90
|
+
case 'get.text':
|
|
91
|
+
process.stdout.write(`${String(data.text ?? '')}\n`);
|
|
92
|
+
return;
|
|
93
|
+
case 'screenshot':
|
|
94
|
+
process.stdout.write(`${String(data.path ?? '')}\n`);
|
|
95
|
+
return;
|
|
96
|
+
default:
|
|
97
|
+
if (Array.isArray(data)) {
|
|
98
|
+
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (typeof data === 'object' && data) {
|
|
102
|
+
process.stdout.write(`${JSON.stringify(data, null, 2)}\n`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
process.stdout.write(`${String(data)}\n`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import type { LaunchInput } from '../camoufox/config.js';
|
|
3
|
+
export interface SharedOptions {
|
|
4
|
+
session: string;
|
|
5
|
+
tabname: string;
|
|
6
|
+
headless?: boolean | undefined;
|
|
7
|
+
browser?: string | undefined;
|
|
8
|
+
config?: string | undefined;
|
|
9
|
+
configJson?: string | undefined;
|
|
10
|
+
prefs?: string | undefined;
|
|
11
|
+
prefsJson?: string | undefined;
|
|
12
|
+
preset?: string[] | undefined;
|
|
13
|
+
proxy?: string | undefined;
|
|
14
|
+
locale?: string | undefined;
|
|
15
|
+
timezone?: string | undefined;
|
|
16
|
+
width?: number | undefined;
|
|
17
|
+
height?: number | undefined;
|
|
18
|
+
json?: boolean | undefined;
|
|
19
|
+
verbose?: boolean | undefined;
|
|
20
|
+
}
|
|
21
|
+
export interface OutputOptions {
|
|
22
|
+
json?: boolean | undefined;
|
|
23
|
+
verbose?: boolean | undefined;
|
|
24
|
+
force?: boolean | undefined;
|
|
25
|
+
}
|
|
26
|
+
export interface CliHandlers {
|
|
27
|
+
onInstall: (version: string | undefined, options: OutputOptions) => Promise<void>;
|
|
28
|
+
onRemove: (version: string | undefined, options: OutputOptions) => Promise<void>;
|
|
29
|
+
onUse: (version: string, options: OutputOptions) => Promise<void>;
|
|
30
|
+
onVersions: (options: OutputOptions) => Promise<void>;
|
|
31
|
+
onPresets: (options: OutputOptions) => Promise<void>;
|
|
32
|
+
onPath: (options: OutputOptions) => Promise<void>;
|
|
33
|
+
onVersion: (options: OutputOptions) => Promise<void>;
|
|
34
|
+
onDoctor: (options: OutputOptions) => Promise<void>;
|
|
35
|
+
onDaemonAction: (action: string, payload: Record<string, unknown>, options: SharedOptions) => Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export interface ProgramOptions {
|
|
38
|
+
quietErrors?: boolean | undefined;
|
|
39
|
+
}
|
|
40
|
+
export declare function parseInteger(value: string): number;
|
|
41
|
+
export declare function toLaunchInput(options: SharedOptions): LaunchInput;
|
|
42
|
+
export declare function createProgram(handlers: CliHandlers, options?: ProgramOptions): Command;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import packageJson from '../../package.json' with { type: 'json' };
|
|
3
|
+
function collectValues(value, previous = []) {
|
|
4
|
+
return [...previous, ...value.split(',').map((item) => item.trim()).filter(Boolean)];
|
|
5
|
+
}
|
|
6
|
+
function addSharedBrowserOptions(command) {
|
|
7
|
+
return command
|
|
8
|
+
.option('--session <name>', 'session name', 'default')
|
|
9
|
+
.option('--tabname <name>', 'tab name', 'main')
|
|
10
|
+
.option('--headless', 'launch headless')
|
|
11
|
+
.option('--browser <version>', 'specific installed browser version')
|
|
12
|
+
.option('--config <path>', 'Camoufox config file path')
|
|
13
|
+
.option('--config-json <json>', 'inline Camoufox config JSON')
|
|
14
|
+
.option('--prefs <path>', 'Firefox prefs file path')
|
|
15
|
+
.option('--prefs-json <json>', 'inline Firefox prefs JSON')
|
|
16
|
+
.option('--preset <name>', 'apply a built-in preset (repeat or use comma-separated values)', collectValues, [])
|
|
17
|
+
.option('--proxy <url>', 'proxy URL')
|
|
18
|
+
.option('--locale <locale>', 'locale override')
|
|
19
|
+
.option('--timezone <timezone>', 'timezone override')
|
|
20
|
+
.option('--width <width>', 'window width', parseInteger)
|
|
21
|
+
.option('--height <height>', 'window height', parseInteger)
|
|
22
|
+
.option('--json', 'JSON output')
|
|
23
|
+
.option('--verbose', 'verbose output');
|
|
24
|
+
}
|
|
25
|
+
function addSharedOutputOptions(command) {
|
|
26
|
+
return command.option('--json', 'JSON output').option('--verbose', 'verbose output');
|
|
27
|
+
}
|
|
28
|
+
export function parseInteger(value) {
|
|
29
|
+
return Number.parseInt(value, 10);
|
|
30
|
+
}
|
|
31
|
+
export function toLaunchInput(options) {
|
|
32
|
+
return {
|
|
33
|
+
headless: options.headless,
|
|
34
|
+
browser: options.browser,
|
|
35
|
+
configPath: options.config,
|
|
36
|
+
configJson: options.configJson,
|
|
37
|
+
prefsPath: options.prefs,
|
|
38
|
+
prefsJson: options.prefsJson,
|
|
39
|
+
preset: options.preset,
|
|
40
|
+
proxy: options.proxy,
|
|
41
|
+
locale: options.locale,
|
|
42
|
+
timezone: options.timezone,
|
|
43
|
+
width: options.width,
|
|
44
|
+
height: options.height,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function createProgram(handlers, options) {
|
|
48
|
+
const program = new Command();
|
|
49
|
+
program.exitOverride();
|
|
50
|
+
program.configureOutput({
|
|
51
|
+
writeErr: (str) => {
|
|
52
|
+
if (!options?.quietErrors) {
|
|
53
|
+
process.stderr.write(str);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
outputError: (str, write) => {
|
|
57
|
+
if (!options?.quietErrors) {
|
|
58
|
+
write(str);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
program
|
|
63
|
+
.name('camou')
|
|
64
|
+
.description('CLI and local daemon for Camoufox via Playwright')
|
|
65
|
+
.version(packageJson.version);
|
|
66
|
+
addSharedOutputOptions(program
|
|
67
|
+
.command('install [version]')
|
|
68
|
+
.description('Install the latest or a specific Camoufox release')
|
|
69
|
+
.option('--force', 'reinstall even if already present')
|
|
70
|
+
.action(async (version, options) => {
|
|
71
|
+
await handlers.onInstall(version, options);
|
|
72
|
+
}));
|
|
73
|
+
addSharedOutputOptions(program
|
|
74
|
+
.command('remove [version]')
|
|
75
|
+
.description('Remove an installed Camoufox release')
|
|
76
|
+
.action(async (version, options) => {
|
|
77
|
+
await handlers.onRemove(version, options);
|
|
78
|
+
}));
|
|
79
|
+
addSharedOutputOptions(program
|
|
80
|
+
.command('use <version>')
|
|
81
|
+
.description('Select the active Camoufox version')
|
|
82
|
+
.action(async (version, options) => {
|
|
83
|
+
await handlers.onUse(version, options);
|
|
84
|
+
}));
|
|
85
|
+
addSharedOutputOptions(program
|
|
86
|
+
.command('versions')
|
|
87
|
+
.description('List installed Camoufox versions')
|
|
88
|
+
.action(async (options) => {
|
|
89
|
+
await handlers.onVersions(options);
|
|
90
|
+
}));
|
|
91
|
+
addSharedOutputOptions(program
|
|
92
|
+
.command('presets')
|
|
93
|
+
.description('List built-in launch presets')
|
|
94
|
+
.action(async (options) => {
|
|
95
|
+
await handlers.onPresets(options);
|
|
96
|
+
}));
|
|
97
|
+
addSharedOutputOptions(program
|
|
98
|
+
.command('path')
|
|
99
|
+
.description('Print the resolved Camoufox executable path')
|
|
100
|
+
.action(async (options) => {
|
|
101
|
+
await handlers.onPath(options);
|
|
102
|
+
}));
|
|
103
|
+
addSharedOutputOptions(program
|
|
104
|
+
.command('version')
|
|
105
|
+
.description('Print the current installed Camoufox version')
|
|
106
|
+
.action(async (options) => {
|
|
107
|
+
await handlers.onVersion(options);
|
|
108
|
+
}));
|
|
109
|
+
addSharedOutputOptions(program
|
|
110
|
+
.command('doctor')
|
|
111
|
+
.description('Show environment diagnostics')
|
|
112
|
+
.action(async (options) => {
|
|
113
|
+
await handlers.onDoctor(options);
|
|
114
|
+
}));
|
|
115
|
+
addSharedBrowserOptions(program
|
|
116
|
+
.command('open <url>')
|
|
117
|
+
.description('Open a URL in the current tab')
|
|
118
|
+
.action(async (url, options) => {
|
|
119
|
+
await handlers.onDaemonAction('open', { action: 'open', url, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
120
|
+
}));
|
|
121
|
+
addSharedBrowserOptions(program
|
|
122
|
+
.command('snapshot')
|
|
123
|
+
.description('Capture a stable textual page snapshot')
|
|
124
|
+
.option('-i, --interactive', 'interactive elements only')
|
|
125
|
+
.action(async (options) => {
|
|
126
|
+
await handlers.onDaemonAction('snapshot', { action: 'snapshot', session: options.session, tabName: options.tabname, interactive: options.interactive ?? false, ...toLaunchInput(options) }, options);
|
|
127
|
+
}));
|
|
128
|
+
addSharedBrowserOptions(program
|
|
129
|
+
.command('click <target>')
|
|
130
|
+
.description('Click a selector or @ref')
|
|
131
|
+
.action(async (target, options) => {
|
|
132
|
+
await handlers.onDaemonAction('click', { action: 'click', target, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
133
|
+
}));
|
|
134
|
+
addSharedBrowserOptions(program
|
|
135
|
+
.command('fill <target> <text>')
|
|
136
|
+
.description('Fill a selector or @ref')
|
|
137
|
+
.action(async (target, text, options) => {
|
|
138
|
+
await handlers.onDaemonAction('fill', { action: 'fill', target, text, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
139
|
+
}));
|
|
140
|
+
addSharedBrowserOptions(program
|
|
141
|
+
.command('press <key>')
|
|
142
|
+
.description('Press a keyboard key in the current tab')
|
|
143
|
+
.action(async (key, options) => {
|
|
144
|
+
await handlers.onDaemonAction('press', { action: 'press', key, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
145
|
+
}));
|
|
146
|
+
addSharedBrowserOptions(program
|
|
147
|
+
.command('screenshot [path]')
|
|
148
|
+
.description('Save a screenshot')
|
|
149
|
+
.action(async (filePath, options) => {
|
|
150
|
+
await handlers.onDaemonAction('screenshot', { action: 'screenshot', path: filePath, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
151
|
+
}));
|
|
152
|
+
addSharedBrowserOptions(program
|
|
153
|
+
.command('wait <target>')
|
|
154
|
+
.description('Wait for a selector or @ref')
|
|
155
|
+
.option('--timeout <ms>', 'wait timeout in milliseconds', parseInteger)
|
|
156
|
+
.action(async (target, options) => {
|
|
157
|
+
await handlers.onDaemonAction('wait', { action: 'wait', target, timeoutMs: options.timeout, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
158
|
+
}));
|
|
159
|
+
const getCommand = program.command('get').description('Read values from the current page');
|
|
160
|
+
addSharedBrowserOptions(getCommand
|
|
161
|
+
.command('url')
|
|
162
|
+
.description('Get the current page URL')
|
|
163
|
+
.action(async (options) => {
|
|
164
|
+
await handlers.onDaemonAction('get.url', { action: 'get.url', session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
165
|
+
}));
|
|
166
|
+
addSharedBrowserOptions(getCommand
|
|
167
|
+
.command('title')
|
|
168
|
+
.description('Get the current page title')
|
|
169
|
+
.action(async (options) => {
|
|
170
|
+
await handlers.onDaemonAction('get.title', { action: 'get.title', session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
171
|
+
}));
|
|
172
|
+
addSharedBrowserOptions(getCommand
|
|
173
|
+
.command('text <target>')
|
|
174
|
+
.description('Get text from a selector or @ref')
|
|
175
|
+
.action(async (target, options) => {
|
|
176
|
+
await handlers.onDaemonAction('get.text', { action: 'get.text', target, session: options.session, tabName: options.tabname, ...toLaunchInput(options) }, options);
|
|
177
|
+
}));
|
|
178
|
+
const sessionCommand = program.command('session').description('Manage daemon-owned browser sessions');
|
|
179
|
+
addSharedOutputOptions(sessionCommand
|
|
180
|
+
.command('list')
|
|
181
|
+
.description('List running sessions')
|
|
182
|
+
.action(async (options) => {
|
|
183
|
+
const shared = { session: 'default', tabname: 'main', json: options.json, verbose: options.verbose };
|
|
184
|
+
await handlers.onDaemonAction('session.list', { action: 'session.list' }, shared);
|
|
185
|
+
}));
|
|
186
|
+
addSharedOutputOptions(sessionCommand
|
|
187
|
+
.command('stop [name]')
|
|
188
|
+
.description('Stop a running session')
|
|
189
|
+
.action(async (name, options) => {
|
|
190
|
+
const shared = { session: name ?? 'default', tabname: 'main', json: options.json, verbose: options.verbose };
|
|
191
|
+
await handlers.onDaemonAction('session.stop', { action: 'session.stop', session: name ?? 'default' }, shared);
|
|
192
|
+
}));
|
|
193
|
+
const tabCommand = program.command('tab').description('Manage named tabs within a session');
|
|
194
|
+
addSharedBrowserOptions(tabCommand
|
|
195
|
+
.command('list')
|
|
196
|
+
.description('List tabs in the current session')
|
|
197
|
+
.action(async (options) => {
|
|
198
|
+
await handlers.onDaemonAction('tab.list', { action: 'tab.list', session: options.session }, options);
|
|
199
|
+
}));
|
|
200
|
+
addSharedBrowserOptions(tabCommand
|
|
201
|
+
.command('new [url]')
|
|
202
|
+
.description('Create a new named tab')
|
|
203
|
+
.action(async (url, options) => {
|
|
204
|
+
await handlers.onDaemonAction('tab.new', { action: 'tab.new', session: options.session, tabName: options.tabname, url, ...toLaunchInput(options) }, options);
|
|
205
|
+
}));
|
|
206
|
+
addSharedBrowserOptions(tabCommand
|
|
207
|
+
.command('close [target]')
|
|
208
|
+
.description('Close a tab by name or zero-based index')
|
|
209
|
+
.action(async (target, options) => {
|
|
210
|
+
await handlers.onDaemonAction('tab.close', { action: 'tab.close', session: options.session, target: target ?? options.tabname }, options);
|
|
211
|
+
}));
|
|
212
|
+
return program;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type CamoucliPaths } from '../state/paths.js';
|
|
2
|
+
import type { Logger } from '../util/log.js';
|
|
3
|
+
export declare class CamoucliDaemon {
|
|
4
|
+
private readonly paths;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly browserManager;
|
|
7
|
+
private readonly router;
|
|
8
|
+
private serverHandle?;
|
|
9
|
+
constructor(paths: CamoucliPaths, logger: Logger);
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
stop(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { BrowserManager } from '../browser/manager.js';
|
|
3
|
+
import { createIpcServer } from '../ipc/server.js';
|
|
4
|
+
import { ensureBasePaths } from '../state/paths.js';
|
|
5
|
+
import { cleanupStaleDaemonArtifacts, removeDaemonArtifacts } from './runtime.js';
|
|
6
|
+
import { DaemonRouter } from './router.js';
|
|
7
|
+
export class CamoucliDaemon {
|
|
8
|
+
paths;
|
|
9
|
+
logger;
|
|
10
|
+
browserManager;
|
|
11
|
+
router;
|
|
12
|
+
serverHandle;
|
|
13
|
+
constructor(paths, logger) {
|
|
14
|
+
this.paths = paths;
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
this.browserManager = new BrowserManager({ paths, logger });
|
|
17
|
+
this.router = new DaemonRouter(this.browserManager);
|
|
18
|
+
}
|
|
19
|
+
async start() {
|
|
20
|
+
await ensureBasePaths(this.paths);
|
|
21
|
+
await cleanupStaleDaemonArtifacts(this.paths);
|
|
22
|
+
this.serverHandle = await createIpcServer(this.paths, (request) => this.router.handle(request), this.logger);
|
|
23
|
+
await writeFile(this.paths.daemonPidFile, `${process.pid}\n`, 'utf8');
|
|
24
|
+
}
|
|
25
|
+
async stop() {
|
|
26
|
+
await this.browserManager.stopAllSessions();
|
|
27
|
+
if (this.serverHandle) {
|
|
28
|
+
await this.serverHandle.close();
|
|
29
|
+
this.serverHandle = undefined;
|
|
30
|
+
}
|
|
31
|
+
await removeDaemonArtifacts(this.paths);
|
|
32
|
+
this.logger.info('Daemon shutdown complete');
|
|
33
|
+
await this.logger.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAwB,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAsB,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,cAAc;IAMN;IACA;IANF,cAAc,CAAiB;IAC/B,MAAM,CAAe;IAC9B,YAAY,CAA+B;IAEnD,YACmB,KAAoB,EACpB,MAAc;QADd,UAAK,GAAL,KAAK,CAAe;QACpB,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7G,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,MAAM,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import packageJson from '../../package.json' with { type: 'json' };
|
|
4
|
+
import { CamoucliDaemon } from './daemon.js';
|
|
5
|
+
import { getCamoucliPaths } from '../state/paths.js';
|
|
6
|
+
import { Logger } from '../util/log.js';
|
|
7
|
+
async function main() {
|
|
8
|
+
const paths = getCamoucliPaths();
|
|
9
|
+
const logger = new Logger({
|
|
10
|
+
name: 'daemon',
|
|
11
|
+
filePath: paths.daemonLogFile,
|
|
12
|
+
verbose: process.env.CAMOUCLI_VERBOSE === '1',
|
|
13
|
+
});
|
|
14
|
+
const daemon = new CamoucliDaemon(paths, logger);
|
|
15
|
+
const shutdown = async () => {
|
|
16
|
+
await daemon.stop();
|
|
17
|
+
process.exit(0);
|
|
18
|
+
};
|
|
19
|
+
process.on('SIGINT', () => void shutdown());
|
|
20
|
+
process.on('SIGTERM', () => void shutdown());
|
|
21
|
+
logger.info('Starting camou daemon', { version: packageJson.version, pid: process.pid });
|
|
22
|
+
await daemon.start();
|
|
23
|
+
}
|
|
24
|
+
main().catch((error) => {
|
|
25
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/daemon/main.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,KAAK,CAAC,aAAa;QAC7B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BrowserManager } from '../browser/manager.js';
|
|
2
|
+
import type { DaemonRequest } from '../ipc/protocol.js';
|
|
3
|
+
export declare class DaemonRouter {
|
|
4
|
+
private readonly browserManager;
|
|
5
|
+
constructor(browserManager: BrowserManager);
|
|
6
|
+
handle(request: DaemonRequest): Promise<unknown>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export class DaemonRouter {
|
|
2
|
+
browserManager;
|
|
3
|
+
constructor(browserManager) {
|
|
4
|
+
this.browserManager = browserManager;
|
|
5
|
+
}
|
|
6
|
+
async handle(request) {
|
|
7
|
+
switch (request.action) {
|
|
8
|
+
case 'ping':
|
|
9
|
+
return { ok: true, pid: process.pid };
|
|
10
|
+
case 'open':
|
|
11
|
+
return this.browserManager.open(request);
|
|
12
|
+
case 'snapshot':
|
|
13
|
+
return this.browserManager.snapshot(request);
|
|
14
|
+
case 'click':
|
|
15
|
+
return this.browserManager.click(request);
|
|
16
|
+
case 'fill':
|
|
17
|
+
return this.browserManager.fill(request);
|
|
18
|
+
case 'press':
|
|
19
|
+
return this.browserManager.press(request);
|
|
20
|
+
case 'screenshot':
|
|
21
|
+
return this.browserManager.screenshot(request);
|
|
22
|
+
case 'get.url':
|
|
23
|
+
return this.browserManager.getUrl(request);
|
|
24
|
+
case 'get.title':
|
|
25
|
+
return this.browserManager.getTitle(request);
|
|
26
|
+
case 'get.text':
|
|
27
|
+
return this.browserManager.getText(request);
|
|
28
|
+
case 'wait':
|
|
29
|
+
return this.browserManager.wait(request);
|
|
30
|
+
case 'session.list':
|
|
31
|
+
return this.browserManager.listSessions();
|
|
32
|
+
case 'session.stop':
|
|
33
|
+
return this.browserManager.stopSession(request.session);
|
|
34
|
+
case 'tab.list':
|
|
35
|
+
return this.browserManager.listTabs(request.session);
|
|
36
|
+
case 'tab.new':
|
|
37
|
+
return this.browserManager.newTab(request);
|
|
38
|
+
case 'tab.close':
|
|
39
|
+
return this.browserManager.closeTab(request.session, request.target);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE/D,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,MAAM;gBACT,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YACxC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/C,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5C,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5C,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7C,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/C,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;YAC5C,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1D,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvD,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7C,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CamoucliPaths } from '../state/paths.js';
|
|
2
|
+
export interface DaemonArtifactState {
|
|
3
|
+
pid?: number | undefined;
|
|
4
|
+
pidAlive: boolean;
|
|
5
|
+
removedPidFile: boolean;
|
|
6
|
+
removedSocket: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function readDaemonPid(paths: CamoucliPaths): Promise<number | undefined>;
|
|
9
|
+
export declare function isProcessAlive(pid: number): boolean;
|
|
10
|
+
export declare function cleanupStaleDaemonArtifacts(paths: CamoucliPaths): Promise<DaemonArtifactState>;
|
|
11
|
+
export declare function removeDaemonArtifacts(paths: CamoucliPaths): Promise<void>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { readFile, rm, unlink } from 'node:fs/promises';
|
|
2
|
+
export async function readDaemonPid(paths) {
|
|
3
|
+
try {
|
|
4
|
+
const raw = await readFile(paths.daemonPidFile, 'utf8');
|
|
5
|
+
const value = Number.parseInt(raw.trim(), 10);
|
|
6
|
+
return Number.isInteger(value) && value > 0 ? value : undefined;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function isProcessAlive(pid) {
|
|
13
|
+
try {
|
|
14
|
+
process.kill(pid, 0);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return Boolean(error instanceof Error && 'code' in error && error.code === 'EPERM');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function removeFile(filePath) {
|
|
22
|
+
try {
|
|
23
|
+
await unlink(filePath);
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function cleanupStaleDaemonArtifacts(paths) {
|
|
34
|
+
const pid = await readDaemonPid(paths);
|
|
35
|
+
const pidAlive = pid ? isProcessAlive(pid) : false;
|
|
36
|
+
const removedPidFile = pid && !pidAlive ? await removeFile(paths.daemonPidFile) : false;
|
|
37
|
+
const removedSocket = (!pid || !pidAlive) && paths.daemonSocketPath ? await removeFile(paths.daemonSocketPath) : false;
|
|
38
|
+
return {
|
|
39
|
+
pid,
|
|
40
|
+
pidAlive,
|
|
41
|
+
removedPidFile,
|
|
42
|
+
removedSocket,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export async function removeDaemonArtifacts(paths) {
|
|
46
|
+
await removeFile(paths.daemonPidFile);
|
|
47
|
+
if (paths.daemonSocketPath) {
|
|
48
|
+
await removeFile(paths.daemonSocketPath);
|
|
49
|
+
}
|
|
50
|
+
if (!paths.daemonSocketPath && paths.runtimeDir) {
|
|
51
|
+
await rm(paths.runtimeDir, { recursive: false, force: false }).catch(() => undefined);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/daemon/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAWxD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAoB;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAAoB;IACpE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEnD,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxF,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEvH,OAAO;QACL,GAAG;QACH,QAAQ;QACR,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAoB;IAC9D,MAAM,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,MAAM,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|