rea-agents 6.2.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
import { unwrapJavaScriptExpression, semanticStaticPropertyKey, } from "./javascriptAstValues.js";
|
|
3
|
+
import { calleeName } from "./javascriptStaticAnalysisHelpers.js";
|
|
4
|
+
// tRPC proxies preserve router and procedure names as property names, so they
|
|
5
|
+
// survive identifier minification. Method names follow @trpc/react-query and
|
|
6
|
+
// @trpc/tanstack-react-query 11.19 documentation; cache-key helpers such as
|
|
7
|
+
// queryKey are excluded because they never issue a request.
|
|
8
|
+
const TRPC_HOOK_METHODS = new Set([
|
|
9
|
+
"useQuery",
|
|
10
|
+
"useSuspenseQuery",
|
|
11
|
+
"useInfiniteQuery",
|
|
12
|
+
"useSuspenseInfiniteQuery",
|
|
13
|
+
"usePrefetchQuery",
|
|
14
|
+
"usePrefetchInfiniteQuery",
|
|
15
|
+
"useMutation",
|
|
16
|
+
"useSubscription",
|
|
17
|
+
"queryOptions",
|
|
18
|
+
"infiniteQueryOptions",
|
|
19
|
+
"mutationOptions",
|
|
20
|
+
"subscriptionOptions",
|
|
21
|
+
]);
|
|
22
|
+
// @trpc/client 11.19 clientCallTypeMap methods; common outside tRPC (Apollo,
|
|
23
|
+
// database pools, stores), so they need corroborating evidence.
|
|
24
|
+
const TRPC_REQUEST_METHODS = new Set(["query", "mutate"]);
|
|
25
|
+
// @trpc/client 11.19 TRPCSubscriptionObserver callbacks; RxJS observers use
|
|
26
|
+
// next/error/complete instead.
|
|
27
|
+
const TRPC_SUBSCRIPTION_CALLBACKS = new Set([
|
|
28
|
+
"onStarted",
|
|
29
|
+
"onData",
|
|
30
|
+
"onError",
|
|
31
|
+
"onStopped",
|
|
32
|
+
"onComplete",
|
|
33
|
+
"onConnectionStateChange",
|
|
34
|
+
]);
|
|
35
|
+
// @trpc/client 11.19 client factories (createTRPCProxyClient is the
|
|
36
|
+
// deprecated alias of createTRPCClient).
|
|
37
|
+
const TRPC_CLIENT_FACTORIES = new Set([
|
|
38
|
+
"createTRPCClient",
|
|
39
|
+
"createTRPCProxyClient",
|
|
40
|
+
]);
|
|
41
|
+
// Built-in HTTP links documented by tRPC 11.19 that carry a `url` option.
|
|
42
|
+
const TRPC_URL_LINKS = new Set([
|
|
43
|
+
"httpLink",
|
|
44
|
+
"httpBatchLink",
|
|
45
|
+
"httpBatchStreamLink",
|
|
46
|
+
"httpSubscriptionLink",
|
|
47
|
+
]);
|
|
48
|
+
// Literals retained by @trpc/client 11.19 bundles (`this.name`, the default
|
|
49
|
+
// accept header key) or by the conventional transport path.
|
|
50
|
+
const TRPC_SOURCE_MARKERS = ["TRPCClientError", "trpc-accept", "/trpc"];
|
|
51
|
+
// Browser-owned roots whose methods share tRPC names, such as
|
|
52
|
+
// navigator.permissions.query.
|
|
53
|
+
const BROWSER_GLOBAL_NAMES = new Set([
|
|
54
|
+
"window",
|
|
55
|
+
"self",
|
|
56
|
+
"globalThis",
|
|
57
|
+
"document",
|
|
58
|
+
"navigator",
|
|
59
|
+
"location",
|
|
60
|
+
"history",
|
|
61
|
+
"console",
|
|
62
|
+
"performance",
|
|
63
|
+
"screen",
|
|
64
|
+
"top",
|
|
65
|
+
"parent",
|
|
66
|
+
"frames",
|
|
67
|
+
]);
|
|
68
|
+
const PROCEDURE_SEGMENT = /^[A-Za-z_$][\w$]*$/u;
|
|
69
|
+
/** Read a static member path and the expression it starts from. */
|
|
70
|
+
const memberPath = (callee) => {
|
|
71
|
+
const reversed = [];
|
|
72
|
+
let current = callee;
|
|
73
|
+
while (t.isMemberExpression(current) ||
|
|
74
|
+
t.isOptionalMemberExpression(current)) {
|
|
75
|
+
const property = semanticStaticPropertyKey(current.property, current.computed);
|
|
76
|
+
if (property === null || !PROCEDURE_SEGMENT.test(property))
|
|
77
|
+
return undefined;
|
|
78
|
+
reversed.push(property);
|
|
79
|
+
current = current.object;
|
|
80
|
+
}
|
|
81
|
+
return { root: current, properties: reversed.reverse() };
|
|
82
|
+
};
|
|
83
|
+
const objectKeys = (node) => t.isObjectExpression(node)
|
|
84
|
+
? node.properties.flatMap((property) => {
|
|
85
|
+
if (!t.isObjectProperty(property) && !t.isObjectMethod(property))
|
|
86
|
+
return [];
|
|
87
|
+
const key = semanticStaticPropertyKey(property.key, property.computed);
|
|
88
|
+
return key === null ? [] : [key];
|
|
89
|
+
})
|
|
90
|
+
: [];
|
|
91
|
+
const objectStringProperty = (node, key) => {
|
|
92
|
+
for (const property of node.properties)
|
|
93
|
+
if (t.isObjectProperty(property) &&
|
|
94
|
+
semanticStaticPropertyKey(property.key, property.computed) === key &&
|
|
95
|
+
t.isStringLiteral(property.value))
|
|
96
|
+
return property.value.value;
|
|
97
|
+
return undefined;
|
|
98
|
+
};
|
|
99
|
+
const objectProperty = (node, key) => {
|
|
100
|
+
for (const property of node.properties)
|
|
101
|
+
if (t.isObjectProperty(property) &&
|
|
102
|
+
semanticStaticPropertyKey(property.key, property.computed) === key)
|
|
103
|
+
return property.value;
|
|
104
|
+
return undefined;
|
|
105
|
+
};
|
|
106
|
+
const GRAPHQL_OPERATION_TYPES = new Set([
|
|
107
|
+
"query",
|
|
108
|
+
"mutation",
|
|
109
|
+
"subscription",
|
|
110
|
+
]);
|
|
111
|
+
// A named GraphQL operation header (GraphQL October 2021, OperationDefinition):
|
|
112
|
+
// type, name, then variable definitions starting with `$`, a directive, or a
|
|
113
|
+
// selection set starting with a field name.
|
|
114
|
+
const GRAPHQL_OPERATION_HEADER = /^(query|mutation|subscription)[\s,]+([_A-Za-z][_0-9A-Za-z]*)[\s,]*(?:\([\s,]*\$|@[_A-Za-z]|\{[\s,]*[_A-Za-z])/u;
|
|
115
|
+
const isGraphqlIgnoredCharacter = (character) => character === "," || character === "" || /\s/u.test(character);
|
|
116
|
+
/** Recover a named operation from GraphQL document text. */
|
|
117
|
+
export const graphqlOperationFromText = (text) => {
|
|
118
|
+
// Skip GraphQL ignored tokens: whitespace, commas, BOM and # comments.
|
|
119
|
+
const limit = text.length;
|
|
120
|
+
let index = 0;
|
|
121
|
+
while (index < limit) {
|
|
122
|
+
const character = text.charAt(index);
|
|
123
|
+
if (isGraphqlIgnoredCharacter(character))
|
|
124
|
+
index += 1;
|
|
125
|
+
else if (character === "#") {
|
|
126
|
+
while (index < limit && !/[\n\r]/u.test(text.charAt(index)))
|
|
127
|
+
index += 1;
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (index >= limit)
|
|
133
|
+
return undefined;
|
|
134
|
+
const header = GRAPHQL_OPERATION_HEADER.exec(text.slice(index));
|
|
135
|
+
const type = header?.[1];
|
|
136
|
+
const name = header?.[2];
|
|
137
|
+
return type === undefined || name === undefined
|
|
138
|
+
? undefined
|
|
139
|
+
: { value: name, mechanism: `graphql:${type}` };
|
|
140
|
+
};
|
|
141
|
+
/** Recover a named operation from a precompiled GraphQL document object. */
|
|
142
|
+
export const graphqlOperationFromDocumentNode = (node) => {
|
|
143
|
+
if (objectStringProperty(node, "kind") !== "OperationDefinition")
|
|
144
|
+
return undefined;
|
|
145
|
+
const type = objectStringProperty(node, "operation");
|
|
146
|
+
if (type === undefined || !GRAPHQL_OPERATION_TYPES.has(type))
|
|
147
|
+
return undefined;
|
|
148
|
+
const name = objectProperty(node, "name");
|
|
149
|
+
if (!t.isObjectExpression(name) ||
|
|
150
|
+
objectStringProperty(name, "kind") !== "Name")
|
|
151
|
+
return undefined;
|
|
152
|
+
const value = objectStringProperty(name, "value");
|
|
153
|
+
return value === undefined
|
|
154
|
+
? undefined
|
|
155
|
+
: { value, mechanism: `graphql:${type}` };
|
|
156
|
+
};
|
|
157
|
+
/** Bundlers use `(0, imported.factory)` to call an import without a receiver. */
|
|
158
|
+
const rpcFactoryName = (callee) => {
|
|
159
|
+
let current = unwrapJavaScriptExpression(callee).node;
|
|
160
|
+
while (t.isSequenceExpression(current)) {
|
|
161
|
+
const last = current.expressions.at(-1);
|
|
162
|
+
if (last === undefined)
|
|
163
|
+
return "";
|
|
164
|
+
current = unwrapJavaScriptExpression(last).node;
|
|
165
|
+
}
|
|
166
|
+
return calleeName(current);
|
|
167
|
+
};
|
|
168
|
+
/** Whether an initializer has the syntax of a documented tRPC client factory. */
|
|
169
|
+
export const isJavaScriptRpcClientFactory = (node) => {
|
|
170
|
+
const call = unwrapJavaScriptExpression(node).node;
|
|
171
|
+
return ((t.isCallExpression(call) || t.isOptionalCallExpression(call)) &&
|
|
172
|
+
TRPC_CLIENT_FACTORIES.has(rpcFactoryName(call.callee).split(".").pop() ?? ""));
|
|
173
|
+
};
|
|
174
|
+
/** Recover the literal `url` option passed to a documented tRPC HTTP link. */
|
|
175
|
+
const trpcLinkUrl = (node) => {
|
|
176
|
+
const name = rpcFactoryName(node.callee);
|
|
177
|
+
const factory = name.slice(name.lastIndexOf(".") + 1);
|
|
178
|
+
if (!TRPC_URL_LINKS.has(factory))
|
|
179
|
+
return undefined;
|
|
180
|
+
const options = node.arguments[0];
|
|
181
|
+
if (!t.isObjectExpression(options))
|
|
182
|
+
return undefined;
|
|
183
|
+
const url = objectStringProperty(options, "url");
|
|
184
|
+
return url === undefined
|
|
185
|
+
? undefined
|
|
186
|
+
: { value: url, mechanism: `trpc:link:${factory}` };
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Create the per-source scan. Hook and option-factory methods are distinctive.
|
|
190
|
+
* `query`/`mutate` need a root bound to a tRPC client factory, or a tRPC source
|
|
191
|
+
* marker with a router path of at least two segments; `subscribe` needs the
|
|
192
|
+
* marker and a tRPC observer argument. `this` roots, browser globals and RTK
|
|
193
|
+
* Query `endpoints` chains are never procedures.
|
|
194
|
+
*/
|
|
195
|
+
export const createJavaScriptRpcScan = (source, clientRoots) => {
|
|
196
|
+
let marker;
|
|
197
|
+
const hasMarker = () => (marker ??= TRPC_SOURCE_MARKERS.some((value) => source.includes(value)));
|
|
198
|
+
// graphql-tag documents retain their source text in loc.source.body; that
|
|
199
|
+
// text repeats the OperationDefinition already recovered from the object.
|
|
200
|
+
const documentSourceBodies = new WeakSet();
|
|
201
|
+
const procedure = (node) => {
|
|
202
|
+
const path = memberPath(node.callee);
|
|
203
|
+
if (path === undefined || t.isThisExpression(path.root))
|
|
204
|
+
return undefined;
|
|
205
|
+
if (t.isIdentifier(path.root) && BROWSER_GLOBAL_NAMES.has(path.root.name))
|
|
206
|
+
return undefined;
|
|
207
|
+
const method = path.properties[path.properties.length - 1];
|
|
208
|
+
const segments = path.properties.slice(0, -1);
|
|
209
|
+
const first = segments[0];
|
|
210
|
+
if (method === undefined || first === undefined)
|
|
211
|
+
return undefined;
|
|
212
|
+
if (BROWSER_GLOBAL_NAMES.has(first) || segments.includes("endpoints"))
|
|
213
|
+
return undefined;
|
|
214
|
+
const bound = clientRoots.has(path.root);
|
|
215
|
+
const recognized = TRPC_HOOK_METHODS.has(method)
|
|
216
|
+
? true
|
|
217
|
+
: TRPC_REQUEST_METHODS.has(method)
|
|
218
|
+
? bound || (segments.length >= 2 && hasMarker())
|
|
219
|
+
: method === "subscribe" &&
|
|
220
|
+
(bound || hasMarker()) &&
|
|
221
|
+
objectKeys(node.arguments[1]).some((key) => TRPC_SUBSCRIPTION_CALLBACKS.has(key));
|
|
222
|
+
return recognized
|
|
223
|
+
? { value: segments.join("."), mechanism: `trpc:procedure:${method}` }
|
|
224
|
+
: undefined;
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
inspect: (node) => {
|
|
228
|
+
if (t.isCallExpression(node) || t.isOptionalCallExpression(node))
|
|
229
|
+
return trpcLinkUrl(node) ?? procedure(node);
|
|
230
|
+
if (t.isObjectExpression(node)) {
|
|
231
|
+
const body = objectProperty(node, "body");
|
|
232
|
+
if (t.isStringLiteral(body) &&
|
|
233
|
+
objectProperty(node, "locationOffset") !== undefined) {
|
|
234
|
+
documentSourceBodies.add(body);
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
return graphqlOperationFromDocumentNode(node);
|
|
238
|
+
}
|
|
239
|
+
if (t.isStringLiteral(node))
|
|
240
|
+
return documentSourceBodies.has(node)
|
|
241
|
+
? undefined
|
|
242
|
+
: graphqlOperationFromText(node.value);
|
|
243
|
+
if (t.isTemplateLiteral(node)) {
|
|
244
|
+
// A template recovered without a cooked value stays dynamic.
|
|
245
|
+
const cooked = node.quasis[0]?.value.cooked;
|
|
246
|
+
return cooked === undefined || cooked === null
|
|
247
|
+
? undefined
|
|
248
|
+
: graphqlOperationFromText(cooked);
|
|
249
|
+
}
|
|
250
|
+
return undefined;
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
};
|
|
@@ -25,7 +25,7 @@ const classifyLayer = (layer, runtimeEntities, matches, options) => {
|
|
|
25
25
|
const layerComplete = options.reconciliationComplete &&
|
|
26
26
|
layer.graph.coverage.status === "complete" &&
|
|
27
27
|
scopedEntities.length > 0 &&
|
|
28
|
-
scopedEntities.every(({ capture }) =>
|
|
28
|
+
scopedEntities.every(({ capture }) => capture.scriptsCompleteWithinScope);
|
|
29
29
|
const states = nodes.map((node) => {
|
|
30
30
|
const runtimeNodeIds = uniqueSorted(direct.get(node.node_id) ?? []);
|
|
31
31
|
if (runtimeNodeIds.length > 0)
|
|
@@ -85,8 +85,6 @@ const append = (values, key, value) => {
|
|
|
85
85
|
else
|
|
86
86
|
current.push(value);
|
|
87
87
|
};
|
|
88
|
-
const captureScriptsComplete = (evidenceId, entities) => entities.find(({ capture }) => capture.evidence.evidence_id === evidenceId)
|
|
89
|
-
?.capture.scriptsCompleteWithinScope === true;
|
|
90
88
|
const isLoadStateNode = (node) => node.kind === "javascript-asset" ||
|
|
91
89
|
node.kind === "javascript-chunk" ||
|
|
92
90
|
node.kind === "javascript-module";
|
|
@@ -16,7 +16,6 @@ export const javascriptRuntimeKindSchema = z.enum([
|
|
|
16
16
|
"electron-renderer",
|
|
17
17
|
]);
|
|
18
18
|
const observedJavaScriptRuntimeKindSchema = javascriptRuntimeKindSchema.or(z.literal("unknown"));
|
|
19
|
-
/** Input for one bounded, attach-only V8 Inspector observation. */
|
|
20
19
|
/** Input for one passive attach-only V8 Inspector observation. */
|
|
21
20
|
export const observeJavaScriptRuntimeInputSchema = z.strictObject({
|
|
22
21
|
...runtimeEndpoint,
|
|
@@ -33,7 +32,6 @@ export const javascriptRuntimeLocationSchema = z.discriminatedUnion("kind", [
|
|
|
33
32
|
z.strictObject({
|
|
34
33
|
kind: z.literal("file"),
|
|
35
34
|
file_path: z.string().min(1),
|
|
36
|
-
authority: z.literal("scope-fallback").optional(),
|
|
37
35
|
}),
|
|
38
36
|
z.strictObject({
|
|
39
37
|
kind: z.literal("url"),
|
|
@@ -48,8 +46,13 @@ export const javascriptRuntimeLocationSchema = z.discriminatedUnion("kind", [
|
|
|
48
46
|
/** Discovery metadata can identify an endpoint target without verifying its file location. */
|
|
49
47
|
export const javascriptRuntimeUnresolvedLocationSchema = z.strictObject({
|
|
50
48
|
kind: z.literal("unresolved"),
|
|
51
|
-
reported_url: z
|
|
52
|
-
|
|
49
|
+
reported_url: z
|
|
50
|
+
.string()
|
|
51
|
+
.describe("Raw Inspector URL, which may be empty for anonymous or evaluated code."),
|
|
52
|
+
reason: z.enum([
|
|
53
|
+
"unverifiable-file-location",
|
|
54
|
+
"location-authorization-not-attempted",
|
|
55
|
+
]),
|
|
53
56
|
});
|
|
54
57
|
/** Verified locations and explicitly unresolved discovery metadata. */
|
|
55
58
|
export const javascriptRuntimeTargetLocationSchema = z.union([
|
|
@@ -74,7 +77,7 @@ export const javascriptRuntimeTargetListSchema = z.strictObject({
|
|
|
74
77
|
});
|
|
75
78
|
const javascriptRuntimeScriptSchema = z.strictObject({
|
|
76
79
|
script_key: prefixedDigestSchema("v8_script"),
|
|
77
|
-
location:
|
|
80
|
+
location: javascriptRuntimeTargetLocationSchema,
|
|
78
81
|
execution_context_key: z.string().nullable(),
|
|
79
82
|
cdp_hash: z.string().nullable(),
|
|
80
83
|
length: z
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { classifyStaticLoadStates } from "./javascriptRuntimeLoadState.js";
|
|
2
2
|
import { buildReconciledApplicationGraph } from "./javascriptRuntimeReconciliationGraph.js";
|
|
3
3
|
import { reconcileRuntimeEntities } from "./javascriptRuntimeReconciliationMatching.js";
|
|
4
|
-
import {
|
|
4
|
+
import { parseStaticLayers, } from "./javascriptRuntimeReconciliationParsing.js";
|
|
5
|
+
import { parseRuntimeCaptures, } from "./javascriptRuntimeReconciliationCaptureParsing.js";
|
|
5
6
|
import { createJavaScriptRuntimeReconciliationResult } from "./javascriptRuntimeReconciliationResult.js";
|
|
6
|
-
import { reconcileJavaScriptRuntimeInputSchema } from "./javascriptRuntimeReconciliationSchemas.js";
|
|
7
7
|
import { projectRuntimeCaptures } from "./javascriptRuntimeReconciliationRuntime.js";
|
|
8
8
|
import { collectStaticRuntimeCandidates } from "./javascriptRuntimeStaticCandidates.js";
|
|
9
|
+
/** Parse caller Evidence once into the owner consumed by reconciliation. */
|
|
10
|
+
export const parseRuntimeReconciliationInput = (input) => ({
|
|
11
|
+
input,
|
|
12
|
+
layers: parseStaticLayers(input.static_layers, ["static_layers"]),
|
|
13
|
+
captures: parseRuntimeCaptures(input.runtime_observations, [
|
|
14
|
+
"runtime_observations",
|
|
15
|
+
]),
|
|
16
|
+
});
|
|
9
17
|
/** Reconcile static JAG layers with authorized passive CDP Evidence. */
|
|
10
|
-
export const reconcileJavaScriptRuntime = (
|
|
11
|
-
const
|
|
12
|
-
const layers = parseStaticLayers(parsed.static_layers);
|
|
13
|
-
const captures = parseRuntimeCaptures(parsed.runtime_observations);
|
|
18
|
+
export const reconcileJavaScriptRuntime = (parsed) => {
|
|
19
|
+
const { layers, captures } = parsed;
|
|
14
20
|
const runtime = projectRuntimeCaptures(captures);
|
|
15
21
|
const candidates = collectStaticRuntimeCandidates(layers);
|
|
16
22
|
const matching = reconcileRuntimeEntities({
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
import { isAbsolute } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
3
3
|
import { isPathWithinRoot } from "../localPath.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
+
import { invalidInput, parseAtPath, } from "./javascriptRuntimeReconciliationInputValidation.js";
|
|
5
6
|
import { classifyBrowserCompleteness, } from "../browserCompleteness.js";
|
|
6
7
|
import { electronActiveObservationResultSchema, } from "./electronActiveObservation.js";
|
|
7
8
|
/** Parse active Electron Evidence as a bounded, target-only runtime capture. */
|
|
8
9
|
export const parseActiveElectronCapture = (evidence) => {
|
|
9
10
|
assertIdentity(evidence);
|
|
10
|
-
const result = electronActiveObservationResultSchema.parse(evidence.normalized_result);
|
|
11
|
-
const parameters = z
|
|
11
|
+
const result = parseAtPath((value) => electronActiveObservationResultSchema.parse(value), evidence.normalized_result, ["normalized_result"]);
|
|
12
|
+
const parameters = parseAtPath((value) => z
|
|
12
13
|
.object({
|
|
13
14
|
application_path: absolutePathSchema,
|
|
14
15
|
application_root: absolutePathSchema,
|
|
15
16
|
})
|
|
16
17
|
.passthrough()
|
|
17
|
-
.parse(evidence.parameters);
|
|
18
|
+
.parse(value), evidence.parameters, ["parameters"]);
|
|
18
19
|
if (result.application.application_path !== parameters.application_path ||
|
|
19
20
|
!isPathWithinRoot(parameters.application_root, result.application.application_path))
|
|
20
|
-
throw
|
|
21
|
+
throw invalidInput(["normalized_result", "application", "application_path"], "Active Electron Evidence application path disagrees with its configured root");
|
|
21
22
|
return {
|
|
22
23
|
kind: "electron-active",
|
|
23
24
|
evidence,
|
|
24
25
|
inspection: normalizeInspection(result),
|
|
25
|
-
captureSha256:
|
|
26
|
+
captureSha256: digestCanonicalValue(result, "Runtime reconciliation"),
|
|
26
27
|
scriptsCompleteWithinScope: false,
|
|
27
28
|
};
|
|
28
29
|
};
|
|
@@ -36,11 +37,11 @@ const assertIdentity = (evidence) => {
|
|
|
36
37
|
evidence.provider.version !== "1" ||
|
|
37
38
|
evidence.authority !== "controlled-replay" ||
|
|
38
39
|
evidence.confidence !== "observed")
|
|
39
|
-
throw
|
|
40
|
+
throw invalidInput([], "Evidence does not match the supported capture_electron_scenario contract");
|
|
40
41
|
};
|
|
41
42
|
const normalizeInspection = (result) => ({
|
|
42
43
|
target: {
|
|
43
|
-
target_id: `electron-active:${
|
|
44
|
+
target_id: `electron-active:${digestCanonicalValue(result.application.application_path, "Runtime reconciliation").slice(0, 32)}`,
|
|
44
45
|
type: "electron-application",
|
|
45
46
|
title: result.application.application_path,
|
|
46
47
|
attached: true,
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { browserAllowedOriginsSchema, browserEndpointSchema, } from "../browserObservation.js";
|
|
3
|
+
import { webPageInspectionSchema, } from "../browserObservationSchemas.js";
|
|
4
|
+
import { classifyBrowserCompleteness, } from "../browserCompleteness.js";
|
|
5
|
+
import { electronPageInspectionSchema, } from "./electronObservation.js";
|
|
6
|
+
import { javascriptRuntimeObservationSchema, javascriptRuntimeKindSchema, } from "./javascriptRuntimeObservation.js";
|
|
7
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
8
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
9
|
+
import { parseEvidence } from "../evidence.js";
|
|
10
|
+
import { parseActiveElectronCapture } from "./javascriptRuntimeReconciliationActive.js";
|
|
11
|
+
import { assertEvidenceIdentity, invalidInput, parseAtPath, } from "./javascriptRuntimeReconciliationInputValidation.js";
|
|
12
|
+
/** Parse only supported passive web/Electron inspection Evidence. */
|
|
13
|
+
export const parseRuntimeCaptures = (observations, path = ["runtime_observations"]) => observations
|
|
14
|
+
.map((observation, index) => parseRuntimeCapture(observation, [...path, index]))
|
|
15
|
+
.sort((left, right) => compareUnicodeCodePoints(left.evidence.evidence_id, right.evidence.evidence_id));
|
|
16
|
+
const parseRuntimeCapture = (input, evidencePath) => {
|
|
17
|
+
const evidence = parseAtPath(parseEvidence, input, evidencePath);
|
|
18
|
+
if (evidence.operation === "inspect_web_page")
|
|
19
|
+
return parseBrowserCapture(evidence, evidencePath);
|
|
20
|
+
if (evidence.operation === "inspect_electron_page")
|
|
21
|
+
return parseElectronCapture(evidence, evidencePath);
|
|
22
|
+
if (evidence.operation === "observe_javascript_runtime")
|
|
23
|
+
return parseV8Capture(evidence, evidencePath);
|
|
24
|
+
if (evidence.operation === "capture_electron_scenario") {
|
|
25
|
+
return parseAtPath(() => parseActiveElectronCapture(evidence), evidence, evidencePath);
|
|
26
|
+
}
|
|
27
|
+
throw invalidInput(evidencePath, "Runtime reconciliation requires inspect_web_page, inspect_electron_page, observe_javascript_runtime, or capture_electron_scenario Evidence");
|
|
28
|
+
};
|
|
29
|
+
const parseBrowserCapture = (evidence, path) => {
|
|
30
|
+
assertEvidenceIdentity(evidence, {
|
|
31
|
+
operation: "inspect_web_page",
|
|
32
|
+
predicate: "rea.web-page-inspection",
|
|
33
|
+
providerId: "rea-cdp-browser",
|
|
34
|
+
providerName: "REA Chrome DevTools Protocol observation provider",
|
|
35
|
+
providerVersion: "2",
|
|
36
|
+
authority: "external-service",
|
|
37
|
+
confidence: "observed",
|
|
38
|
+
}, path);
|
|
39
|
+
const inspection = parseAtPath((value) => webPageInspectionSchema.parse(value), evidence.normalized_result, [...path, "normalized_result"]);
|
|
40
|
+
assertRuntimeParameters(evidence, {
|
|
41
|
+
kind: "browser",
|
|
42
|
+
targetId: inspection.target.target_id,
|
|
43
|
+
targetOrigin: inspection.target.origin,
|
|
44
|
+
sourceIncluded: inspection.scripts.items.some(({ source }) => source.included),
|
|
45
|
+
}, path);
|
|
46
|
+
return {
|
|
47
|
+
kind: "browser",
|
|
48
|
+
evidence,
|
|
49
|
+
inspection,
|
|
50
|
+
captureSha256: digestCanonicalValue(inspection, "Runtime reconciliation"),
|
|
51
|
+
scriptsCompleteWithinScope: scriptsComplete(inspection.completeness),
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const parseElectronCapture = (evidence, path) => {
|
|
55
|
+
assertEvidenceIdentity(evidence, {
|
|
56
|
+
operation: "inspect_electron_page",
|
|
57
|
+
predicate: "rea.electron-page-inspection",
|
|
58
|
+
providerId: "rea-cdp-electron",
|
|
59
|
+
providerName: "REA Electron file-page CDP observation provider",
|
|
60
|
+
providerVersion: "1",
|
|
61
|
+
authority: "external-service",
|
|
62
|
+
confidence: "observed",
|
|
63
|
+
}, path);
|
|
64
|
+
const inspection = parseAtPath((value) => electronPageInspectionSchema.parse(value), evidence.normalized_result, [...path, "normalized_result"]);
|
|
65
|
+
assertRuntimeParameters(evidence, {
|
|
66
|
+
kind: "electron",
|
|
67
|
+
targetId: inspection.target.target_id,
|
|
68
|
+
sourceIncluded: inspection.scripts.items.some(({ source }) => source.included),
|
|
69
|
+
}, path);
|
|
70
|
+
return {
|
|
71
|
+
kind: "electron",
|
|
72
|
+
evidence,
|
|
73
|
+
inspection,
|
|
74
|
+
captureSha256: digestCanonicalValue(inspection, "Runtime reconciliation"),
|
|
75
|
+
scriptsCompleteWithinScope: scriptsComplete(inspection.completeness),
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
const parseV8Capture = (evidence, path) => {
|
|
79
|
+
assertEvidenceIdentity(evidence, {
|
|
80
|
+
operation: "observe_javascript_runtime",
|
|
81
|
+
predicate: "rea.javascript-runtime-observation",
|
|
82
|
+
providerId: "rea-v8-inspector",
|
|
83
|
+
providerName: "REA passive Node/Electron V8 Inspector provider",
|
|
84
|
+
providerVersion: "1",
|
|
85
|
+
authority: "external-service",
|
|
86
|
+
confidence: "observed",
|
|
87
|
+
}, path);
|
|
88
|
+
const result = parseAtPath((value) => javascriptRuntimeObservationSchema.parse(value), evidence.normalized_result, [...path, "normalized_result"]);
|
|
89
|
+
assertV8RuntimeParameters(evidence, result, path);
|
|
90
|
+
return {
|
|
91
|
+
kind: "v8-inspector",
|
|
92
|
+
evidence,
|
|
93
|
+
inspection: normalizeV8Inspection(result),
|
|
94
|
+
captureSha256: digestCanonicalValue(result, "Runtime reconciliation"),
|
|
95
|
+
scriptsCompleteWithinScope: false,
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
const assertV8RuntimeParameters = (evidence, result, path) => {
|
|
99
|
+
const parameters = parseAtPath((value) => z
|
|
100
|
+
.object({
|
|
101
|
+
inspector_endpoint: browserEndpointSchema,
|
|
102
|
+
target_id: z.string().trim().min(1),
|
|
103
|
+
runtime_kind: javascriptRuntimeKindSchema.optional(),
|
|
104
|
+
})
|
|
105
|
+
.passthrough()
|
|
106
|
+
.parse(value), evidence.parameters, [...path, "parameters"]);
|
|
107
|
+
if (parameters.target_id !== result.target.target_id ||
|
|
108
|
+
(parameters.runtime_kind !== undefined &&
|
|
109
|
+
parameters.runtime_kind !== result.target.runtime_kind))
|
|
110
|
+
throw invalidInput([...path, "parameters", "target_id"], "Runtime Evidence target or declared role disagrees with its result");
|
|
111
|
+
if (result.target.location.kind === "builtin" &&
|
|
112
|
+
!result.target.location.specifier.startsWith("node:"))
|
|
113
|
+
throw invalidInput([...path, "normalized_result", "target", "location"], "Runtime Evidence contains an invalid builtin location");
|
|
114
|
+
for (const [index, { location }] of result.scripts.items.entries())
|
|
115
|
+
if (location.kind === "builtin" && !location.specifier.startsWith("node:"))
|
|
116
|
+
throw invalidInput([...path, "normalized_result", "scripts", "items", index, "location"], "Runtime Evidence contains an invalid builtin location");
|
|
117
|
+
};
|
|
118
|
+
const normalizeV8Inspection = (result) => ({
|
|
119
|
+
target: {
|
|
120
|
+
target_id: result.target.target_id,
|
|
121
|
+
type: result.target.protocol_type,
|
|
122
|
+
title: result.target.runtime_kind,
|
|
123
|
+
attached: result.target.attached,
|
|
124
|
+
...(result.target.location.kind === "unresolved"
|
|
125
|
+
? { unresolved_location: result.target.location }
|
|
126
|
+
: runtimeLocation(result.target.location)),
|
|
127
|
+
},
|
|
128
|
+
frames: [],
|
|
129
|
+
scripts: {
|
|
130
|
+
items: result.scripts.items.map((script) => ({
|
|
131
|
+
script_key: script.script_key,
|
|
132
|
+
frame_id: script.execution_context_key,
|
|
133
|
+
...runtimeLocation(script.location),
|
|
134
|
+
cdp_hash: script.cdp_hash,
|
|
135
|
+
length: script.length,
|
|
136
|
+
is_module: script.is_module,
|
|
137
|
+
language: null,
|
|
138
|
+
source: {
|
|
139
|
+
included: false,
|
|
140
|
+
reason: "V8 Inspector source capture is outside passive authority.",
|
|
141
|
+
},
|
|
142
|
+
})),
|
|
143
|
+
},
|
|
144
|
+
workers: [],
|
|
145
|
+
completeness: classifyBrowserCompleteness({
|
|
146
|
+
policyFilteredSections: new Set(excludedV8Scripts(result) > 0 ? ["scripts"] : []),
|
|
147
|
+
attachLimitedSections: new Set([
|
|
148
|
+
"frames",
|
|
149
|
+
"scripts",
|
|
150
|
+
"script_sources",
|
|
151
|
+
"workers",
|
|
152
|
+
]),
|
|
153
|
+
truncatedSections: new Set(result.capture.truncated ? ["scripts"] : []),
|
|
154
|
+
unavailableSections: new Set(["frames", "script_sources", "workers"]),
|
|
155
|
+
excluded: excludedV8Scripts(result) === 0
|
|
156
|
+
? []
|
|
157
|
+
: [
|
|
158
|
+
{
|
|
159
|
+
section: "scripts",
|
|
160
|
+
reason: "out_of_target_scope",
|
|
161
|
+
count: excludedV8Scripts(result),
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
droppedEvents: {
|
|
165
|
+
scripts: result.capture.events_dropped,
|
|
166
|
+
network_requests: 0,
|
|
167
|
+
console_events: 0,
|
|
168
|
+
websocket_connections: 0,
|
|
169
|
+
websocket_frames: 0,
|
|
170
|
+
webmcp_tools: 0,
|
|
171
|
+
timeline_events: 0,
|
|
172
|
+
},
|
|
173
|
+
}),
|
|
174
|
+
});
|
|
175
|
+
const runtimeLocation = (location) => {
|
|
176
|
+
if (location.kind === "unresolved")
|
|
177
|
+
return { unresolved_location: location };
|
|
178
|
+
if (location.kind === "file")
|
|
179
|
+
return { file_path: location.file_path };
|
|
180
|
+
if (location.kind === "url")
|
|
181
|
+
return { url: location.sanitized_url };
|
|
182
|
+
return { url: location.specifier };
|
|
183
|
+
};
|
|
184
|
+
const excludedV8Scripts = (result) => Object.values(result.scripts.excluded).reduce((total, count) => total + count, 0);
|
|
185
|
+
const assertRuntimeParameters = (evidence, expected, path) => {
|
|
186
|
+
const common = {
|
|
187
|
+
target_id: z.string().trim().min(1),
|
|
188
|
+
cdp_endpoint: browserEndpointSchema,
|
|
189
|
+
include_script_sources: z.boolean(),
|
|
190
|
+
};
|
|
191
|
+
if (expected.kind === "browser") {
|
|
192
|
+
const parameters = parseAtPath((value) => z
|
|
193
|
+
.object({ ...common, allowed_origins: browserAllowedOriginsSchema })
|
|
194
|
+
.passthrough()
|
|
195
|
+
.parse(value), evidence.parameters, [...path, "parameters"]);
|
|
196
|
+
if (parameters.target_id !== expected.targetId)
|
|
197
|
+
throw invalidInput([...path, "parameters", "target_id"], "Runtime Evidence target disagrees with its captured result");
|
|
198
|
+
if (!parameters.allowed_origins.includes(expected.targetOrigin))
|
|
199
|
+
throw invalidInput([...path, "parameters", "allowed_origins"], "Browser Evidence target is outside its recorded origin scope");
|
|
200
|
+
if (expected.sourceIncluded && !parameters.include_script_sources)
|
|
201
|
+
throw invalidInput([...path, "parameters", "include_script_sources"], "Runtime Evidence contains source without source-capture selection");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const parameters = parseAtPath((value) => z.object(common).passthrough().parse(value), evidence.parameters, [...path, "parameters"]);
|
|
205
|
+
if (parameters.target_id !== expected.targetId)
|
|
206
|
+
throw invalidInput([...path, "parameters", "target_id"], "Runtime Evidence target disagrees with its captured result");
|
|
207
|
+
if (expected.sourceIncluded && !parameters.include_script_sources)
|
|
208
|
+
throw invalidInput([...path, "parameters", "include_script_sources"], "Runtime Evidence contains source without source-capture selection");
|
|
209
|
+
};
|
|
210
|
+
const scriptsComplete = (completeness) => !completeness.truncated_sections.includes("scripts") &&
|
|
211
|
+
!completeness.unavailable_sections.includes("scripts") &&
|
|
212
|
+
completeness.dropped_events.scripts === 0;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createJavaScriptApplicationGraph, createJavaScriptApplicationNode, } from "./javascriptApplicationGraph.js";
|
|
2
|
-
import {
|
|
2
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
3
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
3
4
|
/** Merge source graphs, runtime nodes, and inferred mappings into one valid JAG. */
|
|
4
5
|
export const buildReconciledApplicationGraph = (input) => {
|
|
5
6
|
const merged = mergeNodes([
|
|
@@ -44,11 +45,11 @@ export const buildReconciledApplicationGraph = (input) => {
|
|
|
44
45
|
const boundGraphContent = (input, nodes, edges) => {
|
|
45
46
|
const allRoots = preferredRootIds(input);
|
|
46
47
|
const rootNodeIds = allRoots;
|
|
47
|
-
const sortedNodes = [...nodes].sort((left, right) =>
|
|
48
|
+
const sortedNodes = [...nodes].sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id));
|
|
48
49
|
const retainedNodes = sortedNodes;
|
|
49
50
|
const retainedIds = new Set(retainedNodes.map(({ node_id: id }) => id));
|
|
50
51
|
const retainedEdges = [...edges]
|
|
51
|
-
.sort((left, right) =>
|
|
52
|
+
.sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id))
|
|
52
53
|
.filter(({ source_node_id: source, target_node_id: target }) => retainedIds.has(source) && retainedIds.has(target));
|
|
53
54
|
return {
|
|
54
55
|
rootNodeIds,
|
|
@@ -130,8 +131,13 @@ const graphCoverage = (input, facts, nodeCount) => facts.inputStatus === "comple
|
|
|
130
131
|
};
|
|
131
132
|
const mergeNodes = (nodes) => {
|
|
132
133
|
const grouped = new Map();
|
|
133
|
-
for (const node of nodes)
|
|
134
|
-
|
|
134
|
+
for (const node of nodes) {
|
|
135
|
+
const group = grouped.get(node.node_id);
|
|
136
|
+
if (group === undefined)
|
|
137
|
+
grouped.set(node.node_id, [node]);
|
|
138
|
+
else
|
|
139
|
+
group.push(node);
|
|
140
|
+
}
|
|
135
141
|
const merged = [...grouped.values()].map((group) => {
|
|
136
142
|
const first = group[0];
|
|
137
143
|
if (first === undefined)
|
|
@@ -143,7 +149,7 @@ const mergeNodes = (nodes) => {
|
|
|
143
149
|
...new Map(group
|
|
144
150
|
.flatMap(({ observations: values }) => values)
|
|
145
151
|
.map((observation) => [observation.observation_id, observation])).values(),
|
|
146
|
-
].sort((left, right) =>
|
|
152
|
+
].sort((left, right) => compareUnicodeCodePoints(left.observation_id, right.observation_id));
|
|
147
153
|
return createJavaScriptApplicationNode({
|
|
148
154
|
kind: first.kind,
|
|
149
155
|
identity: first.identity,
|