rea-agents 6.1.0 → 6.3.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 +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- 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/android/AndroidAnalysisService.js +1 -1
- 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 +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- 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 +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- 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 +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- 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 +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- 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 +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- 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 +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- 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/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- 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 +7 -7
- 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/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- 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/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- 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/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -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/android/androidPartialObservation.js +36 -0
- 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 +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- 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/browserCompleteness.js +3 -2
- 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/browserScenarioCaptureValues.js +2 -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/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- 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 +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- 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 +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- 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 +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- 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/filesystem/RegularFile.js +41 -0
- 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 +105 -36
- 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 +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- 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 +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- 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 +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- 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/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- 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 +6 -6
- 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 +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- 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 +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- 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/registerManagedTools.js +7 -4
- 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 +32 -41
- 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 +19 -19
- 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 +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- 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 +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- 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/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -13,12 +13,28 @@ export class JadxSession {
|
|
|
13
13
|
#client = new Client({ name: "rea-android-adapter", version: "1" });
|
|
14
14
|
#loaded;
|
|
15
15
|
#connected = false;
|
|
16
|
+
#partialContext;
|
|
17
|
+
#observedCalls = [];
|
|
18
|
+
#serverName = null;
|
|
19
|
+
#serverVersion = null;
|
|
20
|
+
#engineVersion = null;
|
|
16
21
|
constructor(options, launcher) {
|
|
17
22
|
this.transport = new JadxMcpTransport(options, launcher);
|
|
18
23
|
}
|
|
19
24
|
/** Analyze one admitted immutable APK, checking producer identity and selectors. */
|
|
20
25
|
async execute(context) {
|
|
21
26
|
const { request, target, snapshot, jarHash, signal } = context;
|
|
27
|
+
this.#partialContext = {
|
|
28
|
+
operation: request.operation,
|
|
29
|
+
selectedPath: request.input.path,
|
|
30
|
+
target,
|
|
31
|
+
jarHash,
|
|
32
|
+
bridgeHash: context.bridgeHash,
|
|
33
|
+
};
|
|
34
|
+
this.#observedCalls = [];
|
|
35
|
+
this.#serverName = null;
|
|
36
|
+
this.#serverVersion = null;
|
|
37
|
+
this.#engineVersion = null;
|
|
22
38
|
const abort = () => {
|
|
23
39
|
void this.transport.close().catch(() => undefined);
|
|
24
40
|
};
|
|
@@ -26,17 +42,19 @@ export class JadxSession {
|
|
|
26
42
|
try {
|
|
27
43
|
signal.throwIfAborted();
|
|
28
44
|
this.transport.beginOperation();
|
|
29
|
-
const raw = [];
|
|
30
45
|
if (!this.#connected) {
|
|
31
46
|
await this.#client.connect(this.transport, { timeout: 30_000 });
|
|
32
47
|
this.#connected = true;
|
|
33
48
|
}
|
|
34
49
|
const server = this.#client.getServerVersion();
|
|
50
|
+
this.#serverName = server?.name ?? null;
|
|
51
|
+
this.#serverVersion = server?.version ?? null;
|
|
35
52
|
if (server?.name !== JADX_BRIDGE_IDENTITY.name ||
|
|
36
53
|
server.version !== JADX_BRIDGE_IDENTITY.version)
|
|
37
54
|
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected ${JADX_BRIDGE_IDENTITY.name} ${JADX_BRIDGE_IDENTITY.version}; server reported ${server?.name ?? "unknown"} ${server?.version ?? "unknown"}.`);
|
|
38
|
-
const tools = this.#tools(request, target, signal
|
|
55
|
+
const tools = this.#tools(request, target, signal);
|
|
39
56
|
const runtime = jadxRuntimeSchema.parse(await tools.json("rea_jvm_status", {}));
|
|
57
|
+
this.#engineVersion = runtime.engine_reported_version;
|
|
40
58
|
if (runtime.engine_reported_version !== JADX_RELEASE.version)
|
|
41
59
|
throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected engine ${JADX_RELEASE.version}; JAR reported ${runtime.engine_reported_version}.`);
|
|
42
60
|
const loaded = this.#loaded ??
|
|
@@ -63,7 +81,7 @@ export class JadxSession {
|
|
|
63
81
|
bridge_sha256: context.bridgeHash,
|
|
64
82
|
jar_sha256: jarHash,
|
|
65
83
|
loaded,
|
|
66
|
-
calls:
|
|
84
|
+
calls: this.#observedCalls,
|
|
67
85
|
},
|
|
68
86
|
subject: target,
|
|
69
87
|
limitations: JADX_LIMITATIONS,
|
|
@@ -76,6 +94,32 @@ export class JadxSession {
|
|
|
76
94
|
signal.removeEventListener("abort", abort);
|
|
77
95
|
}
|
|
78
96
|
}
|
|
97
|
+
/** Facts and upstream replies retained if a later request step fails. */
|
|
98
|
+
partialObservation() {
|
|
99
|
+
const context = this.#partialContext;
|
|
100
|
+
if (context === undefined)
|
|
101
|
+
return undefined;
|
|
102
|
+
return {
|
|
103
|
+
provider_id: "jadx",
|
|
104
|
+
operation: context.operation,
|
|
105
|
+
target: {
|
|
106
|
+
selected_path: context.selectedPath,
|
|
107
|
+
path: context.target.path,
|
|
108
|
+
sha256: context.target.sha256,
|
|
109
|
+
format: "apk",
|
|
110
|
+
},
|
|
111
|
+
provider_facts: {
|
|
112
|
+
jar_sha256: context.jarHash,
|
|
113
|
+
bridge_sha256: context.bridgeHash,
|
|
114
|
+
bridge_name: JADX_BRIDGE_IDENTITY.name,
|
|
115
|
+
bridge_version: JADX_BRIDGE_IDENTITY.version,
|
|
116
|
+
server_name: this.#serverName,
|
|
117
|
+
server_version: this.#serverVersion,
|
|
118
|
+
engine_version: this.#engineVersion,
|
|
119
|
+
},
|
|
120
|
+
calls: this.#observedCalls,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
79
123
|
/** Whether the selected Java runtime established the REA bridge protocol. */
|
|
80
124
|
initialized() {
|
|
81
125
|
return this.#connected;
|
|
@@ -89,16 +133,14 @@ export class JadxSession {
|
|
|
89
133
|
await this.transport.close();
|
|
90
134
|
}
|
|
91
135
|
}
|
|
92
|
-
#tools(request, target, signal
|
|
136
|
+
#tools(request, target, signal) {
|
|
93
137
|
const call = async (name, input) => {
|
|
94
138
|
signal.throwIfAborted();
|
|
95
139
|
const response = await this.#client.callTool({ name, arguments: input }, { timeout: 120_000, signal });
|
|
140
|
+
const observedResponse = jsonValueSchema.parse(response);
|
|
141
|
+
const call = { operation: name, input, response: observedResponse };
|
|
142
|
+
this.#observedCalls.push(call);
|
|
96
143
|
const envelope = parseJadxEnvelope(response, request.operation);
|
|
97
|
-
raw.push({
|
|
98
|
-
operation: name,
|
|
99
|
-
input,
|
|
100
|
-
response: jsonValueSchema.parse(response),
|
|
101
|
-
});
|
|
102
144
|
if (envelope.failed) {
|
|
103
145
|
if (envelope.text.startsWith("{")) {
|
|
104
146
|
const failure = jadxInputFailureSchema.safeParse(parseJadxJson(envelope.text, request.operation));
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { access,
|
|
3
|
+
import { access, lstat, realpath, stat, } from "node:fs/promises";
|
|
4
4
|
import { extname, isAbsolute, resolve } from "node:path";
|
|
5
5
|
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
6
|
+
import { openRegularFile, sameRegularFileState, } from "../filesystem/RegularFile.js";
|
|
7
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
6
8
|
import { err, ok } from "../domain/result.js";
|
|
7
9
|
import { resolveAppBundleExecutable, } from "./AppBundleExecutable.js";
|
|
8
10
|
import { validateDosComLength, } from "../domain/dosCom.js";
|
|
@@ -14,30 +16,41 @@ import { parseExecutableHeader, parsePeRecord, } from "../domain/binaryTarget.js
|
|
|
14
16
|
* FAT Mach-O inputs select only a host-compatible architecture so setup remains
|
|
15
17
|
* non-interactive; unsupported or ambiguous inputs are returned as typed errors.
|
|
16
18
|
*/
|
|
17
|
-
export const parseBinaryTarget = async (input,
|
|
19
|
+
export const parseBinaryTarget = async (input, options = {}) => {
|
|
20
|
+
const cwd = options.cwd ?? process.cwd();
|
|
21
|
+
const hostArchitecture = options.hostArchitecture ?? process.arch;
|
|
22
|
+
const { targetKind, formatHint, signal } = options;
|
|
18
23
|
const candidate = isAbsolute(input) ? input : resolve(cwd, input);
|
|
19
24
|
try {
|
|
25
|
+
throwIfTargetResolutionCancelled(signal);
|
|
20
26
|
await access(candidate, constants.R_OK);
|
|
27
|
+
throwIfTargetResolutionCancelled(signal);
|
|
21
28
|
const canonical = await realpath(candidate);
|
|
29
|
+
throwIfTargetResolutionCancelled(signal);
|
|
22
30
|
const resolved = await resolveAppBundle(canonical);
|
|
31
|
+
throwIfTargetResolutionCancelled(signal);
|
|
23
32
|
if (!resolved.ok)
|
|
24
33
|
return err(resolved.error);
|
|
25
34
|
const { executable: path, infoPlist } = resolved.value;
|
|
26
35
|
const bundle = infoPlist === undefined ? {} : { bundleInfoPlist: infoPlist };
|
|
27
|
-
const handle = await
|
|
36
|
+
const handle = await openRegularFile(path, {
|
|
37
|
+
symlinks: "reject",
|
|
38
|
+
signal,
|
|
39
|
+
});
|
|
28
40
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
41
|
+
throwIfTargetResolutionCancelled(signal);
|
|
42
|
+
const metadata = await handle.stat();
|
|
43
|
+
throwIfTargetResolutionCancelled(signal);
|
|
31
44
|
if (formatHint === "dos-com") {
|
|
32
45
|
if (targetKind !== undefined && targetKind !== "executable")
|
|
33
46
|
return err(new BinaryTargetError(path, "DOS COM format requires an executable target kind"));
|
|
34
|
-
const length = validateDosComLength(
|
|
47
|
+
const length = validateDosComLength(metadata.size);
|
|
35
48
|
if (!length.ok)
|
|
36
49
|
return err(new BinaryTargetError(path, length.error));
|
|
37
50
|
return ok({
|
|
38
51
|
path,
|
|
39
52
|
sourcePath: canonical,
|
|
40
|
-
sha256: await sha256Handle(handle),
|
|
53
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
41
54
|
kind: "executable",
|
|
42
55
|
format: "dos-com",
|
|
43
56
|
architecture: "x86",
|
|
@@ -49,29 +62,29 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
|
|
|
49
62
|
return ok({
|
|
50
63
|
path,
|
|
51
64
|
sourcePath: process.platform === "win32" ? candidate : canonical,
|
|
52
|
-
sha256: await sha256Handle(handle),
|
|
65
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
53
66
|
kind: "database",
|
|
54
67
|
format: "analysis-database",
|
|
55
68
|
});
|
|
56
|
-
const artifactFormat = await detectArtifactFormat(path, handle);
|
|
69
|
+
const artifactFormat = await detectArtifactFormat(path, handle, signal);
|
|
57
70
|
if (artifactFormat !== undefined) {
|
|
58
71
|
const identity = {
|
|
59
72
|
path,
|
|
60
73
|
sourcePath: process.platform === "win32" ? candidate : canonical,
|
|
61
|
-
sha256: await sha256Handle(handle),
|
|
74
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
62
75
|
};
|
|
63
76
|
return isArchiveFormat(artifactFormat)
|
|
64
77
|
? ok({ ...identity, kind: "archive", format: artifactFormat })
|
|
65
78
|
: ok({ ...identity, kind: "artifact", format: artifactFormat });
|
|
66
79
|
}
|
|
67
|
-
const detected = await readExecutableMetadata(handle, hostArchitecture);
|
|
80
|
+
const detected = await readExecutableMetadata(handle, hostArchitecture, signal);
|
|
68
81
|
if (!detected.ok)
|
|
69
82
|
return err(new BinaryTargetError(path, detected.error));
|
|
70
83
|
return ok({
|
|
71
84
|
path,
|
|
72
85
|
sourcePath: process.platform === "win32" ? candidate : canonical,
|
|
73
86
|
...bundle,
|
|
74
|
-
sha256: await sha256Handle(handle),
|
|
87
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
75
88
|
kind: "executable",
|
|
76
89
|
...detected.value,
|
|
77
90
|
});
|
|
@@ -81,6 +94,10 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
|
|
|
81
94
|
}
|
|
82
95
|
}
|
|
83
96
|
catch (cause) {
|
|
97
|
+
if (cause instanceof AnalysisCancelledError)
|
|
98
|
+
return err(cause);
|
|
99
|
+
if (cause instanceof BinaryTargetError)
|
|
100
|
+
return err(cause);
|
|
84
101
|
if (!(cause instanceof Error))
|
|
85
102
|
throw cause;
|
|
86
103
|
const code = filesystemErrorCode(cause);
|
|
@@ -103,14 +120,24 @@ const targetFailureReason = (code, detail) => {
|
|
|
103
120
|
return `permission denied while reading target: ${detail}`;
|
|
104
121
|
case "EISDIR":
|
|
105
122
|
return `target is a directory, not a readable file: ${detail}`;
|
|
123
|
+
case "ENOTFILE":
|
|
124
|
+
return "target is not a regular file";
|
|
125
|
+
case "ELOOP":
|
|
126
|
+
return `target changed while being opened: ${detail}`;
|
|
106
127
|
default:
|
|
107
128
|
return `target could not be read (${code}): ${detail}`;
|
|
108
129
|
}
|
|
109
130
|
};
|
|
110
|
-
const
|
|
131
|
+
const throwIfTargetResolutionCancelled = (signal) => {
|
|
132
|
+
if (signal?.aborted === true)
|
|
133
|
+
throw new AnalysisCancelledError("resolve_binary_target");
|
|
134
|
+
};
|
|
135
|
+
const detectArtifactFormat = async (path, handle, signal) => {
|
|
136
|
+
throwIfTargetResolutionCancelled(signal);
|
|
111
137
|
const lower = path.toLowerCase();
|
|
112
138
|
const magic = Buffer.alloc(8);
|
|
113
139
|
const observed = await handle.read(magic, 0, magic.length, 0);
|
|
140
|
+
throwIfTargetResolutionCancelled(signal);
|
|
114
141
|
if (hasZipSignature(magic.subarray(0, observed.bytesRead))) {
|
|
115
142
|
return zipPackageFormatForPath(lower) ?? "zip";
|
|
116
143
|
}
|
|
@@ -122,10 +149,13 @@ const detectArtifactFormat = async (path, handle) => {
|
|
|
122
149
|
magic.subarray(0, 4).toString("ascii") === "xar!")
|
|
123
150
|
return "pkg";
|
|
124
151
|
if (lower.endsWith(".dmg")) {
|
|
152
|
+
throwIfTargetResolutionCancelled(signal);
|
|
125
153
|
const size = (await handle.stat()).size;
|
|
154
|
+
throwIfTargetResolutionCancelled(signal);
|
|
126
155
|
if (size >= 512) {
|
|
127
156
|
const trailer = Buffer.alloc(4);
|
|
128
157
|
const read = await handle.read(trailer, 0, trailer.length, size - 512);
|
|
158
|
+
throwIfTargetResolutionCancelled(signal);
|
|
129
159
|
if (read.bytesRead === 4 && trailer.toString("ascii") === "koly")
|
|
130
160
|
return "dmg";
|
|
131
161
|
}
|
|
@@ -142,17 +172,25 @@ const namedArtifactFormat = (lowerPath) => {
|
|
|
142
172
|
return /\.(?:m?js|cjs)$/u.test(lowerPath) ? "javascript" : undefined;
|
|
143
173
|
};
|
|
144
174
|
const isArchiveFormat = (format) => ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(format);
|
|
145
|
-
const sha256Handle = async (handle) => {
|
|
175
|
+
const sha256Handle = async (handle, path, initial, signal) => {
|
|
146
176
|
const hash = createHash("sha256");
|
|
147
177
|
const chunk = Buffer.allocUnsafe(64 * 1024);
|
|
148
178
|
let position = 0;
|
|
149
179
|
while (true) {
|
|
180
|
+
throwIfTargetResolutionCancelled(signal);
|
|
150
181
|
const observed = await handle.read(chunk, 0, chunk.length, position);
|
|
182
|
+
throwIfTargetResolutionCancelled(signal);
|
|
151
183
|
if (observed.bytesRead === 0)
|
|
152
184
|
break;
|
|
153
185
|
hash.update(chunk.subarray(0, observed.bytesRead));
|
|
154
186
|
position += observed.bytesRead;
|
|
155
187
|
}
|
|
188
|
+
throwIfTargetResolutionCancelled(signal);
|
|
189
|
+
const [opened, currentPath] = await Promise.all([handle.stat(), lstat(path)]);
|
|
190
|
+
if (!sameRegularFileState(initial, opened) ||
|
|
191
|
+
!sameRegularFileState(initial, currentPath) ||
|
|
192
|
+
position !== initial.size)
|
|
193
|
+
throw new BinaryTargetError(path, "target changed while being read");
|
|
156
194
|
return hash.digest("hex");
|
|
157
195
|
};
|
|
158
196
|
const resolveAppBundle = async (path) => {
|
|
@@ -165,16 +203,22 @@ const resolveAppBundle = async (path) => {
|
|
|
165
203
|
}));
|
|
166
204
|
return resolveAppBundleExecutable(path);
|
|
167
205
|
};
|
|
168
|
-
const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
206
|
+
const readExecutableMetadata = async (handle, hostArchitecture, signal) => {
|
|
207
|
+
throwIfTargetResolutionCancelled(signal);
|
|
169
208
|
const prefix = Buffer.alloc(4096);
|
|
170
209
|
const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
|
|
210
|
+
throwIfTargetResolutionCancelled(signal);
|
|
171
211
|
const bytes = prefix.subarray(0, prefixRead.bytesRead);
|
|
212
|
+
// Header commitments such as Mach-O load commands and FAT slices are
|
|
213
|
+
// checked against the whole file, not the probed prefix.
|
|
214
|
+
const fileSize = (await handle.stat()).size;
|
|
215
|
+
throwIfTargetResolutionCancelled(signal);
|
|
172
216
|
if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
|
|
173
217
|
const offset = mzWindowsHeaderOffset(bytes);
|
|
174
218
|
if (offset !== null) {
|
|
175
219
|
if (offset < 64)
|
|
176
220
|
return err("invalid Windows new-header offset in MZ image");
|
|
177
|
-
return readPeMetadata(handle, offset);
|
|
221
|
+
return readPeMetadata(handle, offset, signal);
|
|
178
222
|
}
|
|
179
223
|
// MZ relocation records may extend past the initial probe; their format
|
|
180
224
|
// bounds are at most 65535 records inside a 65535-paragraph header.
|
|
@@ -182,12 +226,12 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
182
226
|
? bytes.readUInt16LE(24) + bytes.readUInt16LE(6) * 4
|
|
183
227
|
: 0;
|
|
184
228
|
const headerBytes = bytes.length >= 28 ? bytes.readUInt16LE(8) * 16 : 0;
|
|
185
|
-
const fileSize = (await handle.stat()).size;
|
|
186
229
|
if (tableEnd > bytes.length &&
|
|
187
230
|
tableEnd <= headerBytes &&
|
|
188
231
|
tableEnd <= fileSize) {
|
|
189
232
|
const table = Buffer.alloc(tableEnd);
|
|
190
233
|
const observed = await handle.read(table, 0, table.length, 0);
|
|
234
|
+
throwIfTargetResolutionCancelled(signal);
|
|
191
235
|
return parseExecutableHeader(table.subarray(0, observed.bytesRead), hostArchitecture, fileSize);
|
|
192
236
|
}
|
|
193
237
|
return parseExecutableHeader(bytes, hostArchitecture, fileSize);
|
|
@@ -201,15 +245,18 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
201
245
|
if (count <= 128 && required > bytes.length) {
|
|
202
246
|
const header = Buffer.alloc(required);
|
|
203
247
|
const headerRead = await handle.read(header, 0, header.length, 0);
|
|
204
|
-
|
|
248
|
+
throwIfTargetResolutionCancelled(signal);
|
|
249
|
+
return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture, fileSize);
|
|
205
250
|
}
|
|
206
251
|
}
|
|
207
252
|
}
|
|
208
|
-
return parseExecutableHeader(bytes, hostArchitecture);
|
|
253
|
+
return parseExecutableHeader(bytes, hostArchitecture, fileSize);
|
|
209
254
|
};
|
|
210
|
-
const readPeMetadata = async (handle, offset) => {
|
|
255
|
+
const readPeMetadata = async (handle, offset, signal) => {
|
|
256
|
+
throwIfTargetResolutionCancelled(signal);
|
|
211
257
|
const fileHeader = Buffer.alloc(24);
|
|
212
258
|
const fileHeaderRead = await handle.read(fileHeader, 0, fileHeader.length, offset);
|
|
259
|
+
throwIfTargetResolutionCancelled(signal);
|
|
213
260
|
if (fileHeaderRead.bytesRead !== fileHeader.length)
|
|
214
261
|
return err("invalid or truncated PE header");
|
|
215
262
|
const signature = fileHeader.toString("ascii", 0, 2);
|
|
@@ -220,6 +267,7 @@ const readPeMetadata = async (handle, offset) => {
|
|
|
220
267
|
return err("invalid PE optional header size");
|
|
221
268
|
const record = Buffer.alloc(24 + optionalHeaderSize);
|
|
222
269
|
const recordRead = await handle.read(record, 0, record.length, offset);
|
|
270
|
+
throwIfTargetResolutionCancelled(signal);
|
|
223
271
|
return recordRead.bytesRead === record.length
|
|
224
272
|
? parsePeRecord(record)
|
|
225
273
|
: err("invalid or truncated PE header");
|
|
@@ -27,21 +27,16 @@ export const createBrowserEvidence = (operation, input, result, provider) => cre
|
|
|
27
27
|
});
|
|
28
28
|
const browserParameters = (input, result) => {
|
|
29
29
|
if (!("cdp_endpoint" in input)) {
|
|
30
|
-
if ("before_scenario" in input
|
|
31
|
-
input.before_scenario !== undefined &&
|
|
32
|
-
input.after_scenario !== undefined)
|
|
30
|
+
if ("before_scenario" in input)
|
|
33
31
|
return {
|
|
34
32
|
comparison_kind: "browser_scenario",
|
|
35
33
|
before_browser: input.before_scenario.browser,
|
|
36
34
|
after_browser: input.after_scenario.browser,
|
|
37
35
|
before_start_origin: input.before_scenario.scenario.start_origin,
|
|
38
36
|
after_start_origin: input.after_scenario.scenario.start_origin,
|
|
39
|
-
normalization_sha256: commitBrowserScenarioNormalization(input.normalization
|
|
37
|
+
normalization_sha256: commitBrowserScenarioNormalization(input.normalization).sha256,
|
|
40
38
|
};
|
|
41
|
-
if (input.before
|
|
42
|
-
input.after !== undefined &&
|
|
43
|
-
"inspection" in input.before &&
|
|
44
|
-
"inspection" in input.after)
|
|
39
|
+
if ("inspection" in input.before && "inspection" in input.after)
|
|
45
40
|
return {
|
|
46
41
|
before_target_id: input.before.inspection.target.target_id,
|
|
47
42
|
before_capture_ended_at: input.before.inspection.capture_window.ended_at,
|
|
@@ -1,25 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
|
|
1
|
+
import { digestCanonicalValue } from "../domain/canonicalDigest.js";
|
|
3
2
|
import { createEvidence, } from "../domain/evidence.js";
|
|
4
|
-
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
3
|
+
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
5
4
|
const browserScenarioParameters = (scenario) => ({
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
...(scenario.browser.mode === "launch"
|
|
9
|
-
? { browser_headless: scenario.browser.headless }
|
|
10
|
-
: {}),
|
|
11
|
-
start_url: sanitizeBrowserUrl(scenario.start_url.url),
|
|
12
|
-
environment: scenario.environment,
|
|
13
|
-
actions: scenario.actions.map(({ step_id, action }) => ({
|
|
14
|
-
step_id,
|
|
15
|
-
action,
|
|
16
|
-
})),
|
|
17
|
-
action_timeouts_ms: scenario.actions.map((item) => "timeout_ms" in item ? (item.timeout_ms ?? null) : null),
|
|
18
|
-
secret_declarations: scenario.secrets.map(({ secret_id, environment_variable }) => ({
|
|
19
|
-
secret_id,
|
|
20
|
-
environment_variable,
|
|
21
|
-
})),
|
|
22
|
-
capture: scenario.capture,
|
|
5
|
+
...jsonObjectSchema.parse(scenario),
|
|
6
|
+
scenario_sha256: digestCanonicalValue(scenario, "Browser scenario"),
|
|
23
7
|
});
|
|
24
8
|
/** Create Evidence without retaining resolved scenario secret values. */
|
|
25
9
|
export const createBrowserScenarioEvidence = (scenario, capture, provider) => createEvidence(undefined, provider, {
|
|
@@ -37,6 +37,21 @@ const ENHANCED_REQUIREMENTS = {
|
|
|
37
37
|
"resolve_containing_procedure",
|
|
38
38
|
],
|
|
39
39
|
};
|
|
40
|
+
/** Contract kinds whose operations run on the active session target. */
|
|
41
|
+
const ACTIVE_TARGET_KINDS = new Set([
|
|
42
|
+
"official-proxy",
|
|
43
|
+
"enhanced",
|
|
44
|
+
"native-provider",
|
|
45
|
+
"artifact-provider",
|
|
46
|
+
]);
|
|
47
|
+
/** Native contracts defined only for an active Mach-O executable. */
|
|
48
|
+
const MACHO_TARGET_OPERATIONS = new Set([
|
|
49
|
+
"inspect_macho",
|
|
50
|
+
"list_architectures",
|
|
51
|
+
"observe_native_calls",
|
|
52
|
+
"observe_native_ui",
|
|
53
|
+
"capture_native_ui_scenario",
|
|
54
|
+
]);
|
|
40
55
|
const NAVIGATION_CONTEXT_MODES = [
|
|
41
56
|
{
|
|
42
57
|
name: "current_selection",
|
|
@@ -61,6 +76,7 @@ export const buildCapabilityInventory = (sessionStatus, policy, clientFeatures =
|
|
|
61
76
|
kind: contract.kind,
|
|
62
77
|
targetOpen: status.open,
|
|
63
78
|
targetKind: status.kind,
|
|
79
|
+
targetFormat: status.format,
|
|
64
80
|
descriptors,
|
|
65
81
|
policy,
|
|
66
82
|
});
|
|
@@ -125,6 +141,9 @@ const availabilityFor = (context) => {
|
|
|
125
141
|
const workflowAvailability = workflowAvailabilityFor(context);
|
|
126
142
|
if (workflowAvailability !== null)
|
|
127
143
|
return workflowAvailability;
|
|
144
|
+
const hostDecision = hostAvailability(context);
|
|
145
|
+
if (hostDecision !== null)
|
|
146
|
+
return hostDecision;
|
|
128
147
|
const targetDecision = targetAvailability(context);
|
|
129
148
|
if (targetDecision !== null)
|
|
130
149
|
return targetDecision;
|
|
@@ -226,7 +245,7 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
|
|
|
226
245
|
? "unsupported_host"
|
|
227
246
|
: "provider_missing",
|
|
228
247
|
remediation: policy.androidAnalysisAvailability?.reason ??
|
|
229
|
-
"Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux or
|
|
248
|
+
"Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux, macOS, or Windows x64 with its matching bundled native controls.",
|
|
230
249
|
};
|
|
231
250
|
const browser = browserProviderAvailability(name, kind, policy);
|
|
232
251
|
if (browser !== null)
|
|
@@ -286,8 +305,22 @@ const browserProviderAvailability = (name, kind, policy) => {
|
|
|
286
305
|
remediation: "Start REA with its browser observation provider available.",
|
|
287
306
|
};
|
|
288
307
|
};
|
|
289
|
-
|
|
290
|
-
|
|
308
|
+
/**
|
|
309
|
+
* Opening another target cannot make an operation run on an unsupported host.
|
|
310
|
+
* Composed operations are decided by their requirements, which another
|
|
311
|
+
* provider may satisfy.
|
|
312
|
+
*/
|
|
313
|
+
const hostAvailability = ({ descriptors, kind, name, }) => {
|
|
314
|
+
if (kind === "enhanced")
|
|
315
|
+
return null;
|
|
316
|
+
const descriptor = descriptors.get(name);
|
|
317
|
+
return descriptor?.available === false &&
|
|
318
|
+
descriptor.availability_code === "unsupported_host"
|
|
319
|
+
? { reason: "unsupported_host", remediation: descriptor.reason }
|
|
320
|
+
: null;
|
|
321
|
+
};
|
|
322
|
+
const targetAvailability = ({ name, kind, targetKind, targetFormat, targetOpen, }) => {
|
|
323
|
+
if (!targetOpen && ACTIVE_TARGET_KINDS.has(kind))
|
|
291
324
|
return {
|
|
292
325
|
reason: "target_required",
|
|
293
326
|
remediation: "Call open_binary with a supported local target.",
|
|
@@ -300,6 +333,13 @@ const targetAvailability = ({ kind, targetKind, targetOpen, }) => {
|
|
|
300
333
|
reason: "target_unsupported",
|
|
301
334
|
remediation: "Inventory or extract a native executable, then call open_binary on that executable.",
|
|
302
335
|
};
|
|
336
|
+
if (targetOpen &&
|
|
337
|
+
MACHO_TARGET_OPERATIONS.has(name) &&
|
|
338
|
+
(targetKind !== "executable" || targetFormat !== "mach-o"))
|
|
339
|
+
return {
|
|
340
|
+
reason: "target_unsupported",
|
|
341
|
+
remediation: "Call open_binary with a Mach-O executable or an app bundle whose main executable is Mach-O.",
|
|
342
|
+
};
|
|
303
343
|
return null;
|
|
304
344
|
};
|
|
305
345
|
const providerAvailability = ({ descriptors, kind, name, }) => {
|
|
@@ -316,12 +356,6 @@ const providerAvailability = ({ descriptors, kind, name, }) => {
|
|
|
316
356
|
reason: "provider_missing",
|
|
317
357
|
remediation: "Install or configure a provider that declares this operation.",
|
|
318
358
|
};
|
|
319
|
-
if (!descriptor.available &&
|
|
320
|
-
descriptor.availability_code === "unsupported_host")
|
|
321
|
-
return {
|
|
322
|
-
reason: "unsupported_host",
|
|
323
|
-
remediation: descriptor.reason,
|
|
324
|
-
};
|
|
325
359
|
return descriptor.available
|
|
326
360
|
? { reason: "available", remediation: null }
|
|
327
361
|
: {
|