rea-agents 6.1.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +5 -10
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/javascript/electronActiveObservation.js +26 -69
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +13 -12
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/createServer.js +49 -36
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
1
4
|
/** Standard executable names and locations used to discover Homebrew. */
|
|
2
5
|
const HOMEBREW_COMMANDS = [
|
|
3
6
|
"brew",
|
|
@@ -17,3 +20,48 @@ export const probeHomebrew = async (probe) => {
|
|
|
17
20
|
}
|
|
18
21
|
return undefined;
|
|
19
22
|
};
|
|
23
|
+
const caskDirectoriesSchema = z
|
|
24
|
+
.object({ appdir: z.string().min(1).optional() })
|
|
25
|
+
.loose();
|
|
26
|
+
const caskConfigSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
default: caskDirectoriesSchema.optional(),
|
|
29
|
+
env: caskDirectoriesSchema.optional(),
|
|
30
|
+
explicit: caskDirectoriesSchema.optional(),
|
|
31
|
+
})
|
|
32
|
+
.loose();
|
|
33
|
+
/**
|
|
34
|
+
* Read the application directory Homebrew recorded when it installed a cask,
|
|
35
|
+
* in Homebrew's precedence: explicit option, then environment, then default.
|
|
36
|
+
* Reading the Caskroom avoids `brew` cask commands, which refresh Homebrew's
|
|
37
|
+
* API and bootsnap caches.
|
|
38
|
+
*/
|
|
39
|
+
export const installedCaskAppdir = async (caskroom, token, home) => {
|
|
40
|
+
let text;
|
|
41
|
+
try {
|
|
42
|
+
text = await readFile(join(caskroom, token, ".metadata", "config.json"), "utf8");
|
|
43
|
+
}
|
|
44
|
+
catch (cause) {
|
|
45
|
+
// An absent or unreadable receipt means the cask is not installed here.
|
|
46
|
+
void cause;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(text);
|
|
52
|
+
}
|
|
53
|
+
catch (cause) {
|
|
54
|
+
// A malformed receipt does not identify an application directory.
|
|
55
|
+
void cause;
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const config = caskConfigSchema.safeParse(parsed);
|
|
59
|
+
if (!config.success)
|
|
60
|
+
return undefined;
|
|
61
|
+
const appdir = config.data.explicit?.appdir ??
|
|
62
|
+
config.data.env?.appdir ??
|
|
63
|
+
config.data.default?.appdir;
|
|
64
|
+
if (appdir === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
return appdir.startsWith("~/") ? join(home, appdir.slice(2)) : appdir;
|
|
67
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { canonicalDigest } from "../../domain/comparisonSemantics.js";
|
|
2
2
|
import { createEvidence } from "../../domain/evidence.js";
|
|
3
|
-
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
4
|
-
/**
|
|
3
|
+
import { jsonObjectSchema, jsonValueSchema } from "../../domain/jsonValue.js";
|
|
4
|
+
/** Commit the selected Electron experiment and its observed result. */
|
|
5
5
|
export const createElectronActiveEvidence = (input, result, provider) => createEvidence(undefined, provider, {
|
|
6
6
|
predicateType: "rea.electron-active-scenario",
|
|
7
7
|
operation: "capture_electron_scenario",
|
|
@@ -20,14 +20,10 @@ export const createElectronActiveEvidence = (input, result, provider) => createE
|
|
|
20
20
|
"Application host platform and architecture were not observed.",
|
|
21
21
|
],
|
|
22
22
|
});
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
const parameters = (input) => ({
|
|
31
|
-
...scenarioProjection(input),
|
|
32
|
-
scenario_sha256: canonicalDigest(scenarioProjection(input), "Browser scenario"),
|
|
33
|
-
});
|
|
23
|
+
const parameters = (input) => {
|
|
24
|
+
const scenario = jsonObjectSchema.parse(input);
|
|
25
|
+
return {
|
|
26
|
+
...scenario,
|
|
27
|
+
scenario_sha256: canonicalDigest(scenario, "Electron scenario"),
|
|
28
|
+
};
|
|
29
|
+
};
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createImmutableEvidenceSteps, } from "../../domain/evidence.js";
|
|
2
2
|
import { JAVASCRIPT_APPLICATION_PROVIDER } from "../InvestigationProviders.js";
|
|
3
|
-
import {
|
|
3
|
+
import { freezeOwnedJsonSnapshotSteps } from "../../domain/immutableJson.js";
|
|
4
4
|
import { rememberOwnedApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
|
|
5
5
|
import { completeJavaScriptAnalysisSteps } from "./JavaScriptAnalysisControl.js";
|
|
6
6
|
import { jsonValueValidationSteps } from "../../domain/jsonValue.js";
|
|
7
|
-
/** Transfer an already validated, application-owned result into immutable analysis Evidence. */
|
|
8
|
-
export const createOwnedJavaScriptApplicationEvidence = (input, result) => rememberOwnedApplicationGraphEvidence(createJavaScriptApplicationEvidence(input, freezeJsonSnapshot(result)), result);
|
|
9
7
|
/** Create owned analysis Evidence while allowing request cancellation during sealing and hashing. */
|
|
10
8
|
export const createOwnedJavaScriptApplicationEvidenceCooperatively = async (input, result, signal, progress) => {
|
|
11
9
|
await reportEvidencePhase(progress, "seal_javascript_application_result", "Sealing the complete application analysis result");
|
|
@@ -19,8 +17,6 @@ export const createOwnedJavaScriptApplicationEvidenceCooperatively = async (inpu
|
|
|
19
17
|
};
|
|
20
18
|
const reportEvidencePhase = (progress, phase, message) => progress?.report({ phase, completed: 0, total: 1, message }) ??
|
|
21
19
|
Promise.resolve();
|
|
22
|
-
/** Create Evidence for one deterministic local JavaScript application graph. */
|
|
23
|
-
export const createJavaScriptApplicationEvidence = (input, result) => createEvidence(applicationSubject(result), JAVASCRIPT_APPLICATION_PROVIDER, applicationObservation(input, result));
|
|
24
20
|
const applicationSubject = (result) => ({
|
|
25
21
|
path: result.input_path,
|
|
26
22
|
sha256: result.root_artifact_sha256,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
|
|
3
3
|
import { analyzeJavaScriptApplicationInputSchema, parseOwnedJavaScriptApplicationAnalysisSteps, } from "../../domain/javascript/javascriptApplicationAnalysis.js";
|
|
4
|
-
import { AnalysisOutputError } from "../../domain/analysisErrorCore.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
7
|
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
@@ -67,6 +67,11 @@ export const analyzeJavaScriptApplicationValidated = async (input, options = {})
|
|
|
67
67
|
return ok(evidence);
|
|
68
68
|
}
|
|
69
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);
|
|
70
75
|
if (cause instanceof ArtifactReaderFailure)
|
|
71
76
|
return err(new ArtifactOperationError(OPERATION, cause.reason, cause.details, cause.message));
|
|
72
77
|
if (cause instanceof z.ZodError)
|
|
@@ -1,5 +1,6 @@
|
|
|
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
5
|
import { analyzeParsedJavaScriptSemantics, classifyParsedJavaScriptOpenReceivers, } from "../../domain/javascript/javascriptSemanticAnalysis.js";
|
|
5
6
|
import { parseJavaScriptSource } from "../../domain/javascript/javascriptSourceParser.js";
|
|
@@ -203,14 +204,16 @@ const collectSourceMapOriginals = (file, maps) => {
|
|
|
203
204
|
const contents = map.sourcesContent;
|
|
204
205
|
if (!hasValidSourceMapContents(names.length, contents))
|
|
205
206
|
return invalidSourceMap(file, "Source map sourcesContent must contain one string or null entry per source.");
|
|
206
|
-
|
|
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;
|
|
207
210
|
for (const [index, raw] of names.entries()) {
|
|
208
211
|
if (typeof raw !== "string")
|
|
209
212
|
return invalidSourceMap(file, "Source map contains a non-string source name.");
|
|
210
213
|
const rawContent = Array.isArray(contents) ? contents[index] : undefined;
|
|
211
214
|
const content = typeof rawContent === "string" ? rawContent : null;
|
|
212
215
|
sources.push({
|
|
213
|
-
|
|
216
|
+
reference: resolveJavaScriptSourceMapReference(raw, root, file.path),
|
|
214
217
|
content,
|
|
215
218
|
content_sha256: content === null ? null : sha256(content),
|
|
216
219
|
});
|
|
@@ -266,7 +269,6 @@ const pointForOffset = (text, offset) => {
|
|
|
266
269
|
const lines = text.slice(0, offset).split(/\r\n|\r|\n/u);
|
|
267
270
|
return { line: lines.length, column: lines.at(-1)?.length ?? 0 };
|
|
268
271
|
};
|
|
269
|
-
const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`;
|
|
270
272
|
const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : null;
|
|
271
273
|
const sha256 = (value) => createHash("sha256").update(value).digest("hex");
|
|
272
274
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1,12 +1,14 @@
|
|
|
1
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
8
|
import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
|
|
8
9
|
import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
|
|
9
|
-
import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles,
|
|
10
|
+
import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
|
|
11
|
+
import { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
|
|
10
12
|
import { addElectronBoundaries } from "./ElectronBoundaryGraph.js";
|
|
11
13
|
import { classifyElectronIpcPairings, collectElectronIpcRecords, } from "./ElectronBoundaryAnalysis.js";
|
|
12
14
|
/** Project artifact and AST facts into JavaScript Application Graph. */
|
|
@@ -34,9 +36,9 @@ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
|
|
|
34
36
|
addJavaScriptArtifactFiles(context);
|
|
35
37
|
const packageRoots = addJavaScriptPackageNodes(context);
|
|
36
38
|
addJavaScriptSourceModules(context);
|
|
37
|
-
addJavaScriptBundlerNodes(context);
|
|
39
|
+
const bundlerLimitations = addJavaScriptBundlerNodes(context);
|
|
38
40
|
const relationshipOmissions = addJavaScriptModuleRelationships(context);
|
|
39
|
-
addJavaScriptStaticFindings(context);
|
|
41
|
+
const findingLimitations = addJavaScriptStaticFindings(context);
|
|
40
42
|
addElectronBoundaries(context);
|
|
41
43
|
addJavaScriptHtmlRoles(context);
|
|
42
44
|
addJavaScriptSourceMapOriginals(context);
|
|
@@ -49,7 +51,11 @@ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
|
|
|
49
51
|
nodes: accumulator.nodes(),
|
|
50
52
|
edges: accumulator.edges(),
|
|
51
53
|
coverage,
|
|
52
|
-
limitations:
|
|
54
|
+
limitations: [
|
|
55
|
+
...bundlerLimitations,
|
|
56
|
+
...findingLimitations,
|
|
57
|
+
...graphLimitations(context, coverage.status, relationshipOmissions),
|
|
58
|
+
],
|
|
53
59
|
};
|
|
54
60
|
};
|
|
55
61
|
const graphCoverage = (context) => {
|
|
@@ -104,11 +110,7 @@ const graphLimitations = (context, coverage, relationshipOmissions) => {
|
|
|
104
110
|
javascript.electron.native_addon_bindings.length), 0);
|
|
105
111
|
return [
|
|
106
112
|
...context.analysis.limitations,
|
|
107
|
-
...(relationshipOmissions.selfImports
|
|
108
|
-
? [
|
|
109
|
-
`${String(relationshipOmissions.selfImports)} import ${relationshipOmissions.selfImports === 1 ? "specifier" : "specifiers"} resolved back to the importing module itself and ${relationshipOmissions.selfImports === 1 ? "was" : "were"} omitted; application graph edges cannot be self-referential.`,
|
|
110
|
-
]
|
|
111
|
-
: []),
|
|
113
|
+
...selfReferenceOmissions(relationshipOmissions.selfImports, ["import specifier", "import specifiers"], "the importing module"),
|
|
112
114
|
"CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.",
|
|
113
115
|
"Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.",
|
|
114
116
|
"Static imports, entrypoints, workers, endpoints, and storage relationships do not prove runtime execution.",
|
|
@@ -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);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { builtinModules } from "node:module";
|
|
2
2
|
import { posix } from "node:path";
|
|
3
|
-
import { admitsCanonicalPathSyntax, hasScheme, looksExternal, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
|
|
3
|
+
import { admitsCanonicalPathSyntax, hasScheme, htmlUrlText, looksExternal, percentDecodeUrlPath, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
|
|
4
4
|
const EXTENSIONS = [
|
|
5
5
|
".js",
|
|
6
6
|
".cjs",
|
|
@@ -32,12 +32,16 @@ const resolvePackagePath = (input, packageChain, mode = "full", exportsTargetUrl
|
|
|
32
32
|
`The exact HTML resource ${confined} was not found among the selected application files.`,
|
|
33
33
|
],
|
|
34
34
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
// An exports target names one exact file; Node tries no extension or index.
|
|
36
|
+
const resolved = exportsTargetUrl
|
|
37
|
+
? (resolveFileCandidates(input, [confined]) ??
|
|
38
|
+
exactExportsTargetNotFound(confined))
|
|
39
|
+
: mode === "files-and-index"
|
|
40
|
+
? (resolveFileCandidates(input, [
|
|
41
|
+
...fileCandidates(confined),
|
|
42
|
+
...indexCandidates(confined),
|
|
43
|
+
]) ?? notFoundCandidate())
|
|
44
|
+
: resolveCandidate(input, confined, packageChain);
|
|
41
45
|
return outcome(input, resolved);
|
|
42
46
|
};
|
|
43
47
|
const rejectDeclaration = (input) => {
|
|
@@ -148,7 +152,7 @@ const hasContainerCandidate = (files, candidate, containerSha256) => [
|
|
|
148
152
|
file.container_sha256 === containerSha256));
|
|
149
153
|
});
|
|
150
154
|
const htmlCandidate = (input) => {
|
|
151
|
-
const declared = stripQueryAndFragment(input.declaredPath);
|
|
155
|
+
const declared = stripQueryAndFragment(htmlUrlText(input.declaredPath));
|
|
152
156
|
if (looksExternal(declared))
|
|
153
157
|
return unresolvedOutcome(input, "external", [
|
|
154
158
|
"External HTML references are not mapped to local artifact assets.",
|
|
@@ -156,15 +160,26 @@ const htmlCandidate = (input) => {
|
|
|
156
160
|
const rawBase = input.htmlBaseHref;
|
|
157
161
|
const base = rawBase === undefined || rawBase === null
|
|
158
162
|
? rawBase
|
|
159
|
-
: stripQueryAndFragment(rawBase);
|
|
163
|
+
: stripQueryAndFragment(htmlUrlText(rawBase));
|
|
160
164
|
if (base !== undefined && base !== null && looksExternal(base))
|
|
161
165
|
return unresolvedOutcome(input, "external", [
|
|
162
166
|
"The document base href is external, so its script reference is not a local artifact path.",
|
|
163
167
|
]);
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
// Removing URL tabs and newlines can join an encoded dot or separator that
|
|
169
|
+
// the raw declaration split, so admit the parsed URL text again.
|
|
170
|
+
if (!admitsCanonicalPathSyntax(declared))
|
|
171
|
+
return unresolvedOutcome(input, "rejected", [
|
|
172
|
+
"Encoded dot or separator bytes are rejected before artifact path resolution.",
|
|
173
|
+
]);
|
|
174
|
+
const declaredPath = percentDecodeUrlPath(declared);
|
|
175
|
+
if (declaredPath === null)
|
|
176
|
+
return unresolvedOutcome(input, "rejected", [
|
|
177
|
+
"The HTML reference path percent-decodes to NUL or to bytes that are not UTF-8.",
|
|
178
|
+
]);
|
|
179
|
+
if (declaredPath.startsWith("/"))
|
|
180
|
+
return declaredPath.slice(1);
|
|
166
181
|
if (base === undefined || base === null || base === "")
|
|
167
|
-
return posix.join(posix.dirname(input.sourcePath),
|
|
182
|
+
return posix.join(posix.dirname(input.sourcePath), declaredPath);
|
|
168
183
|
// A local base href is a second untrusted path input; apply the same
|
|
169
184
|
// admission rules a declared path gets so it cannot smuggle traversal or
|
|
170
185
|
// separator syntax past canonicalization.
|
|
@@ -172,10 +187,15 @@ const htmlCandidate = (input) => {
|
|
|
172
187
|
return unresolvedOutcome(input, "rejected", [
|
|
173
188
|
"The document base href uses NUL, backslash, or encoded dot and separator bytes that are not admitted for canonical artifact paths.",
|
|
174
189
|
]);
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
190
|
+
const decodedBase = percentDecodeUrlPath(base);
|
|
191
|
+
if (decodedBase === null)
|
|
192
|
+
return unresolvedOutcome(input, "rejected", [
|
|
193
|
+
"The document base href path percent-decodes to NUL or to bytes that are not UTF-8.",
|
|
194
|
+
]);
|
|
195
|
+
const basePath = decodedBase.startsWith("/")
|
|
196
|
+
? decodedBase.slice(1)
|
|
197
|
+
: posix.join(posix.dirname(input.sourcePath), decodedBase);
|
|
198
|
+
return posix.join(htmlBaseDirectory(decodedBase, basePath), declaredPath);
|
|
179
199
|
};
|
|
180
200
|
/**
|
|
181
201
|
* The directory a relative HTML reference resolves against. A base path
|
|
@@ -431,6 +451,13 @@ const notFoundCandidate = () => ({
|
|
|
431
451
|
"No extension, directory package, or index candidate exists in the inventoried artifact container.",
|
|
432
452
|
],
|
|
433
453
|
});
|
|
454
|
+
const exactExportsTargetNotFound = (path) => ({
|
|
455
|
+
resolvedPath: null,
|
|
456
|
+
status: "not-found",
|
|
457
|
+
limitations: [
|
|
458
|
+
`The selected package exports target ${path} does not exist in the inventoried artifact container; exports targets are exact files, so no extension or directory index was tried.`,
|
|
459
|
+
],
|
|
460
|
+
});
|
|
434
461
|
const fileUrlPath = (value) => {
|
|
435
462
|
if (!value.startsWith("file://"))
|
|
436
463
|
return undefined;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, lstat, realpath } from "node:fs/promises";
|
|
2
3
|
import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
|
|
4
|
+
import { AnalysisAccessDeniedError, AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
|
|
3
5
|
import { createJavaScriptArtifactReader as createReader } from "../../artifacts/javascript/JavaScriptArtifactReader.js";
|
|
4
6
|
import { analyzeAndProjectJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js";
|
|
5
7
|
import { readJavaScriptArtifactFiles } from "../../artifacts/javascript/JavaScriptArtifactFiles.js";
|
|
6
8
|
import { buildImmutableJavaScriptArtifactGraphSteps } from "./JavaScriptArtifactGraphBuilder.js";
|
|
7
9
|
import { javascriptArtifactReconstructionInputSchema, } from "./JavaScriptArtifactReconstructionInput.js";
|
|
8
|
-
import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/
|
|
10
|
+
import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/scanCanonical.js";
|
|
9
11
|
import { summarizeElectronBoundaries } from "./ElectronBoundaryAnalysis.js";
|
|
10
12
|
import { createJavaScriptSemanticGraphProjection } from "./JavaScriptSemanticGraphBuilder.js";
|
|
11
13
|
import { checkpointJavaScriptAnalysis, completeJavaScriptAnalysisSteps, } from "./JavaScriptAnalysisControl.js";
|
|
@@ -17,7 +19,7 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
|
|
|
17
19
|
};
|
|
18
20
|
const input = javascriptArtifactReconstructionInputSchema.parse(rawInput);
|
|
19
21
|
abortIfNeeded(signal);
|
|
20
|
-
const path = await
|
|
22
|
+
const path = await resolveSelectedInput(input.input_path);
|
|
21
23
|
const format = await resolveFormat(path, input);
|
|
22
24
|
const snapshot = await scanCanonicalArtifactInventory(path, { signal });
|
|
23
25
|
if (snapshot.manifest.root_format !== format)
|
|
@@ -46,7 +48,7 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
|
|
|
46
48
|
const graph = await completeJavaScriptAnalysisSteps(applicationGraphSteps, signal);
|
|
47
49
|
await reportPhase("build_javascript_semantic_graph", "Binding and validating static semantic relationships");
|
|
48
50
|
const semanticGraphSteps = semanticProjection.finishImmutableSteps(snapshot.manifest.root_sha256, graph, analysis);
|
|
49
|
-
await reportPhase("seal_javascript_semantic_graph", "
|
|
51
|
+
await reportPhase("seal_javascript_semantic_graph", "Validating and sealing the semantic graph");
|
|
50
52
|
const semanticGraph = await completeJavaScriptAnalysisSteps(semanticGraphSteps, signal);
|
|
51
53
|
await checkpointJavaScriptAnalysis(signal);
|
|
52
54
|
return {
|
|
@@ -77,6 +79,35 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
|
|
|
77
79
|
await reader.close();
|
|
78
80
|
}
|
|
79
81
|
};
|
|
82
|
+
const OPERATION = "analyze_javascript_application";
|
|
83
|
+
/**
|
|
84
|
+
* Resolve the caller-selected input. A missing or unreadable selection is a
|
|
85
|
+
* caller or host-permission failure, not a damaged artifact.
|
|
86
|
+
*/
|
|
87
|
+
const resolveSelectedInput = async (inputPath) => {
|
|
88
|
+
try {
|
|
89
|
+
const path = await realpath(inputPath);
|
|
90
|
+
await access(path, constants.R_OK);
|
|
91
|
+
return path;
|
|
92
|
+
}
|
|
93
|
+
catch (cause) {
|
|
94
|
+
const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
|
|
95
|
+
if (code === "EACCES" || code === "EPERM")
|
|
96
|
+
throw new AnalysisAccessDeniedError(OPERATION, inputPath, code, {
|
|
97
|
+
cause,
|
|
98
|
+
});
|
|
99
|
+
if (code === "ENOENT" || code === "ENOTDIR")
|
|
100
|
+
throw new AnalysisInputError(OPERATION, { cause }, [
|
|
101
|
+
{
|
|
102
|
+
path: ["input_path"],
|
|
103
|
+
reason: "invalid_value",
|
|
104
|
+
message: `No file or directory exists at the selected input path (${code}): ${inputPath}`,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
throw cause;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
/** The selected input's kind, checked against the caller's requested format. */
|
|
80
111
|
const resolveFormat = async (path, input) => {
|
|
81
112
|
const metadata = await lstat(path);
|
|
82
113
|
const observed = metadata.isDirectory()
|
|
@@ -85,9 +116,18 @@ const resolveFormat = async (path, input) => {
|
|
|
85
116
|
? "asar"
|
|
86
117
|
: undefined;
|
|
87
118
|
if (observed === undefined)
|
|
88
|
-
throw new
|
|
119
|
+
throw new AnalysisUnsupportedTargetError(OPERATION, input.input_path, "JavaScript application analysis accepts only a directory or an .asar file", {
|
|
120
|
+
remediationAction: "Select an extracted application directory, an app bundle, or an .asar file such as Contents/Resources/app.asar.",
|
|
121
|
+
});
|
|
89
122
|
if (input.format !== "auto" && input.format !== observed)
|
|
90
|
-
throw new
|
|
123
|
+
throw new AnalysisInputError(OPERATION, undefined, [
|
|
124
|
+
{
|
|
125
|
+
path: ["format"],
|
|
126
|
+
reason: "invalid_value",
|
|
127
|
+
message: `Requested ${input.format} input, but the selected input is ${observed === "asar" ? "an .asar file" : "a directory"}: ${input.input_path}`,
|
|
128
|
+
expected: ["auto", observed],
|
|
129
|
+
},
|
|
130
|
+
]);
|
|
91
131
|
return observed;
|
|
92
132
|
};
|
|
93
133
|
const abortIfNeeded = (signal) => {
|
|
@@ -6,7 +6,7 @@ import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SE
|
|
|
6
6
|
import { addAstContainsEdge, artifactLocalIdentity, } from "./JavaScriptArtifactGraphContext.js";
|
|
7
7
|
import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
|
|
8
8
|
import { resolveArtifactPathByContext, } from "./JavaScriptArtifactPathResolution.js";
|
|
9
|
-
import { projectJavaScriptExportReturnShapes } from "
|
|
9
|
+
import { projectJavaScriptExportReturnShapes } from "../../domain/javascript/javascriptExportReturnShapeProjection.js";
|
|
10
10
|
/** Create one path-scoped source-module identity for every analyzed source file. */
|
|
11
11
|
export const addJavaScriptSourceModules = (context) => {
|
|
12
12
|
for (const analyzed of context.analysis.files) {
|
|
@@ -18,11 +18,11 @@ export const observeJavaScriptRuntime = async (provider, input, options = {}) =>
|
|
|
18
18
|
if (!ready.ok)
|
|
19
19
|
return ready;
|
|
20
20
|
const result = await ready.value.observe(input, options);
|
|
21
|
+
if (!result.ok)
|
|
22
|
+
return result;
|
|
21
23
|
if (options.signal?.aborted === true)
|
|
22
24
|
return err(new AnalysisCancelledError("observe_javascript_runtime"));
|
|
23
|
-
return result.
|
|
24
|
-
? ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()))
|
|
25
|
-
: result;
|
|
25
|
+
return ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()));
|
|
26
26
|
};
|
|
27
27
|
const requireProvider = (provider, operation) => provider === undefined
|
|
28
28
|
? err(new AnalysisCapabilityUnavailableError("rea-v8-inspector", operation, "V8 Inspector observation provider is not configured"))
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
2
2
|
import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
|
|
3
3
|
import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
|
|
4
|
-
import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
|
|
5
4
|
/** Project literal EventEmitter registrations, removals, and dispatches. */
|
|
6
5
|
export const projectSemanticEvents = (context) => {
|
|
7
6
|
const eventNodes = new Map();
|
|
@@ -116,7 +115,7 @@ export const projectSemanticTimers = (context) => {
|
|
|
116
115
|
};
|
|
117
116
|
const projectTimerSchedule = (context, operation, timerNodes) => {
|
|
118
117
|
addSemanticGraphRelation(context.state, {
|
|
119
|
-
source:
|
|
118
|
+
source: context.callSiteAt(operation.location),
|
|
120
119
|
target: timerNodes.get(operation.timerId),
|
|
121
120
|
relation: "schedules-timer",
|
|
122
121
|
resolution: "resolved",
|
|
@@ -134,7 +133,7 @@ const projectTimerSchedule = (context, operation, timerNodes) => {
|
|
|
134
133
|
});
|
|
135
134
|
};
|
|
136
135
|
const projectTimerCancellation = (context, operation, timerNodes) => {
|
|
137
|
-
const callSite =
|
|
136
|
+
const callSite = context.callSiteAt(operation.location);
|
|
138
137
|
const target = operation.linkedTimerId === null
|
|
139
138
|
? undefined
|
|
140
139
|
: timerNodes.get(operation.linkedTimerId);
|