rea-agents 6.1.0 → 6.3.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 +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- 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/android/AndroidAnalysisService.js +1 -1
- 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 +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- 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 +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- 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 +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- 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 +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- 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 +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- 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 +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- 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/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- 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 +7 -7
- 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/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- 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/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- 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/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -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/android/androidPartialObservation.js +36 -0
- 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 +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- 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/browserCompleteness.js +3 -2
- 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/browserScenarioCaptureValues.js +2 -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/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- 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 +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- 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 +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- 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 +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- 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/filesystem/RegularFile.js +41 -0
- 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 +105 -36
- 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 +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- 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 +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- 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 +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- 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/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- 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 +6 -6
- 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 +4 -4
- 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/registerArtifactTools.js +2 -2
- 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 +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- 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/registerManagedTools.js +7 -4
- 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 +32 -41
- 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 +19 -19
- 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 +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- 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 +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- 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/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
**English** · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md)
|
|
3
|
+
**English** · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md)
|
|
4
4
|
|
|
5
5
|
# REA: Reverse Engineer Anything
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://www.npmjs.com/package/rea-agents)
|
|
12
12
|
[](https://github.com/morluto/rea/actions/workflows/ci.yml)
|
|
13
13
|
[](docs/mcp-contracts.md#generated-catalog)
|
|
14
|
-
[](#what-you-can-analyze)
|
|
15
15
|
[](https://skills.sh/morluto/rea/reverse-engineer-anything)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://discord.gg/GkcryMnJDM)
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
|
|
29
29
|
<img src="docs/assets/rea-hopper-analysis.png" alt="REA launching its analysis bridge inside Hopper while inspecting a native binary" width="1200" />
|
|
30
30
|
|
|
31
|
-
<br />
|
|
31
|
+
<br /><br />
|
|
32
32
|
|
|
33
33
|
<table aria-label="REA community">
|
|
34
34
|
<tr>
|
|
@@ -52,7 +52,7 @@ See a feature in an app that you want in your own product? Ask your agent to inv
|
|
|
52
52
|
|
|
53
53
|
REA connects your agent to tools for inspecting native binaries, JavaScript and Electron apps, .NET assemblies, and websites. You can also use the same tools from your terminal. Analysis runs locally, and results include the evidence and limitations behind each conclusion.
|
|
54
54
|
|
|
55
|
-
Setup registers REA with your agent and installs matching workflow instructions. Native analysis can use an existing Hopper or
|
|
55
|
+
Setup registers REA with your agent and installs matching workflow instructions. Native analysis can use an existing Hopper, Ghidra, or IDA installation; setup can optionally install Hopper with approval. Static JavaScript analysis needs no native analysis engine.
|
|
56
56
|
|
|
57
57
|
> **[Visit the REA website](https://rea.tools/)** for setup instructions, illustrated guides, and real case studies.
|
|
58
58
|
|
|
@@ -156,8 +156,8 @@ Additional tools and host support depend on the target:
|
|
|
156
156
|
| JavaScript / Electron | Modules, imports, source maps, routes, IPC and native add-on relationships | Node.js and npm; [application analysis](https://rea.tools/guides/javascript/) |
|
|
157
157
|
| Websites | Page structure, scripts, network observations and requested screenshots | A Chrome-family browser; [browser analysis](https://rea.tools/guides/browser/) |
|
|
158
158
|
| Saved network captures | Requests, responses, exposed payloads and source locations | HAR; mitmdump on Linux for native mitmproxy captures; [capture guide](docs/web-network-captures.md) |
|
|
159
|
-
| .NET assemblies | Metadata, CIL instructions, declared native dependencies and build comparisons |
|
|
160
|
-
| Android APKs | Manifest declarations, classes, decompiled methods and references | Headless JADX and a full JDK on Linux/macOS; [Android guide](docs/android-analysis.md)
|
|
159
|
+
| .NET assemblies | Metadata, CIL instructions, declared native dependencies and build comparisons | None (static only); [managed-code guide](docs/managed-code-analysis.md) |
|
|
160
|
+
| Android APKs | Manifest declarations, classes, decompiled methods and references | Headless JADX and a full JDK on Linux/macOS/Windows x64; [Android guide](docs/android-analysis.md) |
|
|
161
161
|
| Firmware | Regions, extraction results and native-analysis handoffs | Binwalk / Unblob on Linux; [firmware guide](docs/firmware-analysis.md) |
|
|
162
162
|
| Packages and resources | File inventories, digests, plists, Apple bundle anatomy and extracted resources | [Artifact and JavaScript guide](docs/javascript-artifact-reconstruction.md), [Apple applications](docs/apple-application-analysis.md) |
|
|
163
163
|
| Process behavior | Terminal output, interactions, exit and filesystem observations, and run comparisons | Linux/macOS with a native PTY; [process capture](docs/process-capture.md) |
|
|
@@ -181,6 +181,8 @@ for features added since the latest npm release.
|
|
|
181
181
|
|
|
182
182
|
## Showcases
|
|
183
183
|
|
|
184
|
+
[](https://rea.tools/showcase/)
|
|
185
|
+
|
|
184
186
|
### DX-Ball: reconstruct a sound-pan calculation
|
|
185
187
|
|
|
186
188
|
Follow a sound call into its position-to-pan helper, inspect the instructions,
|
|
@@ -243,7 +245,7 @@ ask you to choose demo mode or activate your license. See
|
|
|
243
245
|
<details>
|
|
244
246
|
<summary><strong>What does installing the skill from skills.sh do?</strong></summary>
|
|
245
247
|
|
|
246
|
-
The skill supplies investigation instructions for your agent. Use `rea setup`
|
|
248
|
+
The skill supplies investigation instructions for your agent. Use `npx rea-agents setup`
|
|
247
249
|
to register REA's MCP server and install the matching instructions, then restart
|
|
248
250
|
your agent. See [skill-only installation](docs/installation.md#skill-only-installation).
|
|
249
251
|
|
|
@@ -298,30 +300,16 @@ For exact options, prerequisites and result contracts:
|
|
|
298
300
|
- [Readiness and troubleshooting](docs/installation.md#check-readiness-for-your-task): diagnose one agent or analysis engine.
|
|
299
301
|
- [CLI and Evidence](docs/cli.md): commands, provider selection, snapshots, import/export and exit statuses.
|
|
300
302
|
- [MCP contracts](docs/mcp-contracts.md) and [agent prompts](docs/mcp-prompts.md): tool results, sessions and guided investigations.
|
|
301
|
-
- [Tool catalog](docs/mcp-contracts.md#generated-catalog):
|
|
303
|
+
- [Tool catalog](docs/mcp-contracts.md#generated-catalog): generated inventory of tools, providers and CLI commands.
|
|
302
304
|
- [Roadmap](docs/roadmap.md): planned work and capability trackers.
|
|
303
305
|
|
|
304
306
|
Report vulnerabilities through [SECURITY.md](SECURITY.md).
|
|
305
307
|
|
|
306
|
-
## Contributing
|
|
307
|
-
|
|
308
|
-
We'd love your help with REA! [Open an issue](https://github.com/morluto/rea/issues) to
|
|
309
|
-
report a bug or suggest a feature, or [send a pull request](https://github.com/morluto/rea/pulls)
|
|
310
|
-
to improve the code or docs.
|
|
311
|
-
|
|
312
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and checks,
|
|
313
|
-
[testing](docs/testing.md) for verification lanes, and the
|
|
314
|
-
[architecture map](docs/architecture.mermaid) for the project structure.
|
|
315
|
-
|
|
316
|
-
## Project links
|
|
317
|
-
|
|
318
|
-
[Website](https://rea.tools/) · [npm](https://www.npmjs.com/package/rea-agents) · [skills.sh](https://skills.sh/morluto/rea/reverse-engineer-anything) · [Issues](https://github.com/morluto/rea/issues) · [Security](SECURITY.md)
|
|
319
|
-
|
|
320
308
|
## Star history
|
|
321
309
|
|
|
322
|
-
🎉 **
|
|
310
|
+
🎉 **40,000 GitHub stars — thank you!**
|
|
323
311
|
|
|
324
|
-
Thanks to everyone using REA, reporting bugs, testing builds, and contributing fixes.
|
|
312
|
+
Thanks to everyone using REA, reporting bugs, requesting features, testing builds, and contributing fixes.
|
|
325
313
|
|
|
326
314
|
<a href="https://www.star-history.com/?repos=morluto%2Frea&type=date">
|
|
327
315
|
<picture>
|
|
@@ -335,6 +323,18 @@ Thanks to everyone using REA, reporting bugs, testing builds, and contributing f
|
|
|
335
323
|
|
|
336
324
|
REA provides tools for lawful reverse-engineering research, analysis, and reconstruction. You are responsible for obtaining any required authorization and complying with applicable laws. The project does not endorse illegal or unauthorized use.
|
|
337
325
|
|
|
326
|
+
REA is an open-source software project. We have not issued or endorsed any cryptocurrency or token. Tokens using the REA name are not affiliated with the project.
|
|
327
|
+
|
|
328
|
+
## Contributing
|
|
329
|
+
|
|
330
|
+
We'd love your help with REA! [Open an issue](https://github.com/morluto/rea/issues) to
|
|
331
|
+
report a bug or suggest a feature, or [send a pull request](https://github.com/morluto/rea/pulls)
|
|
332
|
+
to improve the code or docs.
|
|
333
|
+
|
|
334
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and checks,
|
|
335
|
+
[testing](docs/testing.md) for verification lanes, and the
|
|
336
|
+
[architecture map](docs/architecture.mermaid) for the project structure.
|
|
337
|
+
|
|
338
338
|
## License
|
|
339
339
|
|
|
340
340
|
[MIT](LICENSE)
|
|
@@ -866,6 +866,7 @@ public final class ReaGhidraBridge extends HeadlessScript {
|
|
|
866
866
|
JsonArray operands = new JsonArray();
|
|
867
867
|
JsonArray references = new JsonArray();
|
|
868
868
|
JsonArray destinations = new JsonArray();
|
|
869
|
+
JsonArray flowEvidence = new JsonArray();
|
|
869
870
|
JsonObject flow = new JsonObject();
|
|
870
871
|
flow.addProperty("kind", "unavailable");
|
|
871
872
|
flow.addProperty("conditional", false);
|
|
@@ -881,7 +882,20 @@ public final class ReaGhidraBridge extends HeadlessScript {
|
|
|
881
882
|
result.addProperty("mnemonic", instruction.getMnemonicString());
|
|
882
883
|
result.addProperty("raw_disassembly", instruction.toString());
|
|
883
884
|
RefType type = instruction.getFlowType();
|
|
884
|
-
|
|
885
|
+
JsonObject listingFlow = new JsonObject();
|
|
886
|
+
listingFlow.addProperty("source", "ghidra-listing-flow-type");
|
|
887
|
+
listingFlow.addProperty("value", type.getName());
|
|
888
|
+
flowEvidence.add(listingFlow);
|
|
889
|
+
boolean decodedReturn = false;
|
|
890
|
+
for (PcodeOp operation : instruction.getPcode()) {
|
|
891
|
+
if (operation.getOpcode() != PcodeOp.RETURN) continue;
|
|
892
|
+
decodedReturn = true;
|
|
893
|
+
JsonObject returnEvidence = new JsonObject();
|
|
894
|
+
returnEvidence.addProperty("source", "ghidra-instruction-pcode");
|
|
895
|
+
returnEvidence.addProperty("value", operation.getMnemonic());
|
|
896
|
+
flowEvidence.add(returnEvidence);
|
|
897
|
+
}
|
|
898
|
+
flow.addProperty("kind", type.isCall() ? "call" : type.isJump() ? "jump" : decodedReturn ? "return" : type.isTerminal() ? "terminal" : "fallthrough");
|
|
885
899
|
flow.addProperty("conditional", type.isConditional());
|
|
886
900
|
flow.addProperty("computed", type.isComputed());
|
|
887
901
|
if (!type.isComputed()) for (Address target : instruction.getFlows()) destinations.add(canonicalAddress(target));
|
|
@@ -917,10 +931,13 @@ public final class ReaGhidraBridge extends HeadlessScript {
|
|
|
917
931
|
}
|
|
918
932
|
}
|
|
919
933
|
flow.add("direct_destinations", destinations);
|
|
934
|
+
flow.add("classification_evidence", flowEvidence);
|
|
920
935
|
result.add("operands", operands);
|
|
921
936
|
result.add("flow", flow);
|
|
922
937
|
result.add("references", references);
|
|
923
|
-
|
|
938
|
+
List<String> limitations = new ArrayList<>(List.of("Operand components are Ghidra Listing decoder tokens; effective memory base/index/displacement roles and per-instruction context mode are unavailable. The mode field is the program language variant."));
|
|
939
|
+
if (flow.get("kind").getAsString().equals("terminal")) limitations.add("No RETURN operation was observed in the provider's instruction p-code; terminal classification remains generic.");
|
|
940
|
+
result.add("limitations", GSON.toJsonTree(limitations));
|
|
924
941
|
return result;
|
|
925
942
|
}
|
|
926
943
|
|
|
@@ -1629,9 +1646,20 @@ public final class ReaGhidraBridge extends HeadlessScript {
|
|
|
1629
1646
|
Function function = entry.function;
|
|
1630
1647
|
Symbol symbol = function.getSymbol();
|
|
1631
1648
|
String qualified = symbol == null ? function.getName() : symbol.getName(true);
|
|
1632
|
-
|
|
1633
|
-
|
|
1649
|
+
boolean matchesName = function.getName().equals(value) || qualified.equals(value);
|
|
1650
|
+
if (!matchesName) {
|
|
1651
|
+
// Imported labels (for example Mach-O _main) can share a
|
|
1652
|
+
// function entry without becoming its primary symbol. Only
|
|
1653
|
+
// exact entries qualify; an interior label is not a selector.
|
|
1654
|
+
for (Symbol entrySymbol : currentProgram.getSymbolTable().getSymbols(function.getEntryPoint())) {
|
|
1655
|
+
monitor.checkCancelled();
|
|
1656
|
+
if (entrySymbol.getName().equals(value) || entrySymbol.getName(true).equals(value)) {
|
|
1657
|
+
matchesName = true;
|
|
1658
|
+
break;
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1634
1661
|
}
|
|
1662
|
+
if (matchesName) matches.add(function);
|
|
1635
1663
|
}
|
|
1636
1664
|
if (matches.size() > 1)
|
|
1637
1665
|
throw new RequestFailure("ambiguous", "Ghidra procedure name is ambiguous: " + value +
|
package/bridge/hopper_bridge.py
CHANGED
|
@@ -553,7 +553,12 @@ def _search_results(document, kind, params):
|
|
|
553
553
|
if not matches(item[1]):
|
|
554
554
|
continue
|
|
555
555
|
selected.append(item)
|
|
556
|
-
|
|
556
|
+
if not selected:
|
|
557
|
+
return []
|
|
558
|
+
if kind == "string":
|
|
559
|
+
records = _string_inventory(document)
|
|
560
|
+
return [{"address": address, **records[address]} for address, _ in selected]
|
|
561
|
+
return [
|
|
557
562
|
{
|
|
558
563
|
"address": address,
|
|
559
564
|
"value": value,
|
|
@@ -711,6 +716,8 @@ def _analyze_function(document, params):
|
|
|
711
716
|
"referenced_strings": referenced_strings,
|
|
712
717
|
"referenced_names": referenced_names,
|
|
713
718
|
"basic_blocks": blocks,
|
|
719
|
+
"native_api": None,
|
|
720
|
+
"native_value_flow": None,
|
|
714
721
|
"limitations": [
|
|
715
722
|
"Native CallReference classifications are observed where available; detailed reference flags remain unknown.",
|
|
716
723
|
"Hopper's public Python API does not expose equivalent external or thunk classification in this dossier.",
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { access, realpath, stat } from "node:fs/promises";
|
|
3
|
-
import { isAbsolute, join } from "node:path";
|
|
3
|
+
import { delimiter, isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
import { systemWindowsNativeAuthority } from "../windows/WindowsNativeLoader.js";
|
|
4
5
|
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
|
|
6
|
+
import { ZipArtifactReader } from "../artifacts/ZipArtifactReader.js";
|
|
5
7
|
import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
|
|
6
8
|
import { JADX_JAR_CONFIGURATION_REMEDIATION } from "./JadxRelease.js";
|
|
7
9
|
const JAVA_MODULE_LISTING_TIMEOUT_MS = 10_000;
|
|
8
10
|
const JAVA_MODULE_LISTING_MAX_OUTPUT_BYTES = 1024 * 1024;
|
|
11
|
+
// Bound ZIP metadata allocation during discovery. The audited 0.7.1 JAR's
|
|
12
|
+
// central directory occupies 2,294,350 bytes; class bodies are not read here.
|
|
13
|
+
const JAR_METADATA_READ_MAX_BYTES = 8 * 1024 * 1024;
|
|
9
14
|
class JadxConfigurationFailure extends Error {
|
|
10
15
|
code;
|
|
11
16
|
diagnostics;
|
|
@@ -74,16 +79,65 @@ export const resolveJadxConfiguration = async (environment, operation, signal) =
|
|
|
74
79
|
const readJadxConfiguration = async (environment, signal) => {
|
|
75
80
|
requireSupportedHost();
|
|
76
81
|
const jar = await resolveJar(environment);
|
|
77
|
-
const java = resolveJava(environment);
|
|
82
|
+
const java = await resolveJava(environment, signal);
|
|
78
83
|
await requireJavaHomeExecutable(environment.JAVA_HOME, java);
|
|
79
84
|
const jvmArguments = resolveJvmArguments(environment);
|
|
80
85
|
await inspectJavaRuntime(java, environment, signal);
|
|
86
|
+
await requireEngineArchive(jar, signal);
|
|
81
87
|
return { jar, java, jvmArguments };
|
|
82
88
|
};
|
|
89
|
+
const requireEngineArchive = async (jar, signal) => {
|
|
90
|
+
// These classes are consumed directly by ReaJadxBridge.java. This checks the
|
|
91
|
+
// classpath inventory without loading engine code or starting a JADX session.
|
|
92
|
+
const missing = new Set([
|
|
93
|
+
"com/atxx/jhmcp/JadxSession.class",
|
|
94
|
+
"com/atxx/jhmcp/SessionHolder.class",
|
|
95
|
+
"jadx/api/JadxDecompiler.class",
|
|
96
|
+
"com/google/gson/Gson.class",
|
|
97
|
+
"io/modelcontextprotocol/kotlin/sdk/server/Server.class",
|
|
98
|
+
]);
|
|
99
|
+
const reader = new ZipArtifactReader(jar, "zip", JAR_METADATA_READ_MAX_BYTES);
|
|
100
|
+
try {
|
|
101
|
+
for await (const entry of reader.entries(signal)) {
|
|
102
|
+
if (entry.kind === "file" && !entry.encrypted)
|
|
103
|
+
missing.delete(entry.path);
|
|
104
|
+
if (missing.size === 0)
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (cause) {
|
|
109
|
+
if (signal?.aborted === true)
|
|
110
|
+
throw cause;
|
|
111
|
+
const reason = cause instanceof Error ? cause.message : String(cause);
|
|
112
|
+
throw configurationFailure("version_unresolved", `Cannot inspect REA_JADX_MCP_JAR ${jar} as a Java archive: ${reason}. ${JADX_JAR_CONFIGURATION_REMEDIATION}`, {
|
|
113
|
+
jar_path: jar,
|
|
114
|
+
phase: "jar-inspection",
|
|
115
|
+
archive_error: reason,
|
|
116
|
+
maximum_metadata_read_bytes: JAR_METADATA_READ_MAX_BYTES,
|
|
117
|
+
}, cause);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
await reader.close();
|
|
121
|
+
}
|
|
122
|
+
throw configurationFailure("unsupported_version", `REA_JADX_MCP_JAR ${jar} does not contain the required metadata bridge classes: ${[...missing].join(", ")}. ${JADX_JAR_CONFIGURATION_REMEDIATION}`, { jar_path: jar, phase: "jar-inspection", missing_classes: [...missing] });
|
|
123
|
+
};
|
|
83
124
|
const requireSupportedHost = () => {
|
|
84
125
|
if (process.platform === "linux" || process.platform === "darwin")
|
|
85
126
|
return;
|
|
86
|
-
|
|
127
|
+
if (process.platform === "win32" && process.arch === "x64") {
|
|
128
|
+
const loaded = systemWindowsNativeAuthority();
|
|
129
|
+
if (loaded.available && loaded.authority.inspection.protocolStdin === true)
|
|
130
|
+
return;
|
|
131
|
+
throw configurationFailure("runtime_missing", loaded.available
|
|
132
|
+
? "The bundled Windows native artifact lacks owned protocol stdin; use a matching current Windows x64 REA package."
|
|
133
|
+
: loaded.reason, {
|
|
134
|
+
platform: process.platform,
|
|
135
|
+
architecture: process.arch,
|
|
136
|
+
phase: "process-ownership",
|
|
137
|
+
owned_protocol_stdin: false,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
throw configurationFailure("unsupported_host", `Android JADX subprocess ownership is unsupported on ${process.platform}/${process.arch}; use Linux, macOS, or Windows x64 with its bundled native controls.`, { platform: process.platform });
|
|
87
141
|
};
|
|
88
142
|
const resolveJar = async (environment) => {
|
|
89
143
|
const jar = environment.REA_JADX_MCP_JAR;
|
|
@@ -101,11 +155,37 @@ const resolveJar = async (environment) => {
|
|
|
101
155
|
throw configurationFailure("executable_missing", `Cannot read REA_JADX_MCP_JAR ${jar}: ${cause instanceof Error ? cause.message : String(cause)}`, { jar_path: jar }, cause);
|
|
102
156
|
}
|
|
103
157
|
};
|
|
104
|
-
const resolveJava = (environment) => {
|
|
105
|
-
|
|
106
|
-
|
|
158
|
+
const resolveJava = async (environment, signal) => {
|
|
159
|
+
const executable = process.platform === "win32" ? "java.exe" : "java";
|
|
160
|
+
if (environment.JAVA_HOME === undefined) {
|
|
161
|
+
if (process.platform !== "win32")
|
|
162
|
+
return executable;
|
|
163
|
+
const path = Object.entries(environment).find(([key]) => key.toLowerCase() === "path")?.[1] ?? "";
|
|
164
|
+
for (const directory of [process.cwd(), ...path.split(delimiter)]) {
|
|
165
|
+
signal?.throwIfAborted();
|
|
166
|
+
// Windows PATH commonly quotes individual entries containing spaces.
|
|
167
|
+
const selected = directory.startsWith('"') && directory.endsWith('"')
|
|
168
|
+
? directory.slice(1, -1)
|
|
169
|
+
: directory;
|
|
170
|
+
const candidate = resolve(selected, executable);
|
|
171
|
+
try {
|
|
172
|
+
await access(candidate, constants.R_OK | constants.X_OK);
|
|
173
|
+
if ((await stat(candidate)).isFile())
|
|
174
|
+
return await realpath(candidate);
|
|
175
|
+
}
|
|
176
|
+
catch (cause) {
|
|
177
|
+
if (typeof cause === "object" &&
|
|
178
|
+
cause !== null &&
|
|
179
|
+
"code" in cause &&
|
|
180
|
+
(cause.code === "ENOENT" || cause.code === "ENOTDIR"))
|
|
181
|
+
continue;
|
|
182
|
+
throw configurationFailure("runtime_missing", `Cannot inspect selected Java executable ${candidate}: ${errorText(cause)}`, { java_executable: candidate }, cause);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
throw configurationFailure("runtime_missing", "Cannot find java.exe on the selected Windows PATH. Select a full JDK with JAVA_HOME or PATH, then verify it with java --list-modules. REA does not install Java.", { java_executable: executable });
|
|
186
|
+
}
|
|
107
187
|
if (isAbsolute(environment.JAVA_HOME))
|
|
108
|
-
return join(environment.JAVA_HOME, "bin",
|
|
188
|
+
return join(environment.JAVA_HOME, "bin", executable);
|
|
109
189
|
throw configurationFailure("open_options_invalid", "JAVA_HOME must select an existing JDK by absolute path; omit it to use java on PATH.", { java_home: environment.JAVA_HOME });
|
|
110
190
|
};
|
|
111
191
|
const requireJavaHomeExecutable = async (javaHome, java) => {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { deserializeMessage, serializeMessage, } from "@modelcontextprotocol/client";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { finished } from "node:stream/promises";
|
|
3
4
|
import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
|
|
4
5
|
import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
|
|
5
6
|
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
@@ -71,7 +72,10 @@ export class JadxMcpTransport {
|
|
|
71
72
|
}
|
|
72
73
|
/** Verifies owned process exit before declaring the transport closed. */
|
|
73
74
|
close() {
|
|
74
|
-
this.#closePromise ??= this.#stop()
|
|
75
|
+
this.#closePromise ??= this.#stop().catch((cause) => {
|
|
76
|
+
this.#closePromise = undefined;
|
|
77
|
+
throw cause;
|
|
78
|
+
});
|
|
75
79
|
return this.#closePromise;
|
|
76
80
|
}
|
|
77
81
|
/** Captured provider stderr without persisting inherited environment values. */
|
|
@@ -102,8 +106,16 @@ export class JadxMcpTransport {
|
|
|
102
106
|
process?.stderr?.off("data", this.#countStderr);
|
|
103
107
|
process?.off("error", this.#error);
|
|
104
108
|
process?.off("exit", this.#exit);
|
|
105
|
-
process?.stdin
|
|
109
|
+
const input = process?.stdin;
|
|
110
|
+
// A job termination can complete an in-flight pipe write asynchronously.
|
|
111
|
+
// Observe its errors until the owned Writable has finished closing.
|
|
112
|
+
const inputClosed = input === undefined || input === null
|
|
113
|
+
? undefined
|
|
114
|
+
: finished(input, { readable: false, cleanup: true }).catch(() => undefined);
|
|
106
115
|
const stopped = await this.#supervisor?.stop();
|
|
116
|
+
input?.destroy();
|
|
117
|
+
await inputClosed;
|
|
118
|
+
input?.off("error", this.#error);
|
|
107
119
|
this.onclose?.();
|
|
108
120
|
if (stopped?.status === "incomplete")
|
|
109
121
|
throw new ProviderCleanupError("jadx", [this.runId], {
|
|
@@ -6,6 +6,7 @@ import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
|
6
6
|
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisInputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
7
7
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
8
8
|
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
9
|
+
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
9
10
|
import { err, ok } from "../domain/result.js";
|
|
10
11
|
import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
|
|
11
12
|
import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
|
|
@@ -59,18 +60,18 @@ const executionError = (context) => {
|
|
|
59
60
|
},
|
|
60
61
|
});
|
|
61
62
|
};
|
|
62
|
-
const cleanup = async (
|
|
63
|
+
const cleanup = async (resources) => {
|
|
64
|
+
const { session, root, previousError } = resources;
|
|
63
65
|
const diagnostics = {
|
|
64
|
-
previous_error:
|
|
65
|
-
? null
|
|
66
|
-
: { tag: previous.error._tag, message: previous.error.message },
|
|
66
|
+
previous_error: previousError === undefined ? null : projectAnalysisError(previousError),
|
|
67
67
|
};
|
|
68
68
|
try {
|
|
69
69
|
await session?.close();
|
|
70
|
+
resources.session = undefined;
|
|
70
71
|
}
|
|
71
72
|
catch (cause) {
|
|
72
73
|
// Retain an uncertain workspace until the caller can resolve process ownership.
|
|
73
|
-
|
|
74
|
+
const error = new ProviderCleanupError("jadx", [
|
|
74
75
|
session?.transport.runId ?? "unknown",
|
|
75
76
|
...(root === undefined ? [] : [root.path]),
|
|
76
77
|
], {
|
|
@@ -79,30 +80,34 @@ const cleanup = async (session, root, previous) => {
|
|
|
79
80
|
provider_cleanup: cause instanceof ProviderCleanupError
|
|
80
81
|
? (cause.diagnostics ?? null)
|
|
81
82
|
: null,
|
|
82
|
-
}, { cause })
|
|
83
|
+
}, { cause: previousError ?? cause });
|
|
84
|
+
if (previousError?.partialObservation !== undefined)
|
|
85
|
+
error.retainPartialObservation(previousError.partialObservation);
|
|
86
|
+
return err(error);
|
|
83
87
|
}
|
|
84
88
|
try {
|
|
85
89
|
await root?.close();
|
|
90
|
+
resources.root = undefined;
|
|
86
91
|
}
|
|
87
92
|
catch (cause) {
|
|
88
93
|
return err(new ProviderCleanupError("jadx", [root?.path ?? "unknown"], {
|
|
89
94
|
...diagnostics,
|
|
90
95
|
reason: cause instanceof Error ? cause.message : String(cause),
|
|
91
|
-
}, { cause }));
|
|
96
|
+
}, { cause: previousError ?? cause }));
|
|
92
97
|
}
|
|
93
|
-
return
|
|
98
|
+
return ok(undefined);
|
|
94
99
|
};
|
|
95
100
|
/** One serialized, immutable APK session per REA instance, retired on idle or shutdown. */
|
|
96
101
|
export class JadxProvider {
|
|
97
102
|
environment;
|
|
98
103
|
launcher;
|
|
99
104
|
#tail = Promise.resolve();
|
|
100
|
-
#
|
|
105
|
+
#pendingCleanup;
|
|
101
106
|
#retained;
|
|
102
107
|
#idle;
|
|
103
108
|
#shutdown = new AbortController();
|
|
104
109
|
#closePromise;
|
|
105
|
-
constructor(environment
|
|
110
|
+
constructor(environment, launcher) {
|
|
106
111
|
this.environment = environment;
|
|
107
112
|
this.launcher = launcher;
|
|
108
113
|
}
|
|
@@ -132,12 +137,13 @@ export class JadxProvider {
|
|
|
132
137
|
try {
|
|
133
138
|
if (signal.aborted)
|
|
134
139
|
return err(new AnalysisCancelledError(request.operation));
|
|
135
|
-
if (this.#cleanupFailure !== undefined)
|
|
136
|
-
return err(this.#cleanupFailure);
|
|
137
140
|
clearTimeout(this.#idle);
|
|
141
|
+
if (this.#pendingCleanup !== undefined) {
|
|
142
|
+
const retired = await this.#retire();
|
|
143
|
+
if (!retired.ok)
|
|
144
|
+
return retired;
|
|
145
|
+
}
|
|
138
146
|
const outcome = await this.#execute(target, request, { signal });
|
|
139
|
-
if (!outcome.ok && outcome.error.cleanupIncomplete)
|
|
140
|
-
this.#cleanupFailure = outcome.error;
|
|
141
147
|
if (outcome.ok)
|
|
142
148
|
this.#scheduleIdle();
|
|
143
149
|
return outcome;
|
|
@@ -150,24 +156,39 @@ export class JadxProvider {
|
|
|
150
156
|
close() {
|
|
151
157
|
this.#shutdown.abort();
|
|
152
158
|
clearTimeout(this.#idle);
|
|
153
|
-
this.#closePromise ??= this.#tail
|
|
159
|
+
this.#closePromise ??= this.#tail
|
|
160
|
+
.then(async () => {
|
|
161
|
+
const retired = await this.#retire();
|
|
162
|
+
if (!retired.ok)
|
|
163
|
+
throw retired.error;
|
|
164
|
+
})
|
|
165
|
+
.catch((cause) => {
|
|
166
|
+
this.#closePromise = undefined;
|
|
167
|
+
throw cause;
|
|
168
|
+
});
|
|
154
169
|
return this.#closePromise;
|
|
155
170
|
}
|
|
156
171
|
async #retire() {
|
|
157
|
-
if (this.#
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
this.#
|
|
164
|
-
throw result.error;
|
|
172
|
+
if (this.#pendingCleanup === undefined && this.#retained !== undefined) {
|
|
173
|
+
this.#pendingCleanup = {
|
|
174
|
+
session: this.#retained.session,
|
|
175
|
+
root: this.#retained.root,
|
|
176
|
+
previousError: undefined,
|
|
177
|
+
};
|
|
178
|
+
this.#retained = undefined;
|
|
165
179
|
}
|
|
180
|
+
if (this.#pendingCleanup === undefined)
|
|
181
|
+
return ok(undefined);
|
|
182
|
+
const result = await cleanup(this.#pendingCleanup);
|
|
183
|
+
if (result.ok)
|
|
184
|
+
this.#pendingCleanup = undefined;
|
|
185
|
+
return result;
|
|
166
186
|
}
|
|
167
187
|
#scheduleIdle() {
|
|
168
188
|
this.#idle = setTimeout(() => {
|
|
169
|
-
|
|
170
|
-
|
|
189
|
+
this.#tail = this.#tail.then(async () => {
|
|
190
|
+
await this.#retire();
|
|
191
|
+
});
|
|
171
192
|
}, 60_000);
|
|
172
193
|
this.#idle.unref();
|
|
173
194
|
}
|
|
@@ -178,7 +199,6 @@ export class JadxProvider {
|
|
|
178
199
|
: AbortSignal.any([options.signal, timeout]);
|
|
179
200
|
let root;
|
|
180
201
|
let session;
|
|
181
|
-
let outcome;
|
|
182
202
|
try {
|
|
183
203
|
if (target.format !== "apk")
|
|
184
204
|
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
|
|
@@ -210,8 +230,11 @@ export class JadxProvider {
|
|
|
210
230
|
this.environment.JAVA_HOME,
|
|
211
231
|
],
|
|
212
232
|
});
|
|
213
|
-
if (this.#retained !== undefined && this.#retained.key !== key)
|
|
214
|
-
await this.#retire();
|
|
233
|
+
if (this.#retained !== undefined && this.#retained.key !== key) {
|
|
234
|
+
const retired = await this.#retire();
|
|
235
|
+
if (!retired.ok)
|
|
236
|
+
return retired;
|
|
237
|
+
}
|
|
215
238
|
let retained = this.#retained;
|
|
216
239
|
if (retained === undefined) {
|
|
217
240
|
root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
|
|
@@ -247,7 +270,7 @@ export class JadxProvider {
|
|
|
247
270
|
root = retained.root;
|
|
248
271
|
session = retained.session;
|
|
249
272
|
const { snapshot } = retained;
|
|
250
|
-
outcome = ok(await session.execute({
|
|
273
|
+
const outcome = ok(await session.execute({
|
|
251
274
|
request,
|
|
252
275
|
target,
|
|
253
276
|
snapshot,
|
|
@@ -260,18 +283,23 @@ export class JadxProvider {
|
|
|
260
283
|
return outcome;
|
|
261
284
|
}
|
|
262
285
|
catch (cause) {
|
|
263
|
-
|
|
286
|
+
const previousError = executionError({
|
|
264
287
|
cause,
|
|
265
288
|
request,
|
|
266
289
|
timeout,
|
|
267
290
|
signal: options?.signal,
|
|
268
291
|
session,
|
|
269
|
-
})
|
|
292
|
+
});
|
|
293
|
+
const partialObservation = session?.partialObservation();
|
|
294
|
+
if (partialObservation !== undefined)
|
|
295
|
+
previousError.retainPartialObservation(partialObservation);
|
|
296
|
+
// Admission can fail before selecting an existing session for execution.
|
|
297
|
+
root ??= this.#retained?.root;
|
|
298
|
+
session ??= this.#retained?.session;
|
|
299
|
+
this.#retained = undefined;
|
|
300
|
+
this.#pendingCleanup = { session, root, previousError };
|
|
301
|
+
const retired = await this.#retire();
|
|
302
|
+
return retired.ok ? err(previousError) : retired;
|
|
270
303
|
}
|
|
271
|
-
// An existing session also needs retirement when admission fails before selection.
|
|
272
|
-
root ??= this.#retained?.root;
|
|
273
|
-
session ??= this.#retained?.session;
|
|
274
|
-
this.#retained = undefined;
|
|
275
|
-
return cleanup(session, root, outcome);
|
|
276
304
|
}
|
|
277
305
|
}
|