rea-agents 6.0.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 +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- 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 +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- 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 +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- 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 +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- 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 +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- 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/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- 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/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- 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 +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -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 +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- 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 +7 -14
- 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 +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- 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 +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- 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/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- 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/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- 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 +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- 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/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- 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/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -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/domain/javascript/javascriptAstValues.js +20 -0
- 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/javascriptRecovery.js +3 -8
- 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 +106 -5
- 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/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- 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 +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- 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 +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- 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 +21 -16
- 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 +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- 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/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -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 +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- 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 +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- 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/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -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/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- 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/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- 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 +157 -0
- package/dist/server/createServer.js +61 -41
- 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 -5
- 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 -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 +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- 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 +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- 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 +20 -3
- 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/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,11 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createImmutableEvidenceSteps, } from "../../domain/evidence.js";
|
|
2
2
|
import { JAVASCRIPT_APPLICATION_PROVIDER } from "../InvestigationProviders.js";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { freezeOwnedJsonSnapshotSteps } from "../../domain/immutableJson.js";
|
|
4
|
+
import { rememberOwnedApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
|
|
5
|
+
import { completeJavaScriptAnalysisSteps } from "./JavaScriptAnalysisControl.js";
|
|
6
|
+
import { jsonValueValidationSteps } from "../../domain/jsonValue.js";
|
|
7
|
+
/** Create owned analysis Evidence while allowing request cancellation during sealing and hashing. */
|
|
8
|
+
export const createOwnedJavaScriptApplicationEvidenceCooperatively = async (input, result, signal, progress) => {
|
|
9
|
+
await reportEvidencePhase(progress, "seal_javascript_application_result", "Sealing the complete application analysis result");
|
|
10
|
+
const snapshot = await completeJavaScriptAnalysisSteps(freezeOwnedJsonSnapshotSteps(result), signal);
|
|
11
|
+
await reportEvidencePhase(progress, "validate_javascript_application_evidence", "Validating the immutable application Evidence JSON");
|
|
12
|
+
// The Evidence envelope consumes the completed immutable validation cache.
|
|
13
|
+
await completeJavaScriptAnalysisSteps(jsonValueValidationSteps(snapshot), signal);
|
|
14
|
+
await reportEvidencePhase(progress, "hash_javascript_application_evidence", "Hashing the complete application analysis Evidence");
|
|
15
|
+
const evidence = await completeJavaScriptAnalysisSteps(createImmutableEvidenceSteps(applicationSubject(snapshot), JAVASCRIPT_APPLICATION_PROVIDER, applicationObservation(input, snapshot)), signal);
|
|
16
|
+
return rememberOwnedApplicationGraphEvidence(evidence, snapshot);
|
|
17
|
+
};
|
|
18
|
+
const reportEvidencePhase = (progress, phase, message) => progress?.report({ phase, completed: 0, total: 1, message }) ??
|
|
19
|
+
Promise.resolve();
|
|
20
|
+
const applicationSubject = (result) => ({
|
|
5
21
|
path: result.input_path,
|
|
6
22
|
sha256: result.root_artifact_sha256,
|
|
7
23
|
format: result.format,
|
|
8
|
-
}
|
|
24
|
+
});
|
|
25
|
+
const applicationObservation = (input, result) => ({
|
|
9
26
|
predicateType: "rea.javascript-application-analysis",
|
|
10
27
|
operation: "analyze_javascript_application",
|
|
11
28
|
parameters: parameters(input),
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import { JAVASCRIPT_APPLICATION_PROVIDER, JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER, MANAGED_WORKFLOW_PROVIDER, } from "../InvestigationProviders.js";
|
|
2
|
-
import { parseEvidence } from "../../domain/evidence.js";
|
|
2
|
+
import { isImmutableEvidence, parseEvidence, } from "../../domain/evidence.js";
|
|
3
3
|
import { analyzeJavaScriptApplicationInputSchema, javascriptApplicationAnalysisResultSchema, } from "../../domain/javascript/javascriptApplicationAnalysis.js";
|
|
4
4
|
import { javascriptRuntimeReconciliationResultSchema } from "../../domain/javascript/javascriptRuntimeReconciliationSchemas.js";
|
|
5
5
|
import { managedApplicationGraphResultSchema } from "../../domain/managed/managedApplicationGraph.js";
|
|
6
|
+
const ownedApplicationSources = new WeakMap();
|
|
7
|
+
/** Retain the producer-validated meaning of its exact immutable result snapshot. */
|
|
8
|
+
export const rememberOwnedApplicationGraphEvidence = (evidence, result) => {
|
|
9
|
+
if (!isImmutableEvidence(evidence) ||
|
|
10
|
+
evidence.normalized_result !== result ||
|
|
11
|
+
evidence.operation !== "analyze_javascript_application" ||
|
|
12
|
+
!providerMatches(evidence, JAVASCRIPT_APPLICATION_PROVIDER))
|
|
13
|
+
throw new TypeError("Owned application Evidence must bind its exact validated immutable result");
|
|
14
|
+
ownedApplicationSources.set(evidence, Object.freeze(staticApplicationSourceForResult(evidence, result)));
|
|
15
|
+
return evidence;
|
|
16
|
+
};
|
|
6
17
|
/** Parse and authenticate one REA-produced JavaScript Application Graph Evidence. */
|
|
7
18
|
export const parseApplicationGraphEvidence = (input) => {
|
|
8
19
|
const evidence = parseEvidence(input);
|
|
20
|
+
const owned = ownedApplicationSources.get(evidence);
|
|
21
|
+
if (owned !== undefined)
|
|
22
|
+
return owned;
|
|
9
23
|
if (evidence.operation === "analyze_javascript_application" &&
|
|
10
24
|
evidence.predicate_type === "rea.javascript-application-analysis" &&
|
|
11
25
|
providerMatches(evidence, JAVASCRIPT_APPLICATION_PROVIDER))
|
|
@@ -21,10 +35,13 @@ export const parseApplicationGraphEvidence = (input) => {
|
|
|
21
35
|
throw new TypeError("Application workflow requires authenticated analyze_javascript_application, reconcile_javascript_runtime, or project_managed_application_graph Evidence");
|
|
22
36
|
};
|
|
23
37
|
const staticApplicationSource = (evidence) => {
|
|
38
|
+
const result = javascriptApplicationAnalysisResultSchema.parse(evidence.normalized_result);
|
|
39
|
+
return staticApplicationSourceForResult(evidence, result);
|
|
40
|
+
};
|
|
41
|
+
const staticApplicationSourceForResult = (evidence, result) => {
|
|
24
42
|
if (evidence.authority !== "shipped-artifact" ||
|
|
25
43
|
evidence.confidence !== "derived")
|
|
26
44
|
throw new TypeError("JavaScript application Evidence authority or confidence is invalid");
|
|
27
|
-
const result = javascriptApplicationAnalysisResultSchema.parse(evidence.normalized_result);
|
|
28
45
|
if (evidence.predicate_type !== "rea.javascript-application-analysis")
|
|
29
46
|
throw new TypeError("JavaScript application Evidence predicate does not match its result shape");
|
|
30
47
|
analyzeJavaScriptApplicationInputSchema.parse({
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
|
|
3
|
-
import { analyzeJavaScriptApplicationInputSchema,
|
|
4
|
-
import { AnalysisInputError, AnalysisOutputError, } from "../../domain/analysisErrorCore.js";
|
|
3
|
+
import { analyzeJavaScriptApplicationInputSchema, parseOwnedJavaScriptApplicationAnalysisSteps, } from "../../domain/javascript/javascriptApplicationAnalysis.js";
|
|
4
|
+
import { AnalysisAccessDeniedError, AnalysisInputError, AnalysisOutputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
|
|
5
5
|
import { ArtifactOperationError } from "../../domain/artifactOperationError.js";
|
|
6
6
|
import {} from "../../domain/analysisErrorBase.js";
|
|
7
|
-
import {
|
|
7
|
+
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
8
8
|
import { err, ok } from "../../domain/result.js";
|
|
9
9
|
import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
|
|
10
|
-
import {
|
|
10
|
+
import { createOwnedJavaScriptApplicationEvidenceCooperatively } from "./JavaScriptApplicationEvidence.js";
|
|
11
|
+
import { assertJavaScriptAnalysisActive, checkpointJavaScriptAnalysis, completeJavaScriptAnalysisSteps, } from "./JavaScriptAnalysisControl.js";
|
|
11
12
|
import { reconstructJavaScriptArtifact } from "./JavaScriptArtifactReconstruction.js";
|
|
12
13
|
import { JAVASCRIPT_APPLICATION_PROVIDER } from "../InvestigationProviders.js";
|
|
13
14
|
const OPERATION = "analyze_javascript_application";
|
|
@@ -15,18 +16,20 @@ const OPERATION = "analyze_javascript_application";
|
|
|
15
16
|
export const analyzeJavaScriptApplication = async (rawInput, options = {}) => {
|
|
16
17
|
const parsed = analyzeJavaScriptApplicationInputSchema.safeParse(rawInput);
|
|
17
18
|
if (!parsed.success)
|
|
18
|
-
return err(
|
|
19
|
+
return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput));
|
|
19
20
|
return analyzeJavaScriptApplicationValidated(parsed.data, options);
|
|
20
21
|
};
|
|
21
22
|
/** Analyze input already parsed by a trusted adapter boundary. */
|
|
22
23
|
export const analyzeJavaScriptApplicationValidated = async (input, options = {}) => {
|
|
23
|
-
await options.progress?.report({
|
|
24
|
-
phase: "analyze_javascript_application",
|
|
25
|
-
completed: 0,
|
|
26
|
-
total: 1,
|
|
27
|
-
message: "Inventorying and parsing application artifacts",
|
|
28
|
-
});
|
|
29
24
|
try {
|
|
25
|
+
assertJavaScriptAnalysisActive(options.signal);
|
|
26
|
+
await options.progress?.report({
|
|
27
|
+
phase: "analyze_javascript_application",
|
|
28
|
+
completed: 0,
|
|
29
|
+
total: 1,
|
|
30
|
+
message: "Inventorying and parsing application artifacts",
|
|
31
|
+
});
|
|
32
|
+
await checkpointJavaScriptAnalysis(options.signal);
|
|
30
33
|
const reconstructed = await reconstructJavaScriptArtifact({
|
|
31
34
|
input_path: input.input_path,
|
|
32
35
|
format: input.format,
|
|
@@ -36,20 +39,23 @@ export const analyzeJavaScriptApplicationValidated = async (input, options = {})
|
|
|
36
39
|
phase: "validate_javascript_application_result",
|
|
37
40
|
completed: 0,
|
|
38
41
|
total: 1,
|
|
39
|
-
message: "Validating
|
|
42
|
+
message: "Validating result metadata and cross-graph bindings",
|
|
40
43
|
});
|
|
41
|
-
|
|
44
|
+
await checkpointJavaScriptAnalysis(options.signal);
|
|
45
|
+
const result = await completeJavaScriptAnalysisSteps(parseOwnedJavaScriptApplicationAnalysisSteps({
|
|
42
46
|
...application,
|
|
43
47
|
summary,
|
|
44
48
|
limitations: reconstructed.graph.limitations,
|
|
45
|
-
});
|
|
49
|
+
}), options.signal);
|
|
46
50
|
await options.progress?.report({
|
|
47
51
|
phase: "create_javascript_application_evidence",
|
|
48
52
|
completed: 0,
|
|
49
53
|
total: 1,
|
|
50
54
|
message: "Creating and hashing application analysis Evidence",
|
|
51
55
|
});
|
|
52
|
-
|
|
56
|
+
await checkpointJavaScriptAnalysis(options.signal);
|
|
57
|
+
const evidence = await createOwnedJavaScriptApplicationEvidenceCooperatively(input, result, options.signal, options.progress);
|
|
58
|
+
await checkpointJavaScriptAnalysis(options.signal);
|
|
53
59
|
await options.progress?.report({
|
|
54
60
|
phase: "analyze_javascript_application",
|
|
55
61
|
completed: 1,
|
|
@@ -57,9 +63,15 @@ export const analyzeJavaScriptApplicationValidated = async (input, options = {})
|
|
|
57
63
|
message: "Application graph and Electron boundaries reconstructed",
|
|
58
64
|
terminal: true,
|
|
59
65
|
});
|
|
66
|
+
assertJavaScriptAnalysisActive(options.signal);
|
|
60
67
|
return ok(evidence);
|
|
61
68
|
}
|
|
62
69
|
catch (cause) {
|
|
70
|
+
// Input selection failures are already typed by their cause.
|
|
71
|
+
if (cause instanceof AnalysisInputError ||
|
|
72
|
+
cause instanceof AnalysisUnsupportedTargetError ||
|
|
73
|
+
cause instanceof AnalysisAccessDeniedError)
|
|
74
|
+
return err(cause);
|
|
63
75
|
if (cause instanceof ArtifactReaderFailure)
|
|
64
76
|
return err(new ArtifactOperationError(OPERATION, cause.reason, cause.details, cause.message));
|
|
65
77
|
if (cause instanceof z.ZodError)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
|
-
import {
|
|
4
|
+
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
5
5
|
import { compareJavaScriptApplicationVersions } from "../../domain/javascript/javascriptApplicationVersionComparison.js";
|
|
6
6
|
import { compareApplicationVersionsInputSchema } from "../../domain/javascript/javascriptApplicationVersionComparisonSchemas.js";
|
|
7
7
|
import { compareJavaScriptExportShapes } from "../../domain/javascript/javascriptExportShapeComparison.js";
|
|
@@ -18,7 +18,7 @@ export const traceApplicationFeatureEvidence = (rawInput) => {
|
|
|
18
18
|
const operation = "trace_application_feature";
|
|
19
19
|
const parsed = traceApplicationFeatureInputSchema.safeParse(rawInput);
|
|
20
20
|
if (!parsed.success)
|
|
21
|
-
return err(
|
|
21
|
+
return err(analysisInputErrorFromIssues(operation, parsed.error.issues, rawInput));
|
|
22
22
|
return traceApplicationFeatureEvidenceValidated(parsed.data);
|
|
23
23
|
};
|
|
24
24
|
/** Derive one feature trace from input parsed by a trusted adapter. */
|
|
@@ -50,7 +50,7 @@ export const compareApplicationVersionsEvidence = (rawInput) => {
|
|
|
50
50
|
const operation = "compare_application_versions";
|
|
51
51
|
const parsed = compareApplicationVersionsInputSchema.safeParse(rawInput);
|
|
52
52
|
if (!parsed.success)
|
|
53
|
-
return err(
|
|
53
|
+
return err(analysisInputErrorFromIssues(operation, parsed.error.issues, rawInput));
|
|
54
54
|
return compareApplicationVersionsEvidenceValidated(parsed.data);
|
|
55
55
|
};
|
|
56
56
|
/** Compare versions from input parsed by a trusted adapter. */
|
|
@@ -116,7 +116,7 @@ export const compareJavaScriptExportShapesEvidence = (rawInput) => {
|
|
|
116
116
|
const operation = "compare_javascript_export_shapes";
|
|
117
117
|
const parsed = compareJavaScriptExportShapesInputSchema.safeParse(rawInput);
|
|
118
118
|
if (!parsed.success)
|
|
119
|
-
return err(
|
|
119
|
+
return err(analysisInputErrorFromIssues(operation, parsed.error.issues, rawInput));
|
|
120
120
|
return compareJavaScriptExportShapesEvidenceValidated(parsed.data);
|
|
121
121
|
};
|
|
122
122
|
/** Compare exact export shapes from input parsed by a trusted adapter. */
|
|
@@ -153,7 +153,7 @@ export const compareJavaScriptExportShapesEvidenceValidated = (input) => {
|
|
|
153
153
|
}
|
|
154
154
|
};
|
|
155
155
|
const workflowFailure = (operation, cause, input) => cause instanceof z.ZodError
|
|
156
|
-
? err(
|
|
156
|
+
? err(analysisInputErrorFromIssues(operation, cause.issues, input))
|
|
157
157
|
: cause instanceof TypeError &&
|
|
158
158
|
SAFE_APPLICATION_INPUT_CONSTRAINTS.has(cause.message)
|
|
159
159
|
? err(new AnalysisInputError(operation, undefined, [
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { setImmediate } from "node:timers/promises";
|
|
3
|
+
import { resolveJavaScriptSourceMapReference } from "../../domain/javascript/javascriptSourceMapPaths.js";
|
|
3
4
|
import { analyzeParsedJavaScriptStaticSource } from "../../domain/javascript/javascriptStaticAnalysis.js";
|
|
4
|
-
import { analyzeParsedJavaScriptSemantics } from "../../domain/javascript/javascriptSemanticAnalysis.js";
|
|
5
|
+
import { analyzeParsedJavaScriptSemantics, classifyParsedJavaScriptOpenReceivers, } from "../../domain/javascript/javascriptSemanticAnalysis.js";
|
|
5
6
|
import { parseJavaScriptSource } from "../../domain/javascript/javascriptSourceParser.js";
|
|
6
7
|
import { hasValidSourceMapContents } from "../../domain/sourceMapContents.js";
|
|
7
8
|
import { flattenSourceMapLeaves } from "../../domain/sourceMapEnvelope.js";
|
|
@@ -77,14 +78,15 @@ const analyzeArtifactFile = (file, context) => {
|
|
|
77
78
|
state.files.push({ file, javascript: null, semantic: null });
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
|
-
const parsed = parseJavaScriptSource(file.text.value);
|
|
81
|
+
const parsed = parseJavaScriptSource(file.text.value, file.path);
|
|
81
82
|
if (parsed === null) {
|
|
82
83
|
const analysis = failedJavaScriptStaticAnalysis();
|
|
83
84
|
state.files.push({ file, javascript: analysis, semantic: null });
|
|
84
85
|
state.parseFailures += 1;
|
|
85
86
|
return;
|
|
86
87
|
}
|
|
87
|
-
const
|
|
88
|
+
const openReceiverFacts = classifyParsedJavaScriptOpenReceivers(parsed);
|
|
89
|
+
const analysis = analyzeParsedJavaScriptStaticSource(file.text.value, parsed, openReceiverFacts);
|
|
88
90
|
const staticFindings = findingCount(analysis);
|
|
89
91
|
const semantics = analysis.parse_status === "complete" || analysis.parse_status === "partial"
|
|
90
92
|
? analyzeParsedJavaScriptSemantics(parsed)
|
|
@@ -202,14 +204,16 @@ const collectSourceMapOriginals = (file, maps) => {
|
|
|
202
204
|
const contents = map.sourcesContent;
|
|
203
205
|
if (!hasValidSourceMapContents(names.length, contents))
|
|
204
206
|
return invalidSourceMap(file, "Source map sourcesContent must contain one string or null entry per source.");
|
|
205
|
-
|
|
207
|
+
if (map.sourceRoot != null && typeof map.sourceRoot !== "string")
|
|
208
|
+
return invalidSourceMap(file, "Source map sourceRoot must be a string or null.");
|
|
209
|
+
const root = typeof map.sourceRoot === "string" ? map.sourceRoot : null;
|
|
206
210
|
for (const [index, raw] of names.entries()) {
|
|
207
211
|
if (typeof raw !== "string")
|
|
208
212
|
return invalidSourceMap(file, "Source map contains a non-string source name.");
|
|
209
213
|
const rawContent = Array.isArray(contents) ? contents[index] : undefined;
|
|
210
214
|
const content = typeof rawContent === "string" ? rawContent : null;
|
|
211
215
|
sources.push({
|
|
212
|
-
|
|
216
|
+
reference: resolveJavaScriptSourceMapReference(raw, root, file.path),
|
|
213
217
|
content,
|
|
214
218
|
content_sha256: content === null ? null : sha256(content),
|
|
215
219
|
});
|
|
@@ -262,10 +266,9 @@ const rangeForOffsets = (text, start, end) => ({
|
|
|
262
266
|
end: pointForOffset(text, end),
|
|
263
267
|
});
|
|
264
268
|
const pointForOffset = (text, offset) => {
|
|
265
|
-
const lines = text.slice(0, offset).split(
|
|
269
|
+
const lines = text.slice(0, offset).split(/\r\n|\r|\n/u);
|
|
266
270
|
return { line: lines.length, column: lines.at(-1)?.length ?? 0 };
|
|
267
271
|
};
|
|
268
|
-
const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`;
|
|
269
272
|
const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : null;
|
|
270
273
|
const sha256 = (value) => createHash("sha256").update(value).digest("hex");
|
|
271
274
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
import { createJavaScriptApplicationGraph, } from "../../domain/javascript/javascriptApplicationGraph.js";
|
|
1
|
+
import { createJavaScriptApplicationGraph, createImmutableJavaScriptApplicationGraphSteps, } from "../../domain/javascript/javascriptApplicationGraph.js";
|
|
2
2
|
import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js";
|
|
3
|
+
import { selfReferenceOmissions, } from "./JavaScriptArtifactGraphContext.js";
|
|
3
4
|
import { addJavaScriptHtmlRoles, addJavaScriptSourceMapOriginals, } from "./JavaScriptArtifactGraphDocuments.js";
|
|
4
5
|
import { addJavaScriptStaticFindings } from "./JavaScriptArtifactGraphFindings.js";
|
|
5
6
|
import { addJavaScriptModuleRelationships, addJavaScriptSourceModules, } from "./JavaScriptModuleRelationships.js";
|
|
6
7
|
import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
|
|
7
|
-
import {
|
|
8
|
+
import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
|
|
9
|
+
import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
|
|
10
|
+
import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
|
|
11
|
+
import { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
|
|
8
12
|
import { addElectronBoundaries } from "./ElectronBoundaryGraph.js";
|
|
9
13
|
import { classifyElectronIpcPairings, collectElectronIpcRecords, } from "./ElectronBoundaryAnalysis.js";
|
|
10
14
|
/** Project artifact and AST facts into JavaScript Application Graph. */
|
|
11
|
-
export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) =>
|
|
15
|
+
export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => createJavaScriptApplicationGraph(buildJavaScriptArtifactGraphInput(snapshot, fileSet, analysis));
|
|
16
|
+
/** Build a validated application graph with cooperative immutable ownership. */
|
|
17
|
+
export const buildImmutableJavaScriptArtifactGraphSteps = (snapshot, fileSet, analysis) => createImmutableJavaScriptApplicationGraphSteps(buildJavaScriptArtifactGraphInput(snapshot, fileSet, analysis));
|
|
18
|
+
const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
|
|
12
19
|
const accumulator = new JavaScriptArtifactGraphAccumulator();
|
|
13
20
|
const root = createJavaScriptArtifactRootNode(accumulator, snapshot);
|
|
14
21
|
const context = {
|
|
@@ -29,14 +36,14 @@ export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => {
|
|
|
29
36
|
addJavaScriptArtifactFiles(context);
|
|
30
37
|
const packageRoots = addJavaScriptPackageNodes(context);
|
|
31
38
|
addJavaScriptSourceModules(context);
|
|
32
|
-
addJavaScriptBundlerNodes(context);
|
|
33
|
-
addJavaScriptModuleRelationships(context);
|
|
34
|
-
addJavaScriptStaticFindings(context);
|
|
39
|
+
const bundlerLimitations = addJavaScriptBundlerNodes(context);
|
|
40
|
+
const relationshipOmissions = addJavaScriptModuleRelationships(context);
|
|
41
|
+
const findingLimitations = addJavaScriptStaticFindings(context);
|
|
35
42
|
addElectronBoundaries(context);
|
|
36
43
|
addJavaScriptHtmlRoles(context);
|
|
37
44
|
addJavaScriptSourceMapOriginals(context);
|
|
38
45
|
const coverage = graphCoverage(context);
|
|
39
|
-
return
|
|
46
|
+
return {
|
|
40
47
|
schema: "JavaScriptApplicationGraph",
|
|
41
48
|
root_node_ids: packageRoots.length === 0
|
|
42
49
|
? [root.node_id]
|
|
@@ -44,10 +51,15 @@ export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => {
|
|
|
44
51
|
nodes: accumulator.nodes(),
|
|
45
52
|
edges: accumulator.edges(),
|
|
46
53
|
coverage,
|
|
47
|
-
limitations:
|
|
48
|
-
|
|
54
|
+
limitations: [
|
|
55
|
+
...bundlerLimitations,
|
|
56
|
+
...findingLimitations,
|
|
57
|
+
...graphLimitations(context, coverage.status, relationshipOmissions),
|
|
58
|
+
],
|
|
59
|
+
};
|
|
49
60
|
};
|
|
50
61
|
const graphCoverage = (context) => {
|
|
62
|
+
const resourceLimits = semanticResourceLimits(context);
|
|
51
63
|
const sourceMapPolicyGap = context.analysis.source_maps.some(({ status }) => status === "invalid");
|
|
52
64
|
const malformedStructuredData = context.analysis.packages.some(({ status }) => status !== "included") ||
|
|
53
65
|
context.analysis.json_modules.some(({ status }) => status !== "included") ||
|
|
@@ -60,11 +72,31 @@ const graphCoverage = (context) => {
|
|
|
60
72
|
partialJavaScript;
|
|
61
73
|
if (context.analysis.truncated_scopes > 0)
|
|
62
74
|
return partialApplicationCoverage([], null);
|
|
75
|
+
if (resourceLimits.length > 0)
|
|
76
|
+
return partialApplicationCoverage(resourceLimits.map(applicationGraphResourceLimit), null);
|
|
63
77
|
if (unknownGap)
|
|
64
78
|
return partialApplicationCoverage([], null);
|
|
65
79
|
return completeApplicationCoverage();
|
|
66
80
|
};
|
|
67
|
-
const
|
|
81
|
+
const semanticResourceLimits = (context) => [
|
|
82
|
+
...new Set(context.analysis.files.flatMap(({ semantic }) => semantic === null
|
|
83
|
+
? []
|
|
84
|
+
: semanticCoverageResourceLimits(semantic.ir.coverage))),
|
|
85
|
+
].sort();
|
|
86
|
+
const applicationGraphResourceLimit = (resourceLimit) => ({
|
|
87
|
+
name: `javascript_semantic_${resourceLimit.replaceAll("-", "_")}`,
|
|
88
|
+
value: resourceLimit === "primitive-candidates"
|
|
89
|
+
? SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT
|
|
90
|
+
: resourceLimit === "primitive-bytes"
|
|
91
|
+
? SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT
|
|
92
|
+
: SEMANTIC_EXPRESSION_DEPTH_LIMIT,
|
|
93
|
+
unit: resourceLimit === "expression-depth"
|
|
94
|
+
? "depth"
|
|
95
|
+
: resourceLimit === "primitive-bytes"
|
|
96
|
+
? "bytes"
|
|
97
|
+
: "items",
|
|
98
|
+
});
|
|
99
|
+
const graphLimitations = (context, coverage, relationshipOmissions) => {
|
|
68
100
|
const ipc = collectElectronIpcRecords(context.analysis);
|
|
69
101
|
const pairings = classifyElectronIpcPairings(ipc);
|
|
70
102
|
const electronFindings = context.analysis.files.reduce((count, { javascript }) => count +
|
|
@@ -78,6 +110,7 @@ const graphLimitations = (context, coverage) => {
|
|
|
78
110
|
javascript.electron.native_addon_bindings.length), 0);
|
|
79
111
|
return [
|
|
80
112
|
...context.analysis.limitations,
|
|
113
|
+
...selfReferenceOmissions(relationshipOmissions.selfImports, ["import specifier", "import specifiers"], "the importing module"),
|
|
81
114
|
"CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.",
|
|
82
115
|
"Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.",
|
|
83
116
|
"Static imports, entrypoints, workers, endpoints, and storage relationships do not prove runtime execution.",
|
|
@@ -101,6 +134,7 @@ const graphLimitations = (context, coverage) => {
|
|
|
101
134
|
"Sender, frame, URL, and origin checks are observations only; REA does not claim that they enforce a complete authorization policy.",
|
|
102
135
|
]
|
|
103
136
|
: []),
|
|
137
|
+
...semanticResourceLimits(context).map(semanticResourceLimitReason),
|
|
104
138
|
...(context.analysis.files.some(({ javascript }) => (javascript?.electron.native_addon_bindings.length ?? 0) > 0)
|
|
105
139
|
? [
|
|
106
140
|
"Native member names are requested by JavaScript syntax and are not verified binary exports in this workflow.",
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { addAstContainsEdge, artifactLocalIdentity, chunkLookupKey, javascriptAnalysisCoverage, moduleLookupKey, } from "./JavaScriptArtifactGraphContext.js";
|
|
1
|
+
import { addAstContainsEdge, artifactLocalIdentity, chunkLookupKey, javascriptAnalysisCoverage, moduleLookupKey, selfReferenceOmissions, } from "./JavaScriptArtifactGraphContext.js";
|
|
2
2
|
import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
|
|
3
|
-
/** Project Webpack/Rspack
|
|
3
|
+
/** Project Webpack/Rspack AST literals and disclose unrepresentable relationships. */
|
|
4
4
|
export const addJavaScriptBundlerNodes = (context) => {
|
|
5
|
+
let selfAsyncChunks = 0;
|
|
5
6
|
for (const analyzed of context.analysis.files) {
|
|
6
7
|
const { file, javascript } = analyzed;
|
|
7
8
|
const asset = context.assetNodes.get(file.path);
|
|
@@ -31,8 +32,9 @@ export const addJavaScriptBundlerNodes = (context) => {
|
|
|
31
32
|
addBundlerModuleNodes(context, { ...input, chunk });
|
|
32
33
|
}
|
|
33
34
|
for (const record of records)
|
|
34
|
-
addBundlerRuntimeEdges(context, record);
|
|
35
|
+
selfAsyncChunks += addBundlerRuntimeEdges(context, record);
|
|
35
36
|
}
|
|
37
|
+
return selfReferenceOmissions(selfAsyncChunks, ["bundler async-chunk reference", "bundler async-chunk references"], "the requesting chunk");
|
|
36
38
|
};
|
|
37
39
|
const createBundlerChunkNode = (context, input) => {
|
|
38
40
|
const { file, registration, coverage, limitations } = input;
|
|
@@ -119,6 +121,7 @@ const addBundlerModuleNodes = (context, input) => {
|
|
|
119
121
|
}
|
|
120
122
|
};
|
|
121
123
|
const addBundlerRuntimeEdges = (context, record) => {
|
|
124
|
+
let selfAsyncChunks = 0;
|
|
122
125
|
const { file, registration, chunk, coverage } = record;
|
|
123
126
|
for (const moduleKey of registration.entry_module_keys) {
|
|
124
127
|
const resolved = context.moduleNodes.get(moduleLookupKey(file.path, moduleKey));
|
|
@@ -147,6 +150,10 @@ const addBundlerRuntimeEdges = (context, record) => {
|
|
|
147
150
|
for (const chunkKey of registration.async_chunk_keys) {
|
|
148
151
|
const lookup = chunkLookupKey(file.path, registration.runtime, chunkKey);
|
|
149
152
|
const resolved = context.chunkNodes.get(lookup);
|
|
153
|
+
if (resolved?.node_id === chunk.node_id) {
|
|
154
|
+
selfAsyncChunks++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
150
157
|
const target = resolved ?? unresolvedBundlerChunkNode(context, record, chunkKey);
|
|
151
158
|
context.accumulator.addEdge({
|
|
152
159
|
source_node_id: chunk.node_id,
|
|
@@ -169,6 +176,7 @@ const addBundlerRuntimeEdges = (context, record) => {
|
|
|
169
176
|
}),
|
|
170
177
|
});
|
|
171
178
|
}
|
|
179
|
+
return selfAsyncChunks;
|
|
172
180
|
};
|
|
173
181
|
const unresolvedBundlerModuleNode = (context, record, moduleKey) => context.accumulator.addNode({
|
|
174
182
|
kind: "javascript-module",
|
|
@@ -161,6 +161,15 @@ export const linkElectronRoleToAsset = (context, input) => {
|
|
|
161
161
|
}),
|
|
162
162
|
});
|
|
163
163
|
};
|
|
164
|
+
/**
|
|
165
|
+
* Disclose relationships omitted because they resolved to their own source;
|
|
166
|
+
* the application graph forbids self-referential edges.
|
|
167
|
+
*/
|
|
168
|
+
export const selfReferenceOmissions = (count, noun, owner) => count === 0
|
|
169
|
+
? []
|
|
170
|
+
: [
|
|
171
|
+
`${String(count)} ${count === 1 ? noun[0] : noun[1]} resolved back to ${owner} itself and ${count === 1 ? "was" : "were"} omitted; application graph edges cannot be self-referential.`,
|
|
172
|
+
];
|
|
164
173
|
/** Deterministic key for one recovered module inside a bundle asset. */
|
|
165
174
|
export const moduleLookupKey = (path, moduleKey) => `${path}\0${moduleKey}`;
|
|
166
175
|
/** Deterministic key for one recovered bundler chunk inside a bundle asset. */
|
|
@@ -109,16 +109,16 @@ export const addJavaScriptSourceMapOriginals = (context) => {
|
|
|
109
109
|
strategy: "source-map-original",
|
|
110
110
|
stability: "source-map-exact",
|
|
111
111
|
source_map_sha256: mapFile.sha256,
|
|
112
|
-
original_source: original.
|
|
112
|
+
original_source: original.reference.source_name,
|
|
113
|
+
source_root: original.reference.source_root,
|
|
113
114
|
source_sha256: original.content_sha256,
|
|
114
115
|
},
|
|
115
116
|
observations: [
|
|
116
117
|
{
|
|
117
|
-
label: original.
|
|
118
|
+
label: original.reference.source_name || null,
|
|
119
|
+
source_map_reference: original.reference,
|
|
118
120
|
properties: {
|
|
119
|
-
source: original.source,
|
|
120
121
|
content_available: original.content !== null,
|
|
121
|
-
source_sha256: original.content_sha256,
|
|
122
122
|
},
|
|
123
123
|
evidence: artifactObservationEvidence({
|
|
124
124
|
sha256: mapFile.sha256,
|
|
@@ -134,7 +134,10 @@ export const addJavaScriptSourceMapOriginals = (context) => {
|
|
|
134
134
|
source_node_id: mapNode.node_id,
|
|
135
135
|
target_node_id: node.node_id,
|
|
136
136
|
relation: "contains",
|
|
137
|
-
properties: {
|
|
137
|
+
properties: {
|
|
138
|
+
original_source: original.reference.source_name,
|
|
139
|
+
source_root: original.reference.source_root,
|
|
140
|
+
},
|
|
138
141
|
evidence: artifactObservationEvidence({
|
|
139
142
|
sha256: mapFile.sha256,
|
|
140
143
|
path: mapFile.path,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { addStaticInferenceEdge, artifactLocalIdentity, chunkLookupKey, createElectronRoleNode, javascriptAnalysisCoverage, linkElectronRoleToAsset, moduleLookupKey, resolveArtifactPath, sourceNodeFor, } from "./JavaScriptArtifactGraphContext.js";
|
|
1
|
+
import { addStaticInferenceEdge, artifactLocalIdentity, chunkLookupKey, createElectronRoleNode, javascriptAnalysisCoverage, linkElectronRoleToAsset, moduleLookupKey, resolveArtifactPath, selfReferenceOmissions, sourceNodeFor, } from "./JavaScriptArtifactGraphContext.js";
|
|
2
2
|
import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
|
|
3
3
|
import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
|
|
4
4
|
/** Project imports, workers, roles, endpoints, storage, and source-map links. */
|
|
5
5
|
export const addJavaScriptStaticFindings = (context) => {
|
|
6
|
+
const omissions = { selfReferences: 0 };
|
|
6
7
|
for (const analyzed of context.analysis.files) {
|
|
7
8
|
const { file, javascript } = analyzed;
|
|
8
9
|
const asset = context.assetNodes.get(file.path);
|
|
@@ -10,7 +11,7 @@ export const addJavaScriptStaticFindings = (context) => {
|
|
|
10
11
|
continue;
|
|
11
12
|
const coverage = javascriptAnalysisCoverage(javascript);
|
|
12
13
|
for (const value of javascript.references)
|
|
13
|
-
addReference(context, { file, asset, value, coverage });
|
|
14
|
+
addReference(context, { file, asset, value, coverage }, omissions);
|
|
14
15
|
for (const value of javascript.endpoints)
|
|
15
16
|
addEndpoint(context, { file, asset, value, coverage });
|
|
16
17
|
for (const value of javascript.storage)
|
|
@@ -20,8 +21,9 @@ export const addJavaScriptStaticFindings = (context) => {
|
|
|
20
21
|
for (const value of javascript.source_map_urls)
|
|
21
22
|
addSourceMapEdge(context, { file, asset, value, coverage });
|
|
22
23
|
}
|
|
24
|
+
return selfReferenceOmissions(omissions.selfReferences, ["static reference", "static references"], "the referencing module");
|
|
23
25
|
};
|
|
24
|
-
const addReference = (context, input) => {
|
|
26
|
+
const addReference = (context, input, omissions) => {
|
|
25
27
|
const source = sourceNodeFor(context, input.file.path, input.value.module_key) ??
|
|
26
28
|
input.asset;
|
|
27
29
|
const resolved = input.value.specifier === null
|
|
@@ -70,6 +72,13 @@ const addReference = (context, input) => {
|
|
|
70
72
|
});
|
|
71
73
|
return;
|
|
72
74
|
}
|
|
75
|
+
// A reference that resolves to its own source, such as a bundled module
|
|
76
|
+
// requiring its own key, cannot become an edge: the application graph
|
|
77
|
+
// forbids self-referential edges and one would fail the whole analysis.
|
|
78
|
+
if (resolved?.node.node_id === source.node_id) {
|
|
79
|
+
omissions.selfReferences += 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
73
82
|
const target = resolved?.node ??
|
|
74
83
|
unresolvedReferenceNode(context, input.file, input.value, input.coverage);
|
|
75
84
|
addStaticInferenceEdge(context, {
|
|
@@ -2,7 +2,6 @@ import { completeApplicationCoverage } from "../../domain/javascript/javascriptA
|
|
|
2
2
|
import { addArtifactContainsEdge, addUnavailableStaticParseScope, artifactFileNodeKind, artifactLocalIdentity, createElectronRoleNode, linkElectronRoleToAsset, } from "./JavaScriptArtifactGraphContext.js";
|
|
3
3
|
import { artifactObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
|
|
4
4
|
import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
|
|
5
|
-
export { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
|
|
6
5
|
/** Create the exact root artifact node from the inventory manifest. */
|
|
7
6
|
export const createJavaScriptArtifactRootNode = (accumulator, snapshot) => {
|
|
8
7
|
const root = snapshot.nodes.find(({ artifact_id: id }) => id === snapshot.manifest.root_artifact_id);
|