rea-agents 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -1,77 +1,50 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { analyzeParsedJavaScriptStaticSource } from "../domain/javascriptStaticAnalysis.js";
|
|
3
3
|
import { analyzeParsedJavaScriptSemantics } from "../domain/javascriptSemanticAnalysis.js";
|
|
4
|
-
import { DEFAULT_JAVASCRIPT_SEMANTIC_LIMITS, } from "../domain/javascriptSemanticIr.js";
|
|
5
4
|
import { parseJavaScriptSource } from "../domain/javascriptSourceParser.js";
|
|
6
5
|
import { failedJavaScriptStaticAnalysis } from "../domain/javascriptStaticAnalysisHelpers.js";
|
|
7
6
|
import { analyzeJavaScriptJsonModule } from "./JavaScriptJsonModules.js";
|
|
8
|
-
/** Analyze
|
|
9
|
-
export const analyzeJavaScriptArtifactFiles = (fileSet
|
|
7
|
+
/** Analyze every text source from the artifact without a result quota. */
|
|
8
|
+
export const analyzeJavaScriptArtifactFiles = (fileSet) => {
|
|
10
9
|
const state = emptyArtifactAnalysis();
|
|
11
|
-
const context = {
|
|
12
|
-
state,
|
|
13
|
-
input,
|
|
14
|
-
deadline: now() + input.limits.max_parse_milliseconds,
|
|
15
|
-
now,
|
|
16
|
-
};
|
|
10
|
+
const context = { state };
|
|
17
11
|
for (const file of fileSet.files)
|
|
18
12
|
analyzeArtifactFile(file, context);
|
|
19
|
-
return finalizeArtifactAnalysis(state
|
|
13
|
+
return finalizeArtifactAnalysis(state);
|
|
20
14
|
};
|
|
21
|
-
const finalizeArtifactAnalysis = (state
|
|
22
|
-
const
|
|
23
|
-
const findings = Math.min(input.limits.max_findings, state.findings + state.htmlScripts.length);
|
|
24
|
-
const sourceMapTruncations = state.sourceMaps.filter(({ status }) => status === "truncated").length;
|
|
25
|
-
const truncatedScopes = state.truncatedScopes +
|
|
26
|
-
sourceMapTruncations +
|
|
27
|
-
(omittedHtmlFindings > 0 ? 1 : 0);
|
|
15
|
+
const finalizeArtifactAnalysis = (state) => {
|
|
16
|
+
const truncatedScopes = state.truncatedScopes;
|
|
28
17
|
return {
|
|
29
18
|
files: state.files,
|
|
30
19
|
packages: state.packages,
|
|
31
20
|
json_modules: state.jsonModules,
|
|
32
|
-
html_scripts: state.htmlScripts
|
|
21
|
+
html_scripts: state.htmlScripts,
|
|
33
22
|
source_maps: state.sourceMaps,
|
|
34
23
|
visited_ast_nodes: state.visitedNodes,
|
|
35
|
-
findings,
|
|
24
|
+
findings: state.findings + state.htmlScripts.length,
|
|
36
25
|
modules: state.modules,
|
|
37
26
|
parse_failures: state.parseFailures,
|
|
38
27
|
truncated_scopes: truncatedScopes,
|
|
39
28
|
limitations: [
|
|
40
29
|
"JavaScript and HTML were parsed as inert text; bundle bootstrap code was never executed.",
|
|
41
30
|
"Static paths and relationships may remain unresolved when expressions are dynamic or obfuscated.",
|
|
42
|
-
...(input.source_map_read_approved
|
|
43
|
-
? []
|
|
44
|
-
: [
|
|
45
|
-
"Source maps were inventoried but their contents were not read without separate approval.",
|
|
46
|
-
]),
|
|
47
31
|
...(truncatedScopes === 0
|
|
48
32
|
? []
|
|
49
|
-
: ["
|
|
33
|
+
: ["Some static-analysis scopes were truncated."]),
|
|
50
34
|
],
|
|
51
35
|
};
|
|
52
36
|
};
|
|
53
37
|
const analyzeArtifactFile = (file, context) => {
|
|
54
|
-
const { state
|
|
38
|
+
const { state } = context;
|
|
55
39
|
addStructuredObservations(file, state);
|
|
56
40
|
if (file.kind === "html" && file.text.included)
|
|
57
|
-
state.htmlScripts.push(...parseHtmlScripts(file.path, file.text.value
|
|
41
|
+
state.htmlScripts.push(...parseHtmlScripts(file.path, file.text.value));
|
|
58
42
|
if (file.kind === "source-map")
|
|
59
43
|
addSourceMap(file, context);
|
|
60
44
|
if (file.kind !== "javascript" || !file.text.included) {
|
|
61
45
|
state.files.push({ file, javascript: null, semantic: null });
|
|
62
46
|
return;
|
|
63
47
|
}
|
|
64
|
-
const remainingNodes = input.limits.max_ast_nodes - state.visitedNodes;
|
|
65
|
-
const remainingFindings = input.limits.max_findings - state.findings;
|
|
66
|
-
const remainingModules = input.limits.max_modules - state.modules;
|
|
67
|
-
if (remainingNodes <= 0 ||
|
|
68
|
-
remainingFindings <= 0 ||
|
|
69
|
-
remainingModules <= 0 ||
|
|
70
|
-
context.now() > context.deadline) {
|
|
71
|
-
state.files.push({ file, javascript: null, semantic: null });
|
|
72
|
-
state.truncatedScopes += 1;
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
48
|
const parsed = parseJavaScriptSource(file.text.value);
|
|
76
49
|
if (parsed === null) {
|
|
77
50
|
const analysis = failedJavaScriptStaticAnalysis();
|
|
@@ -79,50 +52,25 @@ const analyzeArtifactFile = (file, context) => {
|
|
|
79
52
|
state.parseFailures += 1;
|
|
80
53
|
return;
|
|
81
54
|
}
|
|
82
|
-
const analysis = analyzeParsedJavaScriptStaticSource(file.text.value, parsed
|
|
83
|
-
maxAstNodes: remainingNodes,
|
|
84
|
-
maxFindings: remainingFindings,
|
|
85
|
-
maxModules: remainingModules,
|
|
86
|
-
deadline: context.deadline,
|
|
87
|
-
now: context.now,
|
|
88
|
-
});
|
|
55
|
+
const analysis = analyzeParsedJavaScriptStaticSource(file.text.value, parsed);
|
|
89
56
|
const staticFindings = findingCount(analysis);
|
|
90
|
-
const semanticFindingBudget = Math.max(0, input.limits.max_findings - state.findings - staticFindings);
|
|
91
|
-
const semanticLimits = {
|
|
92
|
-
...DEFAULT_JAVASCRIPT_SEMANTIC_LIMITS,
|
|
93
|
-
maxScopes: remainingNodes,
|
|
94
|
-
maxBindings: remainingNodes,
|
|
95
|
-
maxCallables: remainingNodes,
|
|
96
|
-
maxReferences: remainingNodes,
|
|
97
|
-
maxModuleLinks: semanticFindingBudget,
|
|
98
|
-
};
|
|
99
57
|
const semantics = analysis.parse_status === "complete" || analysis.parse_status === "partial"
|
|
100
|
-
? analyzeParsedJavaScriptSemantics(parsed
|
|
58
|
+
? analyzeParsedJavaScriptSemantics(parsed)
|
|
101
59
|
: null;
|
|
102
60
|
state.files.push({
|
|
103
61
|
file,
|
|
104
62
|
javascript: analysis,
|
|
105
|
-
semantic: semantics === null ? null : { ir: semantics
|
|
63
|
+
semantic: semantics === null ? null : { ir: semantics },
|
|
106
64
|
});
|
|
107
65
|
state.visitedNodes += analysis.visited_ast_nodes;
|
|
108
66
|
state.findings += staticFindings + (semantics?.moduleLinks.length ?? 0);
|
|
109
67
|
state.modules += analysis.bundler_registrations.reduce((count, registration) => count + registration.modules.length, 0);
|
|
110
68
|
if (analysis.parse_status === "failed")
|
|
111
69
|
state.parseFailures += 1;
|
|
112
|
-
if (analysis.parse_status === "truncated")
|
|
113
|
-
state.truncatedScopes += 1;
|
|
114
|
-
if (semantics?.coverage.status === "truncated")
|
|
115
|
-
state.truncatedScopes += 1;
|
|
116
70
|
};
|
|
117
71
|
const addSourceMap = (file, context) => {
|
|
118
|
-
const sourceMap = parseSourceMap(file
|
|
119
|
-
deadline: context.deadline,
|
|
120
|
-
now: context.now,
|
|
121
|
-
maximumSources: Math.max(0, context.input.limits.max_source_map_sources -
|
|
122
|
-
context.state.sourceMapSources),
|
|
123
|
-
});
|
|
72
|
+
const sourceMap = parseSourceMap(file);
|
|
124
73
|
context.state.sourceMaps.push(sourceMap);
|
|
125
|
-
context.state.sourceMapSources += sourceMap.sources.length;
|
|
126
74
|
};
|
|
127
75
|
const emptyArtifactAnalysis = () => ({
|
|
128
76
|
files: [],
|
|
@@ -135,7 +83,6 @@ const emptyArtifactAnalysis = () => ({
|
|
|
135
83
|
modules: 0,
|
|
136
84
|
parseFailures: 0,
|
|
137
85
|
truncatedScopes: 0,
|
|
138
|
-
sourceMapSources: 0,
|
|
139
86
|
});
|
|
140
87
|
const addStructuredObservations = (file, state) => {
|
|
141
88
|
if (file.kind === "package-json")
|
|
@@ -163,12 +110,12 @@ const parsePackage = (file) => {
|
|
|
163
110
|
path: file.path,
|
|
164
111
|
sha256: file.sha256,
|
|
165
112
|
status: "included",
|
|
166
|
-
name:
|
|
167
|
-
version:
|
|
168
|
-
main:
|
|
169
|
-
renderer:
|
|
170
|
-
|
|
171
|
-
|
|
113
|
+
name: optionalString(value.name),
|
|
114
|
+
version: optionalString(value.version),
|
|
115
|
+
main: optionalString(value.main),
|
|
116
|
+
renderer: optionalString(value.renderer) ??
|
|
117
|
+
optionalString(value.browser) ??
|
|
118
|
+
optionalString(value.module),
|
|
172
119
|
limitation: null,
|
|
173
120
|
};
|
|
174
121
|
};
|
|
@@ -186,14 +133,14 @@ const unavailablePackage = (file, limitation) => ({
|
|
|
186
133
|
renderer: null,
|
|
187
134
|
limitation,
|
|
188
135
|
});
|
|
189
|
-
const parseHtmlScripts = (path, text
|
|
136
|
+
const parseHtmlScripts = (path, text) => {
|
|
190
137
|
const scripts = [];
|
|
191
138
|
const baseHref = htmlBaseHref(text);
|
|
192
139
|
const pattern = /<script\b[^>]*\bsrc\s*=\s*(["'])([^"']+)\1[^>]*>/giu;
|
|
193
140
|
for (const match of text.matchAll(pattern)) {
|
|
194
|
-
const script = match[2]
|
|
195
|
-
if (script === undefined
|
|
196
|
-
|
|
141
|
+
const script = match[2];
|
|
142
|
+
if (script === undefined)
|
|
143
|
+
continue;
|
|
197
144
|
const start = match.index;
|
|
198
145
|
scripts.push({
|
|
199
146
|
html_path: path,
|
|
@@ -206,13 +153,11 @@ const parseHtmlScripts = (path, text, maximum) => {
|
|
|
206
153
|
};
|
|
207
154
|
const htmlBaseHref = (text) => {
|
|
208
155
|
const match = /<base\b[^>]*\bhref\s*=\s*(["'])([^"']+)\1[^>]*>/iu.exec(text);
|
|
209
|
-
return match?.[2]
|
|
156
|
+
return match?.[2] ?? null;
|
|
210
157
|
};
|
|
211
|
-
const parseSourceMap = (file
|
|
158
|
+
const parseSourceMap = (file) => {
|
|
212
159
|
if (!file.text.included)
|
|
213
160
|
return unavailableSourceMap(file);
|
|
214
|
-
if (context.now() > context.deadline)
|
|
215
|
-
return truncatedSourceMap(file, null, "Parse deadline reached before source-map decoding.");
|
|
216
161
|
let value;
|
|
217
162
|
try {
|
|
218
163
|
value = JSON.parse(file.text.value);
|
|
@@ -220,16 +165,13 @@ const parseSourceMap = (file, context) => {
|
|
|
220
165
|
catch {
|
|
221
166
|
return invalidSourceMap(file, "Source map is not valid JSON.");
|
|
222
167
|
}
|
|
223
|
-
|
|
224
|
-
return truncatedSourceMap(file, null, "Parse deadline elapsed during source-map decoding.");
|
|
225
|
-
const maps = flattenSourceMaps(value, 10_000);
|
|
168
|
+
const maps = flattenSourceMaps(value);
|
|
226
169
|
if (maps === undefined)
|
|
227
|
-
return invalidSourceMap(file, "Source map is not a
|
|
228
|
-
return collectSourceMapOriginals(file, maps
|
|
170
|
+
return invalidSourceMap(file, "Source map is not a version 3 map.");
|
|
171
|
+
return collectSourceMapOriginals(file, maps);
|
|
229
172
|
};
|
|
230
|
-
const collectSourceMapOriginals = (file, maps
|
|
173
|
+
const collectSourceMapOriginals = (file, maps) => {
|
|
231
174
|
const sources = [];
|
|
232
|
-
let total = 0;
|
|
233
175
|
for (const map of maps) {
|
|
234
176
|
const names = map.sources;
|
|
235
177
|
if (!Array.isArray(names))
|
|
@@ -239,20 +181,8 @@ const collectSourceMapOriginals = (file, maps, context) => {
|
|
|
239
181
|
: [];
|
|
240
182
|
const root = typeof map.sourceRoot === "string" ? map.sourceRoot : "";
|
|
241
183
|
for (const [index, raw] of names.entries()) {
|
|
242
|
-
if (total % 1_024 === 0 && context.now() > context.deadline)
|
|
243
|
-
return {
|
|
244
|
-
path: file.path,
|
|
245
|
-
sha256: file.sha256,
|
|
246
|
-
status: "truncated",
|
|
247
|
-
sources,
|
|
248
|
-
omitted_sources: null,
|
|
249
|
-
limitation: "Parse deadline elapsed during source-map traversal.",
|
|
250
|
-
};
|
|
251
184
|
if (typeof raw !== "string")
|
|
252
185
|
return invalidSourceMap(file, "Source map contains a non-string source name.");
|
|
253
|
-
total += 1;
|
|
254
|
-
if (sources.length >= context.maximumSources)
|
|
255
|
-
continue;
|
|
256
186
|
const content = typeof contents[index] === "string" ? contents[index] : null;
|
|
257
187
|
sources.push({
|
|
258
188
|
source: resolveSourceName(root, raw),
|
|
@@ -261,34 +191,26 @@ const collectSourceMapOriginals = (file, maps, context) => {
|
|
|
261
191
|
});
|
|
262
192
|
}
|
|
263
193
|
}
|
|
264
|
-
const omitted = total - sources.length;
|
|
265
194
|
return {
|
|
266
195
|
path: file.path,
|
|
267
196
|
sha256: file.sha256,
|
|
268
|
-
status:
|
|
197
|
+
status: "included",
|
|
269
198
|
sources,
|
|
270
|
-
|
|
271
|
-
limitation: omitted === 0
|
|
272
|
-
? null
|
|
273
|
-
: "Original-source inventory reached the approved source-map limit.",
|
|
199
|
+
limitation: null,
|
|
274
200
|
};
|
|
275
201
|
};
|
|
276
202
|
const unavailableSourceMap = (file) => {
|
|
277
203
|
if (file.text.included)
|
|
278
204
|
throw new TypeError("Expected unavailable source-map text");
|
|
279
|
-
const notApproved = file.text.reason === "not-approved";
|
|
280
205
|
return {
|
|
281
206
|
path: file.path,
|
|
282
207
|
sha256: file.sha256,
|
|
283
|
-
status:
|
|
208
|
+
status: "invalid",
|
|
284
209
|
sources: [],
|
|
285
|
-
|
|
286
|
-
limitation: notApproved
|
|
287
|
-
? "Source-map content requires separate approval."
|
|
288
|
-
: "Source-map text was unavailable within approved limits.",
|
|
210
|
+
limitation: "Source-map text could not be decoded as UTF-8.",
|
|
289
211
|
};
|
|
290
212
|
};
|
|
291
|
-
const flattenSourceMaps = (root
|
|
213
|
+
const flattenSourceMaps = (root) => {
|
|
292
214
|
if (!isRecord(root) || root.version !== 3)
|
|
293
215
|
return undefined;
|
|
294
216
|
const maps = [];
|
|
@@ -298,8 +220,6 @@ const flattenSourceMaps = (root, maximum) => {
|
|
|
298
220
|
if (map === undefined || map.version !== 3)
|
|
299
221
|
return undefined;
|
|
300
222
|
if (Array.isArray(map.sections)) {
|
|
301
|
-
if (pending.length + maps.length + map.sections.length > maximum)
|
|
302
|
-
return undefined;
|
|
303
223
|
for (const section of map.sections) {
|
|
304
224
|
if (!isRecord(section) || !isRecord(section.map))
|
|
305
225
|
return undefined;
|
|
@@ -311,20 +231,11 @@ const flattenSourceMaps = (root, maximum) => {
|
|
|
311
231
|
}
|
|
312
232
|
return maps;
|
|
313
233
|
};
|
|
314
|
-
const truncatedSourceMap = (file, omitted, limitation) => ({
|
|
315
|
-
path: file.path,
|
|
316
|
-
sha256: file.sha256,
|
|
317
|
-
status: "truncated",
|
|
318
|
-
sources: [],
|
|
319
|
-
omitted_sources: omitted,
|
|
320
|
-
limitation,
|
|
321
|
-
});
|
|
322
234
|
const invalidSourceMap = (file, limitation) => ({
|
|
323
235
|
path: file.path,
|
|
324
236
|
sha256: file.sha256,
|
|
325
237
|
status: "invalid",
|
|
326
238
|
sources: [],
|
|
327
|
-
omitted_sources: 0,
|
|
328
239
|
limitation,
|
|
329
240
|
});
|
|
330
241
|
const findingCount = (analysis) => analysis.references.length +
|
|
@@ -347,7 +258,7 @@ const pointForOffset = (text, offset) => {
|
|
|
347
258
|
const lines = text.slice(0, offset).split("\n");
|
|
348
259
|
return { line: lines.length, column: lines.at(-1)?.length ?? 0 };
|
|
349
260
|
};
|
|
350
|
-
const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}
|
|
351
|
-
const
|
|
261
|
+
const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`;
|
|
262
|
+
const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : null;
|
|
352
263
|
const sha256 = (value) => createHash("sha256").update(value).digest("hex");
|
|
353
264
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -4,16 +4,13 @@ import { AsarArtifactReader } from "../artifacts/AsarArtifactReader.js";
|
|
|
4
4
|
import { ArtifactPathRegistry, normalizeArtifactPath, } from "../artifacts/ArtifactPaths.js";
|
|
5
5
|
import { ArtifactReaderFailure, } from "../artifacts/ArtifactReader.js";
|
|
6
6
|
import { streamChunkToBuffer } from "../artifacts/StreamBytes.js";
|
|
7
|
-
/** Read
|
|
8
|
-
export const readJavaScriptArtifactFiles = async (reader, snapshot,
|
|
7
|
+
/** Read all relevant textual entries through an already-inventoried reader. */
|
|
8
|
+
export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
|
|
9
9
|
const inventory = expectedInventory(snapshot);
|
|
10
10
|
const expected = inventory.files;
|
|
11
|
-
const selections = selectTextFiles(expected, input);
|
|
12
11
|
const context = {
|
|
13
|
-
input,
|
|
14
12
|
expected,
|
|
15
13
|
expectedContainers: inventory.containers,
|
|
16
|
-
selections,
|
|
17
14
|
registry: new ArtifactPathRegistry(),
|
|
18
15
|
files: [],
|
|
19
16
|
containers: [],
|
|
@@ -24,62 +21,80 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, input, signa
|
|
|
24
21
|
await visitReader(reader, "", snapshot.manifest.root_sha256, context);
|
|
25
22
|
const files = context.files.sort((left, right) => compareCodePoints(left.path, right.path));
|
|
26
23
|
assertExpectedFilesWereVisited(expected, files);
|
|
27
|
-
const selected = [...selections.values()].filter(({ selected: isSelected }) => isSelected).length;
|
|
28
24
|
return {
|
|
29
25
|
files,
|
|
30
26
|
containers: context.containers.sort((left, right) => compareCodePoints(left.path, right.path)),
|
|
31
|
-
text_files_selected: selected,
|
|
32
27
|
text_bytes_read: context.textBytes,
|
|
33
|
-
omitted_text_files: [...selections.values()].filter(({ selected: isSelected }) => !isSelected).length,
|
|
34
|
-
limit_omitted_text_files: [...selections.values()].filter(({ reason }) => reason === "file-limit" || reason === "byte-limit").length,
|
|
35
|
-
policy_filtered_text_files: [...selections.values()].filter(({ reason }) => reason === "not-approved").length,
|
|
36
28
|
invalid_utf8_files: context.invalidUtf8,
|
|
37
29
|
};
|
|
38
30
|
};
|
|
39
31
|
const visitReader = async (reader, prefix, containerSha256, context) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const path = normalizeArtifactPath(prefix === "" ? entry.path : `${prefix}/${entry.path}`, {
|
|
43
|
-
maxDepth: context.input.limits.max_depth,
|
|
44
|
-
maxPathBytes: context.input.limits.max_path_bytes,
|
|
45
|
-
});
|
|
46
|
-
const nestedAsar = isFilesystemAsar(entry, path);
|
|
47
|
-
context.registry.add(path, nestedAsar ? "directory" : entry.kind);
|
|
48
|
-
if (nestedAsar) {
|
|
49
|
-
await visitNestedAsar(entry, path, context);
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
const expected = context.expected.get(path);
|
|
53
|
-
if (expected === undefined)
|
|
54
|
-
continue;
|
|
55
|
-
const selection = context.selections.get(path);
|
|
56
|
-
const text = await readTextIfSelected(context, {
|
|
32
|
+
const stack = [
|
|
33
|
+
{
|
|
57
34
|
reader,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
container_sha256: containerSha256,
|
|
65
|
-
sha256: expected.sha256,
|
|
66
|
-
bytes: expected.bytes,
|
|
67
|
-
inventory_artifact_id: expected.inventoryArtifactId,
|
|
68
|
-
kind: expected.kind,
|
|
69
|
-
unpacked: entry.unpacked,
|
|
70
|
-
text,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
const visitNestedAsar = async (entry, path, context) => {
|
|
75
|
-
const inventory = expectedContainer(path, context);
|
|
76
|
-
context.containers.push(inventory);
|
|
77
|
-
const nested = new AsarArtifactReader(entry.adapterKey);
|
|
35
|
+
prefix,
|
|
36
|
+
containerSha256,
|
|
37
|
+
iterator: reader.entries(context.signal)[Symbol.asyncIterator](),
|
|
38
|
+
owned: false,
|
|
39
|
+
},
|
|
40
|
+
];
|
|
78
41
|
try {
|
|
79
|
-
|
|
42
|
+
while (stack.length > 0) {
|
|
43
|
+
const frame = stack.at(-1);
|
|
44
|
+
if (frame === undefined)
|
|
45
|
+
break;
|
|
46
|
+
const next = await frame.iterator.next();
|
|
47
|
+
if (next.done) {
|
|
48
|
+
stack.pop();
|
|
49
|
+
if (frame.owned)
|
|
50
|
+
await frame.reader.close();
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const entry = next.value;
|
|
54
|
+
abortIfNeeded(context.signal);
|
|
55
|
+
const path = normalizeArtifactPath(frame.prefix === "" ? entry.path : `${frame.prefix}/${entry.path}`);
|
|
56
|
+
const nestedAsar = isFilesystemAsar(entry, path);
|
|
57
|
+
context.registry.add(path, nestedAsar ? "directory" : entry.kind);
|
|
58
|
+
if (nestedAsar) {
|
|
59
|
+
const inventory = expectedContainer(path, context);
|
|
60
|
+
context.containers.push(inventory);
|
|
61
|
+
const nested = new AsarArtifactReader(entry.adapterKey);
|
|
62
|
+
stack.push({
|
|
63
|
+
reader: nested,
|
|
64
|
+
prefix: path,
|
|
65
|
+
containerSha256: inventory.sha256,
|
|
66
|
+
iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
|
|
67
|
+
owned: true,
|
|
68
|
+
});
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const expected = context.expected.get(path);
|
|
72
|
+
if (expected === undefined)
|
|
73
|
+
continue;
|
|
74
|
+
const text = await readText(context, {
|
|
75
|
+
reader: frame.reader,
|
|
76
|
+
entry,
|
|
77
|
+
expected,
|
|
78
|
+
});
|
|
79
|
+
context.files.push({
|
|
80
|
+
path,
|
|
81
|
+
container_sha256: frame.containerSha256,
|
|
82
|
+
sha256: expected.sha256,
|
|
83
|
+
bytes: expected.bytes,
|
|
84
|
+
inventory_artifact_id: expected.inventoryArtifactId,
|
|
85
|
+
kind: expected.kind,
|
|
86
|
+
unpacked: entry.unpacked,
|
|
87
|
+
text,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
80
90
|
}
|
|
81
91
|
finally {
|
|
82
|
-
await
|
|
92
|
+
await Promise.allSettled(stack
|
|
93
|
+
.filter(({ owned }) => owned)
|
|
94
|
+
.map(async ({ reader, iterator }) => {
|
|
95
|
+
await iterator.return?.();
|
|
96
|
+
await reader.close();
|
|
97
|
+
}));
|
|
83
98
|
}
|
|
84
99
|
};
|
|
85
100
|
const expectedContainer = (path, context) => {
|
|
@@ -88,15 +103,10 @@ const expectedContainer = (path, context) => {
|
|
|
88
103
|
throw new ArtifactReaderFailure("integrity", `Nested ASAR disappeared from inventory: ${path}`);
|
|
89
104
|
return container;
|
|
90
105
|
};
|
|
91
|
-
const
|
|
106
|
+
const readText = async (context, input) => {
|
|
92
107
|
if (input.expected.kind === "native-addon")
|
|
93
108
|
return { included: false, reason: "not-applicable" };
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
included: false,
|
|
97
|
-
reason: input.selection?.reason ?? "file-limit",
|
|
98
|
-
};
|
|
99
|
-
const bytes = await readBounded(await input.reader.open(input.entry, context.signal), context.input.limits.max_text_file_bytes, context.signal);
|
|
109
|
+
const bytes = await readAll(await input.reader.open(input.entry, context.signal), context.signal);
|
|
100
110
|
const digest = createHash("sha256").update(bytes).digest("hex");
|
|
101
111
|
if (digest !== input.expected.sha256 || bytes.length !== input.expected.bytes)
|
|
102
112
|
throw new ArtifactReaderFailure("integrity", `Artifact entry changed after inventory: ${input.expected.path}`);
|
|
@@ -142,47 +152,13 @@ const expectedInventory = (snapshot) => {
|
|
|
142
152
|
}
|
|
143
153
|
return { files, containers };
|
|
144
154
|
};
|
|
145
|
-
const
|
|
146
|
-
const selected = new Map();
|
|
147
|
-
let fileCount = 0;
|
|
148
|
-
let bytes = 0;
|
|
149
|
-
const ordered = [...files.values()].sort((left, right) => {
|
|
150
|
-
const priority = filePriority(left.kind) - filePriority(right.kind);
|
|
151
|
-
return priority === 0 ? compareCodePoints(left.path, right.path) : priority;
|
|
152
|
-
});
|
|
153
|
-
for (const file of ordered) {
|
|
154
|
-
if (file.kind === "native-addon")
|
|
155
|
-
continue;
|
|
156
|
-
if (file.kind === "source-map" && !input.source_map_read_approved) {
|
|
157
|
-
selected.set(file.path, { selected: false, reason: "not-approved" });
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
if (fileCount >= input.limits.max_text_files ||
|
|
161
|
-
file.bytes > input.limits.max_text_file_bytes) {
|
|
162
|
-
selected.set(file.path, { selected: false, reason: "file-limit" });
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
if (bytes + file.bytes > input.limits.max_total_text_bytes) {
|
|
166
|
-
selected.set(file.path, { selected: false, reason: "byte-limit" });
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
selected.set(file.path, { selected: true, reason: null });
|
|
170
|
-
fileCount += 1;
|
|
171
|
-
bytes += file.bytes;
|
|
172
|
-
}
|
|
173
|
-
return selected;
|
|
174
|
-
};
|
|
175
|
-
const readBounded = async (stream, maximum, signal) => {
|
|
155
|
+
const readAll = async (stream, signal) => {
|
|
176
156
|
const chunks = [];
|
|
177
157
|
let bytes = 0;
|
|
178
158
|
for await (const raw of stream) {
|
|
179
159
|
abortIfNeeded(signal);
|
|
180
160
|
const chunk = streamChunkToBuffer(raw);
|
|
181
161
|
bytes += chunk.length;
|
|
182
|
-
if (bytes > maximum) {
|
|
183
|
-
stream.destroy();
|
|
184
|
-
throw new ArtifactReaderFailure("limit", "Selected JavaScript artifact text exceeded its byte limit");
|
|
185
|
-
}
|
|
186
162
|
chunks.push(chunk);
|
|
187
163
|
}
|
|
188
164
|
return Buffer.concat(chunks, bytes);
|
|
@@ -209,22 +185,6 @@ const relevantKind = (path) => {
|
|
|
209
185
|
return "native-addon";
|
|
210
186
|
return undefined;
|
|
211
187
|
};
|
|
212
|
-
const filePriority = (kind) => {
|
|
213
|
-
switch (kind) {
|
|
214
|
-
case "package-json":
|
|
215
|
-
return 0;
|
|
216
|
-
case "html":
|
|
217
|
-
return 1;
|
|
218
|
-
case "javascript":
|
|
219
|
-
return 2;
|
|
220
|
-
case "json":
|
|
221
|
-
return 3;
|
|
222
|
-
case "source-map":
|
|
223
|
-
return 4;
|
|
224
|
-
case "native-addon":
|
|
225
|
-
return 5;
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
188
|
const isFilesystemAsar = (entry, path) => entry.kind === "file" &&
|
|
229
189
|
path.toLowerCase().endsWith(".asar") &&
|
|
230
190
|
isAbsolute(entry.adapterKey);
|
|
@@ -3,7 +3,6 @@ import { createJavaScriptApplicationEdge, createJavaScriptApplicationNode, } fro
|
|
|
3
3
|
export class JavaScriptArtifactGraphAccumulator {
|
|
4
4
|
#nodes = new Map();
|
|
5
5
|
#edges = new Map();
|
|
6
|
-
#omittedObservations = 0;
|
|
7
6
|
/** Create or merge one canonical node. */
|
|
8
7
|
addNode(input) {
|
|
9
8
|
const created = createJavaScriptApplicationNode(input);
|
|
@@ -18,9 +17,7 @@ export class JavaScriptArtifactGraphAccumulator {
|
|
|
18
17
|
]));
|
|
19
18
|
const observations = [...bySemanticId.entries()]
|
|
20
19
|
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
21
|
-
.slice(0, 64)
|
|
22
20
|
.map(([, observation]) => observation);
|
|
23
|
-
this.#omittedObservations += Math.max(0, bySemanticId.size - 64);
|
|
24
21
|
const merged = createJavaScriptApplicationNode({
|
|
25
22
|
kind: existing.kind,
|
|
26
23
|
identity: existing.identity,
|
|
@@ -43,10 +40,6 @@ export class JavaScriptArtifactGraphAccumulator {
|
|
|
43
40
|
edges() {
|
|
44
41
|
return [...this.#edges.values()];
|
|
45
42
|
}
|
|
46
|
-
/** Count distinct node observations omitted by the graph contract bound. */
|
|
47
|
-
omittedObservations() {
|
|
48
|
-
return this.#omittedObservations;
|
|
49
|
-
}
|
|
50
43
|
}
|
|
51
44
|
const observationInput = (observation) => {
|
|
52
45
|
const { observation_id: _observationId, identifier_strategy: _strategy, ...input } = observation;
|