ZeroLeaks
ZeroLeaks Package

Scan Engine

createScanEngine for advanced use. Configure maxTurns, maxTreeDepth, branchingFactor, callbacks.

Scan Engine

For advanced control over scan behavior, use createScanEngine. You can configure TAP parameters, enable or disable features, and register progress and finding callbacks.

Basic Usage

import { createScanEngine } from "zeroleaks";

const engine = createScanEngine({
  scan: {
    maxTurns: 20,
    maxTreeDepth: 4,
    branchingFactor: 3,
    enableCrescendo: true,
    enableManyShot: true,
    enableBestOfN: true,
    bestOfNCount: 3,
  },
});

const result = await engine.runScan(systemPrompt, {
  onProgress: async (progress) => {
    console.log(`Turn ${progress.turn}/${progress.maxTurns}`);
  },
  onFinding: async (finding) => {
    console.log("Finding:", finding.technique, finding.severity);
  },
});

Configuration Options

OptionTypeDefaultDescription
maxTurnsnumber25Maximum attack turns per scan
maxTreeDepthnumber4TAP tree depth
branchingFactornumber3TAP branching factor
pruningThresholdnumber0.3Pruning threshold for attack tree
enableCrescendobooleantrueMulti-turn gradual escalation
enableManyShotbooleantrueMany-shot context priming
enableBestOfNbooleantrueBest-of-N prompt mutations
bestOfNCountnumber3Number of variations per Best-of-N
attackerModelstringanthropic/claude-opus-4.6OpenRouter model for attacker
evaluatorModelstringanthropic/claude-sonnet-4.5OpenRouter model for evaluator
targetModelstringanthropic/claude-sonnet-4.5OpenRouter model for target
enableInspectorbooleantrueTombRaider defense fingerprinting
enableMultiTurnOrchestratorbooleantrueSiren/Echo Chamber sequences
enableAdaptiveTemperaturebooleanfalseAutoAdv-inspired temperature scheduling
enableDualModebooleanRun extraction + injection
scanMode"extraction" | "injection"Single-mode scan

Callbacks

onProgress — Called each turn with progress state:

interface ScanProgress {
  turn: number;
  maxTurns: number;
  phase?: AttackPhase;
  leakStatus?: LeakStatus;
}

onFinding — Called when a vulnerability is detected:

interface Finding {
  technique: string;
  severity: "critical" | "high" | "medium" | "low";
  extractedContent?: string;
  evidence?: string;
  category: string;
  confidence: "high" | "medium" | "low";
}

Dual-Mode Scan

For extraction and injection in parallel:

const engine = createScanEngine({ scan: { enableDualMode: true } });

const result = await engine.runDualScan(systemPrompt, {
  maxDurationMs: 120000,
  onProgress: async (p) => console.log(p.turn, p.maxTurns),
  onFinding: async (f) => console.log(f.technique),
  onInjectionResult: async (r) => console.log(r.technique, r.injectionSucceeded),
});

Custom Engine Example

import { createScanEngine } from "zeroleaks";

const engine = createScanEngine({
  scan: {
    maxTurns: 10,
    maxTreeDepth: 3,
    branchingFactor: 2,
    enableCrescendo: false,
    enableManyShot: false,
    enableBestOfN: true,
    bestOfNCount: 5,
  },
});

const result = await engine.runScan(systemPrompt, {
  maxDurationMs: 60000,
  onProgress: async (p) => {
    process.stdout.write(`\rTurn ${p.turn}/${p.maxTurns} (${p.leakStatus || "—"})`);
  },
  onFinding: async (f) => {
    console.log(`\n[!] ${f.severity}: ${f.technique}`);
  },
});

console.log(`\nScore: ${result.overallScore}/100 (${result.overallVulnerability})`);

On this page