rea-agents 6.1.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +5 -10
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/javascript/electronActiveObservation.js +26 -69
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +13 -12
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/createServer.js +49 -36
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
package/dist/domain/evidence.js
CHANGED
|
@@ -79,6 +79,7 @@ const evidenceBaseSchema = z
|
|
|
79
79
|
evidence_id: prefixedDigestSchema("ev"),
|
|
80
80
|
subject: subjectSchema.nullable(),
|
|
81
81
|
provider: providerSchema,
|
|
82
|
+
analysis_profile: analysisProfileSchema.nullable(),
|
|
82
83
|
predicate_type: z.string().min(1),
|
|
83
84
|
operation: z.string().min(1),
|
|
84
85
|
parameters: jsonObjectSchema,
|
|
@@ -92,13 +93,10 @@ const evidenceBaseSchema = z
|
|
|
92
93
|
evidence_links: z.array(prefixedDigestSchema("ev")),
|
|
93
94
|
})
|
|
94
95
|
.strict();
|
|
95
|
-
/**
|
|
96
|
-
export const
|
|
97
|
-
analysis_profile: analysisProfileSchema.optional(),
|
|
98
|
-
});
|
|
99
|
-
const validateAnalysisProfileProvider = (evidence, context) => {
|
|
96
|
+
/** Require a reported analysis profile to identify the observation provider. */
|
|
97
|
+
export const validateAnalysisProfileProvider = (evidence, context) => {
|
|
100
98
|
const profile = evidence.analysis_profile;
|
|
101
|
-
if (profile !==
|
|
99
|
+
if (profile !== null &&
|
|
102
100
|
(profile.provider.id !== evidence.provider.id ||
|
|
103
101
|
profile.provider.name !== evidence.provider.name ||
|
|
104
102
|
profile.provider.version !== evidence.provider.version))
|
|
@@ -109,15 +107,7 @@ const validateAnalysisProfileProvider = (evidence, context) => {
|
|
|
109
107
|
});
|
|
110
108
|
};
|
|
111
109
|
/** Strict, provider-neutral record for one successful public observation. */
|
|
112
|
-
export const evidenceSchema =
|
|
113
|
-
const profiledEvidenceSchema = evidenceBaseSchema
|
|
114
|
-
.extend({ analysis_profile: analysisProfileSchema })
|
|
115
|
-
.superRefine(validateAnalysisProfileProvider);
|
|
116
|
-
/** JSON-exact union used where Evidence participates in larger schemas. */
|
|
117
|
-
export const evidenceRecordSchema = z.union([
|
|
118
|
-
profiledEvidenceSchema,
|
|
119
|
-
evidenceBaseSchema,
|
|
120
|
-
]);
|
|
110
|
+
export const evidenceSchema = evidenceBaseSchema.superRefine(validateAnalysisProfileProvider);
|
|
121
111
|
const immutableEvidenceSnapshots = new WeakMap();
|
|
122
112
|
const immutableResultSchema = z
|
|
123
113
|
.custom(isImmutableJsonSnapshot)
|
|
@@ -135,9 +125,7 @@ const semanticProjection = (evidence) => ({
|
|
|
135
125
|
architecture: evidence.subject.architecture,
|
|
136
126
|
},
|
|
137
127
|
provider: evidence.provider,
|
|
138
|
-
|
|
139
|
-
? {}
|
|
140
|
-
: { analysis_profile: evidence.analysis_profile }),
|
|
128
|
+
analysis_profile: evidence.analysis_profile,
|
|
141
129
|
predicate_type: evidence.predicate_type,
|
|
142
130
|
operation: evidence.operation,
|
|
143
131
|
parameters: evidence.parameters,
|
|
@@ -159,13 +147,7 @@ export const parseEvidence = (input) => {
|
|
|
159
147
|
: undefined;
|
|
160
148
|
if (immutable !== undefined)
|
|
161
149
|
return immutable;
|
|
162
|
-
|
|
163
|
-
// record cannot satisfy the required-profile branch, whose failed parse
|
|
164
|
-
// would otherwise clone the entire normalized result before trying legacy.
|
|
165
|
-
const schema = typeof input === "object" && input !== null && "analysis_profile" in input
|
|
166
|
-
? profiledEvidenceSchema
|
|
167
|
-
: evidenceBaseSchema;
|
|
168
|
-
const evidence = schema.parse(input);
|
|
150
|
+
const evidence = evidenceSchema.parse(input);
|
|
169
151
|
const { evidence_id: evidenceId, ...withoutId } = evidence;
|
|
170
152
|
if (computeEvidenceId(withoutId) !== evidenceId)
|
|
171
153
|
throw new TypeError("Evidence semantic identifier does not match its record");
|
|
@@ -226,9 +208,7 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
|
|
|
226
208
|
name: provider.name,
|
|
227
209
|
version: provider.version,
|
|
228
210
|
},
|
|
229
|
-
|
|
230
|
-
? {}
|
|
231
|
-
: { analysis_profile: observation.analysisProfile }),
|
|
211
|
+
analysis_profile: observation.analysisProfile ?? null,
|
|
232
212
|
predicate_type: observation.predicateType ?? "rea.analysis",
|
|
233
213
|
operation: observation.operation,
|
|
234
214
|
parameters: observation.parameters,
|
|
@@ -249,18 +229,12 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
|
|
|
249
229
|
locations: [...(observation.locations ?? [])],
|
|
250
230
|
evidence_links: [...(observation.evidenceLinks ?? [])],
|
|
251
231
|
};
|
|
252
|
-
// Select the known envelope before parsing. A union otherwise traverses and
|
|
253
|
-
// clones a legacy result for the profiled branch before rejecting its absent
|
|
254
|
-
// profile and trying the legacy branch.
|
|
255
|
-
const schema = observation.analysisProfile === undefined
|
|
256
|
-
? evidenceBaseSchema
|
|
257
|
-
: profiledEvidenceSchema;
|
|
258
232
|
const sharedResult = typeof observation.result === "object" &&
|
|
259
233
|
observation.result !== null &&
|
|
260
234
|
isImmutableJsonSnapshot(observation.result);
|
|
261
235
|
const selectedSchema = sharedResult
|
|
262
|
-
?
|
|
263
|
-
:
|
|
236
|
+
? evidenceSchema.safeExtend({ normalized_result: immutableResultSchema })
|
|
237
|
+
: evidenceSchema;
|
|
264
238
|
const normalized = selectedSchema.parse({
|
|
265
239
|
...semantic,
|
|
266
240
|
evidence_id: `ev_${"0".repeat(64)}`,
|
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import {
|
|
3
|
+
import { evidenceSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
|
|
4
4
|
import { residualUnknownSchema, } from "./residualUnknown.js";
|
|
5
5
|
import { freezeJsonSnapshot } from "./immutableJson.js";
|
|
6
|
-
const artifactManifestSchema =
|
|
7
|
-
.unwrap()
|
|
8
|
-
.pick({
|
|
6
|
+
const artifactManifestSchema = evidenceSchema.shape.subject.unwrap().pick({
|
|
9
7
|
digest: true,
|
|
10
8
|
format: true,
|
|
11
9
|
architecture: true,
|
|
12
10
|
});
|
|
13
11
|
const providerManifestSchema = providerSchema;
|
|
14
|
-
const environmentManifestSchema =
|
|
12
|
+
const environmentManifestSchema = evidenceSchema.shape.environment.unwrap();
|
|
15
13
|
const scenarioManifestSchema = z.object({
|
|
16
|
-
evidence_id:
|
|
14
|
+
evidence_id: evidenceSchema.shape.evidence_id,
|
|
17
15
|
operation: z.string().min(1),
|
|
18
16
|
authority: z.literal("controlled-replay"),
|
|
19
17
|
});
|
|
20
18
|
const captureManifestSchema = z.object({
|
|
21
|
-
evidence_id:
|
|
19
|
+
evidence_id: evidenceSchema.shape.evidence_id,
|
|
22
20
|
predicate_type: z.string().min(1),
|
|
23
21
|
});
|
|
24
22
|
export const evidenceBundleSchema = z.object({
|
|
@@ -28,7 +26,7 @@ export const evidenceBundleSchema = z.object({
|
|
|
28
26
|
scenarios: z.array(scenarioManifestSchema),
|
|
29
27
|
captures: z.array(captureManifestSchema),
|
|
30
28
|
unknowns: z.array(residualUnknownSchema),
|
|
31
|
-
records: z.array(
|
|
29
|
+
records: z.array(evidenceSchema),
|
|
32
30
|
});
|
|
33
31
|
const immutableBundles = new WeakMap();
|
|
34
32
|
/** Build and authenticate a sealed bundle while reusing immutable Evidence records. */
|
|
@@ -139,7 +137,7 @@ const referencedEvidenceIds = (unknown) => [
|
|
|
139
137
|
* Evidence record, such as one command result, is not a bundle.
|
|
140
138
|
*/
|
|
141
139
|
export const describeEvidenceBundleFailure = (input, cause) => {
|
|
142
|
-
const record =
|
|
140
|
+
const record = evidenceSchema.safeParse(input);
|
|
143
141
|
if (record.success)
|
|
144
142
|
return `Expected an Evidence bundle with records and manifest arrays, but this JSON is one Evidence record (${record.data.evidence_id}). Export a session bundle with the MCP export_evidence_bundle tool and supply that file.`;
|
|
145
143
|
return cause instanceof z.ZodError
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
4
5
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
6
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
6
|
-
const claimIdSchema = z.string().regex(
|
|
7
|
+
const claimIdSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
7
8
|
/** Terminal outcome recorded for one verifier claim. */
|
|
8
9
|
export const evidenceCompletionStatusSchema = z.enum([
|
|
9
10
|
"pass",
|
|
@@ -4,15 +4,14 @@ import { functionMatch } from "./functionComparisonNormalization.js";
|
|
|
4
4
|
import { functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
|
|
5
5
|
import { overallStatus, summarize } from "./functionComparisonResults.js";
|
|
6
6
|
import { compareDimensions } from "./functionComparisonDimensions.js";
|
|
7
|
-
export { functionComparisonInputSchema, functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
|
|
8
7
|
/** Compare two complete function Evidence records without fuzzy matching. */
|
|
9
8
|
export const compareFunctions = (leftInput, rightInput) => {
|
|
10
9
|
const left = parseFunctionEvidence(leftInput);
|
|
11
10
|
const right = parseFunctionEvidence(rightInput);
|
|
12
|
-
const links = [left.evidence
|
|
13
|
-
const providersDiffer = canonicalJson(left.provider, "Function comparison") !==
|
|
14
|
-
canonicalJson(right.provider, "Function comparison");
|
|
15
|
-
const dimensions = compareDimensions(left, right, links, providersDiffer);
|
|
11
|
+
const links = [left.evidence.evidence_id, right.evidence.evidence_id];
|
|
12
|
+
const providersDiffer = canonicalJson(left.evidence.provider, "Function comparison") !==
|
|
13
|
+
canonicalJson(right.evidence.provider, "Function comparison");
|
|
14
|
+
const dimensions = compareDimensions(left, right, { links, providersDiffer });
|
|
16
15
|
const match = functionMatch(left, right);
|
|
17
16
|
const changes = dimensions.filter(({ status }) => status !== "unchanged");
|
|
18
17
|
return functionComparisonResultSchema.parse({
|
|
@@ -1,40 +1,50 @@
|
|
|
1
1
|
import { canonicalJson } from "./comparisonSemantics.js";
|
|
2
2
|
import { diffLines } from "diff";
|
|
3
|
-
import { commentProjection,
|
|
4
|
-
import { dimensionResult, unresolvedDimension
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
];
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
3
|
+
import { commentProjection, identityProjection, isAutoName, normalizeCfg, referenceKindProjection, referenceProjection, sorted, stringAndNameProjection, } from "./functionComparisonNormalization.js";
|
|
4
|
+
import { dimensionResult, unresolvedDimension, } from "./functionComparisonResults.js";
|
|
5
|
+
export const compareDimensions = (left, right, context) => {
|
|
6
|
+
return [
|
|
7
|
+
compareIdentity(left, right, context),
|
|
8
|
+
compareText("pseudocode", left.dossier.pseudocode, right.dossier.pseudocode, context),
|
|
9
|
+
compareText("assembly", left.dossier.assembly.join("\n"), right.dossier.assembly.join("\n"), context),
|
|
10
|
+
compareComments(left, right, context),
|
|
11
|
+
compareCalls(left, right, context),
|
|
12
|
+
compareReferences(left, right, context),
|
|
13
|
+
compareStringsAndNames(left, right, context),
|
|
14
|
+
compareCfg(left, right, context),
|
|
15
|
+
];
|
|
16
|
+
};
|
|
17
|
+
const compareText = (dimension, left, right, context) => {
|
|
18
|
+
const limitations = dimension === "assembly"
|
|
19
|
+
? [
|
|
20
|
+
"Assembly is opaque provider text; relocation normalization is unavailable.",
|
|
21
|
+
]
|
|
22
|
+
: [];
|
|
23
|
+
if (context.providersDiffer)
|
|
24
|
+
return unresolvedDimension({
|
|
25
|
+
dimension,
|
|
26
|
+
links: context.links,
|
|
27
|
+
leftCount: [...left].length,
|
|
28
|
+
rightCount: [...right].length,
|
|
29
|
+
limitations: [
|
|
30
|
+
...limitations,
|
|
31
|
+
"Exact text comparison requires one provider identity.",
|
|
32
|
+
],
|
|
33
|
+
});
|
|
32
34
|
const changes = diffLines(left, right, {
|
|
33
35
|
timeout: 100,
|
|
34
36
|
maxEditLength: 10_000,
|
|
35
37
|
});
|
|
36
38
|
if (changes === undefined)
|
|
37
|
-
return unresolvedDimension(
|
|
39
|
+
return unresolvedDimension({
|
|
40
|
+
dimension,
|
|
41
|
+
links: context.links,
|
|
42
|
+
leftCount: [...left].length,
|
|
43
|
+
rightCount: [...right].length,
|
|
44
|
+
limitations: [
|
|
45
|
+
"Bounded line diff exceeded its time or edit-distance limit.",
|
|
46
|
+
],
|
|
47
|
+
});
|
|
38
48
|
const delta = changes.reduce((summary, change) => ({
|
|
39
49
|
added_lines: summary.added_lines + (change.added ? (change.count ?? 0) : 0),
|
|
40
50
|
removed_lines: summary.removed_lines + (change.removed ? (change.count ?? 0) : 0),
|
|
@@ -45,48 +55,48 @@ const compareText = (...[dimension, left, right, leftComplete, rightComplete, li
|
|
|
45
55
|
status: delta.hunks === 0 ? "unchanged" : "changed",
|
|
46
56
|
left,
|
|
47
57
|
right,
|
|
48
|
-
|
|
49
|
-
providersDiffer,
|
|
58
|
+
...context,
|
|
50
59
|
leftCount: [...left].length,
|
|
51
60
|
rightCount: [...right].length,
|
|
52
61
|
textDelta: delta,
|
|
53
|
-
limitations
|
|
62
|
+
limitations,
|
|
54
63
|
});
|
|
55
64
|
};
|
|
56
|
-
const
|
|
57
|
-
if (!leftCoverage.complete || !rightCoverage.complete)
|
|
58
|
-
return unresolvedDimension(dimension, leftCoverage.truncated || rightCoverage.truncated
|
|
59
|
-
? "truncated"
|
|
60
|
-
: "unknown", links, left.length, right.length, []);
|
|
61
|
-
return compareValues(dimension, sorted(left), sorted(right), links, true, true, providersDiffer);
|
|
62
|
-
};
|
|
63
|
-
const compareComments = (left, right, links, providersDiffer) => {
|
|
65
|
+
const compareComments = (left, right, context) => {
|
|
64
66
|
const leftValues = commentProjection(left);
|
|
65
67
|
const rightValues = commentProjection(right);
|
|
66
68
|
if (leftValues === null || rightValues === null)
|
|
67
|
-
return unresolvedDimension(
|
|
68
|
-
|
|
69
|
+
return unresolvedDimension({
|
|
70
|
+
dimension: "comments",
|
|
71
|
+
links: context.links,
|
|
72
|
+
leftCount: left.dossier.comments.length,
|
|
73
|
+
rightCount: right.dossier.comments.length,
|
|
74
|
+
limitations: [
|
|
75
|
+
"Comment locations could not be normalized relative to the function.",
|
|
76
|
+
],
|
|
77
|
+
});
|
|
78
|
+
return compareValues("comments", leftValues, rightValues, context);
|
|
69
79
|
};
|
|
70
|
-
const compareStringsAndNames = (left, right,
|
|
80
|
+
const compareStringsAndNames = (left, right, context) => {
|
|
71
81
|
const leftValues = stringAndNameProjection(left);
|
|
72
82
|
const rightValues = stringAndNameProjection(right);
|
|
73
83
|
if (leftValues === null || rightValues === null)
|
|
74
|
-
return unresolvedDimension(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
84
|
+
return unresolvedDimension({
|
|
85
|
+
dimension: "strings_names",
|
|
86
|
+
links: context.links,
|
|
87
|
+
leftCount: null,
|
|
88
|
+
rightCount: null,
|
|
89
|
+
limitations: [
|
|
90
|
+
"Reference source locations could not be normalized to function offsets.",
|
|
91
|
+
],
|
|
92
|
+
});
|
|
93
|
+
return compareValues("strings_names", leftValues, rightValues, context);
|
|
78
94
|
};
|
|
79
|
-
const compareReferences = (left, right,
|
|
80
|
-
const leftCoverage = combineCoverage(left.collections.incoming_references, left.collections.outgoing_references);
|
|
81
|
-
const rightCoverage = combineCoverage(right.collections.incoming_references, right.collections.outgoing_references);
|
|
82
|
-
if (!leftCoverage.complete || !rightCoverage.complete)
|
|
83
|
-
return unresolvedDimension("references", leftCoverage.truncated || rightCoverage.truncated
|
|
84
|
-
? "truncated"
|
|
85
|
-
: "unknown", links, leftCoverage.items.length, rightCoverage.items.length, []);
|
|
95
|
+
const compareReferences = (left, right, context) => {
|
|
86
96
|
const leftProjection = referenceProjection(left);
|
|
87
97
|
const rightProjection = referenceProjection(right);
|
|
88
98
|
if (leftProjection.length === 0 && rightProjection.length === 0)
|
|
89
|
-
return compareValues("references", leftProjection, rightProjection,
|
|
99
|
+
return compareValues("references", leftProjection, rightProjection, context);
|
|
90
100
|
if (canonicalJson(leftProjection, "Function comparison") !==
|
|
91
101
|
canonicalJson(rightProjection, "Function comparison"))
|
|
92
102
|
return dimensionResult({
|
|
@@ -94,8 +104,7 @@ const compareReferences = (left, right, links, providersDiffer) => {
|
|
|
94
104
|
status: "changed",
|
|
95
105
|
left: leftProjection,
|
|
96
106
|
right: rightProjection,
|
|
97
|
-
|
|
98
|
-
providersDiffer,
|
|
107
|
+
...context,
|
|
99
108
|
leftCount: leftProjection.length,
|
|
100
109
|
rightCount: rightProjection.length,
|
|
101
110
|
textDelta: null,
|
|
@@ -106,49 +115,74 @@ const compareReferences = (left, right, links, providersDiffer) => {
|
|
|
106
115
|
const leftKinds = referenceKindProjection(left);
|
|
107
116
|
const rightKinds = referenceKindProjection(right);
|
|
108
117
|
if (leftKinds !== null && rightKinds !== null)
|
|
109
|
-
return compareValues("references", leftKinds, rightKinds,
|
|
110
|
-
return unresolvedDimension(
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
return compareValues("references", leftKinds, rightKinds, context);
|
|
119
|
+
return unresolvedDimension({
|
|
120
|
+
dimension: "references",
|
|
121
|
+
links: context.links,
|
|
122
|
+
leftCount: leftProjection.length,
|
|
123
|
+
rightCount: rightProjection.length,
|
|
124
|
+
limitations: [
|
|
125
|
+
"At least one provider did not expose reference kinds, so equal endpoints do not prove equal edge semantics.",
|
|
126
|
+
],
|
|
127
|
+
});
|
|
113
128
|
};
|
|
114
|
-
const compareIdentity = (left, right,
|
|
115
|
-
if (isAutoName(left.procedure.name) ||
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
129
|
+
const compareIdentity = (left, right, context) => {
|
|
130
|
+
if (isAutoName(left.dossier.procedure.name) ||
|
|
131
|
+
isAutoName(right.dossier.procedure.name))
|
|
132
|
+
return unresolvedDimension({
|
|
133
|
+
dimension: "identity",
|
|
134
|
+
links: context.links,
|
|
135
|
+
leftCount: null,
|
|
136
|
+
rightCount: null,
|
|
137
|
+
limitations: [
|
|
138
|
+
"Address-derived function names are not stable cross-version identity.",
|
|
139
|
+
],
|
|
140
|
+
});
|
|
141
|
+
return compareValues("identity", identityProjection(left), identityProjection(right), context);
|
|
120
142
|
};
|
|
121
|
-
const compareCalls = (left, right,
|
|
143
|
+
const compareCalls = (left, right, context) => {
|
|
122
144
|
const leftValues = callProjection(left);
|
|
123
145
|
const rightValues = callProjection(right);
|
|
124
146
|
if ([...leftValues, ...rightValues].some(({ name }) => isAutoName(name)))
|
|
125
|
-
return unresolvedDimension(
|
|
126
|
-
|
|
147
|
+
return unresolvedDimension({
|
|
148
|
+
dimension: "calls",
|
|
149
|
+
links: context.links,
|
|
150
|
+
leftCount: leftValues.length,
|
|
151
|
+
rightCount: rightValues.length,
|
|
152
|
+
limitations: [
|
|
153
|
+
"Address-derived callee or caller names cannot be matched safely.",
|
|
154
|
+
],
|
|
155
|
+
});
|
|
156
|
+
return compareValues("calls", sorted(leftValues), sorted(rightValues), context);
|
|
127
157
|
};
|
|
128
158
|
const callProjection = (snapshot) => [
|
|
129
|
-
...
|
|
159
|
+
...snapshot.dossier.callers.map(({ name }) => ({
|
|
130
160
|
direction: "in",
|
|
131
161
|
name,
|
|
132
162
|
})),
|
|
133
|
-
...
|
|
163
|
+
...snapshot.dossier.callees.map(({ name }) => ({
|
|
134
164
|
direction: "out",
|
|
135
165
|
name,
|
|
136
166
|
})),
|
|
137
167
|
];
|
|
138
|
-
const compareCfg = (left, right,
|
|
139
|
-
const leftBlocks = left.
|
|
140
|
-
const rightBlocks = right.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const leftGraph = normalizeCfg(leftBlocks.items);
|
|
144
|
-
const rightGraph = normalizeCfg(rightBlocks.items);
|
|
168
|
+
const compareCfg = (left, right, context) => {
|
|
169
|
+
const leftBlocks = left.dossier.basic_blocks;
|
|
170
|
+
const rightBlocks = right.dossier.basic_blocks;
|
|
171
|
+
const leftGraph = normalizeCfg(leftBlocks);
|
|
172
|
+
const rightGraph = normalizeCfg(rightBlocks);
|
|
145
173
|
if (leftGraph === null || rightGraph === null)
|
|
146
|
-
return unresolvedDimension(
|
|
147
|
-
|
|
174
|
+
return unresolvedDimension({
|
|
175
|
+
dimension: "cfg",
|
|
176
|
+
links: context.links,
|
|
177
|
+
leftCount: leftBlocks.length,
|
|
178
|
+
rightCount: rightBlocks.length,
|
|
179
|
+
limitations: [
|
|
180
|
+
"CFG addresses could not be normalized to local block indices.",
|
|
181
|
+
],
|
|
182
|
+
});
|
|
183
|
+
return compareValues("cfg", leftGraph, rightGraph, context);
|
|
148
184
|
};
|
|
149
|
-
const compareValues = (
|
|
150
|
-
if (!leftComplete || !rightComplete)
|
|
151
|
-
return unresolvedDimension(dimension, "unknown", links, null, null, []);
|
|
185
|
+
const compareValues = (dimension, left, right, context) => {
|
|
152
186
|
const leftJson = canonicalJson(left, "Function comparison");
|
|
153
187
|
const rightJson = canonicalJson(right, "Function comparison");
|
|
154
188
|
return dimensionResult({
|
|
@@ -156,8 +190,7 @@ const compareValues = (...[dimension, left, right, links, leftComplete, rightCom
|
|
|
156
190
|
status: leftJson === rightJson ? "unchanged" : "changed",
|
|
157
191
|
left,
|
|
158
192
|
right,
|
|
159
|
-
|
|
160
|
-
providersDiffer,
|
|
193
|
+
...context,
|
|
161
194
|
leftCount: Array.isArray(left) ? left.length : null,
|
|
162
195
|
rightCount: Array.isArray(right) ? right.length : null,
|
|
163
196
|
textDelta: null,
|
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
import { canonicalJson } from "./comparisonSemantics.js";
|
|
2
2
|
import { compareCodePoints } from "./canonicalOrdering.js";
|
|
3
3
|
export const identityProjection = (snapshot) => ({
|
|
4
|
-
name: snapshot.procedure.name,
|
|
5
|
-
signature: snapshot.procedure.signature,
|
|
6
|
-
locals: snapshot.procedure.locals
|
|
4
|
+
name: snapshot.dossier.procedure.name,
|
|
5
|
+
signature: snapshot.dossier.procedure.signature,
|
|
6
|
+
locals: snapshot.dossier.procedure.locals
|
|
7
7
|
.map(({ description }) => description)
|
|
8
8
|
.sort(),
|
|
9
9
|
});
|
|
10
10
|
export const functionMatch = (left, right) => {
|
|
11
|
-
if (!isAutoName(left.procedure.name) &&
|
|
12
|
-
left.procedure.name === right.procedure.name)
|
|
11
|
+
if (!isAutoName(left.dossier.procedure.name) &&
|
|
12
|
+
left.dossier.procedure.name === right.dossier.procedure.name)
|
|
13
13
|
return {
|
|
14
14
|
status: "matched",
|
|
15
15
|
method: "symbol",
|
|
16
|
-
left_name: left.procedure.name,
|
|
17
|
-
right_name: right.procedure.name,
|
|
16
|
+
left_name: left.dossier.procedure.name,
|
|
17
|
+
right_name: right.dossier.procedure.name,
|
|
18
18
|
};
|
|
19
19
|
return {
|
|
20
|
-
status: left.procedure.name === right.procedure.name
|
|
20
|
+
status: left.dossier.procedure.name === right.dossier.procedure.name
|
|
21
|
+
? "ambiguous"
|
|
22
|
+
: "mismatched",
|
|
21
23
|
method: "explicit",
|
|
22
|
-
left_name: left.procedure.name,
|
|
23
|
-
right_name: right.procedure.name,
|
|
24
|
+
left_name: left.dossier.procedure.name,
|
|
25
|
+
right_name: right.dossier.procedure.name,
|
|
24
26
|
};
|
|
25
27
|
};
|
|
26
28
|
export const normalizeCfg = (blocks) => {
|
|
@@ -56,12 +58,12 @@ export const normalizeCfg = (blocks) => {
|
|
|
56
58
|
return graph;
|
|
57
59
|
};
|
|
58
60
|
export const referenceProjection = (snapshot) => sorted([
|
|
59
|
-
...snapshot.
|
|
61
|
+
...snapshot.dossier.incoming_references.map((item) => ({
|
|
60
62
|
direction: "in",
|
|
61
63
|
source: item.source_procedure?.name ?? null,
|
|
62
64
|
target: item.target_procedure?.name ?? null,
|
|
63
65
|
})),
|
|
64
|
-
...snapshot.
|
|
66
|
+
...snapshot.dossier.outgoing_references.map((item) => ({
|
|
65
67
|
direction: "out",
|
|
66
68
|
source: item.source_procedure?.name ?? null,
|
|
67
69
|
target: item.target_procedure?.name ?? null,
|
|
@@ -69,11 +71,11 @@ export const referenceProjection = (snapshot) => sorted([
|
|
|
69
71
|
]);
|
|
70
72
|
export const referenceKindProjection = (snapshot) => {
|
|
71
73
|
const edges = [
|
|
72
|
-
...snapshot.
|
|
74
|
+
...snapshot.dossier.incoming_references.map((edge) => ({
|
|
73
75
|
direction: "in",
|
|
74
76
|
edge,
|
|
75
77
|
})),
|
|
76
|
-
...snapshot.
|
|
78
|
+
...snapshot.dossier.outgoing_references.map((edge) => ({
|
|
77
79
|
direction: "out",
|
|
78
80
|
edge,
|
|
79
81
|
})),
|
|
@@ -105,8 +107,8 @@ export const referenceKindProjection = (snapshot) => {
|
|
|
105
107
|
}));
|
|
106
108
|
};
|
|
107
109
|
export const commentProjection = (snapshot) => {
|
|
108
|
-
const values = snapshot.
|
|
109
|
-
offset: relativeAddress(address, snapshot.procedure.address),
|
|
110
|
+
const values = snapshot.dossier.comments.map(({ address, kind, text }) => ({
|
|
111
|
+
offset: relativeAddress(address, snapshot.dossier.procedure.address),
|
|
110
112
|
kind,
|
|
111
113
|
text,
|
|
112
114
|
}));
|
|
@@ -114,14 +116,14 @@ export const commentProjection = (snapshot) => {
|
|
|
114
116
|
};
|
|
115
117
|
export const stringAndNameProjection = (snapshot) => {
|
|
116
118
|
const values = [
|
|
117
|
-
...snapshot.
|
|
119
|
+
...snapshot.dossier.referenced_strings.map(({ source_address: sourceAddress, value }) => ({
|
|
118
120
|
kind: "string",
|
|
119
|
-
source_offset: relativeAddress(sourceAddress, snapshot.procedure.address),
|
|
121
|
+
source_offset: relativeAddress(sourceAddress, snapshot.dossier.procedure.address),
|
|
120
122
|
value,
|
|
121
123
|
})),
|
|
122
|
-
...snapshot.
|
|
124
|
+
...snapshot.dossier.referenced_names.map(({ source_address: sourceAddress, value }) => ({
|
|
123
125
|
kind: "name",
|
|
124
|
-
source_offset: relativeAddress(sourceAddress, snapshot.procedure.address),
|
|
126
|
+
source_offset: relativeAddress(sourceAddress, snapshot.dossier.procedure.address),
|
|
125
127
|
value,
|
|
126
128
|
})),
|
|
127
129
|
];
|
|
@@ -134,21 +136,8 @@ export const sorted = (values) => values
|
|
|
134
136
|
value,
|
|
135
137
|
json: canonicalJson(value, "Function normalization"),
|
|
136
138
|
}))
|
|
137
|
-
.sort((left, right) =>
|
|
138
|
-
// Preserve existing collation while ordering distinct values within a tie.
|
|
139
|
-
return (left.json.localeCompare(right.json) ||
|
|
140
|
-
compareCodePoints(left.json, right.json));
|
|
141
|
-
})
|
|
139
|
+
.sort((left, right) => compareCodePoints(left.json, right.json))
|
|
142
140
|
.map(({ value }) => value);
|
|
143
|
-
export const combineCoverage = (left, right) => {
|
|
144
|
-
return {
|
|
145
|
-
items: [...left.items, ...right.items],
|
|
146
|
-
total: left.total + right.total,
|
|
147
|
-
complete: true,
|
|
148
|
-
truncated: false,
|
|
149
|
-
};
|
|
150
|
-
};
|
|
151
|
-
export const project = (collection, mapper) => collection.items.map(mapper);
|
|
152
141
|
export const isAutoName = (name) => /^(?:sub_[0-9a-f]+|fcn\.[0-9a-f]+)$/iu.test(name);
|
|
153
142
|
const parseAddress = (value) => /^0x[0-9a-f]+$/iu.test(value) ? BigInt(value) : null;
|
|
154
143
|
const relativeAddress = (value, base) => {
|
|
@@ -26,7 +26,7 @@ export const dimensionResult = (input) => {
|
|
|
26
26
|
};
|
|
27
27
|
export const unresolvedDimension = (input) => ({
|
|
28
28
|
dimension: input.dimension,
|
|
29
|
-
status:
|
|
29
|
+
status: "unknown",
|
|
30
30
|
left_digest: null,
|
|
31
31
|
right_digest: null,
|
|
32
32
|
left_count: input.leftCount,
|
|
@@ -37,8 +37,6 @@ export const unresolvedDimension = (input) => ({
|
|
|
37
37
|
limitations: [...input.limitations],
|
|
38
38
|
});
|
|
39
39
|
export const overallStatus = (dimensions, match) => {
|
|
40
|
-
if (dimensions.some(({ status }) => status === "truncated"))
|
|
41
|
-
return "truncated";
|
|
42
40
|
if (match === "ambiguous" ||
|
|
43
41
|
dimensions.some(({ status }) => status === "unknown"))
|
|
44
42
|
return "unknown";
|
|
@@ -51,7 +49,6 @@ export const overallStatus = (dimensions, match) => {
|
|
|
51
49
|
export const summarize = (dimensions) => ({
|
|
52
50
|
unchanged: dimensions.filter(({ status }) => status === "unchanged").length,
|
|
53
51
|
changed: dimensions.filter(({ status }) => status === "changed").length,
|
|
54
|
-
truncated: dimensions.filter(({ status }) => status === "truncated").length,
|
|
55
52
|
unknown: dimensions.filter(({ status }) => status === "unknown").length,
|
|
56
53
|
});
|
|
57
54
|
const digest = (value) => canonicalDigest(value, "Function comparison");
|
|
@@ -2,12 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { evidenceSchema } from "./evidence.js";
|
|
3
3
|
import { digestSchema } from "./../domain/digests.js";
|
|
4
4
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
|
-
const comparisonStatusSchema = z.enum([
|
|
6
|
-
"unchanged",
|
|
7
|
-
"changed",
|
|
8
|
-
"truncated",
|
|
9
|
-
"unknown",
|
|
10
|
-
]);
|
|
5
|
+
const comparisonStatusSchema = z.enum(["unchanged", "changed", "unknown"]);
|
|
11
6
|
const dimensionNameSchema = z.enum([
|
|
12
7
|
"identity",
|
|
13
8
|
"pseudocode",
|
|
@@ -55,7 +50,7 @@ const functionDimensionSchema = z.union([
|
|
|
55
50
|
}),
|
|
56
51
|
z.object({
|
|
57
52
|
...functionDimensionContextShape,
|
|
58
|
-
status: z.
|
|
53
|
+
status: z.literal("unknown"),
|
|
59
54
|
left_digest: z.null(),
|
|
60
55
|
right_digest: z.null(),
|
|
61
56
|
text_delta: z.null(),
|
|
@@ -85,7 +80,6 @@ export const functionComparisonResultSchema = z.object({
|
|
|
85
80
|
summary: z.object({
|
|
86
81
|
unchanged: z.number().int().min(0),
|
|
87
82
|
changed: z.number().int().min(0),
|
|
88
|
-
truncated: z.number().int().min(0),
|
|
89
83
|
unknown: z.number().int().min(0),
|
|
90
84
|
}),
|
|
91
85
|
dimensions: z.array(functionDimensionSchema).length(8),
|