rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -6,10 +6,11 @@ import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
|
6
6
|
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisInputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
7
7
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
8
8
|
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
9
|
+
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
9
10
|
import { err, ok } from "../domain/result.js";
|
|
10
11
|
import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
|
|
11
12
|
import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
|
|
12
|
-
import { resolveJadxConfiguration } from "./JadxConfiguration.js";
|
|
13
|
+
import { inspectJadxAvailability, resolveJadxConfiguration, } from "./JadxConfiguration.js";
|
|
13
14
|
import { JadxSession } from "./JadxSession.js";
|
|
14
15
|
const OPERATION_TIMEOUT_MS = 120_000;
|
|
15
16
|
const BRIDGE_SOURCE = fileURLToPath(new URL("../../bridge/android/ReaJadxBridge.java", import.meta.url));
|
|
@@ -38,6 +39,19 @@ const executionError = (context) => {
|
|
|
38
39
|
});
|
|
39
40
|
if (cause instanceof z.ZodError)
|
|
40
41
|
return new AnalysisOutputError(request.operation, "JADX response violated the pinned upstream protocol", { cause });
|
|
42
|
+
if (session !== undefined && !session.initialized()) {
|
|
43
|
+
const stderr = session.transport.diagnostics();
|
|
44
|
+
const reason = `Java could not start REA's Android bridge using ${session.transport.options.command}: ${cause instanceof Error ? cause.message : String(cause)}.${stderr.length === 0 ? "" : ` Java diagnostics: ${stderr}`} Select a full JDK including jdk.compiler via JAVA_HOME, or a working java on PATH; verify it with java --list-modules. A JRE cannot compile REA's source bridge. If the JDK works, verify the REA bridge and configured JADX JAR installation.`;
|
|
45
|
+
return new AnalysisCapabilityUnavailableError("jadx", request.operation, reason, {
|
|
46
|
+
cause,
|
|
47
|
+
userMessage: reason,
|
|
48
|
+
capturedOutput: {
|
|
49
|
+
stdout: "",
|
|
50
|
+
stderr,
|
|
51
|
+
truncated: session.transport.diagnosticsTruncated(),
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
41
55
|
return new ProviderAdapterError("jadx", request.operation, {
|
|
42
56
|
cause,
|
|
43
57
|
diagnostics: {
|
|
@@ -46,14 +60,14 @@ const executionError = (context) => {
|
|
|
46
60
|
},
|
|
47
61
|
});
|
|
48
62
|
};
|
|
49
|
-
const cleanup = async (
|
|
63
|
+
const cleanup = async (resources) => {
|
|
64
|
+
const { session, root, previousError } = resources;
|
|
50
65
|
const diagnostics = {
|
|
51
|
-
previous_error:
|
|
52
|
-
? null
|
|
53
|
-
: { tag: previous.error._tag, message: previous.error.message },
|
|
66
|
+
previous_error: previousError === undefined ? null : projectAnalysisError(previousError),
|
|
54
67
|
};
|
|
55
68
|
try {
|
|
56
69
|
await session?.close();
|
|
70
|
+
resources.session = undefined;
|
|
57
71
|
}
|
|
58
72
|
catch (cause) {
|
|
59
73
|
// Retain an uncertain workspace until the caller can resolve process ownership.
|
|
@@ -66,33 +80,38 @@ const cleanup = async (session, root, previous) => {
|
|
|
66
80
|
provider_cleanup: cause instanceof ProviderCleanupError
|
|
67
81
|
? (cause.diagnostics ?? null)
|
|
68
82
|
: null,
|
|
69
|
-
}, { cause }));
|
|
83
|
+
}, { cause: previousError ?? cause }));
|
|
70
84
|
}
|
|
71
85
|
try {
|
|
72
86
|
await root?.close();
|
|
87
|
+
resources.root = undefined;
|
|
73
88
|
}
|
|
74
89
|
catch (cause) {
|
|
75
90
|
return err(new ProviderCleanupError("jadx", [root?.path ?? "unknown"], {
|
|
76
91
|
...diagnostics,
|
|
77
92
|
reason: cause instanceof Error ? cause.message : String(cause),
|
|
78
|
-
}, { cause }));
|
|
93
|
+
}, { cause: previousError ?? cause }));
|
|
79
94
|
}
|
|
80
|
-
return
|
|
95
|
+
return ok(undefined);
|
|
81
96
|
};
|
|
82
97
|
/** One serialized, immutable APK session per REA instance, retired on idle or shutdown. */
|
|
83
98
|
export class JadxProvider {
|
|
84
99
|
environment;
|
|
85
100
|
launcher;
|
|
86
101
|
#tail = Promise.resolve();
|
|
87
|
-
#
|
|
102
|
+
#pendingCleanup;
|
|
88
103
|
#retained;
|
|
89
104
|
#idle;
|
|
90
105
|
#shutdown = new AbortController();
|
|
91
106
|
#closePromise;
|
|
92
|
-
constructor(environment
|
|
107
|
+
constructor(environment, launcher) {
|
|
93
108
|
this.environment = environment;
|
|
94
109
|
this.launcher = launcher;
|
|
95
110
|
}
|
|
111
|
+
/** Report actual local prerequisites without starting JADX or opening a target. */
|
|
112
|
+
inspectAvailability(signal) {
|
|
113
|
+
return inspectJadxAvailability(this.environment, signal);
|
|
114
|
+
}
|
|
96
115
|
/** Serialize expensive work and bind both raw and normalized results to the APK. */
|
|
97
116
|
async execute(target, request, options) {
|
|
98
117
|
if (this.#shutdown.signal.aborted)
|
|
@@ -115,12 +134,13 @@ export class JadxProvider {
|
|
|
115
134
|
try {
|
|
116
135
|
if (signal.aborted)
|
|
117
136
|
return err(new AnalysisCancelledError(request.operation));
|
|
118
|
-
if (this.#cleanupFailure !== undefined)
|
|
119
|
-
return err(this.#cleanupFailure);
|
|
120
137
|
clearTimeout(this.#idle);
|
|
138
|
+
if (this.#pendingCleanup !== undefined) {
|
|
139
|
+
const retired = await this.#retire();
|
|
140
|
+
if (!retired.ok)
|
|
141
|
+
return retired;
|
|
142
|
+
}
|
|
121
143
|
const outcome = await this.#execute(target, request, { signal });
|
|
122
|
-
if (!outcome.ok && outcome.error.cleanupIncomplete)
|
|
123
|
-
this.#cleanupFailure = outcome.error;
|
|
124
144
|
if (outcome.ok)
|
|
125
145
|
this.#scheduleIdle();
|
|
126
146
|
return outcome;
|
|
@@ -133,24 +153,39 @@ export class JadxProvider {
|
|
|
133
153
|
close() {
|
|
134
154
|
this.#shutdown.abort();
|
|
135
155
|
clearTimeout(this.#idle);
|
|
136
|
-
this.#closePromise ??= this.#tail
|
|
156
|
+
this.#closePromise ??= this.#tail
|
|
157
|
+
.then(async () => {
|
|
158
|
+
const retired = await this.#retire();
|
|
159
|
+
if (!retired.ok)
|
|
160
|
+
throw retired.error;
|
|
161
|
+
})
|
|
162
|
+
.catch((cause) => {
|
|
163
|
+
this.#closePromise = undefined;
|
|
164
|
+
throw cause;
|
|
165
|
+
});
|
|
137
166
|
return this.#closePromise;
|
|
138
167
|
}
|
|
139
168
|
async #retire() {
|
|
140
|
-
if (this.#
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.#
|
|
147
|
-
throw result.error;
|
|
169
|
+
if (this.#pendingCleanup === undefined && this.#retained !== undefined) {
|
|
170
|
+
this.#pendingCleanup = {
|
|
171
|
+
session: this.#retained.session,
|
|
172
|
+
root: this.#retained.root,
|
|
173
|
+
previousError: undefined,
|
|
174
|
+
};
|
|
175
|
+
this.#retained = undefined;
|
|
148
176
|
}
|
|
177
|
+
if (this.#pendingCleanup === undefined)
|
|
178
|
+
return ok(undefined);
|
|
179
|
+
const result = await cleanup(this.#pendingCleanup);
|
|
180
|
+
if (result.ok)
|
|
181
|
+
this.#pendingCleanup = undefined;
|
|
182
|
+
return result;
|
|
149
183
|
}
|
|
150
184
|
#scheduleIdle() {
|
|
151
185
|
this.#idle = setTimeout(() => {
|
|
152
|
-
|
|
153
|
-
|
|
186
|
+
this.#tail = this.#tail.then(async () => {
|
|
187
|
+
await this.#retire();
|
|
188
|
+
});
|
|
154
189
|
}, 60_000);
|
|
155
190
|
this.#idle.unref();
|
|
156
191
|
}
|
|
@@ -161,11 +196,10 @@ export class JadxProvider {
|
|
|
161
196
|
: AbortSignal.any([options.signal, timeout]);
|
|
162
197
|
let root;
|
|
163
198
|
let session;
|
|
164
|
-
let outcome;
|
|
165
199
|
try {
|
|
166
200
|
if (target.format !== "apk")
|
|
167
201
|
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
|
|
168
|
-
const configuration = await resolveJadxConfiguration(this.environment, request.operation);
|
|
202
|
+
const configuration = await resolveJadxConfiguration(this.environment, request.operation, signal);
|
|
169
203
|
signal.throwIfAborted();
|
|
170
204
|
const jarHash = await hashAndroidFile(configuration.jar);
|
|
171
205
|
const bridgeHash = await hashAndroidFile(BRIDGE_SOURCE);
|
|
@@ -193,8 +227,11 @@ export class JadxProvider {
|
|
|
193
227
|
this.environment.JAVA_HOME,
|
|
194
228
|
],
|
|
195
229
|
});
|
|
196
|
-
if (this.#retained !== undefined && this.#retained.key !== key)
|
|
197
|
-
await this.#retire();
|
|
230
|
+
if (this.#retained !== undefined && this.#retained.key !== key) {
|
|
231
|
+
const retired = await this.#retire();
|
|
232
|
+
if (!retired.ok)
|
|
233
|
+
return retired;
|
|
234
|
+
}
|
|
198
235
|
let retained = this.#retained;
|
|
199
236
|
if (retained === undefined) {
|
|
200
237
|
root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
|
|
@@ -230,7 +267,7 @@ export class JadxProvider {
|
|
|
230
267
|
root = retained.root;
|
|
231
268
|
session = retained.session;
|
|
232
269
|
const { snapshot } = retained;
|
|
233
|
-
outcome = ok(await session.execute({
|
|
270
|
+
const outcome = ok(await session.execute({
|
|
234
271
|
request,
|
|
235
272
|
target,
|
|
236
273
|
snapshot,
|
|
@@ -243,18 +280,20 @@ export class JadxProvider {
|
|
|
243
280
|
return outcome;
|
|
244
281
|
}
|
|
245
282
|
catch (cause) {
|
|
246
|
-
|
|
283
|
+
const previousError = executionError({
|
|
247
284
|
cause,
|
|
248
285
|
request,
|
|
249
286
|
timeout,
|
|
250
287
|
signal: options?.signal,
|
|
251
288
|
session,
|
|
252
|
-
})
|
|
289
|
+
});
|
|
290
|
+
// Admission can fail before selecting an existing session for execution.
|
|
291
|
+
root ??= this.#retained?.root;
|
|
292
|
+
session ??= this.#retained?.session;
|
|
293
|
+
this.#retained = undefined;
|
|
294
|
+
this.#pendingCleanup = { session, root, previousError };
|
|
295
|
+
const retired = await this.#retire();
|
|
296
|
+
return retired.ok ? err(previousError) : retired;
|
|
253
297
|
}
|
|
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;
|
|
258
|
-
return cleanup(session, root, outcome);
|
|
259
298
|
}
|
|
260
299
|
}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { Client } from "@modelcontextprotocol/client";
|
|
2
2
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
3
|
-
import { AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
4
4
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
5
5
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
6
6
|
import { analyzeJadxRequest } from "./JadxAnalysis.js";
|
|
7
7
|
import { JadxMcpTransport } from "./JadxMcpTransport.js";
|
|
8
|
-
import { jadxLoadSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
|
|
8
|
+
import { jadxLoadSchema, jadxInputFailureSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
|
|
9
9
|
import { JADX_BRIDGE_IDENTITY, JADX_RELEASE, JADX_PROVIDER_IDENTITY, JADX_LIMITATIONS, } from "./JadxRelease.js";
|
|
10
10
|
/** One owned engine connection; its wire protocol stays inside the Android adapter. */
|
|
11
11
|
export class JadxSession {
|
|
12
12
|
transport;
|
|
13
13
|
#client = new Client({ name: "rea-android-adapter", version: "1" });
|
|
14
14
|
#loaded;
|
|
15
|
+
#connected = false;
|
|
15
16
|
constructor(options, launcher) {
|
|
16
17
|
this.transport = new JadxMcpTransport(options, launcher);
|
|
17
18
|
}
|
|
@@ -26,8 +27,10 @@ export class JadxSession {
|
|
|
26
27
|
signal.throwIfAborted();
|
|
27
28
|
this.transport.beginOperation();
|
|
28
29
|
const raw = [];
|
|
29
|
-
if (this.#
|
|
30
|
+
if (!this.#connected) {
|
|
30
31
|
await this.#client.connect(this.transport, { timeout: 30_000 });
|
|
32
|
+
this.#connected = true;
|
|
33
|
+
}
|
|
31
34
|
const server = this.#client.getServerVersion();
|
|
32
35
|
if (server?.name !== JADX_BRIDGE_IDENTITY.name ||
|
|
33
36
|
server.version !== JADX_BRIDGE_IDENTITY.version)
|
|
@@ -73,6 +76,10 @@ export class JadxSession {
|
|
|
73
76
|
signal.removeEventListener("abort", abort);
|
|
74
77
|
}
|
|
75
78
|
}
|
|
79
|
+
/** Whether the selected Java runtime established the REA bridge protocol. */
|
|
80
|
+
initialized() {
|
|
81
|
+
return this.#connected;
|
|
82
|
+
}
|
|
76
83
|
/** Join owned cleanup even if SDK connection teardown itself fails. */
|
|
77
84
|
async close() {
|
|
78
85
|
try {
|
|
@@ -92,7 +99,18 @@ export class JadxSession {
|
|
|
92
99
|
input,
|
|
93
100
|
response: jsonValueSchema.parse(response),
|
|
94
101
|
});
|
|
95
|
-
if (envelope.failed)
|
|
102
|
+
if (envelope.failed) {
|
|
103
|
+
if (envelope.text.startsWith("{")) {
|
|
104
|
+
const failure = jadxInputFailureSchema.safeParse(parseJadxJson(envelope.text, request.operation));
|
|
105
|
+
if (failure.success)
|
|
106
|
+
throw new AnalysisInputError(request.operation, undefined, [
|
|
107
|
+
{
|
|
108
|
+
path: [failure.data.field],
|
|
109
|
+
reason: "invalid_value",
|
|
110
|
+
message: failure.data.message,
|
|
111
|
+
},
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
96
114
|
throw new ProviderAdapterError("jadx", request.operation, {
|
|
97
115
|
diagnostics: {
|
|
98
116
|
upstream_operation: name,
|
|
@@ -101,6 +119,7 @@ export class JadxSession {
|
|
|
101
119
|
target_sha256: target.sha256,
|
|
102
120
|
},
|
|
103
121
|
});
|
|
122
|
+
}
|
|
104
123
|
return envelope.text;
|
|
105
124
|
};
|
|
106
125
|
return {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
|
|
2
2
|
import {} from "../domain/analysisErrorBase.js";
|
|
3
|
-
import {
|
|
3
|
+
import { analysisBookmarkSchema } from "../domain/hopperValues.js";
|
|
4
|
+
import { resolveAnalysisDocument } from "./AnalysisDocument.js";
|
|
4
5
|
import { err, ok } from "../domain/result.js";
|
|
5
6
|
const parameters = (document, address) => ({
|
|
6
7
|
...(document === undefined ? {} : { document }),
|
|
@@ -42,7 +43,7 @@ export const getNavigationContext = async (analysis, input, signal) => {
|
|
|
42
43
|
};
|
|
43
44
|
/** Inspect bounded provider-neutral facets at one explicit reproducible address. */
|
|
44
45
|
export const inspectAddressContext = async (analysis, input, signal) => {
|
|
45
|
-
const document = await
|
|
46
|
+
const document = await resolveAnalysisDocument(analysis, input.document, signal);
|
|
46
47
|
if (!document.ok)
|
|
47
48
|
return document;
|
|
48
49
|
const args = parameters(document.value, input.address);
|
|
@@ -75,30 +76,6 @@ export const inspectAddressContext = async (analysis, input, signal) => {
|
|
|
75
76
|
: bookmarks,
|
|
76
77
|
});
|
|
77
78
|
};
|
|
78
|
-
const resolveDocument = async (analysis, document, signal) => {
|
|
79
|
-
if (document !== undefined)
|
|
80
|
-
return ok(document);
|
|
81
|
-
const current = await analysis.execute("current_document", {}, executionOptions(signal));
|
|
82
|
-
if (!current.ok) {
|
|
83
|
-
if (!(current.error instanceof AnalysisCapabilityUnavailableError))
|
|
84
|
-
return current;
|
|
85
|
-
const listed = await analysis.execute("list_documents", {}, executionOptions(signal));
|
|
86
|
-
if (!listed.ok)
|
|
87
|
-
return listed;
|
|
88
|
-
const parsed = parseDocuments(listed.value.result);
|
|
89
|
-
if (!parsed.ok)
|
|
90
|
-
return err(new AnalysisOutputError("list_documents", "expected one document identity when resolving a headless provider", { cause: parsed.error }));
|
|
91
|
-
if (parsed.value.length !== 1)
|
|
92
|
-
return err(new AnalysisOutputError("list_documents", `expected exactly one document identity for a provider without current-document selection, received ${parsed.value.length}`));
|
|
93
|
-
const [documentName] = parsed.value;
|
|
94
|
-
if (documentName === undefined)
|
|
95
|
-
return err(new AnalysisOutputError("list_documents", "provider returned no document identity"));
|
|
96
|
-
return ok(documentName);
|
|
97
|
-
}
|
|
98
|
-
return typeof current.value.result === "string"
|
|
99
|
-
? ok(current.value.result)
|
|
100
|
-
: err(new AnalysisOutputError("current_document", "expected a document identity string"));
|
|
101
|
-
};
|
|
102
79
|
const facet = (result, operation) => result?.ok === true
|
|
103
80
|
? { state: "available", value: result.value.result }
|
|
104
81
|
: {
|
|
@@ -139,19 +116,15 @@ const matchingBookmarks = (value, address) => {
|
|
|
139
116
|
reason: "list_bookmarks returned malformed output; expected an array.",
|
|
140
117
|
remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
|
|
141
118
|
};
|
|
142
|
-
|
|
119
|
+
const parsed = analysisBookmarkSchema.array().safeParse(value);
|
|
120
|
+
if (!parsed.success)
|
|
143
121
|
return {
|
|
144
122
|
state: "unavailable",
|
|
145
|
-
reason: "list_bookmarks returned malformed entries; expected address and name
|
|
123
|
+
reason: "list_bookmarks returned malformed entries; expected an address string and a string or null name.",
|
|
146
124
|
remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
|
|
147
125
|
};
|
|
148
126
|
return {
|
|
149
127
|
state: "available",
|
|
150
|
-
value:
|
|
128
|
+
value: parsed.data.filter((bookmark) => bookmark.address === address),
|
|
151
129
|
};
|
|
152
130
|
};
|
|
153
|
-
const isBookmark = (value) => typeof value === "object" &&
|
|
154
|
-
value !== null &&
|
|
155
|
-
!Array.isArray(value) &&
|
|
156
|
-
typeof value.address === "string" &&
|
|
157
|
-
typeof value.name === "string";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
2
|
+
import { parseDocuments } from "../domain/hopperValues.js";
|
|
3
|
+
import { err, ok } from "../domain/result.js";
|
|
4
|
+
const executionOptions = (signal) => signal === undefined ? undefined : { signal };
|
|
5
|
+
/** Resolve an explicit or provider-selected document without guessing among candidates. */
|
|
6
|
+
export const resolveAnalysisDocument = async (analysis, document, signal) => {
|
|
7
|
+
if (document !== undefined)
|
|
8
|
+
return ok(document);
|
|
9
|
+
if (signal?.aborted === true)
|
|
10
|
+
return err(new AnalysisCancelledError("current_document"));
|
|
11
|
+
const current = await analysis.execute("current_document", {}, executionOptions(signal));
|
|
12
|
+
if (!current.ok) {
|
|
13
|
+
if (!(current.error instanceof AnalysisCapabilityUnavailableError))
|
|
14
|
+
return current;
|
|
15
|
+
const listed = await analysis.execute("list_documents", {}, executionOptions(signal));
|
|
16
|
+
if (!listed.ok)
|
|
17
|
+
return listed;
|
|
18
|
+
const parsed = parseDocuments(listed.value.result);
|
|
19
|
+
if (!parsed.ok)
|
|
20
|
+
return err(new AnalysisOutputError("list_documents", "expected one document identity when resolving a headless provider", { cause: parsed.error }));
|
|
21
|
+
if (parsed.value.length !== 1)
|
|
22
|
+
return err(new AnalysisOutputError("list_documents", `expected exactly one document identity for a provider without current-document selection, received ${parsed.value.length}`));
|
|
23
|
+
const [documentName] = parsed.value;
|
|
24
|
+
if (documentName === undefined || documentName.length === 0)
|
|
25
|
+
return err(new AnalysisOutputError("list_documents", "provider returned no document identity"));
|
|
26
|
+
return ok(documentName);
|
|
27
|
+
}
|
|
28
|
+
return typeof current.value.result === "string" &&
|
|
29
|
+
current.value.result.length > 0
|
|
30
|
+
? ok(current.value.result)
|
|
31
|
+
: err(new AnalysisOutputError("current_document", "expected a nonempty document identity string"));
|
|
32
|
+
};
|
|
@@ -6,6 +6,7 @@ import { z } from "zod";
|
|
|
6
6
|
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
7
7
|
import { isPathWithinRoot } from "../domain/localPath.js";
|
|
8
8
|
import { parseXmlPropertyList } from "../domain/propertyListKeys.js";
|
|
9
|
+
import { decodeXmlPlistText } from "../domain/propertyListXmlText.js";
|
|
9
10
|
import { err, ok } from "../domain/result.js";
|
|
10
11
|
const execFileAsync = promisify(execFile);
|
|
11
12
|
const BUNDLE_LAYOUTS = [
|
|
@@ -18,23 +19,31 @@ const BUNDLE_LAYOUTS = [
|
|
|
18
19
|
// iOS-style bundles, as extracted from an IPA, keep both at the root.
|
|
19
20
|
{ plist: ["Info.plist"], programs: [], programsLabel: "the bundle root" },
|
|
20
21
|
];
|
|
22
|
+
const defaultFileSystem = { readFile, realpath };
|
|
21
23
|
/**
|
|
22
24
|
* Resolve an app bundle directory to its declared program file. macOS and
|
|
23
25
|
* flat iOS-style layouts are read directly. An iOS app installed on a Mac is
|
|
24
26
|
* a wrapper whose `Wrapper` directory holds the iOS bundle; that bundle is
|
|
25
27
|
* found by listing `Wrapper`, never by following the `WrappedBundle` link.
|
|
26
28
|
*/
|
|
27
|
-
export const resolveAppBundleExecutable = async (path) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
export const resolveAppBundleExecutable = async (path, fileSystem = defaultFileSystem) => {
|
|
30
|
+
try {
|
|
31
|
+
const layout = await presentLayout(path);
|
|
32
|
+
if (layout !== undefined)
|
|
33
|
+
return resolveLayoutExecutable(path, layout, fileSystem);
|
|
34
|
+
const wrapped = await wrappedBundle(path);
|
|
35
|
+
if (wrapped !== undefined) {
|
|
36
|
+
const wrappedLayout = await presentLayout(wrapped);
|
|
37
|
+
if (wrappedLayout !== undefined)
|
|
38
|
+
return resolveLayoutExecutable(wrapped, wrappedLayout, fileSystem);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (cause) {
|
|
42
|
+
if (cause instanceof BinaryTargetError)
|
|
43
|
+
return err(cause);
|
|
44
|
+
return err(new BinaryTargetError(path, errorReason(cause, path), { cause }));
|
|
36
45
|
}
|
|
37
|
-
return err(new BinaryTargetError(path,
|
|
46
|
+
return err(new BinaryTargetError(path, `app Info.plist is missing or no supported bundle layout was found: ${path}`, {
|
|
38
47
|
cause: new Error("No Contents/Info.plist, root Info.plist, or single Wrapper/*.app bundle was found"),
|
|
39
48
|
}));
|
|
40
49
|
};
|
|
@@ -56,13 +65,34 @@ const layoutPlistPresent = async (path) => {
|
|
|
56
65
|
catch (cause) {
|
|
57
66
|
if (isAbsence(cause))
|
|
58
67
|
return false;
|
|
68
|
+
if (isPermissionDenied(cause))
|
|
69
|
+
throw new BinaryTargetError(path, `permission denied inspecting app Info.plist ${path}`, { cause });
|
|
59
70
|
throw cause;
|
|
60
71
|
}
|
|
61
72
|
};
|
|
62
73
|
const isAbsence = (cause) => {
|
|
63
|
-
const code =
|
|
74
|
+
const code = errorCode(cause);
|
|
64
75
|
return code === "ENOENT" || code === "ENOTDIR";
|
|
65
76
|
};
|
|
77
|
+
const errorCode = (cause) => cause instanceof Error ? Reflect.get(cause, "code") : undefined;
|
|
78
|
+
const codeDescription = (cause) => {
|
|
79
|
+
const code = errorCode(cause);
|
|
80
|
+
return typeof code === "string" || typeof code === "number"
|
|
81
|
+
? ` (${String(code)})`
|
|
82
|
+
: "";
|
|
83
|
+
};
|
|
84
|
+
const isSystemErrorCode = (cause) => {
|
|
85
|
+
const code = errorCode(cause);
|
|
86
|
+
return (typeof code === "string" &&
|
|
87
|
+
/^[A-Z][A-Z0-9_]+$/u.test(code) &&
|
|
88
|
+
!code.startsWith("ERR_"));
|
|
89
|
+
};
|
|
90
|
+
const isPermissionDenied = (cause) => errorCode(cause) === "EACCES" || errorCode(cause) === "EPERM";
|
|
91
|
+
const errorReason = (cause, path) => isPermissionDenied(cause)
|
|
92
|
+
? `permission denied accessing app bundle path ${path}`
|
|
93
|
+
: isAbsence(cause)
|
|
94
|
+
? `app bundle path is missing: ${path}`
|
|
95
|
+
: `could not inspect app bundle path ${path}`;
|
|
66
96
|
/** The single real `.app` directory inside an iOS-on-Mac `Wrapper`. */
|
|
67
97
|
const wrappedBundle = async (bundle) => {
|
|
68
98
|
const wrapper = join(bundle, "Wrapper");
|
|
@@ -81,20 +111,32 @@ const wrappedBundle = async (bundle) => {
|
|
|
81
111
|
? join(wrapper, app.name)
|
|
82
112
|
: undefined;
|
|
83
113
|
};
|
|
84
|
-
const resolveLayoutExecutable = async (bundle, layout) => {
|
|
114
|
+
const resolveLayoutExecutable = async (bundle, layout, fileSystem) => {
|
|
85
115
|
const plistPath = join(bundle, ...layout.plist);
|
|
116
|
+
let plist;
|
|
117
|
+
try {
|
|
118
|
+
plist = await fileSystem.readFile(plistPath);
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
return err(new BinaryTargetError(plistPath, isPermissionDenied(cause)
|
|
122
|
+
? `permission denied reading app Info.plist ${plistPath}`
|
|
123
|
+
: isAbsence(cause)
|
|
124
|
+
? `app Info.plist is missing: ${plistPath}`
|
|
125
|
+
: `could not read app Info.plist ${plistPath}${codeDescription(cause)}`, { cause }));
|
|
126
|
+
}
|
|
86
127
|
let name;
|
|
87
128
|
try {
|
|
88
|
-
const plist = await readFile(plistPath);
|
|
89
129
|
name =
|
|
90
130
|
plist.subarray(0, 6).toString("ascii") === "bplist"
|
|
91
|
-
? await readBinaryPlistExecutable(plistPath)
|
|
92
|
-
: parseXmlPlistExecutable(plist
|
|
131
|
+
? await (fileSystem.decodeBinaryPlist ?? readBinaryPlistExecutable)(plistPath)
|
|
132
|
+
: parseXmlPlistExecutable(decodeXmlPlistText(plist));
|
|
93
133
|
}
|
|
94
134
|
catch (cause) {
|
|
95
|
-
return err(new BinaryTargetError(
|
|
96
|
-
cause
|
|
97
|
-
|
|
135
|
+
return err(new BinaryTargetError(plistPath, isPermissionDenied(cause)
|
|
136
|
+
? `permission denied decoding app Info.plist ${plistPath}${codeDescription(cause)}`
|
|
137
|
+
: isSystemErrorCode(cause)
|
|
138
|
+
? `could not decode app Info.plist ${plistPath}${codeDescription(cause)}`
|
|
139
|
+
: `app Info.plist is malformed, unsupported, or lacks CFBundleExecutable: ${plistPath}${cause instanceof Error ? ` (${cause.message})` : ""}`, { cause }));
|
|
98
140
|
}
|
|
99
141
|
if (!isSafeExecutableName(name))
|
|
100
142
|
return err(new BinaryTargetError(bundle, "app has an unsafe CFBundleExecutable"));
|
|
@@ -102,15 +144,19 @@ const resolveLayoutExecutable = async (bundle, layout) => {
|
|
|
102
144
|
const executable = join(programs, name);
|
|
103
145
|
try {
|
|
104
146
|
const [canonicalPrograms, canonicalExecutable] = await Promise.all([
|
|
105
|
-
realpath(programs),
|
|
106
|
-
realpath(executable),
|
|
147
|
+
fileSystem.realpath(programs),
|
|
148
|
+
fileSystem.realpath(executable),
|
|
107
149
|
]);
|
|
108
150
|
if (!isPathWithinRoot(canonicalPrograms, canonicalExecutable))
|
|
109
151
|
return err(new BinaryTargetError(bundle, `app program file leaves ${layout.programsLabel}`));
|
|
110
152
|
return ok({ executable: canonicalExecutable, infoPlist: plistPath });
|
|
111
153
|
}
|
|
112
154
|
catch (cause) {
|
|
113
|
-
return err(new BinaryTargetError(
|
|
155
|
+
return err(new BinaryTargetError(executable, isPermissionDenied(cause)
|
|
156
|
+
? `permission denied resolving app program file ${executable}`
|
|
157
|
+
: isAbsence(cause)
|
|
158
|
+
? `app program file is missing: ${executable}`
|
|
159
|
+
: `could not resolve app program file ${executable}`, { cause }));
|
|
114
160
|
}
|
|
115
161
|
};
|
|
116
162
|
/** Decode the top-level executable name with an XML parser, not a pattern. */
|
|
@@ -169,6 +169,9 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
169
169
|
const prefix = Buffer.alloc(4096);
|
|
170
170
|
const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
|
|
171
171
|
const bytes = prefix.subarray(0, prefixRead.bytesRead);
|
|
172
|
+
// Header commitments such as Mach-O load commands and FAT slices are
|
|
173
|
+
// checked against the whole file, not the probed prefix.
|
|
174
|
+
const fileSize = (await handle.stat()).size;
|
|
172
175
|
if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
|
|
173
176
|
const offset = mzWindowsHeaderOffset(bytes);
|
|
174
177
|
if (offset !== null) {
|
|
@@ -182,7 +185,6 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
182
185
|
? bytes.readUInt16LE(24) + bytes.readUInt16LE(6) * 4
|
|
183
186
|
: 0;
|
|
184
187
|
const headerBytes = bytes.length >= 28 ? bytes.readUInt16LE(8) * 16 : 0;
|
|
185
|
-
const fileSize = (await handle.stat()).size;
|
|
186
188
|
if (tableEnd > bytes.length &&
|
|
187
189
|
tableEnd <= headerBytes &&
|
|
188
190
|
tableEnd <= fileSize) {
|
|
@@ -201,11 +203,11 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
201
203
|
if (count <= 128 && required > bytes.length) {
|
|
202
204
|
const header = Buffer.alloc(required);
|
|
203
205
|
const headerRead = await handle.read(header, 0, header.length, 0);
|
|
204
|
-
return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture);
|
|
206
|
+
return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture, fileSize);
|
|
205
207
|
}
|
|
206
208
|
}
|
|
207
209
|
}
|
|
208
|
-
return parseExecutableHeader(bytes, hostArchitecture);
|
|
210
|
+
return parseExecutableHeader(bytes, hostArchitecture, fileSize);
|
|
209
211
|
};
|
|
210
212
|
const readPeMetadata = async (handle, offset) => {
|
|
211
213
|
const fileHeader = Buffer.alloc(24);
|
|
@@ -27,21 +27,16 @@ export const createBrowserEvidence = (operation, input, result, provider) => cre
|
|
|
27
27
|
});
|
|
28
28
|
const browserParameters = (input, result) => {
|
|
29
29
|
if (!("cdp_endpoint" in input)) {
|
|
30
|
-
if ("before_scenario" in input
|
|
31
|
-
input.before_scenario !== undefined &&
|
|
32
|
-
input.after_scenario !== undefined)
|
|
30
|
+
if ("before_scenario" in input)
|
|
33
31
|
return {
|
|
34
32
|
comparison_kind: "browser_scenario",
|
|
35
33
|
before_browser: input.before_scenario.browser,
|
|
36
34
|
after_browser: input.after_scenario.browser,
|
|
37
35
|
before_start_origin: input.before_scenario.scenario.start_origin,
|
|
38
36
|
after_start_origin: input.after_scenario.scenario.start_origin,
|
|
39
|
-
normalization_sha256: commitBrowserScenarioNormalization(input.normalization
|
|
37
|
+
normalization_sha256: commitBrowserScenarioNormalization(input.normalization).sha256,
|
|
40
38
|
};
|
|
41
|
-
if (input.before
|
|
42
|
-
input.after !== undefined &&
|
|
43
|
-
"inspection" in input.before &&
|
|
44
|
-
"inspection" in input.after)
|
|
39
|
+
if ("inspection" in input.before && "inspection" in input.after)
|
|
45
40
|
return {
|
|
46
41
|
before_target_id: input.before.inspection.target.target_id,
|
|
47
42
|
before_capture_ended_at: input.before.inspection.capture_window.ended_at,
|
|
@@ -1,25 +1,9 @@
|
|
|
1
1
|
import { canonicalDigest } from "../domain/comparisonSemantics.js";
|
|
2
|
-
import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
|
|
3
2
|
import { createEvidence, } from "../domain/evidence.js";
|
|
4
|
-
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
3
|
+
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
5
4
|
const browserScenarioParameters = (scenario) => ({
|
|
5
|
+
...jsonObjectSchema.parse(scenario),
|
|
6
6
|
scenario_sha256: canonicalDigest(scenario, "Browser scenario"),
|
|
7
|
-
browser_mode: scenario.browser.mode,
|
|
8
|
-
...(scenario.browser.mode === "launch"
|
|
9
|
-
? { browser_headless: scenario.browser.headless }
|
|
10
|
-
: {}),
|
|
11
|
-
start_url: sanitizeBrowserUrl(scenario.start_url.url),
|
|
12
|
-
environment: scenario.environment,
|
|
13
|
-
actions: scenario.actions.map(({ step_id, action }) => ({
|
|
14
|
-
step_id,
|
|
15
|
-
action,
|
|
16
|
-
})),
|
|
17
|
-
action_timeouts_ms: scenario.actions.map((item) => "timeout_ms" in item ? (item.timeout_ms ?? null) : null),
|
|
18
|
-
secret_declarations: scenario.secrets.map(({ secret_id, environment_variable }) => ({
|
|
19
|
-
secret_id,
|
|
20
|
-
environment_variable,
|
|
21
|
-
})),
|
|
22
|
-
capture: scenario.capture,
|
|
23
7
|
});
|
|
24
8
|
/** Create Evidence without retaining resolved scenario secret values. */
|
|
25
9
|
export const createBrowserScenarioEvidence = (scenario, capture, provider) => createEvidence(undefined, provider, {
|