rea-agents 6.3.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +51 -19
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +22 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +70 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +66 -31
- package/dist/application/DirectAnalysis.js +2 -2
- package/dist/application/DirectAnalysisCleanup.js +1 -1
- package/dist/application/DirectAnalysisStatus.js +1 -1
- package/dist/application/Doctor.js +5 -3
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +6 -0
- package/dist/application/JsonFiles.js +6 -5
- package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
- package/dist/application/LinuxHopper.js +4 -12
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +9 -3
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +93 -7
- package/dist/application/Setup.js +54 -6
- package/dist/application/SetupClientConfiguration.js +116 -16
- package/dist/application/SetupHost.js +102 -24
- package/dist/application/SetupPlan.js +5 -8
- package/dist/application/SetupSkill.js +58 -39
- package/dist/application/SupportedClients.js +290 -65
- package/dist/application/Uninstall.js +158 -10
- package/dist/application/UpdateMaintenance.js +17 -21
- package/dist/application/Utf8JsonInput.js +7 -0
- package/dist/application/WebScriptExportService.js +131 -65
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/BinarySession.js +2 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +20 -15
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +176 -102
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
- package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +75 -32
- package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +62 -25
- package/dist/artifacts/inventory/scanReader.js +38 -11
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +5 -0
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +32 -10
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
- package/dist/browser/PlaywrightScenarioSession.js +127 -54
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +3 -3
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreBinaryCommands.js +0 -5
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +6 -1
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +17 -1
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +11 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/utilityCommands.js +66 -18
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +6 -0
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +2 -2
- package/dist/cliObservationOptions.js +3 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/directAnalysis.js +12 -4
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +10 -10
- package/dist/contracts/javascript/electronToolContracts.js +15 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionToolContracts.js +2 -2
- package/dist/contracts/sessionToolSchemas.js +6 -2
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +5 -3
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -6
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +2 -1
- package/dist/domain/analysisView/analysisView.js +52 -2
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +2 -2
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +35 -7
- package/dist/domain/artifactGraph.js +5 -3
- package/dist/domain/artifactIdentity.js +30 -2
- package/dist/domain/artifactInspection.js +3 -43
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +11 -12
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/evidence.js +2 -1
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
- package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
- package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
- package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
- package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
- package/dist/domain/javascript/javascriptAstValues.js +32 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
- package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
- package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
- package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonShape.js +63 -52
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/managed/managedApplicationGraph.js +37 -0
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +91 -1
- package/dist/domain/process/processCaptureExample.js +24 -0
- package/dist/domain/process/processCaptureValidation.js +79 -0
- package/dist/domain/process/processScenario.js +59 -7
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/referenceSourceGraph.js +25 -16
- package/dist/domain/referenceSourceImportParsing.js +6 -3
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/webBundleAnalyzerInspection.js +14 -2
- package/dist/domain/webCaptureDiff.js +102 -4
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +55 -24
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +33 -1
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +76 -4
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +1 -1
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +80 -39
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +8 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +3 -1
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/NativeMacOSProvider.js +91 -16
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +96 -39
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +28 -4
- package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessHarness.js +194 -26
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +97 -25
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +32 -3
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +49 -18
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +33 -5
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import ghidra.app.cmd.function.CreateFunctionCmd;
|
|
2
|
+
import ghidra.app.script.GhidraScript;
|
|
3
|
+
import ghidra.program.model.address.Address;
|
|
4
|
+
import ghidra.program.model.listing.*;
|
|
5
|
+
import ghidra.program.model.symbol.FlowType;
|
|
6
|
+
import ghidra.program.model.symbol.Reference;
|
|
7
|
+
import ghidra.program.model.pcode.PcodeOp;
|
|
8
|
+
import java.util.ArrayDeque;
|
|
9
|
+
import java.util.Deque;
|
|
10
|
+
import java.util.HashSet;
|
|
11
|
+
import java.util.Set;
|
|
12
|
+
import java.util.TreeSet;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Undo wrong no-return flags from auto-analysis. A function flagged no-return that contains a
|
|
16
|
+
* real RET is an ordinary function (stream readers, cxa_guard_acquire, ...). Known returning
|
|
17
|
+
* libc/TLS imports have no body to inspect, so clear their flags by exact external ABI name.
|
|
18
|
+
* Callers treated the call as a terminator and the decompiler truncated them. Clear the flag, then re-disassemble only
|
|
19
|
+
* the call sites of the functions that were cleared and refit their owning functions in place.
|
|
20
|
+
*/
|
|
21
|
+
public final class ReaGhidraNoReturnFix extends GhidraScript {
|
|
22
|
+
private static final Set<String> RETURNING_IMPORTS = Set.of(
|
|
23
|
+
"malloc", "__tls_get_addr", "memcpy", "memset", "strlen", "__errno_location");
|
|
24
|
+
|
|
25
|
+
@Override
|
|
26
|
+
public void run() throws Exception {
|
|
27
|
+
// Windows P0 does not admit analysis-database mutation.
|
|
28
|
+
if (System.getProperty("os.name", "").startsWith("Windows")) return;
|
|
29
|
+
FunctionManager fm = currentProgram.getFunctionManager();
|
|
30
|
+
Listing li = currentProgram.getListing();
|
|
31
|
+
Set<Address> cleared = new HashSet<>();
|
|
32
|
+
Deque<Address> pending = new ArrayDeque<>();
|
|
33
|
+
for (Function f : fm.getExternalFunctions()) {
|
|
34
|
+
monitor.checkCancelled();
|
|
35
|
+
// Do not apply import-name assumptions to local functions or to arbitrary externals.
|
|
36
|
+
if (!f.hasNoReturn() || !RETURNING_IMPORTS.contains(externalAbiName(f))) continue;
|
|
37
|
+
f.setNoReturn(false);
|
|
38
|
+
enqueueReturning(f, cleared, pending);
|
|
39
|
+
}
|
|
40
|
+
for (Function f : fm.getFunctions(true)) {
|
|
41
|
+
monitor.checkCancelled();
|
|
42
|
+
if (clearDecodedReturn(f, li)) {
|
|
43
|
+
enqueueReturning(f, cleared, pending);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
int redone = 0;
|
|
47
|
+
TreeSet<Address> owners = new TreeSet<>();
|
|
48
|
+
while (!pending.isEmpty()) {
|
|
49
|
+
Address target = pending.removeFirst();
|
|
50
|
+
TreeSet<Address> sites = new TreeSet<>();
|
|
51
|
+
// References include computed import calls after Ghidra resolves their destination.
|
|
52
|
+
// Collect before redisassembly mutates the reference table.
|
|
53
|
+
for (Reference reference : currentProgram.getReferenceManager().getReferencesTo(target)) {
|
|
54
|
+
monitor.checkCancelled();
|
|
55
|
+
sites.add(reference.getFromAddress());
|
|
56
|
+
}
|
|
57
|
+
for (Address s : sites) {
|
|
58
|
+
monitor.checkCancelled();
|
|
59
|
+
Instruction ins = li.getInstructionAt(s);
|
|
60
|
+
if (ins == null) continue;
|
|
61
|
+
FlowType ft = ins.getFlowType();
|
|
62
|
+
if (!(ft.isCall() && ft.isTerminal())) continue;
|
|
63
|
+
Address[] flows = ins.getFlows();
|
|
64
|
+
boolean callsTarget = false;
|
|
65
|
+
for (Address flow : flows) {
|
|
66
|
+
if (flow.equals(target)) callsTarget = true;
|
|
67
|
+
}
|
|
68
|
+
if (!callsTarget) continue;
|
|
69
|
+
// Do not redisassemble into an independently identified function.
|
|
70
|
+
Address next = ins.getMaxAddress().add(1);
|
|
71
|
+
if (fm.getFunctionAt(next) != null || !currentProgram.getMemory().contains(next)) continue;
|
|
72
|
+
Function owner = fm.getFunctionContaining(s);
|
|
73
|
+
if (owner != null && !owner.isThunk()) owners.add(owner.getEntryPoint());
|
|
74
|
+
clearListing(ins.getMinAddress(), ins.getMaxAddress());
|
|
75
|
+
disassemble(s);
|
|
76
|
+
redone++;
|
|
77
|
+
// Refit the body in place so the name, signature and calling convention survive.
|
|
78
|
+
if (owner != null && !owner.isThunk()) {
|
|
79
|
+
CreateFunctionCmd.fixupFunctionBody(currentProgram, owner, monitor);
|
|
80
|
+
// Auto-analysis may have propagated the false flag to this truncated caller.
|
|
81
|
+
// Its RET becomes visible only now; repair its callers in the same pass.
|
|
82
|
+
if (clearDecodedReturn(owner, li)) enqueueReturning(owner, cleared, pending);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// No analyzeChanges here: on libpl2.so it adds about 70 s, which pushes startup past the 330 s deadline.
|
|
87
|
+
println(
|
|
88
|
+
"REA no-return fix: cleared=" + cleared.size() + " sites=" + redone + " refit=" + owners.size());
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private void enqueueReturning(Function function, Set<Address> cleared, Deque<Address> pending) {
|
|
92
|
+
if (cleared.add(function.getEntryPoint())) pending.addLast(function.getEntryPoint());
|
|
93
|
+
// A thunk inherits the flag of the function it forwards to, including through other thunks.
|
|
94
|
+
Address[] thunks = function.getFunctionThunkAddresses(true);
|
|
95
|
+
if (thunks == null) return;
|
|
96
|
+
for (Address thunk : thunks) {
|
|
97
|
+
if (cleared.add(thunk)) pending.addLast(thunk);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private String externalAbiName(Function function) {
|
|
102
|
+
String name = function.getName();
|
|
103
|
+
// Mach-O stores C-linkage symbols with one object-format underscore prefix.
|
|
104
|
+
if (currentProgram.getExecutableFormat().contains("Mach-O") && name.startsWith("_"))
|
|
105
|
+
return name.substring(1);
|
|
106
|
+
return name;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private boolean clearDecodedReturn(Function function, Listing listing) throws Exception {
|
|
110
|
+
if (!function.hasNoReturn() || function.isThunk()) return false;
|
|
111
|
+
for (Instruction instruction : listing.getInstructions(function.getBody(), true)) {
|
|
112
|
+
monitor.checkCancelled();
|
|
113
|
+
FlowType flow = instruction.getFlowType();
|
|
114
|
+
if (flow.isJump() || flow.isCall()) continue;
|
|
115
|
+
for (PcodeOp operation : instruction.getPcode()) {
|
|
116
|
+
if (operation.getOpcode() != PcodeOp.RETURN) continue;
|
|
117
|
+
function.setNoReturn(false);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
|
+
import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
|
|
4
|
+
/** Environment key selecting the caller's adb binary. */
|
|
5
|
+
export const ADB_BINARY_ENV = "REA_ADB_PATH";
|
|
6
|
+
const VERSION_TIMEOUT_MS = 10_000;
|
|
7
|
+
const VERSION_MAX_OUTPUT_BYTES = 64 * 1024;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the caller-supplied adb binary. `REA_ADB_PATH` must be absolute so
|
|
10
|
+
* the selection stays explicit; without it, adb is resolved from `PATH` by
|
|
11
|
+
* the platform exec at run time, like any bring-your-own tool.
|
|
12
|
+
*/
|
|
13
|
+
export const resolveAdbBinary = (environment) => {
|
|
14
|
+
const configured = environment[ADB_BINARY_ENV];
|
|
15
|
+
if (configured === undefined || configured.trim() === "")
|
|
16
|
+
return { binary: "adb", pathSource: "path" };
|
|
17
|
+
if (!isAbsolute(configured))
|
|
18
|
+
throw new AdbConfigurationFailure("not_absolute", `${ADB_BINARY_ENV} must be an absolute path to the adb binary`, { configured_path: configured });
|
|
19
|
+
return { binary: configured, pathSource: "environment" };
|
|
20
|
+
};
|
|
21
|
+
export class AdbConfigurationFailure extends Error {
|
|
22
|
+
code;
|
|
23
|
+
diagnostics;
|
|
24
|
+
constructor(code, message, diagnostics = {}, options) {
|
|
25
|
+
super(message, options);
|
|
26
|
+
this.code = code;
|
|
27
|
+
this.diagnostics = diagnostics;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse `adb version` output. The first line carries the protocol version,
|
|
32
|
+
* `Version ` the build version (no colon), and `Installed as` the binary path.
|
|
33
|
+
*/
|
|
34
|
+
export const parseAdbVersionOutput = (stdout) => {
|
|
35
|
+
const build = /^Version\s+(\S.*)$/mu.exec(stdout);
|
|
36
|
+
const installed = /^Installed as\s+(.+)$/mu.exec(stdout);
|
|
37
|
+
return {
|
|
38
|
+
version: build === null ? null : build[1].trim(),
|
|
39
|
+
installedPath: installed === null ? null : installed[1].trim(),
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Probe the selected adb binary without contacting devices. `adb version`
|
|
44
|
+
* never starts the adb server, so this stays a pure client check.
|
|
45
|
+
*/
|
|
46
|
+
export const inspectAdbClient = async (selection, signal) => {
|
|
47
|
+
try {
|
|
48
|
+
const { stdout } = await execFileOutput(selection.binary, ["version"], {
|
|
49
|
+
timeout: VERSION_TIMEOUT_MS,
|
|
50
|
+
stopSignal: "SIGTERM",
|
|
51
|
+
maxBuffer: VERSION_MAX_OUTPUT_BYTES,
|
|
52
|
+
...(signal === undefined ? {} : { signal }),
|
|
53
|
+
});
|
|
54
|
+
return parseAdbVersionOutput(stdout);
|
|
55
|
+
}
|
|
56
|
+
catch (cause) {
|
|
57
|
+
const failure = execFileOutputFailure(cause);
|
|
58
|
+
if (signal?.aborted || failure?.code === "ABORT_ERR")
|
|
59
|
+
throw new AnalysisCancelledError("inspect_adb_client", { cause });
|
|
60
|
+
if (failure?.code === "ENOENT")
|
|
61
|
+
throw new AdbConfigurationFailure("binary_missing", `The selected adb binary was not found: ${selection.binary}`, {
|
|
62
|
+
selected_binary: selection.binary,
|
|
63
|
+
path_source: selection.pathSource,
|
|
64
|
+
remediation: `Set ${ADB_BINARY_ENV} to an absolute path to an existing adb binary`,
|
|
65
|
+
}, { cause });
|
|
66
|
+
throw new AdbConfigurationFailure("version_unresolved", "The selected adb binary did not report a usable version", {
|
|
67
|
+
selected_binary: selection.binary,
|
|
68
|
+
...(failure === undefined
|
|
69
|
+
? {}
|
|
70
|
+
: {
|
|
71
|
+
exit_code: failure.code,
|
|
72
|
+
stderr_excerpt: failure.stderr.slice(0, 512),
|
|
73
|
+
}),
|
|
74
|
+
}, { cause });
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
/** Availability in the shape shared by every provider. */
|
|
78
|
+
const rejectionCodeOf = (code) => code === "binary_missing"
|
|
79
|
+
? "executable_missing"
|
|
80
|
+
: code === "not_absolute"
|
|
81
|
+
? "not_configured"
|
|
82
|
+
: "version_unresolved";
|
|
83
|
+
export const adbConfigurationAvailability = (cause) => ({
|
|
84
|
+
status: "unavailable",
|
|
85
|
+
code: rejectionCodeOf(cause.code),
|
|
86
|
+
reason: cause.message,
|
|
87
|
+
diagnostics: { ...cause.diagnostics },
|
|
88
|
+
});
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsers for the exact adb and Package Manager output formats REA consumes.
|
|
3
|
+
*
|
|
4
|
+
* Each parser preserves what the tool actually printed: unparseable lines are
|
|
5
|
+
* retained rather than silently dropped, and derived classifications carry
|
|
6
|
+
* their evidence basis.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Device states adb prints after the serial, longest first so two-word
|
|
10
|
+
* states match before their single-word prefixes. A line whose remainder
|
|
11
|
+
* starts with none of them is not a device line.
|
|
12
|
+
*/
|
|
13
|
+
const DEVICE_STATES = [
|
|
14
|
+
"no permissions",
|
|
15
|
+
"unauthorized",
|
|
16
|
+
"authorizing",
|
|
17
|
+
"offline",
|
|
18
|
+
"recovery",
|
|
19
|
+
"sideload",
|
|
20
|
+
"connecting",
|
|
21
|
+
"bootloader",
|
|
22
|
+
"device",
|
|
23
|
+
"unknown",
|
|
24
|
+
"host",
|
|
25
|
+
];
|
|
26
|
+
const DEVICE_LINE = /^(\S+)\s+(.*)$/u;
|
|
27
|
+
const metadataValue = (remainder, key) => {
|
|
28
|
+
const match = new RegExp(`(?:^|\\s)${key}:(\\S+)`, "u").exec(remainder);
|
|
29
|
+
return match === null ? null : match[1];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Parse `adb devices -l` device lines. The banner, blank lines, and the
|
|
33
|
+
* daemon startup notices adb prints on first use are recognized separately;
|
|
34
|
+
* every other unrecognized line is returned for honest reporting.
|
|
35
|
+
*/
|
|
36
|
+
export const parseAdbDevicesOutput = (stdout) => {
|
|
37
|
+
const devices = [];
|
|
38
|
+
const unparsedLines = [];
|
|
39
|
+
let daemonStarted = false;
|
|
40
|
+
for (const rawLine of stdout.split(/\r?\n/u)) {
|
|
41
|
+
const line = rawLine.trimEnd();
|
|
42
|
+
if (line === "" || line.startsWith("List of devices attached"))
|
|
43
|
+
continue;
|
|
44
|
+
if (line.startsWith("* daemon")) {
|
|
45
|
+
if (line.includes("started successfully"))
|
|
46
|
+
daemonStarted = true;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const match = DEVICE_LINE.exec(line);
|
|
50
|
+
const state = DEVICE_STATES.find((candidate) => match?.[2]?.startsWith(candidate));
|
|
51
|
+
if (match === null || state === undefined) {
|
|
52
|
+
if (line.trim() !== "")
|
|
53
|
+
unparsedLines.push(line);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const serial = match[1];
|
|
57
|
+
const remainder = match[2].slice(state.length);
|
|
58
|
+
const usb = metadataValue(remainder, "usb");
|
|
59
|
+
const transportIdText = metadataValue(remainder, "transport_id");
|
|
60
|
+
const parsedTransportId = transportIdText === null || !/^\d+$/u.test(transportIdText)
|
|
61
|
+
? null
|
|
62
|
+
: Number(transportIdText);
|
|
63
|
+
const isEmulator = /^emulator-\d+$/u.test(serial);
|
|
64
|
+
const kind = isEmulator
|
|
65
|
+
? "emulator"
|
|
66
|
+
: usb !== null
|
|
67
|
+
? "physical"
|
|
68
|
+
: "unknown";
|
|
69
|
+
devices.push({
|
|
70
|
+
serial,
|
|
71
|
+
state,
|
|
72
|
+
transport: usb !== null
|
|
73
|
+
? "usb"
|
|
74
|
+
: isEmulator || serial.includes(":")
|
|
75
|
+
? "tcp"
|
|
76
|
+
: "unknown",
|
|
77
|
+
product: metadataValue(remainder, "product"),
|
|
78
|
+
model: metadataValue(remainder, "model"),
|
|
79
|
+
device: metadataValue(remainder, "device"),
|
|
80
|
+
transport_id: parsedTransportId,
|
|
81
|
+
kind,
|
|
82
|
+
kind_basis: kind === "emulator"
|
|
83
|
+
? "emulator_serial_prefix"
|
|
84
|
+
: kind === "physical"
|
|
85
|
+
? "usb_transport"
|
|
86
|
+
: "none",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return { devices, unparsedLines, daemonStarted };
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Properties projected from a `getprop` dump. The whitelist keeps device
|
|
93
|
+
* inspection to build identity facts; a full dump is out of scope.
|
|
94
|
+
*/
|
|
95
|
+
const DEVICE_PROPERTY_WHITELIST = [
|
|
96
|
+
"ro.build.version.release",
|
|
97
|
+
"ro.build.version.sdk",
|
|
98
|
+
"ro.build.version.security_patch",
|
|
99
|
+
"ro.build.id",
|
|
100
|
+
"ro.build.fingerprint",
|
|
101
|
+
"ro.build.characteristics",
|
|
102
|
+
"ro.debuggable",
|
|
103
|
+
"ro.kernel.qemu",
|
|
104
|
+
"ro.product.brand",
|
|
105
|
+
"ro.product.device",
|
|
106
|
+
"ro.product.manufacturer",
|
|
107
|
+
"ro.product.model",
|
|
108
|
+
"ro.product.cpu.abilist",
|
|
109
|
+
];
|
|
110
|
+
/** Parse a full `getprop` dump into `[name]: [value]` pairs. */
|
|
111
|
+
export const parseGetpropOutput = (stdout) => {
|
|
112
|
+
const values = new Map();
|
|
113
|
+
for (const rawLine of stdout.split(/\r?\n/u)) {
|
|
114
|
+
const match = /^\[([^\]]+)\]:\s*\[(.*)\]$/u.exec(rawLine.trim());
|
|
115
|
+
if (match === null)
|
|
116
|
+
continue;
|
|
117
|
+
values.set(match[1], match[2]);
|
|
118
|
+
}
|
|
119
|
+
const properties = DEVICE_PROPERTY_WHITELIST.flatMap((name) => {
|
|
120
|
+
const value = values.get(name);
|
|
121
|
+
return value === undefined || value === ""
|
|
122
|
+
? []
|
|
123
|
+
: [{ name, value }];
|
|
124
|
+
});
|
|
125
|
+
const qemu = values.get("ro.kernel.qemu");
|
|
126
|
+
return {
|
|
127
|
+
properties,
|
|
128
|
+
emulatorObserved: qemu === undefined ? null : qemu === "1",
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
const PACKAGE_LINE = /^package:(.+)=([^\s=]+)$/u;
|
|
132
|
+
/** Parse `pm list packages -f` lines, retaining unrecognized lines. */
|
|
133
|
+
export const parsePackageListOutput = (stdout) => {
|
|
134
|
+
const packages = [];
|
|
135
|
+
const unparsedLines = [];
|
|
136
|
+
for (const rawLine of stdout.split(/\r?\n/u)) {
|
|
137
|
+
const line = rawLine.trim();
|
|
138
|
+
if (line === "")
|
|
139
|
+
continue;
|
|
140
|
+
const match = PACKAGE_LINE.exec(line);
|
|
141
|
+
if (match === null) {
|
|
142
|
+
unparsedLines.push(line);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
packages.push({
|
|
146
|
+
package_name: match[2],
|
|
147
|
+
base_apk_device_path: match[1],
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return { packages, unparsedLines };
|
|
151
|
+
};
|
|
152
|
+
const fileNameOf = (devicePath) => {
|
|
153
|
+
const parts = devicePath.split(/\//u);
|
|
154
|
+
return parts[parts.length - 1] ?? devicePath;
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Parse `pm path PACKAGE` lines. The base/split role is derived from the file
|
|
158
|
+
* name (`base.apk`, `split_*.apk`), which is the only signal the output
|
|
159
|
+
* carries; any other name reports an unknown role.
|
|
160
|
+
*/
|
|
161
|
+
export const parsePmPathOutput = (stdout) => {
|
|
162
|
+
const paths = [];
|
|
163
|
+
const unparsedLines = [];
|
|
164
|
+
for (const rawLine of stdout.split(/\r?\n/u)) {
|
|
165
|
+
const line = rawLine.trim();
|
|
166
|
+
if (line === "")
|
|
167
|
+
continue;
|
|
168
|
+
const match = /^package:(\S+)$/u.exec(line);
|
|
169
|
+
if (match === null) {
|
|
170
|
+
unparsedLines.push(line);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const devicePath = match[1];
|
|
174
|
+
const fileName = fileNameOf(devicePath);
|
|
175
|
+
paths.push({
|
|
176
|
+
device_path: devicePath,
|
|
177
|
+
file_name: fileName,
|
|
178
|
+
role: fileName === "base.apk"
|
|
179
|
+
? "base"
|
|
180
|
+
: fileName.startsWith("split_") && fileName.endsWith(".apk")
|
|
181
|
+
? "split"
|
|
182
|
+
: "unknown",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return { paths, unparsedLines };
|
|
186
|
+
};
|