rea-agents 5.0.0 → 6.1.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 +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- 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/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- 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/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- 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/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- 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 +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- 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 +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- 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 +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- 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 +32 -16
- 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 +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
2
|
import { compareCodePoints } from "../canonicalOrdering.js";
|
|
3
3
|
import { semanticPrimitiveKey } from "./javascriptSemanticProvenance.js";
|
|
4
|
+
import { readExactJavaScriptLiteral } from "./javascriptAstValues.js";
|
|
5
|
+
import { SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, exceedsSemanticPrimitiveStringByteBudget, semanticResourceLimitUnknown, } from "./javascriptSemanticResourceLimits.js";
|
|
6
|
+
/**
|
|
7
|
+
* Keep eight independent binary choices exact, while bounding the next
|
|
8
|
+
* exponential expansion before it allocates hundreds more alternatives.
|
|
9
|
+
*/
|
|
10
|
+
export const MAX_SEMANTIC_PRIMITIVE_CANDIDATES = SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT;
|
|
4
11
|
/** Normalize one bounded collection of possible primitive values. */
|
|
5
12
|
export const semanticPrimitiveSet = (values) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
const uniqueValues = new Set();
|
|
14
|
+
for (const value of values) {
|
|
15
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
16
|
+
return {
|
|
17
|
+
status: "unknown",
|
|
18
|
+
reason: "Nonfinite numbers are outside the JSON primitive lattice.",
|
|
19
|
+
};
|
|
20
|
+
uniqueValues.add(value);
|
|
21
|
+
if (uniqueValues.size > MAX_SEMANTIC_PRIMITIVE_CANDIDATES)
|
|
22
|
+
return semanticResourceLimitUnknown("primitive-candidates");
|
|
23
|
+
}
|
|
24
|
+
if (exceedsSemanticPrimitiveStringByteBudget([...uniqueValues].flatMap((value) => typeof value === "string" ? [value] : [])))
|
|
25
|
+
return semanticResourceLimitUnknown("primitive-bytes");
|
|
26
|
+
const unique = [...uniqueValues]
|
|
27
|
+
.map((value) => ({ key: semanticPrimitiveKey(value), value }))
|
|
28
|
+
.sort((left, right) => compareCodePoints(left.key, right.key))
|
|
29
|
+
.map(({ value }) => value);
|
|
14
30
|
const only = unique[0];
|
|
15
31
|
return unique.length === 1 && only !== undefined
|
|
16
32
|
? { status: "literal", value: only }
|
|
@@ -24,13 +40,5 @@ export const semanticPrimitiveCandidates = (value) => value.status === "literal"
|
|
|
24
40
|
: null;
|
|
25
41
|
/** Parse one Babel primitive literal without evaluating code. */
|
|
26
42
|
export const semanticPrimitiveValue = (node) => {
|
|
27
|
-
|
|
28
|
-
return { found: true, value: node.value };
|
|
29
|
-
if (t.isNumericLiteral(node) && Number.isFinite(node.value))
|
|
30
|
-
return { found: true, value: node.value };
|
|
31
|
-
if (t.isBooleanLiteral(node))
|
|
32
|
-
return { found: true, value: node.value };
|
|
33
|
-
if (t.isNullLiteral(node))
|
|
34
|
-
return { found: true, value: null };
|
|
35
|
-
return { found: false };
|
|
43
|
+
return readExactJavaScriptLiteral(node);
|
|
36
44
|
};
|
|
@@ -4,12 +4,16 @@ import { jsonValueSchema } from "../jsonValue.js";
|
|
|
4
4
|
import { digestSchema } from "../digests.js";
|
|
5
5
|
import { prefixedDigestSchema } from "../digests.js";
|
|
6
6
|
const semanticNodeIdSchema = prefixedDigestSchema("jsrg_node");
|
|
7
|
+
const literalValueSchema = jsonValueSchema.refine((value) => value === null ||
|
|
8
|
+
typeof value === "string" ||
|
|
9
|
+
typeof value === "number" ||
|
|
10
|
+
typeof value === "boolean", "Literal seeds accept only JSON primitive values");
|
|
11
|
+
// Zod derivations drop the shared schema's JSON Schema projection override;
|
|
12
|
+
// re-apply it so MCP catalog generation keeps projecting `{}`.
|
|
13
|
+
literalValueSchema._zod.toJSONSchema = () => ({});
|
|
7
14
|
const literalSeedSchema = z.strictObject({
|
|
8
15
|
kind: z.literal("literal"),
|
|
9
|
-
value:
|
|
10
|
-
typeof value === "string" ||
|
|
11
|
-
typeof value === "number" ||
|
|
12
|
-
typeof value === "boolean", "Literal seeds accept only JSON primitive values"),
|
|
16
|
+
value: literalValueSchema,
|
|
13
17
|
});
|
|
14
18
|
/** Authenticated starting points accepted by semantic tracing. */
|
|
15
19
|
export const javaScriptSemanticQuerySeedSchema = z.discriminatedUnion("kind", [
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** Maximum distinct alternatives retained in one normalized primitive value. */
|
|
2
|
+
export const SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT = 256;
|
|
3
|
+
/** Maximum active expression nesting during inert semantic evaluation. */
|
|
4
|
+
export const SEMANTIC_EXPRESSION_DEPTH_LIMIT = 256;
|
|
5
|
+
/** Bound normalized strings and transient keys independently of transport limits. */
|
|
6
|
+
export const SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT = 1_048_576;
|
|
7
|
+
const RESOURCE_LIMIT_REASON = {
|
|
8
|
+
"primitive-candidates": "Primitive candidate budget exceeded (maximum 256 alternatives).",
|
|
9
|
+
"primitive-bytes": "Primitive string-byte budget exceeded (maximum 1048576 estimated JSON bytes).",
|
|
10
|
+
"expression-depth": "Semantic expression depth budget exceeded (maximum 256 nested expressions).",
|
|
11
|
+
};
|
|
12
|
+
/** Check UTF-16 length against worst-case JSON escaping without flattening. */
|
|
13
|
+
const jsonStringBytesFromLength = (codeUnits) => codeUnits * 6 + 2;
|
|
14
|
+
/** Bound string payload before JSON key serialization or candidate creation. */
|
|
15
|
+
export const exceedsSemanticPrimitiveStringByteBudget = (strings) => {
|
|
16
|
+
let total = 0;
|
|
17
|
+
for (const value of strings) {
|
|
18
|
+
total += jsonStringBytesFromLength(value.length);
|
|
19
|
+
if (total > SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT)
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
/** Bound all outputs of a primitive addition before concatenating any. */
|
|
25
|
+
export const exceedsSemanticPrimitiveAdditionByteBudget = (left, right) => {
|
|
26
|
+
let total = 0;
|
|
27
|
+
for (const leftValue of left) {
|
|
28
|
+
for (const rightValue of right) {
|
|
29
|
+
if (typeof leftValue !== "string" && typeof rightValue !== "string")
|
|
30
|
+
continue;
|
|
31
|
+
const length = String(leftValue).length + String(rightValue).length;
|
|
32
|
+
total += jsonStringBytesFromLength(length);
|
|
33
|
+
if (total > SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT)
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
/** Bound template interpolation outputs before creating concatenated strings. */
|
|
40
|
+
export const exceedsSemanticTemplateByteBudget = (prefixes, suffixes) => {
|
|
41
|
+
let total = 0;
|
|
42
|
+
for (const prefix of prefixes) {
|
|
43
|
+
for (const suffix of suffixes) {
|
|
44
|
+
total += jsonStringBytesFromLength(prefix.length + suffix.length);
|
|
45
|
+
if (total > SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT)
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
/** Make an explicit unknown value tagged with the semantic resource bound. */
|
|
52
|
+
export const semanticResourceLimitUnknown = (resourceLimit) => ({
|
|
53
|
+
status: "unknown",
|
|
54
|
+
reason: RESOURCE_LIMIT_REASON[resourceLimit],
|
|
55
|
+
resourceLimit,
|
|
56
|
+
});
|
|
57
|
+
/** Collect resource-limit classifications from nested semantic values. */
|
|
58
|
+
export const semanticResourceLimitsIn = (values) => {
|
|
59
|
+
const found = new Set();
|
|
60
|
+
const pending = [...values];
|
|
61
|
+
while (pending.length > 0) {
|
|
62
|
+
const value = pending.pop();
|
|
63
|
+
if (value === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
if (value.status === "unknown" && value.resourceLimit !== undefined)
|
|
66
|
+
found.add(value.resourceLimit);
|
|
67
|
+
else if (value.status === "object")
|
|
68
|
+
for (const property of value.properties)
|
|
69
|
+
pending.push(property.value);
|
|
70
|
+
else if (value.status === "array")
|
|
71
|
+
for (const item of value.items)
|
|
72
|
+
pending.push(item);
|
|
73
|
+
}
|
|
74
|
+
return [...found].sort();
|
|
75
|
+
};
|
|
76
|
+
/** Display label for one stable resource classification. */
|
|
77
|
+
export const semanticResourceLimitReason = (resourceLimit) => RESOURCE_LIMIT_REASON[resourceLimit];
|
|
@@ -5,16 +5,46 @@ import { semanticRequireOrigin } from "./javascriptSemanticRequireOrigin.js";
|
|
|
5
5
|
import { compareCodePoints } from "../canonicalOrdering.js";
|
|
6
6
|
import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
|
|
7
7
|
import { semanticAmbiguousProvenance, semanticLocalProvenance, semanticOriginsProvenance, semanticUnresolvedProvenance, uniqueSemanticOrigins, } from "./javascriptSemanticProvenance.js";
|
|
8
|
-
import { semanticPrimitiveCandidates as primitiveCandidates, semanticPrimitiveSet as primitiveSet, semanticPrimitiveValue as primitiveValue, } from "./javascriptSemanticPrimitives.js";
|
|
8
|
+
import { MAX_SEMANTIC_PRIMITIVE_CANDIDATES, semanticPrimitiveCandidates as primitiveCandidates, semanticPrimitiveSet as primitiveSet, semanticPrimitiveValue as primitiveValue, } from "./javascriptSemanticPrimitives.js";
|
|
9
|
+
import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, exceedsSemanticPrimitiveAdditionByteBudget, exceedsSemanticTemplateByteBudget, semanticResourceLimitUnknown, semanticResourceLimitReason, } from "./javascriptSemanticResourceLimits.js";
|
|
10
|
+
const primitiveBindingValuesByState = new WeakMap();
|
|
11
|
+
const primitiveBindingValuesFor = (state) => {
|
|
12
|
+
const existing = primitiveBindingValuesByState.get(state);
|
|
13
|
+
if (existing !== undefined)
|
|
14
|
+
return existing;
|
|
15
|
+
const values = new Map();
|
|
16
|
+
primitiveBindingValuesByState.set(state, values);
|
|
17
|
+
return values;
|
|
18
|
+
};
|
|
19
|
+
// Cap expression recursion independently from graph nodes and primitive unions.
|
|
20
|
+
const isSemanticResourceLimit = (value) => value.status === "unknown" && value.resourceLimit !== undefined;
|
|
9
21
|
/** Evaluate one binding in the bounded constant-value lattice. */
|
|
10
|
-
export const evaluateSemanticBinding = (binding, state) => evaluateBinding(binding, {
|
|
22
|
+
export const evaluateSemanticBinding = (binding, state) => evaluateBinding(binding, {
|
|
23
|
+
state,
|
|
24
|
+
bindings: new Set(),
|
|
25
|
+
expressionDepth: 0,
|
|
26
|
+
primitiveBindingValues: primitiveBindingValuesFor(state),
|
|
27
|
+
});
|
|
11
28
|
/** Evaluate one arbitrary inert expression in the established lexical state. */
|
|
12
|
-
export const evaluateSemanticExpression = (node, state) => evaluateExpression(node, {
|
|
29
|
+
export const evaluateSemanticExpression = (node, state) => evaluateExpression(node, {
|
|
30
|
+
state,
|
|
31
|
+
bindings: new Set(),
|
|
32
|
+
expressionDepth: 0,
|
|
33
|
+
primitiveBindingValues: primitiveBindingValuesFor(state),
|
|
34
|
+
});
|
|
13
35
|
/** Follow module provenance through destructuring, members, and aliases. */
|
|
14
|
-
export const evaluateSemanticProvenance = (binding, state) => provenanceForBinding(binding, {
|
|
36
|
+
export const evaluateSemanticProvenance = (binding, state) => provenanceForBinding(binding, {
|
|
37
|
+
state,
|
|
38
|
+
bindings: new Set(),
|
|
39
|
+
expressionDepth: 0,
|
|
40
|
+
primitiveBindingValues: primitiveBindingValuesFor(state),
|
|
41
|
+
});
|
|
15
42
|
const evaluateBinding = (binding, context) => {
|
|
16
43
|
if (context.bindings.has(binding.bindingId))
|
|
17
44
|
return { status: "cycle", reason: `Alias cycle at ${binding.name}.` };
|
|
45
|
+
const cached = context.primitiveBindingValues.get(binding.bindingId);
|
|
46
|
+
if (cached !== undefined)
|
|
47
|
+
return cached;
|
|
18
48
|
if (binding.initializers.length === 0)
|
|
19
49
|
return {
|
|
20
50
|
status: "unknown",
|
|
@@ -30,9 +60,18 @@ const evaluateBinding = (binding, context) => {
|
|
|
30
60
|
return { status: "unknown", reason: "Missing binding initializer." };
|
|
31
61
|
const nested = nestedContext(context, binding.bindingId);
|
|
32
62
|
const value = projectValue(evaluateExpression(initializer.node, nested), initializer.projection);
|
|
33
|
-
|
|
63
|
+
const projected = binding.mutatedPaths.reduce(invalidateSemanticMutationPath, value);
|
|
64
|
+
if (projected.status === "literal" ||
|
|
65
|
+
projected.status === "union" ||
|
|
66
|
+
(isSemanticResourceLimit(projected) &&
|
|
67
|
+
(projected.resourceLimit === "primitive-bytes" ||
|
|
68
|
+
projected.resourceLimit === "primitive-candidates")))
|
|
69
|
+
context.primitiveBindingValues.set(binding.bindingId, projected);
|
|
70
|
+
return projected;
|
|
34
71
|
};
|
|
35
72
|
const evaluateExpression = (node, context) => {
|
|
73
|
+
if (context.expressionDepth > SEMANTIC_EXPRESSION_DEPTH_LIMIT)
|
|
74
|
+
return semanticResourceLimitUnknown("expression-depth");
|
|
36
75
|
const literal = primitiveValue(node);
|
|
37
76
|
if (literal.found)
|
|
38
77
|
return { status: "literal", value: literal.value };
|
|
@@ -75,18 +114,31 @@ const evaluateTemplate = (node, context) => {
|
|
|
75
114
|
let candidates = [""];
|
|
76
115
|
for (let index = 0; index < node.quasis.length; index += 1) {
|
|
77
116
|
const quasi = node.quasis[index];
|
|
117
|
+
// Semantic template evaluation retains its established raw fallback for
|
|
118
|
+
// synthetic AST inputs; exact atom readers remain cooked-only.
|
|
78
119
|
const text = quasi?.value.cooked ?? quasi?.value.raw ?? "";
|
|
120
|
+
if (exceedsSemanticTemplateByteBudget(candidates, [text]))
|
|
121
|
+
return semanticResourceLimitUnknown("primitive-bytes");
|
|
79
122
|
candidates = candidates.map((prefix) => `${prefix}${text}`);
|
|
80
123
|
const expression = node.expressions[index];
|
|
81
124
|
if (expression === undefined)
|
|
82
125
|
continue;
|
|
83
|
-
const
|
|
84
|
-
|
|
126
|
+
const evaluated = evaluateExpression(expression, nestedContext(context));
|
|
127
|
+
const values = primitiveCandidates(evaluated);
|
|
128
|
+
if (values === null) {
|
|
129
|
+
if (isSemanticResourceLimit(evaluated))
|
|
130
|
+
return evaluated;
|
|
85
131
|
return {
|
|
86
132
|
status: "unknown",
|
|
87
133
|
reason: "Template expression is not a bounded primitive.",
|
|
88
134
|
};
|
|
89
|
-
|
|
135
|
+
}
|
|
136
|
+
if (candidates.length > SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT / values.length)
|
|
137
|
+
return semanticResourceLimitUnknown("primitive-candidates");
|
|
138
|
+
const suffixes = values.map((value) => String(value));
|
|
139
|
+
if (exceedsSemanticTemplateByteBudget(candidates, suffixes))
|
|
140
|
+
return semanticResourceLimitUnknown("primitive-bytes");
|
|
141
|
+
candidates = candidates.flatMap((prefix) => suffixes.map((suffix) => `${prefix}${suffix}`));
|
|
90
142
|
}
|
|
91
143
|
return primitiveSet(candidates);
|
|
92
144
|
};
|
|
@@ -231,17 +283,30 @@ const evaluateAddition = (node, context) => {
|
|
|
231
283
|
const addPrimitiveValues = (leftValue, rightValue) => {
|
|
232
284
|
const left = primitiveCandidates(leftValue);
|
|
233
285
|
const right = primitiveCandidates(rightValue);
|
|
234
|
-
if (left === null || right === null)
|
|
286
|
+
if (left === null || right === null) {
|
|
287
|
+
if (isSemanticResourceLimit(leftValue))
|
|
288
|
+
return leftValue;
|
|
289
|
+
if (isSemanticResourceLimit(rightValue))
|
|
290
|
+
return rightValue;
|
|
235
291
|
return { status: "unknown", reason: "Non-primitive addition." };
|
|
292
|
+
}
|
|
293
|
+
if (left.length > MAX_SEMANTIC_PRIMITIVE_CANDIDATES / right.length)
|
|
294
|
+
return semanticResourceLimitUnknown("primitive-candidates");
|
|
295
|
+
if (exceedsSemanticPrimitiveAdditionByteBudget(left, right))
|
|
296
|
+
return semanticResourceLimitUnknown("primitive-bytes");
|
|
236
297
|
const values = left.flatMap((leftValue) => right.map((rightValue) => typeof leftValue === "string" || typeof rightValue === "string"
|
|
237
298
|
? `${String(leftValue)}${String(rightValue)}`
|
|
238
299
|
: Number(leftValue) + Number(rightValue)));
|
|
239
300
|
return primitiveSet(values);
|
|
240
301
|
};
|
|
241
302
|
const evaluateUnary = (node, context) => {
|
|
242
|
-
const
|
|
243
|
-
|
|
303
|
+
const evaluated = evaluateExpression(node.argument, nestedContext(context));
|
|
304
|
+
const argument = primitiveCandidates(evaluated);
|
|
305
|
+
if (argument === null) {
|
|
306
|
+
if (isSemanticResourceLimit(evaluated))
|
|
307
|
+
return evaluated;
|
|
244
308
|
return { status: "unknown", reason: "Non-primitive unary operand." };
|
|
309
|
+
}
|
|
245
310
|
if (node.operator === "!")
|
|
246
311
|
return primitiveSet(argument.map((value) => !value));
|
|
247
312
|
if (node.operator === "+")
|
|
@@ -318,6 +383,8 @@ const provenanceForBinding = (binding, context) => {
|
|
|
318
383
|
})));
|
|
319
384
|
};
|
|
320
385
|
const provenanceForExpression = (node, context) => {
|
|
386
|
+
if (context.expressionDepth > SEMANTIC_EXPRESSION_DEPTH_LIMIT)
|
|
387
|
+
return semanticUnresolvedProvenance("unknown", semanticResourceLimitReason("expression-depth"));
|
|
321
388
|
const required = semanticRequireOrigin(node, context.state);
|
|
322
389
|
if (required !== undefined)
|
|
323
390
|
return semanticOriginsProvenance([required]);
|
|
@@ -364,6 +431,9 @@ const provenanceForExpression = (node, context) => {
|
|
|
364
431
|
return semanticLocalProvenance();
|
|
365
432
|
};
|
|
366
433
|
const mergeValues = (values) => {
|
|
434
|
+
const resourceLimit = values.find(isSemanticResourceLimit);
|
|
435
|
+
if (resourceLimit !== undefined)
|
|
436
|
+
return resourceLimit;
|
|
367
437
|
const primitives = values.flatMap((value) => primitiveCandidates(value) ?? []);
|
|
368
438
|
return values.every((value) => value.status === "union" || value.status === "literal")
|
|
369
439
|
? primitiveSet(primitives)
|
|
@@ -371,6 +441,8 @@ const mergeValues = (values) => {
|
|
|
371
441
|
};
|
|
372
442
|
const nestedContext = (context, bindingId) => ({
|
|
373
443
|
state: context.state,
|
|
444
|
+
primitiveBindingValues: context.primitiveBindingValues,
|
|
445
|
+
expressionDepth: context.expressionDepth + 1,
|
|
374
446
|
bindings: bindingId === undefined
|
|
375
447
|
? context.bindings
|
|
376
448
|
: new Set([...context.bindings, bindingId]),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parse } from "@babel/parser";
|
|
2
2
|
/** Parse JavaScript or TypeScript once without attaching comments to AST nodes. */
|
|
3
|
-
export const parseJavaScriptSource = (source) => {
|
|
3
|
+
export const parseJavaScriptSource = (source, sourcePath) => {
|
|
4
4
|
try {
|
|
5
5
|
return parse(source, {
|
|
6
6
|
sourceType: "unambiguous",
|
|
@@ -10,7 +10,11 @@ export const parseJavaScriptSource = (source) => {
|
|
|
10
10
|
// forms, including parameter decorators. Without it a decorated
|
|
11
11
|
// TypeScript source fails to parse at all rather than reporting
|
|
12
12
|
// recovered syntax, which loses every fact derived from that source.
|
|
13
|
-
|
|
13
|
+
// Plain .ts artifacts admit angle-bracket type assertions instead of JSX.
|
|
14
|
+
// Unknown paths retain the existing JSX-capable parser contract.
|
|
15
|
+
plugins: sourcePath?.toLowerCase().endsWith(".ts") === true
|
|
16
|
+
? ["decorators-legacy", "typescript"]
|
|
17
|
+
: ["decorators-legacy", "jsx", "typescript"],
|
|
14
18
|
});
|
|
15
19
|
}
|
|
16
20
|
catch (cause) {
|
|
@@ -6,26 +6,27 @@ import { addReference, addSourceMapDirectives, inspectCall, inspectRouteProperty
|
|
|
6
6
|
import { inspectBundlerRegistration, inspectEsbuildWrapper, } from "./javascriptStaticAnalysisBundler.js";
|
|
7
7
|
import { finalizeLocatedFindings } from "./javascriptStaticAnalysisFindings.js";
|
|
8
8
|
import { createJavaScriptAnalysisAccumulator, } from "./javascriptStaticAnalysisState.js";
|
|
9
|
+
import { classifyParsedJavaScriptOpenReceivers, } from "./javascriptSemanticAnalysis.js";
|
|
9
10
|
import { parseJavaScriptSource, } from "./javascriptSourceParser.js";
|
|
10
11
|
/** Parse one JavaScript artifact and recover static structure only. */
|
|
11
12
|
export const analyzeJavaScriptStaticSource = (source) => {
|
|
12
13
|
const file = parseJavaScriptSource(source);
|
|
13
14
|
return file === null
|
|
14
15
|
? failedJavaScriptStaticAnalysis()
|
|
15
|
-
: analyzeParsedJavaScriptStaticSource(source, file);
|
|
16
|
+
: analyzeParsedJavaScriptStaticSource(source, file, classifyParsedJavaScriptOpenReceivers(file));
|
|
16
17
|
};
|
|
17
18
|
/** Recover static structure from an already parsed JavaScript artifact. */
|
|
18
|
-
export const analyzeParsedJavaScriptStaticSource = (source, file) => {
|
|
19
|
-
const accumulator = createJavaScriptAnalysisAccumulator();
|
|
20
|
-
traverseStaticSource(source, file, accumulator);
|
|
19
|
+
export const analyzeParsedJavaScriptStaticSource = (source, file, openReceiverFacts) => {
|
|
20
|
+
const accumulator = createJavaScriptAnalysisAccumulator(source.length);
|
|
21
|
+
traverseStaticSource(source, file, accumulator, openReceiverFacts);
|
|
21
22
|
addSourceMapDirectives(source, file.comments ?? [], accumulator);
|
|
22
23
|
return finalizeStaticAnalysis(source, file, accumulator);
|
|
23
24
|
};
|
|
24
|
-
const traverseStaticSource = (source, file, accumulator) => {
|
|
25
|
+
const traverseStaticSource = (source, file, accumulator, openReceiverFacts) => {
|
|
25
26
|
traverseJavaScriptAst(file, {
|
|
26
27
|
enter: (node) => {
|
|
27
28
|
accumulator.visitedNodes += 1;
|
|
28
|
-
inspectNode(source, node, accumulator);
|
|
29
|
+
inspectNode(source, node, accumulator, openReceiverFacts);
|
|
29
30
|
return undefined;
|
|
30
31
|
},
|
|
31
32
|
});
|
|
@@ -51,28 +52,29 @@ const finalizeStaticAnalysis = (source, file, accumulator) => {
|
|
|
51
52
|
: "complete",
|
|
52
53
|
parse_error_count: parserErrors,
|
|
53
54
|
visited_ast_nodes: accumulator.visitedNodes,
|
|
54
|
-
references: finalizeLocatedFindings(accumulator.references, accumulator.
|
|
55
|
-
endpoints: finalizeLocatedFindings(accumulator.endpoints, accumulator.
|
|
56
|
-
storage: finalizeLocatedFindings(accumulator.storage, accumulator.
|
|
55
|
+
references: finalizeLocatedFindings(accumulator.references, accumulator.moduleRangeIndex),
|
|
56
|
+
endpoints: finalizeLocatedFindings(accumulator.endpoints, accumulator.moduleRangeIndex),
|
|
57
|
+
storage: finalizeLocatedFindings(accumulator.storage, accumulator.moduleRangeIndex),
|
|
57
58
|
bundler_registrations: sortedUnique(accumulator.registrations, registrationKey),
|
|
58
|
-
role_paths: finalizeLocatedFindings(accumulator.roles, accumulator.
|
|
59
|
+
role_paths: finalizeLocatedFindings(accumulator.roles, accumulator.moduleRangeIndex),
|
|
59
60
|
source_map_urls: accumulator.sourceMaps,
|
|
60
61
|
vendors: detectVendors(source),
|
|
61
62
|
electron: {
|
|
62
|
-
browser_windows: finalizeLocatedFindings(accumulator.browserWindows, accumulator.
|
|
63
|
-
context_bridge_apis: finalizeLocatedFindings(accumulator.contextBridgeApis, accumulator.
|
|
64
|
-
ipc: finalizeLocatedFindings(accumulator.ipc, accumulator.
|
|
65
|
-
sender_validations: finalizeLocatedFindings(accumulator.senderValidations, accumulator.
|
|
66
|
-
utility_processes: finalizeLocatedFindings(accumulator.utilityProcesses, accumulator.
|
|
67
|
-
native_addon_bindings: finalizeLocatedFindings(accumulator.nativeAddonBindings, accumulator.
|
|
63
|
+
browser_windows: finalizeLocatedFindings(accumulator.browserWindows, accumulator.moduleRangeIndex),
|
|
64
|
+
context_bridge_apis: finalizeLocatedFindings(accumulator.contextBridgeApis, accumulator.moduleRangeIndex),
|
|
65
|
+
ipc: finalizeLocatedFindings(accumulator.ipc, accumulator.moduleRangeIndex),
|
|
66
|
+
sender_validations: finalizeLocatedFindings(accumulator.senderValidations, accumulator.moduleRangeIndex),
|
|
67
|
+
utility_processes: finalizeLocatedFindings(accumulator.utilityProcesses, accumulator.moduleRangeIndex),
|
|
68
|
+
native_addon_bindings: finalizeLocatedFindings(accumulator.nativeAddonBindings, accumulator.moduleRangeIndex),
|
|
68
69
|
},
|
|
69
70
|
limitations,
|
|
70
71
|
};
|
|
71
72
|
};
|
|
72
|
-
const inspectNode = (source, node, accumulator) => {
|
|
73
|
+
const inspectNode = (source, node, accumulator, openReceiverFacts) => {
|
|
73
74
|
const findings = {
|
|
74
75
|
source,
|
|
75
76
|
accumulator,
|
|
77
|
+
...(openReceiverFacts === undefined ? {} : { openReceiverFacts }),
|
|
76
78
|
};
|
|
77
79
|
inspectElectronStaticNode(node, findings);
|
|
78
80
|
if (t.isCallExpression(node)) {
|
|
@@ -80,6 +82,9 @@ const inspectNode = (source, node, accumulator) => {
|
|
|
80
82
|
inspectEsbuildWrapper(source, node, accumulator);
|
|
81
83
|
inspectCall(source, node, findings);
|
|
82
84
|
}
|
|
85
|
+
else if (t.isOptionalCallExpression(node)) {
|
|
86
|
+
inspectCall(source, node, findings);
|
|
87
|
+
}
|
|
83
88
|
else if (t.isNewExpression(node))
|
|
84
89
|
inspectCall(source, node, findings);
|
|
85
90
|
if ((t.isImportDeclaration(node) || t.isExportAllDeclaration(node)) &&
|
|
@@ -104,13 +104,15 @@ const recoverBundlerModule = (source, property, accumulator) => {
|
|
|
104
104
|
const exportsValue = collectJavaScriptExports(factory);
|
|
105
105
|
const requireName = factoryRequireName(factory);
|
|
106
106
|
const asyncChunks = collectBundlerAsyncChunkKeys(factory, requireName);
|
|
107
|
-
if (typeof factory.start === "number" && typeof factory.end === "number")
|
|
108
|
-
|
|
107
|
+
if (typeof factory.start === "number" && typeof factory.end === "number") {
|
|
108
|
+
const moduleRange = {
|
|
109
109
|
start: factory.start,
|
|
110
110
|
end: factory.end,
|
|
111
111
|
key,
|
|
112
112
|
requireName,
|
|
113
|
-
}
|
|
113
|
+
};
|
|
114
|
+
accumulator.moduleRangeIndex.add(moduleRange);
|
|
115
|
+
}
|
|
114
116
|
return {
|
|
115
117
|
module: {
|
|
116
118
|
module_key: key,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
2
|
import { sanitizeEndpointCandidate } from "../browserObservation.js";
|
|
3
|
-
import { addFindingOnce, addLocatedFinding,
|
|
3
|
+
import { addFindingOnce, addLocatedFinding, } from "./javascriptStaticAnalysisFindings.js";
|
|
4
4
|
import { STATIC_ROUTE_CALL_NAMES, argumentValue, calleeName, endpointArgument as endpointArgumentHelper, prefixedArgument, semanticStaticPropertyName, range, rangeForOffsets, sourceSlice, staticPath, staticPathResolutionContext, storageKind, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
|
|
5
5
|
/** Inspect one call or new expression for references, endpoints, storage, and roles. */
|
|
6
6
|
export const inspectCall = (source, node, context) => {
|
|
7
7
|
const { accumulator } = context;
|
|
8
8
|
const name = calleeName(node.callee);
|
|
9
9
|
const first = stringValue(node.arguments[0]);
|
|
10
|
-
const module =
|
|
10
|
+
const module = context.accumulator.moduleRangeIndex.find(node.start);
|
|
11
11
|
const moduleRequireName = module?.requireName ?? null;
|
|
12
12
|
const requireCall = requireCallSpecifier(node, name, moduleRequireName);
|
|
13
13
|
if (requireCall !== null)
|
|
@@ -103,7 +103,8 @@ const inspectEndpointCall = (node, name, first, context) => {
|
|
|
103
103
|
value: first,
|
|
104
104
|
mechanism: `call:${name}`,
|
|
105
105
|
});
|
|
106
|
-
const
|
|
106
|
+
const receiverFact = context.openReceiverFacts?.get(node.start ?? -1);
|
|
107
|
+
const endpoint = endpointArgumentHelper(name, node.arguments, node.callee, receiverFact);
|
|
107
108
|
if (endpoint !== undefined)
|
|
108
109
|
addEndpoint(context, {
|
|
109
110
|
node,
|
|
@@ -143,7 +144,16 @@ export const inspectRoleProperty = (node, context) => {
|
|
|
143
144
|
});
|
|
144
145
|
};
|
|
145
146
|
const inspectStorageCall = (node, name, first, context) => {
|
|
146
|
-
const
|
|
147
|
+
const receiverFact = context.openReceiverFacts?.get(node.start ?? -1);
|
|
148
|
+
const storage = receiverFact === "local" ||
|
|
149
|
+
receiverFact === "local-indexed-db" ||
|
|
150
|
+
receiverFact === "local-cache-storage"
|
|
151
|
+
? undefined
|
|
152
|
+
: receiverFact === "indexed-db"
|
|
153
|
+
? "indexed-db"
|
|
154
|
+
: receiverFact === "cache-storage"
|
|
155
|
+
? "cache-storage"
|
|
156
|
+
: storageKind(name);
|
|
147
157
|
if (storage === undefined)
|
|
148
158
|
return;
|
|
149
159
|
addLocatedFinding(context, {
|
|
@@ -1,3 +1,68 @@
|
|
|
1
|
+
/** Incremental point lookup preserving insertion-order precedence for overlaps. */
|
|
2
|
+
export class JavaScriptModuleRangeIndex {
|
|
3
|
+
root = {};
|
|
4
|
+
end;
|
|
5
|
+
nextOrder = 0;
|
|
6
|
+
/** Create an empty offset index bounded by the analyzed source length. */
|
|
7
|
+
constructor(sourceLength) {
|
|
8
|
+
this.end = Math.max(1, sourceLength + 1);
|
|
9
|
+
}
|
|
10
|
+
/** Add a module range in the same discovery order used by the analysis pass. */
|
|
11
|
+
add(range) {
|
|
12
|
+
const indexed = { order: this.nextOrder, range };
|
|
13
|
+
this.nextOrder += 1;
|
|
14
|
+
const start = Math.max(0, range.start);
|
|
15
|
+
const end = Math.min(this.end, range.end + 1);
|
|
16
|
+
if (start < end)
|
|
17
|
+
this.insert(this.root, 0, this.end, start, end, indexed);
|
|
18
|
+
}
|
|
19
|
+
/** Return the first discovered inclusive range containing an offset. */
|
|
20
|
+
find(offset) {
|
|
21
|
+
if (offset === null ||
|
|
22
|
+
offset === undefined ||
|
|
23
|
+
!Number.isSafeInteger(offset) ||
|
|
24
|
+
offset < 0 ||
|
|
25
|
+
offset >= this.end)
|
|
26
|
+
return undefined;
|
|
27
|
+
let node = this.root;
|
|
28
|
+
let low = 0;
|
|
29
|
+
let high = this.end;
|
|
30
|
+
let best;
|
|
31
|
+
while (node !== undefined) {
|
|
32
|
+
if (node.best !== undefined &&
|
|
33
|
+
(best === undefined || node.best.order < best.order))
|
|
34
|
+
best = node.best;
|
|
35
|
+
if (high - low <= 1)
|
|
36
|
+
break;
|
|
37
|
+
const middle = low + Math.floor((high - low) / 2);
|
|
38
|
+
if (offset < middle) {
|
|
39
|
+
node = node.left;
|
|
40
|
+
high = middle;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
node = node.right;
|
|
44
|
+
low = middle;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return best?.range;
|
|
48
|
+
}
|
|
49
|
+
insert(node, low, high, queryLow, queryHigh, value) {
|
|
50
|
+
if (queryLow <= low && high <= queryHigh) {
|
|
51
|
+
if (node.best === undefined || value.order < node.best.order)
|
|
52
|
+
node.best = value;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const middle = low + Math.floor((high - low) / 2);
|
|
56
|
+
if (queryLow < middle) {
|
|
57
|
+
node.left ??= {};
|
|
58
|
+
this.insert(node.left, low, middle, queryLow, queryHigh, value);
|
|
59
|
+
}
|
|
60
|
+
if (queryHigh > middle) {
|
|
61
|
+
node.right ??= {};
|
|
62
|
+
this.insert(node.right, middle, high, queryLow, queryHigh, value);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
1
66
|
/** Add one module-attributable finding once per source location. */
|
|
2
67
|
export const addLocatedFinding = (context, input) => addFindingOnce(context.accumulator, `${input.key}\0${String(input.node.start)}`, () => input.collection.push({
|
|
3
68
|
offset: input.node.start ?? -1,
|
|
@@ -13,11 +78,5 @@ export const addFindingOnce = (accumulator, key, add) => {
|
|
|
13
78
|
/** Attach recovered bundle-module ownership to findings after traversal. */
|
|
14
79
|
export const finalizeLocatedFindings = (values, modules) => values.map(({ offset, value }) => ({
|
|
15
80
|
...value,
|
|
16
|
-
module_key:
|
|
81
|
+
module_key: modules.find(offset)?.key ?? null,
|
|
17
82
|
}));
|
|
18
|
-
/** Locate the recovered bundle factory containing one exact source offset. */
|
|
19
|
-
export const moduleAtOffset = (offset, modules) => {
|
|
20
|
-
if (offset === null || offset === undefined)
|
|
21
|
-
return undefined;
|
|
22
|
-
return modules.find(({ start, end }) => offset >= start && offset <= end);
|
|
23
|
-
};
|