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,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
|
|
@@ -315,9 +335,12 @@ const packageEntry = (text, moduleKind, useExports) => {
|
|
|
315
335
|
? { ...exported, source: "exports" }
|
|
316
336
|
: exported;
|
|
317
337
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
338
|
+
// Node imports and requires ignore the bundler-only module field. Keep
|
|
339
|
+
// that fallback for callers without an explicit module-loading kind.
|
|
340
|
+
const preferred = [
|
|
341
|
+
Reflect.get(value, "main"),
|
|
342
|
+
...(moduleKind === undefined ? [Reflect.get(value, "module")] : []),
|
|
343
|
+
];
|
|
321
344
|
const entry = preferred.find((candidate) => candidate !== undefined);
|
|
322
345
|
if (entry === undefined)
|
|
323
346
|
return { status: "missing" };
|
|
@@ -428,6 +451,13 @@ const notFoundCandidate = () => ({
|
|
|
428
451
|
"No extension, directory package, or index candidate exists in the inventoried artifact container.",
|
|
429
452
|
],
|
|
430
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
|
+
});
|
|
431
461
|
const fileUrlPath = (value) => {
|
|
432
462
|
if (!value.startsWith("file://"))
|
|
433
463
|
return undefined;
|
|
@@ -1,21 +1,25 @@
|
|
|
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
|
-
import {
|
|
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";
|
|
13
|
+
import { checkpointJavaScriptAnalysis, completeJavaScriptAnalysisSteps, } from "./JavaScriptAnalysisControl.js";
|
|
11
14
|
/** Reconstruct one local ASAR or extracted directory without executing code. */
|
|
12
15
|
export const reconstructJavaScriptArtifact = async (rawInput, signal, progress) => {
|
|
13
16
|
const reportPhase = async (phase, message) => {
|
|
14
17
|
await progress?.report({ phase, completed: 0, total: 1, message });
|
|
18
|
+
await checkpointJavaScriptAnalysis(signal);
|
|
15
19
|
};
|
|
16
20
|
const input = javascriptArtifactReconstructionInputSchema.parse(rawInput);
|
|
17
21
|
abortIfNeeded(signal);
|
|
18
|
-
const path = await
|
|
22
|
+
const path = await resolveSelectedInput(input.input_path);
|
|
19
23
|
const format = await resolveFormat(path, input);
|
|
20
24
|
const snapshot = await scanCanonicalArtifactInventory(path, { signal });
|
|
21
25
|
if (snapshot.manifest.root_format !== format)
|
|
@@ -36,11 +40,17 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
|
|
|
36
40
|
});
|
|
37
41
|
abortIfNeeded(signal);
|
|
38
42
|
});
|
|
43
|
+
await checkpointJavaScriptAnalysis(signal);
|
|
39
44
|
abortIfNeeded(signal);
|
|
40
45
|
await reportPhase("build_javascript_application_graph", "Constructing application and Electron boundary relationships");
|
|
41
|
-
const
|
|
46
|
+
const applicationGraphSteps = buildImmutableJavaScriptArtifactGraphSteps(snapshot, files, analysis);
|
|
47
|
+
await reportPhase("seal_javascript_application_graph", "Sealing the validated application graph");
|
|
48
|
+
const graph = await completeJavaScriptAnalysisSteps(applicationGraphSteps, signal);
|
|
42
49
|
await reportPhase("build_javascript_semantic_graph", "Binding and validating static semantic relationships");
|
|
43
|
-
const
|
|
50
|
+
const semanticGraphSteps = semanticProjection.finishImmutableSteps(snapshot.manifest.root_sha256, graph, analysis);
|
|
51
|
+
await reportPhase("seal_javascript_semantic_graph", "Validating and sealing the semantic graph");
|
|
52
|
+
const semanticGraph = await completeJavaScriptAnalysisSteps(semanticGraphSteps, signal);
|
|
53
|
+
await checkpointJavaScriptAnalysis(signal);
|
|
44
54
|
return {
|
|
45
55
|
input_path: path,
|
|
46
56
|
format,
|
|
@@ -69,6 +79,35 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
|
|
|
69
79
|
await reader.close();
|
|
70
80
|
}
|
|
71
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. */
|
|
72
111
|
const resolveFormat = async (path, input) => {
|
|
73
112
|
const metadata = await lstat(path);
|
|
74
113
|
const observed = metadata.isDirectory()
|
|
@@ -77,9 +116,18 @@ const resolveFormat = async (path, input) => {
|
|
|
77
116
|
? "asar"
|
|
78
117
|
: undefined;
|
|
79
118
|
if (observed === undefined)
|
|
80
|
-
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
|
+
});
|
|
81
122
|
if (input.format !== "auto" && input.format !== observed)
|
|
82
|
-
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
|
+
]);
|
|
83
131
|
return observed;
|
|
84
132
|
};
|
|
85
133
|
const abortIfNeeded = (signal) => {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
2
|
import { compareCodePoints } from "../../domain/canonicalOrdering.js";
|
|
3
3
|
import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
|
|
4
|
+
import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
|
|
5
|
+
import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
|
|
4
6
|
import { addAstContainsEdge, artifactLocalIdentity, } from "./JavaScriptArtifactGraphContext.js";
|
|
5
7
|
import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
|
|
6
8
|
import { resolveArtifactPathByContext, } from "./JavaScriptArtifactPathResolution.js";
|
|
7
|
-
import { projectJavaScriptExportReturnShapes } from "
|
|
9
|
+
import { projectJavaScriptExportReturnShapes } from "../../domain/javascript/javascriptExportReturnShapeProjection.js";
|
|
8
10
|
/** Create one path-scoped source-module identity for every analyzed source file. */
|
|
9
11
|
export const addJavaScriptSourceModules = (context) => {
|
|
10
12
|
for (const analyzed of context.analysis.files) {
|
|
@@ -58,6 +60,7 @@ export const addJavaScriptSourceModules = (context) => {
|
|
|
58
60
|
};
|
|
59
61
|
/** Compose bounded CommonJS and ESM binding relationships across artifact files. */
|
|
60
62
|
export const addJavaScriptModuleRelationships = (context) => {
|
|
63
|
+
const omissions = { selfImports: 0 };
|
|
61
64
|
for (const analyzed of context.analysis.files) {
|
|
62
65
|
const { file, semantic } = analyzed;
|
|
63
66
|
const source = context.sourceModuleNodes.get(file.path);
|
|
@@ -66,16 +69,17 @@ export const addJavaScriptModuleRelationships = (context) => {
|
|
|
66
69
|
for (const link of semantic.ir.moduleLinks) {
|
|
67
70
|
const input = { context, file, semantic, source, link };
|
|
68
71
|
if (isExportLink(link))
|
|
69
|
-
addExportRelationship(input);
|
|
72
|
+
addExportRelationship(input, omissions);
|
|
70
73
|
else if (link.specifier !== null)
|
|
71
|
-
addImportRelationship(input, source, {
|
|
74
|
+
addImportRelationship(input, source, omissions, {
|
|
72
75
|
specifier: link.specifier,
|
|
73
76
|
importedPath: link.importedName === null ? [] : [link.importedName],
|
|
74
77
|
});
|
|
75
78
|
}
|
|
76
79
|
}
|
|
80
|
+
return omissions;
|
|
77
81
|
};
|
|
78
|
-
const addExportRelationship = (input) => {
|
|
82
|
+
const addExportRelationship = (input, omissions) => {
|
|
79
83
|
const { context, file, semantic, source, link } = input;
|
|
80
84
|
if (link.exportedName === null)
|
|
81
85
|
return;
|
|
@@ -137,10 +141,18 @@ const addExportRelationship = (input) => {
|
|
|
137
141
|
});
|
|
138
142
|
const origin = moduleOriginForExport(semantic.ir, link);
|
|
139
143
|
if (origin !== null)
|
|
140
|
-
addImportRelationship(input, exported, origin);
|
|
144
|
+
addImportRelationship(input, exported, omissions, origin);
|
|
141
145
|
};
|
|
142
|
-
const addImportRelationship = (input, source, origin) => {
|
|
146
|
+
const addImportRelationship = (input, source, omissions, origin) => {
|
|
143
147
|
const target = resolveModuleTarget(input, origin.specifier);
|
|
148
|
+
// A specifier that resolves back to the importing module itself (a literal
|
|
149
|
+
// self-import, self-require, or artifact-confined path alias)
|
|
150
|
+
// cannot become an edge: the application graph forbids self-referential
|
|
151
|
+
// edges, and emitting one fails result validation for the whole analysis.
|
|
152
|
+
if (target.node.node_id === source.node_id) {
|
|
153
|
+
omissions.selfImports += 1;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
144
156
|
input.context.accumulator.addEdge({
|
|
145
157
|
source_node_id: source.node_id,
|
|
146
158
|
target_node_id: target.node.node_id,
|
|
@@ -242,12 +254,29 @@ const relationshipEvidence = (input, operation, limitations, confidence = "high"
|
|
|
242
254
|
operation,
|
|
243
255
|
coverage: semanticCoverage(input.semantic),
|
|
244
256
|
confidence,
|
|
245
|
-
limitations: [
|
|
257
|
+
limitations: [
|
|
258
|
+
...input.semantic.ir.limitations,
|
|
259
|
+
...semanticCoverageResourceLimits(input.semantic.ir.coverage).map(semanticResourceLimitReason),
|
|
260
|
+
...limitations,
|
|
261
|
+
],
|
|
246
262
|
});
|
|
247
263
|
const semanticCoverage = (semantic) => {
|
|
248
|
-
|
|
264
|
+
const resourceLimits = semanticCoverageResourceLimits(semantic.ir.coverage);
|
|
265
|
+
if (semantic.ir.coverage.status === "complete" && resourceLimits.length === 0)
|
|
249
266
|
return completeApplicationCoverage();
|
|
250
|
-
return partialApplicationCoverage(
|
|
267
|
+
return partialApplicationCoverage(resourceLimits.map((resourceLimit) => ({
|
|
268
|
+
name: `javascript_semantic_${resourceLimit.replaceAll("-", "_")}`,
|
|
269
|
+
value: resourceLimit === "primitive-candidates"
|
|
270
|
+
? SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT
|
|
271
|
+
: resourceLimit === "primitive-bytes"
|
|
272
|
+
? SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT
|
|
273
|
+
: SEMANTIC_EXPRESSION_DEPTH_LIMIT,
|
|
274
|
+
unit: resourceLimit === "expression-depth"
|
|
275
|
+
? "depth"
|
|
276
|
+
: resourceLimit === "primitive-bytes"
|
|
277
|
+
? "bytes"
|
|
278
|
+
: "items",
|
|
279
|
+
})), semantic.ir.coverage.omittedCount);
|
|
251
280
|
};
|
|
252
281
|
const moduleFormat = (path, ir) => {
|
|
253
282
|
const extension = posix.extname(path).toLowerCase();
|
|
@@ -3,7 +3,7 @@ import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from
|
|
|
3
3
|
import { createEvidence } from "../../domain/evidence.js";
|
|
4
4
|
import { javascriptRecoveryInputSchema, javascriptRecoveryResultSchema, } from "../../domain/javascript/javascriptRecovery.js";
|
|
5
5
|
import { jsonObjectSchema } from "../../domain/jsonValue.js";
|
|
6
|
-
import {
|
|
6
|
+
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
8
8
|
const OPERATION = "recover_javascript_sources";
|
|
9
9
|
/** Shared CLI/MCP parsing and Evidence for derived JavaScript artifacts. */
|
|
@@ -18,7 +18,9 @@ export class JavaScriptRecoveryService {
|
|
|
18
18
|
return err(new AnalysisCancelledError(OPERATION));
|
|
19
19
|
const parsed = javascriptRecoveryInputSchema.safeParse(input);
|
|
20
20
|
if (!parsed.success)
|
|
21
|
-
return err(
|
|
21
|
+
return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, input, {
|
|
22
|
+
cause: parsed.error,
|
|
23
|
+
}));
|
|
22
24
|
const invalidPaths = ["path", "output_directory"].filter((field) => !isAbsolute(parsed.data[field]));
|
|
23
25
|
if (invalidPaths.length > 0)
|
|
24
26
|
return err(new AnalysisInputError(OPERATION, undefined, invalidPaths.map((field) => ({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createJavaScriptRuntimeObservationEvidence } from "./JavaScriptRuntimeObservationEvidence.js";
|
|
2
|
-
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
|
|
2
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
4
|
import { err, ok } from "../../domain/result.js";
|
|
5
5
|
/** List targets exposed by the explicitly selected loopback Inspector. */
|
|
@@ -18,9 +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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
if (!result.ok)
|
|
22
|
+
return result;
|
|
23
|
+
if (options.signal?.aborted === true)
|
|
24
|
+
return err(new AnalysisCancelledError("observe_javascript_runtime"));
|
|
25
|
+
return ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()));
|
|
24
26
|
};
|
|
25
27
|
const requireProvider = (provider, operation) => provider === undefined
|
|
26
28
|
? err(new AnalysisCapabilityUnavailableError("rea-v8-inspector", operation, "V8 Inspector observation provider is not configured"))
|
|
@@ -2,7 +2,7 @@ import { resolve } from "node:path";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
|
|
4
4
|
import {} from "../../domain/analysisErrorBase.js";
|
|
5
|
-
import {
|
|
5
|
+
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
6
6
|
import { reconcileJavaScriptRuntime } from "../../domain/javascript/javascriptRuntimeReconciliation.js";
|
|
7
7
|
import { reconcileJavaScriptRuntimeInputSchema } from "../../domain/javascript/javascriptRuntimeReconciliationSchemas.js";
|
|
8
8
|
import { err, ok } from "../../domain/result.js";
|
|
@@ -12,7 +12,7 @@ const OPERATION = "reconcile_javascript_runtime";
|
|
|
12
12
|
export const reconcileJavaScriptRuntimeEvidence = (rawInput) => {
|
|
13
13
|
const parsed = reconcileJavaScriptRuntimeInputSchema.safeParse(rawInput);
|
|
14
14
|
if (!parsed.success)
|
|
15
|
-
return err(
|
|
15
|
+
return err(analysisInputErrorFromIssues(OPERATION, parsed.error.issues, rawInput));
|
|
16
16
|
return reconcileJavaScriptRuntimeEvidenceValidated(parsed.data);
|
|
17
17
|
};
|
|
18
18
|
/** Reconcile input already parsed by a trusted adapter boundary. */
|
|
@@ -24,7 +24,7 @@ export const reconcileJavaScriptRuntimeEvidenceValidated = (parsedInput) => {
|
|
|
24
24
|
}
|
|
25
25
|
catch (cause) {
|
|
26
26
|
if (cause instanceof z.ZodError)
|
|
27
|
-
return err(
|
|
27
|
+
return err(analysisInputErrorFromIssues(OPERATION, cause.issues, parsedInput));
|
|
28
28
|
if (cause instanceof TypeError &&
|
|
29
29
|
SAFE_RECONCILIATION_INPUT_CONSTRAINTS.has(cause.message))
|
|
30
30
|
return err(new AnalysisInputError(OPERATION, undefined, [
|
|
@@ -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);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createJavaScriptSemanticGraph, } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
1
|
+
import { createJavaScriptSemanticGraph, createImmutableJavaScriptSemanticGraphSteps, } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
2
2
|
import { JAVASCRIPT_SEMANTIC_RELATION_FAMILIES, JAVASCRIPT_SEMANTIC_RELATION_FAMILY, } from "../../domain/javascript/javascriptSemanticGraphSchemas.js";
|
|
3
3
|
import { sourceRangesEqual as rangesEqual } from "../../domain/javascript/javascriptStaticAnalysisHelpers.js";
|
|
4
4
|
import { projectSemanticEvents, projectSemanticTimers, } from "./JavaScriptSemanticGraphAsyncProjection.js";
|
|
@@ -68,68 +68,70 @@ export const createJavaScriptSemanticGraphProjection = () => {
|
|
|
68
68
|
truncatedFiles += 1;
|
|
69
69
|
state.fileNodeBudget = null;
|
|
70
70
|
};
|
|
71
|
+
const finishWith = (factory, rootArtifactSha256, applicationGraph, analysis) => {
|
|
72
|
+
bindSemanticGraphApplicationNodes(state, applicationGraph);
|
|
73
|
+
if (state.roots.size === 0)
|
|
74
|
+
addFallbackRoot(rootArtifactSha256, state);
|
|
75
|
+
const unknowns = [...state.unknowns.values()];
|
|
76
|
+
const graph = factory({
|
|
77
|
+
schema: "JavaScriptSemanticRelationGraph",
|
|
78
|
+
root_artifact_sha256: rootArtifactSha256,
|
|
79
|
+
application_graph_id: applicationGraph.graph_id,
|
|
80
|
+
root_node_ids: [...state.roots],
|
|
81
|
+
nodes: [...state.nodes.values()],
|
|
82
|
+
relations: [...state.relations.values()],
|
|
83
|
+
fingerprints,
|
|
84
|
+
unknowns,
|
|
85
|
+
coverage: {
|
|
86
|
+
status: truncatedFiles > 0 ? "partial" : "unknown",
|
|
87
|
+
truncated: truncatedFiles > 0,
|
|
88
|
+
omitted_nodes: truncatedFiles > 0 ? null : 0,
|
|
89
|
+
omitted_relations: truncatedFiles > 0 ? null : 0,
|
|
90
|
+
limits: truncatedFiles > 0
|
|
91
|
+
? [
|
|
92
|
+
{
|
|
93
|
+
name: "semantic_graph_node_ceiling",
|
|
94
|
+
value: SEMANTIC_GRAPH_NODE_CEILING,
|
|
95
|
+
unit: "items",
|
|
96
|
+
},
|
|
97
|
+
]
|
|
98
|
+
: [],
|
|
99
|
+
families: JAVASCRIPT_SEMANTIC_RELATION_FAMILIES.map((family) => ({
|
|
100
|
+
family,
|
|
101
|
+
status: semanticFamilyStatus(family, analysis),
|
|
102
|
+
retained_relations: [...state.relations.values()].filter((relation) => JAVASCRIPT_SEMANTIC_RELATION_FAMILY[relation.relation] ===
|
|
103
|
+
family).length,
|
|
104
|
+
omitted_relations: truncatedFiles > 0 ? null : 0,
|
|
105
|
+
unknown_ids: unknowns
|
|
106
|
+
.filter((unknown) => unknown.family === family)
|
|
107
|
+
.map(({ unknown_id: identifier }) => identifier),
|
|
108
|
+
})),
|
|
109
|
+
},
|
|
110
|
+
limitations: [
|
|
111
|
+
"The semantic graph contains static syntax observations and conservative relationship candidates; it does not claim runtime execution.",
|
|
112
|
+
"Local data flow does not claim control-flow-sensitive reaching definitions or arbitrary dynamic property resolution.",
|
|
113
|
+
"Promise ownership covers explicit unshadowed Promise construction, static factories, aggregation, chaining, and await syntax only.",
|
|
114
|
+
"Function fingerprints are static candidates; equal digests can remain ambiguous and do not prove behavioral equivalence.",
|
|
115
|
+
"Event extraction covers EventEmitter-style literal registrations, removals, and dispatch candidates; dynamic names remain unknown.",
|
|
116
|
+
"Timer extraction covers global or node:timers scheduling and exact local-handle cancellation.",
|
|
117
|
+
"Child-process extraction covers asynchronous node:child_process creation, literal argv/env/stdio options, exit/error listeners, and kill signals.",
|
|
118
|
+
"Configuration extraction covers process.env, process.argv, node:fs reads, and direct logical defaults.",
|
|
119
|
+
"Request extraction covers fetch, WebSocket, node:http/node:https construction, direct option fields, and exact local response consumers.",
|
|
120
|
+
"Boundary extraction covers unshadowed JSON/global coercions plus parse and validation method candidates.",
|
|
121
|
+
"Resource extraction covers built-in filesystem/network acquisition and exact local close/destroy/end handles.",
|
|
122
|
+
],
|
|
123
|
+
});
|
|
124
|
+
state.nodes.clear();
|
|
125
|
+
state.relations.clear();
|
|
126
|
+
state.unknowns.clear();
|
|
127
|
+
state.roots.clear();
|
|
128
|
+
fingerprints.length = 0;
|
|
129
|
+
return graph;
|
|
130
|
+
};
|
|
71
131
|
return {
|
|
72
132
|
projectFile: projectSource,
|
|
73
|
-
finish: (rootArtifactSha256, applicationGraph, analysis) =>
|
|
74
|
-
|
|
75
|
-
if (state.roots.size === 0)
|
|
76
|
-
addFallbackRoot(rootArtifactSha256, state);
|
|
77
|
-
const unknowns = [...state.unknowns.values()];
|
|
78
|
-
const graph = createJavaScriptSemanticGraph({
|
|
79
|
-
schema: "JavaScriptSemanticRelationGraph",
|
|
80
|
-
root_artifact_sha256: rootArtifactSha256,
|
|
81
|
-
application_graph_id: applicationGraph.graph_id,
|
|
82
|
-
root_node_ids: [...state.roots],
|
|
83
|
-
nodes: [...state.nodes.values()],
|
|
84
|
-
relations: [...state.relations.values()],
|
|
85
|
-
fingerprints,
|
|
86
|
-
unknowns,
|
|
87
|
-
coverage: {
|
|
88
|
-
status: truncatedFiles > 0 ? "partial" : "unknown",
|
|
89
|
-
truncated: truncatedFiles > 0,
|
|
90
|
-
omitted_nodes: truncatedFiles > 0 ? null : 0,
|
|
91
|
-
omitted_relations: truncatedFiles > 0 ? null : 0,
|
|
92
|
-
limits: truncatedFiles > 0
|
|
93
|
-
? [
|
|
94
|
-
{
|
|
95
|
-
name: "semantic_graph_node_ceiling",
|
|
96
|
-
value: SEMANTIC_GRAPH_NODE_CEILING,
|
|
97
|
-
unit: "items",
|
|
98
|
-
},
|
|
99
|
-
]
|
|
100
|
-
: [],
|
|
101
|
-
families: JAVASCRIPT_SEMANTIC_RELATION_FAMILIES.map((family) => ({
|
|
102
|
-
family,
|
|
103
|
-
status: semanticFamilyStatus(family, analysis),
|
|
104
|
-
retained_relations: [...state.relations.values()].filter((relation) => JAVASCRIPT_SEMANTIC_RELATION_FAMILY[relation.relation] ===
|
|
105
|
-
family).length,
|
|
106
|
-
omitted_relations: truncatedFiles > 0 ? null : 0,
|
|
107
|
-
unknown_ids: unknowns
|
|
108
|
-
.filter((unknown) => unknown.family === family)
|
|
109
|
-
.map(({ unknown_id: identifier }) => identifier),
|
|
110
|
-
})),
|
|
111
|
-
},
|
|
112
|
-
limitations: [
|
|
113
|
-
"The semantic graph contains static syntax observations and conservative relationship candidates; it does not claim runtime execution.",
|
|
114
|
-
"Local data flow does not claim control-flow-sensitive reaching definitions or arbitrary dynamic property resolution.",
|
|
115
|
-
"Promise ownership covers explicit unshadowed Promise construction, static factories, aggregation, chaining, and await syntax only.",
|
|
116
|
-
"Function fingerprints are static candidates; equal digests can remain ambiguous and do not prove behavioral equivalence.",
|
|
117
|
-
"Event extraction covers EventEmitter-style literal registrations, removals, and dispatch candidates; dynamic names remain unknown.",
|
|
118
|
-
"Timer extraction covers global or node:timers scheduling and exact local-handle cancellation.",
|
|
119
|
-
"Child-process extraction covers asynchronous node:child_process creation, literal argv/env/stdio options, exit/error listeners, and kill signals.",
|
|
120
|
-
"Configuration extraction covers process.env, process.argv, node:fs reads, and direct logical defaults.",
|
|
121
|
-
"Request extraction covers fetch, WebSocket, node:http/node:https construction, direct option fields, and exact local response consumers.",
|
|
122
|
-
"Boundary extraction covers unshadowed JSON/global coercions plus parse and validation method candidates.",
|
|
123
|
-
"Resource extraction covers built-in filesystem/network acquisition and exact local close/destroy/end handles.",
|
|
124
|
-
],
|
|
125
|
-
});
|
|
126
|
-
state.nodes.clear();
|
|
127
|
-
state.relations.clear();
|
|
128
|
-
state.unknowns.clear();
|
|
129
|
-
state.roots.clear();
|
|
130
|
-
fingerprints.length = 0;
|
|
131
|
-
return graph;
|
|
132
|
-
},
|
|
133
|
+
finish: (rootArtifactSha256, applicationGraph, analysis) => finishWith(createJavaScriptSemanticGraph, rootArtifactSha256, applicationGraph, analysis),
|
|
134
|
+
finishImmutableSteps: (rootArtifactSha256, applicationGraph, analysis) => finishWith(createImmutableJavaScriptSemanticGraphSteps, rootArtifactSha256, applicationGraph, analysis),
|
|
133
135
|
};
|
|
134
136
|
};
|
|
135
137
|
const projectFile = (file, ir, state) => {
|
|
@@ -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 child creation, argv/env/stdio, listeners, and signals. */
|
|
6
5
|
export const projectSemanticChildProcesses = (context) => {
|
|
7
6
|
const processNodes = new Map(context.ir.childProcessSpawns.flatMap((spawn) => {
|
|
@@ -34,7 +33,7 @@ const addChildProcessNode = (context, spawn) => retainSemanticGraphNode(context.
|
|
|
34
33
|
},
|
|
35
34
|
});
|
|
36
35
|
const projectSpawn = (context, spawn, child) => {
|
|
37
|
-
const callSite =
|
|
36
|
+
const callSite = context.callSiteAt(spawn.location);
|
|
38
37
|
addSemanticGraphRelation(context.state, {
|
|
39
38
|
source: callSite,
|
|
40
39
|
target: child,
|
|
@@ -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 environment, argv, file, default, and precedence candidates. */
|
|
6
5
|
export const projectSemanticConfiguration = (context) => {
|
|
7
6
|
const configNodes = new Map(context.ir.configurationOperations.flatMap((operation) => {
|
|
@@ -110,7 +109,7 @@ const addRequestNode = (context, operation) => retainSemanticGraphNode(context.s
|
|
|
110
109
|
},
|
|
111
110
|
});
|
|
112
111
|
const projectRequestConstruction = (context, operation, request) => {
|
|
113
|
-
const callSite =
|
|
112
|
+
const callSite = context.callSiteAt(operation.location);
|
|
114
113
|
addSemanticGraphRelation(context.state, {
|
|
115
114
|
source: callSite,
|
|
116
115
|
target: request,
|
|
@@ -142,7 +141,7 @@ const projectRequestConstruction = (context, operation, request) => {
|
|
|
142
141
|
const projectResponseConsumer = (context, operation, response) => {
|
|
143
142
|
addSemanticGraphRelation(context.state, {
|
|
144
143
|
source: response,
|
|
145
|
-
target:
|
|
144
|
+
target: context.callSiteAt(operation.location),
|
|
146
145
|
relation: "consumed-by",
|
|
147
146
|
resolution: operation.resolution === "complete" ? "resolved" : "candidate",
|
|
148
147
|
properties: { method: operation.method },
|
|
@@ -2,10 +2,6 @@ import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/ja
|
|
|
2
2
|
import { sourceRangesEqual } from "../../domain/javascript/javascriptStaticAnalysisHelpers.js";
|
|
3
3
|
import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
|
|
4
4
|
import { inferredSemanticEvidenceAt, unknownSemanticEvidence, } from "./JavaScriptSemanticGraphEvidence.js";
|
|
5
|
-
/** Find the retained call-site node at one exact semantic source range. */
|
|
6
|
-
export const semanticCallSiteAt = (context, location) => {
|
|
7
|
-
return context.callSiteAt(location);
|
|
8
|
-
};
|
|
9
5
|
/** Project explicit static Promise/task ownership without runtime claims. */
|
|
10
6
|
export const projectSemanticPromises = (context) => {
|
|
11
7
|
const promiseNodes = new Map(context.ir.promiseOperations.flatMap((operation) => {
|
|
@@ -46,7 +42,7 @@ const projectPromiseCreation = (context, operation, promise) => {
|
|
|
46
42
|
if (operation.kind === "awaited-expression")
|
|
47
43
|
return;
|
|
48
44
|
addSemanticGraphRelation(context.state, {
|
|
49
|
-
source:
|
|
45
|
+
source: context.callSiteAt(operation.location),
|
|
50
46
|
target: promise,
|
|
51
47
|
relation: "creates-promise",
|
|
52
48
|
resolution: operation.kind === "chain" || operation.sourceResolution !== "complete"
|