--with-deps
This commit is contained in:
@@ -7,6 +7,10 @@ const message = `
|
|||||||
║ ║
|
║ ║
|
||||||
║ npx agent-browser install ║
|
║ npx agent-browser install ║
|
||||||
║ ║
|
║ ║
|
||||||
|
║ On Linux, include system dependencies with: ║
|
||||||
|
║ ║
|
||||||
|
║ npx agent-browser install --with-deps ║
|
||||||
|
║ ║
|
||||||
╚═══════════════════════════════════════════════════════════════════════════╝
|
╚═══════════════════════════════════════════════════════════════════════════╝
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|||||||
+181
-1
@@ -2,10 +2,173 @@
|
|||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { execSync } from 'child_process';
|
import { execSync, spawnSync } from 'child_process';
|
||||||
import { send, setDebug, setSession, getSession } from './client.js';
|
import { send, setDebug, setSession, getSession } from './client.js';
|
||||||
import type { Response } from './types.js';
|
import type { Response } from './types.js';
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// System Dependencies Installation
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// Common dependencies needed for Playwright browsers on Linux
|
||||||
|
const LINUX_DEPS = {
|
||||||
|
// Shared libraries for Chromium/Firefox/WebKit
|
||||||
|
apt: [
|
||||||
|
'libxcb-shm0',
|
||||||
|
'libx11-xcb1',
|
||||||
|
'libx11-6',
|
||||||
|
'libxcb1',
|
||||||
|
'libxext6',
|
||||||
|
'libxrandr2',
|
||||||
|
'libxcomposite1',
|
||||||
|
'libxcursor1',
|
||||||
|
'libxdamage1',
|
||||||
|
'libxfixes3',
|
||||||
|
'libxi6',
|
||||||
|
'libgtk-3-0',
|
||||||
|
'libpangocairo-1.0-0',
|
||||||
|
'libpango-1.0-0',
|
||||||
|
'libatk1.0-0',
|
||||||
|
'libcairo-gobject2',
|
||||||
|
'libcairo2',
|
||||||
|
'libgdk-pixbuf-2.0-0',
|
||||||
|
'libxrender1',
|
||||||
|
'libasound2',
|
||||||
|
'libfreetype6',
|
||||||
|
'libfontconfig1',
|
||||||
|
'libdbus-1-3',
|
||||||
|
'libnss3',
|
||||||
|
'libnspr4',
|
||||||
|
'libatk-bridge2.0-0',
|
||||||
|
'libdrm2',
|
||||||
|
'libxkbcommon0',
|
||||||
|
'libatspi2.0-0',
|
||||||
|
'libcups2',
|
||||||
|
'libxshmfence1',
|
||||||
|
'libgbm1',
|
||||||
|
],
|
||||||
|
dnf: [
|
||||||
|
'libxcb',
|
||||||
|
'libX11-xcb',
|
||||||
|
'libX11',
|
||||||
|
'libXext',
|
||||||
|
'libXrandr',
|
||||||
|
'libXcomposite',
|
||||||
|
'libXcursor',
|
||||||
|
'libXdamage',
|
||||||
|
'libXfixes',
|
||||||
|
'libXi',
|
||||||
|
'gtk3',
|
||||||
|
'pango',
|
||||||
|
'atk',
|
||||||
|
'cairo-gobject',
|
||||||
|
'cairo',
|
||||||
|
'gdk-pixbuf2',
|
||||||
|
'libXrender',
|
||||||
|
'alsa-lib',
|
||||||
|
'freetype',
|
||||||
|
'fontconfig',
|
||||||
|
'dbus-libs',
|
||||||
|
'nss',
|
||||||
|
'nspr',
|
||||||
|
'at-spi2-atk',
|
||||||
|
'libdrm',
|
||||||
|
'libxkbcommon',
|
||||||
|
'at-spi2-core',
|
||||||
|
'cups-libs',
|
||||||
|
'libxshmfence',
|
||||||
|
'mesa-libgbm',
|
||||||
|
'libwayland-client',
|
||||||
|
'libwayland-server',
|
||||||
|
],
|
||||||
|
yum: [
|
||||||
|
'libxcb',
|
||||||
|
'libX11-xcb',
|
||||||
|
'libX11',
|
||||||
|
'libXext',
|
||||||
|
'libXrandr',
|
||||||
|
'libXcomposite',
|
||||||
|
'libXcursor',
|
||||||
|
'libXdamage',
|
||||||
|
'libXfixes',
|
||||||
|
'libXi',
|
||||||
|
'gtk3',
|
||||||
|
'pango',
|
||||||
|
'atk',
|
||||||
|
'cairo-gobject',
|
||||||
|
'cairo',
|
||||||
|
'gdk-pixbuf2',
|
||||||
|
'libXrender',
|
||||||
|
'alsa-lib',
|
||||||
|
'freetype',
|
||||||
|
'fontconfig',
|
||||||
|
'dbus-libs',
|
||||||
|
'nss',
|
||||||
|
'nspr',
|
||||||
|
'at-spi2-atk',
|
||||||
|
'libdrm',
|
||||||
|
'libxkbcommon',
|
||||||
|
'at-spi2-core',
|
||||||
|
'cups-libs',
|
||||||
|
'libxshmfence',
|
||||||
|
'mesa-libgbm',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
function detectPackageManager(): 'apt' | 'dnf' | 'yum' | null {
|
||||||
|
const managers = ['apt-get', 'dnf', 'yum'] as const;
|
||||||
|
for (const mgr of managers) {
|
||||||
|
try {
|
||||||
|
execSync(`which ${mgr}`, { stdio: 'ignore' });
|
||||||
|
return mgr === 'apt-get' ? 'apt' : mgr;
|
||||||
|
} catch {
|
||||||
|
// Not found, try next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function installSystemDeps(): void {
|
||||||
|
if (os.platform() !== 'linux') {
|
||||||
|
console.log('System dependency installation is only needed on Linux');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pkgMgr = detectPackageManager();
|
||||||
|
if (!pkgMgr) {
|
||||||
|
throw new Error('No supported package manager found (apt-get, dnf, or yum)');
|
||||||
|
}
|
||||||
|
|
||||||
|
const deps = LINUX_DEPS[pkgMgr];
|
||||||
|
if (!deps || deps.length === 0) {
|
||||||
|
throw new Error(`No dependencies defined for package manager: ${pkgMgr}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Detected package manager: ${pkgMgr}`);
|
||||||
|
console.log(`Installing ${deps.length} dependencies...`);
|
||||||
|
|
||||||
|
let cmd: string;
|
||||||
|
switch (pkgMgr) {
|
||||||
|
case 'apt':
|
||||||
|
cmd = `apt-get update && apt-get install -y ${deps.join(' ')}`;
|
||||||
|
break;
|
||||||
|
case 'dnf':
|
||||||
|
cmd = `dnf install -y ${deps.join(' ')}`;
|
||||||
|
break;
|
||||||
|
case 'yum':
|
||||||
|
cmd = `yum install -y ${deps.join(' ')}`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run with sudo if not root
|
||||||
|
const isRoot = process.getuid?.() === 0;
|
||||||
|
if (!isRoot) {
|
||||||
|
cmd = `sudo ${cmd}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
execSync(cmd, { stdio: 'inherit' });
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Utilities
|
// Utilities
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -112,6 +275,7 @@ ${c('yellow', 'Debug:')}
|
|||||||
|
|
||||||
${c('yellow', 'Setup:')}
|
${c('yellow', 'Setup:')}
|
||||||
${c('cyan', 'install')} Install browser binaries
|
${c('cyan', 'install')} Install browser binaries
|
||||||
|
${c('cyan', 'install')} --with-deps Also install system dependencies (Linux)
|
||||||
|
|
||||||
${c('yellow', 'Options:')}
|
${c('yellow', 'Options:')}
|
||||||
--session <name> Isolated session (or AGENT_BROWSER_SESSION env)
|
--session <name> Isolated session (or AGENT_BROWSER_SESSION env)
|
||||||
@@ -951,6 +1115,22 @@ async function main(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'install': {
|
case 'install': {
|
||||||
|
const withDeps = rawArgs.includes('--with-deps') || rawArgs.includes('-d');
|
||||||
|
|
||||||
|
// Install system dependencies first if requested
|
||||||
|
if (withDeps) {
|
||||||
|
console.log(c('cyan', 'Installing system dependencies...'));
|
||||||
|
try {
|
||||||
|
installSystemDeps();
|
||||||
|
console.log(c('green', '✓'), 'System dependencies installed');
|
||||||
|
} catch (error) {
|
||||||
|
const msg = error instanceof Error ? error.message : String(error);
|
||||||
|
console.error(c('red', '✗'), 'Failed to install system dependencies:', msg);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install browsers
|
||||||
console.log(c('cyan', 'Installing Playwright browsers...'));
|
console.log(c('cyan', 'Installing Playwright browsers...'));
|
||||||
try {
|
try {
|
||||||
execSync('npx playwright install', { stdio: 'inherit' });
|
execSync('npx playwright install', { stdio: 'inherit' });
|
||||||
|
|||||||
Reference in New Issue
Block a user