rea-agents 4.1.0 → 6.0.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 +173 -568
- package/bridge/android/ReaJadxBridge.java +247 -0
- package/bridge/mitmproxy/capture.py +210 -0
- package/bridge/native/NativeUIChildren.swift +27 -0
- package/bridge/native/ReaNativeUI.swift +30 -16
- package/bridge/native/rea_lldb_tracer.py +303 -0
- package/bridge/process/ProcessRunTokenReader.swift +263 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +143 -0
- package/dist/android/AndroidTargetSnapshot.js +5 -3
- package/dist/android/JadxAnalysis.js +8 -6
- package/dist/android/JadxConfiguration.js +19 -3
- package/dist/android/JadxMcpTransport.js +43 -16
- package/dist/android/JadxProtocol.js +8 -0
- package/dist/android/JadxProvider.js +118 -28
- package/dist/android/JadxRelease.js +8 -0
- package/dist/android/JadxSession.js +32 -18
- package/dist/application/AppBundleExecutable.js +141 -0
- package/dist/application/BinaryTargetResolver.js +9 -64
- package/dist/application/CapabilityInventory.js +82 -3
- package/dist/application/ClientConfigurationDocument.js +72 -12
- package/dist/application/ClientRegistrationStatus.js +7 -8
- package/dist/application/DirectAnalysis.js +109 -37
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/DoctorDiagnostics.js +3 -3
- package/dist/application/EnhancedTools.js +4 -4
- package/dist/application/EvidenceBundleCommands.js +1 -1
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/InvestigationProviders.js +6 -0
- package/dist/application/LinuxHopper.js +8 -2
- package/dist/application/OptionalObservationProviders.js +3 -0
- package/dist/application/ReconstructionCoverageService.js +2 -6
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReferenceSourceImport.js +2 -0
- package/dist/application/ReferenceSourceImportEntries.js +20 -3
- package/dist/application/ReferenceSourceImportTypes.js +5 -0
- package/dist/application/Setup.js +10 -2
- package/dist/application/SetupClientConfiguration.js +19 -16
- package/dist/application/SetupHost.js +18 -3
- package/dist/application/SetupPlan.js +1 -1
- package/dist/application/Uninstall.js +23 -17
- package/dist/application/UpdateMaintenance.js +3 -3
- package/dist/application/ValidateSelectedWebScript.js +27 -0
- package/dist/application/WebModuleTraceService.js +209 -0
- package/dist/application/WebNetworkCaptureService.js +132 -0
- package/dist/application/WebRuntimeService.js +73 -0
- package/dist/application/WebScriptExportService.js +115 -0
- package/dist/application/WebSourceLocationService.js +160 -0
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/{AndroidAnalysisService.js → android/AndroidAnalysisService.js} +6 -6
- package/dist/application/{AndroidApplicationService.js → android/AndroidApplicationService.js} +3 -3
- package/dist/application/{AppleApplicationService.js → apple/AppleApplicationService.js} +5 -5
- package/dist/application/{AnalysisClientCleanup.js → binary/AnalysisClientCleanup.js} +2 -2
- package/dist/application/{AnalysisProviderEvaluation.js → binary/AnalysisProviderEvaluation.js} +4 -4
- package/dist/application/{AnalysisProviderRegistry.js → binary/AnalysisProviderRegistry.js} +5 -5
- package/dist/application/{AnalysisSnapshotCache.js → binary/AnalysisSnapshotCache.js} +55 -14
- package/dist/application/{AnalysisSnapshotFiles.js → binary/AnalysisSnapshotFiles.js} +4 -4
- package/dist/application/{BinarySession.js → binary/BinarySession.js} +50 -20
- package/dist/application/{BinarySessionComposition.js → binary/BinarySessionComposition.js} +2 -1
- package/dist/application/{BinarySessionExecution.js → binary/BinarySessionExecution.js} +9 -7
- package/dist/application/{BinarySessionOpen.js → binary/BinarySessionOpen.js} +22 -9
- package/dist/application/{BinarySessionRecords.js → binary/BinarySessionRecords.js} +48 -40
- package/dist/application/{CompositeProvider.js → binary/CompositeProvider.js} +2 -2
- package/dist/application/{LazyAnalysisProvider.js → binary/LazyAnalysisProvider.js} +6 -6
- package/dist/application/{SessionProviderRouter.js → binary/SessionProviderRouter.js} +7 -7
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +57 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +60 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +62 -0
- package/dist/application/firmware/FirmwareAnalysisPort.js +1 -0
- package/dist/application/{FirmwareAnalysisService.js → firmware/FirmwareAnalysisService.js} +5 -5
- package/dist/application/{EvidenceLedger.js → investigation/EvidenceLedger.js} +44 -7
- package/dist/application/investigation/InvestigationRecordPort.js +1 -0
- package/dist/application/investigation/InvestigationRecords.js +69 -0
- package/dist/application/{UnknownEvidence.js → investigation/UnknownEvidence.js} +1 -1
- package/dist/application/{ElectronActiveEvidence.js → javascript/ElectronActiveEvidence.js} +3 -3
- package/dist/application/javascript/ElectronActiveObservationPort.js +1 -0
- package/dist/application/{ElectronActiveObservationService.js → javascript/ElectronActiveObservationService.js} +3 -3
- package/dist/application/{ElectronBoundaryAnalysis.js → javascript/ElectronBoundaryAnalysis.js} +1 -1
- package/dist/application/{ElectronBoundaryGraphContext.js → javascript/ElectronBoundaryGraphContext.js} +1 -1
- package/dist/application/{ElectronEvidence.js → javascript/ElectronEvidence.js} +2 -2
- package/dist/application/javascript/ElectronObservationPort.js +1 -0
- package/dist/application/{ElectronObservationService.js → javascript/ElectronObservationService.js} +3 -3
- package/dist/application/{JavaScriptApplicationEvidence.js → javascript/JavaScriptApplicationEvidence.js} +3 -4
- package/dist/application/{JavaScriptApplicationEvidenceGraph.js → javascript/JavaScriptApplicationEvidenceGraph.js} +5 -5
- package/dist/application/{JavaScriptApplicationService.js → javascript/JavaScriptApplicationService.js} +25 -12
- package/dist/application/{JavaScriptApplicationWorkflowEvidence.js → javascript/JavaScriptApplicationWorkflowEvidence.js} +3 -3
- package/dist/application/{JavaScriptApplicationWorkflowService.js → javascript/JavaScriptApplicationWorkflowService.js} +12 -12
- package/dist/application/{JavaScriptArtifactAnalysis.js → javascript/JavaScriptArtifactAnalysis.js} +50 -47
- package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +1 -0
- package/dist/application/{JavaScriptArtifactGraphAccumulator.js → javascript/JavaScriptArtifactGraphAccumulator.js} +16 -2
- package/dist/application/{JavaScriptArtifactGraphBuilder.js → javascript/JavaScriptArtifactGraphBuilder.js} +2 -2
- package/dist/application/{JavaScriptArtifactGraphContext.js → javascript/JavaScriptArtifactGraphContext.js} +1 -1
- package/dist/application/{JavaScriptArtifactGraphDocuments.js → javascript/JavaScriptArtifactGraphDocuments.js} +27 -3
- package/dist/application/{JavaScriptArtifactGraphFindings.js → javascript/JavaScriptArtifactGraphFindings.js} +20 -7
- package/dist/application/{JavaScriptArtifactGraphStructure.js → javascript/JavaScriptArtifactGraphStructure.js} +1 -1
- package/dist/application/{JavaScriptArtifactPathResolution.js → javascript/JavaScriptArtifactPathResolution.js} +80 -36
- package/dist/application/{JavaScriptArtifactReconstruction.js → javascript/JavaScriptArtifactReconstruction.js} +26 -17
- package/dist/application/{JavaScriptJsonModules.js → javascript/JavaScriptJsonModules.js} +1 -1
- package/dist/application/{JavaScriptModuleRelationships.js → javascript/JavaScriptModuleRelationships.js} +2 -2
- package/dist/application/javascript/JavaScriptRecoveryPort.js +1 -0
- package/dist/application/javascript/JavaScriptRecoveryService.js +52 -0
- package/dist/application/{JavaScriptReturnShapeProjection.js → javascript/JavaScriptReturnShapeProjection.js} +3 -3
- package/dist/application/{JavaScriptRuntimeObservationEvidence.js → javascript/JavaScriptRuntimeObservationEvidence.js} +2 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationPort.js +1 -0
- package/dist/application/{JavaScriptRuntimeObservationService.js → javascript/JavaScriptRuntimeObservationService.js} +3 -3
- package/dist/application/{JavaScriptRuntimeReconciliationEvidence.js → javascript/JavaScriptRuntimeReconciliationEvidence.js} +3 -3
- package/dist/application/{JavaScriptRuntimeReconciliationService.js → javascript/JavaScriptRuntimeReconciliationService.js} +6 -6
- package/dist/application/{JavaScriptSemanticGraphAsyncProjection.js → javascript/JavaScriptSemanticGraphAsyncProjection.js} +8 -8
- package/dist/application/{JavaScriptSemanticGraphBuilder.js → javascript/JavaScriptSemanticGraphBuilder.js} +150 -73
- package/dist/application/{JavaScriptSemanticGraphChildProcessProjection.js → javascript/JavaScriptSemanticGraphChildProcessProjection.js} +15 -16
- package/dist/application/{JavaScriptSemanticGraphConstruction.js → javascript/JavaScriptSemanticGraphConstruction.js} +43 -2
- package/dist/application/{JavaScriptSemanticGraphDataProjection.js → javascript/JavaScriptSemanticGraphDataProjection.js} +8 -8
- package/dist/application/{JavaScriptSemanticGraphFingerprintProjection.js → javascript/JavaScriptSemanticGraphFingerprintProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticGraphFlowProjection.js → javascript/JavaScriptSemanticGraphFlowProjection.js} +7 -11
- package/dist/application/{JavaScriptSemanticGraphObjectProjection.js → javascript/JavaScriptSemanticGraphObjectProjection.js} +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +144 -0
- package/dist/application/{JavaScriptSemanticGraphResourceProjection.js → javascript/JavaScriptSemanticGraphResourceProjection.js} +4 -4
- package/dist/application/{JavaScriptSemanticGraphValueProjection.js → javascript/JavaScriptSemanticGraphValueProjection.js} +5 -5
- package/dist/application/{JavaScriptSemanticTraceService.js → javascript/JavaScriptSemanticTraceService.js} +6 -6
- package/dist/application/{ManagedApplicationGraphService.js → managed/ManagedApplicationGraphService.js} +7 -7
- package/dist/application/{ManagedMemberComparisonService.js → managed/ManagedMemberComparisonService.js} +10 -10
- package/dist/application/{ManagedNativeVerificationService.js → managed/ManagedNativeVerificationService.js} +7 -7
- package/dist/application/{ManagedReconstructionService.js → managed/ManagedReconstructionService.js} +7 -7
- package/dist/application/{NativeApiInspection.js → native/NativeApiInspection.js} +1 -1
- package/dist/application/{NativeCallRoutes.js → native/NativeCallRoutes.js} +3 -3
- package/dist/application/{NativeDispatchMetadataInspection.js → native/NativeDispatchMetadataInspection.js} +4 -4
- package/dist/application/{NativeUiActionTrace.js → native/NativeUiActionTrace.js} +7 -7
- package/dist/application/{NativeValueTrace.js → native/NativeValueTrace.js} +6 -6
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +15 -11
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +4 -4
- package/dist/{application/ArtifactInventory/hash.js → artifacts/ArtifactHash.js} +4 -2
- package/dist/artifacts/ArtifactPaths.js +3 -3
- package/dist/artifacts/ArtifactProvider.js +37 -40
- package/dist/artifacts/ArtifactProviderMetadata.js +37 -0
- package/dist/artifacts/AsarArtifactReader.js +195 -23
- package/dist/artifacts/AsarEntryStream.js +76 -0
- package/dist/artifacts/DirectoryArtifactReader.js +41 -7
- package/dist/artifacts/NativeDmgArtifactReader.js +161 -9
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/{application → artifacts/apple}/AppleAssetCatalogAnalysis.js +4 -4
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/{application → artifacts/apple}/InterfaceBuilderAnalysis.js +125 -51
- package/dist/artifacts/{KeyedArchiveReader.js → apple/KeyedArchiveReader.js} +21 -27
- package/dist/artifacts/apple/MachoLoadCommandReader.js +294 -0
- package/dist/artifacts/apple/NibViewHierarchy.js +150 -0
- package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +3 -3
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +3 -3
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/{application → artifacts/javascript}/JavaScriptArtifactFiles.js +27 -6
- package/dist/artifacts/javascript/JavaScriptArtifactReader.js +6 -0
- package/dist/artifacts/readStableArtifact.js +68 -0
- package/dist/browser/BrowserScenarioSecrets.js +50 -8
- package/dist/browser/CdpAuthorizedMainFrame.js +4 -4
- package/dist/browser/CdpAuthorizedTarget.js +22 -0
- package/dist/browser/CdpBrowserProvider.js +4 -15
- package/dist/browser/CdpCaptureDocuments.js +33 -21
- package/dist/browser/CdpCaptureEventBodyShapes.js +3 -3
- package/dist/browser/CdpCaptureEventHandlers.js +116 -28
- package/dist/browser/CdpCaptureEventHelpers.js +6 -6
- package/dist/browser/CdpCaptureEvents.js +9 -0
- package/dist/browser/CdpCaptureStorage.js +10 -8
- package/dist/browser/CdpCaptureStorageFingerprints.js +24 -22
- package/dist/browser/CdpCaptureValues.js +2 -2
- package/dist/browser/CdpCommandRejection.js +17 -0
- package/dist/browser/CdpConnection.js +51 -11
- package/dist/browser/CdpElectronInspection.js +10 -10
- package/dist/browser/CdpElectronProvider.js +3 -6
- package/dist/browser/CdpElectronScriptEvents.js +6 -6
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpElectronWorkers.js +4 -4
- package/dist/browser/CdpObservationSession.js +18 -23
- package/dist/browser/CdpPageCapture.js +4 -4
- package/dist/browser/CdpPageCaptureScripts.js +2 -2
- package/dist/browser/CdpPageCaptureWorkers.js +9 -9
- package/dist/browser/CdpSafeMetadata.js +48 -10
- package/dist/browser/CdpScreenshot.js +5 -5
- package/dist/browser/CdpTargetEvents.js +8 -0
- package/dist/browser/CdpTargetSession.js +2 -2
- package/dist/browser/CdpWebMcpDiscovery.js +22 -16
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +7 -6
- package/dist/browser/PlaywrightElectronActiveProvider.js +15 -9
- package/dist/browser/PlaywrightScenarioEvents.js +59 -51
- package/dist/browser/PlaywrightScenarioSession.js +8 -1
- package/dist/browser/WebSourceMapFetcher.js +37 -53
- package/dist/browser/assets/LocalWebScriptArtifacts.js +87 -0
- package/dist/browser/assets/PageScriptCapture.js +32 -0
- package/dist/browser/assets/PublishWebScripts.js +74 -0
- package/dist/browser/assets/ScenarioScriptCapture.js +76 -0
- package/dist/browser/assets/ScriptCaptureAdapters.js +57 -0
- package/dist/browser/assets/WebArtifactReads.js +56 -0
- package/dist/browser/assets/WebSourceLocationArtifacts.js +40 -0
- package/dist/browser/execution/CdpEventListeners.js +79 -0
- package/dist/browser/execution/CdpExecutionCapture.js +135 -0
- package/dist/browser/execution/CdpExecutionCollection.js +57 -0
- package/dist/browser/execution/CdpExecutionWindow.js +100 -0
- package/dist/browser/execution/CdpListenerSelector.js +22 -0
- package/dist/browser/execution/CdpPreciseCoverage.js +48 -0
- package/dist/browser/execution/CdpRuntimeInitiator.js +18 -0
- package/dist/browser/execution/CdpRuntimeProtocol.js +106 -0
- package/dist/browser/execution/CdpRuntimeRequests.js +81 -0
- package/dist/browser/execution/CdpRuntimeSession.js +163 -0
- package/dist/browser/execution/CdpRuntimeSources.js +223 -0
- package/dist/browser/execution/CdpWebRuntimeProvider.js +51 -0
- package/dist/browser/history/CaptureFailures.js +101 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +12 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +91 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +186 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/browser/modules/NativeModuleResolver.js +210 -0
- package/dist/browser/modules/WebModuleArtifacts.js +40 -0
- package/dist/browser/network/PlaywrightNetworkContent.js +71 -0
- package/dist/browser/network/PlaywrightScenarioNetwork.js +180 -0
- package/dist/browser/providerIdentities.js +24 -0
- package/dist/catalogIdentity.js +23 -15
- package/dist/cli/androidCommands.js +13 -3
- package/dist/cli/applicationCommands.js +39 -8
- package/dist/cli/artifactCommands.js +27 -2
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/browserAdvancedCommands.js +27 -9
- package/dist/cli/coreAnalysisCommands.js +6 -494
- package/dist/cli/coreBinaryCommands.js +211 -0
- package/dist/cli/coreNativeCommands.js +293 -0
- package/dist/cli/electronCommands.js +29 -27
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +9 -6
- package/dist/cli/javascriptApplicationAnalysis.js +17 -4
- package/dist/cli/javascriptRecoveryCommands.js +45 -0
- package/dist/cli/jsonOutput.js +133 -0
- package/dist/cli/managedCommands.js +4 -4
- package/dist/cli/managedProjectGraphCommand.js +1 -1
- package/dist/cli/nativeCallCommands.js +35 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/referenceSourceImportStatus.js +6 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +49 -23
- package/dist/cli/webModuleCommands.js +56 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +60 -0
- package/dist/cli/webScriptCommands.js +31 -0
- package/dist/cli/webSourceLocationCommands.js +42 -0
- package/dist/cli.js +19 -3
- package/dist/cliBrowserContext.js +4 -2
- package/dist/cliBrowserScenarioCommands.js +6 -5
- package/dist/cliCommandNames.js +14 -0
- package/dist/cliJavaScriptRuntimeCommands.js +6 -4
- package/dist/cliJsonInput.js +38 -2
- package/dist/cliOutput.js +52 -11
- package/dist/composition/android.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -0
- package/dist/composition/binary.js +25 -0
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/browserObservation.js +3 -0
- package/dist/composition/browserScenario.js +3 -0
- package/dist/composition/directAnalysis.js +17 -0
- package/dist/composition/electronObservation.js +3 -0
- package/dist/composition/electronScenario.js +3 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/firmware.js +3 -0
- package/dist/composition/javascriptRecovery.js +3 -0
- package/dist/composition/javascriptRuntimeObservation.js +3 -0
- package/dist/composition/optionalObservationProviders.js +49 -0
- package/dist/composition/webModules.js +5 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/composition/webRuntime.js +4 -0
- package/dist/composition/webSourceLocations.js +5 -0
- package/dist/config/parseConfig.js +22 -3
- package/dist/contracts/{androidToolContracts.js → android/androidToolContracts.js} +5 -5
- package/dist/contracts/applicationToolContracts.js +43 -8
- package/dist/contracts/artifactToolContracts.js +8 -2
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +1 -1
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/{firmwareToolContracts.js → firmware/firmwareToolContracts.js} +5 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/{applicationWorkflowInputContracts.js → javascript/applicationWorkflowInputContracts.js} +6 -6
- package/dist/contracts/{electronToolContracts.js → javascript/electronToolContracts.js} +6 -6
- package/dist/contracts/{javascriptApplicationWorkflowExamples.js → javascript/javascriptApplicationWorkflowExamples.js} +3 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +23 -0
- package/dist/contracts/{javascriptRuntimeObservationToolContracts.js → javascript/javascriptRuntimeObservationToolContracts.js} +3 -3
- package/dist/contracts/{javascriptRuntimeReconciliationExample.js → javascript/javascriptRuntimeReconciliationExample.js} +5 -5
- package/dist/contracts/{managedToolContracts.js → managed/managedToolContracts.js} +10 -6
- package/dist/contracts/{managedWorkflowExamples.js → managed/managedWorkflowExamples.js} +1 -1
- package/dist/contracts/{managedWorkflowToolContracts.js → managed/managedWorkflowToolContracts.js} +6 -6
- package/dist/contracts/mobileApplicationGraphExamples.js +105 -0
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/{nativeToolContracts.js → native/nativeToolContracts.js} +31 -8
- package/dist/contracts/officialToolContracts.js +15 -12
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/sessionLifecycleInputs.js +22 -5
- package/dist/contracts/sessionStatusContract.js +10 -2
- package/dist/contracts/sessionToolContracts.js +9 -2
- package/dist/contracts/sessionToolSchemas.js +10 -3
- package/dist/contracts/toolContractExamples.js +1 -1
- package/dist/contracts/toolContracts.js +19 -7
- package/dist/contracts/toolEffects.js +62 -0
- package/dist/contracts/toolOutputSchemaGroups.js +23 -19
- package/dist/contracts/toolOutputSchemaPrimitives.js +1 -1
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/contracts/webRuntimeToolContracts.js +43 -0
- package/dist/contracts/webScriptToolContracts.js +68 -0
- package/dist/domain/analysisErrorBase.js +15 -0
- package/dist/domain/analysisErrorCore.js +63 -7
- package/dist/domain/analysisErrorPresentation.js +29 -1
- package/dist/domain/analysisErrorProjection.js +53 -2
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/{androidApplication.js → android/androidApplication.js} +7 -6
- package/dist/domain/apple/appleApplication.js +277 -0
- package/dist/domain/{appleAssetCatalog.js → apple/appleAssetCatalog.js} +2 -2
- package/dist/domain/apple/appleBundleAnatomy.js +236 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +367 -0
- package/dist/domain/apple/dylibResolutionFindings.js +75 -0
- package/dist/domain/{interfaceBuilderGraph.js → apple/interfaceBuilderGraph.js} +47 -314
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +411 -0
- package/dist/domain/{keyedArchive.js → apple/keyedArchive.js} +10 -9
- package/dist/domain/apple/plistValue.js +35 -0
- package/dist/domain/artifactInventoryEvidence.js +12 -2
- package/dist/domain/artifactInventorySnapshot.js +1 -0
- package/dist/domain/artifactOperationError.js +5 -1
- package/dist/domain/artifactPathSyntax.js +26 -0
- package/dist/domain/browserNetworkEvidence.js +82 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +2 -0
- package/dist/domain/browserObservationSchemas.js +15 -1
- package/dist/domain/browserScenarioCapture.js +22 -0
- package/dist/domain/browserScenarioCaptureValues.js +25 -0
- package/dist/domain/browserScenarioDiff.js +6 -3
- package/dist/domain/browserScenarioDiffEvidence.js +35 -1
- package/dist/domain/browserScenarioValues.js +21 -3
- package/dist/domain/browserSession.js +2 -7
- package/dist/domain/bundleComparison.js +2 -1
- package/dist/domain/callPath.js +52 -44
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/comparisonStatus.js +11 -0
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +17 -5
- package/dist/domain/evidenceBundle.js +98 -35
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +92 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/{firmwareAnalysis.js → firmware/firmwareAnalysis.js} +10 -3
- package/dist/domain/functionComparisonNormalization.js +11 -13
- package/dist/domain/hopperValues.js +2 -2
- package/dist/domain/inputIssueProjection.js +17 -2
- package/dist/domain/{electronActiveObservation.js → javascript/electronActiveObservation.js} +9 -4
- package/dist/domain/{electronObservation.js → javascript/electronObservation.js} +5 -11
- package/dist/domain/{electronStaticAnalysisBrowser.js → javascript/electronStaticAnalysisBrowser.js} +4 -3
- package/dist/domain/{electronStaticAnalysisIpc.js → javascript/electronStaticAnalysisIpc.js} +2 -2
- package/dist/domain/{electronStaticAnalysisNative.js → javascript/electronStaticAnalysisNative.js} +12 -13
- package/dist/domain/javascript/electronStaticAnalysisTypes.js +1 -0
- package/dist/domain/{electronStaticAnalysisValues.js → javascript/electronStaticAnalysisValues.js} +3 -3
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/{javascriptApplicationAnalysis.js → javascript/javascriptApplicationAnalysis.js} +2 -2
- package/dist/domain/{javascriptApplicationChangeGraph.js → javascript/javascriptApplicationChangeGraph.js} +1 -1
- package/dist/domain/{javascriptApplicationEvidenceSchemas.js → javascript/javascriptApplicationEvidenceSchemas.js} +6 -4
- package/dist/domain/{javascriptApplicationGraph.js → javascript/javascriptApplicationGraph.js} +2 -2
- package/dist/domain/{javascriptApplicationGraphSchemas.js → javascript/javascriptApplicationGraphSchemas.js} +2 -2
- package/dist/domain/{javascriptApplicationVersionComparison.js → javascript/javascriptApplicationVersionComparison.js} +2 -2
- package/dist/domain/{javascriptApplicationVersionComparisonSchemas.js → javascript/javascriptApplicationVersionComparisonSchemas.js} +3 -3
- package/dist/domain/{javascriptApplicationVersionItems.js → javascript/javascriptApplicationVersionItems.js} +2 -2
- package/dist/domain/{javascriptApplicationVersionKeys.js → javascript/javascriptApplicationVersionKeys.js} +16 -9
- package/dist/domain/javascript/javascriptArtifactFiles.js +1 -0
- package/dist/domain/{javascriptAstFingerprint.js → javascript/javascriptAstFingerprint.js} +38 -22
- package/dist/domain/javascript/javascriptAstValues.js +23 -0
- package/dist/domain/{javascriptExportShapeComparison.js → javascript/javascriptExportShapeComparison.js} +21 -5
- package/dist/domain/{javascriptExportShapeComparisonSchemas.js → javascript/javascriptExportShapeComparisonSchemas.js} +2 -2
- package/dist/domain/{javascriptExportShapeSelection.js → javascript/javascriptExportShapeSelection.js} +1 -1
- package/dist/domain/{javascriptExportShapeVariants.js → javascript/javascriptExportShapeVariants.js} +1 -11
- package/dist/domain/{javascriptFeatureSeed.js → javascript/javascriptFeatureSeed.js} +4 -3
- package/dist/domain/{javascriptFeatureTrace.js → javascript/javascriptFeatureTrace.js} +2 -2
- package/dist/domain/{javascriptFeatureTraceSchemas.js → javascript/javascriptFeatureTraceSchemas.js} +32 -18
- package/dist/domain/{javascriptFeatureTraversal.js → javascript/javascriptFeatureTraversal.js} +6 -2
- package/dist/domain/{javascriptNativeHandoff.js → javascript/javascriptNativeHandoff.js} +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +88 -0
- package/dist/domain/{javascriptRuntimeLoadState.js → javascript/javascriptRuntimeLoadState.js} +1 -1
- package/dist/domain/{javascriptRuntimeObservation.js → javascript/javascriptRuntimeObservation.js} +2 -2
- package/dist/domain/{javascriptRuntimeReconciliationActive.js → javascript/javascriptRuntimeReconciliationActive.js} +3 -3
- package/dist/domain/{javascriptRuntimeReconciliationGraph.js → javascript/javascriptRuntimeReconciliationGraph.js} +1 -1
- package/dist/domain/{javascriptRuntimeReconciliationMatching.js → javascript/javascriptRuntimeReconciliationMatching.js} +2 -2
- package/dist/domain/{javascriptRuntimeReconciliationParsing.js → javascript/javascriptRuntimeReconciliationParsing.js} +5 -5
- package/dist/domain/{javascriptRuntimeReconciliationResult.js → javascript/javascriptRuntimeReconciliationResult.js} +2 -2
- package/dist/domain/{javascriptRuntimeReconciliationSchemas.js → javascript/javascriptRuntimeReconciliationSchemas.js} +4 -4
- package/dist/domain/{javascriptRuntimeStaticCandidates.js → javascript/javascriptRuntimeStaticCandidates.js} +1 -1
- package/dist/domain/{javascriptSemanticAnalysis.js → javascript/javascriptSemanticAnalysis.js} +40 -14
- package/dist/domain/{javascriptSemanticAsyncEffects.js → javascript/javascriptSemanticAsyncEffects.js} +2 -1
- package/dist/domain/{javascriptSemanticCallResolution.js → javascript/javascriptSemanticCallResolution.js} +10 -5
- package/dist/domain/{javascriptSemanticCalls.js → javascript/javascriptSemanticCalls.js} +7 -4
- package/dist/domain/{javascriptSemanticChildProcesses.js → javascript/javascriptSemanticChildProcesses.js} +4 -2
- package/dist/domain/{javascriptSemanticDataEffectHelpers.js → javascript/javascriptSemanticDataEffectHelpers.js} +7 -6
- package/dist/domain/{javascriptSemanticDataEffects.js → javascript/javascriptSemanticDataEffects.js} +8 -6
- package/dist/domain/{javascriptSemanticFingerprints.js → javascript/javascriptSemanticFingerprints.js} +40 -16
- package/dist/domain/{javascriptSemanticGraph.js → javascript/javascriptSemanticGraph.js} +23 -7
- package/dist/domain/{javascriptSemanticGraphSchemas.js → javascript/javascriptSemanticGraphSchemas.js} +3 -3
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +116 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +53 -0
- package/dist/domain/{javascriptSemanticObjects.js → javascript/javascriptSemanticObjects.js} +5 -5
- package/dist/domain/{javascriptSemanticPrimitives.js → javascript/javascriptSemanticPrimitives.js} +1 -1
- package/dist/domain/{javascriptSemanticProjection.js → javascript/javascriptSemanticProjection.js} +31 -44
- package/dist/domain/{javascriptSemanticPromises.js → javascript/javascriptSemanticPromises.js} +77 -22
- package/dist/domain/{javascriptSemanticProvenance.js → javascript/javascriptSemanticProvenance.js} +4 -1
- package/dist/domain/{javascriptSemanticQuery.js → javascript/javascriptSemanticQuery.js} +1 -1
- package/dist/domain/{javascriptSemanticQueryAssessment.js → javascript/javascriptSemanticQueryAssessment.js} +1 -1
- package/dist/domain/{javascriptSemanticQueryIdentity.js → javascript/javascriptSemanticQueryIdentity.js} +1 -1
- package/dist/domain/{javascriptSemanticQuerySchemas.js → javascript/javascriptSemanticQuerySchemas.js} +3 -3
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +25 -0
- package/dist/domain/{javascriptSemanticResources.js → javascript/javascriptSemanticResources.js} +2 -1
- package/dist/domain/{javascriptSemanticReturns.js → javascript/javascriptSemanticReturns.js} +1 -1
- package/dist/domain/{javascriptSemanticTraceSchemas.js → javascript/javascriptSemanticTraceSchemas.js} +2 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +55 -0
- package/dist/domain/javascript/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/{javascriptSemanticValues.js → javascript/javascriptSemanticValues.js} +72 -48
- package/dist/domain/{javascriptStaticAnalysis.js → javascript/javascriptStaticAnalysis.js} +7 -4
- package/dist/domain/{javascriptStaticAnalysisBundler.js → javascript/javascriptStaticAnalysisBundler.js} +14 -11
- package/dist/domain/{javascriptStaticAnalysisCalls.js → javascript/javascriptStaticAnalysisCalls.js} +2 -2
- package/dist/domain/{javascriptStaticAnalysisHelpers.js → javascript/javascriptStaticAnalysisHelpers.js} +231 -40
- package/dist/domain/{sourceToBundleComparison.js → javascript/sourceToBundleComparison.js} +2 -2
- package/dist/domain/{sourceToBundleComparisonSchemas.js → javascript/sourceToBundleComparisonSchemas.js} +4 -4
- package/dist/domain/{sourceToBundleSignals.js → javascript/sourceToBundleSignals.js} +2 -2
- package/dist/domain/jsonValue.js +4 -0
- package/dist/domain/localPath.js +2 -0
- package/dist/domain/{managedApplicationGraph.js → managed/managedApplicationGraph.js} +4 -4
- package/dist/domain/{managedApplicationGraphNodes.js → managed/managedApplicationGraphNodes.js} +1 -1
- package/dist/domain/{managedArtifact.js → managed/managedArtifact.js} +1 -1
- package/dist/domain/{managedMemberComparison.js → managed/managedMemberComparison.js} +4 -4
- package/dist/domain/{managedMemberComparisonCoverage.js → managed/managedMemberComparisonCoverage.js} +2 -1
- package/dist/domain/{managedMemberComparisonItems.js → managed/managedMemberComparisonItems.js} +97 -40
- package/dist/domain/{managedMemberComparisonMatch.js → managed/managedMemberComparisonMatch.js} +22 -11
- package/dist/domain/{managedNativeVerification.js → managed/managedNativeVerification.js} +1 -1
- package/dist/domain/{managedNativeVerificationMatch.js → managed/managedNativeVerificationMatch.js} +3 -3
- package/dist/domain/{managedNativeVerificationSchemas.js → managed/managedNativeVerificationSchemas.js} +6 -5
- package/dist/domain/{managedReconstruction.js → managed/managedReconstruction.js} +3 -3
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/nativeCallObservation.js +164 -0
- package/dist/domain/{nativeFunctionAnnotations.js → native/nativeFunctionAnnotations.js} +1 -1
- package/dist/domain/{nativeInspection.js → native/nativeInspection.js} +1 -1
- package/dist/domain/{nativeInvestigationGraph.js → native/nativeInvestigationGraph.js} +13 -4
- package/dist/domain/{nativeLoadImage.js → native/nativeLoadImage.js} +1 -1
- package/dist/domain/{nativeUiObservation.js → native/nativeUiObservation.js} +20 -6
- package/dist/domain/{objcSwiftMetadata.js → native/objcSwiftMetadata.js} +17 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/process/processCapture.js +316 -0
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +1 -1
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +17 -17
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +69 -0
- package/dist/domain/providerCleanupError.js +5 -2
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionCoverageEvaluation.js +46 -24
- package/dist/domain/reconstructionCoverageInput.js +7 -0
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +1 -1
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/runtimeVersion.js +2 -0
- package/dist/domain/sourceMapEnvelope.js +38 -0
- package/dist/domain/staticRuntimeCorrelation.js +3 -3
- package/dist/domain/unicodeCodePointOrder.js +11 -6
- package/dist/domain/webBundleAnalyzerAst.js +2 -34
- package/dist/domain/webBundleAnalyzerInspection.js +12 -9
- package/dist/domain/webCaptureDiff.js +1 -0
- package/dist/domain/webEventListeners.js +28 -0
- package/dist/domain/webExecution.js +74 -0
- package/dist/domain/webMcpDiscovery.js +1 -7
- package/dist/domain/webModuleImports.js +104 -0
- package/dist/domain/webModuleTrace.js +106 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +69 -0
- package/dist/domain/webScreenshot.js +1 -7
- package/dist/domain/webScriptArtifacts.js +39 -0
- package/dist/domain/webScriptExport.js +86 -0
- package/dist/domain/webScriptExportError.js +13 -0
- package/dist/domain/webScriptExportPlan.js +108 -0
- package/dist/domain/webSourceLocation.js +106 -0
- package/dist/domain/webSourcePosition.js +21 -0
- package/dist/dotnet/ManagedArtifactInspector.js +1 -1
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +5 -3
- package/dist/dotnet/ManagedMemberInspectorCore.js +72 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +19 -6
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +37 -19
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +59 -51
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -33
- package/dist/dotnet/ManagedStaticProviderMetadata.js +36 -0
- package/dist/evaluation/CodexAgentEval.js +2 -1
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareProvider.js +18 -12
- package/dist/firmware/FirmwarePublication.js +1 -1
- package/dist/firmware/FirmwareRelease.js +1 -1
- package/dist/firmware/FirmwareReports.js +12 -0
- package/dist/firmware/FirmwareVersion.js +80 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraFunctionValues.js +5 -5
- package/dist/ghidra/GhidraInstallation.js +38 -34
- package/dist/ghidra/GhidraInstallationPolicy.js +140 -0
- package/dist/ghidra/GhidraInventoryValues.js +1 -1
- package/dist/ghidra/GhidraLauncher.js +13 -4
- package/dist/ghidra/GhidraLoadImageAttest.js +36 -0
- package/dist/ghidra/GhidraLoadImageValues.js +1 -1
- package/dist/ghidra/GhidraProvider.js +17 -235
- package/dist/ghidra/GhidraProviderCapabilities.js +8 -15
- package/dist/ghidra/GhidraProviderClient.js +209 -0
- package/dist/ghidra/GhidraResponseBuffer.js +7 -1
- package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +17 -1
- package/dist/hopper/BridgeLauncher.js +2 -0
- package/dist/hopper/HopperProvider.js +2 -48
- package/dist/hopper/HopperProviderCapabilities.js +73 -0
- package/dist/hopper/HopperResponseStream.js +7 -1
- package/dist/hopper/LinuxPrivateDisplayProbe.js +8 -6
- package/dist/ida/IdaProviderCapabilities.js +3 -11
- package/dist/ida/IdaSessionClient.js +12 -0
- package/dist/{browser → inspector}/JavaScriptRuntimeScope.js +16 -5
- package/dist/{browser → inspector}/V8InspectorCaptureProjection.js +46 -8
- package/dist/{browser → inspector}/V8InspectorEndpoint.js +1 -1
- package/dist/{browser → inspector}/V8InspectorProvider.js +10 -13
- package/dist/inspector/providerIdentity.js +6 -0
- package/dist/javascript/recovery/RecoveryFiles.js +122 -0
- package/dist/javascript/recovery/WakaruCommand.js +119 -0
- package/dist/javascript/recovery/WakaruExecution.js +100 -0
- package/dist/javascript/recovery/WakaruProvider.js +96 -0
- package/dist/javascript/recovery/WakaruPublication.js +102 -0
- package/dist/javascript/recovery/WakaruRelease.js +29 -0
- package/dist/javascript/recovery/WakaruReport.js +134 -0
- package/dist/javascript/sourceMaps/SourceMapCodecProcess.js +37 -0
- package/dist/javascript/sourceMaps/SourceMapCodecProtocol.js +20 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +177 -0
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +61 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +185 -0
- package/dist/javascript/sourceMaps/TraceSourceMap.js +138 -0
- package/dist/main/shutdown.js +8 -2
- package/dist/main/transport.js +24 -7
- package/dist/main.js +4 -18
- package/dist/native/AppleDispatchCoverage.js +58 -0
- package/dist/native/AppleDispatchMetadata.js +71 -509
- package/dist/native/AppleMachoFixups.js +292 -0
- package/dist/native/AppleMachoSelection.js +188 -0
- package/dist/native/AppleObjcCategories.js +59 -0
- package/dist/native/AppleObjcDispatchFacets.js +257 -0
- package/dist/native/AppleObjcProperties.js +68 -0
- package/dist/native/AppleObjcProtocols.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +150 -0
- package/dist/native/CommandRunner.js +2 -1
- package/dist/native/LldbCallTracer.js +278 -0
- package/dist/native/NativeCallObservation.js +135 -0
- package/dist/native/NativeMacOSProvider.js +151 -75
- package/dist/native/NativeMacOSProviderMetadata.js +47 -0
- package/dist/native/NativeMachoInspection.js +45 -14
- package/dist/native/NativeUiHelperRuntime.js +7 -3
- package/dist/native/NativeUiObservation.js +8 -4
- package/dist/native/NativeUiOutputBudget.js +8 -0
- package/dist/native/parsers/codesign.js +40 -5
- package/dist/native/parsers/demangle.js +6 -2
- package/dist/native/parsers/dyldInfo.js +13 -4
- package/dist/native/parsers/echoedPath.js +14 -0
- package/dist/native/parsers/lipo.js +14 -0
- package/dist/native/parsers/otool.js +1 -1
- package/dist/native/parsers/plist.js +174 -19
- package/dist/native/pwndbg/PwndbgCoreContext.js +160 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +101 -0
- package/dist/process/DarwinProcessRunTokenReader.js +294 -0
- package/dist/process/ExecFileOutput.js +2 -0
- package/dist/process/OwnedCommand.js +113 -0
- package/dist/process/ProcessOwnership.js +263 -33
- package/dist/process/ProcessOwnershipObservation.js +161 -24
- package/dist/process/ProviderProcess.js +68 -20
- package/dist/{application → process/capture}/FilesystemSnapshot.js +20 -5
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +16 -1
- package/dist/{application → process/capture}/ProcessCaptureError.js +17 -1
- package/dist/process/capture/ProcessCaptureLifecycle.js +615 -0
- package/dist/process/capture/ProcessHarness.js +452 -0
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/reference/ReferenceSourceReaderEntries.js +6 -1
- package/dist/server/createServer.js +70 -6
- package/dist/server/mcpClientMetadata.js +6 -3
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +1 -1
- package/dist/server/registerApplicationTools/compareExportShapes.js +2 -2
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -2
- package/dist/server/registerApplicationTools/compareVersions.js +2 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +43 -0
- package/dist/server/registerApplicationTools/traceFeature.js +1 -1
- package/dist/server/registerApplicationTools/traceSemantics.js +1 -1
- package/dist/server/registerApplicationTools.js +2 -0
- package/dist/server/registerBinaryDiagnosticsTools.js +17 -0
- package/dist/server/registerBrowserScenarioTool.js +6 -2
- package/dist/server/registerBrowserTools.js +13 -2
- package/dist/server/registerCloseLifecycleTool.js +1 -1
- package/dist/server/registerElectronTools.js +21 -7
- package/dist/server/registerEvidenceTools.js +1 -1
- package/dist/server/registerEvmTools.js +17 -0
- package/dist/server/registerJavaScriptRecoveryTool.js +17 -0
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -4
- package/dist/server/registerManagedTools.js +3 -3
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -2
- package/dist/server/registerManagedWorkflowTools/contract.js +1 -1
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +1 -1
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +1 -1
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -2
- package/dist/server/registerNativeTools.js +1 -1
- package/dist/server/registerProcessComparisonTool.js +1 -1
- package/dist/server/registerPrompts.js +5 -1
- package/dist/server/registerRecordedCrashTools.js +17 -0
- package/dist/server/registerSessionTools.js +3 -3
- package/dist/server/registerWebModuleTool.js +17 -0
- package/dist/server/registerWebNetworkCaptureTool.js +28 -0
- package/dist/server/registerWebRuntimeTools.js +31 -0
- package/dist/server/registerWebScriptTool.js +18 -0
- package/dist/server/registerWebSourceLocationTool.js +17 -0
- package/dist/server/sessionAvailabilityPolicy.js +27 -12
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolResult.js +1 -1
- package/dist/windows/WindowsOwnedProcess.js +3 -1
- package/install.sh +12 -2
- package/native/windows/README.md +5 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +75 -26
- package/scripts/hopper-demo-x11.py +67 -8
- package/scripts/rea.mjs +19 -3
- package/skills/reverse-engineer-anything/SKILL.md +23 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +2 -2
- package/skills/reverse-engineer-anything/references/javascript-applications.md +1 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +61 -23
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/JavaScriptSemanticGraphProjection.js +0 -38
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/ProcessHarness.js +0 -275
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/application/runtime.js +0 -53
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/appleApplication.js +0 -181
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/javascriptAstValues.js +0 -13
- package/dist/domain/javascriptSemanticTraversal.js +0 -30
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCapture.js +0 -177
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/native/NativeHostCapabilities.js +0 -23
- /package/dist/application/{AndroidAnalysisPort.js → DirectAnalysisDependencies.js} +0 -0
- /package/dist/application/{BinarySessionPort.js → WebModulePorts.js} +0 -0
- /package/dist/application/{ElectronActiveObservationPort.js → WebNetworkCapturePort.js} +0 -0
- /package/dist/application/{ElectronObservationPort.js → WebRuntimePort.js} +0 -0
- /package/dist/application/{FirmwareAnalysisPort.js → WebScriptArtifactPort.js} +0 -0
- /package/dist/application/{JavaScriptArtifactAnalysisTypes.js → WebSourceLocationPorts.js} +0 -0
- /package/dist/application/{JavaScriptRuntimeObservationPort.js → android/AndroidAnalysisPort.js} +0 -0
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/application/{AbortablePromise.js → binary/AbortablePromise.js} +0 -0
- /package/dist/{domain/electronStaticAnalysisTypes.js → application/binary/BinarySessionPort.js} +0 -0
- /package/dist/application/{BinarySessionStatus.js → binary/BinarySessionStatus.js} +0 -0
- /package/dist/{domain/javascriptSemanticValueTypes.js → application/binaryDiagnostics/BinaryLayoutPort.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraph.js → javascript/ElectronBoundaryGraph.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraphIpc.js → javascript/ElectronBoundaryGraphIpc.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraphNative.js → javascript/ElectronBoundaryGraphNative.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraphWindows.js → javascript/ElectronBoundaryGraphWindows.js} +0 -0
- /package/dist/application/{JavaScriptArtifactGraphBundlers.js → javascript/JavaScriptArtifactGraphBundlers.js} +0 -0
- /package/dist/application/{JavaScriptArtifactGraphEvidence.js → javascript/JavaScriptArtifactGraphEvidence.js} +0 -0
- /package/dist/application/{JavaScriptArtifactReconstructionInput.js → javascript/JavaScriptArtifactReconstructionInput.js} +0 -0
- /package/dist/application/{JavaScriptSemanticGraphEvidence.js → javascript/JavaScriptSemanticGraphEvidence.js} +0 -0
- /package/dist/artifacts/{NibArchive.js → apple/NibArchive.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{androidAnalysis.js → android/androidAnalysis.js} +0 -0
- /package/dist/domain/{electronStaticAnalysis.js → javascript/electronStaticAnalysis.js} +0 -0
- /package/dist/domain/{javascriptExportShapeComparisonIdentity.js → javascript/javascriptExportShapeComparisonIdentity.js} +0 -0
- /package/dist/domain/{javascriptRuntimeReconciliation.js → javascript/javascriptRuntimeReconciliation.js} +0 -0
- /package/dist/domain/{javascriptRuntimeReconciliationRuntime.js → javascript/javascriptRuntimeReconciliationRuntime.js} +0 -0
- /package/dist/domain/{javascriptSemanticCoverage.js → javascript/javascriptSemanticCoverage.js} +0 -0
- /package/dist/domain/{javascriptSemanticDerivedAnalysis.js → javascript/javascriptSemanticDerivedAnalysis.js} +0 -0
- /package/dist/domain/{javascriptSemanticGraphSerialization.js → javascript/javascriptSemanticGraphSerialization.js} +0 -0
- /package/dist/domain/{javascriptSemanticIr.js → javascript/javascriptSemanticIr.js} +0 -0
- /package/dist/domain/{javascriptSemanticQueryRelations.js → javascript/javascriptSemanticQueryRelations.js} +0 -0
- /package/dist/domain/{javascriptSemanticState.js → javascript/javascriptSemanticState.js} +0 -0
- /package/dist/domain/{javascriptSourceParser.js → javascript/javascriptSourceParser.js} +0 -0
- /package/dist/domain/{javascriptStaticAnalysisFindings.js → javascript/javascriptStaticAnalysisFindings.js} +0 -0
- /package/dist/domain/{javascriptStaticAnalysisState.js → javascript/javascriptStaticAnalysisState.js} +0 -0
- /package/dist/domain/{javascriptStaticAnalysisTypes.js → javascript/javascriptStaticAnalysisTypes.js} +0 -0
- /package/dist/domain/{managedApplicationGraphCoverage.js → managed/managedApplicationGraphCoverage.js} +0 -0
- /package/dist/domain/{managedApplicationGraphNodeCoverage.js → managed/managedApplicationGraphNodeCoverage.js} +0 -0
- /package/dist/domain/{nativeApiBoundary.js → native/nativeApiBoundary.js} +0 -0
- /package/dist/domain/{nativeDataType.js → native/nativeDataType.js} +0 -0
- /package/dist/domain/{nativeInstruction.js → native/nativeInstruction.js} +0 -0
- /package/dist/domain/{nativeMetadataRecovery.js → native/nativeMetadataRecovery.js} +0 -0
- /package/dist/domain/{nativeValueFlow.js → native/nativeValueFlow.js} +0 -0
- /package/dist/domain/{nativeValueTrace.js → native/nativeValueTrace.js} +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""Bounded Linux core evidence via unchanged ELFFile/structs and pwntools ctypes.
|
|
2
|
+
|
|
3
|
+
No Corefile-selected thread, executable guessing, process lookup or target launch.
|
|
4
|
+
"""
|
|
5
|
+
import base64
|
|
6
|
+
import ctypes
|
|
7
|
+
import importlib.metadata
|
|
8
|
+
import io
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
PROFILE = "pwntools@4.15.0;pyelftools@0.33;unicorn@2.1.2"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CoreFailure(Exception):
|
|
16
|
+
def __init__(self, reason, message):
|
|
17
|
+
super().__init__(message)
|
|
18
|
+
self.reason = reason
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def encoded(value):
|
|
22
|
+
return base64.b64encode(value).decode("ascii")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def location(offset, size, limit):
|
|
26
|
+
if not 0 <= offset <= limit or not 0 <= size <= limit - offset:
|
|
27
|
+
raise CoreFailure("format", "Recorded source range exceeds its declared container.")
|
|
28
|
+
return {"offset": hex(offset), "bytes": hex(size)}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def inspect_core(path, cache):
|
|
32
|
+
for package, required in {"pwntools": "4.15.0", "pyelftools": "0.33", "unicorn": "2.1.2"}.items():
|
|
33
|
+
try:
|
|
34
|
+
actual = importlib.metadata.version(package)
|
|
35
|
+
except importlib.metadata.PackageNotFoundError as error:
|
|
36
|
+
raise CoreFailure("unavailable", "Selected Python lacks " + package + " " + required + ".") from error
|
|
37
|
+
if actual != required:
|
|
38
|
+
raise CoreFailure("unsupported", "Expected " + package + " " + required + "; selected Python reports " + actual + ".")
|
|
39
|
+
content = path.read_bytes()
|
|
40
|
+
if len(content) < 16 or content[:4] != b"\x7fELF":
|
|
41
|
+
raise CoreFailure("format", "Selected recording lacks a complete ELF identification.")
|
|
42
|
+
if content[4:6] != b"\x02\x01":
|
|
43
|
+
raise CoreFailure("unsupported-target", "Initial recorded-core profile requires ELF64 little-endian.")
|
|
44
|
+
if len(content) < 64:
|
|
45
|
+
raise CoreFailure("format", "Selected ELF64 core header is truncated.")
|
|
46
|
+
# Linux commonly emits ELFOSABI_NONE (0), also accepted as GNU/Linux (3).
|
|
47
|
+
# Other declared OSABIs must never select Linux note ctypes.
|
|
48
|
+
if content[7] not in (0, 3) or content[8] != 0:
|
|
49
|
+
raise CoreFailure("unsupported-target", "Initial recorded-core profile requires System V or GNU/Linux OSABI with ABI version zero; selected OSABI=" + str(content[7]) + ", ABI version=" + str(content[8]) + ".")
|
|
50
|
+
if int.from_bytes(content[16:18], "little") != 4 or int.from_bytes(content[18:20], "little") != 62:
|
|
51
|
+
raise CoreFailure("unsupported-target", "Initial recorded-core profile requires x86-64 ET_CORE.")
|
|
52
|
+
from elftools.common.exceptions import ELFError
|
|
53
|
+
from elftools.common.utils import struct_parse
|
|
54
|
+
from elftools.elf.elffile import ELFFile
|
|
55
|
+
from pwnlib.elf.datatypes import elf_prstatus_amd64, elf_siginfo_64, user_regs_struct_amd64
|
|
56
|
+
try:
|
|
57
|
+
image = ELFFile(io.BytesIO(content))
|
|
58
|
+
header = image.header
|
|
59
|
+
count = image.num_segments()
|
|
60
|
+
if count and header.e_phentsize < image.structs.Elf_Phdr.sizeof():
|
|
61
|
+
raise CoreFailure("format", "Program-header entry is shorter than the required ELF64 structure.")
|
|
62
|
+
location(header.e_phoff, count * header.e_phentsize, len(content))
|
|
63
|
+
segments, notes, padding, threads, signals = [], [], [], [], []
|
|
64
|
+
for segment_index, segment in enumerate(image.iter_segments()):
|
|
65
|
+
h = segment.header
|
|
66
|
+
backing = h.p_type != "PT_NULL" and h.p_filesz > 0
|
|
67
|
+
if backing:
|
|
68
|
+
location(h.p_offset, h.p_filesz, len(content))
|
|
69
|
+
if h.p_type == "PT_LOAD" and h.p_filesz > h.p_memsz:
|
|
70
|
+
raise CoreFailure("format", "Recorded PT_LOAD file bytes exceed memory size.")
|
|
71
|
+
segments.append({"index": segment_index, "type": h.p_type,
|
|
72
|
+
"header_location": location(header.e_phoff + segment_index * header.e_phentsize, header.e_phentsize, len(content)),
|
|
73
|
+
"offset": hex(h.p_offset), "file_size": hex(h.p_filesz), "memory_size": hex(h.p_memsz),
|
|
74
|
+
"virtual_address": hex(h.p_vaddr), "physical_address": hex(h.p_paddr), "alignment": hex(h.p_align), "flags": hex(h.p_flags), "file_backing": "file" if backing else "none"})
|
|
75
|
+
if h.p_type != "PT_NOTE" or h.p_filesz == 0:
|
|
76
|
+
continue
|
|
77
|
+
position, end = h.p_offset, h.p_offset + h.p_filesz
|
|
78
|
+
header_size = image.structs.Elf_Nhdr.sizeof()
|
|
79
|
+
while position < end:
|
|
80
|
+
if end - position < header_size:
|
|
81
|
+
raw = content[position:end]
|
|
82
|
+
if any(raw):
|
|
83
|
+
raise CoreFailure("format", "Nonzero trailing note bytes lack a complete note header.")
|
|
84
|
+
padding.append({"segment_index": segment_index, "location": location(position, len(raw), end), "bytes_base64": encoded(raw)})
|
|
85
|
+
break
|
|
86
|
+
note = struct_parse(image.structs.Elf_Nhdr, image.stream, stream_pos=position)
|
|
87
|
+
owner_start = position + header_size
|
|
88
|
+
descriptor_start = owner_start + ((note.n_namesz + 3) // 4) * 4
|
|
89
|
+
note_end = descriptor_start + ((note.n_descsz + 3) // 4) * 4
|
|
90
|
+
location(position, note_end - position, end)
|
|
91
|
+
owner = content[owner_start:owner_start + note.n_namesz]
|
|
92
|
+
if owner and b"\0" not in owner:
|
|
93
|
+
raise CoreFailure("format", "Declared note owner has no NUL terminator.")
|
|
94
|
+
display = owner.split(b"\0", 1)[0].decode("utf-8", "replace") if owner else None
|
|
95
|
+
descriptor = content[descriptor_start:descriptor_start + note.n_descsz]
|
|
96
|
+
note_index = len(notes)
|
|
97
|
+
notes.append({"index": note_index, "segment_index": segment_index, "type": note.n_type,
|
|
98
|
+
"location": location(position, note_end - position, end),
|
|
99
|
+
"owner_location": location(owner_start, len(owner), end), "owner_bytes_base64": encoded(owner), "owner_display": display,
|
|
100
|
+
"descriptor_location": location(descriptor_start, len(descriptor), end), "descriptor_bytes_base64": encoded(descriptor)})
|
|
101
|
+
position = note_end
|
|
102
|
+
# Only the initial Linux CORE ABI is interpreted. Other owners retain exact bytes.
|
|
103
|
+
if owner != b"CORE\0":
|
|
104
|
+
continue
|
|
105
|
+
if note.n_type == "NT_PRSTATUS":
|
|
106
|
+
if len(descriptor) < ctypes.sizeof(elf_prstatus_amd64):
|
|
107
|
+
raise CoreFailure("format", "Linux amd64 NT_PRSTATUS descriptor is truncated.")
|
|
108
|
+
status = elf_prstatus_amd64.from_buffer_copy(descriptor)
|
|
109
|
+
registers = []
|
|
110
|
+
for name, kind in user_regs_struct_amd64._fields_:
|
|
111
|
+
relative = elf_prstatus_amd64.pr_reg.offset + getattr(user_regs_struct_amd64, name).offset
|
|
112
|
+
registers.append({"name": name, "value": hex(getattr(status.pr_reg, name)), "location": location(descriptor_start + relative, ctypes.sizeof(kind), end)})
|
|
113
|
+
threads.append({"note_index": note_index, "historical_pid": ctypes.c_int32(status.pr_pid).value, "recorded_current_signal": status.pr_cursig, "registers": registers})
|
|
114
|
+
elif note.n_type == "NT_SIGINFO":
|
|
115
|
+
if len(descriptor) < ctypes.sizeof(elf_siginfo_64):
|
|
116
|
+
raise CoreFailure("format", "Linux amd64 NT_SIGINFO descriptor is truncated.")
|
|
117
|
+
signal = elf_siginfo_64.from_buffer_copy(descriptor)
|
|
118
|
+
number = ctypes.c_int32(signal.si_signo).value
|
|
119
|
+
code = ctypes.c_int32(signal.si_code).value
|
|
120
|
+
known = number == 11 and code in (1, 2)
|
|
121
|
+
signals.append({"note_index": note_index, "number": number, "code": code, "errno": ctypes.c_int32(signal.si_errno).value,
|
|
122
|
+
"fault_address": hex(signal.sigfault_addr) if known else None,
|
|
123
|
+
"fault_address_meaning": "recorded-sigsegv-address" if known else "unknown", "thread_association": "unknown"})
|
|
124
|
+
return {"format": "elf-core", "architecture": "x86_64-little-endian", "target_execution": "not-performed", "live_process_identity": "unknown",
|
|
125
|
+
"segments": segments, "notes": notes, "note_padding": padding, "threads": threads, "signals": signals,
|
|
126
|
+
"note_interpretation_completeness": "unknown",
|
|
127
|
+
"limitations": ["The initial Linux note profile accepts System V/unspecified or GNU/Linux OSABI with ABI version zero; an unspecified OSABI alone does not prove operating-system origin.",
|
|
128
|
+
"Historical PID and signal values are recorded metadata, not current process identity or attach authority.",
|
|
129
|
+
"Only exact Linux CORE NT_PRSTATUS/NT_SIGINFO owners are interpreted; every descriptor and owner retains original bytes. Other note semantics remain unknown.",
|
|
130
|
+
"NT_SIGINFO thread association is unknown. Only SIGSEGV SEGV_MAPERR/SEGV_ACCERR initially establish a fault-address union meaning.",
|
|
131
|
+
"PT_LOAD file bytes are recorded bytes. Undumped memory and current executable/library identity remain unknown; no current host file is resolved from a recorded pathname.",
|
|
132
|
+
"Missing notes/registers/signals do not establish their absence at the original crash. Full unwinding, executable pairing and live control are not provided."]}
|
|
133
|
+
except CoreFailure:
|
|
134
|
+
raise
|
|
135
|
+
except (ELFError, ValueError, AssertionError, IndexError) as error:
|
|
136
|
+
raise CoreFailure("format", "Recorded core failed unchanged upstream structural parsing: " + str(error)) from error
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
if __name__ == "__main__":
|
|
140
|
+
runtime_path = Path(__file__).with_name("decoder_runtime.py")
|
|
141
|
+
runtime = {"__file__": str(runtime_path), "__name__": "rea_decoder_runtime"}
|
|
142
|
+
exec(compile(runtime_path.read_bytes(), str(runtime_path), "exec"), runtime)
|
|
143
|
+
runtime["main"](sys.argv[-1], inspect_core, CoreFailure, PROFILE)
|
|
@@ -2,7 +2,7 @@ import { constants, createReadStream } from "node:fs";
|
|
|
2
2
|
import { chmod, copyFile } from "node:fs/promises";
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { AnalysisInputError } from "../domain/analysisErrorCore.js";
|
|
5
|
+
import { AnalysisInputError, AnalysisCapabilityUnavailableError, } from "../domain/analysisErrorCore.js";
|
|
6
6
|
/** Stream a local file digest without retaining the APK or JAR in memory. */
|
|
7
7
|
export const hashAndroidFile = async (path) => {
|
|
8
8
|
const hash = createHash("sha256");
|
|
@@ -26,9 +26,11 @@ export const snapshotAndroidTarget = async (path, sha256, root, operation) => {
|
|
|
26
26
|
return snapshot;
|
|
27
27
|
};
|
|
28
28
|
/** Fingerprint the actual immutable engine bytes executed for this observation. */
|
|
29
|
-
export const snapshotAndroidEngine = async (source, root) => {
|
|
29
|
+
export const snapshotAndroidEngine = async (source, sha256, root, operation) => {
|
|
30
30
|
const path = join(root, "engine.jar");
|
|
31
31
|
await copyFile(source, path, constants.COPYFILE_EXCL);
|
|
32
32
|
await chmod(path, 0o400);
|
|
33
|
-
|
|
33
|
+
if ((await hashAndroidFile(path)) !== sha256)
|
|
34
|
+
throw new AnalysisCapabilityUnavailableError("jadx", operation, "REA_JADX_MCP_JAR bytes changed during admission; retry with a stable engine file.");
|
|
35
|
+
return { path, sha256 };
|
|
34
36
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { androidResultSchemas } from "../domain/androidAnalysis.js";
|
|
1
|
+
import { androidResultSchemas } from "../domain/android/androidAnalysis.js";
|
|
2
2
|
import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
3
3
|
import { jadxAppSchema, jadxClassPageSchema, jadxClassSchema, jadxLoadSchema, jadxMethodSchema, jadxXrefsSchema, normalizeJadxText, } from "./JadxProtocol.js";
|
|
4
|
+
import { JADX_RELEASE } from "./JadxRelease.js";
|
|
4
5
|
const methodsOf = (summary) => {
|
|
5
6
|
const seen = new Map();
|
|
6
7
|
return summary.methods.map((method) => {
|
|
@@ -60,16 +61,17 @@ const inspectPackage = async (tools, loaded, engine) => {
|
|
|
60
61
|
};
|
|
61
62
|
const searchClasses = async (tools, request, loaded, engine) => {
|
|
62
63
|
const classes = [];
|
|
64
|
+
const pageSize = 4096;
|
|
63
65
|
let total;
|
|
64
66
|
do {
|
|
65
67
|
const page = jadxClassPageSchema.parse(await tools.json("list_classes", {
|
|
66
68
|
offset: classes.length,
|
|
67
|
-
limit:
|
|
69
|
+
limit: pageSize,
|
|
68
70
|
}));
|
|
69
71
|
if ((total !== undefined && total !== page.total) ||
|
|
70
72
|
page.offset !== classes.length ||
|
|
71
|
-
page.limit !==
|
|
72
|
-
page.items.length >
|
|
73
|
+
page.limit !== pageSize ||
|
|
74
|
+
page.items.length > pageSize)
|
|
73
75
|
throw new AnalysisOutputError(request.operation, "JADX class pagination changed identity or counts");
|
|
74
76
|
total = page.total;
|
|
75
77
|
classes.push(...page.items);
|
|
@@ -115,7 +117,7 @@ const inspectMethod = async (tools, request, summary, engine) => {
|
|
|
115
117
|
if (body.body.startsWith("// ERROR:"))
|
|
116
118
|
throw new AnalysisOutputError(request.operation, `JADX did not produce method source: ${body.body}`);
|
|
117
119
|
if (body.mode === "smali" && candidates.length > 1)
|
|
118
|
-
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `JADX
|
|
120
|
+
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `JADX ${JADX_RELEASE.version} smali fallback joins all same-name overloads for ${summary.full_name}.${request.input.method_name}; it cannot establish source for only overload ${index}.`);
|
|
119
121
|
return androidResultSchemas.inspect_android_method.parse({
|
|
120
122
|
engine,
|
|
121
123
|
class_name: summary.full_name,
|
|
@@ -158,7 +160,7 @@ const traceReferences = async (tools, request, summary, engine) => {
|
|
|
158
160
|
const methodName = request.input.method_name;
|
|
159
161
|
const candidates = matchingMethods(summary, request);
|
|
160
162
|
if (candidates.length > 1)
|
|
161
|
-
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `
|
|
163
|
+
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `References require a unique method name; ${summary.full_name}.${methodName} has ${candidates.length} overloads. No unambiguous reference result is available.`);
|
|
162
164
|
const expectedTarget = methodName === undefined
|
|
163
165
|
? summary.full_name
|
|
164
166
|
: `${summary.full_name}.${methodName}`;
|
|
@@ -2,16 +2,17 @@ import { access, realpath, stat } from "node:fs/promises";
|
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { isAbsolute, join } from "node:path";
|
|
4
4
|
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
|
|
5
|
+
import { JADX_JAR_CONFIGURATION_REMEDIATION } from "./JadxRelease.js";
|
|
5
6
|
/** Admit explicit local tooling without installing or changing host configuration. */
|
|
6
7
|
export const resolveJadxConfiguration = async (environment, operation) => {
|
|
7
8
|
const unavailable = (reason) => new AnalysisCapabilityUnavailableError("jadx", operation, reason);
|
|
8
9
|
if (process.platform !== "linux" && process.platform !== "darwin")
|
|
9
|
-
throw unavailable(`Android JADX subprocess ownership is unsupported on ${process.platform}; use Linux or macOS.
|
|
10
|
+
throw unavailable(`Android JADX subprocess ownership is unsupported on ${process.platform}; use Linux or macOS. The metadata bridge has real-provider verification on macOS arm64.`);
|
|
10
11
|
const jar = environment.REA_JADX_MCP_JAR;
|
|
11
12
|
if (environment.JAVA_HOME !== undefined && !isAbsolute(environment.JAVA_HOME))
|
|
12
13
|
throw unavailable("JAVA_HOME must select an existing JDK by absolute path; omit it to use java on PATH.");
|
|
13
14
|
if (jar === undefined || !isAbsolute(jar))
|
|
14
|
-
throw unavailable(
|
|
15
|
+
throw unavailable(JADX_JAR_CONFIGURATION_REMEDIATION);
|
|
15
16
|
const java = environment.JAVA_HOME === undefined
|
|
16
17
|
? "java"
|
|
17
18
|
: join(environment.JAVA_HOME, "bin", "java");
|
|
@@ -37,5 +38,20 @@ export const resolveJadxConfiguration = async (environment, operation) => {
|
|
|
37
38
|
throw unavailable(`Cannot execute JAVA_HOME java ${java}: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
+
const jvmArguments = [];
|
|
42
|
+
for (const [name, prefix, suffix] of [
|
|
43
|
+
["REA_JADX_HEAP_MIB", "-Xmx", "m"],
|
|
44
|
+
["REA_JADX_ACTIVE_PROCESSOR_COUNT", "-XX:ActiveProcessorCount=", ""],
|
|
45
|
+
]) {
|
|
46
|
+
const value = environment[name];
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
continue;
|
|
49
|
+
if (!/^[1-9]\d*$/u.test(value) || !Number.isSafeInteger(Number(value)))
|
|
50
|
+
throw unavailable(`${name} must be a positive safe integer; received ${value}.`);
|
|
51
|
+
if (name === "REA_JADX_ACTIVE_PROCESSOR_COUNT" &&
|
|
52
|
+
Number(value) > 2_147_483_647)
|
|
53
|
+
throw unavailable(`${name} exceeds the JVM's signed 32-bit processor-count range.`);
|
|
54
|
+
jvmArguments.push(`${prefix}${value}${suffix}`);
|
|
55
|
+
}
|
|
56
|
+
return { jar: await realpath(jar), java, jvmArguments };
|
|
41
57
|
};
|
|
@@ -4,7 +4,7 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../proces
|
|
|
4
4
|
import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
|
|
5
5
|
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
6
6
|
const MAX_FRAME_BYTES = 8 * 1024 * 1024;
|
|
7
|
-
const
|
|
7
|
+
const MAX_OPERATION_BYTES = 32 * 1024 * 1024;
|
|
8
8
|
/** SDK-framed stdio with REA-owned process cleanup rather than an unowned child. */
|
|
9
9
|
export class JadxMcpTransport {
|
|
10
10
|
options;
|
|
@@ -15,7 +15,8 @@ export class JadxMcpTransport {
|
|
|
15
15
|
runId = randomUUID();
|
|
16
16
|
#spawned;
|
|
17
17
|
#supervisor;
|
|
18
|
-
#
|
|
18
|
+
#frameBuffer = Buffer.alloc(0);
|
|
19
|
+
#frameLength = 0;
|
|
19
20
|
#bytes = 0;
|
|
20
21
|
#started = false;
|
|
21
22
|
#closed = false;
|
|
@@ -44,8 +45,9 @@ export class JadxMcpTransport {
|
|
|
44
45
|
this.#supervisor = new ProviderProcessSupervisor({
|
|
45
46
|
...spawned,
|
|
46
47
|
ownsProcessLifetime: true,
|
|
47
|
-
cleanup: spawned.cleanup ??
|
|
48
|
-
|
|
48
|
+
cleanup: spawned.cleanup ??
|
|
49
|
+
(() => cleanupOwnedProcessGroup(spawned.ownership)),
|
|
50
|
+
}, { captureStdout: false });
|
|
49
51
|
if (spawned.process.stdin === undefined ||
|
|
50
52
|
spawned.process.stdin === null ||
|
|
51
53
|
spawned.process.stdout === null)
|
|
@@ -80,8 +82,15 @@ export class JadxMcpTransport {
|
|
|
80
82
|
failureReason() {
|
|
81
83
|
return this.#failure;
|
|
82
84
|
}
|
|
85
|
+
/** Scope both the byte budget and diagnostic retention to the next serialized request. */
|
|
86
|
+
beginOperation() {
|
|
87
|
+
this.#bytes = 0;
|
|
88
|
+
this.#supervisor?.resetOutput();
|
|
89
|
+
}
|
|
83
90
|
async #stop() {
|
|
84
91
|
this.#closed = true;
|
|
92
|
+
this.#frameBuffer = Buffer.alloc(0);
|
|
93
|
+
this.#frameLength = 0;
|
|
85
94
|
// A cancellation may race acquisition. Join it before inspecting ownership.
|
|
86
95
|
await this.#starting?.catch(() => undefined);
|
|
87
96
|
const process = this.#spawned?.process;
|
|
@@ -106,35 +115,53 @@ export class JadxMcpTransport {
|
|
|
106
115
|
};
|
|
107
116
|
#countStderr = (chunk) => {
|
|
108
117
|
this.#bytes += Buffer.byteLength(chunk);
|
|
109
|
-
if (this.#bytes >
|
|
110
|
-
this.#fail(new Error(`JADX
|
|
118
|
+
if (this.#bytes > MAX_OPERATION_BYTES)
|
|
119
|
+
this.#fail(new Error(`JADX operation output exceeds ${MAX_OPERATION_BYTES} bytes; no complete result is available`));
|
|
111
120
|
};
|
|
112
121
|
#read = (chunk) => {
|
|
113
122
|
if (this.#closed)
|
|
114
123
|
return;
|
|
115
124
|
const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
116
125
|
this.#bytes += bytes.length;
|
|
117
|
-
if (this.#bytes >
|
|
118
|
-
this.#fail(new Error(`JADX
|
|
126
|
+
if (this.#bytes > MAX_OPERATION_BYTES) {
|
|
127
|
+
this.#fail(new Error(`JADX operation output exceeds ${MAX_OPERATION_BYTES} bytes; no complete result is available`));
|
|
119
128
|
return;
|
|
120
129
|
}
|
|
121
|
-
this.#buffer = Buffer.concat([this.#buffer, bytes]);
|
|
122
130
|
try {
|
|
123
|
-
let
|
|
124
|
-
while (
|
|
125
|
-
|
|
131
|
+
let offset = 0;
|
|
132
|
+
while (offset < bytes.length) {
|
|
133
|
+
const newline = bytes.indexOf(10, offset);
|
|
134
|
+
const end = newline === -1 ? bytes.length : newline;
|
|
135
|
+
const fragment = bytes.subarray(offset, end);
|
|
136
|
+
const frameBytes = this.#frameLength + fragment.length;
|
|
137
|
+
if (frameBytes > MAX_FRAME_BYTES)
|
|
126
138
|
throw new Error(`JADX MCP frame exceeds ${MAX_FRAME_BYTES} bytes`);
|
|
127
|
-
|
|
128
|
-
|
|
139
|
+
this.#appendFrame(fragment, frameBytes);
|
|
140
|
+
if (newline === -1)
|
|
141
|
+
return;
|
|
142
|
+
const line = this.#frameBuffer
|
|
143
|
+
.subarray(0, this.#frameLength)
|
|
144
|
+
.toString("utf8");
|
|
145
|
+
this.#frameBuffer = Buffer.alloc(0);
|
|
146
|
+
this.#frameLength = 0;
|
|
129
147
|
this.onmessage?.(deserializeMessage(line));
|
|
148
|
+
offset = newline + 1;
|
|
130
149
|
}
|
|
131
|
-
if (this.#buffer.length > MAX_FRAME_BYTES)
|
|
132
|
-
throw new Error(`JADX MCP frame exceeds ${MAX_FRAME_BYTES} bytes`);
|
|
133
150
|
}
|
|
134
151
|
catch (cause) {
|
|
135
152
|
this.#fail(cause instanceof Error ? cause : new Error(String(cause)));
|
|
136
153
|
}
|
|
137
154
|
};
|
|
155
|
+
#appendFrame(fragment, frameBytes) {
|
|
156
|
+
if (frameBytes > this.#frameBuffer.length) {
|
|
157
|
+
const capacity = Math.min(MAX_FRAME_BYTES, Math.max(frameBytes, this.#frameBuffer.length * 2, 1));
|
|
158
|
+
const grown = Buffer.allocUnsafe(capacity);
|
|
159
|
+
this.#frameBuffer.copy(grown, 0, 0, this.#frameLength);
|
|
160
|
+
this.#frameBuffer = grown;
|
|
161
|
+
}
|
|
162
|
+
fragment.copy(this.#frameBuffer, this.#frameLength);
|
|
163
|
+
this.#frameLength = frameBytes;
|
|
164
|
+
}
|
|
138
165
|
#fail(error) {
|
|
139
166
|
this.#failure ??= error.message;
|
|
140
167
|
this.onerror?.(error);
|
|
@@ -2,6 +2,14 @@ import { z } from "zod";
|
|
|
2
2
|
import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
|
|
3
3
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
4
4
|
const count = z.number().int().nonnegative();
|
|
5
|
+
/** Values observed inside the exact JVM producing the analysis. */
|
|
6
|
+
export const jadxRuntimeSchema = z.object({
|
|
7
|
+
engine_reported_version: z.string().min(1),
|
|
8
|
+
max_heap_bytes: z.number().int().positive().safe(),
|
|
9
|
+
available_processors: z.number().int().positive(),
|
|
10
|
+
java_version: z.string().min(1),
|
|
11
|
+
metadata_scope: z.literal("parsed_members"),
|
|
12
|
+
});
|
|
5
13
|
export const jadxLoadSchema = z.object({
|
|
6
14
|
state: z.literal("LOADED"),
|
|
7
15
|
apk_path: z.string(),
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { chmod, copyFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
3
|
-
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
6
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisInputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
4
7
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
5
8
|
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
6
9
|
import { err, ok } from "../domain/result.js";
|
|
7
10
|
import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
|
|
8
|
-
import { snapshotAndroidEngine, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
|
|
11
|
+
import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
|
|
9
12
|
import { resolveJadxConfiguration } from "./JadxConfiguration.js";
|
|
10
13
|
import { JadxSession } from "./JadxSession.js";
|
|
11
14
|
const OPERATION_TIMEOUT_MS = 120_000;
|
|
15
|
+
const BRIDGE_SOURCE = fileURLToPath(new URL("../../bridge/android/ReaJadxBridge.java", import.meta.url));
|
|
12
16
|
const waitForTurn = (predecessor, request, signal) => new Promise((resolve, reject) => {
|
|
13
17
|
const abort = () => reject(new AnalysisCancelledError(request.operation));
|
|
14
18
|
signal?.addEventListener("abort", abort, { once: true });
|
|
@@ -75,44 +79,81 @@ const cleanup = async (session, root, previous) => {
|
|
|
75
79
|
}
|
|
76
80
|
return previous;
|
|
77
81
|
};
|
|
78
|
-
/** One
|
|
82
|
+
/** One serialized, immutable APK session per REA instance, retired on idle or shutdown. */
|
|
79
83
|
export class JadxProvider {
|
|
80
84
|
environment;
|
|
81
85
|
launcher;
|
|
82
86
|
#tail = Promise.resolve();
|
|
83
87
|
#cleanupFailure;
|
|
88
|
+
#retained;
|
|
89
|
+
#idle;
|
|
90
|
+
#shutdown = new AbortController();
|
|
91
|
+
#closePromise;
|
|
84
92
|
constructor(environment = process.env, launcher) {
|
|
85
93
|
this.environment = environment;
|
|
86
94
|
this.launcher = launcher;
|
|
87
95
|
}
|
|
88
96
|
/** Serialize expensive work and bind both raw and normalized results to the APK. */
|
|
89
97
|
async execute(target, request, options) {
|
|
98
|
+
if (this.#shutdown.signal.aborted)
|
|
99
|
+
return err(new AnalysisCancelledError(request.operation));
|
|
100
|
+
const signal = options?.signal === undefined
|
|
101
|
+
? this.#shutdown.signal
|
|
102
|
+
: AbortSignal.any([options.signal, this.#shutdown.signal]);
|
|
90
103
|
const predecessor = this.#tail;
|
|
91
104
|
let release = () => { };
|
|
92
105
|
this.#tail = new Promise((resolve) => {
|
|
93
106
|
release = resolve;
|
|
94
107
|
});
|
|
95
108
|
try {
|
|
96
|
-
await waitForTurn(predecessor, request,
|
|
109
|
+
await waitForTurn(predecessor, request, signal);
|
|
97
110
|
}
|
|
98
111
|
catch {
|
|
99
112
|
void predecessor.then(release);
|
|
100
113
|
return err(new AnalysisCancelledError(request.operation));
|
|
101
114
|
}
|
|
102
115
|
try {
|
|
103
|
-
if (
|
|
116
|
+
if (signal.aborted)
|
|
104
117
|
return err(new AnalysisCancelledError(request.operation));
|
|
105
118
|
if (this.#cleanupFailure !== undefined)
|
|
106
119
|
return err(this.#cleanupFailure);
|
|
107
|
-
|
|
120
|
+
clearTimeout(this.#idle);
|
|
121
|
+
const outcome = await this.#execute(target, request, { signal });
|
|
108
122
|
if (!outcome.ok && outcome.error.cleanupIncomplete)
|
|
109
123
|
this.#cleanupFailure = outcome.error;
|
|
124
|
+
if (outcome.ok)
|
|
125
|
+
this.#scheduleIdle();
|
|
110
126
|
return outcome;
|
|
111
127
|
}
|
|
112
128
|
finally {
|
|
113
129
|
release();
|
|
114
130
|
}
|
|
115
131
|
}
|
|
132
|
+
/** Cancel queued/active operations and join the owned engine and workspace cleanup. */
|
|
133
|
+
close() {
|
|
134
|
+
this.#shutdown.abort();
|
|
135
|
+
clearTimeout(this.#idle);
|
|
136
|
+
this.#closePromise ??= this.#tail.then(() => this.#retire());
|
|
137
|
+
return this.#closePromise;
|
|
138
|
+
}
|
|
139
|
+
async #retire() {
|
|
140
|
+
if (this.#cleanupFailure !== undefined)
|
|
141
|
+
throw this.#cleanupFailure;
|
|
142
|
+
const retained = this.#retained;
|
|
143
|
+
this.#retained = undefined;
|
|
144
|
+
const result = await cleanup(retained?.session, retained?.root, ok(undefined));
|
|
145
|
+
if (!result.ok) {
|
|
146
|
+
this.#cleanupFailure = result.error;
|
|
147
|
+
throw result.error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
#scheduleIdle() {
|
|
151
|
+
this.#idle = setTimeout(() => {
|
|
152
|
+
const retirement = this.#tail.then(() => this.#retire());
|
|
153
|
+
this.#tail = retirement.catch(() => undefined);
|
|
154
|
+
}, 60_000);
|
|
155
|
+
this.#idle.unref();
|
|
156
|
+
}
|
|
116
157
|
async #execute(target, request, options) {
|
|
117
158
|
const timeout = AbortSignal.timeout(OPERATION_TIMEOUT_MS);
|
|
118
159
|
const signal = options?.signal === undefined
|
|
@@ -126,35 +167,80 @@ export class JadxProvider {
|
|
|
126
167
|
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
|
|
127
168
|
const configuration = await resolveJadxConfiguration(this.environment, request.operation);
|
|
128
169
|
signal.throwIfAborted();
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
170
|
+
const jarHash = await hashAndroidFile(configuration.jar);
|
|
171
|
+
const bridgeHash = await hashAndroidFile(BRIDGE_SOURCE);
|
|
172
|
+
if ((await hashAndroidFile(target.path)) !== target.sha256)
|
|
173
|
+
throw new AnalysisInputError(request.operation, undefined, [
|
|
174
|
+
{
|
|
175
|
+
path: ["path"],
|
|
176
|
+
reason: "invalid_value",
|
|
177
|
+
message: "APK bytes changed after admission; retry against a stable file.",
|
|
178
|
+
},
|
|
179
|
+
]);
|
|
180
|
+
const key = JSON.stringify({
|
|
181
|
+
path: target.path,
|
|
182
|
+
sha256: target.sha256,
|
|
183
|
+
jar: configuration.jar,
|
|
184
|
+
jarHash,
|
|
185
|
+
bridgeHash,
|
|
186
|
+
java: configuration.java,
|
|
187
|
+
arguments: configuration.jvmArguments,
|
|
188
|
+
options: [
|
|
189
|
+
this.environment.JAVA_TOOL_OPTIONS,
|
|
190
|
+
this.environment._JAVA_OPTIONS,
|
|
191
|
+
this.environment.JDK_JAVA_OPTIONS,
|
|
192
|
+
this.environment.PATH,
|
|
193
|
+
this.environment.JAVA_HOME,
|
|
146
194
|
],
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
195
|
+
});
|
|
196
|
+
if (this.#retained !== undefined && this.#retained.key !== key)
|
|
197
|
+
await this.#retire();
|
|
198
|
+
let retained = this.#retained;
|
|
199
|
+
if (retained === undefined) {
|
|
200
|
+
root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
|
|
201
|
+
const engine = await snapshotAndroidEngine(configuration.jar, jarHash, root.path, request.operation);
|
|
202
|
+
const snapshot = await snapshotAndroidTarget(target.path, target.sha256, root.path, request.operation);
|
|
203
|
+
const bridge = join(root.path, "ReaJadxBridge.java");
|
|
204
|
+
await copyFile(BRIDGE_SOURCE, bridge);
|
|
205
|
+
await chmod(bridge, 0o400);
|
|
206
|
+
if ((await hashAndroidFile(bridge)) !== bridgeHash)
|
|
207
|
+
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, "REA Android bridge bytes changed during admission; retry with a stable installation.");
|
|
208
|
+
signal.throwIfAborted();
|
|
209
|
+
session = new JadxSession({
|
|
210
|
+
command: configuration.java,
|
|
211
|
+
arguments: [
|
|
212
|
+
...configuration.jvmArguments,
|
|
213
|
+
"--class-path",
|
|
214
|
+
engine.path,
|
|
215
|
+
bridge,
|
|
216
|
+
],
|
|
217
|
+
cwd: root.path,
|
|
218
|
+
hostEnvironment: this.environment,
|
|
219
|
+
signal,
|
|
220
|
+
}, this.launcher);
|
|
221
|
+
retained = {
|
|
222
|
+
key,
|
|
223
|
+
root,
|
|
224
|
+
session,
|
|
225
|
+
snapshot,
|
|
226
|
+
jarHash: engine.sha256,
|
|
227
|
+
bridgeHash,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
root = retained.root;
|
|
231
|
+
session = retained.session;
|
|
232
|
+
const { snapshot } = retained;
|
|
151
233
|
outcome = ok(await session.execute({
|
|
152
234
|
request,
|
|
153
235
|
target,
|
|
154
236
|
snapshot,
|
|
155
|
-
jarHash:
|
|
237
|
+
jarHash: retained.jarHash,
|
|
238
|
+
bridgeHash: retained.bridgeHash,
|
|
156
239
|
signal,
|
|
157
240
|
}));
|
|
241
|
+
signal.throwIfAborted();
|
|
242
|
+
this.#retained = retained;
|
|
243
|
+
return outcome;
|
|
158
244
|
}
|
|
159
245
|
catch (cause) {
|
|
160
246
|
outcome = err(executionError({
|
|
@@ -165,6 +251,10 @@ export class JadxProvider {
|
|
|
165
251
|
session,
|
|
166
252
|
}));
|
|
167
253
|
}
|
|
254
|
+
// An existing session also needs retirement when admission fails before selection.
|
|
255
|
+
root ??= this.#retained?.root;
|
|
256
|
+
session ??= this.#retained?.session;
|
|
257
|
+
this.#retained = undefined;
|
|
168
258
|
return cleanup(session, root, outcome);
|
|
169
259
|
}
|
|
170
260
|
}
|
|
@@ -5,6 +5,13 @@ export const JADX_RELEASE = Object.freeze({
|
|
|
5
5
|
sha256: "6e5eacf500b64292bfb73c49797c1958f6ee44646e43e868039ae7feb573ff75",
|
|
6
6
|
url: "https://github.com/1013503897/jadx-headless-mcp/releases/download/v0.7.1/jadx-headless-mcp-0.7.1-all.jar",
|
|
7
7
|
});
|
|
8
|
+
/** Identity of REA's metadata bridge, distinct from the producing engine. */
|
|
9
|
+
export const JADX_BRIDGE_IDENTITY = Object.freeze({
|
|
10
|
+
name: "rea-jadx-bridge",
|
|
11
|
+
version: "1",
|
|
12
|
+
});
|
|
13
|
+
/** Remediation when `REA_JADX_MCP_JAR` is missing or not an absolute path. */
|
|
14
|
+
export const JADX_JAR_CONFIGURATION_REMEDIATION = `Set REA_JADX_MCP_JAR to the absolute path of a caller-supplied jadx-headless-mcp ${JADX_RELEASE.version} JAR. REA does not download or install it.`;
|
|
8
15
|
/** Producing engine identity used by Evidence and the generated product catalog. */
|
|
9
16
|
export const JADX_PROVIDER_IDENTITY = Object.freeze({
|
|
10
17
|
id: "jadx",
|
|
@@ -15,5 +22,6 @@ export const JADX_PROVIDER_IDENTITY = Object.freeze({
|
|
|
15
22
|
export const JADX_LIMITATIONS = [
|
|
16
23
|
"Static decompiler observations do not establish runtime behavior; the APK is never executed.",
|
|
17
24
|
"Method signatures use provider display types; exact DEX descriptors and instruction offsets are unavailable. Overload indices are local to this engine and artifact.",
|
|
25
|
+
"Class inventories use parsed metadata before code generation, including synthetic members that may be omitted from decompiled source. Source positions remain unknown.",
|
|
18
26
|
"Manifest summary fields are extracted by the upstream engine; decoded XML is retained for verification. APK signatures, split APKs, native libraries and Android runtime capture are not verified by this provider.",
|
|
19
27
|
];
|