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
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
1
|
import { join } from "node:path";
|
|
3
2
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
4
3
|
import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
@@ -6,7 +5,7 @@ import { linuxHopperInstallDisclosure, } from "./LinuxHopper.js";
|
|
|
6
5
|
import { macHopperInstallDisclosure } from "./MacHopper.js";
|
|
7
6
|
/** Discover supported clients and current registrations without mutation. */
|
|
8
7
|
export const discoverSetupState = async (input) => {
|
|
9
|
-
const
|
|
8
|
+
const { initialDoctor } = input;
|
|
10
9
|
const linuxHopperRepairNeeded = initialDoctor.checks.some(({ name, ok, detail }) => !ok &&
|
|
11
10
|
(name === "hopper-demo-runtime" ||
|
|
12
11
|
(name === "hopper-version" && detail === "/opt/hopper/bin/Hopper")));
|
|
@@ -22,7 +21,7 @@ export const discoverSetupState = async (input) => {
|
|
|
22
21
|
(Object.keys(input.providerEnvironment).length === 0 ||
|
|
23
22
|
linuxHopperRepairNeeded));
|
|
24
23
|
const [clients, detectedClients, skillNeedsInstall] = await Promise.all([
|
|
25
|
-
input.host.supportedClients
|
|
24
|
+
input.host.supportedClients(),
|
|
26
25
|
input.host.detectedClients(),
|
|
27
26
|
input.host.skillNeedsInstall(),
|
|
28
27
|
]);
|
|
@@ -85,7 +84,7 @@ export const planSetupActions = async (input) => {
|
|
|
85
84
|
});
|
|
86
85
|
const inspections = await Promise.all(selectedClients.map(async (client) => ({
|
|
87
86
|
client,
|
|
88
|
-
inspection:
|
|
87
|
+
inspection: await input.host.inspectClientConfiguration(client, input.providerEnvironment, input.command),
|
|
89
88
|
})));
|
|
90
89
|
const invalid = inspections.find(({ inspection }) => inspection.status === "invalid");
|
|
91
90
|
if (invalid?.inspection.status === "invalid") {
|
|
@@ -117,6 +116,7 @@ export const planSetupActions = async (input) => {
|
|
|
117
116
|
return {
|
|
118
117
|
plannedActions: setupPlan({
|
|
119
118
|
platform: input.host.platform,
|
|
119
|
+
homeDirectory: input.host.homeDirectory,
|
|
120
120
|
installHopper: input.discovery.installHopper,
|
|
121
121
|
installSkill: input.installSkill,
|
|
122
122
|
clients: clientPlans,
|
|
@@ -139,7 +139,7 @@ const setupPlan = (input) => [
|
|
|
139
139
|
kind: "install_hopper",
|
|
140
140
|
label: "Hopper deep-analysis provider",
|
|
141
141
|
target: input.platform === "darwin"
|
|
142
|
-
? join(
|
|
142
|
+
? join(input.homeDirectory, "Applications/Hopper Disassembler.app")
|
|
143
143
|
: "system package manager",
|
|
144
144
|
detail: input.platform === "linux"
|
|
145
145
|
? "Download, verify, and install Hopper plus its Xvfb demo-session dependencies. For the supported demo build, REA uses a private display and selects Hopper's offered demo mode for each analysis session."
|
|
@@ -175,7 +175,7 @@ const setupPlan = (input) => [
|
|
|
175
175
|
id: "install_skill",
|
|
176
176
|
kind: "install_skill",
|
|
177
177
|
label: "REA reverse-engineering skill",
|
|
178
|
-
target: join(
|
|
178
|
+
target: join(input.homeDirectory, ".agents/skills", PRODUCT_IDENTITY.skillName),
|
|
179
179
|
detail: "Install or update the bundled REA reverse-engineering skill and on-demand references.",
|
|
180
180
|
external: false,
|
|
181
181
|
operation: "install",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parseClientConfiguration, serializeClientConfiguration, clientServerPath, legacyClientServerPath, withClientServers, } from "./ClientConfigurationDocument.js";
|
|
2
2
|
import { copyFile, lstat, readFile, realpath, rm } from "node:fs/promises";
|
|
3
|
-
import {
|
|
3
|
+
import { constants as fsConstants } from "node:fs";
|
|
4
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
4
5
|
import { join } from "node:path";
|
|
5
6
|
import writeFileAtomic from "write-file-atomic";
|
|
6
7
|
import { z } from "zod";
|
|
@@ -10,7 +11,7 @@ import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
|
|
|
10
11
|
import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
|
|
11
12
|
const systemFileSystem = {
|
|
12
13
|
readText: (path) => readFile(path, "utf8"),
|
|
13
|
-
copy: (source, destination) => copyFile(source, destination),
|
|
14
|
+
copy: (source, destination) => copyFile(source, destination, fsConstants.COPYFILE_EXCL),
|
|
14
15
|
writeText: (path, contents) => writeFileAtomic(path, contents, { encoding: "utf8" }),
|
|
15
16
|
stat: (path) => lstat(path),
|
|
16
17
|
realpath: (path) => realpath(path),
|
|
@@ -30,14 +31,26 @@ export const isUninstallFailure = (result) => {
|
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
};
|
|
33
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Remove only REA-owned registrations and managed files, optionally including
|
|
36
|
+
* local state. A client configuration that cannot be read safely stops the
|
|
37
|
+
* operation before anything is removed; one that fails during removal stops
|
|
38
|
+
* the remaining removals.
|
|
39
|
+
*/
|
|
34
40
|
export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
const clients = await host.clients();
|
|
42
|
+
const blocked = [];
|
|
43
|
+
for (const client of clients) {
|
|
44
|
+
const blocking = await host.inspectClient(client);
|
|
45
|
+
if (blocking !== undefined)
|
|
46
|
+
blocked.push(blocking);
|
|
47
|
+
}
|
|
48
|
+
const items = blocked.length > 0
|
|
49
|
+
? [
|
|
50
|
+
...blocked,
|
|
51
|
+
item("uninstall", "skipped", "No REA registration, skill, or data was removed. Repair each failed configuration, then rerun uninstall."),
|
|
52
|
+
]
|
|
53
|
+
: await removeAll(clients, purgeData, host);
|
|
41
54
|
items.push({
|
|
42
55
|
name: "analysis_engine",
|
|
43
56
|
status: "retained",
|
|
@@ -50,41 +63,80 @@ export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
|
|
|
50
63
|
items,
|
|
51
64
|
};
|
|
52
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* Each client is reread when it is edited, so a concurrent change is never
|
|
68
|
+
* overwritten. A client that fails then still stops the remaining removals.
|
|
69
|
+
*/
|
|
70
|
+
const removeAll = async (clients, purgeData, host) => {
|
|
71
|
+
const items = [];
|
|
72
|
+
for (const client of clients) {
|
|
73
|
+
const removed = await host.removeClient(client);
|
|
74
|
+
items.push(removed);
|
|
75
|
+
if (removed.status === "failed")
|
|
76
|
+
return [
|
|
77
|
+
...items,
|
|
78
|
+
item("uninstall", "skipped", "Uninstall stopped at this failure; the items above report what changed. Repair the failed configuration, then rerun uninstall."),
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
items.push(await host.removeSkill());
|
|
82
|
+
if (purgeData)
|
|
83
|
+
items.push(...(await host.purgeData()));
|
|
84
|
+
return items;
|
|
85
|
+
};
|
|
53
86
|
/** Create uninstall effects contained to detected client configs and REA-owned paths. */
|
|
54
|
-
export const systemUninstallHost = (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
87
|
+
export const systemUninstallHost = (selectedHome = undefined, fileSystem = systemFileSystem, environment = process.env, platform = process.platform) => {
|
|
88
|
+
const home = selectedHome ?? homeDirectoryFromEnvironment(environment, platform);
|
|
89
|
+
return {
|
|
90
|
+
clients: () => Promise.resolve(supportedClients(home, platform, environment)),
|
|
91
|
+
inspectClient: async (client) => {
|
|
92
|
+
const read = await readClientConfiguration(client, fileSystem);
|
|
93
|
+
return read.kind === "item" && read.item.status === "failed"
|
|
94
|
+
? read.item
|
|
95
|
+
: undefined;
|
|
96
|
+
},
|
|
97
|
+
removeClient: (client) => removeClient(client, fileSystem),
|
|
98
|
+
removeSkill: () => removeManagedSkills(home, fileSystem),
|
|
99
|
+
purgeData: async () => [
|
|
100
|
+
await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
|
|
101
|
+
await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
const readClientConfiguration = async (client, fileSystem) => {
|
|
64
106
|
if (client.format === "unsupported")
|
|
65
|
-
return item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
|
|
66
|
-
"This client has no documented local MCP configuration boundary.");
|
|
107
|
+
return itemRead(item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
|
|
108
|
+
"This client has no documented local MCP configuration boundary."));
|
|
67
109
|
const resolved = await resolveUninstallConfigPath(client, fileSystem);
|
|
68
110
|
if (typeof resolved !== "string")
|
|
69
|
-
return resolved;
|
|
111
|
+
return itemRead(resolved);
|
|
70
112
|
const transactionPath = resolved;
|
|
71
113
|
let original;
|
|
72
114
|
try {
|
|
73
115
|
original = await fileSystem.readText(transactionPath);
|
|
74
116
|
}
|
|
75
117
|
catch (cause) {
|
|
76
|
-
return isMissing(cause)
|
|
118
|
+
return itemRead(isMissing(cause)
|
|
77
119
|
? item(client.name, "skipped", "Configuration does not exist.")
|
|
78
|
-
: item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall.");
|
|
120
|
+
: item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall."));
|
|
79
121
|
}
|
|
80
|
-
let parsed;
|
|
81
122
|
try {
|
|
82
|
-
parsed = parseClientConfiguration(original, client.format);
|
|
123
|
+
const parsed = parseClientConfiguration(original, client.format);
|
|
124
|
+
return { kind: "configuration", transactionPath, original, parsed };
|
|
83
125
|
}
|
|
84
126
|
catch (cause) {
|
|
85
127
|
void cause;
|
|
86
|
-
return item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`);
|
|
128
|
+
return itemRead(item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`));
|
|
87
129
|
}
|
|
130
|
+
};
|
|
131
|
+
const itemRead = (result) => ({
|
|
132
|
+
kind: "item",
|
|
133
|
+
item: result,
|
|
134
|
+
});
|
|
135
|
+
const removeClient = async (client, fileSystem) => {
|
|
136
|
+
const read = await readClientConfiguration(client, fileSystem);
|
|
137
|
+
if (read.kind === "item")
|
|
138
|
+
return read.item;
|
|
139
|
+
const { transactionPath, original, parsed } = read;
|
|
88
140
|
const name = PRODUCT_IDENTITY.mcpServerKey;
|
|
89
141
|
// Beside a native OpenCode V2 table, OpenCode also loads a V1 `mcp.rea`.
|
|
90
142
|
const legacyPath = legacyClientServerPath(parsed, name);
|
|
@@ -109,8 +161,8 @@ const removeClient = async (client, fileSystem) => {
|
|
|
109
161
|
await fileSystem.copy(transactionPath, backupPath);
|
|
110
162
|
}
|
|
111
163
|
catch (cause) {
|
|
112
|
-
|
|
113
|
-
|
|
164
|
+
if (!(cause instanceof Error && "code" in cause && cause.code === "EEXIST"))
|
|
165
|
+
return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
|
|
114
166
|
}
|
|
115
167
|
try {
|
|
116
168
|
await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format, original, editedPaths));
|
|
@@ -21,9 +21,11 @@ const setupPlanSchema = z.object({
|
|
|
21
21
|
})),
|
|
22
22
|
});
|
|
23
23
|
/** Discover owned registrations and an existing REA skill without writes. */
|
|
24
|
-
export const existingMaintenanceScope = async (home, entryPoint) => {
|
|
25
|
-
const registrations = await readClientRegistrationStatuses(home, entryPoint
|
|
26
|
-
|
|
24
|
+
export const existingMaintenanceScope = async (home, entryPoint, environment) => {
|
|
25
|
+
const registrations = await readClientRegistrationStatuses(home, entryPoint, {
|
|
26
|
+
environment,
|
|
27
|
+
});
|
|
28
|
+
const supported = supportedClients(home, process.platform, environment);
|
|
27
29
|
const clients = [];
|
|
28
30
|
for (const registration of registrations) {
|
|
29
31
|
if ((registration.state !== "aligned" && registration.state !== "stale") ||
|
|
@@ -56,9 +58,9 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
|
|
|
56
58
|
return { clients, skill };
|
|
57
59
|
};
|
|
58
60
|
/** Ask the verified new executable to plan only existing REA integrations. */
|
|
59
|
-
export const planIntegrationMaintenance = async (home, entryPoint, execute) => {
|
|
61
|
+
export const planIntegrationMaintenance = async (home, entryPoint, environment, execute) => {
|
|
60
62
|
try {
|
|
61
|
-
const scope = await existingMaintenanceScope(home, entryPoint);
|
|
63
|
+
const scope = await existingMaintenanceScope(home, entryPoint, environment);
|
|
62
64
|
if (scope.clients.length === 0 && !scope.skill)
|
|
63
65
|
return { status: "current", plannedActions: [] };
|
|
64
66
|
const command = [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { realpath } from "node:fs/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
3
3
|
import { basename, dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import spawn from "cross-spawn";
|
|
@@ -9,13 +9,13 @@ import { safeParseJson } from "../domain/safeJson.js";
|
|
|
9
9
|
import { updateInstallCommand, } from "./Update.js";
|
|
10
10
|
import { planIntegrationMaintenance } from "./UpdateMaintenance.js";
|
|
11
11
|
/** Run an updater subprocess with complete diagnostics and isolated machine output. */
|
|
12
|
-
export const runUpdateCommand = (command, output = "structured") => new Promise((resolveResult) => {
|
|
12
|
+
export const runUpdateCommand = (command, selectedEnvironment, output = "structured") => new Promise((resolveResult) => {
|
|
13
13
|
const [executable, ...args] = command;
|
|
14
14
|
if (executable === undefined) {
|
|
15
15
|
resolveResult(err("No executable supplied."));
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
-
const environment = { ...
|
|
18
|
+
const environment = { ...selectedEnvironment };
|
|
19
19
|
// A fresh installed entry point must not inherit npx's invocation identity.
|
|
20
20
|
delete environment.npm_command;
|
|
21
21
|
const child = spawn(executable, args, {
|
|
@@ -46,8 +46,8 @@ export const runUpdateCommand = (command, output = "structured") => new Promise(
|
|
|
46
46
|
? `Process exited with code ${String(code)}.`
|
|
47
47
|
: `Process terminated by ${signal}.`))));
|
|
48
48
|
});
|
|
49
|
-
const requireCommandOutput = async (command) => {
|
|
50
|
-
const result = await runUpdateCommand(command);
|
|
49
|
+
const requireCommandOutput = async (command, environment) => {
|
|
50
|
+
const result = await runUpdateCommand(command, environment);
|
|
51
51
|
if (!result.ok)
|
|
52
52
|
throw new Error(result.error);
|
|
53
53
|
return result.value;
|
|
@@ -130,21 +130,21 @@ export const npmReleaseLookup = (response) => {
|
|
|
130
130
|
: err({ kind: "invalid-metadata", detail: parsed.error });
|
|
131
131
|
};
|
|
132
132
|
/** Create npm, registry, verification, and read-only maintenance effects. */
|
|
133
|
-
export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home =
|
|
133
|
+
export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home = undefined, environment = process.env) => ({
|
|
134
134
|
installation: () => detectNpmInstallation(packageRoot, {
|
|
135
135
|
canonicalPath: realpath,
|
|
136
|
-
globalRoot: () => requireCommandOutput(["npm", "root", "--global"]),
|
|
137
|
-
globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"]),
|
|
136
|
+
globalRoot: () => requireCommandOutput(["npm", "root", "--global"], environment),
|
|
137
|
+
globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"], environment),
|
|
138
138
|
}),
|
|
139
|
-
latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation))),
|
|
139
|
+
latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation), environment)),
|
|
140
140
|
installVersion: async (installation, version, output) => {
|
|
141
|
-
const result = await runUpdateCommand(updateInstallCommand(installation, version), output);
|
|
141
|
+
const result = await runUpdateCommand(updateInstallCommand(installation, version), environment, output);
|
|
142
142
|
return result.ok ? ok(undefined) : result;
|
|
143
143
|
},
|
|
144
144
|
installedVersion: (installation) => runUpdateCommand([
|
|
145
145
|
process.execPath,
|
|
146
146
|
join(installation.packageRoot, "scripts", "rea.mjs"),
|
|
147
147
|
"--version",
|
|
148
|
-
]),
|
|
149
|
-
planMaintenance: (installation) => planIntegrationMaintenance(home, join(installation.packageRoot, "scripts", "rea.mjs"), runUpdateCommand),
|
|
148
|
+
], environment),
|
|
149
|
+
planMaintenance: (installation) => planIntegrationMaintenance(home ?? homeDirectoryFromEnvironment(environment, process.platform), join(installation.packageRoot, "scripts", "rea.mjs"), environment, (command) => runUpdateCommand(command, environment)),
|
|
150
150
|
});
|
|
@@ -5,7 +5,7 @@ import { z } from "zod";
|
|
|
5
5
|
import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
|
|
6
6
|
import { publishWebScripts } from "../browser/assets/PublishWebScripts.js";
|
|
7
7
|
import { selectScriptCapture } from "../browser/assets/ScriptCaptureAdapters.js";
|
|
8
|
-
import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
8
|
+
import { AnalysisAccessDeniedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
9
9
|
import { createEvidence } from "../domain/evidence.js";
|
|
10
10
|
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
|
|
11
11
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
@@ -35,9 +35,10 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
|
|
|
35
35
|
]));
|
|
36
36
|
try {
|
|
37
37
|
options.signal?.throwIfAborted();
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
const read = await readCapture(input.capture_path, options.signal);
|
|
39
|
+
if (!read.ok)
|
|
40
|
+
return read;
|
|
41
|
+
const bytes = read.value;
|
|
41
42
|
const loaded = parseCapture(bytes);
|
|
42
43
|
if (!loaded.ok)
|
|
43
44
|
return loaded;
|
|
@@ -90,6 +91,31 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
|
|
|
90
91
|
}));
|
|
91
92
|
}
|
|
92
93
|
};
|
|
94
|
+
/**
|
|
95
|
+
* Read the caller-selected capture. A missing, non-file or unreadable
|
|
96
|
+
* selection is a caller or host-permission failure, not an export failure.
|
|
97
|
+
*/
|
|
98
|
+
const readCapture = async (path, signal) => {
|
|
99
|
+
try {
|
|
100
|
+
return ok(await readFile(path, { signal }));
|
|
101
|
+
}
|
|
102
|
+
catch (cause) {
|
|
103
|
+
const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
|
|
104
|
+
if (code === "EACCES" || code === "EPERM")
|
|
105
|
+
return err(new AnalysisAccessDeniedError(OPERATION, path, code, { cause }));
|
|
106
|
+
if (code === "ENOENT" || code === "ENOTDIR" || code === "EISDIR")
|
|
107
|
+
return err(new AnalysisInputError(OPERATION, { cause }, [
|
|
108
|
+
{
|
|
109
|
+
path: ["capture_path"],
|
|
110
|
+
reason: "invalid_value",
|
|
111
|
+
message: code === "EISDIR"
|
|
112
|
+
? `Selected capture is a directory, not a file: ${path}`
|
|
113
|
+
: `Selected capture could not be read (${code}): ${path}`,
|
|
114
|
+
},
|
|
115
|
+
]));
|
|
116
|
+
throw cause;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
93
119
|
const parseCapture = (bytes) => {
|
|
94
120
|
try {
|
|
95
121
|
const text = new TextDecoder("utf-8", {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
|
|
2
2
|
import { analysisProfileSchema, committedProviderSchema, } from "../domain/analysisProfile.js";
|
|
3
|
-
import { createEvidence } from "../domain/evidence.js";
|
|
3
|
+
import { createEvidence, } from "../domain/evidence.js";
|
|
4
4
|
import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
|
|
5
5
|
/** Build the shared Evidence record for a successful composed binary workflow. */
|
|
6
6
|
export const createWorkflowEvidence = (input) => createEvidence(input.target, REA_WORKFLOW_PROVIDER, {
|
|
@@ -14,10 +14,33 @@ export const createWorkflowEvidence = (input) => createEvidence(input.target, RE
|
|
|
14
14
|
}),
|
|
15
15
|
confidence: "derived",
|
|
16
16
|
limitations: ["Derived by an REA composed workflow."],
|
|
17
|
+
...(input.operation === "batch_decompile"
|
|
18
|
+
? { locations: batchProcedureLocations(input.result) }
|
|
19
|
+
: {}),
|
|
17
20
|
});
|
|
21
|
+
const batchProcedureLocations = (result) => {
|
|
22
|
+
if (result === null ||
|
|
23
|
+
typeof result !== "object" ||
|
|
24
|
+
Array.isArray(result) ||
|
|
25
|
+
!Array.isArray(result.items))
|
|
26
|
+
return [];
|
|
27
|
+
const addresses = new Set();
|
|
28
|
+
for (const item of result.items) {
|
|
29
|
+
if (item === null || typeof item !== "object" || Array.isArray(item))
|
|
30
|
+
continue;
|
|
31
|
+
const procedure = item.procedure;
|
|
32
|
+
if (procedure !== null &&
|
|
33
|
+
typeof procedure === "object" &&
|
|
34
|
+
!Array.isArray(procedure) &&
|
|
35
|
+
procedure.status === "resolved" &&
|
|
36
|
+
typeof procedure.address === "string")
|
|
37
|
+
addresses.add(procedure.address);
|
|
38
|
+
}
|
|
39
|
+
return [...addresses].map((address) => ({ kind: "address", address }));
|
|
40
|
+
};
|
|
18
41
|
/** Convert workflow Evidence into its exact replay binding, when it has a profile. */
|
|
19
42
|
export const workflowSnapshotRecord = (evidence, operation) => {
|
|
20
|
-
if (
|
|
43
|
+
if (evidence.analysis_profile === null)
|
|
21
44
|
return undefined;
|
|
22
45
|
return {
|
|
23
46
|
operation,
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { addressedValue } from "../contracts/toolOutputSchemaPrimitives.js";
|
|
2
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { err, ok } from "../domain/result.js";
|
|
4
|
+
import { resolveProcedureAddress } from "./ProcedureAddressResolution.js";
|
|
5
|
+
/** Resolve a CLI symbol selector without changing existing address spellings. */
|
|
6
|
+
export const resolveXrefsAddress = async (analysis, selector, signal) => {
|
|
7
|
+
if (selector.length === 0 ||
|
|
8
|
+
/^[0-9a-f]+$/iu.test(selector) ||
|
|
9
|
+
/^0x/iu.test(selector) ||
|
|
10
|
+
/:0x/iu.test(selector))
|
|
11
|
+
return ok(selector);
|
|
12
|
+
const inventory = await analysis.execute("list_names", {}, { signal });
|
|
13
|
+
if (!inventory.ok) {
|
|
14
|
+
if (inventory.error instanceof AnalysisCapabilityUnavailableError &&
|
|
15
|
+
inventory.error.operation === "list_names" &&
|
|
16
|
+
!inventory.error.cleanupIncomplete)
|
|
17
|
+
return resolveProcedureAddress(async (operation, parameters, signal) => {
|
|
18
|
+
const result = await analysis.execute(operation, parameters, signal === undefined ? {} : { signal });
|
|
19
|
+
return result.ok ? ok(result.value.result) : result;
|
|
20
|
+
}, selector, signal);
|
|
21
|
+
return inventory;
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(inventory.value.result))
|
|
24
|
+
return err(new AnalysisOutputError("list_names", "Expected a symbol inventory array"));
|
|
25
|
+
const addresses = new Set();
|
|
26
|
+
for (const [index, item] of inventory.value.result.entries()) {
|
|
27
|
+
const parsed = addressedValue.safeParse(item);
|
|
28
|
+
if (!parsed.success || parsed.data.address.length === 0)
|
|
29
|
+
return err(new AnalysisOutputError("list_names", `Invalid symbol inventory entry at index ${index}`));
|
|
30
|
+
if (parsed.data.value === selector)
|
|
31
|
+
addresses.add(parsed.data.address);
|
|
32
|
+
}
|
|
33
|
+
const [address] = addresses;
|
|
34
|
+
if (addresses.size === 1 && address !== undefined)
|
|
35
|
+
return ok(address);
|
|
36
|
+
return err(new AnalysisInputError("xrefs", undefined, [
|
|
37
|
+
{
|
|
38
|
+
path: ["address"],
|
|
39
|
+
reason: "invalid_value",
|
|
40
|
+
message: addresses.size === 0
|
|
41
|
+
? `Unknown analyzed symbol name ${JSON.stringify(selector)}. Use an exact analyzed name or a hexadecimal address.`
|
|
42
|
+
: `Analyzed symbol name ${JSON.stringify(selector)} is ambiguous at ${[...addresses].join(", ")}. Select an exact address.`,
|
|
43
|
+
},
|
|
44
|
+
]));
|
|
45
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ANALYSIS_VIEW_PROVIDER } from "../InvestigationProviders.js";
|
|
3
|
+
import { resolveEvidenceInput } from "../EvidenceInputResolver.js";
|
|
4
|
+
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
5
|
+
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
|
|
6
|
+
import { createEvidence, parseEvidence, } from "../../domain/evidence.js";
|
|
7
|
+
import { INSPECT_ANALYSIS_VIEW_OPERATION, inspectAnalysisViewInputSchema, projectAnalysisView, } from "../../domain/analysisView/analysisView.js";
|
|
8
|
+
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
9
|
+
import { err, ok } from "../../domain/result.js";
|
|
10
|
+
/** Authenticate a selected-view request and project already completed Evidence. */
|
|
11
|
+
export const inspectAnalysisView = (rawInput, lookup) => {
|
|
12
|
+
const parsed = inspectAnalysisViewInputSchema.safeParse(rawInput);
|
|
13
|
+
if (!parsed.success)
|
|
14
|
+
return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, parsed.error.issues, rawInput, { cause: parsed.error }));
|
|
15
|
+
return inspectAnalysisViewValidated(parsed.data, lookup);
|
|
16
|
+
};
|
|
17
|
+
/** Project a view from input already parsed by a trusted adapter. */
|
|
18
|
+
export const inspectAnalysisViewValidated = (input, lookup) => {
|
|
19
|
+
const resolved = resolveAnalysisViewSource(input.source, lookup);
|
|
20
|
+
if (!resolved.ok)
|
|
21
|
+
return resolved;
|
|
22
|
+
const parent = resolved.value;
|
|
23
|
+
const projected = projectAnalysisView({
|
|
24
|
+
evidenceId: parent.evidence_id,
|
|
25
|
+
operation: parent.operation,
|
|
26
|
+
normalizedResult: parent.normalized_result,
|
|
27
|
+
limitations: parent.limitations,
|
|
28
|
+
}, input.view);
|
|
29
|
+
if (!projected.ok)
|
|
30
|
+
return projected;
|
|
31
|
+
if (parent.subject !== null &&
|
|
32
|
+
parent.subject.digest.sha256 !== projected.value.artifact.sha256)
|
|
33
|
+
return err(new EvidenceIntegrityError(`Parent subject SHA-256 ${parent.subject.digest.sha256} differs from analysis artifact SHA-256 ${projected.value.artifact.sha256}.`));
|
|
34
|
+
return ok(createAnalysisViewEvidence(input, parent, projected.value));
|
|
35
|
+
};
|
|
36
|
+
const resolveAnalysisViewSource = (source, lookup) => {
|
|
37
|
+
if (source.kind === "retained-evidence")
|
|
38
|
+
return resolveEvidenceInput(source, lookup);
|
|
39
|
+
try {
|
|
40
|
+
return ok(parseEvidence(source.evidence));
|
|
41
|
+
}
|
|
42
|
+
catch (cause) {
|
|
43
|
+
if (cause instanceof z.ZodError)
|
|
44
|
+
return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues, source.evidence, { cause }));
|
|
45
|
+
if (cause instanceof TypeError)
|
|
46
|
+
return err(new EvidenceIntegrityError(cause.message, cause.message.length > 0 ? { userMessage: cause.message } : undefined));
|
|
47
|
+
throw cause;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const createAnalysisViewEvidence = (input, parent, result) => {
|
|
51
|
+
const target = parent.subject === null
|
|
52
|
+
? undefined
|
|
53
|
+
: {
|
|
54
|
+
path: parent.subject.local_path,
|
|
55
|
+
sha256: parent.subject.digest.sha256,
|
|
56
|
+
format: parent.subject.format,
|
|
57
|
+
...(parent.subject.architecture === null
|
|
58
|
+
? {}
|
|
59
|
+
: { architecture: parent.subject.architecture }),
|
|
60
|
+
};
|
|
61
|
+
return createEvidence(target, ANALYSIS_VIEW_PROVIDER, {
|
|
62
|
+
predicateType: "rea.analysis-view",
|
|
63
|
+
operation: INSPECT_ANALYSIS_VIEW_OPERATION,
|
|
64
|
+
parameters: {
|
|
65
|
+
parent_evidence_id: parent.evidence_id,
|
|
66
|
+
view: jsonValueSchema.parse(input.view),
|
|
67
|
+
},
|
|
68
|
+
result: jsonValueSchema.parse(result),
|
|
69
|
+
rawResult: null,
|
|
70
|
+
confidence: "derived",
|
|
71
|
+
authority: parent.authority,
|
|
72
|
+
limitations: result.limitations,
|
|
73
|
+
locations: [{ kind: "artifact-path", path: result.artifact.path }],
|
|
74
|
+
evidenceLinks: [parent.evidence_id],
|
|
75
|
+
});
|
|
76
|
+
};
|
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
import { ProviderCleanupError } from "../../domain/providerCleanupError.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
|
|
3
|
+
import { projectAnalysisError } from "../../domain/analysisErrorProjection.js";
|
|
4
|
+
import { err } from "../../domain/result.js";
|
|
5
|
+
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
3
6
|
/** Close one provider client and normalize unexpected adapter rejection. */
|
|
4
7
|
export const closeAnalysisClient = async (client, providerId, options = {}) => {
|
|
5
8
|
try {
|
|
6
|
-
|
|
7
|
-
return await client.closeWithOutcome(options);
|
|
8
|
-
await client.close();
|
|
9
|
-
return ok(null);
|
|
9
|
+
return await client.close(options);
|
|
10
10
|
}
|
|
11
11
|
catch (cause) {
|
|
12
|
+
// A typed cleanup failure already names its leftover resources.
|
|
13
|
+
if (cause instanceof AnalysisError && cause.cleanupIncomplete)
|
|
14
|
+
return err(cause);
|
|
12
15
|
return err(new ProviderCleanupError(providerId, ["provider-client"], { reason: "provider client close rejected unexpectedly" }, { cause }));
|
|
13
16
|
}
|
|
14
17
|
};
|
|
18
|
+
/** Preserve the original lifecycle failure alongside incomplete cleanup. */
|
|
19
|
+
export const analysisErrorWithCleanupFailure = (primary, cleanup, operation = "close_binary") => {
|
|
20
|
+
const projected = projectAnalysisError(cleanup);
|
|
21
|
+
return new ProviderAdapterError(cleanup instanceof ProviderAdapterError ? cleanup.providerId : "rea", operation, {
|
|
22
|
+
cause: primary,
|
|
23
|
+
userMessage: projectAnalysisError(primary).message,
|
|
24
|
+
...(primary.capturedOutput === undefined
|
|
25
|
+
? {}
|
|
26
|
+
: { capturedOutput: primary.capturedOutput }),
|
|
27
|
+
...(primary.partialObservation === undefined
|
|
28
|
+
? {}
|
|
29
|
+
: { partialObservation: primary.partialObservation }),
|
|
30
|
+
cleanup: {
|
|
31
|
+
reason: projected.message,
|
|
32
|
+
resources: cleanup.cleanupResources,
|
|
33
|
+
},
|
|
34
|
+
diagnostics: {
|
|
35
|
+
primary_error: projectAnalysisError(primary),
|
|
36
|
+
cleanup_error: projected,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
};
|
|
@@ -46,14 +46,13 @@ export const evaluateAnalysisProviderCandidate = async (candidate, status, targe
|
|
|
46
46
|
if (resolved.value.profile === null)
|
|
47
47
|
return ok(rejectedProfile(candidate, status, "Provider version or analysis profile could not be resolved"));
|
|
48
48
|
const profile = analysisProfileSchema.parse(resolved.value.profile);
|
|
49
|
-
const compatibility = jsonObjectSchema.parse(resolved.value.compatibility);
|
|
50
49
|
const identity = candidate.identity();
|
|
51
50
|
if (profile.provider.id !== identity.id ||
|
|
52
51
|
profile.provider.name !== identity.name ||
|
|
53
52
|
(identity.version !== null &&
|
|
54
53
|
profile.provider.version !== identity.version))
|
|
55
54
|
return ok(rejectedProfile(candidate, status, "Resolved analysis profile has mismatched provider identity"));
|
|
56
|
-
return ok({ candidate, status, profile
|
|
55
|
+
return ok({ candidate, status, profile });
|
|
57
56
|
}
|
|
58
57
|
catch (cause) {
|
|
59
58
|
void cause;
|
|
@@ -117,13 +117,11 @@ export class AnalysisProviderRegistry {
|
|
|
117
117
|
if (evaluated.profileError !== undefined)
|
|
118
118
|
return err(evaluated.profileError);
|
|
119
119
|
const statuses = replaceCandidate(baseline, evaluated.status);
|
|
120
|
-
if (evaluated.profile === undefined
|
|
121
|
-
evaluated.compatibility === undefined)
|
|
120
|
+
if (evaluated.profile === undefined)
|
|
122
121
|
return err(selectionError("provider_unavailable", providerId, statuses));
|
|
123
122
|
return ok(selectedResult(providerId, source, {
|
|
124
123
|
...evaluated,
|
|
125
124
|
profile: evaluated.profile,
|
|
126
|
-
compatibility: evaluated.compatibility,
|
|
127
125
|
}, statuses));
|
|
128
126
|
}
|
|
129
127
|
async #selectAutomatically(context) {
|
|
@@ -149,8 +147,7 @@ export class AnalysisProviderRegistry {
|
|
|
149
147
|
return result.value;
|
|
150
148
|
});
|
|
151
149
|
const statuses = evaluations.map(({ status }) => status);
|
|
152
|
-
const usable = evaluations.filter((evaluation) => evaluation.profile !== undefined
|
|
153
|
-
evaluation.compatibility !== undefined);
|
|
150
|
+
const usable = evaluations.filter((evaluation) => evaluation.profile !== undefined);
|
|
154
151
|
if (usable.length === 0)
|
|
155
152
|
return ok({
|
|
156
153
|
requestedProviderId: "auto",
|
|
@@ -195,7 +192,6 @@ const selectedResult = (requestedProviderId, source, evaluated, statuses) => {
|
|
|
195
192
|
identity: structuredClone(evaluated.profile.provider),
|
|
196
193
|
selectionSource: source,
|
|
197
194
|
profile: structuredClone(evaluated.profile),
|
|
198
|
-
compatibility: structuredClone(evaluated.compatibility),
|
|
199
195
|
},
|
|
200
196
|
candidates: replaceCandidate(statuses, selectedStatus),
|
|
201
197
|
};
|