87 lines
3.7 KiB
JavaScript
87 lines
3.7 KiB
JavaScript
"use strict";
|
|
/**
|
|
* ABE — Autonomous Bug Explorer
|
|
* Entry point: wires all components together and starts exploration.
|
|
*
|
|
* Usage:
|
|
* npm run explore -- --url http://localhost:3000 --output ./reports
|
|
* ts-node src/index.ts http://localhost:3000
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const ExplorationEngine_1 = require("./core/ExplorationEngine");
|
|
const StateGraph_1 = require("./core/StateGraph");
|
|
const Logger_1 = require("./core/Logger");
|
|
const PlaywrightAgent_1 = require("./plugins/agents/PlaywrightAgent");
|
|
const ScreenshotCollector_1 = require("./plugins/collectors/ScreenshotCollector");
|
|
const NetworkCollector_1 = require("./plugins/collectors/NetworkCollector");
|
|
const DOMSnapshotCollector_1 = require("./plugins/collectors/DOMSnapshotCollector");
|
|
const JSONExporter_1 = require("./plugins/exporters/JSONExporter");
|
|
const MarkdownExporter_1 = require("./plugins/exporters/MarkdownExporter");
|
|
const PlaywrightReproducer_1 = require("./plugins/reproducers/PlaywrightReproducer");
|
|
// ─── Parse CLI arguments ─────────────────────────────────────────────────────
|
|
function parseArgs() {
|
|
const args = process.argv.slice(2);
|
|
let url = 'http://localhost:3000';
|
|
let outputDir = './reports';
|
|
let seed = 42;
|
|
let maxSteps = 100;
|
|
for (let i = 0; i < args.length; i++) {
|
|
if (args[i] === '--url' && args[i + 1])
|
|
url = args[++i];
|
|
else if (args[i] === '--output' && args[i + 1])
|
|
outputDir = args[++i];
|
|
else if (args[i] === '--seed' && args[i + 1])
|
|
seed = parseInt(args[++i], 10);
|
|
else if (args[i] === '--max-steps' && args[i + 1])
|
|
maxSteps = parseInt(args[++i], 10);
|
|
else if (!args[i].startsWith('--'))
|
|
url = args[i];
|
|
}
|
|
return { url, outputDir, seed, maxSteps };
|
|
}
|
|
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
async function main() {
|
|
const { url, outputDir, seed, maxSteps } = parseArgs();
|
|
const sessionId = `${new Date().toISOString().replace(/[:.]/g, '-')}_seed${seed}`;
|
|
const logger = new Logger_1.FileLogger('./logs', sessionId);
|
|
const graph = new StateGraph_1.StateGraph();
|
|
const agent = new PlaywrightAgent_1.PlaywrightAgent({ seed, headless: true, logger });
|
|
const collectors = [
|
|
new ScreenshotCollector_1.ScreenshotCollector(outputDir),
|
|
new NetworkCollector_1.NetworkCollector(),
|
|
new DOMSnapshotCollector_1.DOMSnapshotCollector(outputDir),
|
|
];
|
|
const exporters = [
|
|
new JSONExporter_1.JSONExporter(url),
|
|
new MarkdownExporter_1.MarkdownExporter(),
|
|
];
|
|
const reproducer = new PlaywrightReproducer_1.PlaywrightReproducer();
|
|
const engine = new ExplorationEngine_1.ExplorationEngine({
|
|
graph,
|
|
agent,
|
|
collectors,
|
|
exporters,
|
|
reproducer,
|
|
logger,
|
|
seed,
|
|
url,
|
|
maxSteps,
|
|
outputDir,
|
|
});
|
|
console.log(`[ABE] Starting exploration of ${url} (seed=${seed}, maxSteps=${maxSteps})`);
|
|
try {
|
|
const result = await engine.run();
|
|
console.log(`[ABE] Exploration complete.`);
|
|
console.log(` States visited : ${result.statesVisited}`);
|
|
console.log(` Anomalies found: ${result.anomaliesFound}`);
|
|
if (result.anomaliesFound > 0) {
|
|
console.log(` Reports saved to: ${outputDir}/`);
|
|
}
|
|
}
|
|
catch (err) {
|
|
console.error('[ABE] Fatal error:', err);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
main();
|