rea-agents 6.1.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +5 -10
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/javascript/electronActiveObservation.js +26 -69
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +13 -12
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/createServer.js +49 -36
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -2,6 +2,8 @@ import { randomBytes, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { access } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import writeFileAtomic from "write-file-atomic";
|
|
6
|
+
import { analysisErrorWithCleanupFailure } from "../application/binary/AnalysisClientCleanup.js";
|
|
5
7
|
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
|
|
6
8
|
import { HopperCancelledError, HopperProcessError, HopperProtocolError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "../domain/hopperErrors.js";
|
|
7
9
|
import {} from "../domain/analysisErrorBase.js";
|
|
@@ -14,7 +16,7 @@ import { ProviderStartupDeadline } from "../process/ProviderDeadline.js";
|
|
|
14
16
|
import { ProviderRunLineage } from "../process/ProviderRunLineage.js";
|
|
15
17
|
import { ProviderProcessSupervisor, } from "../process/ProviderProcess.js";
|
|
16
18
|
import { hopperOperationStage } from "./HopperOperationStage.js";
|
|
17
|
-
import { cleanupHopperSession } from "./HopperCleanup.js";
|
|
19
|
+
import { cleanupHopperSession, } from "./HopperCleanup.js";
|
|
18
20
|
import { parseHopperServerInfo, } from "./HopperSessionValues.js";
|
|
19
21
|
import { connectHopperSocketOnce } from "./HopperSocketConnection.js";
|
|
20
22
|
import { hopperLauncherFailureDiagnostic } from "./HopperProcessDiagnostic.js";
|
|
@@ -37,9 +39,12 @@ export class HopperClient {
|
|
|
37
39
|
#responses;
|
|
38
40
|
#logger;
|
|
39
41
|
#socket;
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
#resources = {
|
|
43
|
+
launch: undefined,
|
|
44
|
+
processSupervisor: undefined,
|
|
45
|
+
runtimeRoot: undefined,
|
|
46
|
+
shutdownConfirmed: false,
|
|
47
|
+
};
|
|
43
48
|
#token;
|
|
44
49
|
#lineage = new ProviderRunLineage();
|
|
45
50
|
#nextId = 1;
|
|
@@ -61,7 +66,7 @@ export class HopperClient {
|
|
|
61
66
|
#onSocketClose = () => {
|
|
62
67
|
if (this.#closing)
|
|
63
68
|
return;
|
|
64
|
-
const launch = this.#launch;
|
|
69
|
+
const launch = this.#resources.launch;
|
|
65
70
|
if (launch?.providerLifetime === "launcher-process" &&
|
|
66
71
|
this.#launcherExitCode !== undefined)
|
|
67
72
|
return;
|
|
@@ -166,7 +171,7 @@ export class HopperClient {
|
|
|
166
171
|
/** Launch the bridge once and complete its authenticated health handshake. */
|
|
167
172
|
start(signal) {
|
|
168
173
|
if (this.#closePromise !== undefined) {
|
|
169
|
-
return this.#closePromise.then(() => this.start(signal));
|
|
174
|
+
return this.#closePromise.then((closed) => closed.ok ? this.start(signal) : closed);
|
|
170
175
|
}
|
|
171
176
|
if (this.#startPromise !== undefined)
|
|
172
177
|
return this.#startPromise;
|
|
@@ -193,19 +198,7 @@ export class HopperClient {
|
|
|
193
198
|
void started.then((result) => {
|
|
194
199
|
release();
|
|
195
200
|
if (!result.ok) {
|
|
196
|
-
|
|
197
|
-
this.#rememberProcessFailure(result.error, []);
|
|
198
|
-
else if (this.#operationFailure === undefined &&
|
|
199
|
-
(result.error instanceof HopperTimeoutError ||
|
|
200
|
-
result.error instanceof HopperStartError))
|
|
201
|
-
this.#operationFailure = {
|
|
202
|
-
state: result.error instanceof HopperTimeoutError
|
|
203
|
-
? "not_started"
|
|
204
|
-
: "unknown",
|
|
205
|
-
exitCode: null,
|
|
206
|
-
startupFailure: true,
|
|
207
|
-
requests: [],
|
|
208
|
-
};
|
|
201
|
+
this.#rememberStartupFailure(result.error);
|
|
209
202
|
reset();
|
|
210
203
|
}
|
|
211
204
|
}, (cause) => {
|
|
@@ -219,9 +212,12 @@ export class HopperClient {
|
|
|
219
212
|
if (isAborted(signal))
|
|
220
213
|
return err(new HopperCancelledError());
|
|
221
214
|
this.#operationFailure = undefined;
|
|
222
|
-
if (this.#socket !== undefined ||
|
|
215
|
+
if (this.#socket !== undefined ||
|
|
216
|
+
this.#resources.launch !== undefined ||
|
|
217
|
+
this.#resources.runtimeRoot !== undefined) {
|
|
223
218
|
return err(new HopperProtocolError("Hopper client is already started"));
|
|
224
219
|
}
|
|
220
|
+
this.#resources.shutdownConfirmed = false;
|
|
225
221
|
const deadline = new ProviderStartupDeadline(this.#options.startupTimeoutMs, signal);
|
|
226
222
|
try {
|
|
227
223
|
return await this.#startWithin(deadline);
|
|
@@ -232,7 +228,7 @@ export class HopperClient {
|
|
|
232
228
|
}
|
|
233
229
|
async #startWithin(deadline) {
|
|
234
230
|
try {
|
|
235
|
-
this.#runtimeRoot = await PrivateRuntimeRoot.create({
|
|
231
|
+
this.#resources.runtimeRoot = await PrivateRuntimeRoot.create({
|
|
236
232
|
parent: SESSION_ROOT,
|
|
237
233
|
prefix: "rea-",
|
|
238
234
|
});
|
|
@@ -241,10 +237,9 @@ export class HopperClient {
|
|
|
241
237
|
return err(new HopperStartError({ cause }));
|
|
242
238
|
}
|
|
243
239
|
if (deadline.signal.aborted) {
|
|
244
|
-
|
|
245
|
-
return err(startupInterruption(deadline));
|
|
240
|
+
return this.#startupFailure(startupInterruption(deadline));
|
|
246
241
|
}
|
|
247
|
-
const socketPath = join(this.#runtimeRoot.path, "bridge.sock");
|
|
242
|
+
const socketPath = join(this.#resources.runtimeRoot.path, "bridge.sock");
|
|
248
243
|
this.#token = randomBytes(32).toString("hex");
|
|
249
244
|
this.#lineage.reset();
|
|
250
245
|
this.#launcherExitCode = undefined;
|
|
@@ -252,47 +247,76 @@ export class HopperClient {
|
|
|
252
247
|
const runId = this.#options.runId ?? randomUUID();
|
|
253
248
|
const launched = await this.#options.launcher
|
|
254
249
|
.launch({
|
|
255
|
-
directory: this.#runtimeRoot.path,
|
|
250
|
+
directory: this.#resources.runtimeRoot.path,
|
|
256
251
|
socketPath,
|
|
257
252
|
token: this.#token,
|
|
258
253
|
runId,
|
|
259
254
|
}, { signal: deadline.signal })
|
|
260
255
|
.catch((cause) => err(new HopperStartError({ cause })));
|
|
261
256
|
if (!launched.ok) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
: launched;
|
|
257
|
+
return this.#startupFailure(deadline.signal.aborted
|
|
258
|
+
? startupInterruption(deadline)
|
|
259
|
+
: launched.error);
|
|
266
260
|
}
|
|
267
|
-
this.#launch = launched.value;
|
|
261
|
+
this.#resources.launch = launched.value;
|
|
268
262
|
this.#attachLauncher(launched.value);
|
|
263
|
+
const ownership = launched.value.ownership;
|
|
264
|
+
if (ownership !== undefined) {
|
|
265
|
+
try {
|
|
266
|
+
await writeFileAtomic(join(this.#resources.runtimeRoot.path, "ownership.json"), `${JSON.stringify({
|
|
267
|
+
run_id: runId,
|
|
268
|
+
pid: ownership.leaderPid,
|
|
269
|
+
process_group_id: ownership.processGroupId,
|
|
270
|
+
parent_pid: process.pid,
|
|
271
|
+
launcher: launched.value.launcherCommand ?? null,
|
|
272
|
+
created_at: new Date().toISOString(),
|
|
273
|
+
})}\n`, { encoding: "utf8", mode: 0o600 });
|
|
274
|
+
}
|
|
275
|
+
catch (cause) {
|
|
276
|
+
return this.#startupFailure(new HopperStartError({ cause }));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
269
279
|
const connected = await this.#connect(socketPath, deadline);
|
|
270
280
|
if (!connected.ok) {
|
|
271
|
-
|
|
272
|
-
return connected;
|
|
281
|
+
return this.#startupFailure(connected.error);
|
|
273
282
|
}
|
|
274
283
|
const remainingMs = deadline.remainingMs();
|
|
275
284
|
if (remainingMs <= 0) {
|
|
276
|
-
|
|
277
|
-
return err(new HopperTimeoutError(this.#options.startupTimeoutMs));
|
|
285
|
+
return this.#startupFailure(new HopperTimeoutError(this.#options.startupTimeoutMs));
|
|
278
286
|
}
|
|
279
287
|
const health = await this.#request("health", {}, {
|
|
280
288
|
timeoutMs: remainingMs,
|
|
281
289
|
signal: deadline.signal,
|
|
282
290
|
});
|
|
283
291
|
if (!health.ok) {
|
|
284
|
-
|
|
285
|
-
return deadline.signal.aborted
|
|
286
|
-
? err(startupInterruption(deadline))
|
|
287
|
-
: health;
|
|
292
|
+
return this.#startupFailure(deadline.signal.aborted ? startupInterruption(deadline) : health.error);
|
|
288
293
|
}
|
|
289
294
|
const parsed = parseHopperServerInfo(health.value, runId);
|
|
290
|
-
if (parsed.ok)
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
await this.#cleanup();
|
|
295
|
+
if (!parsed.ok)
|
|
296
|
+
return this.#startupFailure(parsed.error);
|
|
297
|
+
await this.#lineage.observe(this.#resources.launch);
|
|
294
298
|
return parsed;
|
|
295
299
|
}
|
|
300
|
+
async #startupFailure(primary) {
|
|
301
|
+
this.#rememberStartupFailure(primary);
|
|
302
|
+
const closed = await this.#cleanup();
|
|
303
|
+
return err(closed.ok
|
|
304
|
+
? primary
|
|
305
|
+
: analysisErrorWithCleanupFailure(primary, closed.error, "open_binary"));
|
|
306
|
+
}
|
|
307
|
+
#rememberStartupFailure(failure) {
|
|
308
|
+
if (failure instanceof HopperProcessError)
|
|
309
|
+
this.#rememberProcessFailure(failure, []);
|
|
310
|
+
else if (this.#operationFailure === undefined &&
|
|
311
|
+
(failure instanceof HopperTimeoutError ||
|
|
312
|
+
failure instanceof HopperStartError))
|
|
313
|
+
this.#operationFailure = {
|
|
314
|
+
state: failure instanceof HopperTimeoutError ? "not_started" : "unknown",
|
|
315
|
+
exitCode: null,
|
|
316
|
+
startupFailure: true,
|
|
317
|
+
requests: [],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
296
320
|
/** Invoke one declared operation, returning timeout and cancellation as values. */
|
|
297
321
|
async callTool(name, arguments_ = {}, options = {}) {
|
|
298
322
|
const started = await this.start(options.signal);
|
|
@@ -305,12 +329,8 @@ export class HopperClient {
|
|
|
305
329
|
? err(new AnalysisCapabilityUnavailableError("hopper", name, result.error.safeMessage))
|
|
306
330
|
: result;
|
|
307
331
|
}
|
|
308
|
-
/** Stop the bridge, settle outstanding requests, and remove session artifacts. */
|
|
309
|
-
close() {
|
|
310
|
-
return this.closeWithOutcome().then(() => undefined);
|
|
311
|
-
}
|
|
312
332
|
/** Stop the bridge and report whether every owned resource was verified clean. */
|
|
313
|
-
|
|
333
|
+
close(options = {}) {
|
|
314
334
|
const starting = this.#startPromise;
|
|
315
335
|
const controller = this.#startupController;
|
|
316
336
|
controller?.abort();
|
|
@@ -338,9 +358,7 @@ export class HopperClient {
|
|
|
338
358
|
try {
|
|
339
359
|
return await cleanupHopperSession({
|
|
340
360
|
socket: this.#socket,
|
|
341
|
-
|
|
342
|
-
processSupervisor: this.#process,
|
|
343
|
-
runtimeRoot: this.#runtimeRoot,
|
|
361
|
+
resources: this.#resources,
|
|
344
362
|
activeRequest: this.#requests.activity(),
|
|
345
363
|
progress: options.progress,
|
|
346
364
|
logger: this.#logger,
|
|
@@ -356,14 +374,16 @@ export class HopperClient {
|
|
|
356
374
|
});
|
|
357
375
|
}
|
|
358
376
|
finally {
|
|
359
|
-
this.#socket
|
|
360
|
-
|
|
361
|
-
this.#
|
|
362
|
-
|
|
363
|
-
this.#
|
|
364
|
-
|
|
365
|
-
this.#
|
|
366
|
-
|
|
377
|
+
if (this.#socket?.destroyed === true)
|
|
378
|
+
this.#socket = undefined;
|
|
379
|
+
if (this.#socket === undefined)
|
|
380
|
+
this.#token = undefined;
|
|
381
|
+
if (this.#socket === undefined)
|
|
382
|
+
this.#responses.reset();
|
|
383
|
+
if (this.#resources.processSupervisor === undefined) {
|
|
384
|
+
this.#launcherExitCode = undefined;
|
|
385
|
+
this.#launcherFailureDiagnostic = undefined;
|
|
386
|
+
}
|
|
367
387
|
this.#closing = false;
|
|
368
388
|
}
|
|
369
389
|
}
|
|
@@ -374,10 +394,10 @@ export class HopperClient {
|
|
|
374
394
|
if (this.#closing)
|
|
375
395
|
return err(new HopperProcessError(null));
|
|
376
396
|
if (this.#launcherExitCode !== undefined &&
|
|
377
|
-
this.#launch !== undefined &&
|
|
378
|
-
(this.#launch.providerLifetime === "launcher-process" ||
|
|
397
|
+
this.#resources.launch !== undefined &&
|
|
398
|
+
(this.#resources.launch.providerLifetime === "launcher-process" ||
|
|
379
399
|
this.#launcherExitCode !== 0)) {
|
|
380
|
-
const failure = await this.#launcherStartupFailure(this.#launch.providerLifetime === "launcher-process", this.#launcherExitCode, deadline);
|
|
400
|
+
const failure = await this.#launcherStartupFailure(this.#resources.launch.providerLifetime === "launcher-process", this.#launcherExitCode, deadline);
|
|
381
401
|
return deadline.interruption === "cancelled"
|
|
382
402
|
? err(await this.#startupInterruption(deadline))
|
|
383
403
|
: err(failure);
|
|
@@ -406,10 +426,11 @@ export class HopperClient {
|
|
|
406
426
|
async #startupInterruption(deadline) {
|
|
407
427
|
if (deadline.interruption === "cancelled")
|
|
408
428
|
return new HopperCancelledError();
|
|
409
|
-
return new HopperTimeoutError(deadline.timeoutMs, undefined, undefined, "not_started", "launch", this.#launcherOutcome((await this.#
|
|
429
|
+
return new HopperTimeoutError(deadline.timeoutMs, undefined, undefined, "not_started", "launch", this.#launcherOutcome((await this.#resources.processSupervisor?.waitForOutputClose(0)) ??
|
|
430
|
+
false));
|
|
410
431
|
}
|
|
411
432
|
#launcherOutcome(outputClosed) {
|
|
412
|
-
const snapshot = this.#
|
|
433
|
+
const snapshot = this.#resources.processSupervisor?.snapshot();
|
|
413
434
|
const token = this.#token;
|
|
414
435
|
if (snapshot === undefined)
|
|
415
436
|
return undefined;
|
|
@@ -426,7 +447,7 @@ export class HopperClient {
|
|
|
426
447
|
};
|
|
427
448
|
}
|
|
428
449
|
async #launcherStartupFailure(ownsProviderLifetime, exitCode, deadline) {
|
|
429
|
-
const process = this.#
|
|
450
|
+
const process = this.#resources.processSupervisor;
|
|
430
451
|
// Descendants may inherit the helper's pipes. Bound drainage independently
|
|
431
452
|
// from readiness, and report whether producer output actually closed.
|
|
432
453
|
const outputClosed = (await process?.waitForOutputClose(Math.min(1_000, deadline.remainingMs()))) ?? false;
|
|
@@ -502,7 +523,7 @@ export class HopperClient {
|
|
|
502
523
|
socket.off("close", this.#onSocketClose);
|
|
503
524
|
}
|
|
504
525
|
#attachLauncher(launch) {
|
|
505
|
-
this.#
|
|
526
|
+
this.#resources.processSupervisor = new ProviderProcessSupervisor(launch, {
|
|
506
527
|
onDiagnostic: (event) => this.#onLauncherDiagnostic(launch, event),
|
|
507
528
|
});
|
|
508
529
|
}
|
|
@@ -18,7 +18,7 @@ export const hopperMachOImageSchema = z.strictObject({
|
|
|
18
18
|
});
|
|
19
19
|
/** Validate the selected FAT64 slice without depending on Apple's lipo tool. */
|
|
20
20
|
export const resolveHopperMachOImage = async (target, signal) => {
|
|
21
|
-
const invalid = (reason) => err(new BinaryTargetError(target.path, reason));
|
|
21
|
+
const invalid = (reason, cause) => err(new BinaryTargetError(target.path, reason, cause === undefined ? undefined : { cause }));
|
|
22
22
|
if (signal?.aborted)
|
|
23
23
|
return err(new AnalysisCancelledError("open_binary"));
|
|
24
24
|
let file;
|
|
@@ -26,7 +26,8 @@ export const resolveHopperMachOImage = async (target, signal) => {
|
|
|
26
26
|
file = await open(target.path, "r");
|
|
27
27
|
}
|
|
28
28
|
catch (cause) {
|
|
29
|
-
|
|
29
|
+
// Keep the OS error so a read-permission denial reports access_denied.
|
|
30
|
+
return invalid(`Cannot read FAT64 source for Hopper image preparation: ${cause instanceof Error ? cause.message : String(cause)}`, cause);
|
|
30
31
|
}
|
|
31
32
|
try {
|
|
32
33
|
const read = async (offset, length) => {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { fileURLToPath } from "node:url";
|
|
2
3
|
import { accessSync, constants } from "node:fs";
|
|
3
4
|
import { createAnalysisExecution } from "../application/AnalysisProvider.js";
|
|
4
5
|
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
|
|
5
|
-
import { err } from "../domain/result.js";
|
|
6
|
+
import { err, ok } from "../domain/result.js";
|
|
6
7
|
import { HopperApplicationLauncher } from "./BridgeLauncher.js";
|
|
7
8
|
import { hopperLoaderArgsForTarget, resolveHopperAnalysisProfile, } from "./HopperAnalysisProfile.js";
|
|
8
9
|
import { mapHopperFileOffset } from "./HopperFileOffset.js";
|
|
@@ -10,26 +11,26 @@ import { HopperRegexSearch } from "./HopperRegexSearch.js";
|
|
|
10
11
|
import { HopperClient } from "./HopperClient.js";
|
|
11
12
|
import { hopperMachOImageSchema } from "./HopperMachOImage.js";
|
|
12
13
|
import { CAPABILITIES, HOPPER_PROVIDER_IDENTITY, } from "./HopperProviderCapabilities.js";
|
|
13
|
-
export { HOPPER_PROVIDER_IDENTITY, HOPPER_OPERATIONS, } from "./HopperProviderCapabilities.js";
|
|
14
|
-
const IDENTITY = HOPPER_PROVIDER_IDENTITY;
|
|
15
14
|
/** Concrete analysis provider backed by REA's private Hopper bridge. */
|
|
16
15
|
export class HopperProvider {
|
|
17
16
|
config;
|
|
18
17
|
logger;
|
|
19
18
|
platform;
|
|
19
|
+
environment;
|
|
20
20
|
/**
|
|
21
21
|
* Host platform, injected so availability and launch-mode decisions can be
|
|
22
22
|
* exercised for any host rather than only the machine running the suite.
|
|
23
23
|
* Mirrors `GhidraProvider`, which already threads its installation host's
|
|
24
24
|
* platform the same way.
|
|
25
25
|
*/
|
|
26
|
-
constructor(config, logger, platform = process.platform) {
|
|
26
|
+
constructor(config, logger, environment, platform = process.platform) {
|
|
27
27
|
this.config = config;
|
|
28
28
|
this.logger = logger;
|
|
29
29
|
this.platform = platform;
|
|
30
|
+
this.environment = snapshotEnvironment(environment, platform);
|
|
30
31
|
}
|
|
31
32
|
identity() {
|
|
32
|
-
return
|
|
33
|
+
return HOPPER_PROVIDER_IDENTITY;
|
|
33
34
|
}
|
|
34
35
|
capabilities() {
|
|
35
36
|
return CAPABILITIES;
|
|
@@ -104,15 +105,15 @@ export class HopperProvider {
|
|
|
104
105
|
return resolveHopperAnalysisProfile(target, {
|
|
105
106
|
launcherPath: this.config.hopperLauncherPath,
|
|
106
107
|
loaderArgsOverride: this.config.hopperLoaderArgs,
|
|
107
|
-
provider:
|
|
108
|
+
provider: HOPPER_PROVIDER_IDENTITY,
|
|
108
109
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
109
110
|
});
|
|
110
111
|
}
|
|
111
112
|
createClient(target, profile, context) {
|
|
112
113
|
if (target.kind !== "executable" && target.kind !== "database")
|
|
113
114
|
return {
|
|
114
|
-
execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(
|
|
115
|
-
close: () => Promise.resolve(),
|
|
115
|
+
execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(HOPPER_PROVIDER_IDENTITY.id, operation, `Hopper cannot open ${target.kind} targets directly. Inventory or extract the artifact first.`))),
|
|
116
|
+
close: () => Promise.resolve(ok(null)),
|
|
116
117
|
};
|
|
117
118
|
const preparation = profile?.parameters.prepared_image;
|
|
118
119
|
const parsedImage = preparation === undefined
|
|
@@ -120,8 +121,8 @@ export class HopperProvider {
|
|
|
120
121
|
: hopperMachOImageSchema.safeParse(preparation);
|
|
121
122
|
if (parsedImage?.success === false)
|
|
122
123
|
return {
|
|
123
|
-
execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(
|
|
124
|
-
close: () => Promise.resolve(),
|
|
124
|
+
execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(HOPPER_PROVIDER_IDENTITY.id, operation, "Hopper prepared-image profile is malformed; resolve the analysis profile again."))),
|
|
125
|
+
close: () => Promise.resolve(ok(null)),
|
|
125
126
|
};
|
|
126
127
|
const preparedImage = parsedImage?.data;
|
|
127
128
|
const container = preparedImage === undefined
|
|
@@ -133,11 +134,12 @@ export class HopperProvider {
|
|
|
133
134
|
if (!derivedLoaderArgs.ok)
|
|
134
135
|
return {
|
|
135
136
|
execute: () => Promise.resolve(err(derivedLoaderArgs.error)),
|
|
136
|
-
close: () => Promise.resolve(),
|
|
137
|
+
close: () => Promise.resolve(ok(null)),
|
|
137
138
|
};
|
|
138
|
-
const executionProvider = profile?.provider ??
|
|
139
|
+
const executionProvider = profile?.provider ?? HOPPER_PROVIDER_IDENTITY;
|
|
139
140
|
const client = new HopperClient({
|
|
140
141
|
launcher: new HopperApplicationLauncher({
|
|
142
|
+
environment: this.environment,
|
|
141
143
|
launcherPath: this.config.hopperLauncherPath,
|
|
142
144
|
targetPath: target.path,
|
|
143
145
|
targetKind: target.kind,
|
|
@@ -229,13 +231,9 @@ export class HopperProvider {
|
|
|
229
231
|
];
|
|
230
232
|
},
|
|
231
233
|
operationHealthSnapshot: () => client.operationHealth(),
|
|
232
|
-
|
|
234
|
+
close: async (options) => {
|
|
233
235
|
await regexSearch.close();
|
|
234
|
-
return client.
|
|
235
|
-
},
|
|
236
|
-
close: async () => {
|
|
237
|
-
await regexSearch.close();
|
|
238
|
-
await client.close();
|
|
236
|
+
return client.close(options);
|
|
239
237
|
},
|
|
240
238
|
};
|
|
241
239
|
}
|
|
@@ -9,11 +9,6 @@ const MATCHING_DEADLINE_MS = 5_000;
|
|
|
9
9
|
const inputSchema = z.strictObject({
|
|
10
10
|
...analysisSearchInput,
|
|
11
11
|
mode: z.literal("regex"),
|
|
12
|
-
document: z.string().nullish(),
|
|
13
|
-
case_sensitive: z
|
|
14
|
-
.boolean()
|
|
15
|
-
.nullish()
|
|
16
|
-
.transform((value) => value ?? false),
|
|
17
12
|
});
|
|
18
13
|
const replySchema = z.discriminatedUnion("status", [
|
|
19
14
|
z.strictObject({
|
|
@@ -68,7 +63,9 @@ export class HopperRegexSearch {
|
|
|
68
63
|
},
|
|
69
64
|
}),
|
|
70
65
|
};
|
|
71
|
-
const inventory = await this.client.callTool(operation === "search_strings" ? "list_strings" : "list_procedures", input.data.document
|
|
66
|
+
const inventory = await this.client.callTool(operation === "search_strings" ? "list_strings" : "list_procedures", input.data.document === undefined
|
|
67
|
+
? {}
|
|
68
|
+
: { document: input.data.document }, inventoryOptions);
|
|
72
69
|
if (!inventory.ok)
|
|
73
70
|
return inventory;
|
|
74
71
|
const parsed = z.array(analysisStringSchema).safeParse(inventory.value);
|