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,38 @@
1
+ import type { BrowserInstallRecord } from '../camoufox/registry.js';
2
+ import type { BrowserLaunchProbe } from '../camoufox/launcher.js';
3
+ import type { PlatformTarget } from '../util/platform.js';
4
+ export interface DoctorBundleCheck {
5
+ checkedFiles: string[];
6
+ missingRequiredFiles: string[];
7
+ missingOptionalFiles: string[];
8
+ }
9
+ export interface DoctorSharedLibraryCheck {
10
+ supported: boolean;
11
+ command?: string | undefined;
12
+ checkedFiles: string[];
13
+ missingLibraries: string[];
14
+ notes: string[];
15
+ }
16
+ export interface DoctorVersionCheck {
17
+ version: string;
18
+ current: boolean;
19
+ sourceRepo: string;
20
+ path: string;
21
+ launchable: boolean;
22
+ error?: string | undefined;
23
+ }
24
+ export declare function inspectBrowserBundle(record: BrowserInstallRecord | undefined, platform: PlatformTarget): Promise<DoctorBundleCheck>;
25
+ export declare function inspectSharedLibraries(record: BrowserInstallRecord | undefined, platform: PlatformTarget): Promise<DoctorSharedLibraryCheck>;
26
+ export declare function buildDoctorHints(input: {
27
+ platform: PlatformTarget;
28
+ installed: boolean;
29
+ currentVersion?: string | undefined;
30
+ launchCheck?: BrowserLaunchProbe | undefined;
31
+ bundleCheck: DoctorBundleCheck;
32
+ sharedLibraryCheck: DoctorSharedLibraryCheck;
33
+ }): string[];
34
+ export declare function buildDoctorVersionChecks(input: {
35
+ installedVersions: BrowserInstallRecord[];
36
+ currentVersion?: string | undefined;
37
+ probes: Map<string, BrowserLaunchProbe>;
38
+ }): DoctorVersionCheck[];
@@ -0,0 +1,152 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ const execFileAsync = promisify(execFile);
6
+ async function exists(filePath) {
7
+ try {
8
+ await stat(filePath);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function getOptionalBundleFiles(record, platform) {
16
+ if (platform.os === 'lin') {
17
+ return [path.join(record.rootDir, 'glxtest')];
18
+ }
19
+ return [];
20
+ }
21
+ export async function inspectBrowserBundle(record, platform) {
22
+ if (!record) {
23
+ return {
24
+ checkedFiles: [],
25
+ missingRequiredFiles: [],
26
+ missingOptionalFiles: [],
27
+ };
28
+ }
29
+ const requiredFiles = [record.executablePath];
30
+ const optionalFiles = getOptionalBundleFiles(record, platform);
31
+ const missingRequiredFiles = (await Promise.all(requiredFiles.map(async (filePath) => ((await exists(filePath)) ? undefined : filePath)))).filter((item) => Boolean(item));
32
+ const missingOptionalFiles = (await Promise.all(optionalFiles.map(async (filePath) => ((await exists(filePath)) ? undefined : filePath)))).filter((item) => Boolean(item));
33
+ return {
34
+ checkedFiles: [...requiredFiles, ...optionalFiles],
35
+ missingRequiredFiles,
36
+ missingOptionalFiles,
37
+ };
38
+ }
39
+ function parseMissingLibraries(output) {
40
+ return output
41
+ .split('\n')
42
+ .map((line) => line.trim())
43
+ .filter((line) => line.includes('=> not found'))
44
+ .map((line) => line.split('=>')[0]?.trim() ?? '')
45
+ .filter(Boolean);
46
+ }
47
+ async function runDependencyCommand(command, filePath) {
48
+ try {
49
+ const { stdout, stderr } = await execFileAsync(command, [filePath]);
50
+ return {
51
+ missingLibraries: parseMissingLibraries(`${stdout}\n${stderr}`),
52
+ };
53
+ }
54
+ catch (error) {
55
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
56
+ return {
57
+ missingLibraries: [],
58
+ note: `${command} is not available on this system.`,
59
+ };
60
+ }
61
+ const stdout = typeof error === 'object' && error && 'stdout' in error ? String(error.stdout ?? '') : '';
62
+ const stderr = typeof error === 'object' && error && 'stderr' in error ? String(error.stderr ?? '') : '';
63
+ const parsed = parseMissingLibraries(`${stdout}\n${stderr}`);
64
+ return {
65
+ missingLibraries: parsed,
66
+ note: error instanceof Error ? error.message : String(error),
67
+ };
68
+ }
69
+ }
70
+ export async function inspectSharedLibraries(record, platform) {
71
+ if (!record) {
72
+ return {
73
+ supported: false,
74
+ checkedFiles: [],
75
+ missingLibraries: [],
76
+ notes: ['No installed browser available for dependency inspection.'],
77
+ };
78
+ }
79
+ if (platform.os !== 'lin') {
80
+ return {
81
+ supported: false,
82
+ checkedFiles: [record.executablePath],
83
+ missingLibraries: [],
84
+ notes: ['Shared library inspection is currently implemented for Linux only.'],
85
+ };
86
+ }
87
+ const checkedFiles = [record.executablePath];
88
+ const glxTestPath = path.join(record.rootDir, 'glxtest');
89
+ if (await exists(glxTestPath)) {
90
+ checkedFiles.push(glxTestPath);
91
+ }
92
+ const missingLibraries = new Set();
93
+ const notes = [];
94
+ for (const filePath of checkedFiles) {
95
+ const result = await runDependencyCommand('ldd', filePath);
96
+ result.missingLibraries.forEach((library) => missingLibraries.add(library));
97
+ if (result.note) {
98
+ notes.push(`${path.basename(filePath)}: ${result.note}`);
99
+ }
100
+ }
101
+ return {
102
+ supported: true,
103
+ command: 'ldd',
104
+ checkedFiles,
105
+ missingLibraries: [...missingLibraries].sort(),
106
+ notes,
107
+ };
108
+ }
109
+ export function buildDoctorHints(input) {
110
+ const hints = [];
111
+ if (!input.installed) {
112
+ hints.push('Run `camou install` to download a compatible Camoufox build.');
113
+ return hints;
114
+ }
115
+ if (input.bundleCheck.missingRequiredFiles.length > 0) {
116
+ hints.push('The current browser bundle is incomplete. Reinstall the selected Camoufox version with `camou install --force`.');
117
+ }
118
+ if (input.sharedLibraryCheck.missingLibraries.length > 0) {
119
+ hints.push(`Install the missing shared libraries: ${input.sharedLibraryCheck.missingLibraries.join(', ')}.`);
120
+ if (input.platform.os === 'lin') {
121
+ hints.push('On Linux, use your distro package manager to install GUI/runtime libraries before launching Camoufox.');
122
+ }
123
+ }
124
+ const launchMessage = input.launchCheck?.error?.message ?? '';
125
+ if (/Browser\.setContrast/i.test(launchMessage)) {
126
+ hints.push(`The current Camoufox build (${input.currentVersion ?? 'unknown'}) is older than the installed Playwright runtime. Switch to a newer browser build or downgrade playwright-core.`);
127
+ }
128
+ if (/locked by another process|profile/i.test(launchMessage)) {
129
+ hints.push('The selected profile is locked by another browser process. Stop the other browser or use a different session name.');
130
+ }
131
+ if (input.bundleCheck.missingOptionalFiles.length > 0 && input.platform.os === 'lin') {
132
+ hints.push('Some optional helper binaries are missing from the bundle. Headless launch may still work, but reinstalling can improve diagnostics.');
133
+ }
134
+ if (hints.length === 0 && input.launchCheck?.success) {
135
+ hints.push('The active Camoufox version looks healthy with the current Playwright runtime.');
136
+ }
137
+ return hints;
138
+ }
139
+ export function buildDoctorVersionChecks(input) {
140
+ return input.installedVersions.map((install) => {
141
+ const probe = input.probes.get(install.version);
142
+ return {
143
+ version: install.version,
144
+ current: install.version === input.currentVersion,
145
+ sourceRepo: install.sourceRepo,
146
+ path: install.executablePath,
147
+ launchable: probe?.success ?? false,
148
+ error: probe?.error?.message,
149
+ };
150
+ });
151
+ }
152
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/doctor/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CamoucliPaths } from '../state/paths.js';
2
+ import { type DaemonRequest, type DaemonSuccessResponse } from './protocol.js';
3
+ export declare function sendDaemonRequest(paths: CamoucliPaths, request: Omit<DaemonRequest, 'id'> & {
4
+ id?: string;
5
+ }, timeoutMs?: number): Promise<DaemonSuccessResponse['data']>;
6
+ export declare function pingDaemon(paths: CamoucliPaths): Promise<boolean>;
@@ -0,0 +1,63 @@
1
+ import net from 'node:net';
2
+ import { IpcError, ValidationError } from '../util/errors.js';
3
+ import { createRequestId, daemonResponseSchema, } from './protocol.js';
4
+ export async function sendDaemonRequest(paths, request, timeoutMs = 20_000) {
5
+ const normalizedRequest = {
6
+ ...request,
7
+ id: request.id ?? createRequestId(),
8
+ };
9
+ const response = await new Promise((resolve, reject) => {
10
+ const socket = paths.daemonSocketPath
11
+ ? net.createConnection({ path: paths.daemonSocketPath })
12
+ : net.createConnection({
13
+ host: paths.daemonHost ?? '127.0.0.1',
14
+ port: paths.daemonPort ?? 43133,
15
+ });
16
+ let buffer = '';
17
+ const timer = setTimeout(() => {
18
+ socket.destroy();
19
+ reject(new IpcError(`Timed out waiting for daemon response after ${timeoutMs}ms.`));
20
+ }, timeoutMs);
21
+ const cleanup = () => clearTimeout(timer);
22
+ socket.once('error', (error) => {
23
+ cleanup();
24
+ reject(new IpcError('Unable to connect to the camou daemon.', undefined, error));
25
+ });
26
+ socket.on('data', (chunk) => {
27
+ buffer += chunk.toString('utf8');
28
+ const lines = buffer.split('\n');
29
+ buffer = lines.pop() ?? '';
30
+ for (const line of lines) {
31
+ const trimmed = line.trim();
32
+ if (!trimmed) {
33
+ continue;
34
+ }
35
+ cleanup();
36
+ socket.end();
37
+ try {
38
+ resolve(daemonResponseSchema.parse(JSON.parse(trimmed)));
39
+ }
40
+ catch (error) {
41
+ reject(new ValidationError('Daemon returned an invalid response.', undefined, error));
42
+ }
43
+ }
44
+ });
45
+ socket.once('connect', () => {
46
+ socket.write(`${JSON.stringify(normalizedRequest)}\n`);
47
+ });
48
+ });
49
+ if (!response.success) {
50
+ throw new IpcError(response.error.message, response.error.details);
51
+ }
52
+ return response.data;
53
+ }
54
+ export async function pingDaemon(paths) {
55
+ try {
56
+ await sendDaemonRequest(paths, { action: 'ping' }, 2_000);
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ipc/client.ts"],"names":[],"mappings":"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"}