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.
Files changed (89) hide show
  1. package/README.md +229 -0
  2. package/dist/browser/actions.d.ts +4 -0
  3. package/dist/browser/actions.js +15 -0
  4. package/dist/browser/actions.js.map +1 -0
  5. package/dist/browser/manager.d.ts +85 -0
  6. package/dist/browser/manager.js +300 -0
  7. package/dist/browser/manager.js.map +1 -0
  8. package/dist/browser/snapshot.d.ts +17 -0
  9. package/dist/browser/snapshot.js +93 -0
  10. package/dist/browser/snapshot.js.map +1 -0
  11. package/dist/browser/tabs.d.ts +24 -0
  12. package/dist/browser/tabs.js +8 -0
  13. package/dist/browser/tabs.js.map +1 -0
  14. package/dist/camoufox/config.d.ts +67 -0
  15. package/dist/camoufox/config.js +121 -0
  16. package/dist/camoufox/config.js.map +1 -0
  17. package/dist/camoufox/env.d.ts +3 -0
  18. package/dist/camoufox/env.js +27 -0
  19. package/dist/camoufox/env.js.map +1 -0
  20. package/dist/camoufox/installer.d.ts +24 -0
  21. package/dist/camoufox/installer.js +291 -0
  22. package/dist/camoufox/installer.js.map +1 -0
  23. package/dist/camoufox/launcher.d.ts +22 -0
  24. package/dist/camoufox/launcher.js +105 -0
  25. package/dist/camoufox/launcher.js.map +1 -0
  26. package/dist/camoufox/prefs.d.ts +5 -0
  27. package/dist/camoufox/prefs.js +27 -0
  28. package/dist/camoufox/prefs.js.map +1 -0
  29. package/dist/camoufox/presets.d.ts +14 -0
  30. package/dist/camoufox/presets.js +73 -0
  31. package/dist/camoufox/presets.js.map +1 -0
  32. package/dist/camoufox/registry.d.ts +30 -0
  33. package/dist/camoufox/registry.js +195 -0
  34. package/dist/camoufox/registry.js.map +1 -0
  35. package/dist/camoufox/validation.d.ts +4 -0
  36. package/dist/camoufox/validation.js +103 -0
  37. package/dist/camoufox/validation.js.map +1 -0
  38. package/dist/cli/daemon.d.ts +2 -0
  39. package/dist/cli/daemon.js +59 -0
  40. package/dist/cli/daemon.js.map +1 -0
  41. package/dist/cli/main.d.ts +2 -0
  42. package/dist/cli/main.js +147 -0
  43. package/dist/cli/main.js.map +1 -0
  44. package/dist/cli/output.d.ts +1 -0
  45. package/dist/cli/output.js +108 -0
  46. package/dist/cli/output.js.map +1 -0
  47. package/dist/cli/program.d.ts +42 -0
  48. package/dist/cli/program.js +214 -0
  49. package/dist/cli/program.js.map +1 -0
  50. package/dist/daemon/daemon.d.ts +12 -0
  51. package/dist/daemon/daemon.js +36 -0
  52. package/dist/daemon/daemon.js.map +1 -0
  53. package/dist/daemon/main.d.ts +2 -0
  54. package/dist/daemon/main.js +28 -0
  55. package/dist/daemon/main.js.map +1 -0
  56. package/dist/daemon/router.d.ts +7 -0
  57. package/dist/daemon/router.js +43 -0
  58. package/dist/daemon/router.js.map +1 -0
  59. package/dist/daemon/runtime.d.ts +11 -0
  60. package/dist/daemon/runtime.js +54 -0
  61. package/dist/daemon/runtime.js.map +1 -0
  62. package/dist/doctor/diagnostics.d.ts +38 -0
  63. package/dist/doctor/diagnostics.js +152 -0
  64. package/dist/doctor/diagnostics.js.map +1 -0
  65. package/dist/ipc/client.d.ts +6 -0
  66. package/dist/ipc/client.js +63 -0
  67. package/dist/ipc/client.js.map +1 -0
  68. package/dist/ipc/protocol.d.ts +775 -0
  69. package/dist/ipc/protocol.js +128 -0
  70. package/dist/ipc/protocol.js.map +1 -0
  71. package/dist/ipc/server.d.ts +10 -0
  72. package/dist/ipc/server.js +99 -0
  73. package/dist/ipc/server.js.map +1 -0
  74. package/dist/state/paths.d.ts +32 -0
  75. package/dist/state/paths.js +121 -0
  76. package/dist/state/paths.js.map +1 -0
  77. package/dist/state/store.d.ts +4 -0
  78. package/dist/state/store.js +30 -0
  79. package/dist/state/store.js.map +1 -0
  80. package/dist/util/errors.d.ts +45 -0
  81. package/dist/util/errors.js +82 -0
  82. package/dist/util/errors.js.map +1 -0
  83. package/dist/util/log.d.ts +19 -0
  84. package/dist/util/log.js +71 -0
  85. package/dist/util/log.js.map +1 -0
  86. package/dist/util/platform.d.ts +12 -0
  87. package/dist/util/platform.js +44 -0
  88. package/dist/util/platform.js.map +1 -0
  89. 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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -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"}