2026-07-26 16:07:12 +00:00
|
|
|
import { createHash } from "node:crypto";
|
2026-07-18 03:42:35 +00:00
|
|
|
import { join } from "node:path";
|
|
|
|
|
import { pathToFileURL } from "node:url";
|
|
|
|
|
|
2026-07-26 16:07:12 +00:00
|
|
|
import canonicalize from "canonicalize";
|
|
|
|
|
|
2026-07-18 03:42:35 +00:00
|
|
|
const load = (root, path) => import(pathToFileURL(join(root, path)).href);
|
|
|
|
|
|
|
|
|
|
/** Sort tool/provider names alphabetically. */
|
|
|
|
|
export const names = (contracts) =>
|
|
|
|
|
contracts
|
|
|
|
|
.map(({ name }) => name)
|
|
|
|
|
.sort((left, right) => left.localeCompare(right));
|
|
|
|
|
|
2026-07-26 16:07:12 +00:00
|
|
|
/** Return the stable digest for a generated catalog projection. */
|
|
|
|
|
export const digest = (value) => {
|
|
|
|
|
const encoded = canonicalize(value);
|
|
|
|
|
if (encoded === undefined)
|
|
|
|
|
throw new TypeError("Catalog projection is not canonical JSON");
|
|
|
|
|
return createHash("sha256").update(encoded).digest("hex");
|
|
|
|
|
};
|
|
|
|
|
|
2026-07-18 03:42:35 +00:00
|
|
|
/** Throw when two name lists diverge. */
|
|
|
|
|
export const assertSameNames = (label, actual, expected) => {
|
|
|
|
|
const actualSet = new Set(actual);
|
|
|
|
|
const expectedSet = new Set(expected);
|
|
|
|
|
const missing = [...expectedSet].filter((name) => !actualSet.has(name));
|
|
|
|
|
const extra = [...actualSet].filter((name) => !expectedSet.has(name));
|
|
|
|
|
if (missing.length === 0 && extra.length === 0) return;
|
|
|
|
|
throw new Error(
|
|
|
|
|
`${label} drifted (missing: ${missing.join(", ") || "none"}; extra: ${extra.join(", ") || "none"})`,
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const SOURCE_PATHS = {
|
|
|
|
|
packageMetadata: "dist/generatedPackageMetadata.js",
|
|
|
|
|
catalogIdentity: "dist/catalogIdentity.js",
|
2026-10-09 22:45:18 +08:00
|
|
|
cliCommandNames: "dist/cliCommandNames.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
cli: "dist/cli.js",
|
|
|
|
|
toolContracts: "dist/contracts/toolContracts.js",
|
2026-10-06 05:20:11 +08:00
|
|
|
officialContracts: "dist/contracts/officialToolContracts.js",
|
|
|
|
|
enhancedContracts: "dist/contracts/enhancedToolContracts.js",
|
|
|
|
|
sessionContracts: "dist/contracts/sessionToolContracts.js",
|
2026-10-08 14:22:08 +08:00
|
|
|
binaryDiagnosticsContracts:
|
|
|
|
|
"dist/contracts/native/binaryDiagnosticsToolContracts.js",
|
2026-10-14 04:47:34 +08:00
|
|
|
cutterContracts: "dist/contracts/cutterToolContracts.js",
|
|
|
|
|
cutterProvider: "dist/cutter/CutterBridgeClient.js",
|
|
|
|
|
reverseEngineeringContracts:
|
|
|
|
|
"dist/contracts/reverseEngineeringToolContracts.js",
|
|
|
|
|
gdbContracts: "dist/contracts/gdbToolContracts.js",
|
|
|
|
|
gdbProvider: "dist/gdb/GdbSessionManager.js",
|
|
|
|
|
rizinDebugContracts: "dist/contracts/rizinDebugToolContracts.js",
|
|
|
|
|
objdumpProvider: "dist/objdump/ObjdumpCommand.js",
|
|
|
|
|
rizinProvider: "dist/rizin/RizinCommand.js",
|
|
|
|
|
rizinDebugProvider: "dist/rizin/RizinDebugSessionManager.js",
|
2026-10-12 11:01:58 -03:00
|
|
|
fridaContracts: "dist/contracts/fridaToolContracts.js",
|
|
|
|
|
fridaProvider: "dist/frida/FridaInstrumentationManager.js",
|
2026-10-08 14:22:08 +08:00
|
|
|
pwntoolsProvider: "dist/native/pwntools/PwntoolsRelease.js",
|
2026-10-07 22:40:48 +08:00
|
|
|
nativeContracts: "dist/contracts/native/nativeToolContracts.js",
|
2026-10-13 03:35:35 +08:00
|
|
|
captureContracts: "dist/contracts/captures/captureToolContracts.js",
|
|
|
|
|
captureProvider: "dist/captures/TsharkCaptureProvider.js",
|
2026-10-13 04:59:02 +08:00
|
|
|
signalContracts: "dist/contracts/signals/signalToolContracts.js",
|
|
|
|
|
signalProvider: "dist/signals/SigrokRecordingProvider.js",
|
2026-10-11 20:49:00 +09:00
|
|
|
wasmContracts: "dist/contracts/wasm/wasmToolContracts.js",
|
|
|
|
|
wasmProvider: "dist/wasm/WabtRelease.js",
|
2026-10-08 15:32:05 +08:00
|
|
|
evmContracts: "dist/contracts/evm/evmToolContracts.js",
|
2026-10-13 02:33:23 +08:00
|
|
|
sqliteContracts: "dist/contracts/sqlite/sqliteToolContracts.js",
|
|
|
|
|
sqliteDomain: "dist/domain/sqlite/sqliteDatabase.js",
|
2026-10-08 15:32:05 +08:00
|
|
|
evmProvider: "dist/evm/EvmoleRelease.js",
|
2026-10-11 23:34:02 -04:00
|
|
|
goContracts: "dist/contracts/go/goToolContracts.js",
|
|
|
|
|
goProvider: "dist/go/GoBinaryProvider.js",
|
2026-10-21 19:06:44 +08:00
|
|
|
gpuContracts: "dist/contracts/gpu/gpuToolContracts.js",
|
|
|
|
|
gpuProvider: "dist/gpu/GpuCodeObjectsProvider.js",
|
2026-10-21 00:50:50 +08:00
|
|
|
modelContracts: "dist/contracts/model/modelToolContracts.js",
|
|
|
|
|
modelProvider: "dist/model/ModelArtifactProvider.js",
|
2026-10-20 08:20:47 +09:00
|
|
|
il2cppContracts: "dist/contracts/il2cpp/il2cppToolContracts.js",
|
|
|
|
|
il2cppProvider: "dist/il2cpp/Il2cppMetadataProvider.js",
|
2026-10-13 11:50:30 -07:00
|
|
|
rustContracts: "dist/contracts/rust/rustToolContracts.js",
|
|
|
|
|
rustProvider: "dist/rust/RustBinaryProvider.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
artifactContracts: "dist/contracts/artifactToolContracts.js",
|
2026-10-20 04:01:36 +08:00
|
|
|
desktopContracts: "dist/contracts/desktopApplicationToolContracts.js",
|
2026-10-07 19:22:04 +08:00
|
|
|
managedContracts: "dist/contracts/managed/managedToolContracts.js",
|
2026-10-07 14:44:52 +08:00
|
|
|
firmwareContracts: "dist/contracts/firmware/firmwareToolContracts.js",
|
2026-10-06 22:16:04 +08:00
|
|
|
firmwareProvider: "dist/firmware/FirmwareRelease.js",
|
2026-10-07 14:09:57 +08:00
|
|
|
androidContracts: "dist/contracts/android/androidToolContracts.js",
|
2026-10-12 16:35:55 +02:00
|
|
|
flutterContracts: "dist/contracts/flutter/flutterToolContracts.js",
|
|
|
|
|
flutterProvider: "dist/flutter/FlutterBuildProvider.js",
|
2026-10-06 20:46:48 +08:00
|
|
|
androidProvider: "dist/android/JadxRelease.js",
|
2026-10-10 17:04:12 +02:00
|
|
|
apktoolContracts: "dist/contracts/apktool/apktoolToolContracts.js",
|
2026-10-13 06:53:03 +02:00
|
|
|
pcapContracts: "dist/contracts/pcap/pcapToolContracts.js",
|
|
|
|
|
pcapProvider: "dist/pcap/PcapProvider.js",
|
2026-10-10 17:04:12 +02:00
|
|
|
apktoolProvider: "dist/apktool/ApktoolProvider.js",
|
2026-10-10 17:03:27 +02:00
|
|
|
jebContracts: "dist/contracts/jeb/jebToolContracts.js",
|
|
|
|
|
jebProvider: "dist/jeb/JebProvider.js",
|
2026-10-10 17:01:24 +02:00
|
|
|
adbContracts: "dist/contracts/adb/adbToolContracts.js",
|
|
|
|
|
adbProvider: "dist/adb/AdbProvider.js",
|
2026-10-07 19:22:04 +08:00
|
|
|
managedWorkflowContracts:
|
|
|
|
|
"dist/contracts/managed/managedWorkflowToolContracts.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
browserContracts: "dist/contracts/browserToolContracts.js",
|
2026-10-07 21:45:07 +08:00
|
|
|
webRuntimeContracts: "dist/contracts/webRuntimeToolContracts.js",
|
2026-10-08 07:53:41 +08:00
|
|
|
webNetworkCaptureContracts:
|
|
|
|
|
"dist/contracts/webNetworkCaptureToolContracts.js",
|
|
|
|
|
webNetworkCaptureProvider: "dist/browser/history/CaptureRelease.js",
|
2026-07-24 13:18:58 +00:00
|
|
|
browserScenarioContracts: "dist/contracts/browserScenarioToolContracts.js",
|
2026-10-07 17:16:58 +08:00
|
|
|
electronContracts: "dist/contracts/javascript/electronToolContracts.js",
|
2026-10-13 18:16:33 -07:00
|
|
|
electronFuseProvider: "dist/electron/ElectronFuseProvider.js",
|
2026-07-24 13:18:58 +00:00
|
|
|
javascriptRuntimeObservationContracts:
|
2026-10-07 17:16:58 +08:00
|
|
|
"dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
applicationContracts: "dist/contracts/applicationToolContracts.js",
|
2026-10-08 21:45:48 -07:00
|
|
|
analysisViewContracts: "dist/contracts/analysisViewToolContracts.js",
|
2026-10-07 05:24:32 +08:00
|
|
|
webScriptContracts: "dist/contracts/webScriptToolContracts.js",
|
2026-10-07 12:46:13 +08:00
|
|
|
javascriptRecoveryContracts:
|
2026-10-07 17:16:58 +08:00
|
|
|
"dist/contracts/javascript/javascriptRecoveryToolContracts.js",
|
2026-10-07 12:46:13 +08:00
|
|
|
javascriptRecoveryProvider: "dist/javascript/recovery/WakaruRelease.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
supportedClients: "dist/application/SupportedClients.js",
|
2026-10-07 15:41:50 +08:00
|
|
|
hopperProvider: "dist/hopper/HopperProviderCapabilities.js",
|
|
|
|
|
ghidraProvider: "dist/ghidra/GhidraProviderCapabilities.js",
|
2026-10-07 01:47:05 +08:00
|
|
|
idaProvider: "dist/ida/IdaProviderCapabilities.js",
|
2026-10-15 00:53:26 -07:00
|
|
|
kunaProvider: "dist/kuna/KunaProviderCapabilities.js",
|
2026-10-07 12:32:34 +08:00
|
|
|
nativeProvider: "dist/native/NativeMacOSProviderMetadata.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
artifactProviders: "dist/application/InvestigationProviders.js",
|
2026-10-09 19:55:09 +08:00
|
|
|
browserIdentities: "dist/browser/providerIdentities.js",
|
2026-10-09 22:45:18 +08:00
|
|
|
v8InspectorProvider: "dist/inspector/providerIdentity.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
evidence: "dist/domain/evidence.js",
|
|
|
|
|
evidenceBundle: "dist/domain/evidenceBundle.js",
|
2026-07-22 10:43:03 +00:00
|
|
|
evidenceCompletion: "dist/domain/evidenceCompletionLedger.js",
|
|
|
|
|
completionGeneration: "dist/domain/completionLedgerGeneration.js",
|
2026-10-08 00:46:21 +08:00
|
|
|
processCapture: "dist/domain/process/processCapture.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
analysisSnapshot: "dist/domain/analysisSnapshot.js",
|
|
|
|
|
artifactGraph: "dist/domain/artifactGraph.js",
|
|
|
|
|
browserObservation: "dist/domain/browserObservation.js",
|
2026-07-24 13:18:58 +00:00
|
|
|
browserScenario: "dist/domain/browserScenario.js",
|
|
|
|
|
browserScenarioCapture: "dist/domain/browserScenarioCapture.js",
|
|
|
|
|
browserScenarioDiff: "dist/domain/browserScenarioDiff.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
browserSession: "dist/domain/browserSession.js",
|
2026-10-07 17:16:58 +08:00
|
|
|
electronObservation: "dist/domain/javascript/electronObservation.js",
|
|
|
|
|
electronActiveObservation:
|
|
|
|
|
"dist/domain/javascript/electronActiveObservation.js",
|
|
|
|
|
javascriptRuntimeObservation:
|
|
|
|
|
"dist/domain/javascript/javascriptRuntimeObservation.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
webBundleAnalysis: "dist/domain/webBundleAnalysis.js",
|
|
|
|
|
webCaptureDiff: "dist/domain/webCaptureDiff.js",
|
2026-10-07 19:22:04 +08:00
|
|
|
managedArtifact: "dist/domain/managed/managedArtifact.js",
|
|
|
|
|
managedComparison: "dist/domain/managed/managedMemberComparison.js",
|
|
|
|
|
managedNativeVerification: "dist/domain/managed/managedNativeVerification.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
webMcpDiscovery: "dist/domain/webMcpDiscovery.js",
|
|
|
|
|
webScreenshot: "dist/domain/webScreenshot.js",
|
2026-10-07 17:16:58 +08:00
|
|
|
javascriptApplicationGraph:
|
|
|
|
|
"dist/domain/javascript/javascriptApplicationGraph.js",
|
|
|
|
|
javascriptApplicationAnalysis:
|
|
|
|
|
"dist/domain/javascript/javascriptApplicationAnalysis.js",
|
|
|
|
|
javascriptSemanticGraph: "dist/domain/javascript/javascriptSemanticGraph.js",
|
|
|
|
|
javascriptSemanticQuery:
|
|
|
|
|
"dist/domain/javascript/javascriptSemanticQuerySchemas.js",
|
|
|
|
|
javascriptSemanticTrace:
|
|
|
|
|
"dist/domain/javascript/javascriptSemanticTraceSchemas.js",
|
|
|
|
|
javascriptFeatureTrace:
|
|
|
|
|
"dist/domain/javascript/javascriptFeatureTraceSchemas.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
javascriptVersionComparison:
|
2026-10-07 17:16:58 +08:00
|
|
|
"dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js",
|
2026-07-18 03:42:35 +00:00
|
|
|
reconstructionVerification:
|
|
|
|
|
"dist/domain/reconstructionVerificationSchemas.js",
|
|
|
|
|
residualUnknown: "dist/domain/residualUnknown.js",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** Load every compiled source module referenced by the catalog. */
|
|
|
|
|
export const loadSources = async (root) =>
|
|
|
|
|
Object.fromEntries(
|
|
|
|
|
await Promise.all(
|
|
|
|
|
Object.entries(SOURCE_PATHS).map(async ([key, path]) => [
|
|
|
|
|
key,
|
|
|
|
|
await load(root, path),
|
|
|
|
|
]),
|
|
|
|
|
),
|
|
|
|
|
);
|