From 37f4ac6d7073693fb4d2290b5aff6bcb6b36cd19 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:27:04 +0000 Subject: [PATCH 1/5] refactor: simplify doctor and error projections --- src/application/Doctor.ts | 448 +++++++-------------------- src/application/DoctorDiagnostics.ts | 305 ++++++++++++++++++ src/application/ProcessCli.ts | 14 +- src/domain/errors.ts | 330 ++++++++++++-------- src/native/CommandRunner.ts | 22 +- 5 files changed, 635 insertions(+), 484 deletions(-) create mode 100644 src/application/DoctorDiagnostics.ts diff --git a/src/application/Doctor.ts b/src/application/Doctor.ts index a621648388..23d9b9c6eb 100644 --- a/src/application/Doctor.ts +++ b/src/application/Doctor.ts @@ -6,11 +6,9 @@ import { execFile } from "node:child_process"; import { promisify } from "node:util"; import { parseBinaryTarget } from "../domain/binaryTarget.js"; -import { supportsNodeVersion } from "../domain/runtimeVersion.js"; import { probeHomebrew } from "./homebrew.js"; import { linuxHopperBinarySupported, - linuxHopperLauncherPath, linuxSharedLibrariesAvailable, readLinuxDistribution, type LinuxDistribution, @@ -25,12 +23,12 @@ import { inspectRuntimeExecutables, type RuntimeExecutableInventory, } from "./RuntimeExecutableDiagnostics.js"; +import { + collectDoctorDiagnostics, + doctorHealthy, +} from "./DoctorDiagnostics.js"; const execFileAsync = promisify(execFile); -const DEFAULT_HOPPER = - "/Applications/Hopper Disassembler.app/Contents/MacOS/hopper"; -const SYSTEM_LINUX_HOPPER = "/opt/hopper/bin/Hopper"; - /** One actionable environment diagnostic. */ export interface DoctorCheck { readonly name: string; @@ -97,6 +95,40 @@ interface InstalledSkillIdentity { readonly catalogDigest: string | null; } +/** Structured result returned by the read-only doctor workflow. */ +export interface DoctorReport { + readonly healthy: boolean; + readonly hopperPath?: string; + readonly providerInspections?: readonly DoctorProviderInspection[]; + readonly checks: readonly DoctorCheck[]; + readonly identity?: DoctorIdentity; +} + +/** Installed-package, skill, client, and runtime identity observations. */ +export interface DoctorIdentity { + readonly cli_package_version: string; + readonly expected_skill_version: string; + readonly sdk: typeof SDK_IDENTITY; + readonly catalog: typeof CATALOG_IDENTITY; + readonly live_server: { + readonly state: "unknown"; + readonly remediation: string; + }; + readonly installations: { + readonly paths: readonly string[]; + readonly state: "single" | "multiple" | "unknown"; + }; + readonly skill: { + readonly installed_version: string | null; + readonly installed_tool_count: number | null; + readonly installed_catalog_digest: string | null; + readonly state: "aligned" | "stale" | "missing"; + readonly remediation: string | null; + }; + readonly registrations: readonly ClientRegistrationStatus[]; + readonly runtime_executables: RuntimeExecutableInventory | null; +} + /** * Check requirements and an optional target without mutating the host. * Every failed check includes remediation suitable for either the one-shot CLI @@ -105,221 +137,15 @@ interface InstalledSkillIdentity { export const runDoctor = async ( target?: string, host: DoctorHost = systemDoctorHost(), -): Promise<{ - readonly healthy: boolean; - readonly hopperPath?: string; - readonly providerInspections?: readonly DoctorProviderInspection[]; - readonly checks: readonly DoctorCheck[]; - readonly identity?: { - readonly cli_package_version: string; - readonly expected_skill_version: string; - readonly sdk: typeof SDK_IDENTITY; - readonly catalog: typeof CATALOG_IDENTITY; - readonly live_server: { - readonly state: "unknown"; - readonly remediation: string; - }; - readonly installations: { - readonly paths: readonly string[]; - readonly state: "single" | "multiple" | "unknown"; - }; - readonly skill: { - readonly installed_version: string | null; - readonly installed_tool_count: number | null; - readonly installed_catalog_digest: string | null; - readonly state: "aligned" | "stale" | "missing"; - readonly remediation: string | null; - }; - readonly registrations: readonly ClientRegistrationStatus[]; - readonly runtime_executables: RuntimeExecutableInventory | null; - }; -}> => { - const checks: DoctorCheck[] = []; - checks.push( - check("node", supportsNodeVersion(host.nodeVersion), host.nodeVersion, { - remediation: "Install Node.js 22.19+ or 24.11+.", - classification: "missing_dependency", - }), - ); - const runtimeExecutables = await host.runtimeExecutables?.(); - if (runtimeExecutables !== undefined) { - const broken = runtimeExecutables.candidates.filter( - ({ healthy }) => !healthy, - ); - checks.push( - check( - "node-toolchains", - broken.length === 0, - broken.length === 0 - ? `${String(runtimeExecutables.candidates.length)} runtime executable candidates passed bounded version probes.` - : `${String(broken.length)} of ${String(runtimeExecutables.candidates.length)} runtime executable candidates failed bounded version probes: ${broken - .slice(0, 5) - .map(({ lexical_path: path }) => path) - .join(", ")}${broken.length > 5 ? ", …" : ""}`, - { - remediation: - "Select a verified healthy Node toolchain or repair the failing installation, then rerun rea doctor. Do not create compatibility-library symlinks.", - classification: "missing_dependency", - }, - ), - ); - } - const macosVersion = - host.platform === "darwin" ? await host.macosVersion() : undefined; - const macosMajor = macosVersion === undefined ? 0 : parseMajor(macosVersion); - const linuxDistribution = - host.platform === "linux" ? await host.linuxDistribution() : undefined; - const supportedHost = - (host.platform === "darwin" && macosMajor >= 12) || - (host.platform === "linux" && linuxDistribution?.supported === true) || - (host.platform === "win32" && host.architecture === "x64"); - checks.push( - check( - "host", - supportedHost, - macosVersion ?? - (linuxDistribution === undefined - ? `${host.platform} ${host.architecture}` - : `${linuxDistribution.id} ${linuxDistribution.versionId ?? "unknown"}`), - { - remediation: - "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, and the experimental Windows x64 Ghidra P0 boundary.", - classification: "unsupported_host", - }, - ), - ); - const candidates = - host.configuredHopperPath === undefined - ? [ - DEFAULT_HOPPER, - SYSTEM_LINUX_HOPPER, - linuxHopperLauncherPath(homedir()), - ...(await host.manualHopperPaths()), - ] - : [host.configuredHopperPath]; - let hopperPath = await firstExecutable(host, candidates); - if (hopperPath === undefined && host.configuredHopperPath === undefined) { - const brewCandidate = await host.brewHopperPath(); - hopperPath = await firstExecutable( - host, - brewCandidate === undefined ? [] : [brewCandidate], - ); - } - checks.push( - check( - "hopper", - hopperPath !== undefined, - hopperPath ?? host.configuredHopperPath, - { - remediation: - host.configuredHopperPath === undefined - ? "Run rea setup to install Hopper, or set HOPPER_LAUNCHER_PATH." - : "Unset or update HOPPER_LAUNCHER_PATH to an executable Hopper launcher.", - classification: - host.configuredHopperPath === undefined - ? "missing_analysis_engine" - : "config_drift", - }, - ), - ); - if (host.platform === "linux" && hopperPath !== undefined) - checks.push( - check( - "hopper-version", - await host.supportedLinuxHopper(hopperPath), - hopperPath, - { - remediation: unsupportedHopperRemediation( - host.configuredHopperPath === hopperPath, - ), - classification: "config_drift", - }, - ), - ); - const providerInspections = await inspectDoctorProviders(host, checks); - const javascriptReplayCheck = await host.javascriptReplayCheck?.(); - if (javascriptReplayCheck !== undefined) checks.push(javascriptReplayCheck); - if (host.configuredIlspyCmdPath !== undefined) { - const version = await host.ilspyCmdVersion?.(host.configuredIlspyCmdPath); - checks.push( - check( - "ilspycmd", - version !== undefined, - version === undefined - ? host.configuredIlspyCmdPath - : `${host.configuredIlspyCmdPath} (${version})`, - { - remediation: - "Unset REA_ILSPY_CMD_PATH or point it at a runnable ilspycmd executable.", - classification: "config_drift", - }, - ), - ); - } - if (host.platform === "linux" && hopperPath !== undefined) - checks.push( - check( - "hopper-demo-runtime", - await host.linuxDemoRuntimeReady(), - undefined, - { - remediation: - "Rerun rea setup to install the Xvfb, xauth, Python, X11, and XTEST packages required for Linux demo sessions.", - classification: "missing_dependency", - }, - ), - ); - if (target !== undefined) - checks.push( - check("target", await host.validTarget(target), target, { - remediation: "Supply a readable local app or program path.", - classification: "config_drift", - }), - ); - const installationPaths = (await host.installationPaths?.()) ?? []; - const observedSkillIdentity = await host.installedSkillIdentity?.(); - const legacySkillVersion = - observedSkillIdentity === undefined - ? await host.installedSkillVersion?.() - : undefined; - const installedSkillIdentity = - observedSkillIdentity ?? - (legacySkillVersion === undefined - ? undefined - : { - version: legacySkillVersion, - toolCount: null, - catalogDigest: null, - }); - const installedSkillVersion = installedSkillIdentity?.version ?? undefined; - const skillAligned = - installedSkillIdentity?.version === PRODUCT_IDENTITY.skillVersion && - installedSkillIdentity.toolCount === CATALOG_IDENTITY.counts.mcp_tools && - installedSkillIdentity.catalogDigest === - CATALOG_IDENTITY.digests.combined_sha256; - if (!skillAligned) - checks.push({ - name: "skill:identity", - ok: false, - classification: "config_drift", - detail: - installedSkillIdentity === undefined - ? "Installed REA skill identity is missing." - : "Installed REA skill identity is stale.", - remediation: "Run rea setup to update the installed REA skill.", - }); - const registrations = (await host.clientRegistrations?.()) ?? []; - for (const registration of registrations) - if (registration.state !== "aligned") - checks.push({ - name: `registration:${registration.client}`, - ok: false, - classification: "config_drift", - detail: registration.config_path, - remediation: - registration.remediation ?? - "Run rea setup, then restart the affected client.", - }); +): Promise => { + const { + checks: diagnosticChecks, + hopperPath, + providerInspections, + runtimeExecutables, + } = await collectDoctorDiagnostics(target, host); + const identity = await collectDoctorIdentity(host, runtimeExecutables); + const checks = [...diagnosticChecks, ...identity.checks]; return { healthy: doctorHealthy(checks, { hopperAvailable: @@ -333,7 +159,29 @@ export const runDoctor = async ( ...(hopperPath === undefined ? {} : { hopperPath }), ...(providerInspections === undefined ? {} : { providerInspections }), checks, - identity: { + identity: identity.value, + }; +}; + +const collectDoctorIdentity = async ( + host: DoctorHost, + runtimeExecutables: RuntimeExecutableInventory | undefined, +): Promise<{ + readonly checks: readonly DoctorCheck[]; + readonly value: DoctorIdentity; +}> => { + const installationPaths = (await host.installationPaths?.()) ?? []; + const installedSkillIdentity = await readInstalledSkillIdentity(host); + const skillAligned = skillIdentityAligned(installedSkillIdentity); + const registrations = (await host.clientRegistrations?.()) ?? []; + return { + checks: [ + ...(skillAligned ? [] : [skillIdentityCheck(installedSkillIdentity)]), + ...registrations + .filter(({ state }) => state !== "aligned") + .map(registrationCheck), + ], + value: { cli_package_version: PRODUCT_IDENTITY.packageVersion, expected_skill_version: PRODUCT_IDENTITY.skillVersion, sdk: SDK_IDENTITY, @@ -345,15 +193,10 @@ export const runDoctor = async ( }, installations: { paths: installationPaths, - state: - installationPaths.length === 0 - ? "unknown" - : installationPaths.length === 1 - ? "single" - : "multiple", + state: installationState(installationPaths), }, skill: { - installed_version: installedSkillVersion ?? null, + installed_version: installedSkillIdentity?.version ?? null, installed_tool_count: installedSkillIdentity?.toolCount ?? null, installed_catalog_digest: installedSkillIdentity?.catalogDigest ?? null, state: @@ -372,10 +215,53 @@ export const runDoctor = async ( }; }; -const unsupportedHopperRemediation = (configured: boolean): string => - configured - ? "Unset or update HOPPER_LAUNCHER_PATH, install the Hopper build supported by this REA release, or update REA." - : "Install the Hopper build supported by this REA release, or update REA for a newer Hopper build."; +const readInstalledSkillIdentity = async ( + host: DoctorHost, +): Promise => { + const observed = await host.installedSkillIdentity?.(); + if (observed !== undefined) return observed; + const legacyVersion = await host.installedSkillVersion?.(); + return legacyVersion === undefined + ? undefined + : { version: legacyVersion, toolCount: null, catalogDigest: null }; +}; + +const skillIdentityAligned = ( + identity: InstalledSkillIdentity | undefined, +): boolean => + identity?.version === PRODUCT_IDENTITY.skillVersion && + identity.toolCount === CATALOG_IDENTITY.counts.mcp_tools && + identity.catalogDigest === CATALOG_IDENTITY.digests.combined_sha256; + +const skillIdentityCheck = ( + identity: InstalledSkillIdentity | undefined, +): DoctorCheck => ({ + name: "skill:identity", + ok: false, + classification: "config_drift", + detail: + identity === undefined + ? "Installed REA skill identity is missing." + : "Installed REA skill identity is stale.", + remediation: "Run rea setup to update the installed REA skill.", +}); + +const registrationCheck = ( + registration: ClientRegistrationStatus, +): DoctorCheck => ({ + name: `registration:${registration.client}`, + ok: false, + classification: "config_drift", + detail: registration.config_path, + remediation: + registration.remediation ?? + "Run rea setup, then restart the affected client.", +}); + +const installationState = ( + paths: readonly string[], +): DoctorIdentity["installations"]["state"] => + paths.length === 0 ? "unknown" : paths.length === 1 ? "single" : "multiple"; /** Optional outer-adapter diagnostics composed without reversing dependencies. */ export interface SystemDoctorHostOptions { @@ -552,8 +438,6 @@ export const systemDoctorHost = ( clientRegistrations: () => readClientRegistrationStatuses(homedir()), }); -const parseMajor = (version: string): number => - Number.parseInt(version.split(".")[0] ?? "0", 10); const uniqueLines = (value: string): string[] => [ ...new Set( value @@ -563,99 +447,5 @@ const uniqueLines = (value: string): string[] => [ ), ]; -const firstExecutable = async ( - host: DoctorHost, - candidates: readonly string[], -): Promise => { - for (const candidate of new Set(candidates)) - if (await host.executable(candidate)) return candidate; - return undefined; -}; - const firstIlspyVersionLine = (value: string): string | undefined => uniqueLines(value).find((line) => line.startsWith("ilspycmd:")); - -const check = ( - name: string, - ok: boolean, - detail: string | undefined, - failure: { - readonly remediation: string; - readonly classification: Exclude; - }, -): DoctorCheck => ({ - name, - ok, - classification: ok ? "healthy" : failure.classification, - ...(detail === undefined ? {} : { detail }), - ...(ok ? {} : { remediation: failure.remediation }), -}); - -const providerDoctorChecks = ( - inspection: DoctorProviderInspection, -): readonly DoctorCheck[] => - inspection.checks.map((candidate) => ({ - name: - candidate.name === "configuration" - ? inspection.id - : `${inspection.id}-${candidate.name}`, - ok: candidate.ok, - classification: candidate.ok ? "healthy" : candidate.classification, - detail: candidate.detail, - ...(candidate.remediation === null - ? {} - : { remediation: candidate.remediation }), - })); - -const inspectDoctorProviders = async ( - host: DoctorHost, - checks: DoctorCheck[], -): Promise => { - const inspections = await host.providerInspections?.(); - if (inspections === undefined) return undefined; - for (const inspection of inspections) - checks.push(...providerDoctorChecks(inspection)); - return inspections; -}; - -const doctorHealthy = ( - checks: readonly DoctorCheck[], - providers: { - readonly hopperAvailable: boolean; - readonly hopperConfigured: boolean; - readonly providerInspections: - | readonly DoctorProviderInspection[] - | undefined; - }, -): boolean => { - if (providers.providerInspections === undefined) - return checks.every(({ ok }) => ok); - const providerChecks = checks.filter( - ({ name }) => - name.startsWith("hopper") || - providers.providerInspections?.some((inspection) => - providerCheckName(inspection.id, name), - ) === true, - ); - const coreHealthy = checks - .filter((candidate) => !providerChecks.includes(candidate)) - .every(({ ok }) => ok); - const configuredProvidersHealthy = providerChecks - .filter(({ name }) => { - if (name.startsWith("hopper")) return providers.hopperConfigured; - return providers.providerInspections?.some( - (inspection) => - inspection.configured && providerCheckName(inspection.id, name), - ); - }) - .every(({ ok }) => ok); - return ( - coreHealthy && - configuredProvidersHealthy && - (providers.hopperAvailable || - providers.providerInspections.some(({ available }) => available)) - ); -}; - -const providerCheckName = (providerId: string, name: string): boolean => - name === providerId || name.startsWith(`${providerId}-`); diff --git a/src/application/DoctorDiagnostics.ts b/src/application/DoctorDiagnostics.ts new file mode 100644 index 0000000000..2d286b281b --- /dev/null +++ b/src/application/DoctorDiagnostics.ts @@ -0,0 +1,305 @@ +import { homedir } from "node:os"; + +import { supportsNodeVersion } from "../domain/runtimeVersion.js"; +import { linuxHopperLauncherPath } from "./LinuxHopper.js"; +import type { + DoctorCheck, + DoctorHost, + DoctorProviderInspection, +} from "./Doctor.js"; +import type { RuntimeExecutableInventory } from "./RuntimeExecutableDiagnostics.js"; + +const DEFAULT_HOPPER = + "/Applications/Hopper Disassembler.app/Contents/MacOS/hopper"; +const SYSTEM_LINUX_HOPPER = "/opt/hopper/bin/Hopper"; + +/** Ordered environment diagnostics consumed by the Doctor report assembler. */ +export interface DoctorDiagnostics { + readonly checks: readonly DoctorCheck[]; + readonly hopperPath?: string; + readonly providerInspections?: readonly DoctorProviderInspection[]; + readonly runtimeExecutables?: RuntimeExecutableInventory; +} + +/** Collect host, provider, and optional-target diagnostics without mutation. */ +export const collectDoctorDiagnostics = async ( + target: string | undefined, + host: DoctorHost, +): Promise => { + const runtimeExecutables = await host.runtimeExecutables?.(); + const checks: DoctorCheck[] = [ + nodeCheck(host), + ...runtimeChecks(runtimeExecutables), + ]; + checks.push(await hostCheck(host)); + + const hopperPath = await findHopper(host); + checks.push(hopperCheck(host, hopperPath)); + const hopperVersionCheck = await optionalHopperVersionCheck(host, hopperPath); + if (hopperVersionCheck !== undefined) checks.push(hopperVersionCheck); + + const providerInspections = await host.providerInspections?.(); + if (providerInspections !== undefined) + checks.push(...providerInspections.flatMap(providerDoctorChecks)); + + const javascriptReplayCheck = await host.javascriptReplayCheck?.(); + if (javascriptReplayCheck !== undefined) checks.push(javascriptReplayCheck); + const ilspyCheck = await optionalIlspyCheck(host); + if (ilspyCheck !== undefined) checks.push(ilspyCheck); + const hopperDemoCheck = await optionalHopperDemoCheck(host, hopperPath); + if (hopperDemoCheck !== undefined) checks.push(hopperDemoCheck); + const targetCheck = await optionalTargetCheck(target, host); + if (targetCheck !== undefined) checks.push(targetCheck); + + return { + checks, + ...(hopperPath === undefined ? {} : { hopperPath }), + ...(providerInspections === undefined ? {} : { providerInspections }), + ...(runtimeExecutables === undefined ? {} : { runtimeExecutables }), + }; +}; + +/** Evaluate core health while treating unconfigured providers as optional. */ +export const doctorHealthy = ( + checks: readonly DoctorCheck[], + providers: { + readonly hopperAvailable: boolean; + readonly hopperConfigured: boolean; + readonly providerInspections: + | readonly DoctorProviderInspection[] + | undefined; + }, +): boolean => { + if (providers.providerInspections === undefined) + return checks.every(({ ok }) => ok); + const providerChecks = checks.filter( + ({ name }) => + name.startsWith("hopper") || + providers.providerInspections?.some((inspection) => + providerCheckName(inspection.id, name), + ) === true, + ); + const coreHealthy = checks + .filter((candidate) => !providerChecks.includes(candidate)) + .every(({ ok }) => ok); + const configuredProvidersHealthy = providerChecks + .filter(({ name }) => { + if (name.startsWith("hopper")) return providers.hopperConfigured; + return providers.providerInspections?.some( + (inspection) => + inspection.configured && providerCheckName(inspection.id, name), + ); + }) + .every(({ ok }) => ok); + return ( + coreHealthy && + configuredProvidersHealthy && + (providers.hopperAvailable || + providers.providerInspections.some(({ available }) => available)) + ); +}; + +const nodeCheck = (host: DoctorHost): DoctorCheck => + check("node", supportsNodeVersion(host.nodeVersion), host.nodeVersion, { + remediation: "Install Node.js 22.19+ or 24.11+.", + classification: "missing_dependency", + }); + +const runtimeChecks = ( + inventory: RuntimeExecutableInventory | undefined, +): readonly DoctorCheck[] => { + if (inventory === undefined) return []; + const broken = inventory.candidates.filter(({ healthy }) => !healthy); + const detail = + broken.length === 0 + ? `${String(inventory.candidates.length)} runtime executable candidates passed bounded version probes.` + : `${String(broken.length)} of ${String(inventory.candidates.length)} runtime executable candidates failed bounded version probes: ${broken + .slice(0, 5) + .map(({ lexical_path: path }) => path) + .join(", ")}${broken.length > 5 ? ", …" : ""}`; + return [ + check("node-toolchains", broken.length === 0, detail, { + remediation: + "Select a verified healthy Node toolchain or repair the failing installation, then rerun rea doctor. Do not create compatibility-library symlinks.", + classification: "missing_dependency", + }), + ]; +}; + +const hostCheck = async (host: DoctorHost): Promise => { + const macosVersion = + host.platform === "darwin" ? await host.macosVersion() : undefined; + const linuxDistribution = + host.platform === "linux" ? await host.linuxDistribution() : undefined; + const supported = + (host.platform === "darwin" && parseMajor(macosVersion) >= 12) || + (host.platform === "linux" && linuxDistribution?.supported === true) || + (host.platform === "win32" && host.architecture === "x64"); + const detail = + macosVersion ?? + (linuxDistribution === undefined + ? `${host.platform} ${host.architecture}` + : `${linuxDistribution.id} ${linuxDistribution.versionId ?? "unknown"}`); + return check("host", supported, detail, { + remediation: + "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, and the experimental Windows x64 Ghidra P0 boundary.", + classification: "unsupported_host", + }); +}; + +const findHopper = async (host: DoctorHost): Promise => { + const candidates = + host.configuredHopperPath === undefined + ? [ + DEFAULT_HOPPER, + SYSTEM_LINUX_HOPPER, + linuxHopperLauncherPath(homedir()), + ...(await host.manualHopperPaths()), + ] + : [host.configuredHopperPath]; + const hopperPath = await firstExecutable(host, candidates); + if (hopperPath !== undefined || host.configuredHopperPath !== undefined) + return hopperPath; + const brewCandidate = await host.brewHopperPath(); + return firstExecutable( + host, + brewCandidate === undefined ? [] : [brewCandidate], + ); +}; + +const firstExecutable = async ( + host: DoctorHost, + candidates: readonly string[], +): Promise => { + for (const candidate of new Set(candidates)) + if (await host.executable(candidate)) return candidate; + return undefined; +}; + +const hopperCheck = ( + host: DoctorHost, + hopperPath: string | undefined, +): DoctorCheck => + check( + "hopper", + hopperPath !== undefined, + hopperPath ?? host.configuredHopperPath, + { + remediation: + host.configuredHopperPath === undefined + ? "Run rea setup to install Hopper, or set HOPPER_LAUNCHER_PATH." + : "Unset or update HOPPER_LAUNCHER_PATH to an executable Hopper launcher.", + classification: + host.configuredHopperPath === undefined + ? "missing_analysis_engine" + : "config_drift", + }, + ); + +const optionalHopperVersionCheck = async ( + host: DoctorHost, + hopperPath: string | undefined, +): Promise => { + if (host.platform !== "linux" || hopperPath === undefined) return undefined; + return check( + "hopper-version", + await host.supportedLinuxHopper(hopperPath), + hopperPath, + { + remediation: unsupportedHopperRemediation( + host.configuredHopperPath === hopperPath, + ), + classification: "config_drift", + }, + ); +}; + +const optionalHopperDemoCheck = async ( + host: DoctorHost, + hopperPath: string | undefined, +): Promise => + host.platform !== "linux" || hopperPath === undefined + ? undefined + : check( + "hopper-demo-runtime", + await host.linuxDemoRuntimeReady(), + undefined, + { + remediation: + "Rerun rea setup to install the Xvfb, xauth, Python, X11, and XTEST packages required for Linux demo sessions.", + classification: "missing_dependency", + }, + ); + +const optionalIlspyCheck = async ( + host: DoctorHost, +): Promise => { + if (host.configuredIlspyCmdPath === undefined) return undefined; + const version = await host.ilspyCmdVersion?.(host.configuredIlspyCmdPath); + return check( + "ilspycmd", + version !== undefined, + version === undefined + ? host.configuredIlspyCmdPath + : `${host.configuredIlspyCmdPath} (${version})`, + { + remediation: + "Unset REA_ILSPY_CMD_PATH or point it at a runnable ilspycmd executable.", + classification: "config_drift", + }, + ); +}; + +const optionalTargetCheck = async ( + target: string | undefined, + host: DoctorHost, +): Promise => + target === undefined + ? undefined + : check("target", await host.validTarget(target), target, { + remediation: "Supply a readable local app or program path.", + classification: "config_drift", + }); + +const check = ( + name: string, + ok: boolean, + detail: string | undefined, + failure: { + readonly remediation: string; + readonly classification: Exclude; + }, +): DoctorCheck => ({ + name, + ok, + classification: ok ? "healthy" : failure.classification, + ...(detail === undefined ? {} : { detail }), + ...(ok ? {} : { remediation: failure.remediation }), +}); + +const providerDoctorChecks = ( + inspection: DoctorProviderInspection, +): readonly DoctorCheck[] => + inspection.checks.map((candidate) => ({ + name: + candidate.name === "configuration" + ? inspection.id + : `${inspection.id}-${candidate.name}`, + ok: candidate.ok, + classification: candidate.ok ? "healthy" : candidate.classification, + detail: candidate.detail, + ...(candidate.remediation === null + ? {} + : { remediation: candidate.remediation }), + })); + +const unsupportedHopperRemediation = (configured: boolean): string => + configured + ? "Unset or update HOPPER_LAUNCHER_PATH, install the Hopper build supported by this REA release, or update REA." + : "Install the Hopper build supported by this REA release, or update REA for a newer Hopper build."; + +const parseMajor = (version: string | undefined): number => + Number.parseInt(version?.split(".")[0] ?? "0", 10); + +const providerCheckName = (providerId: string, name: string): boolean => + name === providerId || name.startsWith(`${providerId}-`); diff --git a/src/application/ProcessCli.ts b/src/application/ProcessCli.ts index 3de0d199a1..f41ded670c 100644 --- a/src/application/ProcessCli.ts +++ b/src/application/ProcessCli.ts @@ -16,6 +16,7 @@ import { parseProcessCapture, } from "../domain/processCapture.js"; import { captureProcessScenario } from "./ProcessHarness.js"; +import { processCapturePermissionRequest } from "./ProcessCapturePermission.js"; import { PROCESS_PROVIDER, createProcessCaptureEvidence, @@ -49,18 +50,7 @@ export const captureProcessScenarioFile = async (path: string) => { const authority = await loadConfiguredPermissionAuthority(config.value); if (!authority.ok) return cliAnalysisError(authority.error); const authorized = await authority.value.authorize( - { - capability: "process_capture", - roots: [scenario.working_directory, ...scenario.filesystem_roots], - executables: [scenario.executable], - environment_names: [ - ...Object.keys(scenario.environment), - ...scenario.inherit_environment, - ], - network: scenario.network_access === "host" ? "external" : "none", - mount: false, - operation_identity: `capture_process_scenario:${scenario.executable}`, - }, + processCapturePermissionRequest(scenario), "read", ); if (!authorized.ok) diff --git a/src/domain/errors.ts b/src/domain/errors.ts index e05d0bf27f..e064f7f00e 100644 --- a/src/domain/errors.ts +++ b/src/domain/errors.ts @@ -596,118 +596,156 @@ export const projectAnalysisError = ( const errorCode = (error: AnalysisError): AnalysisErrorProjection["code"] => { if (error instanceof ReplayPlanStaleError) return "plan_stale"; if (error instanceof PermissionRequiredError) return "permission_required"; - if ( - error instanceof ProviderSelectionError && - error.reason === "provider_unavailable" - ) - return "provider_unavailable"; - if (error instanceof BrowserObservationError) { - if (error.reason === "payload_limit") return "truncated"; - if ( - error.reason === "target_not_found" || - error.reason === "target_not_allowed" || - error.reason === "target_changed" - ) - return "target_unavailable"; - if ( - error.reason === "endpoint_unreachable" || - error.reason === "disconnected" - ) - return "provider_unavailable"; - return "unreadable_output"; - } + if (error instanceof ProviderSelectionError) + return error.reason === "provider_unavailable" + ? "provider_unavailable" + : "capability_unavailable"; + if (error instanceof BrowserObservationError) + return browserErrorCode(error.reason); if (error instanceof ArtifactOperationError) - return error.reason === "integrity" && error.artifactDetails !== undefined - ? "artifact_integrity_mismatch" - : error.reason === "limit" - ? "truncated" - : error.reason === "cancelled" - ? "cancelled" - : "artifact_operation_failed"; - if (error instanceof EvidenceFileError) - return error.reason === "outside-root" - ? "outside_approved_root" - : error.reason === "too-large" - ? "truncated" - : error.reason === "disabled" - ? "capability_unavailable" - : "execution_failure"; - if (error instanceof InvestigationWorkspaceError) { - if ( - error.reason === "revision-conflict" || - error.reason === "name-conflict" - ) - return "revision_conflict"; - if (error.reason === "too-large") return "truncated"; - if (error.reason === "disabled") return "capability_unavailable"; - if (error.reason === "outside-root") return "outside_approved_root"; - if (error.reason === "integrity" || error.reason === "invalid-json") - return "evidence_integrity_mismatch"; - return "execution_failure"; - } + return artifactOperationCode(error); + if (error instanceof EvidenceFileError) return evidenceFileCode(error.reason); + if (error instanceof InvestigationWorkspaceError) + return investigationWorkspaceCode(error.reason); if (error instanceof UnknownRegistryError) - return error.reason === "revision-conflict" || - error.reason === "already-exists" - ? "revision_conflict" - : error.reason === "limit" - ? "truncated" - : error.reason === "integrity" - ? "evidence_integrity_mismatch" - : "execution_failure"; - if (error._tag === "ProcessCaptureError") - return error.cleanupIncomplete - ? "cleanup_incomplete" - : error.userCategory === "cancelled" - ? "cancelled" - : error.userCategory === "permission_required" - ? "permission_required" - : "process_capture_failed"; - switch (error._tag) { - case "AnalysisProtocolError": - case "AnalysisOutputError": - case "HopperProtocolError": - return "unreadable_output"; - case "AnalysisInputError": - return "invalid_request"; - case "AnalysisCapabilityUnavailableError": - case "ProviderSelectionError": - return "capability_unavailable"; - case "AnalysisCancelledError": - case "HopperCancelledError": - return "cancelled"; - case "AnalysisTimeoutError": - case "HopperTimeoutError": - return "provider_timeout"; - case "HopperProcessError": - case "HopperStartError": - return "provider_unavailable"; - case "ConfigurationError": - return "configuration_invalid"; - case "NoBinaryOpenError": - case "BinaryTargetError": - return "target_unavailable"; - case "EvidenceIntegrityError": - return "evidence_integrity_mismatch"; - case "EvidenceLimitError": - return "truncated"; - case "ProviderAdapterError": - case "HopperRemoteError": - return "execution_failure"; - case "BrowserObservationError": - throw new TypeError("Unhandled specialized browser error"); + return unknownRegistryCode(error.reason); + if (error._tag === "ProcessCaptureError") return processCaptureCode(error); + return staticErrorCode(error._tag); +}; + +const browserErrorCode = ( + reason: BrowserObservationError["reason"], +): AnalysisErrorProjection["code"] => { + if (reason === "payload_limit") return "truncated"; + if ( + reason === "target_not_found" || + reason === "target_not_allowed" || + reason === "target_changed" + ) + return "target_unavailable"; + if (reason === "endpoint_unreachable" || reason === "disconnected") + return "provider_unavailable"; + return "unreadable_output"; +}; + +const artifactOperationCode = ( + error: ArtifactOperationError, +): AnalysisErrorProjection["code"] => { + if (error.reason === "integrity" && error.artifactDetails !== undefined) + return "artifact_integrity_mismatch"; + if (error.reason === "limit") return "truncated"; + if (error.reason === "cancelled") return "cancelled"; + return "artifact_operation_failed"; +}; + +const evidenceFileCode = ( + reason: EvidenceFileError["reason"], +): AnalysisErrorProjection["code"] => { + if (reason === "outside-root") return "outside_approved_root"; + if (reason === "too-large") return "truncated"; + if (reason === "disabled") return "capability_unavailable"; + return "execution_failure"; +}; + +const investigationWorkspaceCode = ( + reason: InvestigationWorkspaceError["reason"], +): AnalysisErrorProjection["code"] => { + if (reason === "revision-conflict" || reason === "name-conflict") + return "revision_conflict"; + if (reason === "too-large") return "truncated"; + if (reason === "disabled") return "capability_unavailable"; + if (reason === "outside-root") return "outside_approved_root"; + if (reason === "integrity" || reason === "invalid-json") + return "evidence_integrity_mismatch"; + return "execution_failure"; +}; + +const unknownRegistryCode = ( + reason: UnknownRegistryError["reason"], +): AnalysisErrorProjection["code"] => { + if (reason === "revision-conflict" || reason === "already-exists") + return "revision_conflict"; + if (reason === "limit") return "truncated"; + if (reason === "integrity") return "evidence_integrity_mismatch"; + return "execution_failure"; +}; + +const processCaptureCode = ( + error: AnalysisError, +): AnalysisErrorProjection["code"] => { + if (error.cleanupIncomplete) return "cleanup_incomplete"; + if (error.userCategory === "cancelled") return "cancelled"; + if (error.userCategory === "permission_required") + return "permission_required"; + return "process_capture_failed"; +}; + +type SpecializedErrorTag = + | "ArtifactOperationError" + | "BrowserObservationError" + | "EvidenceFileError" + | "InvestigationWorkspaceError" + | "PermissionRequiredError" + | "ProcessCaptureError" + | "ProviderSelectionError" + | "ReplayPlanStaleError" + | "UnknownRegistryError"; + +const STATIC_ERROR_CODES = { + AnalysisProtocolError: "unreadable_output", + AnalysisOutputError: "unreadable_output", + HopperProtocolError: "unreadable_output", + AnalysisInputError: "invalid_request", + AnalysisCapabilityUnavailableError: "capability_unavailable", + AnalysisCancelledError: "cancelled", + HopperCancelledError: "cancelled", + AnalysisTimeoutError: "provider_timeout", + HopperTimeoutError: "provider_timeout", + HopperProcessError: "provider_unavailable", + HopperStartError: "provider_unavailable", + ConfigurationError: "configuration_invalid", + NoBinaryOpenError: "target_unavailable", + BinaryTargetError: "target_unavailable", + EvidenceIntegrityError: "evidence_integrity_mismatch", + EvidenceLimitError: "truncated", + ProviderAdapterError: "execution_failure", + HopperRemoteError: "execution_failure", +} as const satisfies Readonly< + Record< + Exclude, + AnalysisErrorProjection["code"] + > +>; + +const staticErrorCode = ( + tag: AnalysisErrorTag, +): AnalysisErrorProjection["code"] => { + switch (tag) { case "ArtifactOperationError": + case "BrowserObservationError": case "EvidenceFileError": case "InvestigationWorkspaceError": - case "UnknownRegistryError": case "PermissionRequiredError": - throw new TypeError("Unhandled specialized analysis error"); + case "ProcessCaptureError": + case "ProviderSelectionError": case "ReplayPlanStaleError": - throw new TypeError("Unhandled specialized replay error"); + case "UnknownRegistryError": + throw new TypeError(`Unhandled specialized analysis error: ${tag}`); + default: + return STATIC_ERROR_CODES[tag]; } }; const errorDetails = ( error: AnalysisError, +): Readonly> | undefined => + requestErrorDetails(error) ?? + artifactStateErrorDetails(error) ?? + providerErrorDetails(error) ?? + lifecycleErrorDetails(error); + +const requestErrorDetails = ( + error: AnalysisError, ): Readonly> | undefined => { if (error instanceof AnalysisInputError && error.issues.length > 0) return { @@ -740,6 +778,12 @@ const errorDetails = ( missing: missingScopeDetails(error.missing), ceiling: error.ceiling === null ? null : scopeDetails(error.ceiling), }; + return undefined; +}; + +const artifactStateErrorDetails = ( + error: AnalysisError, +): Readonly> | undefined => { if (error instanceof ArtifactOperationError && error.artifactDetails) return { logical_path: error.artifactDetails.logicalPath, @@ -753,14 +797,6 @@ const errorDetails = ( reason: error.reason, ...(error.reason === "limit" ? { truncated: true } : {}), }; - if (error instanceof AnalysisCancelledError) - return { operation: error.operation, cleanup: "complete" }; - if (error instanceof HopperCancelledError) - return { operation: "hopper", cleanup: "complete" }; - if (error instanceof AnalysisTimeoutError) - return { operation: error.operation, timeout_ms: error.timeoutMs }; - if (error instanceof HopperTimeoutError) - return { operation: "hopper", timeout_ms: error.timeoutMs }; if (error instanceof EvidenceLimitError) return { limit: error.limit, maximum: error.maximum, truncated: true }; if (error instanceof InvestigationWorkspaceError) @@ -768,6 +804,12 @@ const errorDetails = ( if (error instanceof UnknownRegistryError) return { reason: error.reason }; if (error instanceof EvidenceFileError) return { operation: error.operation, reason: error.reason }; + return undefined; +}; + +const providerErrorDetails = ( + error: AnalysisError, +): Readonly> | undefined => { if (error instanceof AnalysisCapabilityUnavailableError) return { provider_id: error.providerId, operation: error.operation }; if (error instanceof ProviderSelectionError) @@ -797,6 +839,20 @@ const errorDetails = ( return { provider_code: error.code, diagnostic_type: error.diagnosticType }; if (error instanceof HopperProcessError && error.failureCode !== undefined) return { failure_code: error.failureCode, exit_code: error.exitCode }; + return undefined; +}; + +const lifecycleErrorDetails = ( + error: AnalysisError, +): Readonly> | undefined => { + if (error instanceof AnalysisCancelledError) + return { operation: error.operation, cleanup: "complete" }; + if (error instanceof HopperCancelledError) + return { operation: "hopper", cleanup: "complete" }; + if (error instanceof AnalysisTimeoutError) + return { operation: error.operation, timeout_ms: error.timeoutMs }; + if (error instanceof HopperTimeoutError) + return { operation: "hopper", timeout_ms: error.timeoutMs }; if (error._tag === "ProcessCaptureError" && error.cleanupIncomplete) return { cleanup: "incomplete", @@ -870,17 +926,8 @@ const errorCategory = ( return "unavailable"; if (error._tag === "ProcessCaptureError") return error.userCategory ?? "execution_failure"; - if (error instanceof BrowserObservationError) { - if (error.reason === "payload_limit") return "truncated"; - if ( - error.reason === "target_not_found" || - error.reason === "target_not_allowed" || - error.reason === "target_changed" || - error.reason === "endpoint_unreachable" || - error.reason === "disconnected" - ) - return "unavailable"; - } + if (error instanceof BrowserObservationError) + return browserErrorCategory(error.reason); if ( error instanceof HopperRemoteError && error.diagnosticType === "authorization" @@ -895,6 +942,21 @@ const errorCategory = ( return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure"; }; +const browserErrorCategory = ( + reason: BrowserObservationError["reason"], +): AnalysisErrorProjection["category"] => { + if (reason === "payload_limit") return "truncated"; + if ( + reason === "target_not_found" || + reason === "target_not_allowed" || + reason === "target_changed" || + reason === "endpoint_unreachable" || + reason === "disconnected" + ) + return "unavailable"; + return "execution_failure"; +}; + const investigationWorkspaceCategory = ( reason: InvestigationWorkspaceError["reason"], ): AnalysisErrorProjection["category"] => { @@ -944,18 +1006,8 @@ const userMessage = (error: AnalysisError): string => { if (error instanceof AnalysisInputError) return "Analysis input is invalid. Check the arguments and try again."; if (error.userMessage !== undefined) return error.userMessage; - if (UNREADABLE_OUTPUT_TAGS.has(error._tag)) - return "Analysis returned an unreadable result. Retry once; if it continues, run `rea doctor`."; - if (UNSUPPORTED_PROVIDER_TAGS.has(error._tag)) - return "This analysis is unavailable for the current target. Choose another analysis or target."; - if (CANCELLED_TAGS.has(error._tag)) - return "Analysis was cancelled. Start it again when ready."; - if (TIMEOUT_TAGS.has(error._tag)) - return "Analysis took too long. Try a smaller request, then run `rea doctor` if it continues."; - if (ADAPTER_FAILURE_TAGS.has(error._tag)) - return "Analysis could not complete. Retry once; if it continues, run `rea doctor`."; - if (START_FAILURE_TAGS.has(error._tag)) - return "Analysis could not start or stopped unexpectedly. Run `rea doctor`, then try again."; + const standardMessage = standardErrorMessage(error._tag); + if (standardMessage !== undefined) return standardMessage; if (error instanceof ArtifactOperationError) return artifactMessage(error.reason); if (error instanceof EvidenceIntegrityError) @@ -981,6 +1033,22 @@ const userMessage = (error: AnalysisError): string => { return "Analysis could not complete. Run `rea doctor`, then try again."; }; +const standardErrorMessage = (tag: AnalysisErrorTag): string | undefined => { + if (UNREADABLE_OUTPUT_TAGS.has(tag)) + return "Analysis returned an unreadable result. Retry once; if it continues, run `rea doctor`."; + if (UNSUPPORTED_PROVIDER_TAGS.has(tag)) + return "This analysis is unavailable for the current target. Choose another analysis or target."; + if (CANCELLED_TAGS.has(tag)) + return "Analysis was cancelled. Start it again when ready."; + if (TIMEOUT_TAGS.has(tag)) + return "Analysis took too long. Try a smaller request, then run `rea doctor` if it continues."; + if (ADAPTER_FAILURE_TAGS.has(tag)) + return "Analysis could not complete. Retry once; if it continues, run `rea doctor`."; + if (START_FAILURE_TAGS.has(tag)) + return "Analysis could not start or stopped unexpectedly. Run `rea doctor`, then try again."; + return undefined; +}; + const UNREADABLE_OUTPUT_TAGS: ReadonlySet = new Set([ "AnalysisProtocolError", "AnalysisOutputError", diff --git a/src/native/CommandRunner.ts b/src/native/CommandRunner.ts index 65d27a913c..b0ffbd7931 100644 --- a/src/native/CommandRunner.ts +++ b/src/native/CommandRunner.ts @@ -41,16 +41,19 @@ export class NativeCommandFailure extends Error { } } +/** Bounds and cancellation applied to one allowlisted native command. */ +export interface NativeCommandOptions { + readonly signal?: AbortSignal; + readonly timeoutMs: number; + readonly maxOutputBytes: number; + readonly acceptNonZero?: boolean; +} + export interface NativeCommandRunner { run( tool: string, arguments_: readonly string[], - options: { - readonly signal?: AbortSignal; - readonly timeoutMs: number; - readonly maxOutputBytes: number; - readonly acceptNonZero?: boolean; - }, + options: NativeCommandOptions, ): Promise>; } @@ -74,12 +77,7 @@ export class XcrunCommandRunner implements NativeCommandRunner { run( tool: string, arguments_: readonly string[], - options: { - readonly signal?: AbortSignal; - readonly timeoutMs: number; - readonly maxOutputBytes: number; - readonly acceptNonZero?: boolean; - }, + options: NativeCommandOptions, ): Promise> { if (!ALLOWED_TOOLS.has(tool)) return Promise.resolve( From e6cfce3902a8f0c403caa07e2c597e8156aa5498 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:27:33 +0000 Subject: [PATCH 2/5] feat(permissions): add scoped process capture elicitation --- README.md | 4 + docs/mcp-contracts.md | 12 +- docs/process-capture.md | 20 + skills/reverse-engineer-anything/SKILL.md | 19 +- src/application/PermissionAuthority.ts | 113 +++++- src/application/ProcessCapturePermission.ts | 18 + src/application/ProjectPermissionStore.ts | 66 +++- src/config.ts | 9 +- src/contracts/toolContracts.ts | 4 +- src/domain/permissionPolicy.ts | 7 + src/main.ts | 119 +++--- src/server/ProcessCaptureElicitation.ts | 230 +++++++++++ src/server/createServer.ts | 45 ++- src/server/registerSessionTools.ts | 38 +- tests/config.test.ts | 31 ++ tests/mainReload.test.ts | 24 ++ tests/permissionAuthority.test.ts | 125 ++++++ tests/processCaptureElicitation.test.ts | 414 ++++++++++++++++++++ tests/processCapturePermission.test.ts | 30 ++ tests/projectPermissionStore.test.ts | 42 +- tests/setupSkill.test.ts | 8 +- 21 files changed, 1260 insertions(+), 118 deletions(-) create mode 100644 src/application/ProcessCapturePermission.ts create mode 100644 src/server/ProcessCaptureElicitation.ts create mode 100644 tests/processCaptureElicitation.test.ts create mode 100644 tests/processCapturePermission.test.ts diff --git a/README.md b/README.md index 01c5311497..6db4595f8c 100644 --- a/README.md +++ b/README.md @@ -601,6 +601,10 @@ environment allowlist in `REA_PROCESS_ALLOWED_ENV_JSON`. Because the current PTY adapter uses host networking, it also requires `REA_PROCESS_ALLOW_EXTERNAL_NETWORK=true`. +Set `REA_PROCESS_CAPTURE_AUTO_GRANT=false` to configure those process-capture +limits as a ceiling without implicitly granting them. This mode remains +fail-closed until a narrower grant is established. + Capture a scenario or compare two saved Process Capture v4 Evidence records: ```bash diff --git a/docs/mcp-contracts.md b/docs/mcp-contracts.md index cc2332c3e7..22e6343a09 100644 --- a/docs/mcp-contracts.md +++ b/docs/mcp-contracts.md @@ -99,9 +99,15 @@ used by MCP. Optional project grants require both `REA_PERMISSION_PROJECT_ROOT` and `REA_PERMISSION_PROJECT_STORE`. The store is atomically written with mode `0600`, bound to the canonical project root, and is never enabled by default. Send `SIGHUP` to the REA MCP process after a trusted -local policy change; ceilings, administrator grants, and project grants reload -without restarting. Revocation affects future operations; an already-running -operation retains the decision made at its preflight boundary. +local policy change; +ceilings, administrator grants, and project grants reload without restarting. +Revocation affects future operations; an already-running operation retains the +decision made at its preflight boundary. +Once and session grants are connection-local overlays. They cannot authorize a +second MCP connection, be consumed by another connection, or be cleared when a +different connection closes. Live connections evaluate those overlays against +the current process-wide ceilings and persisted grants, including successful +SIGHUP reloads. `rea policy revoke ` displays the exact grant and requires interactive confirmation; automation must pass `--yes` (or `-y`) explicitly. diff --git a/docs/process-capture.md b/docs/process-capture.md index 95470a0689..3ef764b29b 100644 --- a/docs/process-capture.md +++ b/docs/process-capture.md @@ -31,6 +31,26 @@ export REA_PROCESS_ALLOWED_ENV_JSON='["PATH"]' export REA_PROCESS_ALLOW_EXTERNAL_NETWORK=true ``` +By default, enabling process capture also installs an administrator-lifetime +grant for the configured boundary. Set +`REA_PROCESS_CAPTURE_AUTO_GRANT=false` to install the same boundary only as an +administrator ceiling. Captures then fail with a structured permission-required +result until a narrower grant is established; this is the prerequisite mode for +connection-scoped MCP elicitation. It does not itself authorize a capture. +Each MCP connection owns its elicited once and session grants. A grant accepted +on one connection is not visible to another connection, and disconnect cleanup +removes only the grants owned by the connection that closed. Reloaded +administrator ceilings and persisted grants still apply immediately to every +live connection. + +REA offers the once-or-session grant form only after the connection negotiates +an MCP revision with multi-round tool results and advertises form elicitation. +Older connections keep returning the structured +permission-required result and never wait for an unsupported elicitation +response. The MCP SDK runtime currently pinned by REA negotiates the older +protocol path, so the interactive flow remains fail-closed until its runtime +protocol support is available. + Every scenario must also contain `"approved": true`. Executables, working directories, filesystem roots, and requested environment variables are checked against operator policy before launch. Process Capture is an observation tool, diff --git a/skills/reverse-engineer-anything/SKILL.md b/skills/reverse-engineer-anything/SKILL.md index f73c34290c..dcafee4cd9 100644 --- a/skills/reverse-engineer-anything/SKILL.md +++ b/skills/reverse-engineer-anything/SKILL.md @@ -1,10 +1,10 @@ --- name: reverse-engineer-anything -description: Reverse engineer native, Electron/JavaScript, and web applications with REA. Connect static artifacts to passive runtime evidence, explain how features work, and build a version tailored to the user's project. +description: Reverse engineer native, Electron/JavaScript, and web application artifacts or runtimes with REA. Connect static artifacts to passive runtime evidence, explain how features work, and build a version tailored to the user's project. Skip REA setup for ordinary source-repository architecture analysis. metadata: - version: "21" + version: "22" tool_count: 95 - catalog_digest: "b6840d7c79ffdfe8a2ef65fb66c1694f3631bacbc22a0456abbe12aca2d53969" + catalog_digest: "266ea209ddc79eaf85d7ad160e8d3c8ce55cfda6d4b2ca1abb2e4554a914cfd1" --- # REA @@ -95,12 +95,25 @@ literal approval and `evidence_write` authority after sandbox cleanup. Identify the app and what the user wants to understand or build. Do not ask for information they already provided. +First decide whether REA evidence is needed. When the complete source repository +is available and the request is ordinary source-level architecture, code-flow, +or implementation analysis, use normal repository tools and skip REA readiness, +setup, and binary-provider commands. Use REA only when the request needs evidence +from a binary, package, built artifact, decompilation, passive application +runtime, controlled replay, or comparison against behavior not established by +the available source. If the source is available but the requested claim still +depends on built or runtime behavior, explain that distinction and continue with +the relevant REA workflow. + If the app is missing, ask which app they want to reverse engineer. If the app is known but the goal is unclear, ask what they want to understand or build, and offer to start with an overview. Never require the user to supply a program path, address, architecture, or reverse-engineering terminology. Notes is only a documentation example. Never select an app unless the user names it or confirms it. ## Ensure REA is ready +Run this section only after the request-routing decision establishes that REA +evidence is needed. + 1. Run `npx -y rea-agents@latest doctor`. 2. If setup is needed, tell the user REA needs to install its local binary-analysis tools. Do not lead with implementation details or assume the user knows reverse-engineering products. 3. Before installing external software, obtain approval and identify what will be installed. If deeper analysis needs Hopper, describe it as REA's local analysis engine and note that it is a separate Mac app with its own license. Then run `npx -y rea-agents@latest setup --yes`. diff --git a/src/application/PermissionAuthority.ts b/src/application/PermissionAuthority.ts index 2a6652aa44..27606edb5d 100644 --- a/src/application/PermissionAuthority.ts +++ b/src/application/PermissionAuthority.ts @@ -110,9 +110,22 @@ const errorReason = (error: unknown): PermissionPathError["reason"] => /** Stateful owner for permission evaluation, consumption, reload, and revoke. */ export class PermissionAuthority { private policy: PermissionPolicy; + private readonly configuredAuthority: PermissionAuthority | undefined; - constructor(policy: PermissionPolicy) { + constructor( + policy: PermissionPolicy, + configuredAuthority?: PermissionAuthority, + ) { this.policy = policy; + this.configuredAuthority = configuredAuthority; + } + + /** Create a connection-owned overlay for once and session grants. */ + createConnectionAuthority(): PermissionAuthority { + return new PermissionAuthority( + createPermissionPolicy([]), + this.configuredAuthority ?? this, + ); } /** Canonicalize and authorize one exact operation before its side effect. */ @@ -132,11 +145,13 @@ export class PermissionAuthority { PermissionPathError | PermissionRequiredError > > { - const evaluated = await this.explain(request, access, options); + const canonical = await canonicalizePermissionRequest(request, access); + if (!canonical.ok) return canonical; + const evaluated = this.evaluateCanonical(canonical.value, options); if (!evaluated.ok) return evaluated; - const decision = evaluated.value; - this.policy = consumePermission(this.policy, decision); - return ok(decision); + const { decision, owner } = evaluated.value; + owner.policy = consumePermission(owner.policy, decision); + return ok({ ...decision, request: canonical.value }); } /** Dry-run the exact shared evaluation without consuming a once grant. */ @@ -158,23 +173,22 @@ export class PermissionAuthority { > { const canonical = await canonicalizePermissionRequest(request, access); if (!canonical.ok) return canonical; - const decision = evaluatePermission(this.policy, canonical.value); - if (!decision.allowed) - return err( - new PermissionRequiredError( - canonical.value, - decision.missing, - ceilingFor(this.policy, canonical.value.capability), - options.elicitationSupported ?? false, - options.restartRequired ?? false, - ), - ); - return ok({ ...decision, request: canonical.value }); + const evaluated = this.evaluateCanonical(canonical.value, options); + return evaluated.ok + ? ok({ ...evaluated.value.decision, request: canonical.value }) + : evaluated; } /** Add authority beneath the administrator ceiling. */ grant(grant: PermissionGrant): ReturnType { - const result = grantPermission(this.policy, grant); + const policy = + this.configuredAuthority === undefined + ? this.policy + : { + ...this.policy, + ceilings: this.configuredAuthority.effectivePolicy().ceilings, + }; + const result = grantPermission(policy, grant); if (result.ok) this.policy = result.value; return result; } @@ -189,6 +203,69 @@ export class PermissionAuthority { this.policy = clearSessionPermissions(this.policy); } + private effectivePolicy(): PermissionPolicy { + if (this.configuredAuthority === undefined) return this.policy; + const configured = this.configuredAuthority.effectivePolicy(); + return { + ceilings: configured.ceilings, + grants: [...configured.grants, ...this.policy.grants], + revoked_grant_ids: new Set([ + ...configured.revoked_grant_ids, + ...this.policy.revoked_grant_ids, + ]), + consumed_grant_ids: new Set([ + ...configured.consumed_grant_ids, + ...this.policy.consumed_grant_ids, + ]), + }; + } + + private evaluateCanonical( + request: PermissionRequest, + options: { + readonly elicitationSupported?: boolean; + readonly restartRequired?: boolean; + }, + ): Result< + { + readonly decision: Extract< + PermissionDecision, + { readonly allowed: true } + >; + readonly owner: PermissionAuthority; + }, + PermissionRequiredError + > { + const configured = this.configuredAuthority; + if (configured !== undefined) { + const configuredDecision = evaluatePermission( + configured.effectivePolicy(), + request, + ); + if (configuredDecision.allowed) + return ok({ decision: configuredDecision, owner: configured }); + } + const localPolicy = + configured === undefined + ? this.policy + : { ...this.policy, ceilings: configured.effectivePolicy().ceilings }; + const localDecision = evaluatePermission(localPolicy, request); + if (localDecision.allowed) + return ok({ decision: localDecision, owner: this }); + const effective = this.effectivePolicy(); + const denied = evaluatePermission(effective, request); + if (denied.allowed) return ok({ decision: denied, owner: this }); + return err( + new PermissionRequiredError( + request, + denied.missing, + ceilingFor(effective, request.capability), + options.elicitationSupported ?? false, + options.restartRequired ?? false, + ), + ); + } + /** Atomically replace optional persisted project grants. */ async replaceProjectGrants( grants: readonly PermissionGrant[], diff --git a/src/application/ProcessCapturePermission.ts b/src/application/ProcessCapturePermission.ts new file mode 100644 index 0000000000..eb68d37244 --- /dev/null +++ b/src/application/ProcessCapturePermission.ts @@ -0,0 +1,18 @@ +import type { PermissionRequest } from "../domain/permissionPolicy.js"; +import type { ProcessScenario } from "../domain/processCapture.js"; + +/** Build the exact permission request shared by process-capture adapters. */ +export const processCapturePermissionRequest = ( + scenario: ProcessScenario, +): PermissionRequest => ({ + capability: "process_capture", + roots: [scenario.working_directory, ...scenario.filesystem_roots], + executables: [scenario.executable], + environment_names: [ + ...Object.keys(scenario.environment), + ...scenario.inherit_environment, + ], + network: scenario.network_access === "host" ? "external" : "none", + mount: false, + operation_identity: `capture_process_scenario:${scenario.executable}`, +}); diff --git a/src/application/ProjectPermissionStore.ts b/src/application/ProjectPermissionStore.ts index 042c30cbbd..55d1c10a9e 100644 --- a/src/application/ProjectPermissionStore.ts +++ b/src/application/ProjectPermissionStore.ts @@ -1,11 +1,11 @@ import { createHash } from "node:crypto"; +import { constants } from "node:fs"; import { lstat, mkdir, open, readFile, realpath, - stat, unlink, type FileHandle, } from "node:fs/promises"; @@ -35,6 +35,7 @@ const grantSchema = z.object({ "native_mount", "reference_read", "javascript_replay", + "managed_runtime", ]), roots: z.array(z.string()), executables: z.array(z.string()), @@ -102,11 +103,15 @@ export const readProjectPermissionStore = async ( > => { const project = await identifyPermissionProject(projectRoot); if (!project.ok) return project; + if (process.getuid === undefined) + return err(new ProjectPermissionStoreError("not_owner_only")); + let handle: FileHandle | undefined; try { - const metadata = await stat(path); - if ((metadata.mode & 0o077) !== 0) - return err(new ProjectPermissionStoreError("not_owner_only")); - const encoded = await readFile(path, "utf8"); + const opened = await openPrivateStore(path); + if (!opened.ok) return opened; + if (opened.value === null) return ok(null); + handle = opened.value; + const encoded = await handle.readFile("utf8"); let decoded: unknown; try { decoded = JSON.parse(encoded); @@ -124,6 +129,8 @@ export const readProjectPermissionStore = async ( } catch (cause: unknown) { if (isNotFound(cause)) return ok(null); return err(new ProjectPermissionStoreError("io", { cause })); + } finally { + await handle?.close().catch(() => undefined); } }; @@ -145,6 +152,8 @@ export const writeProjectPermissionStore = async ( return err( new ProjectPermissionStoreError("invalid", { cause: candidate.error }), ); + if (process.getuid === undefined) + return err(new ProjectPermissionStoreError("not_owner_only")); try { await mkdir(dirname(path), { recursive: true, mode: 0o700 }); await writeFileAtomic( @@ -155,10 +164,13 @@ export const writeProjectPermissionStore = async ( mode: 0o600, }, ); - const metadata = await stat(path); - if ((metadata.mode & 0o077) !== 0) { - return err(new ProjectPermissionStoreError("not_owner_only")); - } + const verified = await readProjectPermissionStore(path, projectRoot); + if (!verified.ok) return verified; + if ( + verified.value === null || + JSON.stringify(verified.value) !== JSON.stringify(candidate.data) + ) + return err(new ProjectPermissionStoreError("invalid")); return ok(candidate.data); } catch (cause: unknown) { return err(new ProjectPermissionStoreError("io", { cause })); @@ -269,6 +281,39 @@ const releasePermissionStoreLock = async ( const isNotFound = (cause: unknown): boolean => errorCode(cause) === "ENOENT"; +const openPrivateStore = async ( + path: string, +): Promise> => { + let handle: FileHandle | undefined; + try { + handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW); + const metadata = await handle.stat(); + if (!privateRegularFile(metadata)) { + await handle.close(); + return err(new ProjectPermissionStoreError("not_owner_only")); + } + return ok(handle); + } catch (cause: unknown) { + await handle?.close().catch(() => undefined); + if (isNotFound(cause)) return ok(null); + return err( + new ProjectPermissionStoreError( + isSymlinkRefusal(cause) ? "not_owner_only" : "io", + { cause }, + ), + ); + } +}; + +const privateRegularFile = ( + metadata: Awaited>, +): boolean => + metadata.isFile() && + !metadata.isSymbolicLink() && + (Number(metadata.mode) & 0o077) === 0 && + process.getuid !== undefined && + metadata.uid === process.getuid(); + const isAlreadyExists = (cause: unknown): boolean => errorCode(cause) === "EEXIST"; @@ -276,3 +321,6 @@ const errorCode = (cause: unknown): unknown => typeof cause === "object" && cause !== null && "code" in cause ? cause.code : undefined; + +const isSymlinkRefusal = (cause: unknown): boolean => + errorCode(cause) === "ELOOP" || errorCode(cause) === "EMLINK"; diff --git a/src/config.ts b/src/config.ts index 4c04069bb4..bc00daea94 100644 --- a/src/config.ts +++ b/src/config.ts @@ -100,6 +100,7 @@ const environmentSchema = z .enum(["trace", "debug", "info", "warn", "error", "fatal", "silent"]) .default("info"), REA_PROCESS_CAPTURE_ENABLED: z.enum(["true", "false"]).default("false"), + REA_PROCESS_CAPTURE_AUTO_GRANT: z.enum(["true", "false"]).default("true"), REA_ARTIFACT_NATIVE_MOUNT_ENABLED: z .enum(["true", "false"]) .default("false"), @@ -546,7 +547,13 @@ export const parseConfig = ( parsedEnvironment.data.REA_MANAGED_RUNTIME_EXECUTABLE_PATH, }, permissionCeilings, - administratorPermissionGrants: administratorGrants(permissionCeilings), + administratorPermissionGrants: administratorGrants( + parsedEnvironment.data.REA_PROCESS_CAPTURE_AUTO_GRANT === "true" + ? permissionCeilings + : permissionCeilings.filter( + ({ capability }) => capability !== "process_capture", + ), + ), permissionProjectRoot: parsedEnvironment.data.REA_PERMISSION_PROJECT_ROOT, permissionProjectStore: parsedEnvironment.data.REA_PERMISSION_PROJECT_STORE, }); diff --git a/src/contracts/toolContracts.ts b/src/contracts/toolContracts.ts index 1c2abd1490..870759654c 100644 --- a/src/contracts/toolContracts.ts +++ b/src/contracts/toolContracts.ts @@ -259,12 +259,12 @@ export const OFFICIAL_TOOL_CONTRACTS = [ ), official( "search_procedures", - "Search analyzed procedure names using literal matching by default or regex opt-in. Ghidra bounds literal work and rejects regex constructs, paths, candidates, or cumulative work outside its finite budgets. Results are deterministic and offset-paginated.", + "Search analyzed procedure names using literal matching by default or regex opt-in. Providers bound search work and reject regex constructs, paths, candidates, or cumulative work outside their finite budgets. Results are deterministic and offset-paginated.", z.object(searchInput), ), official( "search_strings", - "Search analyzed strings using literal matching by default or regex opt-in. Ghidra bounds literal work and rejects regex constructs, paths, candidates, or cumulative work outside its finite budgets. Results are deterministic, offset-paginated, and explicitly truncated.", + "Search analyzed strings using literal matching by default or regex opt-in. Providers bound search work and reject regex constructs, paths, candidates, or cumulative work outside their finite budgets. Results are deterministic, offset-paginated, and explicitly truncated.", z.object(searchInput), ), official( diff --git a/src/domain/permissionPolicy.ts b/src/domain/permissionPolicy.ts index 88fe711164..af0d44098e 100644 --- a/src/domain/permissionPolicy.ts +++ b/src/domain/permissionPolicy.ts @@ -175,6 +175,13 @@ export const evaluatePermission = ( }; }; +/** Test whether one exact request is wholly contained by one ceiling. */ +export const isPermissionRequestWithinCeiling = ( + request: PermissionRequest, + ceiling: PermissionCeiling, +): boolean => + !hasMissing(missingFromScopes(normalizeRequest(request), [ceiling])); + /** Consume an allowed one-shot decision; longer-lived grants are unchanged. */ export const consumePermission = ( policy: PermissionPolicy, diff --git a/src/main.ts b/src/main.ts index 8136208976..926f8da38c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -25,6 +25,8 @@ const MCP_CONNECTION_START_FAILED = "REA could not start its MCP connection. Restart REA from your MCP client; run `rea doctor` if it fails again."; const MCP_SHUTDOWN_FAILED = "REA could not close cleanly. End the REA process before starting it again."; +const MCP_PERMISSION_RELOAD_FAILED = + "Reloaded permission policy failed unexpectedly"; const SERVER_START_FAILED = "REA could not start. Run `rea doctor`, then restart REA from your MCP client."; @@ -199,63 +201,70 @@ export const run = async ( serverLogger.error("Reloaded permission policy is invalid"); return; } - reloadQueue = reloadQueue.then(async () => { - let projectGrants: readonly PermissionGrant[] = []; - if ( - refreshed.value.permissionProjectRoot !== undefined && - refreshed.value.permissionProjectStore !== undefined - ) { - const project = await ( - dependencies.readProjectPermissionStore ?? - readProjectPermissionStore - )( - refreshed.value.permissionProjectStore, - refreshed.value.permissionProjectRoot, - ); - if (!project.ok) { - serverLogger.error("Reloaded project grants could not be read"); + reloadQueue = reloadQueue + .then(async () => { + let projectGrants: readonly PermissionGrant[] = []; + if ( + refreshed.value.permissionProjectRoot !== undefined && + refreshed.value.permissionProjectStore !== undefined + ) { + const project = await ( + dependencies.readProjectPermissionStore ?? + readProjectPermissionStore + )( + refreshed.value.permissionProjectStore, + refreshed.value.permissionProjectRoot, + ); + if (!project.ok) { + serverLogger.error("Reloaded project grants could not be read"); + return; + } + projectGrants = project.value?.grants ?? []; + } + const reloaded = + await permissionAuthority.value.replaceConfiguredPolicy({ + ceilings: refreshed.value.permissionCeilings, + administratorGrants: + refreshed.value.administratorPermissionGrants, + projectGrants, + }); + if (!reloaded.ok) { + serverLogger.error( + "Reloaded permission policy could not be applied", + ); return; } - projectGrants = project.value?.grants ?? []; - } - const reloaded = - await permissionAuthority.value.replaceConfiguredPolicy({ - ceilings: refreshed.value.permissionCeilings, - administratorGrants: refreshed.value.administratorPermissionGrants, - projectGrants, - }); - if (!reloaded.ok) { - serverLogger.error("Reloaded permission policy could not be applied"); - return; - } - currentConfig = refreshed.value; - Object.assign( - runtimeProcessPolicy, - refreshed.value.processExecutionPolicy, - ); - Object.assign( - runtimeEvidencePolicy, - refreshed.value.evidenceFilePolicy, - ); - Object.assign( - runtimeSnapshotPolicy, - refreshed.value.analysisSnapshotFilePolicy, - ); - runtimeInvestigationRoots.splice( - 0, - runtimeInvestigationRoots.length, - ...refreshed.value.investigationInputRoots, - ); - Object.assign( - runtimeJavascriptReplayPolicy, - refreshed.value.javascriptReplayPolicy, - ); - Object.assign( - runtimeManagedRuntimePolicy, - refreshed.value.managedRuntimePolicy, - ); - for (const server of liveServers) server.sendToolListChanged(); - }); + currentConfig = refreshed.value; + Object.assign( + runtimeProcessPolicy, + refreshed.value.processExecutionPolicy, + ); + Object.assign( + runtimeEvidencePolicy, + refreshed.value.evidenceFilePolicy, + ); + Object.assign( + runtimeSnapshotPolicy, + refreshed.value.analysisSnapshotFilePolicy, + ); + runtimeInvestigationRoots.splice( + 0, + runtimeInvestigationRoots.length, + ...refreshed.value.investigationInputRoots, + ); + Object.assign( + runtimeJavascriptReplayPolicy, + refreshed.value.javascriptReplayPolicy, + ); + Object.assign( + runtimeManagedRuntimePolicy, + refreshed.value.managedRuntimePolicy, + ); + for (const server of liveServers) server.sendToolListChanged(); + }) + .catch(() => { + serverLogger.error(MCP_PERMISSION_RELOAD_FAILED); + }); }) ?? (() => undefined); let shutdownPromise: Promise | undefined; diff --git a/src/server/ProcessCaptureElicitation.ts b/src/server/ProcessCaptureElicitation.ts new file mode 100644 index 0000000000..c429a82db1 --- /dev/null +++ b/src/server/ProcessCaptureElicitation.ts @@ -0,0 +1,230 @@ +import { randomUUID } from "node:crypto"; + +import { + acceptedContent, + inputRequired, + inputResponse, + type InputRequiredResult, + type RequestStateCodec, +} from "@modelcontextprotocol/server"; +import { z } from "zod"; + +import type { PermissionAuthority } from "../application/PermissionAuthority.js"; +import { PermissionRequiredError } from "../domain/errors.js"; +import { + isPermissionRequestWithinCeiling, + type PermissionGrant, + type PermissionRequest, +} from "../domain/permissionPolicy.js"; + +const RESPONSE_KEY = "process_capture_grant"; +const STATE_VERSION = 1; +const STATE_TTL_MS = 600_000; +const MAX_CONSUMED_NONCES = 4_096; + +const grantResponseSchema = z.object({ + lifetime: z.enum(["once", "session"]).default("session"), +}); + +const grantResponseJsonSchema = { + type: "object" as const, + properties: { + lifetime: { + type: "string" as const, + enum: ["once", "session"], + default: "session", + }, + }, + required: ["lifetime"], +}; + +const stateSchema = z.object({ + version: z.literal(STATE_VERSION), + nonce: z.string().uuid(), + request: z.object({ + capability: z.literal("process_capture"), + roots: z.array(z.string()), + executables: z.array(z.string()), + environment_names: z.array(z.string()), + origins: z.array(z.string()).optional(), + network: z.enum(["none", "loopback", "external"]), + mount: z.boolean(), + operation_identity: z.string(), + }), +}); + +export type ProcessCaptureElicitationState = z.infer; + +/** Connection-owned SDK state used for process-capture grant elicitation. */ +export interface ProcessCaptureElicitation { + readonly stateCodec: RequestStateCodec; + readonly supported: () => boolean; + readonly modern: () => boolean; + readonly consumedNonces: Map; +} + +interface ProcessCaptureElicitationContext { + readonly mcpReq: { + readonly inputResponses?: Record; + readonly requestState: () => unknown; + }; +} + +type PermissionResult = Awaited>; + +/** Authorize capture or return a signed MCP input-required continuation. */ +export const authorizeProcessCaptureWithElicitation = async ( + authority: PermissionAuthority, + request: PermissionRequest, + context: ProcessCaptureElicitationContext, + elicitation: ProcessCaptureElicitation, +): Promise => { + const supported = elicitation.supported() && elicitation.modern(); + const initial = await authority.authorize(request, "read", { + elicitationSupported: supported, + }); + if (initial.ok || !(initial.error instanceof PermissionRequiredError)) + return initial; + const denied = initial.error; + if ( + !supported || + denied.requested.capability !== "process_capture" || + denied.ceiling === null || + !isPermissionRequestWithinCeiling(denied.requested, denied.ceiling) + ) + return initial; + + const encodedState = context.mcpReq.requestState(); + if (encodedState !== undefined) { + const state = stateSchema.safeParse(encodedState); + if (!state.success || !sameRequest(state.data.request, denied.requested)) + return initial; + const response = inputResponse(context.mcpReq.inputResponses, RESPONSE_KEY); + if (response.kind === "elicit") { + if (!consumeNonce(elicitation.consumedNonces, state.data.nonce)) + return initial; + } + if (response.kind === "elicit" && response.action === "accept") { + const content = acceptedContent( + context.mcpReq.inputResponses, + RESPONSE_KEY, + grantResponseSchema, + ); + if (content === undefined) return initial; + return grantAndAuthorize(authority, state.data.request, content.lifetime); + } + if ( + response.kind === "elicit" && + (response.action === "decline" || response.action === "cancel") + ) + return initial; + } + + const state = await elicitation.stateCodec.mint({ + version: STATE_VERSION, + nonce: randomUUID(), + request: { + capability: "process_capture", + roots: [...denied.requested.roots], + executables: [...denied.requested.executables], + environment_names: [...denied.requested.environment_names], + network: denied.requested.network, + mount: denied.requested.mount, + operation_identity: denied.requested.operation_identity, + ...(denied.requested.origins === undefined + ? {} + : { origins: [...denied.requested.origins] }), + }, + }); + return inputRequired({ + inputRequests: { + [RESPONSE_KEY]: inputRequired.elicit({ + message: permissionMessage(denied.requested), + requestedSchema: grantResponseJsonSchema, + }), + }, + requestState: state, + }); +}; + +const grantAndAuthorize = async ( + authority: PermissionAuthority, + request: PermissionRequest, + lifetime: "once" | "session", +): Promise => { + const grant: PermissionGrant = { + ...request, + grant_id: `elicited:${randomUUID()}`, + lifetime, + operation_identity: lifetime === "once" ? request.operation_identity : null, + expires_at: null, + }; + const granted = authority.grant(grant); + if (!granted.ok) + return authority.authorize(request, "read", { + elicitationSupported: true, + }); + let authorized: PermissionResult; + try { + authorized = await authority.authorize(request, "read", { + elicitationSupported: true, + }); + } catch (cause: unknown) { + authority.revoke(grant.grant_id); + throw cause; + } + if (!authorized.ok) authority.revoke(grant.grant_id); + return authorized; +}; + +const sameRequest = ( + left: PermissionRequest, + right: PermissionRequest, +): boolean => + left.capability === right.capability && + left.network === right.network && + left.mount === right.mount && + left.operation_identity === right.operation_identity && + sameOptionalStrings(left.origins, right.origins) && + sameStrings(left.roots, right.roots) && + sameStrings(left.executables, right.executables) && + sameStrings(left.environment_names, right.environment_names); + +const sameStrings = ( + left: readonly string[], + right: readonly string[], +): boolean => + left.length === right.length && + left.every((value, index) => value === right[index]); + +const sameOptionalStrings = ( + left: readonly string[] | undefined, + right: readonly string[] | undefined, +): boolean => + left === undefined + ? right === undefined + : right !== undefined && sameStrings(left, right); + +const consumeNonce = ( + consumed: Map, + nonce: string, +): boolean => { + const now = Date.now(); + for (const [candidate, expiresAt] of consumed) + if (expiresAt <= now) consumed.delete(candidate); + if (consumed.has(nonce) || consumed.size >= MAX_CONSUMED_NONCES) return false; + consumed.set(nonce, now + STATE_TTL_MS); + return true; +}; + +const permissionMessage = (request: PermissionRequest): string => + [ + "Allow REA to run this exact process-capture scope?", + `Executable: ${request.executables.join(", ") || "none"}`, + `Filesystem roots: ${request.roots.join(", ") || "none"}`, + `Environment names: ${request.environment_names.join(", ") || "none"}`, + `Origins: ${request.origins?.join(", ") || "none"}`, + `Network: ${request.network}`, + `Mount access: ${request.mount ? "yes" : "no"}`, + "Choose whether the grant applies once or for this MCP session.", + ].join("\n"); diff --git a/src/server/createServer.ts b/src/server/createServer.ts index ed764ecf62..f1e4ce7246 100644 --- a/src/server/createServer.ts +++ b/src/server/createServer.ts @@ -1,4 +1,9 @@ -import { McpServer } from "@modelcontextprotocol/server"; +import { randomBytes } from "node:crypto"; + +import { + createRequestStateCodec, + McpServer, +} from "@modelcontextprotocol/server"; import type { AnalysisOperationPort } from "../application/AnalysisProvider.js"; import type { BinarySessionPort } from "../application/BinarySession.js"; @@ -30,6 +35,7 @@ import type { import type { ManagedRuntimePolicy } from "../application/ManagedRuntimeCorrelationService.js"; import { LinuxJavaScriptReplayRunner } from "../replay/LinuxJavaScriptReplayRunner.js"; import { SystemJavaScriptReplayHost } from "../replay/SystemJavaScriptReplayHost.js"; +import type { ProcessCaptureElicitationState } from "./ProcessCaptureElicitation.js"; export interface CreateServerOptions { readonly logger?: Logger; @@ -67,6 +73,13 @@ export const createServer = ( ): McpServer => { const startedAt = new Date().toISOString(); const logger = options.logger ?? silentLogger; + const permissionAuthority = + options.permissionAuthority?.createConnectionAuthority(); + const processCaptureStateCodec = + createRequestStateCodec({ + key: randomBytes(32), + ttlSeconds: 600, + }); const server = new McpServer( { name: PRODUCT_IDENTITY.mcpServerKey, @@ -77,12 +90,17 @@ export const createServer = ( tools: { listChanged: true }, resources: { listChanged: true }, }, + inputRequired: { maxRounds: 3, roundTimeoutMs: 600_000 }, + requestState: { verify: processCaptureStateCodec.verify }, instructions: session === undefined ? "Reverse-engineering tools for an active analysis target. Start with binary_overview." : "Reverse-engineering tools for configured analysis providers. Open a target with open_binary, then start with binary_overview.", }, ); + server.server.onclose = () => { + permissionAuthority?.clearSessionGrants(); + }; session?.onAvailabilityChanged?.(() => server.sendToolListChanged()); server.registerResource( "server-identity", @@ -170,9 +188,7 @@ export const createServer = ( logger: toolLogger, activeTarget, recordEvidence, - ...(options.permissionAuthority === undefined - ? {} - : { permissionAuthority: options.permissionAuthority }), + ...(permissionAuthority === undefined ? {} : { permissionAuthority }), }); registerManagedTools(server, analysis, { logger: toolLogger, @@ -191,19 +207,19 @@ export const createServer = ( roots: [], executablePath: "/usr/bin/dotnet", }, - authority: options.permissionAuthority, + authority: permissionAuthority, }, }); registerBrowserTools(server, { logger: toolLogger, browser: options.browserObservation, - permissionAuthority: options.permissionAuthority, + permissionAuthority, recordEvidence, }); registerElectronTools(server, { logger: toolLogger, electron: options.electronObservation, - permissionAuthority: options.permissionAuthority, + permissionAuthority, recordEvidence, }); registerApplicationTools(server, { @@ -217,7 +233,7 @@ export const createServer = ( maxStringLength: 1, maxNodes: 1, }, - permissionAuthority: options.permissionAuthority, + permissionAuthority, retainCoverageWorkspace: session === undefined ? undefined @@ -240,7 +256,7 @@ export const createServer = ( host: options.javascriptReplayHost ?? new SystemJavaScriptReplayHost(), runner: options.javascriptReplayRunner ?? new LinuxJavaScriptReplayRunner(), - authority: options.permissionAuthority, + authority: permissionAuthority, }, }); registerGuidedPrompts(server, analysis, session); @@ -248,7 +264,18 @@ export const createServer = ( registerEvidenceResources(server, session); registerSessionTools(server, session, toolLogger, { ...options, + ...(permissionAuthority === undefined ? {} : { permissionAuthority }), startedAt, + processCaptureElicitation: { + stateCodec: processCaptureStateCodec, + supported: () => + server.server.getClientCapabilities()?.elicitation?.form !== + undefined, + modern: () => + server.server.getNegotiatedProtocolVersion()?.startsWith("2026-") === + true, + consumedNonces: new Map(), + }, }); } return server; diff --git a/src/server/registerSessionTools.ts b/src/server/registerSessionTools.ts index 82c46f3a71..dac101c396 100644 --- a/src/server/registerSessionTools.ts +++ b/src/server/registerSessionTools.ts @@ -20,6 +20,7 @@ import type { } from "../domain/processCapture.js"; import { processScenarioSchema } from "../domain/processCapture.js"; import { captureProcessScenario } from "../application/ProcessHarness.js"; +import { processCapturePermissionRequest } from "../application/ProcessCapturePermission.js"; import type { Evidence } from "../domain/evidence.js"; import type { AnalysisSnapshot } from "../domain/analysisSnapshot.js"; import { @@ -60,6 +61,11 @@ import { import { registerSessionStatusTool } from "./registerSessionStatusTool.js"; import type { PermissionAuthority } from "../application/PermissionAuthority.js"; import { mcpProgressReporter } from "./mcpProgress.js"; +import { + authorizeProcessCaptureWithElicitation, + type ProcessCaptureElicitation, +} from "./ProcessCaptureElicitation.js"; +import { isInputRequiredResult } from "@modelcontextprotocol/server"; const permissionFailure = ( failure: Awaited>, @@ -121,6 +127,7 @@ interface ProcessToolRegistration { readonly processPolicy: ProcessExecutionPolicy; readonly captureContract: (typeof SESSION_TOOL_CONTRACTS)[5]; readonly permissionAuthority?: PermissionAuthority; + readonly processCaptureElicitation?: ProcessCaptureElicitation; readonly availabilityPolicy?: () => { readonly processCaptureEnabled: boolean; readonly evidenceFileRoots: number; @@ -134,6 +141,7 @@ const registerProcessTools = ({ processPolicy, captureContract, permissionAuthority, + processCaptureElicitation, }: ProcessToolRegistration): void => { server.registerTool( captureContract.name, @@ -148,21 +156,17 @@ const registerProcessTools = ({ return toCallToolResult(parsedInput, captureContract); const scenario = parsedInput.value; if (permissionAuthority !== undefined) { - const authorized = await permissionAuthority.authorize( - { - capability: "process_capture", - roots: [scenario.working_directory, ...scenario.filesystem_roots], - executables: [scenario.executable], - environment_names: [ - ...Object.keys(scenario.environment), - ...scenario.inherit_environment, - ], - network: scenario.network_access === "host" ? "external" : "none", - mount: false, - operation_identity: `capture_process_scenario:${scenario.executable}`, - }, - "read", - ); + const request = processCapturePermissionRequest(scenario); + const authorized = + processCaptureElicitation === undefined + ? await permissionAuthority.authorize(request, "read") + : await authorizeProcessCaptureWithElicitation( + permissionAuthority, + request, + context, + processCaptureElicitation, + ); + if (isInputRequiredResult(authorized)) return authorized; if (!authorized.ok) return toCallToolResult( permissionFailure(authorized), @@ -595,6 +599,7 @@ export interface SessionToolOptions { readonly analysisSnapshotFilePolicy?: EvidenceFilePolicy; readonly startedAt?: string; readonly permissionAuthority?: PermissionAuthority; + readonly processCaptureElicitation?: ProcessCaptureElicitation; readonly artifactIntegrityContinueEnabled?: () => boolean; readonly availabilityPolicy?: () => { readonly processCaptureEnabled: boolean; @@ -677,6 +682,9 @@ export const registerSessionTools = ( ...(options.permissionAuthority === undefined ? {} : { permissionAuthority: options.permissionAuthority }), + ...(options.processCaptureElicitation === undefined + ? {} + : { processCaptureElicitation: options.processCaptureElicitation }), }); registerProcessComparisonTool(server, session, compareContract); registerArtifactComparisonTool(server, session, compareArtifactsContract); diff --git a/tests/config.test.ts b/tests/config.test.ts index c6a66c63a6..a34c9d4e77 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -112,6 +112,37 @@ describe("runtime configuration", () => { }); }); + it("can configure a process-capture ceiling without an implicit grant", () => { + const result = parseConfig({ + REA_PROCESS_CAPTURE_ENABLED: "true", + REA_PROCESS_CAPTURE_AUTO_GRANT: "false", + REA_PROCESS_EXECUTABLE_ROOTS_JSON: '["/opt/tools"]', + REA_PROCESS_WORKING_ROOTS_JSON: '["/tmp/work"]', + }); + if (!result.ok) throw result.error; + expect(result.value.permissionCeilings).toContainEqual( + expect.objectContaining({ capability: "process_capture" }), + ); + expect(result.value.administratorPermissionGrants).not.toContainEqual( + expect.objectContaining({ capability: "process_capture" }), + ); + }); + + it("preserves the configured process-capture administrator grant by default", () => { + const result = parseConfig({ + REA_PROCESS_CAPTURE_ENABLED: "true", + REA_PROCESS_EXECUTABLE_ROOTS_JSON: '["/opt/tools"]', + REA_PROCESS_WORKING_ROOTS_JSON: '["/tmp/work"]', + }); + if (!result.ok) throw result.error; + expect(result.value.administratorPermissionGrants).toContainEqual( + expect.objectContaining({ + capability: "process_capture", + lifetime: "administrator", + }), + ); + }); + it("builds a no-network JavaScript replay ceiling only when enabled", () => { const result = parseConfig({ REA_JAVASCRIPT_REPLAY_ENABLED: "true", diff --git a/tests/mainReload.test.ts b/tests/mainReload.test.ts index 084d04edbf..4c02f0665b 100644 --- a/tests/mainReload.test.ts +++ b/tests/mainReload.test.ts @@ -112,6 +112,30 @@ describe("runtime permission reload", () => { expect(await canRead(runtime.authority, fixture.newRoot)).toBe(false); expect(await canRead(runtime.authority, fixture.latestRoot)).toBe(true); }); + + it("continues with later reloads after an unexpected reload rejection", async () => { + const fixture = await reloadFixture(); + let reads = 0; + const runtime = await startRuntime(fixture.env, async () => { + reads += 1; + if (reads === 1) throw new Error("synthetic unexpected read failure"); + return ok(projectStore(fixture.projectRoot, [])); + }); + + configure(fixture.env, fixture.newRoot, true); + runtime.reload(); + runtime.reload(); + await runtime.notificationCount(1); + + expect(reads).toBe(2); + expect(runtime.options.processPolicy?.enabled).toBe(true); + expect(runtime.options.evidenceFilePolicy?.roots).toEqual([ + fixture.newRoot, + ]); + expect(runtime.options.artifactIntegrityContinueEnabled?.()).toBe(true); + expect(await canRead(runtime.authority, fixture.oldRoot)).toBe(false); + expect(await canRead(runtime.authority, fixture.newRoot)).toBe(true); + }); }); const reloadFixture = async () => { diff --git a/tests/permissionAuthority.test.ts b/tests/permissionAuthority.test.ts index 775d4f9272..1bfbd1bff7 100644 --- a/tests/permissionAuthority.test.ts +++ b/tests/permissionAuthority.test.ts @@ -147,6 +147,131 @@ describe("permission authority", () => { expect(await canRead(authority.value, oldRoot)).toBe(false); expect(await canRead(authority.value, newRoot)).toBe(true); }); + + it("isolates transient grants and consumption between live connections", async () => { + const sandbox = await mkdtemp(join(tmpdir(), "rea-permission-session-")); + const scope = evidenceScope(sandbox); + const configured = await createPermissionAuthority([scope]); + expect(configured.ok).toBe(true); + if (!configured.ok) return; + const connectionA = configured.value.createConnectionAuthority(); + const connectionB = configured.value.createConnectionAuthority(); + const request = { + ...scope, + operation_identity: "read:connection-owned", + }; + + expect( + connectionA.grant({ + ...request, + grant_id: "session:a", + lifetime: "session", + operation_identity: null, + expires_at: null, + }), + ).toMatchObject({ ok: true }); + expect(await connectionA.authorize(request, "read")).toMatchObject({ + ok: true, + }); + expect(await connectionB.authorize(request, "read")).toMatchObject({ + ok: false, + }); + + connectionB.clearSessionGrants(); + expect(await connectionA.authorize(request, "read")).toMatchObject({ + ok: true, + }); + + connectionA.clearSessionGrants(); + const onceRequest = { + ...request, + operation_identity: "read:once-on-a", + }; + expect( + connectionA.grant({ + ...onceRequest, + grant_id: "once:a", + lifetime: "once", + expires_at: null, + }), + ).toMatchObject({ ok: true }); + expect( + connectionB.grant({ + ...onceRequest, + grant_id: "once:a", + lifetime: "once", + expires_at: null, + }), + ).toMatchObject({ ok: true }); + const concurrent = await Promise.all([ + connectionA.authorize(onceRequest, "read"), + connectionA.authorize(onceRequest, "read"), + ]); + expect(concurrent.filter(({ ok }) => ok)).toHaveLength(1); + expect(await connectionB.authorize(onceRequest, "read")).toMatchObject({ + ok: true, + }); + }); + + it("applies configured policy reloads to existing connections", async () => { + const sandbox = await mkdtemp( + join(tmpdir(), "rea-permission-live-reload-"), + ); + const allowedRoot = join(sandbox, "allowed"); + const replacementRoot = join(sandbox, "replacement"); + await Promise.all([mkdir(allowedRoot), mkdir(replacementRoot)]); + const configured = await createPermissionAuthority([ + evidenceScope(allowedRoot), + ]); + expect(configured.ok).toBe(true); + if (!configured.ok) return; + const connection = configured.value.createConnectionAuthority(); + expect( + connection.grant({ + ...evidenceScope(allowedRoot), + grant_id: "session:before-reload", + lifetime: "session", + operation_identity: null, + expires_at: null, + }), + ).toMatchObject({ ok: true }); + expect(await canRead(connection, allowedRoot)).toBe(true); + + const collisionRequest = { + ...evidenceScope(allowedRoot), + operation_identity: "read:reload-collision", + }; + expect( + connection.grant({ + ...collisionRequest, + grant_id: "shared-id", + lifetime: "once", + expires_at: null, + }), + ).toMatchObject({ ok: true }); + expect(await connection.authorize(collisionRequest, "read")).toMatchObject({ + ok: true, + }); + expect( + await configured.value.replaceAdministratorGrants([ + { + ...evidenceScope(allowedRoot), + grant_id: "shared-id", + lifetime: "administrator", + operation_identity: null, + expires_at: null, + }, + ]), + ).toEqual({ ok: true, value: null }); + expect(await connection.authorize(collisionRequest, "read")).toMatchObject({ + ok: true, + }); + + expect( + await configured.value.reload([evidenceScope(replacementRoot)]), + ).toEqual({ ok: true, value: null }); + expect(await canRead(connection, allowedRoot)).toBe(false); + }); }); const evidenceScope = (root: string): PermissionScope => ({ diff --git a/tests/processCaptureElicitation.test.ts b/tests/processCaptureElicitation.test.ts new file mode 100644 index 0000000000..a6224d62c2 --- /dev/null +++ b/tests/processCaptureElicitation.test.ts @@ -0,0 +1,414 @@ +import { isInputRequiredResult } from "@modelcontextprotocol/server"; +import { mkdir, mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { describe, expect, it } from "vitest"; + +import { PermissionAuthority } from "../src/application/PermissionAuthority.js"; +import { createPermissionPolicy } from "../src/domain/permissionPolicy.js"; +import { + authorizeProcessCaptureWithElicitation, + type ProcessCaptureElicitationState, +} from "../src/server/ProcessCaptureElicitation.js"; + +const request = { + capability: "process_capture" as const, + roots: ["/tmp"], + executables: [process.execPath], + environment_names: ["PATH"], + network: "external" as const, + mount: false, + operation_identity: "capture:test", +}; + +describe("process-capture MCP elicitation", () => { + it("grants and reuses a signed session scope on the modern protocol", async () => { + const authority = ceilingOnlyAuthority(); + let state: ProcessCaptureElicitationState | undefined; + const elicitation = { + stateCodec: { + mint: (value: ProcessCaptureElicitationState) => { + state = value; + return Promise.resolve("signed-state"); + }, + verify: () => verifiedState(state), + }, + supported: () => true, + modern: () => true, + consumedNonces: new Map(), + }; + const first = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + elicitation, + ); + expect(isInputRequiredResult(first)).toBe(true); + expect(first).toMatchObject({ requestState: "signed-state" }); + expect(first).toMatchObject({ + inputRequests: { + process_capture_grant: { + params: { + message: expect.stringContaining("Mount access: no"), + }, + }, + }, + }); + expect(state?.request).toEqual(request); + + const accepted = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + elicitation, + ); + expect(isInputRequiredResult(accepted)).toBe(false); + if (isInputRequiredResult(accepted)) return; + expect(accepted.ok).toBe(true); + + const reused = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + elicitation, + ); + expect(isInputRequiredResult(reused)).toBe(false); + if (!isInputRequiredResult(reused)) expect(reused.ok).toBe(true); + }); + + it("fails closed for legacy clients and altered continuations", async () => { + const authority = ceilingOnlyAuthority(); + let state: ProcessCaptureElicitationState | undefined; + const elicitation = { + stateCodec: { + mint: (value: ProcessCaptureElicitationState) => { + state = value; + return Promise.resolve("signed-state"); + }, + verify: () => verifiedState(state), + }, + supported: () => true, + modern: () => false, + consumedNonces: new Map(), + }; + const legacy = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + elicitation, + ); + expect(isInputRequiredResult(legacy)).toBe(false); + if (!isInputRequiredResult(legacy)) expect(legacy.ok).toBe(false); + + const modern = { ...elicitation, modern: () => true }; + await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + modern, + ); + const altered = await authorizeProcessCaptureWithElicitation( + authority, + { ...request, operation_identity: "capture:altered" }, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + modern, + ); + expect(isInputRequiredResult(altered)).toBe(false); + if (!isInputRequiredResult(altered)) expect(altered.ok).toBe(false); + }); + + it("binds signed continuation state to exact origins", async () => { + const authority = ceilingOnlyAuthority([ + "https://example.test", + "https://other.test", + ]); + let state: ProcessCaptureElicitationState | undefined; + const elicitation = { + stateCodec: { + mint: (value: ProcessCaptureElicitationState) => { + state = value; + return Promise.resolve("signed-state"); + }, + verify: () => verifiedState(state), + }, + supported: () => true, + modern: () => true, + consumedNonces: new Map(), + }; + const scoped = { ...request, origins: ["https://example.test"] }; + const prompted = await authorizeProcessCaptureWithElicitation( + authority, + scoped, + requestContext(), + elicitation, + ); + expect(prompted).toMatchObject({ + inputRequests: { + process_capture_grant: { + params: { + message: expect.stringContaining("Origins: https://example.test"), + }, + }, + }, + }); + + const altered = await authorizeProcessCaptureWithElicitation( + authority, + { ...scoped, origins: ["https://other.test"] }, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + elicitation, + ); + + expect(isInputRequiredResult(altered)).toBe(false); + if (!isInputRequiredResult(altered)) expect(altered.ok).toBe(false); + }); + + it("consumes once grants and rejects continuation replay", async () => { + const authority = ceilingOnlyAuthority(); + let state: ProcessCaptureElicitationState | undefined; + const elicitation = { + stateCodec: { + mint: (value: ProcessCaptureElicitationState) => { + state = value; + return Promise.resolve("signed-state"); + }, + verify: () => verifiedState(state), + }, + supported: () => true, + modern: () => true, + consumedNonces: new Map(), + }; + await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + elicitation, + ); + const response = { + action: "accept", + content: { lifetime: "once" }, + }; + const accepted = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, response), + elicitation, + ); + if (isInputRequiredResult(accepted)) throw new Error("grant was not used"); + expect(accepted.ok).toBe(true); + + const replayed = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, response), + elicitation, + ); + expect(isInputRequiredResult(replayed)).toBe(false); + if (!isInputRequiredResult(replayed)) expect(replayed.ok).toBe(false); + + const next = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + elicitation, + ); + expect(isInputRequiredResult(next)).toBe(true); + + const declined = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, { action: "decline" }), + elicitation, + ); + expect(isInputRequiredResult(declined)).toBe(false); + const acceptedAfterDecline = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + elicitation, + ); + expect(isInputRequiredResult(acceptedAfterDecline)).toBe(false); + if (!isInputRequiredResult(acceptedAfterDecline)) + expect(acceptedAfterDecline.ok).toBe(false); + }); + + it("bounds replay state and prunes entries at the signed-state TTL", async () => { + const authority = ceilingOnlyAuthority(); + let state: ProcessCaptureElicitationState | undefined; + const consumedNonces = new Map(); + const elicitation = { + stateCodec: { + mint: (value: ProcessCaptureElicitationState) => { + state = value; + return Promise.resolve("signed-state"); + }, + verify: () => verifiedState(state), + }, + supported: () => true, + modern: () => true, + consumedNonces, + }; + await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(), + elicitation, + ); + const future = Date.now() + 600_000; + for (let index = 0; index < 4_096; index += 1) + consumedNonces.set(`occupied-${String(index)}`, future); + + const rejectedAtCapacity = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + elicitation, + ); + expect(isInputRequiredResult(rejectedAtCapacity)).toBe(false); + if (!isInputRequiredResult(rejectedAtCapacity)) + expect(rejectedAtCapacity.ok).toBe(false); + + consumedNonces.set("occupied-0", Date.now() - 1); + const acceptedAfterPrune = await authorizeProcessCaptureWithElicitation( + authority, + request, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + elicitation, + ); + expect(isInputRequiredResult(acceptedAfterPrune)).toBe(false); + if (!isInputRequiredResult(acceptedAfterPrune)) + expect(acceptedAfterPrune.ok).toBe(true); + expect(consumedNonces.has("occupied-0")).toBe(false); + expect(consumedNonces.size).toBe(4_096); + }); + + it.each(["result", "throw"] as const)( + "revokes an elicited grant when final authorization ends with %s", + async (failure) => { + const root = await mkdtemp(join(tmpdir(), "rea-elicit-rollback-")); + const scoped = { ...request, roots: [root] }; + const policy = createPermissionPolicy([ + { + capability: "process_capture", + roots: scoped.roots, + executables: scoped.executables, + environment_names: scoped.environment_names, + network: scoped.network, + mount: scoped.mount, + }, + ]); + class FailingFinalAuthority extends PermissionAuthority { + private authorizationCount = 0; + + override async authorize( + ...arguments_: Parameters + ): ReturnType { + this.authorizationCount += 1; + const result = await super.authorize(...arguments_); + if (failure === "result" && this.authorizationCount === 2) + await rm(root, { recursive: true, force: true }); + if (failure === "throw" && this.authorizationCount === 3) + throw new Error("synthetic final authorization rejection"); + return result; + } + } + const authority = new FailingFinalAuthority(policy); + let state: ProcessCaptureElicitationState | undefined; + const elicitation = { + stateCodec: { + mint: (value: ProcessCaptureElicitationState) => { + state = value; + return Promise.resolve("signed-state"); + }, + verify: () => verifiedState(state), + }, + supported: () => true, + modern: () => true, + consumedNonces: new Map(), + }; + await authorizeProcessCaptureWithElicitation( + authority, + scoped, + requestContext(), + elicitation, + ); + const finalAuthorization = authorizeProcessCaptureWithElicitation( + authority, + scoped, + requestContext(state, { + action: "accept", + content: { lifetime: "session" }, + }), + elicitation, + ); + if (failure === "throw") + await expect(finalAuthorization).rejects.toThrow( + "synthetic final authorization rejection", + ); + else { + const failed = await finalAuthorization; + expect(isInputRequiredResult(failed)).toBe(false); + if (!isInputRequiredResult(failed)) expect(failed.ok).toBe(false); + await mkdir(root); + } + const retry = await authority.authorize(scoped, "read", { + elicitationSupported: true, + }); + expect(retry.ok).toBe(false); + }, + ); +}); + +const ceilingOnlyAuthority = ( + origins?: readonly string[], +): PermissionAuthority => + new PermissionAuthority( + createPermissionPolicy([ + { + capability: "process_capture", + roots: request.roots, + executables: request.executables, + environment_names: request.environment_names, + ...(origins === undefined ? {} : { origins }), + network: request.network, + mount: request.mount, + }, + ]), + ); + +const requestContext = ( + state?: ProcessCaptureElicitationState, + response?: Record, +) => ({ + mcpReq: { + requestState: () => state, + ...(response === undefined + ? {} + : { inputResponses: { process_capture_grant: response } }), + }, +}); + +const verifiedState = ( + state: ProcessCaptureElicitationState | undefined, +): Promise => { + if (state === undefined) throw new Error("state was not minted"); + return Promise.resolve(state); +}; diff --git a/tests/processCapturePermission.test.ts b/tests/processCapturePermission.test.ts new file mode 100644 index 0000000000..172dae49f1 --- /dev/null +++ b/tests/processCapturePermission.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from "vitest"; + +import { processCapturePermissionRequest } from "../src/application/ProcessCapturePermission.js"; +import { parseProcessScenario } from "../src/domain/processCapture.js"; + +describe("process capture permission request", () => { + it("projects the complete adapter-neutral authority scope", () => { + const scenario = parseProcessScenario({ + approved: true, + executable: "/bin/tool", + arguments: ["--probe"], + working_directory: "/workspace", + environment: { FIXTURE_TOKEN: "secret" }, + inherit_environment: ["PATH"], + filesystem_roots: ["/workspace/output"], + network_access: "host", + events: [], + }); + + expect(processCapturePermissionRequest(scenario)).toEqual({ + capability: "process_capture", + roots: ["/workspace", "/workspace/output"], + executables: ["/bin/tool"], + environment_names: ["FIXTURE_TOKEN", "PATH"], + network: "external", + mount: false, + operation_identity: "capture_process_scenario:/bin/tool", + }); + }); +}); diff --git a/tests/projectPermissionStore.test.ts b/tests/projectPermissionStore.test.ts index fbea542788..52d8efff80 100644 --- a/tests/projectPermissionStore.test.ts +++ b/tests/projectPermissionStore.test.ts @@ -1,4 +1,4 @@ -import { chmod, mkdtemp, stat, writeFile } from "node:fs/promises"; +import { chmod, mkdtemp, stat, symlink, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -62,6 +62,46 @@ describe("project permission store", () => { }); }); + it("rejects a symlink even when its target is owner-only", async () => { + const project = await mkdtemp(join(tmpdir(), "rea-policy-symlink-")); + const target = join(project, "target.json"); + const path = join(project, "permissions.json"); + expect((await writeProjectPermissionStore(target, project, [])).ok).toBe( + true, + ); + await symlink(target, path); + + expect(await readProjectPermissionStore(path, project)).toMatchObject({ + ok: false, + error: { reason: "not_owner_only" }, + }); + }); + + it("round-trips managed runtime project grants", async () => { + const project = await mkdtemp(join(tmpdir(), "rea-policy-managed-")); + const path = join(project, "permissions.json"); + const grant = { + grant_id: "project:managed-runtime", + capability: "managed_runtime" as const, + roots: [project], + executables: [process.execPath], + environment_names: [], + network: "none" as const, + mount: false, + lifetime: "project" as const, + operation_identity: null, + expires_at: null, + }; + + expect( + await writeProjectPermissionStore(path, project, [grant]), + ).toMatchObject({ ok: true, value: { grants: [grant] } }); + expect(await readProjectPermissionStore(path, project)).toMatchObject({ + ok: true, + value: { grants: [grant] }, + }); + }); + it("classifies malformed JSON as an invalid store", async () => { const project = await mkdtemp(join(tmpdir(), "rea-policy-invalid-")); const path = join(project, "permissions.json"); diff --git a/tests/setupSkill.test.ts b/tests/setupSkill.test.ts index b9daef1af8..90d6771a79 100644 --- a/tests/setupSkill.test.ts +++ b/tests/setupSkill.test.ts @@ -34,8 +34,12 @@ describe("canonical skill transaction", () => { expect(await readFile(`${destination}.rea.backup`, "utf8")).toBe( "stale managed skill\n", ); - expect(await readFile(destination, "utf8")).toContain('version: "21"'); - expect(await readFile(destination, "utf8")).toContain( + const installedSkill = await readFile(destination, "utf8"); + expect(installedSkill).toContain('version: "22"'); + expect(installedSkill).toContain( + "use normal repository tools and skip REA readiness", + ); + expect(installedSkill).toContain( `tool_count: ${String(TOOL_CONTRACTS.length)}`, ); expect(await readFile(sibling, "utf8")).toBe("unrelated skill\n"); From da1da3bfb83e2fdd2a7a0a84a6a70aa73a4a68d6 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:28:06 +0000 Subject: [PATCH 3/5] test(hopper): add semantic runtime conformance --- .github/workflows/real-hopper.yml | 16 +- scripts/build-conformance-fixtures.mjs | 2 + scripts/lib/conformance-fixtures.d.mts | 9 ++ scripts/lib/conformance-fixtures.mjs | 10 ++ scripts/lib/real-hopper-fixture.d.mts | 34 ++++ scripts/lib/real-hopper-fixture.mjs | 113 +++++++++++++ scripts/lib/real-hopper-pagination.d.mts | 33 ++++ scripts/lib/real-hopper-pagination.mjs | 138 ++++++++++++++++ scripts/lib/real-hopper-semantic.d.mts | 34 ++++ scripts/lib/real-hopper-semantic.mjs | 194 +++++++++++++++++++++++ scripts/verify-real-hopper.mjs | 108 ++++++------- src/application/RealHopperAssertions.ts | 146 +++++++++++++++++ tests/conformanceFixtures.test.ts | 17 ++ tests/realHopperAssertions.test.ts | 155 ++++++++++++++++++ tests/realHopperFixture.test.ts | 135 ++++++++++++++++ tests/realHopperPagination.test.ts | 72 +++++++++ tests/realHopperSemantic.test.ts | 106 +++++++++++++ 17 files changed, 1251 insertions(+), 71 deletions(-) create mode 100644 scripts/lib/real-hopper-fixture.d.mts create mode 100644 scripts/lib/real-hopper-fixture.mjs create mode 100644 scripts/lib/real-hopper-pagination.d.mts create mode 100644 scripts/lib/real-hopper-pagination.mjs create mode 100644 scripts/lib/real-hopper-semantic.d.mts create mode 100644 scripts/lib/real-hopper-semantic.mjs create mode 100644 tests/realHopperFixture.test.ts create mode 100644 tests/realHopperPagination.test.ts create mode 100644 tests/realHopperSemantic.test.ts diff --git a/.github/workflows/real-hopper.yml b/.github/workflows/real-hopper.yml index 9308a6a305..b666f1e9c5 100644 --- a/.github/workflows/real-hopper.yml +++ b/.github/workflows/real-hopper.yml @@ -2,15 +2,6 @@ name: Real Hopper E2E on: workflow_dispatch: - inputs: - first_target: - description: Absolute path to first test binary on the runner - required: true - type: string - second_target: - description: Absolute path to distinct second test binary on the runner - required: true - type: string permissions: contents: read @@ -27,6 +18,8 @@ jobs: node-version-file: .nvmrc cache: npm - run: npm ci + - name: Build source-owned Hopper conformance fixtures + run: npm run verify:fixtures - name: Install packed CLI in isolation shell: bash run: | @@ -35,8 +28,7 @@ jobs: npm install --global --ignore-scripts --prefix "${prefix}" "./${tarball}" echo "REA_VERIFY_SERVER_COMMAND=${prefix}/bin/rea" >> "${GITHUB_ENV}" echo 'REA_VERIFY_SERVER_ARGS_JSON=["mcp"]' >> "${GITHUB_ENV}" - - name: Verify two real binaries + - name: Verify source-owned fixtures with real Hopper env: - HOPPER_TARGET_PATH: ${{ inputs.first_target }} - HOPPER_SECOND_TARGET_PATH: ${{ inputs.second_target }} + REA_HOPPER_CONFORMANCE_MANIFEST_PATH: ${{ github.workspace }}/build/conformance/manifest.json run: npm run verify:hopper diff --git a/scripts/build-conformance-fixtures.mjs b/scripts/build-conformance-fixtures.mjs index 11b4f0889c..37d8a87ecc 100644 --- a/scripts/build-conformance-fixtures.mjs +++ b/scripts/build-conformance-fixtures.mjs @@ -6,6 +6,7 @@ import { promisify } from "node:util"; import { generateLargeFixture, + HOPPER_C_ORACLE, LARGE_FIXTURE_COUNT, sha256, sourceDigest, @@ -47,6 +48,7 @@ await build( expectations: { symbols: ["_rea_entry", "_rea_branch", "_rea_leaf", "_rea_c_global"], strings: ["REA_C_ENTRY", "REA_C_LEAF"], + hopperOracle: HOPPER_C_ORACLE, }, }, ); diff --git a/scripts/lib/conformance-fixtures.d.mts b/scripts/lib/conformance-fixtures.d.mts index 949e300ce1..06b5ae5147 100644 --- a/scripts/lib/conformance-fixtures.d.mts +++ b/scripts/lib/conformance-fixtures.d.mts @@ -1,4 +1,13 @@ export const LARGE_FIXTURE_COUNT: number; +export const HOPPER_C_ORACLE: Readonly<{ + mainProcedure: "main"; + entryProcedure: "rea_entry"; + branchProcedure: "rea_branch"; + leafProcedure: "rea_leaf"; + entryString: "REA_C_ENTRY"; + leafString: "REA_C_LEAF"; + globalName: "rea_c_global"; +}>; export function sha256(value: string | Uint8Array): string; export function generateLargeFixture(count?: number): string; export function sourceDigest( diff --git a/scripts/lib/conformance-fixtures.mjs b/scripts/lib/conformance-fixtures.mjs index 64952dadb4..66e80b7c24 100644 --- a/scripts/lib/conformance-fixtures.mjs +++ b/scripts/lib/conformance-fixtures.mjs @@ -2,6 +2,16 @@ import { createHash } from "node:crypto"; export const LARGE_FIXTURE_COUNT = 1_205; +export const HOPPER_C_ORACLE = Object.freeze({ + mainProcedure: "main", + entryProcedure: "rea_entry", + branchProcedure: "rea_branch", + leafProcedure: "rea_leaf", + entryString: "REA_C_ENTRY", + leafString: "REA_C_LEAF", + globalName: "rea_c_global", +}); + export const sha256 = (value) => createHash("sha256").update(value).digest("hex"); diff --git a/scripts/lib/real-hopper-fixture.d.mts b/scripts/lib/real-hopper-fixture.d.mts new file mode 100644 index 0000000000..a9b99837bd --- /dev/null +++ b/scripts/lib/real-hopper-fixture.d.mts @@ -0,0 +1,34 @@ +export interface RealHopperFixtureOracle { + readonly mainProcedure: string; + readonly entryProcedure: string; + readonly branchProcedure: string; + readonly leafProcedure: string; + readonly entryString: string; + readonly leafString: string; + readonly globalName: string; +} + +export interface RealHopperFixtureTarget { + readonly path: string; + readonly sha256: string; +} + +export interface RealHopperLargeFixtureOracle { + readonly symbolPrefix: string; + readonly symbolCount: number; + readonly stringPrefix: string; + readonly stringCount: number; +} + +export interface RealHopperFixtureTargets { + readonly manifestPath: string; + readonly primary: RealHopperFixtureTarget; + readonly secondary: RealHopperFixtureTarget; + readonly large: RealHopperFixtureTarget; + readonly oracle: RealHopperFixtureOracle; + readonly largeOracle: RealHopperLargeFixtureOracle; +} + +export function loadRealHopperFixtureTargets( + manifestPath: string, +): Promise; diff --git a/scripts/lib/real-hopper-fixture.mjs b/scripts/lib/real-hopper-fixture.mjs new file mode 100644 index 0000000000..1c1d955d91 --- /dev/null +++ b/scripts/lib/real-hopper-fixture.mjs @@ -0,0 +1,113 @@ +import { createHash } from "node:crypto"; +import { readFile, realpath } from "node:fs/promises"; +import { dirname, isAbsolute, relative, resolve, sep } from "node:path"; + +/** Bind the real-Hopper semantic verifier to source-owned manifest artifacts. */ +export async function loadRealHopperFixtureTargets(manifestPath) { + const canonicalManifest = await realpath(manifestPath); + const manifest = JSON.parse(await readFile(canonicalManifest, "utf8")); + if (manifest?.schemaVersion !== 1 || !Array.isArray(manifest.fixtures)) + throw new Error("Invalid conformance fixture manifest"); + const primary = fixtureEntry(manifest.fixtures, "c"); + const secondary = fixtureEntry(manifest.fixtures, "version-v2"); + const large = fixtureEntry(manifest.fixtures, "large"); + const oracle = requireCOracle(primary.expectations?.hopperOracle); + const largeOracle = requireLargeOracle(large.expectations); + const root = dirname(canonicalManifest); + const [primaryArtifact, secondaryArtifact, largeArtifact] = await Promise.all( + [ + bindFixtureArtifact(root, primary), + bindFixtureArtifact(root, secondary), + bindFixtureArtifact(root, large), + ], + ); + requireDistinctArtifacts([primaryArtifact, secondaryArtifact, largeArtifact]); + return { + manifestPath: canonicalManifest, + primary: primaryArtifact, + secondary: secondaryArtifact, + large: largeArtifact, + oracle, + largeOracle, + }; +} + +function requireCOracle(oracle) { + if ( + oracle === null || + typeof oracle !== "object" || + typeof oracle.mainProcedure !== "string" || + typeof oracle.entryProcedure !== "string" || + typeof oracle.branchProcedure !== "string" || + typeof oracle.leafProcedure !== "string" || + typeof oracle.entryString !== "string" || + typeof oracle.leafString !== "string" || + typeof oracle.globalName !== "string" || + [ + oracle.mainProcedure, + oracle.entryProcedure, + oracle.branchProcedure, + oracle.leafProcedure, + oracle.entryString, + oracle.leafString, + oracle.globalName, + ].some((value) => value.length === 0) + ) + throw new Error("C fixture omitted its Hopper semantic oracle"); + return oracle; +} + +function requireLargeOracle(largeOracle) { + if ( + largeOracle === null || + typeof largeOracle !== "object" || + typeof largeOracle.symbolPrefix !== "string" || + largeOracle.symbolPrefix.length === 0 || + typeof largeOracle.stringPrefix !== "string" || + largeOracle.stringPrefix.length === 0 || + !Number.isInteger(largeOracle.symbolCount) || + largeOracle.symbolCount !== largeOracle.stringCount || + largeOracle.symbolCount <= 0 + ) + throw new Error("Large fixture omitted its exact pagination oracle"); + return largeOracle; +} + +function requireDistinctArtifacts(artifacts) { + if ( + new Set(artifacts.map(({ path }) => path)).size !== artifacts.length || + new Set(artifacts.map(({ sha256 }) => sha256)).size !== artifacts.length + ) + throw new Error("Hopper conformance fixtures must be distinct artifacts"); +} + +function fixtureEntry(fixtures, name) { + const matches = fixtures.filter((fixture) => fixture?.name === name); + if (matches.length !== 1) throw new Error(`Missing fixture ${name}`); + return matches[0]; +} + +async function bindFixtureArtifact(root, fixture) { + if ( + typeof fixture.artifact !== "string" || + typeof fixture.artifactSha256 !== "string" || + !/^[0-9a-f]{64}$/u.test(fixture.artifactSha256) + ) + throw new Error(`Invalid artifact declaration for ${fixture.name}`); + const path = await realpath(resolve(root, fixture.artifact)); + const relation = relative(root, path); + if ( + relation === ".." || + relation.startsWith(`..${sep}`) || + isAbsolute(relation) + ) + throw new Error(`Fixture ${fixture.name} escapes its manifest root`); + const actual = sha256(await readFile(path)); + if (actual !== fixture.artifactSha256) + throw new Error( + `Fixture ${fixture.name} digest did not match its manifest`, + ); + return { path, sha256: actual }; +} + +const sha256 = (value) => createHash("sha256").update(value).digest("hex"); diff --git a/scripts/lib/real-hopper-pagination.d.mts b/scripts/lib/real-hopper-pagination.d.mts new file mode 100644 index 0000000000..784a77e9d2 --- /dev/null +++ b/scripts/lib/real-hopper-pagination.d.mts @@ -0,0 +1,33 @@ +interface ToolClient { + callTool(request: unknown, options: unknown): Promise; +} + +interface PaginationSummary { + readonly count: number; + readonly pages: number; +} + +export function verifyLargeFixturePagination(input: { + readonly client: ToolClient; + readonly options: unknown; + readonly normalizedResult: (value: unknown, operation: string) => unknown; + readonly expectedCount: number; + readonly symbolPrefix: string; + readonly stringPrefix: string; +}): Promise<{ + readonly procedures: PaginationSummary; + readonly strings: PaginationSummary; +}>; + +export function openAndVerifyLargeFixture(input: { + readonly client: ToolClient; + readonly options: unknown; + readonly normalizedResult: (value: unknown, operation: string) => unknown; + readonly path: string; + readonly expectedCount: number; + readonly symbolPrefix: string; + readonly stringPrefix: string; +}): Promise<{ + readonly procedures: PaginationSummary; + readonly strings: PaginationSummary; +}>; diff --git a/scripts/lib/real-hopper-pagination.mjs b/scripts/lib/real-hopper-pagination.mjs new file mode 100644 index 0000000000..f9408292af --- /dev/null +++ b/scripts/lib/real-hopper-pagination.mjs @@ -0,0 +1,138 @@ +const PAGE_LIMIT = 100; + +/** Open the large fixture and exhaustively prove its public search pages. */ +export async function openAndVerifyLargeFixture({ + client, + options, + normalizedResult, + path, + expectedCount, + symbolPrefix, + stringPrefix, +}) { + const opened = await client.callTool( + { name: "open_binary", arguments: { path } }, + options, + ); + if (opened.isError === true) + throw new Error("Hopper rejected the large fixture"); + return verifyLargeFixturePagination({ + client, + options, + normalizedResult, + expectedCount, + symbolPrefix, + stringPrefix, + }); +} + +/** Exhaustively prove the source-owned large fixture through public search pages. */ +export async function verifyLargeFixturePagination({ + client, + options, + normalizedResult, + expectedCount, + symbolPrefix, + stringPrefix, +}) { + const procedures = await collectExactPages({ + client, + options, + normalizedResult, + tool: "search_procedures", + pattern: symbolPrefix.replace(/^_+/u, ""), + expectedPrefix: symbolPrefix.replace(/^_+/u, ""), + expectedCount, + normalize: (value) => value.replace(/^_+/u, ""), + }); + const strings = await collectExactPages({ + client, + options, + normalizedResult, + tool: "search_strings", + pattern: stringPrefix, + expectedPrefix: stringPrefix, + expectedCount, + normalize: (value) => value, + }); + return { procedures, strings }; +} + +async function collectExactPages({ + client, + options, + normalizedResult, + tool, + pattern, + expectedPrefix, + expectedCount, + normalize, +}) { + const seenAddresses = new Set(); + const seenValues = new Set(); + let offset = 0; + let pages = 0; + while (true) { + const page = normalizedResult( + await client.callTool( + { + name: tool, + arguments: { + pattern, + mode: "literal", + case_sensitive: true, + offset, + limit: PAGE_LIMIT, + }, + }, + options, + ), + `${tool} offset ${offset}`, + ); + validatePage(page, { offset, expectedCount }); + for (const item of page.items) { + const value = normalize(item.value); + if (item.value_truncated || !/^0x[0-9a-f]+$/iu.test(item.address)) + throw new Error(`${tool} returned truncated or malformed evidence`); + if (seenAddresses.has(item.address) || seenValues.has(value)) + throw new Error(`${tool} returned duplicate evidence`); + seenAddresses.add(item.address); + seenValues.add(value); + } + pages += 1; + if (page.next_offset === null) break; + offset = page.next_offset; + } + const expectedValues = Array.from( + { length: expectedCount }, + (_, index) => `${expectedPrefix}${String(index).padStart(4, "0")}`, + ); + if ( + seenValues.size !== expectedCount || + expectedValues.some((value) => !seenValues.has(value)) + ) + throw new Error(`${tool} did not exhaustively prove the fixture values`); + return { count: seenValues.size, pages }; +} + +function validatePage(page, { offset, expectedCount }) { + if ( + page === null || + typeof page !== "object" || + !Array.isArray(page.items) || + page.offset !== offset || + page.limit !== PAGE_LIMIT || + page.total !== expectedCount || + page.items.length !== Math.min(PAGE_LIMIT, expectedCount - offset) + ) + throw new Error("Hopper returned an inconsistent fixture search page"); + const expectedNext = + offset + page.items.length < expectedCount + ? offset + page.items.length + : null; + if ( + page.next_offset !== expectedNext || + page.has_more !== (expectedNext !== null) + ) + throw new Error("Hopper returned inconsistent pagination metadata"); +} diff --git a/scripts/lib/real-hopper-semantic.d.mts b/scripts/lib/real-hopper-semantic.d.mts new file mode 100644 index 0000000000..6adca7fd22 --- /dev/null +++ b/scripts/lib/real-hopper-semantic.d.mts @@ -0,0 +1,34 @@ +export interface FixtureProcedure { + readonly address: string; + readonly name: string; +} + +interface ToolClient { + callTool( + request: { readonly name: string; readonly arguments: unknown }, + options: unknown, + ): Promise; +} + +export function resolveFixtureProcedure( + client: ToolClient, + options: unknown, + expectedName: string, + normalizedResult: (value: unknown, operation: string) => unknown, +): Promise; + +export function requireSafeDiagnostics(chunks: readonly string[]): number; + +export function requireCurrentDocument( + client: ToolClient, + options: unknown, + documents: readonly string[], + normalizedResult: (value: unknown, operation: string) => unknown, +): Promise; + +export function analyzeFixtureProcedure( + client: ToolClient, + options: unknown, + procedure: FixtureProcedure, + normalizedResult: (value: unknown, operation: string) => unknown, +): Promise; diff --git a/scripts/lib/real-hopper-semantic.mjs b/scripts/lib/real-hopper-semantic.mjs new file mode 100644 index 0000000000..9a2ae0c7eb --- /dev/null +++ b/scripts/lib/real-hopper-semantic.mjs @@ -0,0 +1,194 @@ +import { requireFunctionDossierOracle } from "../../dist/application/RealHopperAssertions.js"; + +/** Verify named positive semantics from the source-owned C fixture. */ +export async function verifyRealHopperFixture({ + client, + options, + document, + oracle, + normalizedResult, +}) { + const main = await resolveFixtureProcedure( + client, + options, + oracle.mainProcedure, + normalizedResult, + ); + const entry = await resolveFixtureProcedure( + client, + options, + oracle.entryProcedure, + normalizedResult, + ); + const branch = await resolveFixtureProcedure( + client, + options, + oracle.branchProcedure, + normalizedResult, + ); + const leaf = await resolveFixtureProcedure( + client, + options, + oracle.leafProcedure, + normalizedResult, + ); + const comment = "REA real-Hopper conformance verifier"; + const commentSet = normalizedResult( + await client.callTool( + { + name: "set_comment", + arguments: { address: entry.address, comment, document }, + }, + options, + ), + "set_comment fixture marker", + ); + if (commentSet !== true) + throw new Error("Hopper did not read back the fixture comment marker"); + + const entryDossier = requireFunctionDossierOracle( + await analyzeFixtureProcedure(client, options, entry, normalizedResult), + { + procedure_address: entry.address, + callee_address: branch.address, + caller_address: main.address, + referenced_string: oracle.entryString, + comment, + require_assembly: true, + }, + ); + const branchDossier = requireFunctionDossierOracle( + await analyzeFixtureProcedure(client, options, branch, normalizedResult), + { + procedure_address: branch.address, + callee_address: leaf.address, + caller_address: entry.address, + require_cfg_successor: true, + require_assembly: true, + }, + ); + const leafDossier = requireFunctionDossierOracle( + await analyzeFixtureProcedure(client, options, leaf, normalizedResult), + { + procedure_address: leaf.address, + caller_address: branch.address, + referenced_string: oracle.leafString, + referenced_name: oracle.globalName, + require_assembly: true, + }, + ); + return { + procedures: { main, entry, branch, leaf }, + entryComments: entryDossier.comments.returned, + entryStrings: entryDossier.referenced_strings.returned, + entryCallees: entryDossier.callees.returned, + branchCallees: branchDossier.callees.returned, + branchBlocks: branchDossier.basic_blocks.returned, + leafStrings: leafDossier.referenced_strings.returned, + leafNames: leafDossier.referenced_names.returned, + }; +} + +/** Reject malformed, unsafe, or error-level diagnostics from the MCP runtime. */ +export function requireSafeDiagnostics(chunks) { + const lines = chunks + .join("") + .split("\n") + .map((line) => line.trim()) + .filter((line) => line.length > 0); + for (const line of lines) { + let diagnostic; + try { + diagnostic = JSON.parse(line); + } catch { + throw new Error(`The MCP runtime emitted malformed stderr: ${line}`); + } + if ( + diagnostic === null || + typeof diagnostic !== "object" || + diagnostic.application !== "rea" || + typeof diagnostic.level !== "number" || + diagnostic.level >= 40 + ) + throw new Error(`The MCP runtime emitted unsafe stderr: ${line}`); + } + return lines.length; +} + +/** Bind mutations to the active document rather than list ordering. */ +export async function requireCurrentDocument( + client, + options, + documents, + normalizedResult, +) { + const current = normalizedResult( + await client.callTool({ name: "current_document", arguments: {} }, options), + "current_document", + ); + if ( + typeof current !== "string" || + current.length === 0 || + !documents.includes(current) + ) + throw new Error("current_document was not present in list_documents"); + return current; +} + +export async function resolveFixtureProcedure( + client, + options, + expectedName, + normalizedResult, +) { + const page = normalizedResult( + await client.callTool( + { + name: "search_procedures", + arguments: { + pattern: expectedName, + mode: "literal", + case_sensitive: true, + limit: 100, + }, + }, + options, + ), + `search_procedures ${expectedName}`, + ); + const matches = Array.isArray(page?.items) + ? page.items.filter( + (item) => + typeof item?.value === "string" && + item.value_truncated === false && + item.value.replace(/^_+/u, "") === expectedName, + ) + : []; + if ( + matches.length !== 1 || + typeof matches[0]?.address !== "string" || + !/^0x[0-9a-f]+$/iu.test(matches[0].address) + ) + throw new Error( + `Expected exactly one Hopper procedure named ${expectedName}`, + ); + return { address: matches[0].address, name: matches[0].value }; +} + +/** Request the assembly evidence required by the fixture oracle. */ +export const analyzeFixtureProcedure = async ( + client, + options, + procedure, + normalizedResult, +) => + normalizedResult( + await client.callTool( + { + name: "analyze_function", + arguments: { procedure: procedure.address, include_assembly: true }, + }, + options, + ), + `analyze_function ${procedure.name}`, + ); diff --git a/scripts/verify-real-hopper.mjs b/scripts/verify-real-hopper.mjs index de009ba2fc..7cc324e1c7 100644 --- a/scripts/verify-real-hopper.mjs +++ b/scripts/verify-real-hopper.mjs @@ -1,7 +1,5 @@ import { execFile } from "node:child_process"; -import { createHash } from "node:crypto"; -import { createReadStream } from "node:fs"; -import { readdir, realpath } from "node:fs/promises"; +import { readdir } from "node:fs/promises"; import { promisify } from "node:util"; import { Client } from "@modelcontextprotocol/client"; @@ -10,17 +8,21 @@ import { StdioClientTransport } from "@modelcontextprotocol/client/stdio"; import { TOOL_CONTRACTS } from "../dist/contracts/toolContracts.js"; import { firstProcedureAddress, - requireDistinctTargetHashes, requireAddressArray, requireFunctionDossier, requirePseudocode, } from "../dist/application/RealHopperAssertions.js"; import { HOPPER_PROVIDER_IDENTITY } from "../dist/hopper/HopperProvider.js"; import { REA_WORKFLOW_PROVIDER } from "../dist/application/InvestigationProviders.js"; - +import { loadRealHopperFixtureTargets } from "./lib/real-hopper-fixture.mjs"; +import { + requireCurrentDocument, + requireSafeDiagnostics, + verifyRealHopperFixture, +} from "./lib/real-hopper-semantic.mjs"; +import { openAndVerifyLargeFixture } from "./lib/real-hopper-pagination.mjs"; const execFileAsync = promisify(execFile); const timeout = 180_000; - const parseServerArgs = (encoded) => { const parsed = JSON.parse(encoded); if ( @@ -34,7 +36,6 @@ const parseServerArgs = (encoded) => { const sessionsBefore = new Set( (await readdir("/tmp")).filter((name) => name.startsWith("rea-")), ); - const textValue = (result) => { const text = result.content?.find((item) => item.type === "text")?.text; if (typeof text !== "string") throw new Error("Tool result omitted text"); @@ -285,49 +286,15 @@ const verifyCurrentTarget = async (client, options) => { }; }; -const requireSafeDiagnostics = (chunks) => { - const lines = chunks - .join("") - .split("\n") - .map((line) => line.trim()) - .filter((line) => line.length > 0); - for (const line of lines) { - let diagnostic; - try { - diagnostic = JSON.parse(line); - } catch { - throw new Error(`The MCP runtime emitted malformed stderr: ${line}`); - } - if ( - diagnostic === null || - typeof diagnostic !== "object" || - diagnostic.application !== "rea" || - typeof diagnostic.level !== "number" || - diagnostic.level >= 40 - ) { - throw new Error(`The MCP runtime emitted unsafe stderr: ${line}`); - } - } - return lines.length; -}; - -const targetPath = process.env.HOPPER_TARGET_PATH; -const secondTargetPath = process.env.HOPPER_SECOND_TARGET_PATH; -if (!targetPath || !secondTargetPath) - throw new Error( - "HOPPER_TARGET_PATH and HOPPER_SECOND_TARGET_PATH are required and must name distinct binaries", - ); -const [targetA, targetB] = await Promise.all([ - realpath(targetPath), - realpath(secondTargetPath), -]); -if (targetA === targetB) - throw new Error("Real-Hopper verification requires two distinct targets"); -const [targetHashA, targetHashB] = await Promise.all([ - sha256File(targetA), - sha256File(targetB), -]); -requireDistinctTargetHashes(targetHashA, targetHashB); +const fixtureManifestPath = process.env.REA_HOPPER_CONFORMANCE_MANIFEST_PATH; +if (!fixtureManifestPath) + throw new Error("REA_HOPPER_CONFORMANCE_MANIFEST_PATH is required"); +const fixtureTargets = await loadRealHopperFixtureTargets(fixtureManifestPath); +const targetA = fixtureTargets.primary.path; +const targetB = fixtureTargets.secondary.path; +const largeTarget = fixtureTargets.large.path; +const targetHashA = fixtureTargets.primary.sha256; +const targetHashB = fixtureTargets.secondary.sha256; const serverEnvironment = { ...process.env }; serverEnvironment.REA_ANALYSIS_PROVIDER = "auto"; delete serverEnvironment.HOPPER_TARGET_PATH; @@ -409,13 +376,30 @@ try { requireSuccessfulTool(segments, "list_segments"), ); const firstDocuments = requireSuccessfulTool(documents, "list_documents"); - if (!Array.isArray(firstDocuments) || firstDocuments.length === 0) + if ( + !Array.isArray(firstDocuments) || + firstDocuments.length === 0 || + typeof firstDocuments[0] !== "string" + ) throw new Error("list_documents returned no real Hopper document"); + const currentDocument = await requireCurrentDocument( + client, + options, + firstDocuments, + requireSuccessfulTool, + ); const firstOverview = requireOverview( requireSuccessfulTool(overview, "binary_overview"), "binary_overview", ); const firstAnalysis = await verifyCurrentTarget(client, options); + const fixtureAnalysis = await verifyRealHopperFixture({ + client, + options, + document: currentDocument, + oracle: fixtureTargets.oracle, + normalizedResult: requireSuccessfulTool, + }); const switched = await client.callTool( { name: "open_binary", arguments: { path: targetB } }, options, @@ -439,6 +423,15 @@ try { "binary_overview after target switch", ); const secondAnalysis = await verifyCurrentTarget(client, options); + const largePagination = await openAndVerifyLargeFixture({ + client, + options, + normalizedResult: requireSuccessfulTool, + path: largeTarget, + expectedCount: fixtureTargets.largeOracle.symbolCount, + symbolPrefix: fixtureTargets.largeOracle.symbolPrefix, + stringPrefix: fixtureTargets.largeOracle.stringPrefix, + }); const processList = await execFileAsync("ps", ["-ax", "-o", "command="]); const bundledMcpRunning = processList.stdout @@ -468,13 +461,16 @@ try { overview: firstOverview, segmentCount: firstOverview.segment_count, analyses: [firstAnalysis, secondAnalysis], + fixtureAnalysis, + largePagination, + fixtureManifest: fixtureTargets.manifestPath, bundledMcpRunning, stderrBytes, diagnosticCount, dynamicSession: true, providerBinding, - targets: [targetA, targetB], - targetHashes: [targetHashA, targetHashB], + targets: [targetA, targetB, largeTarget], + targetHashes: [targetHashA, targetHashB, fixtureTargets.large.sha256], switched: true, secondOverview: verifiedSecondOverview, }; @@ -520,9 +516,3 @@ await new Promise((resolve, reject) => { }, ); }); - -async function sha256File(path) { - const hash = createHash("sha256"); - for await (const chunk of createReadStream(path)) hash.update(chunk); - return hash.digest("hex"); -} diff --git a/src/application/RealHopperAssertions.ts b/src/application/RealHopperAssertions.ts index 45e12d22b1..56386e1187 100644 --- a/src/application/RealHopperAssertions.ts +++ b/src/application/RealHopperAssertions.ts @@ -80,6 +80,151 @@ export const requireFunctionDossier = ( return value; }; +/** Positive semantic facts required from one source-owned Hopper fixture. */ +export interface FunctionDossierOracle { + readonly procedure_address: string; + readonly callee_address?: string; + readonly caller_address?: string; + readonly referenced_string?: string; + readonly referenced_name?: string; + readonly comment?: string; + readonly require_cfg_successor?: boolean; + readonly require_assembly?: boolean; +} + +/** Reject a structurally valid dossier that omits fixture-proven semantics. */ +export const requireFunctionDossierOracle = ( + input: unknown, + oracle: FunctionDossierOracle, +): Record => { + const value = requireFunctionDossier(input, oracle.procedure_address); + if (oracle.callee_address !== undefined) { + const callees = z + .array(identitySchema) + .parse(collectionSchema.parse(value.callees).items); + if (!callees.some(({ address }) => address === oracle.callee_address)) + throw new TypeError( + "analyze_function omitted the expected fixture callee", + ); + + const references = z + .array( + z.object({ + source_address: addressSchema, + target_address: addressSchema, + }), + ) + .parse(collectionSchema.parse(value.outgoing_references).items); + if ( + !references.some( + ({ target_address }) => target_address === oracle.callee_address, + ) + ) + throw new TypeError( + "analyze_function omitted the expected fixture reference", + ); + } + + if (oracle.caller_address !== undefined) { + const callers = z + .array(identitySchema) + .parse(collectionSchema.parse(value.callers).items); + if (!callers.some(({ address }) => address === oracle.caller_address)) + throw new TypeError( + "analyze_function omitted the expected fixture caller", + ); + } + + if (oracle.referenced_string !== undefined) + requireReferencedValue( + value, + "referenced_strings", + oracle.referenced_string, + (candidate) => candidate, + ); + + if (oracle.referenced_name !== undefined) + requireReferencedValue( + value, + "referenced_names", + oracle.referenced_name, + (candidate) => candidate.replace(/^_+/u, ""), + ); + + if (oracle.comment !== undefined) { + const comments = z + .array( + z.object({ + address: addressSchema, + kind: z.enum(["comment", "inline"]), + text: z.string(), + }), + ) + .parse(collectionSchema.parse(value.comments).items); + if ( + !comments.some( + ({ address, kind, text }) => + address === oracle.procedure_address && + kind === "comment" && + text === oracle.comment, + ) + ) + throw new TypeError("analyze_function omitted the verifier comment"); + } + + if ( + oracle.require_assembly === true && + collectionSchema.parse(value.assembly).items.length === 0 + ) + throw new TypeError("analyze_function omitted fixture assembly"); + + if (oracle.require_cfg_successor) { + const blocks = z + .array(z.object({ successors: z.array(addressSchema) })) + .parse(collectionSchema.parse(value.basic_blocks).items); + if (!blocks.some(({ successors }) => successors.length > 0)) + throw new TypeError("analyze_function omitted a real CFG successor"); + } + return value; +}; + +const referencedValueSchema = z.object({ + address: addressSchema, + value: z.string(), + source_address: addressSchema, +}); + +const referenceEdgeSchema = z.object({ + source_address: addressSchema, + target_address: addressSchema, +}); + +const requireReferencedValue = ( + dossier: Record, + field: "referenced_strings" | "referenced_names", + expected: string, + normalize: (value: string) => string, +): void => { + const values = z + .array(referencedValueSchema) + .parse(collectionSchema.parse(dossier[field]).items); + const references = z + .array(referenceEdgeSchema) + .parse(collectionSchema.parse(dossier.outgoing_references).items); + const found = values.some( + ({ address, value, source_address: sourceAddress }) => + normalize(value) === expected && + references.some( + ({ source_address, target_address }) => + source_address === sourceAddress && target_address === address, + ), + ); + if (!found) + throw new TypeError( + `analyze_function omitted the expected fixture ${field === "referenced_strings" ? "string" : "name"}`, + ); +}; + /** Require every relationship to be an actual hexadecimal address. */ export const requireAddressArray = ( input: unknown, @@ -92,6 +237,7 @@ export const requireAddressArray = ( }; const COLLECTION_FIELDS = [ + "assembly", "comments", "callers", "callees", diff --git a/tests/conformanceFixtures.test.ts b/tests/conformanceFixtures.test.ts index 6b02b9ec06..b181f1919b 100644 --- a/tests/conformanceFixtures.test.ts +++ b/tests/conformanceFixtures.test.ts @@ -1,13 +1,30 @@ +import { readFile } from "node:fs/promises"; + import { describe, expect, it } from "vitest"; import { generateLargeFixture, + HOPPER_C_ORACLE, LARGE_FIXTURE_COUNT, sha256, sourceDigest, } from "../scripts/lib/conformance-fixtures.mjs"; describe("source-built conformance fixtures", () => { + it("grounds the Hopper semantic oracle in the source-owned C fixture", async () => { + const source = await readFile("tests/conformance/c/fixture.c", "utf8"); + for (const procedure of [ + HOPPER_C_ORACLE.mainProcedure, + HOPPER_C_ORACLE.entryProcedure, + HOPPER_C_ORACLE.branchProcedure, + HOPPER_C_ORACLE.leafProcedure, + ]) + expect(source).toContain(`int ${procedure}`); + expect(source).toContain(HOPPER_C_ORACLE.entryString); + expect(source).toContain(HOPPER_C_ORACLE.leafString); + expect(source).toContain(HOPPER_C_ORACLE.globalName); + }); + it("generates a deterministic large pagination fixture", () => { const first = generateLargeFixture(); const second = generateLargeFixture(); diff --git a/tests/realHopperAssertions.test.ts b/tests/realHopperAssertions.test.ts index fe6d0424ed..f50a185f5d 100644 --- a/tests/realHopperAssertions.test.ts +++ b/tests/realHopperAssertions.test.ts @@ -4,6 +4,7 @@ import { firstProcedureAddress, requireDistinctTargetHashes, requireAddressArray, + requireFunctionDossierOracle, requireFunctionDossier, requirePseudocode, } from "../src/application/RealHopperAssertions.js"; @@ -86,8 +87,161 @@ describe("real Hopper semantic assertions", () => { }; expect(requireFunctionDossier(scanLimited, "0x1000")).toEqual(scanLimited); }); + + it("requires fixture-specific positive dossier evidence", () => { + const entry = fixtureDossier({ + address: "0x1000", + name: "rea_entry", + callee: { address: "0x2000", name: "rea_branch" }, + caller: { address: "0x0900", name: "main" }, + referencedString: "REA_C_ENTRY", + comment: "REA real-Hopper verifier", + successor: "0x1010", + }); + expect( + requireFunctionDossierOracle(entry, { + procedure_address: "0x1000", + callee_address: "0x2000", + caller_address: "0x0900", + referenced_string: "REA_C_ENTRY", + referenced_name: "rea_c_global", + comment: "REA real-Hopper verifier", + require_cfg_successor: true, + require_assembly: true, + }), + ).toEqual(entry); + + for (const field of [ + "callees", + "callers", + "outgoing_references", + "referenced_strings", + "referenced_names", + "comments", + "assembly", + ] as const) { + expect(() => + requireFunctionDossierOracle( + { ...entry, [field]: emptyCollection() }, + { + procedure_address: "0x1000", + callee_address: "0x2000", + caller_address: "0x0900", + referenced_string: "REA_C_ENTRY", + referenced_name: "rea_c_global", + comment: "REA real-Hopper verifier", + require_cfg_successor: true, + require_assembly: true, + }, + ), + ).toThrow(); + } + expect(() => + requireFunctionDossierOracle( + { + ...entry, + referenced_names: bounded([ + { + address: "0x4000", + value: "_rea_c_global", + source_address: "0x2000", + }, + ]), + }, + { + procedure_address: "0x1000", + referenced_name: "rea_c_global", + }, + ), + ).toThrow(); + expect(() => + requireFunctionDossierOracle( + { + ...entry, + basic_blocks: bounded([{ start: "0x1000", successors: [] }]), + }, + { + procedure_address: "0x1000", + callee_address: "0x2000", + referenced_string: "REA_C_ENTRY", + comment: "REA real-Hopper verifier", + require_cfg_successor: true, + }, + ), + ).toThrow(/CFG successor/u); + }); }); +const fixtureDossier = (input: { + readonly address: string; + readonly name: string; + readonly callee: { readonly address: string; readonly name: string }; + readonly caller: { readonly address: string; readonly name: string }; + readonly referencedString: string; + readonly comment: string; + readonly successor: string; +}) => ({ + ...validDossier(), + procedure: { address: input.address, name: input.name }, + assembly: bounded(["mov eax, eax"]), + comments: bounded([ + { address: input.address, kind: "comment", text: input.comment }, + ]), + callees: bounded([input.callee]), + callers: bounded([input.caller]), + outgoing_references: bounded([ + { + source_address: input.address, + target_address: input.callee.address, + source_procedure: { address: input.address, name: input.name }, + target_procedure: input.callee, + kind: { available: false, reason: "public API did not classify kind" }, + }, + { + source_address: "0x1004", + target_address: "0x3000", + source_procedure: { address: input.address, name: input.name }, + target_procedure: null, + kind: { available: false, reason: "public API did not classify kind" }, + }, + { + source_address: "0x1008", + target_address: "0x4000", + source_procedure: { address: input.address, name: input.name }, + target_procedure: null, + kind: { available: false, reason: "public API did not classify kind" }, + }, + ]), + referenced_strings: bounded([ + { + address: "0x3000", + value: input.referencedString, + source_address: "0x1004", + }, + ]), + referenced_names: bounded([ + { + address: "0x4000", + value: "_rea_c_global", + source_address: "0x1008", + }, + ]), + basic_blocks: bounded([ + { start: input.address, successors: [input.successor] }, + { start: input.successor, successors: [] }, + ]), +}); + +const bounded = (items: readonly unknown[]) => ({ + items, + total: items.length, + returned: items.length, + truncated: false, + next_offset: null, +}); + +const emptyCollection = () => bounded([]); + const validDossier = () => { const collection = { items: [], @@ -99,6 +253,7 @@ const validDossier = () => { return { procedure: { address: "0x1000", name: "main" }, pseudocode: { text: "return 0;", returned_chars: 9, total_chars: 9 }, + assembly: collection, comments: collection, callers: collection, callees: collection, diff --git a/tests/realHopperFixture.test.ts b/tests/realHopperFixture.test.ts new file mode 100644 index 0000000000..d7e0e9f79e --- /dev/null +++ b/tests/realHopperFixture.test.ts @@ -0,0 +1,135 @@ +import { createHash } from "node:crypto"; +import { mkdtemp, readFile, rm, symlink, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; + +import { loadRealHopperFixtureTargets } from "../scripts/lib/real-hopper-fixture.mjs"; + +let root: string | undefined; +afterEach(async () => { + if (root !== undefined) await rm(root, { recursive: true, force: true }); + root = undefined; +}); + +describe("real Hopper fixture binding", () => { + it("binds exact source-owned artifacts and their semantic oracle", async () => { + const manifest = await fixtureManifest(); + await expect(loadRealHopperFixtureTargets(manifest)).resolves.toMatchObject( + { + primary: { path: join(root ?? "", "c") }, + secondary: { path: join(root ?? "", "version-v2") }, + large: { path: join(root ?? "", "large") }, + largeOracle: { + symbolPrefix: "_rea_page_", + symbolCount: 1_205, + stringPrefix: "REA_PAGE_", + stringCount: 1_205, + }, + oracle: { + mainProcedure: "main", + entryProcedure: "rea_entry", + branchProcedure: "rea_branch", + leafProcedure: "rea_leaf", + entryString: "REA_C_ENTRY", + leafString: "REA_C_LEAF", + globalName: "rea_c_global", + }, + }, + ); + }); + + it("rejects digest drift and artifacts escaping the manifest root", async () => { + const manifest = await fixtureManifest(); + await writeFile(join(root ?? "", "c"), "changed"); + await expect(loadRealHopperFixtureTargets(manifest)).rejects.toThrow( + /digest/u, + ); + + const outside = await mkdtemp(join(tmpdir(), "rea-hopper-outside-")); + try { + await writeFile(join(outside, "c"), "primary"); + await rm(join(root ?? "", "c")); + await symlink(join(outside, "c"), join(root ?? "", "c")); + await expect(loadRealHopperFixtureTargets(manifest)).rejects.toThrow( + /escapes/u, + ); + } finally { + await rm(outside, { recursive: true, force: true }); + } + }); + + it("rejects manifest entries that alias the same artifact", async () => { + const manifest = await fixtureManifest(); + const parsed = JSON.parse(await readFile(manifest, "utf8")) as { + fixtures: { name: string; artifact: string; artifactSha256: string }[]; + }; + const primary = parsed.fixtures.find(({ name }) => name === "c"); + const secondary = parsed.fixtures.find(({ name }) => name === "version-v2"); + if (primary === undefined || secondary === undefined) + throw new Error("Fixture manifest setup failed"); + secondary.artifact = primary.artifact; + secondary.artifactSha256 = primary.artifactSha256; + await writeFile(manifest, JSON.stringify(parsed)); + + await expect(loadRealHopperFixtureTargets(manifest)).rejects.toThrow( + /distinct artifacts/u, + ); + }); +}); + +const fixtureManifest = async (): Promise => { + root = await mkdtemp(join(tmpdir(), "rea-hopper-fixture-")); + const primary = Buffer.from("primary"); + const secondary = Buffer.from("secondary"); + await Promise.all([ + writeFile(join(root, "c"), primary), + writeFile(join(root, "version-v2"), secondary), + writeFile(join(root, "large"), Buffer.from("large")), + ]); + const manifest = join(root, "manifest.json"); + await writeFile( + manifest, + JSON.stringify({ + schemaVersion: 1, + fixtures: [ + { + name: "c", + artifact: "c", + artifactSha256: digest(primary), + expectations: { + hopperOracle: { + mainProcedure: "main", + entryProcedure: "rea_entry", + branchProcedure: "rea_branch", + leafProcedure: "rea_leaf", + entryString: "REA_C_ENTRY", + leafString: "REA_C_LEAF", + globalName: "rea_c_global", + }, + }, + }, + { + name: "version-v2", + artifact: "version-v2", + artifactSha256: digest(secondary), + }, + { + name: "large", + artifact: "large", + artifactSha256: digest(Buffer.from("large")), + expectations: { + symbolPrefix: "_rea_page_", + symbolCount: 1_205, + stringPrefix: "REA_PAGE_", + stringCount: 1_205, + }, + }, + ], + }), + ); + return manifest; +}; + +const digest = (value: Buffer): string => + createHash("sha256").update(value).digest("hex"); diff --git a/tests/realHopperPagination.test.ts b/tests/realHopperPagination.test.ts new file mode 100644 index 0000000000..834a8e9a8b --- /dev/null +++ b/tests/realHopperPagination.test.ts @@ -0,0 +1,72 @@ +import { describe, expect, it } from "vitest"; + +import { verifyLargeFixturePagination } from "../scripts/lib/real-hopper-pagination.mjs"; + +const normalize = (value: unknown): unknown => value; + +describe("real Hopper large-fixture pagination", () => { + it("proves every procedure and string across exact search pages", async () => { + await expect( + verifyLargeFixturePagination({ + client: fixtureClient(205), + options: {}, + normalizedResult: normalize, + expectedCount: 205, + symbolPrefix: "_rea_page_", + stringPrefix: "REA_PAGE_", + }), + ).resolves.toEqual({ + procedures: { count: 205, pages: 3 }, + strings: { count: 205, pages: 3 }, + }); + }); + + it.each(["truncated", "duplicate", "wrong-total"] as const)( + "rejects %s positive evidence", + async (fault) => { + await expect( + verifyLargeFixturePagination({ + client: fixtureClient(205, fault), + options: {}, + normalizedResult: normalize, + expectedCount: 205, + symbolPrefix: "_rea_page_", + stringPrefix: "REA_PAGE_", + }), + ).rejects.toThrow(); + }, + ); +}); + +const fixtureClient = ( + count: number, + fault?: "truncated" | "duplicate" | "wrong-total", +) => ({ + callTool: async (request: unknown) => { + const parsed = request as { + name: string; + arguments: { offset: number; limit: number }; + }; + const { offset, limit } = parsed.arguments; + const returned = Math.min(limit, count - offset); + const procedure = parsed.name === "search_procedures"; + const items = Array.from({ length: returned }, (_, pageIndex) => { + const index = offset + pageIndex; + const evidenceIndex = fault === "duplicate" && index === 1 ? 0 : index; + return { + address: `0x${(0x1000 + index).toString(16)}`, + value: `${procedure ? "_rea_page_" : "REA_PAGE_"}${String(evidenceIndex).padStart(4, "0")}`, + value_truncated: fault === "truncated" && index === 0, + }; + }); + const next = offset + returned < count ? offset + returned : null; + return { + items, + offset, + limit, + total: fault === "wrong-total" ? count + 1 : count, + next_offset: next, + has_more: next !== null, + }; + }, +}); diff --git a/tests/realHopperSemantic.test.ts b/tests/realHopperSemantic.test.ts new file mode 100644 index 0000000000..b979817342 --- /dev/null +++ b/tests/realHopperSemantic.test.ts @@ -0,0 +1,106 @@ +import { describe, expect, it } from "vitest"; + +import { + analyzeFixtureProcedure, + requireCurrentDocument, + resolveFixtureProcedure, +} from "../scripts/lib/real-hopper-semantic.mjs"; + +const normalize = (value: unknown): unknown => value; + +describe("real Hopper semantic fixture resolution", () => { + it("requests assembly when analyzing fixture procedures", async () => { + const requests: unknown[] = []; + const result = await analyzeFixtureProcedure( + { + callTool: async (request: unknown) => { + requests.push(request); + return { dossier: true }; + }, + }, + {}, + { address: "0x1000", name: "rea_entry" }, + normalize, + ); + + expect(result).toEqual({ dossier: true }); + expect(requests).toEqual([ + { + name: "analyze_function", + arguments: { procedure: "0x1000", include_assembly: true }, + }, + ]); + }); + + it("binds mutations to the active document, not the first listed one", async () => { + await expect( + requireCurrentDocument( + clientReturning("active"), + {}, + ["unrelated", "active"], + normalize, + ), + ).resolves.toBe("active"); + await expect( + requireCurrentDocument( + clientReturning("unknown"), + {}, + ["unrelated", "active"], + normalize, + ), + ).rejects.toThrow(/current_document/u); + }); + + it("resolves the public search value and preserves its reported name", async () => { + const procedure = await resolveFixtureProcedure( + clientWithItems([ + { + address: "0x1000", + value: "_rea_entry", + value_truncated: false, + }, + ]), + {}, + "rea_entry", + normalize, + ); + + expect(procedure).toEqual({ address: "0x1000", name: "_rea_entry" }); + }); + + it.each([ + ["empty", []], + [ + "truncated", + [{ address: "0x1000", value: "rea_entry", value_truncated: true }], + ], + [ + "duplicate", + [ + { address: "0x1000", value: "rea_entry", value_truncated: false }, + { address: "0x2000", value: "_rea_entry", value_truncated: false }, + ], + ], + [ + "wrong name", + [{ address: "0x1000", value: "rea_other", value_truncated: false }], + ], + ])("rejects %s search evidence", async (_label, items) => { + await expect( + resolveFixtureProcedure( + clientWithItems(items), + {}, + "rea_entry", + normalize, + ), + ).rejects.toThrow(/exactly one Hopper procedure/u); + }); +}); + +const clientWithItems = (items: readonly unknown[]) => ({ + callTool: async () => ({ items }), +}); + +const clientReturning = (value: unknown) => ({ + callTool: async () => value, +}); From a1a6b4200ed638b1ea4d186ae1253805032d002a Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:28:42 +0000 Subject: [PATCH 4/5] feat(windows): define native authority boundary --- ...0004-windows-native-authority-packaging.md | 531 +++++++ docs/adr/README.md | 1 + docs/product-catalog.json | 6 +- package.json | 8 + scripts/generate-package-metadata.mjs | 17 + src/application/CapabilityInventory.ts | 102 +- src/application/WindowsCapabilities.ts | 40 +- src/application/WindowsNativeAuthority.ts | 1379 +++++++++++++++++ .../WindowsNativeAuthorityLoader.ts | 401 +++++ src/generatedPackageMetadata.ts | 9 +- src/process/PrivateRuntimeRoot.ts | 5 +- tests/windowsCapabilities.test.ts | 20 + tests/windowsNativeAuthority.test.ts | 1194 ++++++++++++++ tests/windowsNativeAuthorityLoader.test.ts | 273 ++++ 14 files changed, 3938 insertions(+), 48 deletions(-) create mode 100644 docs/adr/0004-windows-native-authority-packaging.md create mode 100644 src/application/WindowsNativeAuthority.ts create mode 100644 src/application/WindowsNativeAuthorityLoader.ts create mode 100644 tests/windowsNativeAuthority.test.ts create mode 100644 tests/windowsNativeAuthorityLoader.test.ts diff --git a/docs/adr/0004-windows-native-authority-packaging.md b/docs/adr/0004-windows-native-authority-packaging.md new file mode 100644 index 0000000000..cb8ccd2225 --- /dev/null +++ b/docs/adr/0004-windows-native-authority-packaging.md @@ -0,0 +1,531 @@ +# ADR-0004: Windows native authority packaging + +- Status: Accepted +- Date: 2026-07-17 +- Implementation status: the provider-neutral TypeScript base port and + fail-closed host capability are implemented; the platform-package shape and + protected runtime-projection type state are selected and implemented. The + fail-closed package loader exists but is disabled by a null release artifact + commitment; the platform package, native implementation, release integration, + and real-Windows proof do not exist, so all Windows controls remain unavailable + +## Context + +REA's experimental Windows x64 Ghidra boundary cannot establish three security +properties with Node's public filesystem and child-process APIs alone: + +- atomic process creation inside a dedicated kill-on-close Job Object; +- handle-based path admission that rejects disallowed reparse points and retains + stable file identity; and +- creation and readback verification of protected private DACLs. + +The existing fallback uses bounded `taskkill /T /F`, pathname-based Node file +operations, and POSIX mode requests. These are useful P0 mechanics, but they are +not evidence for the stronger Windows authority claims. + +REA installation must remain compiler-free. Setup may not install Visual +Studio Build Tools, Python, node-gyp, PowerShell modules, or another runtime. +The packed CLI is also verified with lifecycle scripts disabled, so native +support cannot depend on an install hook. + +## Decision drivers + +1. Keep Win32 handles, structures, constants, and calling conventions outside + domain, application, Ghidra, CLI, and MCP contracts. +2. Prevent target or launcher code from running before authority is established. +3. Work from an npm installation without a local compiler or install script. +4. Fail closed with typed capability diagnostics when the exact native artifact + is absent, unsupported, unreadable, or incompatible. +5. Preserve the current limited P0 behavior without allowing it to satisfy a + native-authority capability claim. +6. Verify the published artifact and the real Windows behavior independently. + +## Options considered + +### Source-built Node-API addon + +Rejected. It requires a compiler toolchain during installation or setup and +would make availability depend on mutable operator build state. + +### Source-owned helper executable + +Rejected. A helper adds an authenticated protocol, helper-process ownership, +version negotiation, output capture, and crash cleanup without improving the +executable identity binding: it must still call `CreateProcessW` with a path. +The addon can perform blocking Win32 waits and pipe reads on source-owned native +threads and cross into JavaScript only through public Node-API operations. + +### Prebuilt Windows Node-API addon in a platform package + +Selected. Node-API provides an ABI-stable interface for the +handle and DACL operations when the addon uses only Node-API/node-addon-api +rather than V8, libuv, or Node internals. Release CI builds the Windows x64 +artifacts. A platform-specific npm package declares +`os: ["win32"]` and `cpu: ["x64"]`; the main package references its exact +version as an optional dependency. Neither package has an install script or a +source-build fallback, and the platform package contains no helper executable. + +This follows the platform-package selection pattern used by mature native npm +packages while deliberately omitting their node-gyp fallback. It also fits +REA's existing package verifier, which exercises installs with scripts disabled +and with optional dependencies omitted. + +## Boundary + +The TypeScript side exposes one provider-neutral external-adapter port with +three cohesive capabilities: + +```text +ProviderProcess / PrivateRuntimeRoot / authorized file operations + | + WindowsNativeAuthority port + / | \ + owned process admitted handle sealed runtime + lifetime and identity projection + | + optional Windows x64 Node-API adapter package +``` + +The port returns typed observations and failures. It never returns raw Win32 +handles, pointers, SIDs, access masks, or platform DTOs. Resource values own an +explicit idempotent `close` operation; the composition root also registers an +environment cleanup hook as crash/teardown defense, not as the normal lifetime +API. + +The TypeScript port is an application-owned interface. Its operations are +limited to: + +- `admitPath`, returning an opaque, closeable admitted-file identity plus + normalized observations needed for policy decisions; +- `createPrivateRoot`, consuming admitted source trees/files and returning an + opaque, closeable sealed projection with manifest, entry-point, launch, and + verified owner/access-policy observations; and +- `spawnOwnedProcess`, consuming only that sealed projection plus stdio limits + and an absolute startup deadline, and returning provider-neutral process I/O + and lifetime operations. Source paths, executable identities, arguments, and + environment values cannot be supplied or changed at this boundary. + +Each operation returns the existing `Result` shape with a dedicated tagged +failure union covering unavailable capability, invalid input, policy rejection, +identity drift, access denial, resource exhaustion, timeout, native contract +mismatch, and unexpected native failure. No native adapter may export platform +DTOs directly to its callers. + +The application-owned contract lives in +`src/application/WindowsNativeAuthority.ts`. It fixes the public names +`WindowsNativeAuthority`, `WindowsAdmittedFile`, +`WindowsAdmittedDirectory`, `WindowsPrivateRoot`, and +`WindowsOwnedProcess`. Module-owned wrappers register backend tokens in a +shared weak registry and reject resources created by another authority +instance, aliased by another backend result, or already closing/closed. File +and directory admission are distinct types, so a +directory cannot be supplied as an executable and a file cannot be supplied as +the parent of a private root. The backend must continuously drain process +output and retain no more than the committed byte limits; callers receive +detached snapshots with retained bytes, total byte counts, and truncation +flags. Process completion and close are typed results, and every native +resource owns an explicit idempotent close operation. The built-in unavailable +implementation fails all three operations closed and reports no loaded +identity; the Windows capability report continues to advertise no native +authority. + +Successful path admission is deliberately narrower than an opaque native +identity string. The adapter must return the exact requested path, the +handle-derived final diagnostic path, the admitted `ntfs` filesystem tag, a +lowercase 16-hex-digit volume identity, a lowercase 32-hex-digit file identity, +and the regular-file digest where applicable. The volume identity is the +zero-padded hexadecimal representation of the unsigned `FILE_ID_INFO` +`VolumeSerialNumber` numeric value. The file identity is the lowercase +hexadecimal encoding of `FileId.Identifier[0]` through +`FileId.Identifier[15]` in array order. The composite identity is scoped to the +retained handle and admitted volume; it is not a durable global identifier and +must not authorize a later reopened object. + +The application boundary parses the runtime-shaped report, rejects unknown or +malformed fields, derives one canonical string encoding, and closes the +returned backend resource before reporting a native-contract mismatch. This +proves only the shape and canonical encoding of what the adapter reports. The +trusted native implementation and real-Windows verifier must separately prove +that the filesystem tag and identity bytes came from handle-based filesystem +inspection and `GetFileInformationByHandleEx(FileIdInfo)`. TypeScript schema +validation cannot prove Win32 provenance or prevent a malicious native module +from inventing well-shaped values. This is contract hardening only: it does not +implement `CreateFileW` traversal or make the host capability available. + +The sealed-root observation applies the same boundary discipline to #290. A +native result is not published as a `WindowsPrivateRoot` until the application +parses a strict readback report for five object classes: the root directory, +read-only directories, read-only files, writable directories, and writable +files. Each class commits its object kind, explicit-versus-inherited ACE +disposition, propagation flags, verified object count, descriptor digest, and +path-to-policy manifest digest. One enclosing security manifest binds all five +classes to both the sealed projection manifest and launch commitment. Its +versioned canonical input contains `version`, `projectionManifestSha256`, +`launchSha256`, and the five ordered class records, each limited to +`verifiedObjectCount` and `policyManifestSha256`. + +Root and existing immutable objects require explicit protected DACLs. Directory +policies distinguish inheritable container/object ACEs from non-propagating +leaf-file policies. Writable directories require an explicit protected policy; +files created beneath them report inherited ACEs from that protected parent. +Every class must state current-user ownership, no additional trustee or broad +allow entry, SYSTEM full control, and an explicit OWNER RIGHTS denial of +`WRITE_DAC` and `WRITE_OWNER`. Root and immutable objects admit only +current-user read/execute; writable objects admit current-user modify. Null +DACLs, unexpected fields, different rights, missing OWNER RIGHTS policy, +class/propagation contradictions, count or manifest mismatches, or malformed +digests poison and close the returned native token. + +These normalized values deliberately omit raw SIDs, ACEs, masks, and security +descriptor buffers. Schema acceptance proves only that the adapter reported the +selected policy vocabulary. The native implementation must create the +descriptors, read them back from retained handles, canonicalize trustee and +rights semantics, and prove the report against real non-administrator Windows +access tests. Until that implementation and verifier exist, private-DACL +capability remains unavailable. + +The native package remains unimplemented. The owner boundary, packaging shape, +and launch binding are accepted; capability availability still depends on the +projection and complete native teardown state machine below passing the +real-Windows adversarial verifier. + +The initial admission contract accepts only `reparsePolicy: "reject_all"` and +can report only `reparseDisposition: "absent"`. A later admitted reparse kind +must be added as an explicit normalized policy variant together with its real +Windows proof; the generic port does not provide an open-ended allow mode. + +The three implementation slices remain separate: + +1. **Job Object ownership (#288):** create a dedicated Job Object, apply + kill-on-close without silent breakaway, and create the launcher already + assigned through the process-creation attribute list. +2. **Handle-based filesystem authority (#289):** open authority-relevant path + components without following reparse points, admit an explicit filesystem + and reparse-tag set, retain or revalidate stable identity, and perform + sensitive I/O through that authority. +3. **Private runtime DACLs (#290):** create the root with a protected DACL, + verify owner/trustees/rights/inheritance by handle, and make all runtime + children inherit or receive the verified policy. + +#289 owns the shared handle and filesystem-identity primitives used by #290 and +the eventual launch binding consumed by #288. Job Object implementation follows +#289 and #290; it cannot satisfy or advertise the Windows native authority +boundary until the executable, runtime root, and session token are all +protected. + +The delivery order is #289, then #290, then #288. This lets process creation +consume an already verified executable identity and private runtime root. The +P0 limitations remain in force until all three real-Windows gates pass. + +`CreateProcessW` cannot consume the admitted file handle directly. A retained +path-component chain opened without write/delete sharing was evaluated and +rejected as a complete binding. It prevents later conflicting opens, rename, +and ordinary replacement, but it cannot revoke a writable mapped view created +before admission. Such a view can mutate the admitted bytes after hashing while +the writer's file handle is already closed. + +Protecting only the primary executable is also insufficient for the Windows +Ghidra launch. The current launcher includes the command interpreter, a batch +script, Java, Ghidra JARs, native libraries, configuration, and DLL search +inputs. A share lock on `lpApplicationName` does not bind that runtime closure. + +The selected design projects the complete non-system runtime into the private +root before process creation. Immutable-install admission is rejected: a BYO +Ghidra or JDK tree normally belongs to the same analyst identity that runs REA, +so that identity can replace content or rewrite its ACL. Treating such an +installation as immutable would silently narrow the threat boundary. + +The projection contains: + +- the complete Ghidra installation root, including root + `application.properties`, the `Ghidra/` module tree, JARs, native libraries, + launch properties, and configuration discovered by `GhidraClassLoader`; +- the complete admitted JDK 21 root; +- the packaged REA Ghidra bridge and session descriptor; and +- the digest-bound target snapshot plus private project, home, temporary, + cache, configuration, and data directories. + +The native adapter enumerates each admitted tree relative to retained directory +handles, rejects every reparse point and unsupported filesystem, admits only +regular files and directories, and applies explicit entry, depth, and byte +limits. It copies each file through handles into a newly created destination, +hashes the bytes while copying, closes and reopens the destination by handle, +and verifies the readback digest. A canonical sorted manifest of relative path, +file size, and SHA-256 is hashed into one runtime-projection identity. The +readback projection, not the mutable source installation, is intended to become +the launch authority. Concurrent source mutation may make projection fail or +produce a different committed snapshot. + +Read-only projected files and directories use a protected DACL that grants the +analyst read/execute and SYSTEM full control while withholding create, write, +append, delete, `WRITE_DAC`, and `WRITE_OWNER`. Because a file owner otherwise +has implicit DACL-rewrite authority, the descriptor includes an explicit +`OWNER RIGHTS` SID entry that withholds those mutation rights. Writable runtime +subdirectories use a separate verified policy and never contain executable, +classpath, or native-library inputs. Creation and readback of both policies +belong to #290. + +Applying that restrictive descriptor only after population is rejected. An +access check occurs when a handle is opened; later DACL changes do not revoke a +same-user process's previously granted write, delete, mapping, or `WRITE_DAC` +rights. The native implementation must therefore apply the final descriptor at +object creation or establish another proven construction principal/capability, +retain only non-inheritable construction handles, close every mutation-capable +handle before commit, and retain only non-mutating authority/cleanup handles. +Whether the selected non-administrator Win32 creation APIs can populate the +tree under its final descriptor remains an explicit native design/proof gap. +Until a real-Windows race proves that pre-open write, delete, `WRITE_DAC`, +directory-create, and writable-section handles cannot survive commit, REA does +not claim same-user immutability for the projection. #290 can establish privacy +against unrelated local principals without silently satisfying that stronger +same-user launch-authority requirement. + +Windows launches the projected JDK directly, without `cmd.exe`, +`analyzeHeadless.bat`, `launch.bat`, `LaunchSupport`, or another pre-authority +process. REA derives and validates the exact Ghidra 12.1.2 foreground headless +arguments from the supported launch contract: + +```text +\jdk\bin\java.exe + -cp \ghidra\Ghidra\Framework\Utility\lib\Utility.jar + ghidra.Ghidra ghidra.app.util.headless.AnalyzeHeadless +``` + +`lpApplicationName`, the classpath, script path, target, project, user, cache, +and temporary paths all resolve beneath the sealed projection. The current +directory is the sealed Ghidra root. The environment removes ambient Java and +Ghidra option variables and admits only the projected JDK `bin` plus the +canonical System32 directory into `PATH`. Java native-library paths are +enumerated from the projection manifest. The process-creation mitigation policy +rejects remote and low-integrity image loads and prefers System32 for system +images. The verifier must prove the exact supported Windows build honors these +mitigations; there is no weaker DLL-search fallback. + +Trusted inputs outside the projection are limited to the Windows kernel, +KnownDLLs, and binaries or DLLs resolved from the canonical Windows/System32 +roots under the supported non-administrator Windows installation. REA records +those roots and the applied mitigation policy in the native launch observation. + +The implemented TypeScript port represents the projection lifecycle as type +state: + +1. a mutable private-root builder accepts admitted source trees/files and + bounded destination-relative names; +2. sealing returns an immutable `WindowsRuntimeProjection` observation with the + readback tree digest and an opaque projected entry point; and +3. `spawnOwnedProcess` accepts only that sealed projection, rejecting a source + admission, mutable input, foreign authority, aliased backend token, or + closing/closed resource before crossing the native boundary. + +The projection API also commits entry, depth, and byte limits; the exact +read-only and writable subtrees; the Ghidra/JDK/bridge/target roles; and the +canonical environment and VM-argument inputs. These are provider-neutral +resource roles and observations, not Win32 DTOs. #289 owns handle-relative +projection and readback, #290 owns sealing and verified DACL state, and #288 +consumes only the sealed result. The port snapshots every mutable projection +and launch container before its first asynchronous boundary, leases all +source/projection capabilities across native calls, and poisons/cleans +malformed aliased root or process results before returning a contract mismatch. +Native package work must implement this sealed-projection contract and may not +reintroduce the older admitted-file spawn signature. + +The verifier must include a writable mapping established before admission, +hard-link alias writes, ordinary and POSIX-semantics delete/rename, reparse +substitution, DLL search substitution, post-admission changes to scripts, JARs, +native libraries, and configuration, owner attempts to rewrite the sealed DACL, +and attempts to inherit or duplicate REA's retained authority handles. It must +also prove that Ghidra starts after the original JDK and Ghidra trees are renamed +or modified, demonstrating that no original runtime byte is used after +projection. Network and other filesystems whose semantics cannot satisfy the +selected proof fail closed. No implementation may fall back to the original +unbound pathname or batch launcher. + +## Process I/O and lifetime mechanism + +The proposed process implementation is addon-only. Before the application +publishes a `WindowsOwnedProcess`, it strictly parses a normalized ownership +report requiring a dedicated unnamed Job Object, atomic +`PROC_THREAD_ATTRIBUTE_JOB_LIST` assignment, execution assigned at creation, +kill-on-close enabled, breakaway disabled, no admitted nested job, a retained +non-inheritable owner handle, exactly one REA-owned Job handle, stdio-only +inherited handles, and verified membership. The application derives the policy +digest from a versioned ordered projection of every normalized field; it does +not accept an opaque backend digest. A missing, malformed, broader, or unknown report +poisons the native token and closes the Job rather than degrading to +create-then-assign or `taskkill`. This validates only the adapter's report; the +native implementation and real-Windows verifier must prove the actual attribute +list, queried limits, membership, and descendant behavior. + +The single-owner-handle claim means the addon creates no internal duplicate and +retains only its one non-inheritable Job handle. An unnamed Job prevents a new +open by name, but it does not stop another process that can obtain +`PROCESS_DUP_HANDLE` access to REA from duplicating that handle. Consequently +last-handle kill-on-close is claimed only against processes outside that handle- +theft boundary. Same-user handle theft remains unproven unless the native design +can protect the REA process handle and the verifier demonstrates failed +duplication attempts; it is not implied by the normalized report. + +One native resource owns the Job Object, process/thread handles, anonymous-pipe +endpoints, wait state, bounded output accumulators, and its reader/wait threads. +The launch sequence creates +non-inheritable parent pipe ends and supplies only the three intended child +stdio handles through `PROC_THREAD_ATTRIBUTE_HANDLE_LIST`. Both the handle-list +and job-list attributes are installed in one correctly sized attribute list; +`bInheritHandles` is true as required by the handle-list contract, while every +unlisted native handle remains non-inheritable. + +The parent closes its duplicates of the child pipe ends immediately after +`CreateProcessW` returns. Reader threads exclusively own the remaining parent +read handles. + +Dedicated native reader threads continuously drain stdout and stderr regardless +of JavaScript consumption. Each accumulator records an overflow-checked total +byte count while retaining at most its committed byte limit. `snapshot()` copies +the retained prefix into new Node buffers; no external buffer aliases native +storage. A native wait thread observes process completion. Promise completion +crosses to the main thread through a size-one Node-API `ThreadSafeFunction` +using nonblocking calls; an already queued exit notification is coalesced rather +than blocking a native thread. Native threads acquire and release the TSFN and +never call V8, libuv, or JavaScript directly. `waitForExit` cancellation removes +only that waiter and cannot release the Job Object. + +Normal `close` is idempotent: transition once to closing and close the Job Object +to trigger kill-on-close. Process termination closes every inherited pipe write +end, allowing readers to drain retained tail bytes and receive EOF. If a reader +has not exited by the cleanup deadline, call `CancelSynchronousIo` with that +reader's thread handle; never close a read handle from underneath a synchronous +`ReadFile`. Join each reader before closing its read handle or freeing its +accumulator. A timeout keeps native state owned until all threads have exited; +it cannot detach or free live reader state. + +Environment teardown first aborts the TSFN. Every reader/wait thread stops +calling it on `napi_closing`, releases its acquisition, and exits. An +`napi_add_async_cleanup_hook` joins native threads without blocking the +JavaScript thread; native state is freed only after both async cleanup and the +TSFN finalizer have completed. Pending promises may be abandoned only after +JavaScript execution is unavailable. Object finalization requests the same +state transition but does not independently free state or silently detach a +live job. + +## Packaging and loading contract + +- Support is initially exact to Windows 10 / Windows Server 2016 or newer on + x64, and the Node ranges declared by the main package. Runtime loading probes + the required process-attribute APIs and fails closed; there is no suspended or + post-creation Job assignment fallback. +- Release CI builds from source and publishes the platform package before the + matching main package version. +- The main package pins the optional dependency to the exact same version. +- npm package integrity is the installation authenticity boundary. Release CI + writes the platform artifact SHA-256 into the version-matched main package's + generated metadata before publication. REA must compare that pinned value + with the addon bytes immediately before loading, require the exact package, + version, contract, Node-API level, and export set, and record the loaded + identity for diagnostics. Before first load, the process-global loader rejects + an existing `require.cache` entry for the exact canonical resolved addon path. + After acceptance it pins the returned module object, canonical path, and + identity for the process lifetime: a repeat request for that same tuple is + idempotent, while a different observable path or identity is rejected. Alias + loads and native images that are not observable through that exact JavaScript + loader entry belong to the excluded pre-existing same-user boundary; the + loader does not claim process-wide native-image enumeration. +- The addon bootstrap has a deliberately narrower threat boundary than the + runtime projection it creates. REA loads and validates the addon before it + starts Hopper, Ghidra, a target, or another provider-controlled process. npm + integrity plus the release-generated digest detects package drift, but a + hash-path-`require` handshake cannot prevent an already-running process under + the same Windows user from replacing bytes between verification and native + image mapping, restoring them afterward, injecting into REA, or preloading a + cache entry. REA does not claim resistance to that pre-existing same-user + bootstrap attacker. This is consistent with the separately documented + unproven same-user Job-handle theft boundary; it is not evidence for runtime + projection immutability. +- After the bootstrap-accepted addon is loaded, #289/#290 must project every + non-system byte that a provider or target can cause REA to execute or read as + authority, including Ghidra, the JDK, bridge/session inputs, target snapshot, + and runtime configuration. At the composition root, a bootstrap failure must + occur before a Hopper/Ghidra/provider client is constructed, a target is + opened or admitted, or provider/target code is run. After bootstrap succeeds, + no provider or target process may start before the complete projection is + sealed. Ordinary side-effect-free JavaScript module evaluation is not part of + that execution claim. The addon itself remains bound to the installed npm + release and is not recursively required to project itself before loading. +- A future claim that includes hostile pre-existing same-user processes needs a + different bootstrap, such as a signed separately protected launcher or a + native main executable. That stronger boundary is outside #287–#290 and must + not be inferred from package hashing or DACL readback. +- Runtime selection admits only the expected package, platform, architecture, + Node-API version, native contract version, and exported operation set. +- Missing optional dependencies, `--omit=optional`, unsupported filesystems, + nested-job conflicts, or native load failures produce typed unavailable + outcomes. They never trigger node-gyp, a download, PowerShell, `icacls`, or a + helper fallback. +- The current `taskkill` and pathname implementations remain explicitly limited + fallbacks and cannot set the native authority capability flags. + +## Verification + +Package verification must prove: + +- ordinary packed installation selects the exact Windows x64 package; +- installation with scripts disabled performs no build or download; +- omission or removal of optional dependencies fails closed with actionable + doctor output; +- registry/package-lock integrity authenticates the installed package set, + while the main-package metadata digest independently detects runtime artifact + drift and release-pair mismatch without acting as another signature; +- the exact main/platform version pair and platform-tarball/addon digest match + before native evaluation; +- digest, package, version, contract, Node-API, or manifest-declared export-set + mismatch prevents addon evaluation and leaves provider construction, target + admission, and provider/target launch counts at zero; an actual runtime export + or identity mismatch is detected immediately after evaluation and prevents + backend use, provider construction, target admission, and provider/target + launch; +- an exact resolved path already present in `require.cache` is rejected before + use, a second load of the pinned tuple is idempotent, and another observable + path or identity is rejected; +- unsupported or omitted packages never probe provider or target paths and + return the typed unavailable outcome; +- a successful bootstrap is followed by a sealed complete projection before + direct projected-Java launch; and +- the published main and platform packages resolve as one release set. + +Neither package verification nor the real proof may claim survival when a +same-user attacker can replace both the main metadata and platform package, +inject into REA, or preload an alias outside the exact observable cache entry. +Real proof output must retain this bootstrap limitation after #289/#290 pass. + +The self-hosted real-Windows verifier must separately prove the acceptance +criteria in #288, #289, and #290 while running as a non-administrator. Mocked +Node tests may verify TypeScript routing and failure translation but cannot +satisfy Job Object, reparse-point, file-identity, or DACL claims. + +## Consequences + +- Releases gain a coordinated Windows platform package and Windows build job. +- Installing without optional dependencies keeps the CLI usable but leaves the + stronger Windows authority unavailable. +- The native surface remains deliberately small and security-specific. +- Native reader threads add a small, explicit concurrency surface, but keep + output progress independent of JavaScript scheduling and preserve the public + Node-API ABI boundary. + +## Research basis + +- Node-API documentation states that ABI stability requires exclusive use of + Node-API/node-addon-api and excludes direct V8, libuv, and Node internals. +- `node-pty` demonstrates a public Node-API `ThreadSafeFunction` carrying a + Windows process-exit observation from a native wait thread. REA adopts the + thread-delivery pattern, not its process-tree enumeration or install-time + native build/copy workflow. +- `sharp` demonstrates platform-specific optional npm packages selected with + `os`/`cpu` metadata. REA adopts that distribution shape but not its + source-compilation fallback. +- `better-sqlite3` demonstrates broad prebuilt coverage, but its + prebuild-install-to-node-gyp fallback conflicts with REA's compiler-free + installation rule. + +These external repository summaries are discovery evidence. The implementation +must still be verified against current Node-API, npm, Win32, repository source, +package artifacts, and the real Windows runner. diff --git a/docs/adr/README.md b/docs/adr/README.md index 5c2ea750c8..ad28863c51 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -9,3 +9,4 @@ states its implementation status separately. | [0001: Provider selection and analysis profiles](0001-provider-selection-and-analysis-profiles.md) | Accepted | Foundation shipped; capability work continues | | [0002: Controlled JavaScript replay authority and sandbox policy](0002-controlled-replay-authority-and-sandbox.md) | Accepted | Linux x86_64 extracted-module replay shipped | | [0003: Managed-code evidence and provider boundary](0003-managed-code-evidence-and-provider-boundary.md) | Accepted | PE/CLI triage shipped; deeper contracts planned | +| [0004: Windows native authority packaging](0004-windows-native-authority-packaging.md) | Proposed | Design only; P0 limitations remain | diff --git a/docs/product-catalog.json b/docs/product-catalog.json index 2afa2d4384..be914edc9d 100644 --- a/docs/product-catalog.json +++ b/docs/product-catalog.json @@ -8,7 +8,7 @@ "client": "2.0.0-beta.4", "core": "2.0.0-beta.4" }, - "skill_version": "21" + "skill_version": "22" }, "tools": { "total": 95, @@ -566,10 +566,10 @@ "mcp_resource_templates": 8 }, "digests": { - "tools_sha256": "4f19c5773a44980e176978f05626f2d82c95d49e4b86d024ce515c3ff1670bae", + "tools_sha256": "28aad2ec69ca46ce9107fa49bff07768d91f194b602f1f32059352e61eb6c19f", "prompts_sha256": "f6da3ad38a1000c11364d1710f122ac4990551f04efd8c53ffb2e819b5cf5707", "resources_sha256": "5dca0fcdad3e78d71a1b6ef7b4f0c12bdcd8e3ec11fcbdd9ccd3a68edadf5c80", - "combined_sha256": "b6840d7c79ffdfe8a2ef65fb66c1694f3631bacbc22a0456abbe12aca2d53969" + "combined_sha256": "266ea209ddc79eaf85d7ad160e8d3c8ce55cfda6d4b2ca1abb2e4554a914cfd1" } } } diff --git a/package.json b/package.json index be8ed139ca..63c06de04b 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,14 @@ "node": "^22.19.0 || >=24.11.0" }, "packageManager": "npm@11.16.0", + "rea": { + "windowsNativeAuthority": { + "packageName": "@rea/windows-x64", + "contractVersion": 1, + "nodeApiVersion": 9, + "artifactSha256": null + } + }, "files": [ "dist", "install.sh", diff --git a/scripts/generate-package-metadata.mjs b/scripts/generate-package-metadata.mjs index 945d392ddf..487ac6ca03 100644 --- a/scripts/generate-package-metadata.mjs +++ b/scripts/generate-package-metadata.mjs @@ -30,6 +30,16 @@ const versionOf = (name) => { throw new Error(`Missing locked ${name} version`); return value; }; +const windowsNativeAuthority = packageJson.rea?.windowsNativeAuthority; +if ( + typeof windowsNativeAuthority?.packageName !== "string" || + !Number.isInteger(windowsNativeAuthority.contractVersion) || + !Number.isInteger(windowsNativeAuthority.nodeApiVersion) || + (windowsNativeAuthority.artifactSha256 !== null && + (typeof windowsNativeAuthority.artifactSha256 !== "string" || + !/^[0-9a-f]{64}$/u.test(windowsNativeAuthority.artifactSha256))) +) + throw new Error("Invalid Windows native authority package metadata"); const source = `/** Generated from package.json and package-lock.json; do not edit. */ export const PACKAGE_METADATA = { name: ${JSON.stringify(packageJson.name)}, @@ -38,6 +48,13 @@ export const PACKAGE_METADATA = { clientSdkVersion: ${JSON.stringify(versionOf("@modelcontextprotocol/client"))}, coreSdkVersion: ${JSON.stringify(versionOf("@modelcontextprotocol/core"))}, skillVersion: ${JSON.stringify(skillVersion)}, + windowsNativeAuthority: { + packageName: ${JSON.stringify(windowsNativeAuthority.packageName)}, + packageVersion: ${JSON.stringify(packageJson.version)}, + contractVersion: ${JSON.stringify(windowsNativeAuthority.contractVersion)}, + nodeApiVersion: ${JSON.stringify(windowsNativeAuthority.nodeApiVersion)}, + artifactSha256: ${JSON.stringify(windowsNativeAuthority.artifactSha256)}, + }, } as const; `; const outputPath = join(root, "src/generatedPackageMetadata.ts"); diff --git a/src/application/CapabilityInventory.ts b/src/application/CapabilityInventory.ts index 1ec2b05e3b..69f79a7827 100644 --- a/src/application/CapabilityInventory.ts +++ b/src/application/CapabilityInventory.ts @@ -25,6 +25,37 @@ export type ToolAvailabilityReason = | "unsupported_host" | "policy_disabled"; +type ToolKind = (typeof TOOL_CONTRACTS)[number]["kind"]; +type ProviderDescriptor = { + readonly available: boolean; + readonly reason: string | null; +}; +type AvailabilityPolicy = { + readonly processCaptureEnabled: boolean; + readonly evidenceFileRoots: number; + readonly browserObservationEnabled?: boolean; + readonly electronObservationEnabled?: boolean; + readonly javascriptReplayEnabled?: boolean; + readonly managedRuntimeEnabled?: boolean; +}; +type Availability = { + readonly reason: ToolAvailabilityReason; + readonly remediation: string | null; +}; +type AvailabilityContext = { + readonly name: string; + readonly kind: ToolKind; + readonly targetOpen: boolean; + readonly targetKind: + | "executable" + | "database" + | "archive" + | "artifact" + | undefined; + readonly descriptors: ReadonlyMap; + readonly policy: AvailabilityPolicy; +}; + const ENHANCED_REQUIREMENTS: Readonly> = { swift_classes: ["list_procedures"], get_objc_classes: ["list_names"], @@ -51,28 +82,21 @@ const ENHANCED_REQUIREMENTS: Readonly> = { /** Build stable per-operation availability without hiding familiar tools. */ export const buildCapabilityInventory = ( sessionStatus: JsonValue, - policy: { - readonly processCaptureEnabled: boolean; - readonly evidenceFileRoots: number; - readonly browserObservationEnabled?: boolean; - readonly electronObservationEnabled?: boolean; - readonly javascriptReplayEnabled?: boolean; - readonly managedRuntimeEnabled?: boolean; - }, + policy: AvailabilityPolicy, ) => { const status = statusSchema.parse(sessionStatus); const descriptors = new Map( status.capabilities.map((descriptor) => [descriptor.operation, descriptor]), ); return TOOL_CONTRACTS.map((contract) => { - const availability = availabilityFor( - contract.name, - contract.kind, - status.open, - status.kind, + const availability = availabilityFor({ + name: contract.name, + kind: contract.kind, + targetOpen: status.open, + targetKind: status.kind, descriptors, policy, - ); + }); return { name: contract.name, surface: contract.kind, @@ -90,27 +114,19 @@ export const buildCapabilityInventory = ( }).sort((left, right) => left.name.localeCompare(right.name)); }; -const availabilityFor = ( - name: string, - kind: (typeof TOOL_CONTRACTS)[number]["kind"], - targetOpen: boolean, - targetKind: "executable" | "database" | "archive" | "artifact" | undefined, - descriptors: ReadonlyMap< - string, - { readonly available: boolean; readonly reason: string | null } - >, - policy: { - readonly processCaptureEnabled: boolean; - readonly evidenceFileRoots: number; - readonly browserObservationEnabled?: boolean; - readonly electronObservationEnabled?: boolean; - readonly javascriptReplayEnabled?: boolean; - readonly managedRuntimeEnabled?: boolean; - }, -): { - readonly reason: ToolAvailabilityReason; - readonly remediation: string | null; -} => { +const availabilityFor = (context: AvailabilityContext): Availability => { + const policyDecision = policyAvailability(context); + if (policyDecision !== null) return policyDecision; + const targetDecision = targetAvailability(context); + if (targetDecision !== null) return targetDecision; + return providerAvailability(context); +}; + +const policyAvailability = ({ + name, + kind, + policy, +}: AvailabilityContext): Availability | null => { if (name === "capture_process_scenario" && !policy.processCaptureEnabled) return { reason: "policy_disabled", @@ -159,6 +175,14 @@ const availabilityFor = ( "Enable Electron observation and configure a loopback CDP endpoint and canonical file roots.", }; if (kind === "session") return { reason: "available", remediation: null }; + return null; +}; + +const targetAvailability = ({ + kind, + targetKind, + targetOpen, +}: AvailabilityContext): Availability | null => { if (!targetOpen) return { reason: "target_required", @@ -175,6 +199,14 @@ const availabilityFor = ( remediation: "Inventory or extract a native executable, then call open_binary on that executable.", }; + return null; +}; + +const providerAvailability = ({ + descriptors, + kind, + name, +}: AvailabilityContext): Availability => { if (kind === "enhanced") return composedAvailability(name, descriptors); const descriptor = descriptors.get(name); if (descriptor === undefined) diff --git a/src/application/WindowsCapabilities.ts b/src/application/WindowsCapabilities.ts index 401e58b1ce..f13cbc993d 100644 --- a/src/application/WindowsCapabilities.ts +++ b/src/application/WindowsCapabilities.ts @@ -21,6 +21,7 @@ export interface WindowsCapabilityDependencies { probeSymlinkCreation(): Promise; probeNoFollowOpen(): WindowsCapabilityOutcome; probePrivateAcl(): WindowsCapabilityOutcome; + probeNativeAuthority(): WindowsCapabilityOutcome; probeUnixDomainSocket(): WindowsCapabilityOutcome; probePty(): Promise; } @@ -33,6 +34,7 @@ export interface WindowsCapabilityReport { symlink_creation: WindowsCapabilityOutcome; no_follow_open: WindowsCapabilityOutcome; private_acl: WindowsCapabilityOutcome; + native_authority: WindowsCapabilityOutcome; unix_domain_socket: WindowsCapabilityOutcome; pty: WindowsCapabilityOutcome; }>; @@ -53,6 +55,7 @@ export const probeWindowsCapabilities = async ( symlink_creation: symlinkCreation, no_follow_open: dependencies.probeNoFollowOpen(), private_acl: dependencies.probePrivateAcl(), + native_authority: dependencies.probeNativeAuthority(), unix_domain_socket: dependencies.probeUnixDomainSocket(), pty: { available: pty.available, @@ -67,16 +70,16 @@ const systemDependencies = (): WindowsCapabilityDependencies => ({ architecture: process.arch, probeSymlinkCreation, probeNoFollowOpen: () => - typeof constants.O_NOFOLLOW === "number" - ? { available: true, reason: null } - : { - available: false, - reason: "O_NOFOLLOW is unavailable in this Node runtime", - }, + systemNoFollowOpenCapability(process.platform, constants.O_NOFOLLOW), probePrivateAcl: () => ({ available: false, reason: "Windows ACL enforcement is not implemented by this REA build", }), + probeNativeAuthority: () => ({ + available: false, + reason: + "Windows native authority package is not implemented by this REA build", + }), probeUnixDomainSocket: () => process.platform === "win32" ? { @@ -87,6 +90,24 @@ const systemDependencies = (): WindowsCapabilityDependencies => ({ probePty: probeProcessCaptureCapability, }); +/** Report pathname no-follow support without treating it as Windows authority. */ +export const systemNoFollowOpenCapability = ( + platform: NodeJS.Platform, + noFollow: number | undefined, +): WindowsCapabilityOutcome => { + if (platform === "win32") + return { + available: false, + reason: "Windows reparse-safe handle admission is not implemented", + }; + return typeof noFollow === "number" + ? { available: true, reason: null } + : { + available: false, + reason: "O_NOFOLLOW is unavailable in this Node runtime", + }; +}; + const probeSymlinkCreation = async (): Promise => { const root = await mkdtemp(join(tmpdir(), "rea-symlink-probe-")); const target = join(root, "target"); @@ -106,6 +127,11 @@ const probeSymlinkCreation = async (): Promise => { : "symlink creation failed", }; } finally { - await rm(root, { recursive: true, force: true }); + try { + await rm(root, { recursive: true, force: true }); + } catch { + // Cleanup failure must not replace the machine-readable probe outcome. + // The probe root lives beneath the OS temporary directory and is unique. + } } }; diff --git a/src/application/WindowsNativeAuthority.ts b/src/application/WindowsNativeAuthority.ts new file mode 100644 index 0000000000..d93940663d --- /dev/null +++ b/src/application/WindowsNativeAuthority.ts @@ -0,0 +1,1379 @@ +import { createHash } from "node:crypto"; + +import { err, ok, type Result } from "../domain/result.js"; +import { z } from "zod"; + +/** Stable operation names exposed by the Windows native authority boundary. */ +export type WindowsNativeAuthorityOperation = + | "load_native_authority" + | "admit_path" + | "create_private_root" + | "spawn_owned_process" + | "observe_process" + | "wait_for_exit" + | "close_resource"; + +/** Expected failures translated from the optional native adapter boundary. */ +export type WindowsNativeAuthorityFailureReason = + | "unavailable" + | "invalid_input" + | "policy_rejected" + | "identity_drift" + | "access_denied" + | "resource_exhausted" + | "timeout" + | "cancelled" + | "native_contract_mismatch" + | "native_failure"; + +/** Provider-neutral failure from one Windows native authority operation. */ +export class WindowsNativeAuthorityError extends Error { + readonly _tag = "WindowsNativeAuthorityError" as const; + + constructor( + readonly operation: WindowsNativeAuthorityOperation, + readonly reason: WindowsNativeAuthorityFailureReason, + message: string, + options?: ErrorOptions, + ) { + super(message, options); + } +} + +/** Loaded native contract identity used for package and capability diagnostics. */ +export interface WindowsNativeAuthorityIdentity { + readonly packageName: string; + readonly packageVersion: string; + readonly contractVersion: number; + readonly nodeApiVersion: number; + readonly artifactSha256: string; +} + +/** Cancellation and one absolute deadline shared by every startup phase. */ +export interface WindowsNativeOperationControl { + readonly deadlineMs: number; + readonly signal?: AbortSignal; +} + +/** Input for atomic path admission under the initial fail-closed policy. */ +export interface WindowsPathAdmissionInput< + TKind extends "file" | "directory" = "file" | "directory", +> extends WindowsNativeOperationControl { + readonly path: string; + readonly kind: TKind; + readonly reparsePolicy: "reject_all"; + readonly expectedSha256?: string; +} + +interface WindowsAdmittedPathObservation { + readonly kind: TKind; + readonly requestedPath: string; + readonly finalPath: string; + readonly filesystem: "ntfs"; + readonly volumeIdentity: string; + readonly fileIdentity: string; + readonly stableIdentity: string; + readonly reparseDisposition: "absent"; +} + +/** Backend observation for a handle-admitted regular file. */ +export interface WindowsAdmittedFileObservation + extends WindowsAdmittedPathObservation<"file"> { + readonly sha256: string; +} + +/** Backend observation for a handle-admitted directory. */ +export interface WindowsAdmittedDirectoryObservation + extends WindowsAdmittedPathObservation<"directory"> { + readonly sha256: null; +} + +const windowsPathIdentitySchema = z.strictObject({ + requestedPath: z.string().min(1), + finalPath: z.string().min(1), + filesystem: z.literal("ntfs"), + volumeIdentity: z.string().regex(/^[0-9a-f]{16}$/u), + fileIdentity: z.string().regex(/^[0-9a-f]{32}$/u), + reparseDisposition: z.literal("absent"), +}); + +const admittedFileObservationSchema = windowsPathIdentitySchema.extend({ + kind: z.literal("file"), + sha256: z.string().regex(/^[0-9a-f]{64}$/u), +}); + +const admittedDirectoryObservationSchema = windowsPathIdentitySchema.extend({ + kind: z.literal("directory"), + sha256: z.null(), +}); + +const privateDaclObservationSchema = z.strictObject({ + objectKind: z.enum(["directory", "file"]), + owner: z.literal("current_user"), + dacl: z.literal("present"), + protection: z.enum(["protected", "inherited_from_protected_parent"]), + aceDisposition: z.enum(["explicit", "inherited"]), + propagation: z.enum(["none", "container_and_object"]), + additionalTrustees: z.literal("absent"), + broadAllowEntries: z.literal("absent"), + currentUserRights: z.enum(["read_execute", "modify"]), + systemRights: z.literal("full_control"), + ownerRights: z.literal("write_dac_write_owner_denied"), + descriptorSha256: z.string().regex(/^[0-9a-f]{64}$/u), + verifiedObjectCount: z.number().int().nonnegative(), + policyManifestSha256: z.string().regex(/^[0-9a-f]{64}$/u), +}); + +const explicitPolicySchema = privateDaclObservationSchema.extend({ + protection: z.literal("protected"), + aceDisposition: z.literal("explicit"), +}); + +const rootDirectoryPolicySchema = explicitPolicySchema.extend({ + objectKind: z.literal("directory"), + propagation: z.literal("none"), + currentUserRights: z.literal("read_execute"), + verifiedObjectCount: z.literal(1), +}); + +const readonlyDirectoryPolicySchema = explicitPolicySchema.extend({ + objectKind: z.literal("directory"), + propagation: z.literal("container_and_object"), + currentUserRights: z.literal("read_execute"), +}); + +const readonlyFilePolicySchema = explicitPolicySchema.extend({ + objectKind: z.literal("file"), + propagation: z.literal("none"), + currentUserRights: z.literal("read_execute"), +}); + +const writableDirectoryPolicySchema = explicitPolicySchema.extend({ + objectKind: z.literal("directory"), + propagation: z.literal("container_and_object"), + currentUserRights: z.literal("modify"), +}); + +const writableFilePolicySchema = privateDaclObservationSchema.extend({ + objectKind: z.literal("file"), + protection: z.literal("inherited_from_protected_parent"), + aceDisposition: z.literal("inherited"), + propagation: z.literal("none"), + currentUserRights: z.literal("modify"), +}); + +const privateRootObservationSchema = z.strictObject({ + canonicalPath: z.string().min(1), + stableIdentity: z.string().min(1), + state: z.literal("sealed"), + manifestSha256: z.string().regex(/^[0-9a-f]{64}$/u), + launchSha256: z.string().regex(/^[0-9a-f]{64}$/u), + fileCount: z.number().int().nonnegative(), + directoryCount: z.number().int().nonnegative(), + totalBytes: z.number().int().nonnegative(), + entrypoint: z.strictObject({ + relativePath: z.string().min(1), + sha256: z.string().regex(/^[0-9a-f]{64}$/u), + stableIdentity: z.string().min(1), + }), + security: z.strictObject({ + manifestSha256: z.string().regex(/^[0-9a-f]{64}$/u), + rootDirectory: rootDirectoryPolicySchema, + readonlyDirectories: readonlyDirectoryPolicySchema, + readonlyFiles: readonlyFilePolicySchema, + writableDirectories: writableDirectoryPolicySchema, + writableFiles: writableFilePolicySchema, + }), +}); + +const jobOwnershipObservationSchema = z.strictObject({ + jobObject: z.literal("dedicated_unnamed"), + assignment: z.literal("proc_thread_attribute_job_list"), + processExecution: z.literal("job_assigned_at_creation"), + killOnJobClose: z.literal("enabled"), + breakaway: z.literal("disabled"), + nestedJob: z.literal("absent"), + ownerHandle: z.literal("retained_non_inheritable"), + jobHandleOwnership: z.literal("single_rea_handle"), + inheritedHandles: z.literal("stdio_only"), + membership: z.literal("verified"), +}); + +const ownedProcessExitSchema = z.strictObject({ + status: z.enum(["exited", "terminated"]), + exitCode: z.number().int().nullable(), +}); + +const ownedProcessCloseSchema = z.strictObject({ + status: z.enum(["already_empty", "terminated"]), +}); + +const ownedProcessStreamSnapshotSchema = z.strictObject({ + retained: z.instanceof(Uint8Array), + totalBytes: z.number().int().nonnegative(), + truncated: z.boolean(), +}); + +const ownedProcessSnapshotSchema = z.strictObject({ + stdout: ownedProcessStreamSnapshotSchema, + stderr: ownedProcessStreamSnapshotSchema, + exit: ownedProcessExitSchema.nullable(), +}); + +/** Verified provider-neutral policy observations for a private runtime root. */ +export interface WindowsPrivateDaclObservation { + readonly objectKind: "directory" | "file"; + readonly owner: "current_user"; + readonly dacl: "present"; + readonly protection: "protected" | "inherited_from_protected_parent"; + readonly aceDisposition: "explicit" | "inherited"; + readonly propagation: "none" | "container_and_object"; + readonly additionalTrustees: "absent"; + readonly broadAllowEntries: "absent"; + readonly currentUserRights: "read_execute" | "modify"; + readonly systemRights: "full_control"; + readonly ownerRights: "write_dac_write_owner_denied"; + readonly descriptorSha256: string; + readonly verifiedObjectCount: number; + readonly policyManifestSha256: string; +} + +/** Exact normalized DACL policies read back from a sealed runtime tree. */ +export interface WindowsPrivateRootSecurityObservation { + readonly manifestSha256: string; + readonly rootDirectory: WindowsPrivateDaclObservation & { + readonly objectKind: "directory"; + readonly protection: "protected"; + readonly aceDisposition: "explicit"; + readonly propagation: "none"; + readonly currentUserRights: "read_execute"; + readonly verifiedObjectCount: 1; + }; + readonly readonlyDirectories: WindowsPrivateDaclObservation & { + readonly objectKind: "directory"; + readonly protection: "protected"; + readonly aceDisposition: "explicit"; + readonly propagation: "container_and_object"; + readonly currentUserRights: "read_execute"; + }; + readonly readonlyFiles: WindowsPrivateDaclObservation & { + readonly objectKind: "file"; + readonly protection: "protected"; + readonly aceDisposition: "explicit"; + readonly propagation: "none"; + readonly currentUserRights: "read_execute"; + }; + readonly writableDirectories: WindowsPrivateDaclObservation & { + readonly objectKind: "directory"; + readonly protection: "protected"; + readonly aceDisposition: "explicit"; + readonly propagation: "container_and_object"; + readonly currentUserRights: "modify"; + }; + readonly writableFiles: WindowsPrivateDaclObservation & { + readonly objectKind: "file"; + readonly protection: "inherited_from_protected_parent"; + readonly aceDisposition: "inherited"; + readonly propagation: "none"; + readonly currentUserRights: "modify"; + }; +} + +/** Verified provider-neutral policy observations for a private runtime root. */ +export interface WindowsPrivateRootObservation { + readonly canonicalPath: string; + readonly stableIdentity: string; + readonly state: "sealed"; + readonly manifestSha256: string; + readonly launchSha256: string; + readonly fileCount: number; + readonly directoryCount: number; + readonly totalBytes: number; + readonly entrypoint: Readonly<{ + relativePath: string; + sha256: string; + stableIdentity: string; + }>; + readonly security: WindowsPrivateRootSecurityObservation; +} + +/** Hard bounds applied while projecting admitted runtime inputs. */ +export interface WindowsRuntimeProjectionLimits { + readonly entries: number; + readonly depth: number; + readonly bytes: number; +} + +/** One admitted directory tree assigned a provider-neutral runtime role. */ +export interface WindowsRuntimeTreeProjection { + readonly role: "ghidra" | "jdk"; + readonly source: WindowsAdmittedDirectory; + readonly destination: string; +} + +/** One admitted file assigned a provider-neutral runtime role. */ +export interface WindowsRuntimeFileProjection { + readonly role: "bridge" | "session" | "target"; + readonly source: WindowsAdmittedFile; + readonly destination: string; +} + +/** Immutable bounds applied before an owned process is started. */ +export interface WindowsOwnedProcessLimits { + readonly stdoutBytes: number; + readonly stderrBytes: number; +} + +/** Final process observation independent of Win32 status structures. */ +export interface WindowsOwnedProcessExit { + readonly status: "exited" | "terminated"; + readonly exitCode: number | null; +} + +/** Normalized Job Object policy proven before an owned process is returned. */ +export interface WindowsJobOwnershipObservation { + readonly jobObject: "dedicated_unnamed"; + readonly assignment: "proc_thread_attribute_job_list"; + readonly processExecution: "job_assigned_at_creation"; + readonly killOnJobClose: "enabled"; + readonly breakaway: "disabled"; + readonly nestedJob: "absent"; + readonly ownerHandle: "retained_non_inheritable"; + readonly jobHandleOwnership: "single_rea_handle"; + readonly inheritedHandles: "stdio_only"; + readonly membership: "verified"; + readonly policySha256: string; +} + +/** Idempotent close observation for a dedicated process Job Object. */ +export interface WindowsOwnedProcessClose { + readonly status: "already_empty" | "terminated"; +} + +/** One continuously drained stream with bounded retained bytes. */ +export interface WindowsOwnedProcessStreamSnapshot { + readonly retained: Uint8Array; + readonly totalBytes: number; + readonly truncated: boolean; +} + +/** Detached bounded output and exit observations for one owned process. */ +export interface WindowsOwnedProcessSnapshot { + readonly stdout: WindowsOwnedProcessStreamSnapshot; + readonly stderr: WindowsOwnedProcessStreamSnapshot; + readonly exit: WindowsOwnedProcessExit | null; +} + +/** Adapter-private resource token; application callers never receive it. */ +export interface WindowsNativeBackendResource { + close(): Promise>; +} + +/** Adapter-private process token with continuously drained bounded output. */ +export interface WindowsNativeBackendProcess + extends WindowsNativeBackendResource { + readonly processId: number; + readonly ownership: unknown; + snapshot(): WindowsOwnedProcessSnapshot; + waitForExit( + signal?: AbortSignal, + ): Promise>; + closeProcess(): Promise< + Result + >; +} + +/** Backend result for one newly admitted file. */ +export interface WindowsNativeAdmittedFile { + readonly resource: WindowsNativeBackendResource; + readonly observation: unknown; +} + +/** Backend result for one newly admitted directory. */ +export interface WindowsNativeAdmittedDirectory { + readonly resource: WindowsNativeBackendResource; + readonly observation: unknown; +} + +/** Backend result for one newly created private root. */ +export interface WindowsNativePrivateRoot { + readonly resource: WindowsNativeBackendResource; + readonly observation: unknown; +} + +/** Adapter-private admitted tree without application wrapper values. */ +export interface WindowsNativeRuntimeTreeProjection { + readonly role: WindowsRuntimeTreeProjection["role"]; + readonly source: WindowsNativeBackendResource; + readonly destination: string; +} + +/** Adapter-private admitted file without application wrapper values. */ +export interface WindowsNativeRuntimeFileProjection { + readonly role: WindowsRuntimeFileProjection["role"]; + readonly source: WindowsNativeBackendResource; + readonly destination: string; +} + +/** Narrow contract implemented by the optional platform package. */ +export interface WindowsNativeAuthorityBackend { + readonly identity: WindowsNativeAuthorityIdentity | null; + admitFile( + input: WindowsPathAdmissionInput<"file">, + ): Promise>; + admitDirectory( + input: WindowsPathAdmissionInput<"directory">, + ): Promise< + Result + >; + createPrivateRoot( + input: Readonly<{ + parent: WindowsNativeBackendResource; + prefix: string; + trees: readonly WindowsNativeRuntimeTreeProjection[]; + files: readonly WindowsNativeRuntimeFileProjection[]; + writableDirectories: readonly string[]; + entrypoint: Readonly<{ + treeRole: "jdk"; + relativePath: string; + }>; + launch: Readonly<{ + arguments: readonly string[]; + environment: Readonly>; + }>; + limits: WindowsRuntimeProjectionLimits; + control: WindowsNativeOperationControl; + }>, + ): Promise>; + spawnOwnedProcess(input: { + readonly runtimeProjection: WindowsNativeBackendResource; + readonly limits: WindowsOwnedProcessLimits; + readonly control: WindowsNativeOperationControl; + }): Promise>; +} + +type ResourceStatus = "open" | "closing" | "closed"; +type ResourceKind = "file" | "directory" | "privateRoot" | "process"; + +interface CloseDeferred { + readonly promise: Promise>; + readonly resolve: (value: Result) => void; +} + +interface ResourceState { + readonly owner: WindowsNativeAuthority; + readonly backend: WindowsNativeBackendResource; + readonly closeBackend: () => Promise< + Result + >; + readonly kind: ResourceKind; + status: ResourceStatus; + leaseCount: number; + closePromise?: Promise>; + closeDeferred?: CloseDeferred; +} + +interface ResolvedResource { + readonly backend: WindowsNativeBackendResource; + readonly state: ResourceState; +} + +interface ResolvedTreeProjection { + readonly role: WindowsRuntimeTreeProjection["role"]; + readonly backend: WindowsNativeBackendResource; + readonly destination: string; + readonly state: ResourceState; +} + +interface ResolvedFileProjection { + readonly role: WindowsRuntimeFileProjection["role"]; + readonly backend: WindowsNativeBackendResource; + readonly destination: string; + readonly state: ResourceState; +} + +const resourceStates = new WeakMap(); +const backendTokenStates = new WeakMap< + WindowsNativeBackendResource, + ResourceState +>(); + +/** Handle-admitted regular file scoped to its issuing authority instance. */ +export interface WindowsAdmittedFile extends WindowsAdmittedFileObservation { + /** Close the retained handle once and make the capability unusable. */ + close(): Promise>; +} + +/** Handle-admitted directory scoped to its issuing authority instance. */ +export interface WindowsAdmittedDirectory + extends WindowsAdmittedDirectoryObservation { + /** Close the retained handle once and make the capability unusable. */ + close(): Promise>; +} + +/** Private runtime root scoped to its issuing authority instance. */ +export interface WindowsPrivateRoot extends WindowsPrivateRootObservation { + /** Close the retained root authority once and reject later use. */ + close(): Promise>; +} + +/** Opaque owned process with bounded output and kill-on-close lifetime. */ +export interface WindowsOwnedProcess { + /** Provider-neutral process identifier retained for diagnostics only. */ + readonly processId: number; + + /** Parsed Job Object policy associated atomically with process creation. */ + readonly ownership: WindowsJobOwnershipObservation; + + /** Read the latest detached, bounded output and exit observation. */ + snapshot(): WindowsOwnedProcessSnapshot; + + /** Wait for exit; cancellation stops only this wait and never closes the job. */ + waitForExit( + signal?: AbortSignal, + ): Promise>; + + /** Close the Job Object once and observe whether it terminated processes. */ + close(): Promise< + Result + >; +} + +/** Input for creating one private child beneath an admitted directory. */ +export interface WindowsPrivateRootInput extends WindowsNativeOperationControl { + readonly parent: WindowsAdmittedDirectory; + readonly prefix: string; + readonly trees: readonly WindowsRuntimeTreeProjection[]; + readonly files: readonly WindowsRuntimeFileProjection[]; + readonly writableDirectories: readonly string[]; + readonly entrypoint: Readonly<{ + readonly treeRole: "jdk"; + readonly relativePath: string; + }>; + readonly launch: Readonly<{ + readonly arguments: readonly string[]; + readonly environment: Readonly>; + }>; + readonly limits: WindowsRuntimeProjectionLimits; +} + +/** Input for native process creation already assigned to its Job Object. */ +export interface WindowsOwnedProcessInput + extends WindowsNativeOperationControl { + readonly runtimeProjection: WindowsPrivateRoot; + readonly limits: WindowsOwnedProcessLimits; +} + +const parseAdmittedFileObservation = ( + value: unknown, + requestedPath: string, +): Result => { + const parsed = admittedFileObservationSchema.safeParse(value); + if (!parsed.success || parsed.data.requestedPath !== requestedPath) + return malformedAdmissionObservation(); + return ok({ + ...parsed.data, + stableIdentity: stablePathIdentity(parsed.data), + }); +}; + +const parseAdmittedDirectoryObservation = ( + value: unknown, + requestedPath: string, +): Result => { + const parsed = admittedDirectoryObservationSchema.safeParse(value); + if (!parsed.success || parsed.data.requestedPath !== requestedPath) + return malformedAdmissionObservation(); + return ok({ + ...parsed.data, + stableIdentity: stablePathIdentity(parsed.data), + }); +}; + +const parsePrivateRootObservation = ( + value: unknown, +): Result => { + const parsed = privateRootObservationSchema.safeParse(value); + if ( + !parsed.success || + parsed.data.fileCount !== + parsed.data.security.readonlyFiles.verifiedObjectCount + + parsed.data.security.writableFiles.verifiedObjectCount || + parsed.data.directoryCount !== + 1 + + parsed.data.security.readonlyDirectories.verifiedObjectCount + + parsed.data.security.writableDirectories.verifiedObjectCount || + parsed.data.security.manifestSha256 !== + privateSecurityManifestSha256( + parsed.data.manifestSha256, + parsed.data.launchSha256, + parsed.data.security, + ) + ) + return err( + new WindowsNativeAuthorityError( + "create_private_root", + "native_contract_mismatch", + "Windows native adapter returned an invalid private DACL observation", + ), + ); + return ok(parsed.data); +}; + +const privateSecurityManifestSha256 = ( + projectionManifestSha256: string, + launchSha256: string, + security: Omit, +): string => { + const commitment = { + version: 1, + projectionManifestSha256, + launchSha256, + rootDirectory: policyCommitment(security.rootDirectory), + readonlyDirectories: policyCommitment(security.readonlyDirectories), + readonlyFiles: policyCommitment(security.readonlyFiles), + writableDirectories: policyCommitment(security.writableDirectories), + writableFiles: policyCommitment(security.writableFiles), + }; + return createHash("sha256").update(JSON.stringify(commitment)).digest("hex"); +}; + +const policyCommitment = (policy: WindowsPrivateDaclObservation) => ({ + verifiedObjectCount: policy.verifiedObjectCount, + policyManifestSha256: policy.policyManifestSha256, +}); + +const jobOwnershipPolicySha256 = ( + ownership: Omit, +): string => + createHash("sha256") + .update( + JSON.stringify({ + version: 1, + jobObject: ownership.jobObject, + assignment: ownership.assignment, + processExecution: ownership.processExecution, + killOnJobClose: ownership.killOnJobClose, + breakaway: ownership.breakaway, + nestedJob: ownership.nestedJob, + ownerHandle: ownership.ownerHandle, + jobHandleOwnership: ownership.jobHandleOwnership, + inheritedHandles: ownership.inheritedHandles, + membership: ownership.membership, + }), + ) + .digest("hex"); + +const stablePathIdentity = (identity: { + readonly filesystem: "ntfs"; + readonly volumeIdentity: string; + readonly fileIdentity: string; +}): string => + `${identity.filesystem}:${identity.volumeIdentity}:${identity.fileIdentity}`; + +const malformedAdmissionObservation = (): Result< + T, + WindowsNativeAuthorityError +> => + err( + new WindowsNativeAuthorityError( + "admit_path", + "native_contract_mismatch", + "Windows native adapter returned an invalid path identity observation", + ), + ); + +/** Application-owned authority wrapper that scopes every native resource. */ +export class WindowsNativeAuthority { + constructor(readonly backend: WindowsNativeAuthorityBackend) {} + + /** Loaded native contract identity after package validation. */ + get identity(): WindowsNativeAuthorityIdentity | null { + return this.backend.identity; + } + + /** Admit one file or directory without following a reparse point. */ + admitPath( + input: WindowsPathAdmissionInput<"file">, + ): Promise>; + admitPath( + input: WindowsPathAdmissionInput<"directory">, + ): Promise>; + async admitPath( + input: WindowsPathAdmissionInput, + ): Promise< + Result< + WindowsAdmittedFile | WindowsAdmittedDirectory, + WindowsNativeAuthorityError + > + > { + const admissionInput: WindowsPathAdmissionInput = { + path: input.path, + kind: input.kind, + reparsePolicy: input.reparsePolicy, + deadlineMs: input.deadlineMs, + ...(input.expectedSha256 === undefined + ? {} + : { expectedSha256: input.expectedSha256 }), + ...(input.signal === undefined ? {} : { signal: input.signal }), + }; + + if (input.kind === "file") { + const admitted = await this.backend.admitFile( + admissionInput as WindowsPathAdmissionInput<"file">, + ); + if (!admitted.ok) return admitted; + const observation = parseAdmittedFileObservation( + admitted.value.observation, + admissionInput.path, + ); + if (!observation.ok) { + await poisonAliasedToken(admitted.value.resource, () => + admitted.value.resource.close(), + ); + return observation; + } + const resource = createResource({ + authority: this, + operation: "admit_path", + kind: "file", + observation: observation.value, + backend: admitted.value.resource, + }); + if (!resource.ok) + await poisonAliasedToken(admitted.value.resource, () => + admitted.value.resource.close(), + ); + return resource; + } + + const admitted = await this.backend.admitDirectory( + admissionInput as WindowsPathAdmissionInput<"directory">, + ); + if (!admitted.ok) return admitted; + const observation = parseAdmittedDirectoryObservation( + admitted.value.observation, + admissionInput.path, + ); + if (!observation.ok) { + await poisonAliasedToken(admitted.value.resource, () => + admitted.value.resource.close(), + ); + return observation; + } + const resource = createResource({ + authority: this, + operation: "admit_path", + kind: "directory", + observation: observation.value, + backend: admitted.value.resource, + }); + if (!resource.ok) + await poisonAliasedToken(admitted.value.resource, () => + admitted.value.resource.close(), + ); + return resource; + } + + /** Create and verify a protected runtime root beneath owned authority. */ + async createPrivateRoot( + input: WindowsPrivateRootInput, + ): Promise> { + const prefix = input.prefix; + const writableDirectories = [...input.writableDirectories]; + const entrypoint = { + treeRole: input.entrypoint.treeRole, + relativePath: input.entrypoint.relativePath, + }; + const launch = { + arguments: [...input.launch.arguments], + environment: { ...input.launch.environment }, + }; + const limits = { + entries: input.limits.entries, + depth: input.limits.depth, + bytes: input.limits.bytes, + }; + const controlSnapshot = control(input); + + const parent = ownedResource( + this, + input.parent, + "create_private_root", + "directory", + ); + if (!parent.ok) return parent; + + const trees = ownedRuntimeTrees(this, input.trees); + if (!trees.ok) return trees; + + const files = ownedRuntimeFiles(this, input.files); + if (!files.ok) return files; + + const leases: ResourceState[] = [ + parent.value.state, + ...trees.value.map((tree) => tree.state), + ...files.value.map((file) => file.state), + ]; + const leased = acquireLeases(leases, "create_private_root"); + if (!leased.ok) return leased; + + try { + const created = await this.backend.createPrivateRoot({ + parent: parent.value.backend, + prefix, + trees: trees.value.map((tree) => ({ + role: tree.role, + source: tree.backend, + destination: tree.destination, + })), + files: files.value.map((file) => ({ + role: file.role, + source: file.backend, + destination: file.destination, + })), + writableDirectories, + entrypoint, + launch, + limits, + control: controlSnapshot, + }); + if (!created.ok) return created; + const observation = parsePrivateRootObservation( + created.value.observation, + ); + if (!observation.ok) { + await poisonAliasedToken(created.value.resource, () => + created.value.resource.close(), + ); + return observation; + } + const resource = createResource({ + authority: this, + operation: "create_private_root", + kind: "privateRoot", + observation: observation.value, + backend: created.value.resource, + }); + if (!resource.ok) + await poisonAliasedToken(created.value.resource, () => + created.value.resource.close(), + ); + return resource; + } finally { + releaseLeases(leases); + } + } + + /** Spawn a process atomically assigned to a dedicated kill-on-close job. */ + async spawnOwnedProcess( + input: WindowsOwnedProcessInput, + ): Promise> { + const limits = { + stdoutBytes: input.limits.stdoutBytes, + stderrBytes: input.limits.stderrBytes, + }; + const controlSnapshot = control(input); + + const runtimeProjection = ownedResource( + this, + input.runtimeProjection, + "spawn_owned_process", + "privateRoot", + ); + if (!runtimeProjection.ok) return runtimeProjection; + + const leases: ResourceState[] = [runtimeProjection.value.state]; + const leased = acquireLeases(leases, "spawn_owned_process"); + if (!leased.ok) return leased; + + try { + const spawned = await this.backend.spawnOwnedProcess({ + runtimeProjection: runtimeProjection.value.backend, + limits, + control: controlSnapshot, + }); + if (!spawned.ok) return spawned; + const process = createOwnedProcess(this, spawned.value, limits); + if (!process.ok) + await poisonAliasedToken(spawned.value, async () => { + await spawned.value.closeProcess(); + }); + return process; + } finally { + releaseLeases(leases); + } + } +} + +const registerBackend = ( + authority: WindowsNativeAuthority, + kind: ResourceKind, + backend: WindowsNativeBackendResource, + operation: WindowsNativeAuthorityOperation, + closeBackend: ResourceState["closeBackend"], +): Result => { + const existing = backendTokenStates.get(backend); + if (existing !== undefined) { + return err( + new WindowsNativeAuthorityError( + operation, + "native_contract_mismatch", + existing.kind === kind + ? "Windows native backend token is already registered" + : "Windows native backend token is registered with a different kind", + ), + ); + } + + const state: ResourceState = { + owner: authority, + backend, + closeBackend, + kind, + status: "open", + leaseCount: 0, + }; + backendTokenStates.set(backend, state); + return ok(state); +}; + +const poisonAliasedToken = async ( + backend: WindowsNativeBackendResource, + cleanup: () => Promise, +): Promise => { + const existing = backendTokenStates.get(backend); + if (existing !== undefined) { + if (existing.status === "closed") return; + existing.status = "closing"; + if (existing.leaseCount > 0) { + existing.closeDeferred ??= createDeferredClose(); + return; + } + existing.closePromise ??= safeCloseBackend(existing).then((result) => { + existing.status = "closed"; + return result; + }); + await existing.closePromise; + return; + } + try { + await cleanup(); + } catch { + // The contract mismatch remains the caller-visible failure; the token is + // poisoned even if the malformed backend also rejects cleanup. + } finally { + // A fresh malformed token has no wrapper state to retain. + } +}; + +const safeCloseBackend = async ( + state: ResourceState, +): Promise> => { + try { + return await state.closeBackend(); + } catch (cause: unknown) { + return err( + new WindowsNativeAuthorityError( + "close_resource", + "native_failure", + "Windows native resource cleanup failed", + { cause }, + ), + ); + } +}; + +const ownedResource = ( + authority: WindowsNativeAuthority, + resource: object, + operation: WindowsNativeAuthorityOperation, + expectedKind: ResourceKind, +): Result => { + const state = resourceStates.get(resource); + if (state === undefined || state.owner !== authority) + return err( + new WindowsNativeAuthorityError( + operation, + "invalid_input", + "Windows native resource does not belong to this authority", + ), + ); + if (state.status !== "open") + return err( + new WindowsNativeAuthorityError( + operation, + "identity_drift", + "Windows native resource is already closed", + ), + ); + if (state.kind !== expectedKind) + return err( + new WindowsNativeAuthorityError( + operation, + "native_contract_mismatch", + `Windows native resource is not a ${expectedKind}`, + ), + ); + return ok({ backend: state.backend, state }); +}; + +const ownedRuntimeTrees = ( + authority: WindowsNativeAuthority, + trees: readonly WindowsRuntimeTreeProjection[], +): Result => { + const projected: ResolvedTreeProjection[] = []; + for (const tree of trees) { + const source = ownedResource( + authority, + tree.source, + "create_private_root", + "directory", + ); + if (!source.ok) return source; + projected.push({ + role: tree.role, + backend: source.value.backend, + destination: tree.destination, + state: source.value.state, + }); + } + return ok(projected); +}; + +const ownedRuntimeFiles = ( + authority: WindowsNativeAuthority, + files: readonly WindowsRuntimeFileProjection[], +): Result => { + const projected: ResolvedFileProjection[] = []; + for (const file of files) { + const source = ownedResource( + authority, + file.source, + "create_private_root", + "file", + ); + if (!source.ok) return source; + projected.push({ + role: file.role, + backend: source.value.backend, + destination: file.destination, + state: source.value.state, + }); + } + return ok(projected); +}; + +const acquireLeases = ( + states: readonly ResourceState[], + operation: WindowsNativeAuthorityOperation, +): Result => { + const acquired: ResourceState[] = []; + for (const state of states) { + if (state.status !== "open") { + for (const s of acquired) s.leaseCount--; + return err( + new WindowsNativeAuthorityError( + operation, + "identity_drift", + "Windows native resource is already closed", + ), + ); + } + state.leaseCount++; + acquired.push(state); + } + return ok(undefined); +}; + +const releaseLeases = (states: readonly ResourceState[]): void => { + for (const state of states) { + state.leaseCount--; + if (state.leaseCount === 0 && state.status === "closing") { + state.closePromise = safeCloseBackend(state).then((result) => { + state.status = "closed"; + state.closeDeferred?.resolve(result); + return result; + }); + } + } +}; + +/** Construct a fail-closed authority backend when the package is unavailable. */ +export const unavailableWindowsNativeAuthorityBackend = ( + message: string, +): WindowsNativeAuthorityBackend => ({ + identity: null, + admitFile: () => Promise.resolve(unavailable("admit_path", message)), + admitDirectory: () => Promise.resolve(unavailable("admit_path", message)), + createPrivateRoot: () => + Promise.resolve(unavailable("create_private_root", message)), + spawnOwnedProcess: () => + Promise.resolve(unavailable("spawn_owned_process", message)), +}); + +const createDeferredClose = (): CloseDeferred => { + let resolve!: (value: Result) => void; + const promise = new Promise>( + (res) => { + resolve = res; + }, + ); + return { promise, resolve }; +}; + +const closeResource = ( + resource: object, +): Promise> => { + const state = resourceStates.get(resource); + if (state === undefined) + return Promise.resolve( + err( + new WindowsNativeAuthorityError( + "close_resource", + "invalid_input", + "Windows native resource is not owned by REA", + ), + ), + ); + if (state.status === "closed") + return state.closePromise ?? Promise.resolve(ok(undefined)); + if (state.status === "closing") + return ( + state.closeDeferred?.promise ?? + state.closePromise ?? + Promise.resolve(ok(undefined)) + ); + + state.status = "closing"; + if (state.leaseCount === 0) { + state.closePromise = safeCloseBackend(state).then((result) => { + state.status = "closed"; + return result; + }); + return state.closePromise; + } + + const deferred = createDeferredClose(); + state.closeDeferred = deferred; + return deferred.promise; +}; + +const createResource = ( + input: Readonly<{ + authority: WindowsNativeAuthority; + operation: WindowsNativeAuthorityOperation; + kind: Exclude; + observation: TObservation; + backend: WindowsNativeBackendResource; + }>, +): Result< + TObservation & { + close(): Promise>; + }, + WindowsNativeAuthorityError +> => { + const stateResult = registerBackend( + input.authority, + input.kind, + input.backend, + input.operation, + () => input.backend.close(), + ); + if (!stateResult.ok) return stateResult; + const resource = { + ...input.observation, + close: () => closeResource(resource), + } as TObservation & { + close(): Promise>; + }; + resourceStates.set(resource, stateResult.value); + return ok(resource); +}; + +const createOwnedProcess = ( + authority: WindowsNativeAuthority, + backend: WindowsNativeBackendProcess, + limits: WindowsOwnedProcessLimits, +): Result => { + const ownership = jobOwnershipObservationSchema.safeParse(backend.ownership); + if ( + !ownership.success || + !Number.isSafeInteger(backend.processId) || + backend.processId <= 0 + ) + return err( + new WindowsNativeAuthorityError( + "spawn_owned_process", + "native_contract_mismatch", + "Windows native adapter returned an invalid Job Object observation", + ), + ); + const ownershipObservation: WindowsJobOwnershipObservation = { + ...ownership.data, + policySha256: jobOwnershipPolicySha256(ownership.data), + }; + const stateResult = registerBackend( + authority, + "process", + backend, + "spawn_owned_process", + () => + closeOwnedProcess(backend).then((result) => + result.ok ? ok(undefined) : result, + ), + ); + if (!stateResult.ok) return stateResult; + const state = stateResult.value; + + let closePromise: + | Promise> + | undefined; + const process = { + processId: backend.processId, + ownership: ownershipObservation, + snapshot: () => { + try { + return parseProcessSnapshot(backend.snapshot(), limits); + } catch (cause: unknown) { + if (cause instanceof WindowsNativeAuthorityError) throw cause; + throw new WindowsNativeAuthorityError( + "observe_process", + "native_failure", + "Windows native process observation failed", + { cause }, + ); + } + }, + waitForExit: async (signal?: AbortSignal) => { + try { + const result = await backend.waitForExit(signal); + return parseProcessResult( + result, + ownedProcessExitSchema, + "wait_for_exit", + ); + } catch (cause: unknown) { + return nativeProcessFailure( + "wait_for_exit", + "Windows native process wait failed", + cause, + ); + } + }, + close: () => { + if (closePromise !== undefined) return closePromise; + state.status = "closing"; + closePromise = closeOwnedProcess(backend).then((result) => { + state.status = "closed"; + return result; + }); + return closePromise; + }, + }; + resourceStates.set(process, state); + return ok(process); +}; + +const parseProcessSnapshot = ( + value: unknown, + limits: WindowsOwnedProcessLimits, +): WindowsOwnedProcessSnapshot => { + const parsed = ownedProcessSnapshotSchema.safeParse(value); + if ( + !parsed.success || + !validStreamSnapshot(parsed.data.stdout, limits.stdoutBytes) || + !validStreamSnapshot(parsed.data.stderr, limits.stderrBytes) + ) + throw new WindowsNativeAuthorityError( + "observe_process", + "native_contract_mismatch", + "Windows native adapter returned an invalid process snapshot", + ); + return parsed.data; +}; + +const validStreamSnapshot = ( + stream: WindowsOwnedProcessStreamSnapshot, + retainedLimit: number, +): boolean => + Number.isSafeInteger(stream.totalBytes) && + stream.retained.byteLength <= retainedLimit && + stream.retained.byteLength <= stream.totalBytes && + stream.truncated === stream.totalBytes > stream.retained.byteLength; + +const parseProcessResult = ( + value: unknown, + successSchema: z.ZodType, + operation: "wait_for_exit" | "close_resource", +): Result => { + if (typeof value !== "object" || value === null || !("ok" in value)) + return malformedProcessResult(operation); + const candidate = value as Readonly>; + if (candidate.ok === true) { + if (Object.keys(candidate).length !== 2 || !("value" in candidate)) + return malformedProcessResult(operation); + const parsed = successSchema.safeParse(candidate.value); + return parsed.success ? ok(parsed.data) : malformedProcessResult(operation); + } + if ( + candidate.ok !== false || + Object.keys(candidate).length !== 2 || + !(candidate.error instanceof WindowsNativeAuthorityError) + ) + return malformedProcessResult(operation); + return err(candidate.error); +}; + +const malformedProcessResult = ( + operation: "wait_for_exit" | "close_resource", +): Result => + err( + new WindowsNativeAuthorityError( + operation, + "native_contract_mismatch", + "Windows native adapter returned an invalid process result", + ), + ); + +const nativeProcessFailure = ( + operation: "wait_for_exit" | "close_resource", + message: string, + cause: unknown, +): Result => + err( + new WindowsNativeAuthorityError(operation, "native_failure", message, { + cause, + }), + ); + +const closeOwnedProcess = async ( + backend: WindowsNativeBackendProcess, +): Promise> => { + try { + return parseProcessResult( + await backend.closeProcess(), + ownedProcessCloseSchema, + "close_resource", + ); + } catch (cause: unknown) { + return nativeProcessFailure( + "close_resource", + "Windows native process cleanup failed", + cause, + ); + } +}; + +const control = ( + input: WindowsNativeOperationControl, +): WindowsNativeOperationControl => ({ + deadlineMs: input.deadlineMs, + ...(input.signal === undefined ? {} : { signal: input.signal }), +}); + +const unavailable = ( + operation: WindowsNativeAuthorityOperation, + message: string, +): Result => + err(new WindowsNativeAuthorityError(operation, "unavailable", message)); diff --git a/src/application/WindowsNativeAuthorityLoader.ts b/src/application/WindowsNativeAuthorityLoader.ts new file mode 100644 index 0000000000..fe955ae508 --- /dev/null +++ b/src/application/WindowsNativeAuthorityLoader.ts @@ -0,0 +1,401 @@ +import { createHash } from "node:crypto"; +import { readFile, realpath } from "node:fs/promises"; +import { createRequire } from "node:module"; +import { win32 } from "node:path"; + +import { z } from "zod"; + +import { PACKAGE_METADATA } from "../generatedPackageMetadata.js"; +import { err, ok, type Result } from "../domain/result.js"; +import { + WindowsNativeAuthorityError, + type WindowsNativeAuthorityBackend, + type WindowsNativeAuthorityIdentity, +} from "./WindowsNativeAuthority.js"; + +const BACKEND_EXPORTS = [ + "admitDirectory", + "admitFile", + "createPrivateRoot", + "identity", + "spawnOwnedProcess", +] as const; + +const identitySchema = z.strictObject({ + packageName: z.string().min(1), + packageVersion: z.string().min(1), + contractVersion: z.number().int().positive(), + nodeApiVersion: z.number().int().positive(), + artifactSha256: z.string().regex(/^[0-9a-f]{64}$/u), +}); + +const packageManifestSchema = z.object({ + name: z.string().min(1), + version: z.string().min(1), + os: z.tuple([z.literal("win32")]), + cpu: z.tuple([z.literal("x64")]), + scripts: z.undefined().optional(), + reaNativeAuthority: z.strictObject({ + contractVersion: z.number().int().positive(), + nodeApiVersion: z.number().int().positive(), + artifact: z.string().regex(/^[^\\/]+\.node$/u), + artifactSha256: z.string().regex(/^[0-9a-f]{64}$/u), + exports: z.tuple([ + z.literal("admitDirectory"), + z.literal("admitFile"), + z.literal("createPrivateRoot"), + z.literal("identity"), + z.literal("spawnOwnedProcess"), + ]), + }), +}); + +/** Release-generated identity required before the Windows addon can load. */ +export interface WindowsNativeAuthorityPackageCommitment { + readonly packageName: string; + readonly packageVersion: string; + readonly contractVersion: number; + readonly nodeApiVersion: number; + readonly artifactSha256: string | null; +} + +/** Injectable Node package-loading seam used by the production loader. */ +export interface WindowsNativeAuthorityLoadHost { + readonly platform: NodeJS.Platform; + readonly architecture: string; + readonly nodeApiVersion: number | null; + resolve(packageName: string): string; + resolveManifest(packageName: string): string; + canonicalize(path: string): Promise; + read(path: string): Promise; + cached(path: string): unknown | undefined; + load(path: string): unknown; +} + +interface LoadedBackend { + readonly backend: LoadedWindowsNativeBackend; + readonly canonicalPath: string; + readonly identity: WindowsNativeAuthorityIdentity; +} + +type LoadedWindowsNativeBackend = WindowsNativeAuthorityBackend & { + readonly identity: WindowsNativeAuthorityIdentity; +}; + +const require = createRequire(import.meta.url); + +/** Production host backed by Node's exact CommonJS/native-addon loader. */ +export const systemWindowsNativeAuthorityLoadHost = + (): WindowsNativeAuthorityLoadHost => ({ + platform: process.platform, + architecture: process.arch, + nodeApiVersion: parseNodeApiVersion(process.versions.napi), + resolve: (packageName) => require.resolve(packageName), + resolveManifest: (packageName) => + require.resolve(`${packageName}/package.json`), + canonicalize: realpath, + read: readFile, + cached: (path) => require.cache[path]?.exports, + load: (path) => require(path), + }); + +/** Stateful process-lifetime loader for one pinned native module identity. */ +export class WindowsNativeAuthorityPackageLoader { + private loaded: LoadedBackend | undefined; + private loading: + | Promise< + Result + > + | undefined; + + constructor( + private readonly host: WindowsNativeAuthorityLoadHost, + private readonly commitment: WindowsNativeAuthorityPackageCommitment, + ) {} + + /** Load once and pin either the backend or its failure for this process. */ + load(): Promise< + Result + > { + if (this.loaded !== undefined) + return Promise.resolve(ok(this.loaded.backend)); + this.loading ??= this.loadOnce(); + return this.loading; + } + + private async loadOnce(): Promise< + Result + > { + const supported = this.checkRuntime(); + if (!supported.ok) return supported; + const manifest = await this.readManifest(); + if (!manifest.ok) return manifest; + let resolvedPath: string; + try { + resolvedPath = await this.host.canonicalize( + this.host.resolve(this.commitment.packageName), + ); + } catch (cause: unknown) { + return err( + loadError( + "unavailable", + "Windows native authority package is not installed or resolvable", + cause, + ), + ); + } + let expectedArtifactPath: string; + try { + expectedArtifactPath = await this.host.canonicalize( + win32.resolve( + win32.dirname(manifest.value.path), + manifest.value.artifact, + ), + ); + } catch (cause: unknown) { + return err( + loadError( + "unavailable", + "Windows native authority declared addon is unavailable", + cause, + ), + ); + } + if (resolvedPath !== expectedArtifactPath) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority package resolved an unexpected addon path", + ), + ); + if (this.host.cached(resolvedPath) !== undefined) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority addon was cached before identity verification", + ), + ); + let artifact: Uint8Array; + try { + artifact = await this.host.read(resolvedPath); + } catch (cause: unknown) { + return err( + loadError( + "unavailable", + "Windows native authority addon could not be read", + cause, + ), + ); + } + const digest = createHash("sha256").update(artifact).digest("hex"); + if (digest !== this.commitment.artifactSha256) + return err( + loadError( + "identity_drift", + "Windows native authority addon digest does not match this REA release", + ), + ); + let module: unknown; + try { + module = this.host.load(resolvedPath); + } catch (cause: unknown) { + return err( + loadError( + "unavailable", + "Windows native authority addon could not be loaded", + cause, + ), + ); + } + const parsed = parseBackend(module, this.commitment, digest); + if (!parsed.ok) return parsed; + this.loaded = { + backend: parsed.value, + canonicalPath: resolvedPath, + identity: parsed.value.identity, + }; + return ok(parsed.value); + } + + private checkRuntime(): Result { + if (this.host.platform !== "win32" || this.host.architecture !== "x64") + return err( + loadError( + "unavailable", + "Windows native authority requires Windows x64", + ), + ); + if (this.commitment.artifactSha256 === null) + return err( + loadError( + "unavailable", + "This REA build has no committed Windows native authority artifact", + ), + ); + if ( + this.host.nodeApiVersion === null || + this.host.nodeApiVersion < this.commitment.nodeApiVersion + ) + return err( + loadError( + "unavailable", + "Windows native authority requires the committed Node-API version", + ), + ); + return ok(undefined); + } + + private async readManifest(): Promise< + Result< + { readonly path: string; readonly artifact: string }, + WindowsNativeAuthorityError + > + > { + let path: string; + let bytes: Uint8Array; + try { + path = await this.host.canonicalize( + this.host.resolveManifest(this.commitment.packageName), + ); + bytes = await this.host.read(path); + } catch (cause: unknown) { + return err( + loadError( + "unavailable", + "Windows native authority package manifest is unavailable", + cause, + ), + ); + } + let decoded: unknown; + try { + decoded = JSON.parse(Buffer.from(bytes).toString("utf8")); + } catch (cause: unknown) { + return err( + loadError( + "native_contract_mismatch", + "Windows native authority package manifest is not valid JSON", + cause, + ), + ); + } + const parsed = packageManifestSchema.safeParse(decoded); + if ( + !parsed.success || + parsed.data.name !== this.commitment.packageName || + parsed.data.version !== this.commitment.packageVersion || + parsed.data.reaNativeAuthority.contractVersion !== + this.commitment.contractVersion || + parsed.data.reaNativeAuthority.nodeApiVersion !== + this.commitment.nodeApiVersion || + parsed.data.reaNativeAuthority.artifactSha256 !== + this.commitment.artifactSha256 + ) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority package manifest does not match this REA release", + ), + ); + return ok({ + path, + artifact: parsed.data.reaNativeAuthority.artifact, + }); + } +} + +let productionLoader: WindowsNativeAuthorityPackageLoader | undefined; + +/** Return the one process-global loader for release-generated package metadata. */ +export const createWindowsNativeAuthorityPackageLoader = + (): WindowsNativeAuthorityPackageLoader => { + productionLoader ??= new WindowsNativeAuthorityPackageLoader( + systemWindowsNativeAuthorityLoadHost(), + PACKAGE_METADATA.windowsNativeAuthority, + ); + return productionLoader; + }; + +const parseBackend = ( + input: unknown, + commitment: WindowsNativeAuthorityPackageCommitment, + digest: string, +): Result => { + if (typeof input !== "object" || input === null) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority addon exported a non-object contract", + ), + ); + const keys = Object.keys(input).sort((left, right) => + left.localeCompare(right), + ); + if (!sameStrings(keys, BACKEND_EXPORTS)) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority addon export set does not match the contract", + ), + ); + const candidate = input as Record; + const identity = identitySchema.safeParse(candidate.identity); + if (!identity.success || !sameIdentity(identity.data, commitment, digest)) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority addon identity does not match this REA release", + ), + ); + if ( + typeof candidate.admitFile !== "function" || + typeof candidate.admitDirectory !== "function" || + typeof candidate.createPrivateRoot !== "function" || + typeof candidate.spawnOwnedProcess !== "function" + ) + return err( + loadError( + "native_contract_mismatch", + "Windows native authority addon operations do not match the contract", + ), + ); + // SAFETY: the exact export set, identity, and every callable backend operation + // were checked above. Operation results remain parsed by WindowsNativeAuthority. + return ok(candidate as unknown as LoadedWindowsNativeBackend); +}; + +const sameIdentity = ( + identity: WindowsNativeAuthorityIdentity, + commitment: WindowsNativeAuthorityPackageCommitment, + digest: string, +): boolean => + identity.packageName === commitment.packageName && + identity.packageVersion === commitment.packageVersion && + identity.contractVersion === commitment.contractVersion && + identity.nodeApiVersion === commitment.nodeApiVersion && + identity.artifactSha256 === digest; + +const sameStrings = ( + actual: readonly string[], + expected: readonly string[], +): boolean => + actual.length === expected.length && + actual.every((value, index) => value === expected[index]); + +const parseNodeApiVersion = (value: string | undefined): number | null => { + if (value === undefined || !/^\d+$/u.test(value)) return null; + const parsed = Number(value); + return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null; +}; + +const loadError = ( + reason: "unavailable" | "identity_drift" | "native_contract_mismatch", + message: string, + cause?: unknown, +): WindowsNativeAuthorityError => + new WindowsNativeAuthorityError( + "load_native_authority", + reason, + message, + cause === undefined ? undefined : { cause }, + ); diff --git a/src/generatedPackageMetadata.ts b/src/generatedPackageMetadata.ts index b3e9df193b..faf0fec771 100644 --- a/src/generatedPackageMetadata.ts +++ b/src/generatedPackageMetadata.ts @@ -5,5 +5,12 @@ export const PACKAGE_METADATA = { serverSdkVersion: "2.0.0-beta.4", clientSdkVersion: "2.0.0-beta.4", coreSdkVersion: "2.0.0-beta.4", - skillVersion: "21", + skillVersion: "22", + windowsNativeAuthority: { + packageName: "@rea/windows-x64", + packageVersion: "2.0.0", + contractVersion: 1, + nodeApiVersion: 9, + artifactSha256: null, + }, } as const; diff --git a/src/process/PrivateRuntimeRoot.ts b/src/process/PrivateRuntimeRoot.ts index 92ba3de082..552d18c4c2 100644 --- a/src/process/PrivateRuntimeRoot.ts +++ b/src/process/PrivateRuntimeRoot.ts @@ -9,10 +9,11 @@ export interface PrivateRuntimeRootOptions { } /** - * Owns one mode-0700 temporary runtime root and removes it idempotently. + * Owns one POSIX mode-0700 temporary runtime root and removes it idempotently. * * Protocol adapters decide what belongs inside the directory; this primitive - * only establishes a private filesystem boundary and deterministic cleanup. + * establishes a private filesystem boundary on POSIX and deterministic cleanup. + * Windows privacy requires the separately verified native DACL boundary. */ export class PrivateRuntimeRoot { #closePromise: Promise | undefined; diff --git a/tests/windowsCapabilities.test.ts b/tests/windowsCapabilities.test.ts index 456bd7e95d..a6fd0675a0 100644 --- a/tests/windowsCapabilities.test.ts +++ b/tests/windowsCapabilities.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { probeWindowsCapabilities, + systemNoFollowOpenCapability, type WindowsCapabilityDependencies, } from "../src/application/WindowsCapabilities.js"; @@ -20,6 +21,10 @@ const dependencies = ( available: false, reason: "Windows ACL enforcement is not implemented by this REA build", }), + probeNativeAuthority: () => ({ + available: false, + reason: "Windows native authority package is not installed", + }), probeUnixDomainSocket: () => ({ available: false, reason: "Node path-based IPC uses named pipes on Windows", @@ -34,6 +39,17 @@ const dependencies = ( }); describe("Windows host capability report", () => { + it("never treats a numeric POSIX flag as Windows reparse authority", () => { + expect(systemNoFollowOpenCapability("win32", 0x20_000)).toEqual({ + available: false, + reason: "Windows reparse-safe handle admission is not implemented", + }); + expect(systemNoFollowOpenCapability("linux", 0x20_000)).toEqual({ + available: true, + reason: null, + }); + }); + it("keeps unavailable security controls explicit", async () => { await expect(probeWindowsCapabilities(dependencies())).resolves.toEqual({ platform: "win32", @@ -49,6 +65,10 @@ describe("Windows host capability report", () => { reason: "Windows ACL enforcement is not implemented by this REA build", }, + native_authority: { + available: false, + reason: "Windows native authority package is not installed", + }, unix_domain_socket: { available: false, reason: "Node path-based IPC uses named pipes on Windows", diff --git a/tests/windowsNativeAuthority.test.ts b/tests/windowsNativeAuthority.test.ts new file mode 100644 index 0000000000..356faf2a7e --- /dev/null +++ b/tests/windowsNativeAuthority.test.ts @@ -0,0 +1,1194 @@ +import { createHash } from "node:crypto"; + +import { describe, expect, it, vi } from "vitest"; + +import { + WindowsNativeAuthority, + WindowsNativeAuthorityError, + unavailableWindowsNativeAuthorityBackend, + type WindowsNativeAuthorityBackend, + type WindowsNativeBackendProcess, + type WindowsNativeBackendResource, + type WindowsNativeOperationControl, + type WindowsOwnedProcessSnapshot, +} from "../src/application/WindowsNativeAuthority.js"; +import { err, ok } from "../src/domain/result.js"; + +const deferred = () => { + let resolve!: (value: T) => void; + const promise = new Promise((resolvePromise) => { + resolve = resolvePromise; + }); + return { promise, resolve }; +}; + +const identity = { + packageName: "@rea/windows-x64", + packageVersion: "1.0.0", + contractVersion: 1, + nodeApiVersion: 9, + artifactSha256: "a".repeat(64), +}; + +const pathIdentity = (requestedPath: string, fileIdentity: string) => ({ + requestedPath, + finalPath: requestedPath, + filesystem: "ntfs" as const, + volumeIdentity: "0123456789abcdef", + fileIdentity, + reparseDisposition: "absent" as const, +}); + +const privateDacl = (input: { + readonly objectKind: "directory" | "file"; + readonly protection: "protected" | "inherited_from_protected_parent"; + readonly aceDisposition: "explicit" | "inherited"; + readonly propagation: "none" | "container_and_object"; + readonly currentUserRights: "read_execute" | "modify"; + readonly verifiedObjectCount: number; + readonly digestByte: string; +}) => ({ + objectKind: input.objectKind, + owner: "current_user" as const, + dacl: "present" as const, + protection: input.protection, + aceDisposition: input.aceDisposition, + propagation: input.propagation, + additionalTrustees: "absent" as const, + broadAllowEntries: "absent" as const, + currentUserRights: input.currentUserRights, + systemRights: "full_control" as const, + ownerRights: "write_dac_write_owner_denied" as const, + descriptorSha256: input.digestByte.repeat(64), + verifiedObjectCount: input.verifiedObjectCount, + policyManifestSha256: input.digestByte.repeat(64), +}); + +const privateRootObservation = (canonicalPath: string) => { + const manifestSha256 = "c".repeat(64); + const launchSha256 = "e".repeat(64); + const policies = { + rootDirectory: privateDacl({ + objectKind: "directory", + protection: "protected", + aceDisposition: "explicit", + propagation: "none", + currentUserRights: "read_execute", + verifiedObjectCount: 1, + digestByte: "1", + }), + readonlyDirectories: privateDacl({ + objectKind: "directory", + protection: "protected", + aceDisposition: "explicit", + propagation: "container_and_object", + currentUserRights: "read_execute", + verifiedObjectCount: 20, + digestByte: "2", + }), + readonlyFiles: privateDacl({ + objectKind: "file", + protection: "protected", + aceDisposition: "explicit", + propagation: "none", + currentUserRights: "read_execute", + verifiedObjectCount: 100, + digestByte: "3", + }), + writableDirectories: privateDacl({ + objectKind: "directory", + protection: "protected", + aceDisposition: "explicit", + propagation: "container_and_object", + currentUserRights: "modify", + verifiedObjectCount: 3, + digestByte: "4", + }), + writableFiles: privateDacl({ + objectKind: "file", + protection: "inherited_from_protected_parent", + aceDisposition: "inherited", + propagation: "none", + currentUserRights: "modify", + verifiedObjectCount: 0, + digestByte: "5", + }), + }; + const commitment = { + version: 1, + projectionManifestSha256: manifestSha256, + launchSha256, + ...Object.fromEntries( + Object.entries(policies).map(([name, policy]) => [ + name, + { + verifiedObjectCount: policy.verifiedObjectCount, + policyManifestSha256: policy.policyManifestSha256, + }, + ]), + ), + }; + return { + canonicalPath, + stableIdentity: "root:1", + state: "sealed" as const, + manifestSha256, + launchSha256, + fileCount: 100, + directoryCount: 24, + totalBytes: 1_000, + entrypoint: { + relativePath: "jdk\\bin\\java.exe", + sha256: "d".repeat(64), + stableIdentity: "projected-file:1", + }, + security: { + manifestSha256: createHash("sha256") + .update(JSON.stringify(commitment)) + .digest("hex"), + ...policies, + }, + }; +}; + +const privateRootPolicyOverride = ( + policyName: + | "rootDirectory" + | "readonlyDirectories" + | "readonlyFiles" + | "writableDirectories" + | "writableFiles", + override: Readonly>, +) => { + const observation = privateRootObservation("C:\\runtime\\rea-1"); + const policy = observation.security[policyName]; + return { + ...observation, + security: { + ...observation.security, + [policyName]: { ...policy, ...override }, + }, + }; +}; + +class FakeResource implements WindowsNativeBackendResource { + readonly close = vi.fn(() => Promise.resolve(ok(undefined))); +} + +const jobOwnership = { + jobObject: "dedicated_unnamed", + assignment: "proc_thread_attribute_job_list", + processExecution: "job_assigned_at_creation", + killOnJobClose: "enabled", + breakaway: "disabled", + nestedJob: "absent", + ownerHandle: "retained_non_inheritable", + jobHandleOwnership: "single_rea_handle", + inheritedHandles: "stdio_only", + membership: "verified", +}; + +const jobOwnershipObservation = { + ...jobOwnership, + policySha256: createHash("sha256") + .update(JSON.stringify({ version: 1, ...jobOwnership })) + .digest("hex"), +}; + +class FakeProcess extends FakeResource implements WindowsNativeBackendProcess { + readonly processId = 42; + constructor(readonly ownership: unknown = jobOwnership) { + super(); + } + readonly closeProcess = vi.fn(() => + Promise.resolve(ok({ status: "terminated" as const })), + ); + readonly waitForExit = vi.fn(() => + Promise.resolve(ok({ status: "exited" as const, exitCode: 0 })), + ); + snapshot(): WindowsOwnedProcessSnapshot { + return { + stdout: { + retained: new Uint8Array([2, 3]), + totalBytes: 3, + truncated: true, + }, + stderr: { + retained: new Uint8Array(), + totalBytes: 0, + truncated: false, + }, + exit: null, + }; + } +} + +const recordingBackend = () => { + const fileResource = new FakeResource(); + const directoryResource = new FakeResource(); + const rootResource = new FakeResource(); + const process = new FakeProcess(); + const backend: WindowsNativeAuthorityBackend = { + identity, + admitFile: vi.fn((input) => + Promise.resolve( + ok({ + resource: fileResource, + observation: { + kind: "file", + ...pathIdentity(input.path, "00112233445566778899aabbccddeeff"), + sha256: "b".repeat(64), + }, + }), + ), + ), + admitDirectory: vi.fn( + (input) => + Promise.resolve( + ok({ + resource: directoryResource, + observation: { + kind: "directory", + ...pathIdentity(input.path, "3".repeat(32)), + sha256: null, + }, + }), + ), + ), + createPrivateRoot: vi.fn< + WindowsNativeAuthorityBackend["createPrivateRoot"] + >((input) => + Promise.resolve( + ok({ + resource: rootResource, + observation: privateRootObservation(`C:\\runtime\\${input.prefix}1`), + }), + ), + ), + spawnOwnedProcess: vi.fn(() => Promise.resolve(ok(new FakeProcess()))), + }; + vi.mocked(backend.spawnOwnedProcess).mockResolvedValueOnce(ok(process)); + return { backend, fileResource, directoryResource, rootResource, process }; +}; + +const control: WindowsNativeOperationControl = { deadlineMs: 10_000 }; + +describe("Windows native authority port", () => { + it("fails closed when the optional adapter is unavailable", async () => { + const authority = new WindowsNativeAuthority( + unavailableWindowsNativeAuthorityBackend("package is not installed"), + ); + expect(authority.identity).toBeNull(); + await expect( + authority.admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { operation: "admit_path", reason: "unavailable" }, + }); + }); + + it("parses stable NTFS identity and closes malformed native observations", async () => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const admitted = await authority.admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }); + expect(admitted).toMatchObject({ + ok: true, + value: { + requestedPath: "C:\\rea\\provider.exe", + finalPath: "C:\\rea\\provider.exe", + filesystem: "ntfs", + volumeIdentity: "0123456789abcdef", + fileIdentity: "00112233445566778899aabbccddeeff", + stableIdentity: + "ntfs:0123456789abcdef:00112233445566778899aabbccddeeff", + }, + }); + + const malformed = recordingBackend(); + vi.mocked(malformed.backend.admitFile).mockResolvedValueOnce( + ok({ + resource: malformed.fileResource, + observation: { + kind: "file", + ...pathIdentity("C:\\other\\provider.exe", "2".repeat(32)), + sha256: "b".repeat(64), + }, + }), + ); + await expect( + new WindowsNativeAuthority(malformed.backend).admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { + operation: "admit_path", + reason: "native_contract_mismatch", + }, + }); + expect(malformed.fileResource.close).toHaveBeenCalledOnce(); + }); + + it.each([ + [ + "uppercase identity", + { + kind: "file", + ...pathIdentity("C:\\rea\\provider.exe", "A".repeat(32)), + sha256: "b".repeat(64), + }, + ], + [ + "unsupported filesystem", + { + kind: "file", + ...pathIdentity( + "C:\\rea\\provider.exe", + "00112233445566778899aabbccddeeff", + ), + filesystem: "refs", + sha256: "b".repeat(64), + }, + ], + [ + "unknown field", + { + kind: "file", + ...pathIdentity( + "C:\\rea\\provider.exe", + "00112233445566778899aabbccddeeff", + ), + sha256: "b".repeat(64), + unexpected: true, + }, + ], + ])("rejects a native observation with %s", async (_name, observation) => { + const recorded = recordingBackend(); + vi.mocked(recorded.backend.admitFile).mockResolvedValueOnce( + ok({ resource: recorded.fileResource, observation }), + ); + await expect( + new WindowsNativeAuthority(recorded.backend).admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(recorded.fileResource.close).toHaveBeenCalledOnce(); + }); + + it.each([ + ["null DACL", privateRootPolicyOverride("rootDirectory", { dacl: "null" })], + [ + "broad allow entry", + privateRootPolicyOverride("readonlyFiles", { + broadAllowEntries: "present", + }), + ], + [ + "non-modifiable writable policy", + privateRootPolicyOverride("writableDirectories", { + currentUserRights: "read_execute", + }), + ], + [ + "wrong owner", + privateRootPolicyOverride("rootDirectory", { owner: "administrators" }), + ], + [ + "unprotected immutable file", + privateRootPolicyOverride("readonlyFiles", { + protection: "inherited_from_protected_parent", + }), + ], + [ + "missing OWNER RIGHTS denial", + privateRootPolicyOverride("readonlyDirectories", { + ownerRights: "absent", + }), + ], + [ + "additional trustee", + privateRootPolicyOverride("writableFiles", { + additionalTrustees: "present", + }), + ], + [ + "wrong SYSTEM rights", + privateRootPolicyOverride("rootDirectory", { systemRights: "modify" }), + ], + [ + "leaf propagation", + privateRootPolicyOverride("readonlyFiles", { + propagation: "container_and_object", + }), + ], + [ + "unknown policy field", + privateRootPolicyOverride("rootDirectory", { unexpected: true }), + ], + [ + "malformed descriptor digest", + privateRootPolicyOverride("rootDirectory", { descriptorSha256: "abc" }), + ], + [ + "mismatched object count", + { + ...privateRootObservation("C:\\runtime\\rea-1"), + fileCount: 101, + }, + ], + [ + "mismatched security manifest", + { + ...privateRootObservation("C:\\runtime\\rea-1"), + security: { + ...privateRootObservation("C:\\runtime\\rea-1").security, + manifestSha256: "0".repeat(64), + }, + }, + ], + [ + "security manifest from another projection", + { + ...privateRootObservation("C:\\runtime\\rea-1"), + manifestSha256: "a".repeat(64), + }, + ], + ])( + "rejects a private-root observation with %s", + async (_name, observation) => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const directory = await authority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!directory.ok) throw new Error("fake directory admission failed"); + vi.mocked(recorded.backend.createPrivateRoot).mockResolvedValueOnce( + ok({ resource: recorded.rootResource, observation }), + ); + await expect( + authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { + operation: "create_private_root", + reason: "native_contract_mismatch", + }, + }); + expect(recorded.rootResource.close).toHaveBeenCalledOnce(); + }, + ); + + it("scopes resources, deadlines, and process lifetime to one authority", async () => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const foreignAuthority = new WindowsNativeAuthority( + recordingBackend().backend, + ); + const file = await authority.admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }); + const directory = await authority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!file.ok || !directory.ok) throw new Error("fake admission failed"); + const foreignDirectory = await foreignAuthority.admitPath({ + ...control, + path: "C:\\foreign-jdk", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!foreignDirectory.ok) throw new Error("fake foreign admission failed"); + + await expect( + foreignAuthority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { operation: "create_private_root", reason: "invalid_input" }, + }); + await expect( + authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [ + { + role: "jdk", + source: foreignDirectory.value, + destination: "jdk", + }, + ], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { operation: "create_private_root", reason: "invalid_input" }, + }); + + const root = await authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [ + { + role: "jdk", + source: directory.value, + destination: "jdk", + }, + ], + files: [ + { + role: "target", + source: file.value, + destination: "in\\target.exe", + }, + ], + writableDirectories: ["home", "tmp"], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: ["-version"], environment: {} }, + limits: { entries: 1_000, depth: 20, bytes: 1_000_000 }, + }); + if (!root.ok) throw new Error("fake root creation failed"); + expect(root.value.security).toMatchObject({ + rootDirectory: { + dacl: "present", + protection: "protected", + aceDisposition: "explicit", + propagation: "none", + currentUserRights: "read_execute", + ownerRights: "write_dac_write_owner_denied", + }, + readonlyDirectories: { currentUserRights: "read_execute" }, + readonlyFiles: { currentUserRights: "read_execute" }, + writableDirectories: { currentUserRights: "modify" }, + writableFiles: { + protection: "inherited_from_protected_parent", + aceDisposition: "inherited", + currentUserRights: "modify", + }, + }); + const spawned = await authority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 2, stderrBytes: 2 }, + }); + if (!spawned.ok) throw new Error("fake process spawn failed"); + expect(spawned.value.ownership).toEqual(jobOwnershipObservation); + + expect(recorded.backend.createPrivateRoot).toHaveBeenCalledWith({ + parent: recorded.directoryResource, + prefix: "rea-", + trees: [ + { + role: "jdk", + source: recorded.directoryResource, + destination: "jdk", + }, + ], + files: [ + { + role: "target", + source: recorded.fileResource, + destination: "in\\target.exe", + }, + ], + writableDirectories: ["home", "tmp"], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: ["-version"], environment: {} }, + limits: { entries: 1_000, depth: 20, bytes: 1_000_000 }, + control, + }); + expect(spawned.value.snapshot().stdout).toMatchObject({ + totalBytes: 3, + truncated: true, + }); + vi.spyOn(recorded.process, "snapshot").mockReturnValueOnce({ + stdout: { retained: new Uint8Array(3), totalBytes: 3, truncated: false }, + stderr: { retained: new Uint8Array(), totalBytes: 0, truncated: false }, + exit: null, + }); + expect(() => spawned.value.snapshot()).toThrowError( + expect.objectContaining({ + operation: "observe_process", + reason: "native_contract_mismatch", + }), + ); + recorded.process.waitForExit.mockResolvedValueOnce( + ok({ status: "exited", exitCode: 1.5 }) as never, + ); + await expect(spawned.value.waitForExit()).resolves.toMatchObject({ + ok: false, + error: { + operation: "wait_for_exit", + reason: "native_contract_mismatch", + }, + }); + recorded.process.waitForExit.mockRejectedValueOnce( + new Error("native wait rejection"), + ); + await expect(spawned.value.waitForExit()).resolves.toMatchObject({ + ok: false, + error: { operation: "wait_for_exit", reason: "native_failure" }, + }); + recorded.process.closeProcess.mockRejectedValueOnce( + new Error("native close rejection"), + ); + const firstClose = await spawned.value.close(); + const secondClose = await spawned.value.close(); + expect(firstClose).toMatchObject({ + ok: false, + error: { operation: "close_resource", reason: "native_failure" }, + }); + expect(secondClose).toBe(firstClose); + expect(recorded.process.closeProcess).toHaveBeenCalledTimes(1); + + await file.value.close(); + await file.value.close(); + expect(recorded.fileResource.close).toHaveBeenCalledTimes(1); + + const projectedSpawn = await authority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 2, stderrBytes: 2 }, + }); + expect(projectedSpawn.ok).toBe(true); + + await root.value.close(); + await root.value.close(); + expect(recorded.rootResource.close).toHaveBeenCalledTimes(1); + await expect( + authority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 2, stderrBytes: 2 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { operation: "spawn_owned_process", reason: "identity_drift" }, + }); + }); + + it.each([ + ["named Job", { ...jobOwnership, jobObject: "named" }], + [ + "post-create assignment", + { ...jobOwnership, assignment: "assign_after_create" }, + ], + [ + "pre-assignment execution", + { ...jobOwnership, processExecution: "started_unassigned" }, + ], + ["disabled kill-on-close", { ...jobOwnership, killOnJobClose: "disabled" }], + ["breakaway", { ...jobOwnership, breakaway: "enabled" }], + ["nested Job", { ...jobOwnership, nestedJob: "compatible" }], + [ + "inheritable owner handle", + { ...jobOwnership, ownerHandle: "inheritable" }, + ], + [ + "duplicate Job handle", + { ...jobOwnership, jobHandleOwnership: "multiple_handles" }, + ], + [ + "ambient inherited handles", + { ...jobOwnership, inheritedHandles: "ambient" }, + ], + ["unverified membership", { ...jobOwnership, membership: "assumed" }], + ["unknown policy field", { ...jobOwnership, unexpected: true }], + ])("rejects a process with %s", async (_name, malformedOwnership) => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const directory = await authority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!directory.ok) throw new Error("fake directory admission failed"); + const root = await authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }); + if (!root.ok) throw new Error("fake root creation failed"); + const malformed = new FakeProcess(malformedOwnership); + vi.mocked(recorded.backend.spawnOwnedProcess).mockReset(); + vi.mocked(recorded.backend.spawnOwnedProcess).mockResolvedValueOnce( + ok(malformed), + ); + await expect( + authority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 1, stderrBytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { + operation: "spawn_owned_process", + reason: "native_contract_mismatch", + }, + }); + expect(malformed.closeProcess).toHaveBeenCalledOnce(); + }); + + it("rejects a process with an invalid native process identifier", async () => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const directory = await authority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!directory.ok) throw new Error("fake directory admission failed"); + const root = await authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }); + if (!root.ok) throw new Error("fake root creation failed"); + const malformed = new FakeProcess(); + Object.defineProperty(malformed, "processId", { value: -1 }); + vi.mocked(recorded.backend.spawnOwnedProcess).mockReset(); + vi.mocked(recorded.backend.spawnOwnedProcess).mockResolvedValueOnce( + ok(malformed), + ); + + await expect( + authority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 1, stderrBytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { + operation: "spawn_owned_process", + reason: "native_contract_mismatch", + }, + }); + expect(malformed.closeProcess).toHaveBeenCalledOnce(); + }); + + it("defers resource closure across in-flight projection and spawn operations", async () => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const file = await authority.admitPath({ + ...control, + path: "C:\\rea\\target.exe", + kind: "file", + reparsePolicy: "reject_all", + }); + const directory = await authority.admitPath({ + ...control, + path: "C:\\rea\\jdk", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!file.ok || !directory.ok) throw new Error("fake admission failed"); + + const rootDeferred = + deferred< + Awaited> + >(); + vi.mocked(recorded.backend.createPrivateRoot).mockReturnValueOnce( + rootDeferred.promise, + ); + const trees = [ + { role: "jdk" as const, source: directory.value, destination: "jdk" }, + ]; + const files = [ + { + role: "target" as const, + source: file.value, + destination: "in\\target.exe", + }, + ]; + const writableDirectories = ["home"]; + const launchArguments = ["-version"]; + const launchEnvironment: Record = { HOME: "home" }; + const pendingRoot = authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees, + files, + writableDirectories, + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { + arguments: launchArguments, + environment: launchEnvironment, + }, + limits: { entries: 10, depth: 3, bytes: 1_000 }, + }); + + trees[0]!.destination = "mutated"; + files[0]!.destination = "mutated"; + writableDirectories.push("mutated"); + launchArguments.push("mutated"); + launchEnvironment.HOME = "mutated"; + const directoryClose = directory.value.close(); + const fileClose = file.value.close(); + expect(recorded.directoryResource.close).not.toHaveBeenCalled(); + expect(recorded.fileResource.close).not.toHaveBeenCalled(); + expect(recorded.backend.createPrivateRoot).toHaveBeenCalledWith( + expect.objectContaining({ + trees: [expect.objectContaining({ destination: "jdk" })], + files: [expect.objectContaining({ destination: "in\\target.exe" })], + writableDirectories: ["home"], + launch: { arguments: ["-version"], environment: { HOME: "home" } }, + }), + ); + + rootDeferred.resolve( + ok({ + resource: recorded.rootResource, + observation: privateRootObservation("C:\\runtime\\rea-1"), + }), + ); + const root = await pendingRoot; + expect(root.ok).toBe(true); + await Promise.all([directoryClose, fileClose]); + expect(recorded.directoryResource.close).toHaveBeenCalledOnce(); + expect(recorded.fileResource.close).toHaveBeenCalledOnce(); + if (!root.ok) throw new Error("fake root creation failed"); + + const spawnDeferred = + deferred< + Awaited> + >(); + vi.mocked(recorded.backend.spawnOwnedProcess).mockReturnValueOnce( + spawnDeferred.promise, + ); + const pendingSpawn = authority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 2, stderrBytes: 2 }, + }); + const rootClose = root.value.close(); + expect(recorded.rootResource.close).not.toHaveBeenCalled(); + spawnDeferred.resolve(ok(new FakeProcess())); + expect((await pendingSpawn).ok).toBe(true); + await rootClose; + expect(recorded.rootResource.close).toHaveBeenCalledOnce(); + }); + + it("rejects duplicate and cross-kind backend resource tokens", async () => { + const shared = new FakeResource(); + const recorded = recordingBackend(); + vi.mocked(recorded.backend.admitFile).mockResolvedValue( + ok({ + resource: shared, + observation: { + kind: "file", + ...pathIdentity("C:\\rea\\a.exe", "4".repeat(32)), + sha256: "a".repeat(64), + }, + }), + ); + vi.mocked(recorded.backend.admitDirectory).mockResolvedValue( + ok({ + resource: shared, + observation: { + kind: "directory", + ...pathIdentity("C:\\rea", "5".repeat(32)), + sha256: null, + }, + }), + ); + const authority = new WindowsNativeAuthority(recorded.backend); + expect( + ( + await authority.admitPath({ + ...control, + path: "C:\\rea\\a.exe", + kind: "file", + reparsePolicy: "reject_all", + }) + ).ok, + ).toBe(true); + await expect( + authority.admitPath({ + ...control, + path: "C:\\rea\\b.exe", + kind: "file", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + await expect( + authority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + + const secondAuthority = new WindowsNativeAuthority(recorded.backend); + await expect( + secondAuthority.admitPath({ + ...control, + path: "C:\\rea\\c.exe", + kind: "file", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(shared.close).toHaveBeenCalledOnce(); + }); + + it("defers alias poisoning until an existing resource lease is released", async () => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const directory = await authority.admitPath({ + ...control, + path: "C:\\rea\\jdk", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!directory.ok) throw new Error("fake directory admission failed"); + recorded.directoryResource.close.mockRejectedValueOnce( + new Error("fixture cleanup rejection"), + ); + + const rootDeferred = + deferred< + Awaited> + >(); + vi.mocked(recorded.backend.createPrivateRoot).mockReturnValueOnce( + rootDeferred.promise, + ); + const pendingRoot = authority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }); + vi.mocked(recorded.backend.admitFile).mockResolvedValueOnce( + ok({ + resource: recorded.directoryResource, + observation: { + kind: "file", + ...pathIdentity("C:\\rea\\alias.exe", "6".repeat(32)), + sha256: "a".repeat(64), + }, + }), + ); + const pendingAlias = authority.admitPath({ + ...control, + path: "C:\\rea\\alias.exe", + kind: "file", + reparsePolicy: "reject_all", + }); + await Promise.resolve(); + expect(recorded.directoryResource.close).not.toHaveBeenCalled(); + + rootDeferred.resolve( + err( + new WindowsNativeAuthorityError( + "create_private_root", + "native_failure", + "fixture failure", + ), + ), + ); + await pendingRoot; + await expect(pendingAlias).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(recorded.directoryResource.close).toHaveBeenCalledOnce(); + await expect(directory.value.close()).resolves.toMatchObject({ + ok: false, + error: { operation: "close_resource", reason: "native_failure" }, + }); + }); + + it("preserves alias rejection when registered cleanup rejects immediately", async () => { + const recorded = recordingBackend(); + const authority = new WindowsNativeAuthority(recorded.backend); + const file = await authority.admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }); + if (!file.ok) throw new Error("fake file admission failed"); + recorded.fileResource.close.mockRejectedValueOnce( + new Error("fixture cleanup rejection"), + ); + await expect( + authority.admitPath({ + ...control, + path: "C:\\rea\\provider.exe", + kind: "file", + reparsePolicy: "reject_all", + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + await expect(file.value.close()).resolves.toMatchObject({ + ok: false, + error: { operation: "close_resource", reason: "native_failure" }, + }); + }); + + it("cleans up aliased roots and jobs before rejecting them", async () => { + const rootAlias = recordingBackend(); + const rootAuthority = new WindowsNativeAuthority(rootAlias.backend); + const directory = await rootAuthority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!directory.ok) throw new Error("fake admission failed"); + vi.mocked(rootAlias.backend.createPrivateRoot).mockImplementationOnce( + async (input) => + ok({ + resource: rootAlias.directoryResource, + observation: privateRootObservation( + `C:\\runtime\\${input.prefix}alias`, + ), + }), + ); + await expect( + rootAuthority.createPrivateRoot({ + ...control, + parent: directory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(rootAlias.directoryResource.close).toHaveBeenCalledOnce(); + + const processAlias = recordingBackend(); + const processAuthority = new WindowsNativeAuthority(processAlias.backend); + const processDirectory = await processAuthority.admitPath({ + ...control, + path: "C:\\rea", + kind: "directory", + reparsePolicy: "reject_all", + }); + if (!processDirectory.ok) throw new Error("fake admission failed"); + vi.mocked(processAlias.backend.createPrivateRoot).mockImplementationOnce( + async (input) => + ok({ + resource: processAlias.process, + observation: privateRootObservation( + `C:\\runtime\\${input.prefix}process-alias`, + ), + }), + ); + const root = await processAuthority.createPrivateRoot({ + ...control, + parent: processDirectory.value, + prefix: "rea-", + trees: [], + files: [], + writableDirectories: [], + entrypoint: { treeRole: "jdk", relativePath: "bin\\java.exe" }, + launch: { arguments: [], environment: {} }, + limits: { entries: 1, depth: 1, bytes: 1 }, + }); + if (!root.ok) throw new Error("fake root creation failed"); + await expect( + processAuthority.spawnOwnedProcess({ + ...control, + runtimeProjection: root.value, + limits: { stdoutBytes: 1, stderrBytes: 1 }, + }), + ).resolves.toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(processAlias.process.close).toHaveBeenCalledOnce(); + expect(processAlias.process.closeProcess).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/windowsNativeAuthorityLoader.test.ts b/tests/windowsNativeAuthorityLoader.test.ts new file mode 100644 index 0000000000..19c250ef6d --- /dev/null +++ b/tests/windowsNativeAuthorityLoader.test.ts @@ -0,0 +1,273 @@ +import { createHash } from "node:crypto"; + +import { describe, expect, it } from "vitest"; + +import { + createWindowsNativeAuthorityPackageLoader, + WindowsNativeAuthorityPackageLoader, + type WindowsNativeAuthorityLoadHost, + type WindowsNativeAuthorityPackageCommitment, +} from "../src/application/WindowsNativeAuthorityLoader.js"; +import { + unavailableWindowsNativeAuthorityBackend, + type WindowsNativeAuthorityBackend, +} from "../src/application/WindowsNativeAuthority.js"; + +const artifact = Buffer.from("source-owned-windows-native-addon"); +const digest = createHash("sha256").update(artifact).digest("hex"); +const packageManifestObject = { + name: "@rea/windows-x64", + version: "2.0.0", + os: ["win32"], + cpu: ["x64"], + reaNativeAuthority: { + contractVersion: 1, + nodeApiVersion: 9, + artifact: "rea.node", + artifactSha256: digest, + exports: [ + "admitDirectory", + "admitFile", + "createPrivateRoot", + "identity", + "spawnOwnedProcess", + ], + }, +} as const; +const packageManifest = Buffer.from(JSON.stringify(packageManifestObject)); + +const commitment: WindowsNativeAuthorityPackageCommitment = { + packageName: "@rea/windows-x64", + packageVersion: "2.0.0", + contractVersion: 1, + nodeApiVersion: 9, + artifactSha256: digest, +}; + +const backend = (): WindowsNativeAuthorityBackend => ({ + ...unavailableWindowsNativeAuthorityBackend("not exercised"), + identity: { + packageName: commitment.packageName, + packageVersion: commitment.packageVersion, + contractVersion: commitment.contractVersion, + nodeApiVersion: commitment.nodeApiVersion, + artifactSha256: digest, + }, +}); + +class RecordingLoadHost implements WindowsNativeAuthorityLoadHost { + readonly platform: NodeJS.Platform; + readonly architecture: string; + readonly nodeApiVersion: number | null; + readonly events: string[] = []; + module: unknown = backend(); + bytes: Uint8Array = artifact; + manifestBytes: Uint8Array = packageManifest; + cachedValue: unknown | undefined; + resolveFailure: unknown | undefined; + + constructor( + options: { + readonly platform?: NodeJS.Platform; + readonly architecture?: string; + readonly nodeApiVersion?: number | null; + } = {}, + ) { + this.platform = options.platform ?? "win32"; + this.architecture = options.architecture ?? "x64"; + this.nodeApiVersion = + options.nodeApiVersion === undefined ? 10 : options.nodeApiVersion; + } + + resolve(packageName: string): string { + this.events.push(`resolve:${packageName}`); + if (this.resolveFailure !== undefined) throw this.resolveFailure; + return "C:\\rea\\node_modules\\@rea\\windows-x64\\rea.node"; + } + + resolveManifest(packageName: string): string { + this.events.push(`resolve-manifest:${packageName}`); + return "C:\\rea\\node_modules\\@rea\\windows-x64\\package.json"; + } + + async canonicalize(path: string): Promise { + this.events.push("canonicalize"); + return path.toLowerCase(); + } + + async read(path: string): Promise { + if (path.endsWith("package.json")) { + this.events.push("read-manifest"); + return this.manifestBytes; + } + this.events.push("read-addon"); + return this.bytes; + } + + cached(_path: string): unknown | undefined { + this.events.push("cached"); + return this.cachedValue; + } + + load(_path: string): unknown { + this.events.push("load"); + return this.module; + } +} + +describe("Windows native authority package loader", () => { + it("owns one production loader for the process lifetime", () => { + expect(createWindowsNativeAuthorityPackageLoader()).toBe( + createWindowsNativeAuthorityPackageLoader(), + ); + }); + + it("loads and pins one exact release tuple idempotently", async () => { + const host = new RecordingLoadHost(); + const loader = new WindowsNativeAuthorityPackageLoader(host, commitment); + + const [first, concurrent] = await Promise.all([ + loader.load(), + loader.load(), + ]); + const second = await loader.load(); + + expect(first).toMatchObject({ ok: true }); + expect(concurrent).toEqual(first); + expect(second).toEqual(first); + expect(host.events).toEqual([ + "resolve-manifest:@rea/windows-x64", + "canonicalize", + "read-manifest", + "resolve:@rea/windows-x64", + "canonicalize", + "canonicalize", + "cached", + "read-addon", + "load", + ]); + }); + + it.each([ + ["wrong platform", { platform: "linux" as const }, commitment], + ["wrong architecture", { architecture: "arm64" }, commitment], + ["old Node-API", { nodeApiVersion: 8 }, commitment], + ["missing Node-API", { nodeApiVersion: null }, commitment], + ["uncommitted artifact", {}, { ...commitment, artifactSha256: null }], + ])( + "fails before package resolution for %s", + async (_name, options, expected) => { + const host = new RecordingLoadHost(options); + const result = await new WindowsNativeAuthorityPackageLoader( + host, + expected, + ).load(); + + expect(result).toMatchObject({ + ok: false, + error: { reason: "unavailable" }, + }); + expect(host.events).toEqual([]); + }, + ); + + it("fails closed when the optional package is absent", async () => { + const host = new RecordingLoadHost(); + host.resolveFailure = new Error("module details must not escape"); + + const result = await new WindowsNativeAuthorityPackageLoader( + host, + commitment, + ).load(); + + expect(result).toMatchObject({ + ok: false, + error: { + reason: "unavailable", + message: + "Windows native authority package is not installed or resolvable", + }, + }); + expect(host.events).toEqual([ + "resolve-manifest:@rea/windows-x64", + "canonicalize", + "read-manifest", + "resolve:@rea/windows-x64", + ]); + }); + + it("rejects platform manifest drift before addon resolution", async () => { + const host = new RecordingLoadHost(); + host.manifestBytes = Buffer.from( + JSON.stringify({ + ...packageManifestObject, + version: "1.0.0", + }), + ); + + const result = await new WindowsNativeAuthorityPackageLoader( + host, + commitment, + ).load(); + + expect(result).toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(host.events).not.toContain("resolve:@rea/windows-x64"); + expect(host.events).not.toContain("load"); + }); + + it("rejects cache contamination and digest drift before evaluation", async () => { + const cached = new RecordingLoadHost(); + cached.cachedValue = backend(); + const cachedResult = await new WindowsNativeAuthorityPackageLoader( + cached, + commitment, + ).load(); + expect(cachedResult).toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + expect(cached.events).not.toContain("read-addon"); + expect(cached.events).not.toContain("load"); + + const drifted = new RecordingLoadHost(); + drifted.bytes = Buffer.from("different-addon"); + const driftedResult = await new WindowsNativeAuthorityPackageLoader( + drifted, + commitment, + ).load(); + expect(driftedResult).toMatchObject({ + ok: false, + error: { reason: "identity_drift" }, + }); + expect(drifted.events).not.toContain("load"); + }); + + it.each([ + ["non-object", null], + ["extra export", { ...backend(), unexpected: true }], + ["missing operation", { ...backend(), admitFile: undefined }], + [ + "wrong package version", + { + ...backend(), + identity: { ...backend().identity, packageVersion: "1.0.0" }, + }, + ], + ])("rejects a %s native contract", async (_name, module) => { + const host = new RecordingLoadHost(); + host.module = module; + + const result = await new WindowsNativeAuthorityPackageLoader( + host, + commitment, + ).load(); + + expect(result).toMatchObject({ + ok: false, + error: { reason: "native_contract_mismatch" }, + }); + }); +}); From 49f1ec14fe4f5b67345ff9dde8af8ef1066fb3c8 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sat, 18 Jul 2026 01:46:40 +0000 Subject: [PATCH 5/5] fix: remove unused boundary exports --- docs/api/assets/hierarchy.js | 2 +- docs/api/assets/navigation.js | 2 +- docs/api/assets/search.js | 2 +- ...rmissionAuthority.PermissionAuthority.html | 39 ++-- ...rmissionAuthority.PermissionPathError.html | 2 +- ...ocessCaptureError.ProcessCaptureError.html | 2 +- ...sionStore.ProjectPermissionStoreError.html | 10 +- ...ativeAuthority.WindowsNativeAuthority.html | 167 ++++++++++++++++++ ...Authority.WindowsNativeAuthorityError.html | 101 +++++++++++ ...r.WindowsNativeAuthorityPackageLoader.html | 86 +++++++++ ...serProcessStartup.BrowserStartupError.html | 2 +- ...idra_GhidraLauncher.GhidraLaunchError.html | 2 +- ...GhidraSessionError.GhidraSessionError.html | 2 +- .../ghidra_protocol.GhidraRemoteError.html | 2 +- ...PrivateRuntimeRoot.PrivateRuntimeRoot.html | 13 +- ...ityInventory.buildCapabilityInventory.html | 8 +- .../application_Doctor.runDoctor.html | 6 +- .../application_Doctor.systemDoctorHost.html | 2 +- ...rDiagnostics.collectDoctorDiagnostics.html | 45 +++++ ...ation_DoctorDiagnostics.doctorHealthy.html | 45 +++++ ...onAuthority.createPermissionAuthority.html | 2 +- ...ssion.processCapturePermissionRequest.html | 44 +++++ ...ProcessCli.captureProcessScenarioFile.html | 2 +- ...rocessCli.compareProcessEvidenceFiles.html | 2 +- ...ion_ProcessCli.projectProcessCliError.html | 2 +- ...ssionStore.readProjectPermissionStore.html | 6 +- ...ionStore.revokeProjectPermissionGrant.html | 2 +- ...sionStore.writeProjectPermissionStore.html | 6 +- ...lHopperAssertions.requireAddressArray.html | 2 +- ...sertions.requireFunctionDossierOracle.html | 45 +++++ ...Capabilities.probeWindowsCapabilities.html | 2 +- ...bilities.systemNoFollowOpenCapability.html | 45 +++++ ...vailableWindowsNativeAuthorityBackend.html | 44 +++++ ...teWindowsNativeAuthorityPackageLoader.html | 40 +++++ docs/api/functions/config.parseConfig.html | 2 +- ...missionPolicy.clearSessionPermissions.html | 2 +- ...in_permissionPolicy.consumePermission.html | 2 +- ...main_permissionPolicy.isPathContained.html | 2 +- ...licy.isPermissionRequestWithinCeiling.html | 45 +++++ ...issionPolicy.reloadPermissionCeilings.html | 2 +- ...ain_permissionPolicy.revokePermission.html | 2 +- docs/api/functions/main.run.html | 2 +- docs/api/functions/main.runEntrypoint.html | 2 +- ...uthorizeProcessCaptureWithElicitation.html | 47 +++++ .../server_createServer.createServer.html | 2 +- ...sterSessionTools.registerSessionTools.html | 2 +- docs/api/hierarchy.html | 64 ++++--- docs/api/index.html | 4 +- ...ation_AnalysisProvider.AnalysisClient.html | 2 +- ...nalysisProvider.AnalysisOperationPort.html | 2 +- ...ion_AnalysisProvider.AnalysisProvider.html | 2 +- ...sisProvider.AnalysisProviderCandidate.html | 2 +- ...n_BinarySessionPort.BinarySessionPort.html | 2 +- .../application_Doctor.DoctorCheck.html | 12 +- .../application_Doctor.DoctorHost.html | 44 ++--- ...pplication_Doctor.DoctorProviderCheck.html | 14 +- ...ation_Doctor.DoctorProviderInspection.html | 14 +- .../application_Doctor.DoctorReport.html | 82 +++++++++ ...cation_Doctor.SystemDoctorHostOptions.html | 6 +- ...n_DoctorDiagnostics.DoctorDiagnostics.html | 76 ++++++++ ...riptArtifactGraphContext.AstEdgeInput.html | 2 +- ...tifactGraphContext.InferenceEdgeInput.html | 2 +- ...tion_ProcessCli.ProcessCliErrorOutput.html | 8 +- ...opperAssertions.FunctionDossierOracle.html | 100 +++++++++++ .../application_Setup.SetupHost.html | 6 +- .../application_Setup.SetupResult.html | 4 +- ...ilities.WindowsCapabilityDependencies.html | 20 ++- ...sCapabilities.WindowsCapabilityReport.html | 12 +- ...iveAuthority.WindowsAdmittedDirectory.html | 141 +++++++++++++++ ...wsNativeAuthority.WindowsAdmittedFile.html | 141 +++++++++++++++ ...thority.WindowsNativeAuthorityBackend.html | 122 +++++++++++++ ...hority.WindowsNativeAuthorityIdentity.html | 82 +++++++++ ...Authority.WindowsNativeBackendProcess.html | 123 +++++++++++++ ...uthority.WindowsNativeBackendResource.html | 68 +++++++ ...thority.WindowsNativeOperationControl.html | 72 ++++++++ ...wsNativeAuthority.WindowsOwnedProcess.html | 116 ++++++++++++ ...iveAuthority.WindowsOwnedProcessInput.html | 84 +++++++++ ...Authority.WindowsOwnedProcessSnapshot.html | 70 ++++++++ ...veAuthority.WindowsPathAdmissionInput.html | 100 +++++++++++ ...owsNativeAuthority.WindowsPrivateRoot.html | 148 ++++++++++++++++ ...tiveAuthority.WindowsPrivateRootInput.html | 120 +++++++++++++ ...Loader.WindowsNativeAuthorityLoadHost.html | 162 +++++++++++++++++ ...ndowsNativeAuthorityPackageCommitment.html | 82 +++++++++ ...domain_webInventory.StableWebResource.html | 2 +- ...ebInventory.WebInventoryResourceInput.html | 2 +- .../ghidra_GhidraLauncher.GhidraLaunch.html | 2 +- ...essionError.GhidraSessionErrorOptions.html | 2 +- .../hopper_BridgeLauncher.BridgeLaunch.html | 2 +- ...ProviderProcess.ProviderProcessLaunch.html | 2 +- ...Elicitation.ProcessCaptureElicitation.html | 76 ++++++++ ...rver_createServer.CreateServerOptions.html | 30 ++-- ...gisterSessionTools.SessionToolOptions.html | 28 +-- .../application_CapabilityInventory.html | 4 - docs/api/modules/application_Doctor.html | 4 +- .../application_DoctorDiagnostics.html | 40 +++++ .../application_ProcessCapturePermission.html | 36 ++++ .../application_RealHopperAssertions.html | 8 +- .../application_WindowsCapabilities.html | 4 +- .../application_WindowsNativeAuthority.html | 48 +++++ ...lication_WindowsNativeAuthorityLoader.html | 44 +++++ docs/api/modules/domain_permissionPolicy.html | 4 +- .../server_ProcessCaptureElicitation.html | 44 +++++ ...ermissionStore.ProjectPermissionStore.html | 2 +- ...y.WindowsNativeAuthorityFailureReason.html | 35 ++++ ...ority.WindowsNativeAuthorityOperation.html | 35 ++++ ...ation.ProcessCaptureElicitationState.html} | 12 +- docs/product-catalog.json | 4 +- skills/reverse-engineer-anything/SKILL.md | 2 +- src/application/CapabilityInventory.ts | 2 +- src/application/Doctor.ts | 2 +- src/application/WindowsNativeAuthority.ts | 36 ++-- .../WindowsNativeAuthorityLoader.ts | 2 +- 112 files changed, 3281 insertions(+), 240 deletions(-) create mode 100644 docs/api/classes/application_WindowsNativeAuthority.WindowsNativeAuthority.html create mode 100644 docs/api/classes/application_WindowsNativeAuthority.WindowsNativeAuthorityError.html create mode 100644 docs/api/classes/application_WindowsNativeAuthorityLoader.WindowsNativeAuthorityPackageLoader.html create mode 100644 docs/api/functions/application_DoctorDiagnostics.collectDoctorDiagnostics.html create mode 100644 docs/api/functions/application_DoctorDiagnostics.doctorHealthy.html create mode 100644 docs/api/functions/application_ProcessCapturePermission.processCapturePermissionRequest.html create mode 100644 docs/api/functions/application_RealHopperAssertions.requireFunctionDossierOracle.html create mode 100644 docs/api/functions/application_WindowsCapabilities.systemNoFollowOpenCapability.html create mode 100644 docs/api/functions/application_WindowsNativeAuthority.unavailableWindowsNativeAuthorityBackend.html create mode 100644 docs/api/functions/application_WindowsNativeAuthorityLoader.createWindowsNativeAuthorityPackageLoader.html create mode 100644 docs/api/functions/domain_permissionPolicy.isPermissionRequestWithinCeiling.html create mode 100644 docs/api/functions/server_ProcessCaptureElicitation.authorizeProcessCaptureWithElicitation.html create mode 100644 docs/api/interfaces/application_Doctor.DoctorReport.html create mode 100644 docs/api/interfaces/application_DoctorDiagnostics.DoctorDiagnostics.html create mode 100644 docs/api/interfaces/application_RealHopperAssertions.FunctionDossierOracle.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsAdmittedDirectory.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsAdmittedFile.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsNativeAuthorityBackend.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsNativeAuthorityIdentity.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsNativeBackendProcess.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsNativeBackendResource.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsNativeOperationControl.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsOwnedProcess.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsOwnedProcessInput.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsOwnedProcessSnapshot.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsPathAdmissionInput.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsPrivateRoot.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthority.WindowsPrivateRootInput.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthorityLoader.WindowsNativeAuthorityLoadHost.html create mode 100644 docs/api/interfaces/application_WindowsNativeAuthorityLoader.WindowsNativeAuthorityPackageCommitment.html create mode 100644 docs/api/interfaces/server_ProcessCaptureElicitation.ProcessCaptureElicitation.html create mode 100644 docs/api/modules/application_DoctorDiagnostics.html create mode 100644 docs/api/modules/application_ProcessCapturePermission.html create mode 100644 docs/api/modules/application_WindowsNativeAuthority.html create mode 100644 docs/api/modules/application_WindowsNativeAuthorityLoader.html create mode 100644 docs/api/modules/server_ProcessCaptureElicitation.html create mode 100644 docs/api/types/application_WindowsNativeAuthority.WindowsNativeAuthorityFailureReason.html create mode 100644 docs/api/types/application_WindowsNativeAuthority.WindowsNativeAuthorityOperation.html rename docs/api/types/{application_CapabilityInventory.ToolAvailabilityReason.html => server_ProcessCaptureElicitation.ProcessCaptureElicitationState.html} (60%) diff --git a/docs/api/assets/hierarchy.js b/docs/api/assets/hierarchy.js index 652a609435..920da66a28 100644 --- a/docs/api/assets/hierarchy.js +++ b/docs/api/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "eJytml1vnDgUhv8L1y4L2GDIXTvKtllVmyjTqherKHIGZ2KVsVnjSXdU9b9XNjOJCSbYZG8SILznPBwffx3nZySFUF109g+sUAHyJMcJyJMirQDOqyQHKMd5CYoEYQgKDJMCoAKmKcBlmpYgwxlMASrKtAQQ5jm+AZGk9w3dKCZ4F539jLRd/ZuTHY3OovecNIeOdedSChmB6DvjdXSWZiWI9rKJzqJNQ7qOdn/UYkcYv6X6vS4eyOIHtWsi0L8anUWqq99pO+/6ByDaPLCmlpSbz8pLACucAFiVGUBJkgKUpAigJCsBSqD+Ueg/YH1VQYBS/ZEpTABK8xKgFOurUv+hKgDKcAZQViKAsioDCKYYIAhzUKZpVt38ApH2aH3wJ9G2VAZ+riUK+ViUJRigTCNlWQ5Qpr8uyzVwAXs2nDga40oKJTaiWdgoA/kMr4EoMwfEBW/3aiHBs3bevU4Bh/vLvVru3xL7AKTIAbAiLbljDVOHr5w8EtaQu4Yu5Jm25YOXlU48vqFNQ+vFSLbeBwO6ML6wHRWL28lW+yAUdqJeSfHIairX9Di+BUK49T4YuHRgvK9Jq4JHFpfaB6GCFsIHKX50VF7edVQ+kgWhmDDgAZImg9lEKnZPNuqypXIJh1vvgwHtcfRch5Rv6AVXdCuZOgRiuPVBI3+KshsDhjIH2DW9p1JfLAQb6n3iM5gDT2Y+sx0L7bpjrY977GqeP1nwgDqS+jgv7b5ywR9pp9jWpNc3Ib93LQluh1eM+ABVdp/5yr9z8YNf0y3rlAxNVZfaAyFL8GhNtGwoH2t93Kdj90snNJfaByHLRwgL110OsQ8AHC9Lr+lOqNBkHEl9nOeZ6+s3tAvdCYy1Pu4LOHK/VkQuS75npY9rbH/5SvB7tt0vmqzGWh/3pb3W/Ft8YJzIw2VLQ72PpD7OK/vbe/0XIrc0NO4jqYdzOOjzV1TuWNcxwa/pv3smg7v9hAEfEGj3/GvaNuRw1RC+ViR4PnKp5xHMNt0ZjPVGtPTJfZYXJ/eMKyrvyeaZoH0SXYmGbQ7xCyuTGE+mhksWDVXpCgIy22ZzO9lgtFNvpjza8eDscZAb56Mk/O0wxoofiimsWCjf6J1eD3Al5OGadmIv9cqx3XtC/bDk8aSt0NaEMMfJTU87WHytld57fqN3J/MLKEc2/AKna1fpYNvC6i39TPZ88zBD8WAG+ltbQWVs3/ojlBMIVL4Zgk53/ol2QjnG/U5BX4wmxfdt27CNmWFGkI7ByU04acpjsMyrQXXmabY3m1YPlKEgfnE777+AiR2Vjw+slsQrZbbm1VtbQWVs33qmjK6vTiDMpsw8xIKUKWBf2TQXI7JPlNQN7TqffHkN76Udr8YqyhGPT7IMOJ6y48Wth/8ydVVmjotTr6xp+3dvX2hjp60FnT3X5XmY9F2+qLC9E1zV7bEQ4xOzu/7V27EqdjyaD16FymQIc67rYlLwQJqXstj1bJbHHH246sKn0tCVkHMzLHke8m6t4nhP4DQY2qKasgA5Tkp0c4R2na6sGkZnFyletL0lv5HLnBu5jxeG7fkGntkGnQhcgRKY65Ot4hi4onAV4U/mV4TXrCZqbrUSxPxkdMEIXJTAzI0GHg4rOv3uaE3NwvK1TmPTDkTx8G6+s+gEnCII7CgjbTx+EtpLdIB0pMy55auF61BYpwFHPXsJthmfDbZO1kHVYNeKjinqMzLauCNhPH4y29jm2Ncupx7H1uVRnLAQTz0PjaOeWnQccTIsel3wTsn9jnJF67/II1lvJGtVv6f+JKwt5kxY5+zEsy/MBt2cvtsDVKfO663XPs8mfXZ+Our4KEn7sBJc0f9UbFsNjTIuUmyGI3MxiPLpsOD/Bx7b9puazL8rWIyvtn4I5XNBhjO+jYMaeyqwOmt1YM2/FAzXl3otuCKt2sv5ypEN7JDGrmczefnr12+UfrIj" \ No newline at end of file +window.hierarchyData = "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" \ No newline at end of file diff --git a/docs/api/assets/navigation.js b/docs/api/assets/navigation.js index 9063daf996..d941608b00 100644 --- a/docs/api/assets/navigation.js +++ b/docs/api/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "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" \ No newline at end of file +window.navigationData = "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" \ No newline at end of file diff --git a/docs/api/assets/search.js b/docs/api/assets/search.js index 7eea636ce1..2be98cd50f 100644 --- a/docs/api/assets/search.js +++ b/docs/api/assets/search.js @@ -1 +1 @@ -window.searchData = "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"; \ No newline at end of file +window.searchData = "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0LWKuZY67F+YaxV0rWqupQ77V+ZaFV2r7nrD8kO4Mteq6FrVXCuex+fJN1yZa1V0rWpTthzDqYy1KrJWXYjKeQyuDLUqolY11FInwlAZalVErWqoFc/WsB2Wq8y0KppWtQlb6sQgKkOtiqhVDbXUiUFUhloVUasaaqkTg6gMtSqiVrUJW+rEICpjrYqsVY211IlBVMZaFVmrGmupE4OojLUqslY11lInBlGZa1V0rWqupU4MojLXquha1VxLnRhEZa5V0bWquZY6MYjKXKuia1VzLXViEJW5VkXXquZaMfLTAGOtiqxVjbXUiVJUxloVWasaa0UeHK9MtSqqVjXVUieOURlrVWStaqylThyjMtaqyFrVWEudOEZlrFWRtaqxljpxjMpYqyJrVWMtdeIYlbFWRdaqxlrqxDEqY62KrFVj71fnyGGsVZG1qrGWOnGMylyromtVcy114hiVwVZF2KoGW+rEMSqTrYqyVU221IljVCZbFWWrmmypE6WojLYq0lY12lInSlGZbVW0rWq2pU4OojLbqmhb1WxLnRxEZbZV0baq2ZY6a0FUZlsVbauabakThKjMtiraVjXbUicIUZltVbStaralThCiMtuqaFvVbEudIERltlXRtqrZljpBiMpsq6JtVbMtdYIQldlWRduqZlvqBCEqs62KtlUXp3JvgxltVaStarSlzlIOldFWRdqqtgyhOmmKynCrIm5Vwy110hSV4VZF3Ko2h0udNEVlvFWRt6rN4fLuK5hvVfStuliVN9BfGW9V5K1aers6Rx/jrYq8VTtvOamOynirIm/VzltOqqMy3qrIW7XzlrOYQ2W8VZG36s31CCvTrYq6VRepco8bhlsVcat23HIWlagMtyriVjXc4iuAVkZbFWmrLkxVznMWyWp3lclWRdmqXbaciEplslVRtqpN3lInGlIZbVWkrdppy4mGVEZbFWmrGm3xJdUrg62KsFU7bDnpkspgqyJs1Q5bTrqkMtiqCFu1w5aTLqkMtirCVu2w5aRLKoOtirBVO2w56ZLKYKsibFWDrV2gIaTKXKuia1VzLe/0zFirImvVzlpOyqUy1qrIWtVYy3vsY6pVUbWqTdxSJylTGWtVZK1qE7fUScpUBlsVYavaxC11kjKV0VZF2qoLUy3zLMjXy2CrImzVDltO2KYy2KoIW3VBKm/4tjLXquhatbtW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"; \ No newline at end of file diff --git a/docs/api/classes/application_PermissionAuthority.PermissionAuthority.html b/docs/api/classes/application_PermissionAuthority.PermissionAuthority.html index fb41ff4f72..5ea3ea5e3c 100644 --- a/docs/api/classes/application_PermissionAuthority.PermissionAuthority.html +++ b/docs/api/classes/application_PermissionAuthority.PermissionAuthority.html @@ -29,6 +29,7 @@
authorize clearSessionGrants +createConnectionAuthority explain grant reload @@ -44,15 +45,16 @@

Returns PermissionAuthority

+
  • Defined in src/application/PermissionAuthority.ts:115
  • @@ -72,7 +74,7 @@
  • options: { elicitationSupported?: boolean; restartRequired?: boolean } = {}
  • Returns Promise<
        Result<
            PermissionDecision & { allowed: true; request: PermissionRequest },
            PermissionRequiredError | PermissionPathError,
        >,
    >

    +
  • Defined in src/application/PermissionAuthority.ts:132
  • +
  • Defined in src/application/PermissionAuthority.ts:202
  • +
    + +
      @@ -100,7 +113,7 @@
    • options: { elicitationSupported?: boolean; restartRequired?: boolean } = {}

    Returns Promise<
        Result<
            PermissionDecision & { allowed: true; request: PermissionRequest },
            PermissionRequiredError | PermissionPathError,
        >,
    >

    +
  • Defined in src/application/PermissionAuthority.ts:158
  • Returns Result<PermissionPolicy>

    +
  • Defined in src/application/PermissionAuthority.ts:183
  • Returns Promise<Result<null, PermissionPathError>>

    +
  • Defined in src/application/PermissionAuthority.ts:362
  • Returns Promise<Result<null, PermissionPathError>>

    +
  • Defined in src/application/PermissionAuthority.ts:296
  • Returns Promise<Result<null, PermissionPathError>>

    +
  • Defined in src/application/PermissionAuthority.ts:322
  • Returns Promise<Result<null, PermissionPathError>>

    +
  • Defined in src/application/PermissionAuthority.ts:270
    • @@ -190,7 +203,7 @@
    • grantId: string

    Returns void

    +
  • Defined in src/application/PermissionAuthority.ts:197
  • +
  • Defined in src/application/ProjectPermissionStore.ts:64
  • @@ -61,12 +61,12 @@
    _tag: "ProjectPermissionStoreError" = ...
    +
  • Defined in src/application/ProjectPermissionStore.ts:62
  • reason: "io" | "locked" | "invalid" | "project_not_found" | "not_owner_only"
    +
  • Defined in src/application/ProjectPermissionStore.ts:65
  • Returns Promise<void>

    +
  • Defined in src/process/PrivateRuntimeRoot.ts:40
    • @@ -68,7 +69,7 @@ only establishes a private filesystem boundary and deterministic cleanup.

    • options: PrivateRuntimeRootOptions = {}

    Returns Promise<PrivateRuntimeRoot>

    +
  • Defined in src/process/PrivateRuntimeRoot.ts:24
  • +
  • Defined in src/application/CapabilityInventory.ts:83
  • +
  • Defined in src/application/Doctor.ts:275
  • +
  • Defined in src/application/PermissionAuthority.ts:373
  • +
  • Defined in src/application/ProcessCli.ts:36
  • +
  • Defined in src/application/ProcessCli.ts:76
  • +
  • Defined in src/application/ProcessCli.ts:183
  • +
  • Defined in src/application/ProjectPermissionStore.ts:98
  • +
  • Defined in src/application/ProjectPermissionStore.ts:181
  • +
  • Defined in src/application/ProjectPermissionStore.ts:138
  • +
  • Defined in src/application/RealHopperAssertions.ts:229
  • +
  • Defined in src/application/WindowsCapabilities.ts:44
  • +
  • Defined in src/config.ts:319
  • +
  • Defined in src/domain/permissionPolicy.ts:210
  • +
  • Defined in src/domain/permissionPolicy.ts:186
  • +
  • Defined in src/domain/permissionPolicy.ts:305
  • +
  • Defined in src/domain/permissionPolicy.ts:220
  • +
  • Defined in src/domain/permissionPolicy.ts:201
  • +
  • Defined in src/main.ts:75
  • +
  • Defined in src/main.ts:295
  • +
  • Defined in src/server/createServer.ts:69
  • +
  • Defined in src/server/registerSessionTools.ts:614
  • interface DoctorCheck {
        classification:
            | "unsupported_host"
            | "healthy"
            | "missing_dependency"
            | "missing_analysis_engine"
            | "config_drift";
        detail?: string;
        name: string;
        ok: boolean;
        remediation?: string;
    }
    +
  • Defined in src/application/Doctor.ts:33
  • @@ -37,27 +37,27 @@
    classification:
        | "unsupported_host"
        | "healthy"
        | "missing_dependency"
        | "missing_analysis_engine"
        | "config_drift"
    +
  • Defined in src/application/Doctor.ts:36
  • detail?: string
    +
  • Defined in src/application/Doctor.ts:42
  • name: string
    +
  • Defined in src/application/Doctor.ts:34
  • ok: boolean
    +
  • Defined in src/application/Doctor.ts:35
  • remediation?: string
    +
  • Defined in src/application/Doctor.ts:43
  • +
  • Defined in src/application/Doctor.ts:85
    • @@ -110,7 +110,7 @@
    • path: string

    Returns Promise<boolean>

    +
  • Defined in src/application/Doctor.ts:76
    • @@ -123,7 +123,7 @@
    • path: string

    Returns Promise<string | undefined>

    +
  • Defined in src/application/Doctor.ts:87
  • +
  • Defined in src/application/Doctor.ts:82
  • +
  • Defined in src/application/Doctor.ts:84
  • +
  • Defined in src/application/Doctor.ts:83
  • +
  • Defined in src/application/Doctor.ts:86
  • +
  • Defined in src/application/Doctor.ts:78
  • +
  • Defined in src/application/Doctor.ts:74
  • +
  • Defined in src/application/Doctor.ts:73
  • +
  • Defined in src/application/Doctor.ts:80
  • +
  • Defined in src/application/Doctor.ts:81
  • +
  • Defined in src/application/Doctor.ts:88
    • @@ -226,7 +226,7 @@
    • path: string

    Returns Promise<boolean>

    +
  • Defined in src/application/Doctor.ts:77
    • @@ -239,7 +239,7 @@
    • path: string

    Returns Promise<boolean>

    +
  • Defined in src/application/Doctor.ts:75
  • +
  • Defined in src/application/Doctor.ts:52
  • +
  • Defined in src/application/Doctor.ts:63
  • +
  • Defined in src/application/Doctor.ts:268
  • +
  • Defined in src/application/ProcessCli.ts:32
  • -
    interface SetupResult {
        appliedActions: readonly string[];
        clients: Readonly<Record<string, ClientConfigurationResult>>;
        code?: SetupFailureCode;
        doctor: {
            checks: readonly DoctorCheck[];
            healthy: boolean;
            hopperPath?: string;
            identity?: {
                catalog: {
                    counts: {
                        cli_commands: number;
                        mcp_prompts: number;
                        mcp_resource_templates: 8;
                        mcp_resources: 2;
                        mcp_tools: number;
                    };
                    digests: {
                        combined_sha256: string;
                        prompts_sha256: string;
                        resources_sha256: string;
                        tools_sha256: string;
                    };
                    tools: {
                        annotations: {
                            destructive: boolean;
                            idempotent: boolean;
                            open_world: boolean;
                            read_only: boolean;
                        };
                        effects: {
                            accessesNetwork: boolean;
                            changesUiState: boolean;
                            idempotent: boolean;
                            launchesProcess: boolean;
                            mayDiscardData: boolean;
                            mutatesSession: boolean;
                            mutatesTarget: boolean;
                            writesFilesystem: boolean;
                        };
                        name: | "open_binary"
                        | "list_browser_targets"
                        | "inspect_web_page"
                        | "analyze_web_bundle"
                        | "observe_web_session"
                        | "discover_webmcp_tools"
                        | "compare_web_captures"
                        | "capture_web_screenshot"
                        | "compare_web_screenshots"
                        | "list_electron_targets"
                        | "inspect_electron_page"
                        | "inventory_artifact"
                        | "extract_artifact"
                        | "analyze_javascript_application"
                        | "swift_classes"
                        | "get_objc_classes"
                        | "get_objc_protocols"
                        | "batch_decompile"
                        | "get_call_graph"
                        | "analyze_swift_types"
                        | "find_xrefs_to_name"
                        | "binary_overview"
                        | "analyze_function"
                        | "trace_feature"
                        | "comment"
                        | "compare_artifacts"
                        | "find_changed_behavior"
                        | "compare_process_captures"
                        | "compare_functions"
                        | "capture_process_scenario"
                        | "inspect_managed_members"
                        | "inspect_managed_native_boundaries"
                        | "inspect_macho"
                        | "inspect_managed_artifact"
                        | "address_name"
                        | "current_address"
                        | "current_procedure"
                        | "current_document"
                        | "goto_address"
                        | "inline_comment"
                        | "list_bookmarks"
                        | "list_documents"
                        | "list_names"
                        | "list_procedures"
                        | "list_segments"
                        | "list_strings"
                        | "next_address"
                        | "prev_address"
                        | "procedure_address"
                        | "procedure_assembly"
                        | "procedure_callees"
                        | "procedure_callers"
                        | "procedure_info"
                        | "procedure_references"
                        | "procedure_pseudo_code"
                        | "resolve_containing_procedure"
                        | "search_procedures"
                        | "search_strings"
                        | "set_address_name"
                        | "set_addresses_names"
                        | "set_bookmark"
                        | "set_comment"
                        | "set_current_document"
                        | "set_inline_comment"
                        | "unset_bookmark"
                        | "xrefs"
                        | "inspect_signature"
                        | "inspect_plist"
                        | "list_architectures"
                        | "demangle_swift"
                        | "compare_managed_members"
                        | "verify_managed_native_boundaries"
                        | "import_managed_reconstruction"
                        | "plan_managed_runtime_correlation"
                        | "project_managed_application_graph"
                        | "close_binary"
                        | "binary_session"
                        | "export_evidence_bundle"
                        | "import_evidence_bundle"
                        | "compare_bundles"
                        | "build_call_path"
                        | "correlate_static_and_runtime"
                        | "verify_reconstruction"
                        | "list_unknowns"
                        | "record_unknown"
                        | "update_unknown"
                        | "verify_unknown_resolution"
                        | "reconcile_javascript_runtime"
                        | "trace_application_feature"
                        | "compare_application_versions"
                        | "run_controlled_replay"
                        | "prepare_node_characterization"
                        | "execute_node_characterization"
                        | "commit_reconstruction_coverage"
                        | "query_reconstruction_coverage";
                        surface: ToolKind;
                    }[];
                };
                cli_package_version: string;
                expected_skill_version: string;
                installations: {
                    paths: readonly string[];
                    state: "unknown"
                    | "single"
                    | "multiple";
                };
                live_server: { remediation: string; state: "unknown" };
                registrations: readonly ClientRegistrationStatus[];
                runtime_executables: RuntimeExecutableInventory | null;
                sdk: {
                    client_test: "2.0.0-beta.4";
                    core: "2.0.0-beta.4";
                    server: "2.0.0-beta.4";
                };
                skill: {
                    installed_catalog_digest: string
                    | null;
                    installed_tool_count: number | null;
                    installed_version: string | null;
                    remediation: string | null;
                    state: "missing" | "aligned" | "stale";
                };
            };
            providerInspections?: readonly DoctorProviderInspection[];
        };
        plannedActions: readonly SetupAction[];
        remediation?: string;
        status: "ready"
        | "planned"
        | "needs_confirmation"
        | "needs_human";
    }
    -
    doctor: {
        checks: readonly DoctorCheck[];
        healthy: boolean;
        hopperPath?: string;
        identity?: {
            catalog: {
                counts: {
                    cli_commands: number;
                    mcp_prompts: number;
                    mcp_resource_templates: 8;
                    mcp_resources: 2;
                    mcp_tools: number;
                };
                digests: {
                    combined_sha256: string;
                    prompts_sha256: string;
                    resources_sha256: string;
                    tools_sha256: string;
                };
                tools: {
                    annotations: {
                        destructive: boolean;
                        idempotent: boolean;
                        open_world: boolean;
                        read_only: boolean;
                    };
                    effects: {
                        accessesNetwork: boolean;
                        changesUiState: boolean;
                        idempotent: boolean;
                        launchesProcess: boolean;
                        mayDiscardData: boolean;
                        mutatesSession: boolean;
                        mutatesTarget: boolean;
                        writesFilesystem: boolean;
                    };
                    name: | "open_binary"
                    | "list_browser_targets"
                    | "inspect_web_page"
                    | "analyze_web_bundle"
                    | "observe_web_session"
                    | "discover_webmcp_tools"
                    | "compare_web_captures"
                    | "capture_web_screenshot"
                    | "compare_web_screenshots"
                    | "list_electron_targets"
                    | "inspect_electron_page"
                    | "inventory_artifact"
                    | "extract_artifact"
                    | "analyze_javascript_application"
                    | "swift_classes"
                    | "get_objc_classes"
                    | "get_objc_protocols"
                    | "batch_decompile"
                    | "get_call_graph"
                    | "analyze_swift_types"
                    | "find_xrefs_to_name"
                    | "binary_overview"
                    | "analyze_function"
                    | "trace_feature"
                    | "comment"
                    | "compare_artifacts"
                    | "find_changed_behavior"
                    | "compare_process_captures"
                    | "compare_functions"
                    | "capture_process_scenario"
                    | "inspect_managed_members"
                    | "inspect_managed_native_boundaries"
                    | "inspect_macho"
                    | "inspect_managed_artifact"
                    | "address_name"
                    | "current_address"
                    | "current_procedure"
                    | "current_document"
                    | "goto_address"
                    | "inline_comment"
                    | "list_bookmarks"
                    | "list_documents"
                    | "list_names"
                    | "list_procedures"
                    | "list_segments"
                    | "list_strings"
                    | "next_address"
                    | "prev_address"
                    | "procedure_address"
                    | "procedure_assembly"
                    | "procedure_callees"
                    | "procedure_callers"
                    | "procedure_info"
                    | "procedure_references"
                    | "procedure_pseudo_code"
                    | "resolve_containing_procedure"
                    | "search_procedures"
                    | "search_strings"
                    | "set_address_name"
                    | "set_addresses_names"
                    | "set_bookmark"
                    | "set_comment"
                    | "set_current_document"
                    | "set_inline_comment"
                    | "unset_bookmark"
                    | "xrefs"
                    | "inspect_signature"
                    | "inspect_plist"
                    | "list_architectures"
                    | "demangle_swift"
                    | "compare_managed_members"
                    | "verify_managed_native_boundaries"
                    | "import_managed_reconstruction"
                    | "plan_managed_runtime_correlation"
                    | "project_managed_application_graph"
                    | "close_binary"
                    | "binary_session"
                    | "export_evidence_bundle"
                    | "import_evidence_bundle"
                    | "compare_bundles"
                    | "build_call_path"
                    | "correlate_static_and_runtime"
                    | "verify_reconstruction"
                    | "list_unknowns"
                    | "record_unknown"
                    | "update_unknown"
                    | "verify_unknown_resolution"
                    | "reconcile_javascript_runtime"
                    | "trace_application_feature"
                    | "compare_application_versions"
                    | "run_controlled_replay"
                    | "prepare_node_characterization"
                    | "execute_node_characterization"
                    | "commit_reconstruction_coverage"
                    | "query_reconstruction_coverage";
                    surface: ToolKind;
                }[];
            };
            cli_package_version: string;
            expected_skill_version: string;
            installations: {
                paths: readonly string[];
                state: "unknown"
                | "single"
                | "multiple";
            };
            live_server: { remediation: string; state: "unknown" };
            registrations: readonly ClientRegistrationStatus[];
            runtime_executables: RuntimeExecutableInventory | null;
            sdk: {
                client_test: "2.0.0-beta.4";
                core: "2.0.0-beta.4";
                server: "2.0.0-beta.4";
            };
            skill: {
                installed_catalog_digest: string
                | null;
                installed_tool_count: number | null;
                installed_version: string | null;
                remediation: string | null;
                state: "missing" | "aligned" | "stale";
            };
        };
        providerInspections?: readonly DoctorProviderInspection[];
    }
    diff --git a/docs/api/interfaces/application_WindowsCapabilities.WindowsCapabilityDependencies.html b/docs/api/interfaces/application_WindowsCapabilities.WindowsCapabilityDependencies.html index 1e5d9d2faa..37366ab158 100644 --- a/docs/api/interfaces/application_WindowsCapabilities.WindowsCapabilityDependencies.html +++ b/docs/api/interfaces/application_WindowsCapabilities.WindowsCapabilityDependencies.html @@ -14,7 +14,7 @@

    Injectable host probes used by CI and deterministic unit tests.

    -
    interface WindowsCapabilityDependencies {
        architecture: Architecture;
        platform: Platform;
        probeNoFollowOpen(): WindowsCapabilityOutcome;
        probePrivateAcl(): WindowsCapabilityOutcome;
        probePty(): Promise<ProcessCaptureCapability>;
        probeSymlinkCreation(): Promise<WindowsCapabilityOutcome>;
        probeUnixDomainSocket(): WindowsCapabilityOutcome;
    }
    -
    probeNoFollowOpen +
    probeNativeAuthority +probeNoFollowOpen probePrivateAcl probePty probeSymlinkCreation @@ -52,6 +53,15 @@
    + +
    +
    +
  • Defined in src/application/WindowsCapabilities.ts:26
  • +
  • Defined in src/application/WindowsCapabilities.ts:25
  • +
  • Defined in src/application/WindowsCapabilities.ts:31
  • interface WebInventoryResourceInput {
        content_size: number | null;
        mime_type: string;
        origin: string | null;
        type: string;
        url: string;
    }
    -
    +

    Hierarchy (View Summary)

    • WebInventoryResourceInput diff --git a/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html b/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html index ef8cef585e..b797b68c89 100644 --- a/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html +++ b/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html @@ -15,7 +15,7 @@

      Process plus private log coordinates returned by a Ghidra launcher.

    interface GhidraLaunch {
        cleanup?: () => Promise<ProcessCleanupResult>;
        ghidraLogPath: string;
        ownsProcessLifetime: boolean;
        process: ChildProcess;
        projectRoot: string;
        scriptLogPath: string;
    }
    -
    +

    Hierarchy (View Summary)

    • ProviderProcessLaunch diff --git a/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html b/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html index dcd2aa31e0..340d4403c3 100644 --- a/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html +++ b/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html @@ -15,7 +15,7 @@

      Additional structured context for a Ghidra session failure.

    interface GhidraSessionErrorOptions {
        remoteCode?: string;
        timeoutMs?: number;
    }
    -
    +

    Hierarchy

    • ErrorOptions diff --git a/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html b/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html index a6ddc942e0..ddcea08848 100644 --- a/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html +++ b/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html @@ -15,7 +15,7 @@

      Process handle returned by a bridge launcher.

    interface BridgeLaunch {
        cleanup?: () => Promise<ProcessCleanupResult>;
        ownsProcessLifetime: boolean;
        process: ChildProcess;
        shutdownByCleanup?: boolean;
    }
    -
    +

    Hierarchy (View Summary)

    • ProviderProcessLaunch diff --git a/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html b/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html index be36a9878a..258b95e3b3 100644 --- a/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html +++ b/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html @@ -15,7 +15,7 @@

      Process handle returned by a provider-specific launcher.

    interface ProviderProcessLaunch {
        cleanup?: () => Promise<ProcessCleanupResult>;
        ownsProcessLifetime: boolean;
        process: ChildProcess;
    }
    -
    +

    Hierarchy (View Summary)

    • ProviderProcessLaunch diff --git a/docs/api/interfaces/server_ProcessCaptureElicitation.ProcessCaptureElicitation.html b/docs/api/interfaces/server_ProcessCaptureElicitation.ProcessCaptureElicitation.html new file mode 100644 index 0000000000..d5343260b7 --- /dev/null +++ b/docs/api/interfaces/server_ProcessCaptureElicitation.ProcessCaptureElicitation.html @@ -0,0 +1,76 @@ +ProcessCaptureElicitation | rea-agents - v2.0.0
      +
      rea-agents - v2.0.0 + +
        +
        +
        Preparing search index...
        +
        +
        +
        + +

        Interface ProcessCaptureElicitation

        +
        +

        Connection-owned SDK state used for process-capture grant elicitation.

        +
        +
        interface ProcessCaptureElicitation {
            consumedNonces: Map<string, number>;
            modern: () => boolean;
            stateCodec: RequestStateCodec<
                {
                    nonce: string;
                    request: {
                        capability: "process_capture";
                        environment_names: string[];
                        executables: string[];
                        mount: boolean;
                        network: "none"
                        | "external"
                        | "loopback";
                        operation_identity: string;
                        origins?: string[];
                        roots: string[];
                    };
                    version: 1;
                },
            >;
            supported: () => boolean;
        }
        +
        +
        +
        +
        Index
        +
        +
        + +
        +
        + +
        consumedNonces: Map<string, number>
        +
        + +
        modern: () => boolean
        +
        + +
        stateCodec: RequestStateCodec<
            {
                nonce: string;
                request: {
                    capability: "process_capture";
                    environment_names: string[];
                    executables: string[];
                    mount: boolean;
                    network: "none"
                    | "external"
                    | "loopback";
                    operation_identity: string;
                    origins?: string[];
                    roots: string[];
                };
                version: 1;
            },
        >
        +
        + +
        supported: () => boolean
        +
        + +
        +
        diff --git a/docs/api/interfaces/server_createServer.CreateServerOptions.html b/docs/api/interfaces/server_createServer.CreateServerOptions.html index f6728608d9..5dfbb837c3 100644 --- a/docs/api/interfaces/server_createServer.CreateServerOptions.html +++ b/docs/api/interfaces/server_createServer.CreateServerOptions.html @@ -13,7 +13,7 @@

        Interface CreateServerOptions

      interface CreateServerOptions {
          analysisSnapshotFilePolicy?: EvidenceFilePolicy;
          artifactIntegrityContinueEnabled?: () => boolean;
          availabilityPolicy?: () => {
              browserObservationEnabled?: boolean;
              electronObservationEnabled?: boolean;
              evidenceFileRoots: number;
              javascriptReplayEnabled?: boolean;
              managedRuntimeEnabled?: boolean;
              processCaptureEnabled: boolean;
          };
          browserObservation?: BrowserObservationPort;
          electronObservation?: ElectronObservationPort;
          evidenceFilePolicy?: EvidenceFilePolicy;
          investigationInputRoots?: readonly string[];
          javascriptReplayHost?: JavaScriptReplayHost;
          javascriptReplayPolicy?: JavaScriptReplayPolicy;
          javascriptReplayRunner?: JavaScriptReplayRunner;
          logger?: Logger;
          managedRuntimePolicy?: ManagedRuntimePolicy;
          permissionAuthority?: PermissionAuthority;
          processPolicy?: ProcessExecutionPolicy;
      }
      +
    • Defined in src/server/createServer.ts:40
    • @@ -43,72 +43,72 @@
      analysisSnapshotFilePolicy?: EvidenceFilePolicy
      +
    • Defined in src/server/createServer.ts:45
    • artifactIntegrityContinueEnabled?: () => boolean
      +
    • Defined in src/server/createServer.ts:49
    • availabilityPolicy?: () => {
          browserObservationEnabled?: boolean;
          electronObservationEnabled?: boolean;
          evidenceFileRoots: number;
          javascriptReplayEnabled?: boolean;
          managedRuntimeEnabled?: boolean;
          processCaptureEnabled: boolean;
      }
      +
    • Defined in src/server/createServer.ts:54
    • browserObservation?: BrowserObservationPort
      +
    • Defined in src/server/createServer.ts:47
    • electronObservation?: ElectronObservationPort
      +
    • Defined in src/server/createServer.ts:48
    • evidenceFilePolicy?: EvidenceFilePolicy
      +
    • Defined in src/server/createServer.ts:43
    • investigationInputRoots?: readonly string[]
      +
    • Defined in src/server/createServer.ts:44
    • javascriptReplayHost?: JavaScriptReplayHost
      +
    • Defined in src/server/createServer.ts:51
    • javascriptReplayPolicy?: JavaScriptReplayPolicy
      +
    • Defined in src/server/createServer.ts:50
    • javascriptReplayRunner?: JavaScriptReplayRunner
      +
    • Defined in src/server/createServer.ts:52
    • logger?: Logger
      +
    • Defined in src/server/createServer.ts:41
    • managedRuntimePolicy?: ManagedRuntimePolicy
      +
    • Defined in src/server/createServer.ts:53
    • permissionAuthority?: PermissionAuthority
      +
    • Defined in src/server/createServer.ts:46
    • processPolicy?: ProcessExecutionPolicy
      +
    • Defined in src/server/createServer.ts:42
    • @@ -40,42 +41,47 @@
      analysisSnapshotFilePolicy?: EvidenceFilePolicy
      +
    • Defined in src/server/registerSessionTools.ts:599
    • artifactIntegrityContinueEnabled?: () => boolean
      +
    • Defined in src/server/registerSessionTools.ts:603
    • availabilityPolicy?: () => {
          browserObservationEnabled?: boolean;
          electronObservationEnabled?: boolean;
          evidenceFileRoots: number;
          javascriptReplayEnabled?: boolean;
          managedRuntimeEnabled?: boolean;
          processCaptureEnabled: boolean;
      }
      +
    • Defined in src/server/registerSessionTools.ts:604
    • evidenceFilePolicy?: EvidenceFilePolicy
      +
    • Defined in src/server/registerSessionTools.ts:597
    • investigationInputRoots?: readonly string[]
      +
    • Defined in src/server/registerSessionTools.ts:598
    • permissionAuthority?: PermissionAuthority
      +
    • Defined in src/server/registerSessionTools.ts:601
    • +
      + +
      processCaptureElicitation?: ProcessCaptureElicitation
      processPolicy?: ProcessExecutionPolicy
      +
    • Defined in src/server/registerSessionTools.ts:596
    • startedAt?: string
      +
    • Defined in src/server/registerSessionTools.ts:600
    • -
      -
      ToolAvailabilityReason
      buildCapabilityInventory
      @@ -28,8 +26,6 @@

      On This Page

      -
      DoctorCheck
      DoctorHost
      DoctorProviderCheck
      DoctorProviderInspection
      SystemDoctorHostOptions
      +
      DoctorCheck
      DoctorHost
      DoctorProviderCheck
      DoctorProviderInspection
      DoctorReport
      SystemDoctorHostOptions
      runDoctor
      systemDoctorHost
      +
      +
      FunctionDossierOracle
      -
      firstProcedureAddress
      requireAddressArray
      requireDistinctTargetHashes
      requireFunctionDossier
      requirePseudocode
      +
      firstProcedureAddress
      requireAddressArray
      requireDistinctTargetHashes
      requireFunctionDossier
      requireFunctionDossierOracle
      requirePseudocode
      +
      probeWindowsCapabilities
      systemNoFollowOpenCapability
      +
      clearSessionPermissions
      consumePermission
      createPermissionPolicy
      evaluatePermission
      grantPermission
      isPathContained
      isPermissionRequestWithinCeiling
      reloadPermissionCeilings
      revokePermission
      ProjectPermissionStore: z.infer<typeof storeSchema>
      +
    • Defined in src/application/ProjectPermissionStore.ts:58