src / tools / dependencyChecker.ts
import { spawn } from 'child_process';
export interface DependencyStatus {
ffmpeg?: 'available' | 'unavailable';
neo4jDriver?: 'available' | 'unavailable';
betterSqlite3?: 'available' | 'unavailable';
}
/**
* Check availability of optional dependencies at startup.
*/
export async function checkDependencies(): Promise<DependencyStatus> {
const status: DependencyStatus = {};
// Check FFmpeg
try {
await new Promise((resolve, reject) => {
const child = spawn('ffmpeg', ['-version'], { stdio: 'ignore' });
child.on('error', reject);
child.on('close', (code) => resolve(code === 0));
});
status.ffmpeg = 'available';
} catch {
status.ffmpeg = 'unavailable';
}
// Check Neo4j driver
try {
await import('neo4j-driver');
status.neo4jDriver = 'available';
} catch {
status.neo4jDriver = 'unavailable';
}
// Check better-sqlite3
try {
await import('better-sqlite3');
status.betterSqlite3 = 'available';
} catch {
status.betterSqlite3 = 'unavailable';
}
return status;
}
/**
* Format dependency status for display to user/agent.
*/
export function formatDependencyStatus(status: DependencyStatus): string {
const lines: string[] = ['## Optional Dependencies Status'];
if (status.ffmpeg === 'available') {
lines.push('- **FFmpeg**: Available (video/audio tools enabled)');
} else {
lines.push('- **FFmpeg**: Not found - video/audio transcoding will fail');
}
if (status.neo4jDriver === 'available') {
lines.push('- **Neo4j Driver**: Available');
} else {
lines.push('- **Neo4j Driver**: Not installed - Neo4j tools will fail');
}
if (status.betterSqlite3 === 'available') {
lines.push('- **better-sqlite3**: Available');
} else {
lines.push('- **better-sqlite3**: Not installed - SQLite inspection will fail');
}
return lines.join('\n');
}
src / tools / dependencyChecker.ts
import { spawn } from 'child_process';
export interface DependencyStatus {
ffmpeg?: 'available' | 'unavailable';
neo4jDriver?: 'available' | 'unavailable';
betterSqlite3?: 'available' | 'unavailable';
}
/**
* Check availability of optional dependencies at startup.
*/
export async function checkDependencies(): Promise<DependencyStatus> {
const status: DependencyStatus = {};
// Check FFmpeg
try {
await new Promise((resolve, reject) => {
const child = spawn('ffmpeg', ['-version'], { stdio: 'ignore' });
child.on('error', reject);
child.on('close', (code) => resolve(code === 0));
});
status.ffmpeg = 'available';
} catch {
status.ffmpeg = 'unavailable';
}
// Check Neo4j driver
try {
await import('neo4j-driver');
status.neo4jDriver = 'available';
} catch {
status.neo4jDriver = 'unavailable';
}
// Check better-sqlite3
try {
await import('better-sqlite3');
status.betterSqlite3 = 'available';
} catch {
status.betterSqlite3 = 'unavailable';
}
return status;
}
/**
* Format dependency status for display to user/agent.
*/
export function formatDependencyStatus(status: DependencyStatus): string {
const lines: string[] = ['## Optional Dependencies Status'];
if (status.ffmpeg === 'available') {
lines.push('- **FFmpeg**: Available (video/audio tools enabled)');
} else {
lines.push('- **FFmpeg**: Not found - video/audio transcoding will fail');
}
if (status.neo4jDriver === 'available') {
lines.push('- **Neo4j Driver**: Available');
} else {
lines.push('- **Neo4j Driver**: Not installed - Neo4j tools will fail');
}
if (status.betterSqlite3 === 'available') {
lines.push('- **better-sqlite3**: Available');
} else {
lines.push('- **better-sqlite3**: Not installed - SQLite inspection will fail');
}
return lines.join('\n');
}