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
|
@@ -13,7 +13,8 @@ export const analysisErrorRemediationAction = (error) => {
|
|
|
13
13
|
if (error instanceof AnalysisSnapshotMismatchError)
|
|
14
14
|
return "Run analysis without this snapshot, then save a fresh snapshot using the intended artifact, provider, and analysis profile.";
|
|
15
15
|
if (error instanceof AnalysisUnsupportedTargetError)
|
|
16
|
-
return
|
|
16
|
+
return (error.remediationAction ??
|
|
17
|
+
"Select a target supported by this operation or choose an operation supporting the reported target format.");
|
|
17
18
|
if (error instanceof AnalysisResourceConstraintError)
|
|
18
19
|
return (error.remediationAction ??
|
|
19
20
|
(error.resource === "transport"
|
|
@@ -44,10 +45,13 @@ export const analysisErrorRemediationAction = (error) => {
|
|
|
44
45
|
if (error instanceof BinaryTargetError &&
|
|
45
46
|
error.constraint === "directory_requires_file")
|
|
46
47
|
return "For a JavaScript/Electron application directory, call analyze_javascript_application with input_path or run `rea analyze <directory>`. For binary analysis, select its executable file.";
|
|
47
|
-
if (error instanceof AnalysisAccessDeniedError
|
|
48
|
+
if (error instanceof AnalysisAccessDeniedError ||
|
|
49
|
+
(error instanceof BinaryTargetError && error.systemCode !== undefined))
|
|
48
50
|
return "Check the current process's read access to the selected path. Retry with a readable local file.";
|
|
49
51
|
if (error instanceof AnalysisArtifactChangedError)
|
|
50
52
|
return "Wait until the selected file is stable. For an active binary session, reopen the target with open_binary before retrying so REA acquires its current identity; for a CLI command or target-free tool, rerun the operation.";
|
|
53
|
+
if (error instanceof ConfigurationError && error.settings.length > 0)
|
|
54
|
+
return `Correct ${[...new Set(error.settings.map(({ setting }) => setting))].join(", ")} in the environment that starts REA (your shell or the MCP client's registration), then rerun.`;
|
|
51
55
|
if (error instanceof AnalysisInputError)
|
|
52
56
|
return "Correct the listed arguments and retry.";
|
|
53
57
|
if (error instanceof UnknownRegistryError && error.reason === "not-found")
|
|
@@ -72,6 +76,11 @@ export const analysisErrorCategory = (error) => {
|
|
|
72
76
|
return "unavailable";
|
|
73
77
|
if (error instanceof ArtifactOperationError)
|
|
74
78
|
return artifactErrorCategory(error.reason);
|
|
79
|
+
if (error instanceof EvidenceFileError &&
|
|
80
|
+
(error.reason === "missing" ||
|
|
81
|
+
error.reason === "not-file" ||
|
|
82
|
+
error.reason === "exists"))
|
|
83
|
+
return "invalid_input";
|
|
75
84
|
return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure";
|
|
76
85
|
};
|
|
77
86
|
const browserErrorCategory = (reason) => {
|
|
@@ -152,7 +161,13 @@ export const analysisErrorUserMessage = (error) => {
|
|
|
152
161
|
if (error instanceof UnknownRegistryError)
|
|
153
162
|
return "Evidence state changed before the update completed. Refresh the current state and try again.";
|
|
154
163
|
if (error instanceof ConfigurationError)
|
|
155
|
-
return
|
|
164
|
+
return error.settings.length === 0
|
|
165
|
+
? "REA configuration is invalid. Run `rea doctor` and fix the reported setting."
|
|
166
|
+
: `REA configuration is invalid: ${error.settings
|
|
167
|
+
.map(({ setting, constraint }) => constraint.includes(setting)
|
|
168
|
+
? constraint.replace(/\.$/u, "")
|
|
169
|
+
: `${setting}: ${constraint}`)
|
|
170
|
+
.join("; ")}.`;
|
|
156
171
|
if (error instanceof NoBinaryOpenError)
|
|
157
172
|
return error.message;
|
|
158
173
|
if (error instanceof BinaryTargetError)
|
|
@@ -2,7 +2,7 @@ import { jsonValueSchema } from "./jsonValue.js";
|
|
|
2
2
|
import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
|
|
3
3
|
import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisUnsupportedTargetError, AnalysisInputError, AnalysisOutputError, AnalysisTimeoutError, AnalysisResourceConstraintError, } from "./analysisErrorCore.js";
|
|
4
4
|
import { ArtifactOperationError } from "./artifactOperationError.js";
|
|
5
|
-
import { BinaryTargetError } from "./configurationErrors.js";
|
|
5
|
+
import { BinaryTargetError, ConfigurationError, } from "./configurationErrors.js";
|
|
6
6
|
import { BrowserObservationError } from "./browserObservationError.js";
|
|
7
7
|
import { EvidenceFileError, EvidenceIntegrityError, EvidenceReferenceError, } from "./evidenceErrors.js";
|
|
8
8
|
import { HopperCancelledError, HopperProcessError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "./hopperErrors.js";
|
|
@@ -63,6 +63,10 @@ const underlyingErrorCode = (error) => {
|
|
|
63
63
|
: browserErrorCode(error.reason);
|
|
64
64
|
if (error instanceof ArtifactOperationError)
|
|
65
65
|
return artifactOperationCode(error);
|
|
66
|
+
if (error instanceof BinaryTargetError)
|
|
67
|
+
return error.systemCode === undefined
|
|
68
|
+
? "target_unavailable"
|
|
69
|
+
: "access_denied";
|
|
66
70
|
if (error instanceof EvidenceFileError)
|
|
67
71
|
return evidenceFileCode(error.reason);
|
|
68
72
|
if (error instanceof UnknownRegistryError)
|
|
@@ -95,9 +99,14 @@ const artifactOperationCode = (error) => {
|
|
|
95
99
|
return "cancelled";
|
|
96
100
|
return "artifact_operation_failed";
|
|
97
101
|
};
|
|
98
|
-
const evidenceFileCode = (reason) =>
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
const evidenceFileCode = (reason) => {
|
|
103
|
+
if (reason === "invalid-json")
|
|
104
|
+
return "evidence_integrity_mismatch";
|
|
105
|
+
// A missing, non-file or already-existing path is the caller's selection.
|
|
106
|
+
if (reason === "io")
|
|
107
|
+
return "execution_failure";
|
|
108
|
+
return "invalid_request";
|
|
109
|
+
};
|
|
101
110
|
const unknownRegistryCode = (reason) => {
|
|
102
111
|
if (reason === "revision-conflict" || reason === "already-exists")
|
|
103
112
|
return "revision_conflict";
|
|
@@ -132,7 +141,6 @@ const STATIC_ERROR_CODES = {
|
|
|
132
141
|
HopperStartError: "provider_unavailable",
|
|
133
142
|
ConfigurationError: "configuration_invalid",
|
|
134
143
|
NoBinaryOpenError: "target_unavailable",
|
|
135
|
-
BinaryTargetError: "target_unavailable",
|
|
136
144
|
EvidenceIntegrityError: "evidence_integrity_mismatch",
|
|
137
145
|
ProviderAdapterError: "execution_failure",
|
|
138
146
|
HopperRemoteError: "execution_failure",
|
|
@@ -140,6 +148,7 @@ const STATIC_ERROR_CODES = {
|
|
|
140
148
|
const staticErrorCode = (tag) => {
|
|
141
149
|
switch (tag) {
|
|
142
150
|
case "ArtifactOperationError":
|
|
151
|
+
case "BinaryTargetError":
|
|
143
152
|
case "BrowserObservationError":
|
|
144
153
|
case "EvidenceFileError":
|
|
145
154
|
case "ProcessCaptureError":
|
|
@@ -404,6 +413,13 @@ const lifecycleErrorDetails = (error) => {
|
|
|
404
413
|
};
|
|
405
414
|
return Object.keys(details).length === 0 ? undefined : details;
|
|
406
415
|
}
|
|
416
|
+
if (error instanceof ConfigurationError && error.settings.length > 0)
|
|
417
|
+
return {
|
|
418
|
+
settings: error.settings.map(({ setting, constraint }) => ({
|
|
419
|
+
setting,
|
|
420
|
+
constraint,
|
|
421
|
+
})),
|
|
422
|
+
};
|
|
407
423
|
if (error instanceof BinaryTargetError)
|
|
408
424
|
return {
|
|
409
425
|
path: error.path,
|
|
@@ -411,6 +427,9 @@ const lifecycleErrorDetails = (error) => {
|
|
|
411
427
|
...(error.constraint === undefined
|
|
412
428
|
? {}
|
|
413
429
|
: { constraint: error.constraint }),
|
|
430
|
+
...(error.systemCode === undefined
|
|
431
|
+
? {}
|
|
432
|
+
: { system_code: error.systemCode, boundary: "filesystem-read" }),
|
|
414
433
|
};
|
|
415
434
|
return undefined;
|
|
416
435
|
};
|
|
@@ -96,7 +96,7 @@ export const analysisSnapshotSchema = z.object({
|
|
|
96
96
|
target: targetSchema,
|
|
97
97
|
binding: bindingSchema,
|
|
98
98
|
entries: z.array(entrySchema),
|
|
99
|
-
workflow_entries: z.array(workflowEntrySchema)
|
|
99
|
+
workflow_entries: z.array(workflowEntrySchema),
|
|
100
100
|
evidence_bundle: evidenceBundleSchema,
|
|
101
101
|
});
|
|
102
102
|
const canonicalJson = (value) => {
|
|
@@ -139,7 +139,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
|
|
|
139
139
|
const encodedParameters = canonicalJson(parameters);
|
|
140
140
|
const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
|
|
141
141
|
const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
|
|
142
|
-
const workflowEntry = snapshot.workflow_entries
|
|
142
|
+
const workflowEntry = snapshot.workflow_entries.find((candidate) => candidate.query_id === queryId);
|
|
143
143
|
if (entry === undefined && workflowEntry === undefined)
|
|
144
144
|
return undefined;
|
|
145
145
|
return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
|
|
@@ -147,7 +147,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
|
|
|
147
147
|
record.provider.id === provider.id &&
|
|
148
148
|
record.provider.name === provider.name &&
|
|
149
149
|
record.provider.version === provider.version &&
|
|
150
|
-
|
|
150
|
+
record.analysis_profile !== null &&
|
|
151
151
|
analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
|
|
152
152
|
canonicalJson(record.parameters) === encodedParameters &&
|
|
153
153
|
((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
|
|
@@ -233,11 +233,17 @@ export const createAnalysisSnapshotEntry = (input) => {
|
|
|
233
233
|
export const parseAnalysisSnapshot = (input) => {
|
|
234
234
|
const parsed = analysisSnapshotSchema.parse(input);
|
|
235
235
|
parseEvidenceBundle(parsed.evidence_bundle);
|
|
236
|
-
|
|
236
|
+
const scopedEvidence = evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256);
|
|
237
|
+
// The validated canonical bundle is filtered, never extended. Equal counts
|
|
238
|
+
// establish that no record or unknown was removed without serializing results.
|
|
239
|
+
if (scopedEvidence.records.length !== parsed.evidence_bundle.records.length ||
|
|
240
|
+
scopedEvidence.unknowns.length !== parsed.evidence_bundle.unknowns.length)
|
|
237
241
|
throw new TypeError("Analysis snapshot evidence contains records for another target");
|
|
242
|
+
if (!hasCanonicalQueryOrder(parsed.entries))
|
|
243
|
+
throw new TypeError("Analysis snapshot entries are not canonical");
|
|
244
|
+
if (!hasCanonicalQueryOrder(parsed.workflow_entries))
|
|
245
|
+
throw new TypeError("Analysis snapshot workflow entries are not canonical");
|
|
238
246
|
const ids = new Set();
|
|
239
|
-
const boundEntries = [];
|
|
240
|
-
const boundWorkflowEntries = [];
|
|
241
247
|
const index = createEvidenceIndex(parsed);
|
|
242
248
|
const workflowIndex = createWorkflowEvidenceIndex(parsed);
|
|
243
249
|
for (const entry of parsed.entries) {
|
|
@@ -254,13 +260,10 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
254
260
|
if (!entryHasMatchingEvidence(entry, parsed, index)) {
|
|
255
261
|
if (entryHasCorrespondingEvidence(entry, parsed, index))
|
|
256
262
|
throw new TypeError(`Analysis snapshot entry ${entry.operation} differs from its Evidence record`);
|
|
257
|
-
|
|
258
|
-
// Keep their Evidence bundle, but never replay those unbound values.
|
|
259
|
-
continue;
|
|
263
|
+
throw new TypeError(`Analysis snapshot entry ${entry.operation} has no profile-bound Evidence record`);
|
|
260
264
|
}
|
|
261
|
-
boundEntries.push(entry);
|
|
262
265
|
}
|
|
263
|
-
for (const entry of parsed.workflow_entries
|
|
266
|
+
for (const entry of parsed.workflow_entries) {
|
|
264
267
|
if (entry.execution.provider.id !==
|
|
265
268
|
entry.execution.analysis_profile.provider.id ||
|
|
266
269
|
entry.execution.provider.name !==
|
|
@@ -277,24 +280,19 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
277
280
|
if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
|
|
278
281
|
if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
|
|
279
282
|
throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
|
|
280
|
-
|
|
283
|
+
throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} has no profile-bound Evidence record`);
|
|
281
284
|
}
|
|
282
|
-
boundWorkflowEntries.push(entry);
|
|
283
285
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
...(parsed.workflow_entries === undefined
|
|
295
|
-
? {}
|
|
296
|
-
: { workflow_entries: boundWorkflowEntries }),
|
|
297
|
-
};
|
|
286
|
+
return parsed;
|
|
287
|
+
};
|
|
288
|
+
const hasCanonicalQueryOrder = (entries) => {
|
|
289
|
+
let previous;
|
|
290
|
+
for (const { query_id: queryId } of entries) {
|
|
291
|
+
if (previous !== undefined && previous.localeCompare(queryId) > 0)
|
|
292
|
+
return false;
|
|
293
|
+
previous = queryId;
|
|
294
|
+
}
|
|
295
|
+
return true;
|
|
298
296
|
};
|
|
299
297
|
const createEvidenceIndex = (snapshot) => {
|
|
300
298
|
const matching = new Set();
|
|
@@ -329,13 +327,13 @@ const isCorrespondingEvidence = (evidence, snapshot) => evidence.predicate_type
|
|
|
329
327
|
evidence.confidence === "observed" &&
|
|
330
328
|
evidence.authority === "shipped-artifact" &&
|
|
331
329
|
evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
|
|
332
|
-
|
|
330
|
+
evidence.analysis_profile !== null &&
|
|
333
331
|
analysisProfilesEqual(evidence.analysis_profile, snapshot.binding.analysis_profile);
|
|
334
332
|
const evidenceQueryKey = (evidence) => canonicalJson({
|
|
335
333
|
operation: evidence.operation,
|
|
336
334
|
parameters: evidence.parameters,
|
|
337
335
|
provider: evidence.provider,
|
|
338
|
-
analysis_profile:
|
|
336
|
+
analysis_profile: evidence.analysis_profile,
|
|
339
337
|
});
|
|
340
338
|
const entryQueryKey = (entry, binding) => canonicalJson({
|
|
341
339
|
operation: entry.operation,
|
|
@@ -383,7 +381,7 @@ const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_typ
|
|
|
383
381
|
evidence.confidence === "derived" &&
|
|
384
382
|
evidence.authority === "shipped-artifact" &&
|
|
385
383
|
evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
|
|
386
|
-
|
|
384
|
+
evidence.analysis_profile !== null &&
|
|
387
385
|
analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
|
|
388
386
|
evidence.provider.id === entry.execution.provider.id &&
|
|
389
387
|
evidence.provider.name === entry.execution.provider.name &&
|
|
@@ -396,7 +394,7 @@ const createWorkflowEvidenceIndex = (snapshot) => {
|
|
|
396
394
|
evidence.confidence !== "derived" ||
|
|
397
395
|
evidence.authority !== "shipped-artifact" ||
|
|
398
396
|
evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
|
|
399
|
-
|
|
397
|
+
evidence.analysis_profile === null)
|
|
400
398
|
continue;
|
|
401
399
|
corresponding.add(evidenceQueryKey(evidence));
|
|
402
400
|
matching.add(canonicalJson(evidenceContentProjection(evidence)));
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../analysisErrorCore.js";
|
|
3
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
4
|
+
import { digestSchema, prefixedDigestSchema } from "../digests.js";
|
|
5
|
+
import { evidenceSchema } from "../evidence.js";
|
|
6
|
+
import { jsonObjectSchema, jsonValueSchema } from "../jsonValue.js";
|
|
7
|
+
import { err, ok } from "../result.js";
|
|
8
|
+
import { binaryLayoutSchema } from "../native/binaryLayout.js";
|
|
9
|
+
import { parseOwnedJavaScriptApplicationAnalysisSteps, } from "../javascript/javascriptApplicationAnalysis.js";
|
|
10
|
+
import { analysisInputErrorFromIssues } from "../inputIssueProjection.js";
|
|
11
|
+
import { projectBinaryLayoutView } from "./binaryLayoutView.js";
|
|
12
|
+
import { projectJavaScriptApplicationView } from "./javascriptApplicationView.js";
|
|
13
|
+
/** Public name of the selected-view workflow. */
|
|
14
|
+
export const INSPECT_ANALYSIS_VIEW_OPERATION = "inspect_analysis_view";
|
|
15
|
+
const summaryViewSchema = z.strictObject({ kind: z.literal("summary") });
|
|
16
|
+
const facetViewSchema = z.strictObject({
|
|
17
|
+
kind: z.literal("facet"),
|
|
18
|
+
facet: z.enum(["mitigations", "linkage"]),
|
|
19
|
+
});
|
|
20
|
+
const itemSelectorSchema = z.union([
|
|
21
|
+
z.strictObject({ index: z.number().int().nonnegative() }),
|
|
22
|
+
z.strictObject({ name: z.string() }),
|
|
23
|
+
z.strictObject({
|
|
24
|
+
path: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe("Exact observed module path or original source-map reference from a module page; an empty reference is valid."),
|
|
27
|
+
}),
|
|
28
|
+
z.strictObject({ node_id: prefixedDigestSchema("jag_node") }),
|
|
29
|
+
]);
|
|
30
|
+
const itemViewSchema = z
|
|
31
|
+
.strictObject({
|
|
32
|
+
kind: z.literal("item"),
|
|
33
|
+
collection: z.enum(["sections", "symbols", "modules"]),
|
|
34
|
+
selector: itemSelectorSchema,
|
|
35
|
+
})
|
|
36
|
+
.superRefine((value, context) => {
|
|
37
|
+
const selector = value.selector;
|
|
38
|
+
if (value.collection === "modules") {
|
|
39
|
+
if (!("path" in selector) && !("node_id" in selector))
|
|
40
|
+
context.addIssue({
|
|
41
|
+
code: "custom",
|
|
42
|
+
path: ["selector"],
|
|
43
|
+
message: "Module items are selected by exact path or node_id, not index or name.",
|
|
44
|
+
});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!("index" in selector) && !("name" in selector))
|
|
48
|
+
context.addIssue({
|
|
49
|
+
code: "custom",
|
|
50
|
+
path: ["selector"],
|
|
51
|
+
message: "Section and symbol items are selected by index or exact name, not path or node_id.",
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
const pageViewSchema = z.strictObject({
|
|
55
|
+
kind: z.literal("page"),
|
|
56
|
+
collection: z.enum(["sections", "symbols", "modules"]),
|
|
57
|
+
offset: z.number().int().nonnegative(),
|
|
58
|
+
limit: z.number().int().positive(),
|
|
59
|
+
});
|
|
60
|
+
/** Caller-selected projection of already completed analysis Evidence. */
|
|
61
|
+
export const analysisViewRequestSchema = z.discriminatedUnion("kind", [
|
|
62
|
+
summaryViewSchema,
|
|
63
|
+
facetViewSchema,
|
|
64
|
+
itemViewSchema,
|
|
65
|
+
pageViewSchema,
|
|
66
|
+
]);
|
|
67
|
+
/** Inline Evidence or an exact same-session retained reference. */
|
|
68
|
+
export const analysisViewSourceSchema = z.discriminatedUnion("kind", [
|
|
69
|
+
z.strictObject({
|
|
70
|
+
kind: z.literal("retained-evidence"),
|
|
71
|
+
evidence_id: prefixedDigestSchema("ev"),
|
|
72
|
+
}),
|
|
73
|
+
z.strictObject({
|
|
74
|
+
kind: z.literal("inline"),
|
|
75
|
+
evidence: evidenceSchema,
|
|
76
|
+
}),
|
|
77
|
+
]);
|
|
78
|
+
/** Public inspect_analysis_view input. */
|
|
79
|
+
export const inspectAnalysisViewInputSchema = z.strictObject({
|
|
80
|
+
source: analysisViewSourceSchema,
|
|
81
|
+
view: analysisViewRequestSchema,
|
|
82
|
+
});
|
|
83
|
+
const coverageSchema = z.strictObject({
|
|
84
|
+
status: z.enum(["complete-within-view", "page", "empty"]),
|
|
85
|
+
examined: z.number().int().nonnegative(),
|
|
86
|
+
total: z.number().int().nonnegative(),
|
|
87
|
+
next_offset: z.number().int().nonnegative().nullable(),
|
|
88
|
+
exhausted: z.boolean(),
|
|
89
|
+
});
|
|
90
|
+
const artifactSchema = z.strictObject({
|
|
91
|
+
path: z.string().min(1),
|
|
92
|
+
sha256: digestSchema,
|
|
93
|
+
});
|
|
94
|
+
const layoutSummarySchema = z.strictObject({
|
|
95
|
+
bytes: z.number().int().nonnegative(),
|
|
96
|
+
format: z.literal("elf"),
|
|
97
|
+
architecture: z.strictObject({
|
|
98
|
+
machine: z.literal("EM_X86_64"),
|
|
99
|
+
bits: z.literal(64),
|
|
100
|
+
byte_order: z.literal("little"),
|
|
101
|
+
}),
|
|
102
|
+
image_type: z.enum(["ET_EXEC", "ET_DYN", "ET_REL"]),
|
|
103
|
+
entry: z.strictObject({
|
|
104
|
+
reported_value: z.string().min(1),
|
|
105
|
+
meaning: z.enum(["linked-virtual-address", "not-applicable", "absent"]),
|
|
106
|
+
execution_status: z.literal("unknown"),
|
|
107
|
+
}),
|
|
108
|
+
counts: z.strictObject({
|
|
109
|
+
sections: z.number().int().nonnegative(),
|
|
110
|
+
segments: z.number().int().nonnegative(),
|
|
111
|
+
symbols: z.number().int().nonnegative(),
|
|
112
|
+
relocations: z.number().int().nonnegative(),
|
|
113
|
+
}),
|
|
114
|
+
limitation_count: z.number().int().nonnegative(),
|
|
115
|
+
});
|
|
116
|
+
const javascriptSummarySchema = z.strictObject({
|
|
117
|
+
input_path: z.string().min(1),
|
|
118
|
+
format: z.enum(["asar", "directory"]),
|
|
119
|
+
root_artifact_sha256: digestSchema,
|
|
120
|
+
statistics: jsonObjectSchema,
|
|
121
|
+
electron: jsonObjectSchema,
|
|
122
|
+
coverage: jsonObjectSchema,
|
|
123
|
+
limitation_count: z.number().int().nonnegative(),
|
|
124
|
+
});
|
|
125
|
+
const viewResultBase = {
|
|
126
|
+
parent_evidence_id: prefixedDigestSchema("ev"),
|
|
127
|
+
parent_operation: z.enum([
|
|
128
|
+
"inspect_binary_layout",
|
|
129
|
+
"analyze_javascript_application",
|
|
130
|
+
]),
|
|
131
|
+
parent_digest: digestSchema,
|
|
132
|
+
view_digest: digestSchema,
|
|
133
|
+
artifact: artifactSchema,
|
|
134
|
+
coverage: coverageSchema,
|
|
135
|
+
limitations: z.array(z.string()),
|
|
136
|
+
unknowns: z.array(z.string()),
|
|
137
|
+
};
|
|
138
|
+
/** Projected facts for one selected view of retained analysis Evidence. */
|
|
139
|
+
export const analysisViewResultSchema = z.discriminatedUnion("kind", [
|
|
140
|
+
z.strictObject({
|
|
141
|
+
kind: z.literal("summary"),
|
|
142
|
+
view: summaryViewSchema,
|
|
143
|
+
summary: z.union([layoutSummarySchema, javascriptSummarySchema]),
|
|
144
|
+
...viewResultBase,
|
|
145
|
+
}),
|
|
146
|
+
z.strictObject({
|
|
147
|
+
kind: z.literal("facet"),
|
|
148
|
+
view: facetViewSchema,
|
|
149
|
+
facet: jsonValueSchema,
|
|
150
|
+
...viewResultBase,
|
|
151
|
+
}),
|
|
152
|
+
z.strictObject({
|
|
153
|
+
kind: z.literal("item"),
|
|
154
|
+
view: itemViewSchema,
|
|
155
|
+
item: jsonValueSchema,
|
|
156
|
+
...viewResultBase,
|
|
157
|
+
}),
|
|
158
|
+
z.strictObject({
|
|
159
|
+
kind: z.literal("page"),
|
|
160
|
+
view: pageViewSchema,
|
|
161
|
+
items: z.array(jsonValueSchema),
|
|
162
|
+
...viewResultBase,
|
|
163
|
+
}),
|
|
164
|
+
]);
|
|
165
|
+
/** Construct a typed input failure for one selected-view constraint. */
|
|
166
|
+
export const analysisViewInputError = (issues) => new AnalysisInputError(INSPECT_ANALYSIS_VIEW_OPERATION, undefined, issues);
|
|
167
|
+
/** SHA-256 of the canonical projected JSON, excluding this digest field. */
|
|
168
|
+
export const analysisViewDigest = (projection) => digestCanonicalValue(projection, "Analysis view");
|
|
169
|
+
/** Attach the content digest that must change when projected bytes change. */
|
|
170
|
+
export const sealAnalysisView = (projection) => analysisViewResultSchema.parse({
|
|
171
|
+
...projection,
|
|
172
|
+
view_digest: analysisViewDigest(projection),
|
|
173
|
+
});
|
|
174
|
+
const parentDigest = (evidenceId) => evidenceId.slice(3);
|
|
175
|
+
const parseJavaScriptParent = (input) => {
|
|
176
|
+
try {
|
|
177
|
+
// Only the existing realm-private graph proofs permit reuse. Imported or
|
|
178
|
+
// merely frozen graphs still receive full canonical validation.
|
|
179
|
+
const steps = parseOwnedJavaScriptApplicationAnalysisSteps(input);
|
|
180
|
+
let step = steps.next();
|
|
181
|
+
while (!step.done)
|
|
182
|
+
step = steps.next();
|
|
183
|
+
return ok(step.value);
|
|
184
|
+
}
|
|
185
|
+
catch (cause) {
|
|
186
|
+
if (!(cause instanceof z.ZodError))
|
|
187
|
+
throw cause;
|
|
188
|
+
return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues.map((issue) => ({
|
|
189
|
+
...issue,
|
|
190
|
+
path: ["source", "normalized_result", ...issue.path],
|
|
191
|
+
})), { source: { normalized_result: input } }, { cause }));
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const unsupportedParent = (parent) => new AnalysisUnsupportedTargetError(INSPECT_ANALYSIS_VIEW_OPERATION, parentArtifactPath(parent), `Parent Evidence operation ${JSON.stringify(parent.operation)} is not inspect_binary_layout or analyze_javascript_application.`);
|
|
195
|
+
const parentArtifactPath = (parent) => {
|
|
196
|
+
if (typeof parent.normalizedResult === "object" &&
|
|
197
|
+
parent.normalizedResult !== null &&
|
|
198
|
+
"artifact" in parent.normalizedResult &&
|
|
199
|
+
typeof parent.normalizedResult.artifact === "object" &&
|
|
200
|
+
parent.normalizedResult.artifact !== null &&
|
|
201
|
+
"path" in parent.normalizedResult.artifact &&
|
|
202
|
+
typeof parent.normalizedResult.artifact.path === "string")
|
|
203
|
+
return parent.normalizedResult.artifact.path;
|
|
204
|
+
if (typeof parent.normalizedResult === "object" &&
|
|
205
|
+
parent.normalizedResult !== null &&
|
|
206
|
+
"input_path" in parent.normalizedResult &&
|
|
207
|
+
typeof parent.normalizedResult.input_path === "string")
|
|
208
|
+
return parent.normalizedResult.input_path;
|
|
209
|
+
return parent.evidenceId;
|
|
210
|
+
};
|
|
211
|
+
/** Project one selected view from authenticated parent analysis Evidence. */
|
|
212
|
+
export const projectAnalysisView = (parent, view) => {
|
|
213
|
+
const digest = parentDigest(parent.evidenceId);
|
|
214
|
+
if (!digestSchema.safeParse(digest).success)
|
|
215
|
+
return err(analysisViewInputError([
|
|
216
|
+
{
|
|
217
|
+
path: ["source"],
|
|
218
|
+
reason: "invalid_format",
|
|
219
|
+
message: "Parent Evidence ID is not a digest-backed identifier.",
|
|
220
|
+
},
|
|
221
|
+
]));
|
|
222
|
+
if (parent.operation === "inspect_binary_layout") {
|
|
223
|
+
const layout = binaryLayoutSchema.safeParse(parent.normalizedResult);
|
|
224
|
+
if (!layout.success)
|
|
225
|
+
return err(analysisViewInputError([
|
|
226
|
+
{
|
|
227
|
+
path: ["source"],
|
|
228
|
+
reason: "invalid_value",
|
|
229
|
+
message: "Parent Evidence result does not match inspect_binary_layout.",
|
|
230
|
+
},
|
|
231
|
+
]));
|
|
232
|
+
const projected = projectBinaryLayoutView(parent, layout.data, view);
|
|
233
|
+
return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
|
|
234
|
+
}
|
|
235
|
+
if (parent.operation === "analyze_javascript_application") {
|
|
236
|
+
const analysis = parseJavaScriptParent(parent.normalizedResult);
|
|
237
|
+
if (!analysis.ok)
|
|
238
|
+
return analysis;
|
|
239
|
+
const projected = projectJavaScriptApplicationView(parent, analysis.value, view);
|
|
240
|
+
return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
|
|
241
|
+
}
|
|
242
|
+
return err(unsupportedParent(parent));
|
|
243
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Coverage for a summary, facet, or single selected object. */
|
|
2
|
+
export const completeWithinViewCoverage = (examined, total) => ({
|
|
3
|
+
status: "complete-within-view",
|
|
4
|
+
examined,
|
|
5
|
+
total,
|
|
6
|
+
next_offset: null,
|
|
7
|
+
exhausted: true,
|
|
8
|
+
});
|
|
9
|
+
/** Coverage for a stable page, including an offset past the collection. */
|
|
10
|
+
export const pageViewCoverage = (offset, examined, total) => {
|
|
11
|
+
const exhausted = offset >= total || offset + examined >= total;
|
|
12
|
+
return {
|
|
13
|
+
status: examined === 0 ? "empty" : "page",
|
|
14
|
+
examined,
|
|
15
|
+
total,
|
|
16
|
+
next_offset: exhausted ? null : offset + examined,
|
|
17
|
+
exhausted,
|
|
18
|
+
};
|
|
19
|
+
};
|