rea-agents 6.1.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +5 -10
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/javascript/electronActiveObservation.js +26 -69
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +13 -12
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/createServer.js +49 -36
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -2,62 +2,69 @@ import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/manage
|
|
|
2
2
|
import {} from "./ManagedMetadataLayout.js";
|
|
3
3
|
import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataString, } from "./ManagedMetadataHeaps.js";
|
|
4
4
|
import { managedTableRowCounts } from "./ManagedMetadataInventory.js";
|
|
5
|
+
import { readManagedValue } from "./ManagedReaderFailure.js";
|
|
5
6
|
const flagsHex = (value) => `0x${value.toString(16).padStart(4, "0")}`;
|
|
6
|
-
export const parseModuleRefs = (bytes, layout, heapExtent) => {
|
|
7
|
+
export const parseModuleRefs = (bytes, layout, heapExtent, issues) => {
|
|
7
8
|
const refs = [];
|
|
8
9
|
const table = layout.table(26);
|
|
9
10
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
readManagedValue(() => {
|
|
12
|
+
const cursor = metadataRowCursor(bytes, layout, 26, row);
|
|
13
|
+
refs.push({
|
|
14
|
+
token: metadataToken(26, row),
|
|
15
|
+
row_offset: cursor.start,
|
|
16
|
+
name: readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent),
|
|
17
|
+
});
|
|
18
|
+
}, issues);
|
|
16
19
|
}
|
|
17
20
|
return refs;
|
|
18
21
|
};
|
|
19
|
-
export const parseFields = (bytes, layout, heapExtent) => {
|
|
22
|
+
export const parseFields = (bytes, layout, heapExtent, issues) => {
|
|
20
23
|
const fields = new Map();
|
|
21
24
|
const table = layout.table(4);
|
|
22
25
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
token,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
readManagedValue(() => {
|
|
27
|
+
const cursor = metadataRowCursor(bytes, layout, 4, row);
|
|
28
|
+
const flags = cursor.readUInt16();
|
|
29
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
30
|
+
cursor.readIndex(layout.blobIndexSize);
|
|
31
|
+
const token = metadataToken(4, row);
|
|
32
|
+
fields.set(token, {
|
|
33
|
+
token,
|
|
34
|
+
rowOffset: cursor.start,
|
|
35
|
+
kind: "field",
|
|
36
|
+
name,
|
|
37
|
+
flags,
|
|
38
|
+
implFlags: null,
|
|
39
|
+
rva: null,
|
|
40
|
+
});
|
|
41
|
+
}, issues);
|
|
37
42
|
}
|
|
38
43
|
return fields;
|
|
39
44
|
};
|
|
40
|
-
export const parseMethods = (bytes, layout, heapExtent) => {
|
|
45
|
+
export const parseMethods = (bytes, layout, heapExtent, issues) => {
|
|
41
46
|
const methods = new Map();
|
|
42
47
|
const table = layout.table(6);
|
|
43
48
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
token,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
49
|
+
readManagedValue(() => {
|
|
50
|
+
const cursor = metadataRowCursor(bytes, layout, 6, row);
|
|
51
|
+
const rva = cursor.readUInt32();
|
|
52
|
+
const implFlags = cursor.readUInt16();
|
|
53
|
+
const flags = cursor.readUInt16();
|
|
54
|
+
const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
55
|
+
cursor.readIndex(layout.blobIndexSize);
|
|
56
|
+
cursor.readIndex(layout.tableIndexSize(8));
|
|
57
|
+
const token = metadataToken(6, row);
|
|
58
|
+
methods.set(token, {
|
|
59
|
+
token,
|
|
60
|
+
rowOffset: cursor.start,
|
|
61
|
+
kind: "method",
|
|
62
|
+
name,
|
|
63
|
+
flags,
|
|
64
|
+
implFlags,
|
|
65
|
+
rva,
|
|
66
|
+
});
|
|
67
|
+
}, issues);
|
|
61
68
|
}
|
|
62
69
|
return methods;
|
|
63
70
|
};
|
|
@@ -66,46 +73,60 @@ export const parseImplMaps = ({ bytes, layout, heapExtent, modules, members, iss
|
|
|
66
73
|
const imports = [];
|
|
67
74
|
const table = layout.table(28);
|
|
68
75
|
for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
readManagedValue(() => {
|
|
77
|
+
const cursor = metadataRowCursor(bytes, layout, 28, row);
|
|
78
|
+
const mappingFlags = cursor.readUInt16();
|
|
79
|
+
const memberForwardedOffset = cursor.offset;
|
|
80
|
+
const memberForwardedRaw = cursor.readIndex(layout.codedIndexSize("MemberForwarded"));
|
|
81
|
+
const memberForwardedReason = metadataCodedTokenInvalidReason(memberForwardedRaw, 1, [4, 6], layout.rowCounts);
|
|
82
|
+
if (memberForwardedReason !== null || memberForwardedRaw === 0)
|
|
83
|
+
issues.push({
|
|
84
|
+
code: "invalid-row",
|
|
85
|
+
scope: `metadata.ImplMap:${metadataToken(28, row)}`,
|
|
86
|
+
offset: memberForwardedOffset,
|
|
87
|
+
detail: memberForwardedReason === null
|
|
88
|
+
? "ImplMap MemberForwarded coded index 0x0 is null, but the column must reference a Field or MethodDef row"
|
|
89
|
+
: `ImplMap MemberForwarded coded index 0x${memberForwardedRaw.toString(16)} is invalid: ${memberForwardedReason}`,
|
|
90
|
+
});
|
|
91
|
+
const memberToken = metadataCodedToken(memberForwardedRaw, 1, [4, 6], layout.rowCounts);
|
|
92
|
+
const importName = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
93
|
+
const importScopeOffset = cursor.offset;
|
|
94
|
+
const importScopeRow = cursor.readIndex(layout.tableIndexSize(26));
|
|
95
|
+
const moduleCount = layout.table(26)?.rowCount ?? 0;
|
|
96
|
+
const validImportScope = importScopeRow > 0 && importScopeRow <= moduleCount;
|
|
97
|
+
if (!validImportScope)
|
|
98
|
+
issues.push({
|
|
99
|
+
code: "invalid-row",
|
|
100
|
+
scope: `metadata.ImplMap:${metadataToken(28, row)}`,
|
|
101
|
+
offset: importScopeOffset,
|
|
102
|
+
detail: `ImplMap ImportScope row ${String(importScopeRow)} must reference a ModuleRef row between 1 and ${String(moduleCount)}`,
|
|
103
|
+
});
|
|
104
|
+
const importScopeToken = validImportScope
|
|
105
|
+
? metadataToken(26, importScopeRow)
|
|
106
|
+
: null;
|
|
107
|
+
const member = memberToken === null ? undefined : members.get(memberToken);
|
|
108
|
+
imports.push({
|
|
109
|
+
token: metadataToken(28, row),
|
|
110
|
+
row_offset: cursor.start,
|
|
111
|
+
mapping_flags: mappingFlags,
|
|
112
|
+
mapping_flags_hex: flagsHex(mappingFlags),
|
|
113
|
+
member_token: memberToken,
|
|
114
|
+
member_kind: member?.kind ?? "unknown",
|
|
115
|
+
member_name: member?.name ?? null,
|
|
116
|
+
import_name: importName,
|
|
117
|
+
import_scope_token: importScopeToken,
|
|
118
|
+
import_scope_name: importScopeToken === null
|
|
119
|
+
? null
|
|
120
|
+
: (moduleNames.get(importScopeToken)?.name ?? null),
|
|
121
|
+
no_mangle: (mappingFlags & 0x0001) !== 0,
|
|
122
|
+
char_set: charSet(mappingFlags),
|
|
123
|
+
call_convention: callConvention(mappingFlags),
|
|
124
|
+
supports_last_error: (mappingFlags & 0x0040) !== 0,
|
|
125
|
+
best_fit: bestFit(mappingFlags),
|
|
126
|
+
throw_on_unmappable_char: throwOnUnmappable(mappingFlags),
|
|
127
|
+
verification: "managed-declaration-only",
|
|
82
128
|
});
|
|
83
|
-
|
|
84
|
-
const importName = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
|
|
85
|
-
const importScopeRow = cursor.readIndex(layout.tableIndexSize(26));
|
|
86
|
-
const importScopeToken = importScopeRow === 0 ? null : metadataToken(26, importScopeRow);
|
|
87
|
-
const member = memberToken === null ? undefined : members.get(memberToken);
|
|
88
|
-
imports.push({
|
|
89
|
-
token: metadataToken(28, row),
|
|
90
|
-
row_offset: cursor.start,
|
|
91
|
-
mapping_flags: mappingFlags,
|
|
92
|
-
mapping_flags_hex: flagsHex(mappingFlags),
|
|
93
|
-
member_token: memberToken,
|
|
94
|
-
member_kind: member?.kind ?? "unknown",
|
|
95
|
-
member_name: member?.name ?? null,
|
|
96
|
-
import_name: importName,
|
|
97
|
-
import_scope_token: importScopeToken,
|
|
98
|
-
import_scope_name: importScopeToken === null
|
|
99
|
-
? null
|
|
100
|
-
: (moduleNames.get(importScopeToken)?.name ?? null),
|
|
101
|
-
no_mangle: (mappingFlags & 0x0001) !== 0,
|
|
102
|
-
char_set: charSet(mappingFlags),
|
|
103
|
-
call_convention: callConvention(mappingFlags),
|
|
104
|
-
supports_last_error: (mappingFlags & 0x0040) !== 0,
|
|
105
|
-
best_fit: bestFit(mappingFlags),
|
|
106
|
-
throw_on_unmappable_char: throwOnUnmappable(mappingFlags),
|
|
107
|
-
verification: "managed-declaration-only",
|
|
108
|
-
});
|
|
129
|
+
}, issues);
|
|
109
130
|
}
|
|
110
131
|
return imports;
|
|
111
132
|
};
|
|
@@ -168,6 +189,8 @@ const throwOnUnmappable = (flags) => {
|
|
|
168
189
|
export const nativeImplementations = (methods, pinvokeTokens) => {
|
|
169
190
|
const implementations = [];
|
|
170
191
|
for (const method of methods) {
|
|
192
|
+
if (method.kind !== "method")
|
|
193
|
+
continue;
|
|
171
194
|
const implFlags = method.implFlags ?? 0;
|
|
172
195
|
const codeType = codeTypeFor(implFlags);
|
|
173
196
|
const managedKind = managedKindFor(implFlags);
|
|
@@ -229,19 +252,9 @@ const boundaryKind = (pinvokeDeclared, codeType, managedKind) => {
|
|
|
229
252
|
return "unmanaged-method";
|
|
230
253
|
return "mixed-or-unknown";
|
|
231
254
|
};
|
|
232
|
-
/** CLI header facets of a PE without an admitted CLI header. */
|
|
233
|
-
export const NO_CLI_NATIVE = {
|
|
234
|
-
il_only: false,
|
|
235
|
-
requires_32bit: false,
|
|
236
|
-
strong_name_signed: false,
|
|
237
|
-
native_entry_point: false,
|
|
238
|
-
ready_to_run_signature: false,
|
|
239
|
-
managed_native_header_rva: 0,
|
|
240
|
-
managed_native_header_size: 0,
|
|
241
|
-
};
|
|
242
255
|
export const cliNative = (pe) => {
|
|
243
256
|
if (pe.cli === null)
|
|
244
|
-
return
|
|
257
|
+
return null;
|
|
245
258
|
return {
|
|
246
259
|
il_only: (pe.cli.flags & 0x0000_0001) !== 0,
|
|
247
260
|
requires_32bit: (pe.cli.flags & 0x0000_0002) !== 0,
|
|
@@ -255,10 +268,12 @@ export const cliNative = (pe) => {
|
|
|
255
268
|
/** Summarize declaration counts with the native facets of the CLI header. */
|
|
256
269
|
export const nativeBoundarySummary = (native, counts) => ({
|
|
257
270
|
...counts,
|
|
258
|
-
ready_to_run: native
|
|
259
|
-
mixed_mode_or_native_header: native
|
|
260
|
-
|
|
261
|
-
native.
|
|
271
|
+
ready_to_run: native?.ready_to_run_signature ?? null,
|
|
272
|
+
mixed_mode_or_native_header: native === null
|
|
273
|
+
? null
|
|
274
|
+
: native.managed_native_header_rva !== 0 ||
|
|
275
|
+
native.managed_native_header_size !== 0 ||
|
|
276
|
+
native.native_entry_point,
|
|
262
277
|
});
|
|
263
278
|
export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse({
|
|
264
279
|
artifact: {
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/managedArtifact.js";
|
|
2
|
-
import { readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
|
|
2
|
+
import { readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
|
|
3
3
|
import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
|
|
4
4
|
import { readManagedPeLayout, } from "./ManagedPeReader.js";
|
|
5
5
|
import { ManagedReaderFailure } from "./ManagedReaderFailure.js";
|
|
6
|
-
import { buildNativeBoundaryInspection, cliNative,
|
|
6
|
+
import { buildNativeBoundaryInspection, cliNative, nativeBoundarySummary, nativeImplementations, parseFields, parseImplMaps, parseMethods, parseModuleRefs, } from "./ManagedNativeBoundaryHelpers.js";
|
|
7
7
|
/**
|
|
8
8
|
* Report a PE whose CLI metadata is absent or cannot be admitted. `native`
|
|
9
9
|
* holds the CLI header facts when the header itself was admitted; otherwise
|
|
10
10
|
* the header is absent (`not-managed`) or unreadable (`malformed`).
|
|
11
11
|
*/
|
|
12
12
|
const emptyInspection = (target, bytes, classification, { native = null, issues = [], } = {}) => {
|
|
13
|
-
const header = native ?? NO_CLI_NATIVE;
|
|
14
13
|
return managedNativeBoundaryInspectionSchema.parse({
|
|
15
14
|
artifact: {
|
|
16
15
|
path: target.path,
|
|
@@ -29,11 +28,11 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
|
|
|
29
28
|
requires_artifact_sha256: target.sha256,
|
|
30
29
|
requires_mvid: null,
|
|
31
30
|
},
|
|
32
|
-
cli_native:
|
|
31
|
+
cli_native: native,
|
|
33
32
|
module_refs: [],
|
|
34
33
|
pinvoke_imports: [],
|
|
35
34
|
native_implementations: [],
|
|
36
|
-
summary: nativeBoundarySummary(
|
|
35
|
+
summary: nativeBoundarySummary(native, {
|
|
37
36
|
module_ref_count: 0,
|
|
38
37
|
pinvoke_import_count: 0,
|
|
39
38
|
native_implementation_count: 0,
|
|
@@ -41,23 +40,14 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
|
|
|
41
40
|
coverage: { state: "unavailable", issues },
|
|
42
41
|
limitations: [
|
|
43
42
|
"No CLI metadata was admitted; native boundary declarations are unavailable.",
|
|
44
|
-
...(native === null && classification === "malformed"
|
|
45
|
-
? [
|
|
46
|
-
"The CLI header was not admitted, so cli_native and the summary's ready_to_run and mixed_mode_or_native_header values are defaults, not observations.",
|
|
47
|
-
]
|
|
48
|
-
: []),
|
|
49
43
|
"Static inspection does not load or execute target code, so native export resolution is not performed.",
|
|
50
44
|
],
|
|
51
45
|
});
|
|
52
46
|
};
|
|
53
|
-
const readBoundaryInventory = (bytes, pe, cli) => {
|
|
47
|
+
const readBoundaryInventory = (bytes, pe, cli, issues) => {
|
|
54
48
|
const metadataOffset = pe.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
|
|
55
49
|
const layout = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size);
|
|
56
|
-
const
|
|
57
|
-
offset: pe.rvaToOffset(cli.resources.rva, cli.resources.size, "cli.resources"),
|
|
58
|
-
size: cli.resources.size,
|
|
59
|
-
};
|
|
60
|
-
const inventory = readManagedMetadataInventory(bytes, layout, resourceDirectory);
|
|
50
|
+
const inventory = readManagedMetadataInventory(bytes, layout, readManagedResourceDirectory(pe, issues));
|
|
61
51
|
return { layout, inventory };
|
|
62
52
|
};
|
|
63
53
|
/** Inspect managed/native boundary declarations from PE metadata without execution. */
|
|
@@ -75,10 +65,11 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
|
|
|
75
65
|
}
|
|
76
66
|
if (pe.cli === null)
|
|
77
67
|
return emptyInspection(target, bytes, pe.cliDirectoryPresent ? "malformed" : "not-managed", { issues: pe.cliIssue === null ? [] : [pe.cliIssue] });
|
|
68
|
+
const issues = [];
|
|
78
69
|
let layout;
|
|
79
70
|
let inventory;
|
|
80
71
|
try {
|
|
81
|
-
({ layout, inventory } = readBoundaryInventory(bytes, pe, pe.cli));
|
|
72
|
+
({ layout, inventory } = readBoundaryInventory(bytes, pe, pe.cli, issues));
|
|
82
73
|
}
|
|
83
74
|
catch (cause) {
|
|
84
75
|
if (!(cause instanceof ManagedReaderFailure))
|
|
@@ -89,11 +80,11 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
|
|
|
89
80
|
});
|
|
90
81
|
}
|
|
91
82
|
const heapExtent = Math.max(layout.strings.size, layout.blob.size);
|
|
92
|
-
|
|
93
|
-
const moduleRefs = parseModuleRefs(bytes, layout, heapExtent);
|
|
83
|
+
issues.push(...inventory.issues);
|
|
84
|
+
const moduleRefs = parseModuleRefs(bytes, layout, heapExtent, issues);
|
|
94
85
|
const members = new Map([
|
|
95
|
-
...parseFields(bytes, layout, heapExtent),
|
|
96
|
-
...parseMethods(bytes, layout, heapExtent),
|
|
86
|
+
...parseFields(bytes, layout, heapExtent, issues),
|
|
87
|
+
...parseMethods(bytes, layout, heapExtent, issues),
|
|
97
88
|
]);
|
|
98
89
|
const imports = parseImplMaps({
|
|
99
90
|
bytes,
|
|
@@ -8,3 +8,19 @@ export class ManagedReaderFailure extends Error {
|
|
|
8
8
|
}
|
|
9
9
|
/** Construct a typed managed parse failure at an exact byte location. */
|
|
10
10
|
export const managedFailure = (code, scope, detail, offset = null) => new ManagedReaderFailure({ code, scope, offset, detail });
|
|
11
|
+
/** Retain one malformed item's location while allowing independent items to be read. */
|
|
12
|
+
export const readManagedValue = (operation, issues) => {
|
|
13
|
+
try {
|
|
14
|
+
return operation();
|
|
15
|
+
}
|
|
16
|
+
catch (cause) {
|
|
17
|
+
if (!(cause instanceof ManagedReaderFailure))
|
|
18
|
+
throw cause;
|
|
19
|
+
issues.push(cause.issue);
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/** Preserve issue order while collapsing the same malformed producer fact across facets. */
|
|
24
|
+
export const uniqueManagedParseIssues = (issues) => [
|
|
25
|
+
...new Map(issues.map((issue) => [JSON.stringify(issue), issue])).values(),
|
|
26
|
+
];
|
|
@@ -3,7 +3,7 @@ import { createReadStream } from "node:fs";
|
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
5
5
|
import { MANAGED_STATIC_PROVIDER_IDENTITY as IDENTITY, managedStaticCapabilities, } from "./ManagedStaticProviderMetadata.js";
|
|
6
|
-
import { MANAGED_TOOL_CONTRACTS,
|
|
6
|
+
import { MANAGED_TOOL_CONTRACTS, managedTargetInputSchema, } from "../contracts/managed/managedToolContracts.js";
|
|
7
7
|
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../domain/analysisErrorCore.js";
|
|
8
8
|
import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
|
|
9
9
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
@@ -66,7 +66,7 @@ class ManagedStaticClient {
|
|
|
66
66
|
}
|
|
67
67
|
close() {
|
|
68
68
|
this.#snapshotBytes = undefined;
|
|
69
|
-
return Promise.resolve();
|
|
69
|
+
return Promise.resolve(ok(null));
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
const readManagedSnapshot = async (path, signal) => {
|
|
@@ -93,15 +93,13 @@ const hashManagedSource = async (path, signal) => {
|
|
|
93
93
|
};
|
|
94
94
|
const isManagedOperation = (operation) => MANAGED_TOOL_CONTRACTS.some(({ name }) => name === operation);
|
|
95
95
|
const inspectManagedOperation = (operation, parameters, bytes, target) => {
|
|
96
|
+
managedTargetInputSchema.parse(parameters);
|
|
96
97
|
if (operation === "inspect_managed_artifact") {
|
|
97
|
-
managedArtifactInputSchema.parse(parameters);
|
|
98
98
|
return inspectManagedArtifactBytes(bytes, target);
|
|
99
99
|
}
|
|
100
100
|
if (operation === "inspect_managed_native_boundaries") {
|
|
101
|
-
managedNativeBoundaryInputSchema.parse(parameters);
|
|
102
101
|
return inspectManagedNativeBoundariesBytes(bytes, target);
|
|
103
102
|
}
|
|
104
|
-
managedMemberInputSchema.parse(parameters);
|
|
105
103
|
return inspectManagedMembersBytes(bytes, target);
|
|
106
104
|
};
|
|
107
105
|
const managedLocations = (result) => {
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { cp, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createPackage } from "@electron/asar";
|
|
5
|
+
import { javascriptApplicationAnalysisResultSchema } from "../domain/javascript/javascriptApplicationAnalysis.js";
|
|
6
|
+
import { javaScriptExportShapeComparisonResultSchema } from "../domain/javascript/javascriptExportShapeComparisonSchemas.js";
|
|
7
|
+
const desktopFixtureFiles = {
|
|
8
|
+
"package.json": `${JSON.stringify({ name: "desktop-fixture", version: "1.0.0", main: "main.js" }, null, 2)}\n`,
|
|
9
|
+
"main.js": 'const { BrowserWindow, ipcMain } = require("electron");\nnew BrowserWindow({ webPreferences: { preload: require("node:path").join(__dirname, "preload.js"), contextIsolation: true, sandbox: true } });\nipcMain.handle("profile:read", (_event, id) => ({ id }));\n',
|
|
10
|
+
"preload.js": 'const { contextBridge, ipcRenderer } = require("electron");\ncontextBridge.exposeInMainWorld("profileApi", { read: (id) => ipcRenderer.invoke("profile:read", id) });\n',
|
|
11
|
+
"renderer/app.js": 'globalThis.profileApi.read("fixture");\n',
|
|
12
|
+
};
|
|
13
|
+
/** Materialize the exact packaged and source-owned parser targets used by the runner. */
|
|
14
|
+
export const createAgentEvaluationFixtures = async (root, repositoryRoot) => {
|
|
15
|
+
const desktop = join(root, "desktop-app");
|
|
16
|
+
const javascript = join(root, "desktop-app.asar");
|
|
17
|
+
const javascriptShapeLeft = join(root, "parser-v1");
|
|
18
|
+
const javascriptShapeRight = join(root, "parser-v2");
|
|
19
|
+
await Promise.all([
|
|
20
|
+
mkdir(join(desktop, "renderer"), { recursive: true }),
|
|
21
|
+
mkdir(javascriptShapeLeft, { recursive: true }),
|
|
22
|
+
mkdir(javascriptShapeRight, { recursive: true }),
|
|
23
|
+
]);
|
|
24
|
+
await Promise.all([
|
|
25
|
+
...Object.entries(desktopFixtureFiles).map(([path, source]) => writeFile(join(desktop, path), source)),
|
|
26
|
+
cp(join(repositoryRoot, "tests/fixtures/replay/parser.mjs"), join(javascriptShapeLeft, "parser.mjs")),
|
|
27
|
+
cp(join(repositoryRoot, "tests/fixtures/replay/parser-v2.mjs"), join(javascriptShapeRight, "parser.mjs")),
|
|
28
|
+
]);
|
|
29
|
+
await createPackage(desktop, javascript);
|
|
30
|
+
return {
|
|
31
|
+
javascript,
|
|
32
|
+
javascriptSha256: createHash("sha256")
|
|
33
|
+
.update(await readFile(javascript))
|
|
34
|
+
.digest("hex"),
|
|
35
|
+
javascriptShapeLeft,
|
|
36
|
+
javascriptShapeRight,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const singleObservation = (value, kind, include = () => true) => {
|
|
40
|
+
const result = javascriptApplicationAnalysisResultSchema.safeParse(value);
|
|
41
|
+
if (!result.success)
|
|
42
|
+
return undefined;
|
|
43
|
+
const candidates = result.data.graph.nodes
|
|
44
|
+
.filter((node) => node.kind === kind)
|
|
45
|
+
.flatMap((node) => node.observations)
|
|
46
|
+
.filter(include);
|
|
47
|
+
return candidates.length === 1 ? candidates[0] : undefined;
|
|
48
|
+
};
|
|
49
|
+
const observationSource = (observation) => {
|
|
50
|
+
const location = observation.evidence.location;
|
|
51
|
+
return location.available && location.value.kind === "source-range"
|
|
52
|
+
? location.value.source
|
|
53
|
+
: undefined;
|
|
54
|
+
};
|
|
55
|
+
const rendererApi = (value) => {
|
|
56
|
+
const observation = singleObservation(value, "context-bridge-api");
|
|
57
|
+
if (observation === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
const { api_key: key, members, world } = observation.properties;
|
|
60
|
+
const source = observationSource(observation);
|
|
61
|
+
if (key === undefined ||
|
|
62
|
+
members === undefined ||
|
|
63
|
+
world === undefined ||
|
|
64
|
+
source === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
return { key, members, world, source };
|
|
67
|
+
};
|
|
68
|
+
const ipcOperation = (side) => (value) => {
|
|
69
|
+
const observation = singleObservation(value, "ipc-channel", (candidate) => candidate.properties.side === side);
|
|
70
|
+
if (observation === undefined)
|
|
71
|
+
return undefined;
|
|
72
|
+
const { channel, operation } = observation.properties;
|
|
73
|
+
const source = observationSource(observation);
|
|
74
|
+
if (channel === undefined ||
|
|
75
|
+
operation === undefined ||
|
|
76
|
+
source === undefined)
|
|
77
|
+
return undefined;
|
|
78
|
+
return { channel, operation, source };
|
|
79
|
+
};
|
|
80
|
+
const preload = (value) => {
|
|
81
|
+
const observation = singleObservation(value, "electron-preload", (candidate) => candidate.properties.mechanism === "BrowserWindow:webPreferences.preload");
|
|
82
|
+
const path = observation?.properties.resolved_path;
|
|
83
|
+
const resolutionStatus = observation?.properties.resolution_status;
|
|
84
|
+
if (path === undefined || resolutionStatus === undefined)
|
|
85
|
+
return undefined;
|
|
86
|
+
return { path, resolution_status: resolutionStatus };
|
|
87
|
+
};
|
|
88
|
+
const headingChange = (value) => {
|
|
89
|
+
const result = javaScriptExportShapeComparisonResultSchema.safeParse(value);
|
|
90
|
+
if (!result.success)
|
|
91
|
+
return undefined;
|
|
92
|
+
const changes = result.data.changes.filter((change) => change.path === "/depth");
|
|
93
|
+
const change = changes.length === 1 ? changes[0] : undefined;
|
|
94
|
+
if (change === undefined)
|
|
95
|
+
return undefined;
|
|
96
|
+
return {
|
|
97
|
+
status: change.status,
|
|
98
|
+
path: change.path,
|
|
99
|
+
discriminant: change.discriminant,
|
|
100
|
+
left: change.left,
|
|
101
|
+
right: change.right,
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
const comparisonCoverage = (value) => {
|
|
105
|
+
const result = javaScriptExportShapeComparisonResultSchema.safeParse(value);
|
|
106
|
+
if (!result.success)
|
|
107
|
+
return undefined;
|
|
108
|
+
return {
|
|
109
|
+
status: result.data.coverage.status,
|
|
110
|
+
paired_variants: result.data.coverage.paired_variants,
|
|
111
|
+
...result.data.summary,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
const runtimeSemantics = (value) => {
|
|
115
|
+
const result = javaScriptExportShapeComparisonResultSchema.safeParse(value);
|
|
116
|
+
return result.success &&
|
|
117
|
+
result.data.limitations.includes("Return shapes are inferred from inert syntax and do not prove runtime behavior.")
|
|
118
|
+
? "not_established"
|
|
119
|
+
: undefined;
|
|
120
|
+
};
|
|
121
|
+
const asarClaims = (targets) => {
|
|
122
|
+
const source = {
|
|
123
|
+
operation: "analyze_javascript_application",
|
|
124
|
+
authority: "shipped-artifact",
|
|
125
|
+
confidence: "derived",
|
|
126
|
+
subject: { path: targets.javascript, sha256: targets.javascriptSha256 },
|
|
127
|
+
};
|
|
128
|
+
return [
|
|
129
|
+
{
|
|
130
|
+
id: "renderer_api",
|
|
131
|
+
expectedValue: {
|
|
132
|
+
key: "profileApi",
|
|
133
|
+
members: ["read"],
|
|
134
|
+
world: "main",
|
|
135
|
+
source: "preload.js",
|
|
136
|
+
},
|
|
137
|
+
source: { ...source, select: rendererApi },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "renderer_ipc",
|
|
141
|
+
expectedValue: {
|
|
142
|
+
channel: "profile:read",
|
|
143
|
+
operation: "invoke",
|
|
144
|
+
source: "preload.js",
|
|
145
|
+
},
|
|
146
|
+
source: { ...source, select: ipcOperation("renderer") },
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: "main_ipc",
|
|
150
|
+
expectedValue: {
|
|
151
|
+
channel: "profile:read",
|
|
152
|
+
operation: "handle",
|
|
153
|
+
source: "main.js",
|
|
154
|
+
},
|
|
155
|
+
source: { ...source, select: ipcOperation("main") },
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "preload",
|
|
159
|
+
expectedValue: { path: "preload.js", resolution_status: "resolved" },
|
|
160
|
+
source: { ...source, select: preload },
|
|
161
|
+
},
|
|
162
|
+
];
|
|
163
|
+
};
|
|
164
|
+
const parserClaims = (targets) => {
|
|
165
|
+
const source = {
|
|
166
|
+
operation: "compare_javascript_export_shapes",
|
|
167
|
+
authority: "analyst-inference",
|
|
168
|
+
confidence: "inferred",
|
|
169
|
+
parameters: {
|
|
170
|
+
left_module_path: "parser.mjs",
|
|
171
|
+
left_export_name: "default",
|
|
172
|
+
right_module_path: "parser.mjs",
|
|
173
|
+
right_export_name: "default",
|
|
174
|
+
},
|
|
175
|
+
linkedSubjects: [
|
|
176
|
+
{
|
|
177
|
+
operation: "analyze_javascript_application",
|
|
178
|
+
path: targets.javascriptShapeLeft,
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
operation: "analyze_javascript_application",
|
|
182
|
+
path: targets.javascriptShapeRight,
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
};
|
|
186
|
+
return [
|
|
187
|
+
{
|
|
188
|
+
id: "heading_change",
|
|
189
|
+
expectedValue: {
|
|
190
|
+
status: "added",
|
|
191
|
+
path: "/depth",
|
|
192
|
+
discriminant: { path: "/type", value: "heading" },
|
|
193
|
+
left: { availability: "absent" },
|
|
194
|
+
right: { availability: "literal", value: 1 },
|
|
195
|
+
},
|
|
196
|
+
source: { ...source, select: headingChange },
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: "comparison_coverage",
|
|
200
|
+
expectedValue: {
|
|
201
|
+
status: "complete-within-inputs",
|
|
202
|
+
paired_variants: 3,
|
|
203
|
+
added: 1,
|
|
204
|
+
removed: 0,
|
|
205
|
+
changed: 0,
|
|
206
|
+
unknown: 0,
|
|
207
|
+
},
|
|
208
|
+
source: { ...source, select: comparisonCoverage },
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: "runtime_semantics",
|
|
212
|
+
expectedValue: "not_established",
|
|
213
|
+
source: { ...source, select: runtimeSemantics },
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
};
|
|
217
|
+
/** Return the closed known-answer rubric, or undefined for routing-only scenarios. */
|
|
218
|
+
export const agentFixtureClaims = (scenarioId, targets) => {
|
|
219
|
+
if (scenarioId === "asar")
|
|
220
|
+
return asarClaims(targets);
|
|
221
|
+
if (scenarioId === "javascript-export-shape")
|
|
222
|
+
return parserClaims(targets);
|
|
223
|
+
return undefined;
|
|
224
|
+
};
|
|
225
|
+
const answerValueDescriptions = {
|
|
226
|
+
asar: [
|
|
227
|
+
'renderer_api: {"key": string, "members": string[], "world": string, "source": string}, describing the exposed bridge API, its members, world, and source file.',
|
|
228
|
+
'renderer_ipc: {"channel": string, "operation": string, "source": string}, describing the renderer-side IPC operation and its source file.',
|
|
229
|
+
'main_ipc: {"channel": string, "operation": string, "source": string}, describing the main-side IPC operation and its source file.',
|
|
230
|
+
'preload: {"path": string, "resolution_status": string}, describing the BrowserWindow-declared preload resolved within the shipped artifact.',
|
|
231
|
+
],
|
|
232
|
+
"javascript-export-shape": [
|
|
233
|
+
'heading_change: {"status": string, "path": string, "discriminant": object or null, "left": object, "right": object}, copying the exact heading-change fields from the comparison result.',
|
|
234
|
+
'comparison_coverage: {"status": string, "paired_variants": number, "added": number, "removed": number, "changed": number, "unknown": number}, copying comparison coverage and summary counts.',
|
|
235
|
+
'runtime_semantics: "established" or "not_established", stating whether the cited comparison establishes runtime behavior.',
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
/** Describe the strict answer contract without revealing any golden fixture values. */
|
|
239
|
+
export const agentFixtureAnswerInstructions = (scenarioId) => {
|
|
240
|
+
const descriptions = answerValueDescriptions[scenarioId];
|
|
241
|
+
if (descriptions === undefined)
|
|
242
|
+
return "";
|
|
243
|
+
return [
|
|
244
|
+
"For this benchmark, return only one JSON object, without Markdown fences or surrounding prose.",
|
|
245
|
+
'The exact shape is {"claims": [{"id": string, "value": JSON value, "evidence_id": string, "confidence": string, "authority": string}]}.',
|
|
246
|
+
"Include exactly one claim per ID below, without additional fields or claims. Infer values only from REA tool results; do not read target files directly.",
|
|
247
|
+
"Each evidence_id must identify the successful REA result that supports its claim. Copy confidence and authority from that result's Evidence envelope.",
|
|
248
|
+
...descriptions,
|
|
249
|
+
].join("\n");
|
|
250
|
+
};
|