Files
reverse-engineering-anything/src/ghidra/GhidraClientTypes.ts
T
19447516a4 feat(ghidra): reuse existing projects through verified copies (#7236)
Reuse selected Ghidra projects through verified private read-only copies, with shared CLI/MCP configuration, committed project identity, import-SHA verification and explicit historical/unknown analysis semantics. Preserve exact cancellation and platform capability boundaries.

Actual Ghidra 12.1.4/JDK21 Linux CLI/MCP investigations matched fresh import on 652-function ls and 14,338-function libcrypto inventories and pseudocode; authenticated complete Evidence, mismatch/staleness refusal, saved historical reports and shared /tmp projects verified. 958 focused tests passed with four platform skips; build/static/docs/format passed. Real macOS/Windows reuse remains unverified; Windows reuse is unavailable. See PR verification for measured whole-task costs and final CI attribution.

Co-authored-by: akushonkamen <akushonkamen@163.com>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
2026-10-26 22:31:13 +08:00

59 lines
2.5 KiB
TypeScript

import type { Logger } from "pino";
import type { BridgeMaxRequestBytes } from "../config/bridgeMaxRequestBytes.js";
import type { Result } from "../domain/result.js";
import type { LinuxCgroupMemoryState } from "../process/LinuxCgroupMemory.js";
import type { GhidraLauncher } from "./GhidraLauncher.js";
import type { GhidraSessionError } from "./GhidraSessionError.js";
import type { GhidraSessionInfo } from "./GhidraSessionValues.js";
import type { GhidraTransportKind } from "./GhidraTransport.js";
/** Result of opening and authenticating one headless Ghidra session. */
export type GhidraStartResult = Result<GhidraSessionInfo, GhidraSessionError>;
/** Cancellation and deadline controls shared by authenticated requests. */
export interface GhidraRequestOptions {
readonly decompileTimeoutSeconds?: number | null;
readonly signal?: AbortSignal;
/** Internal startup/shutdown deadline; analysis calls have no fixed deadline. */
readonly timeoutMs?: number;
}
/** Safe lifecycle telemetry for one isolated Ghidra headless process. */
export type GhidraDiagnostic =
| {
readonly type: "launcher-output";
readonly stream: "stdout" | "stderr";
readonly bytes: number;
readonly totalBytes: number;
}
| {
readonly type: "launcher-exit";
readonly code: number | null;
readonly signal: NodeJS.Signals | null;
}
| { readonly type: "cleanup-incomplete"; readonly reason: string };
/** Dependencies and exact profile commitment for one headless Program session. */
export interface GhidraClientOptions {
readonly launcher: GhidraLauncher;
readonly runId?: string;
readonly targetPath: string;
readonly targetSha256: string;
readonly existingProject?: boolean;
/** Installation host shared by runtime allocation and snapshot admission. */
readonly platform?: NodeJS.Platform;
readonly transport?: GhidraTransportKind;
readonly providerVersion: string;
readonly profileDigest: string;
readonly expectedLanguageId?: string;
readonly expectedCompilerSpecId?: string;
readonly startupTimeoutMs?: number;
readonly readStartupTimeoutMs?: () => number;
readonly onDiagnostic?: (event: GhidraDiagnostic) => void;
readonly logger?: Logger;
/** Observes REA's memory cgroup around a run; defaults to the Linux cgroup v2 reader. */
readonly readMemoryCgroup?: () => Promise<LinuxCgroupMemoryState | undefined>;
/** Effective request ceiling; defaults to the configured bridge ceiling. */
readonly bridgeMaxRequestBytes?: BridgeMaxRequestBytes;
}