rea-agents 3.0.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- 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/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- 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/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- 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 +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- 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 +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- 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/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- 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 +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- 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 +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- 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 -95
- 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 +21 -47
- 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 -88
- 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/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- 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 +21 -31
- 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 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- 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 +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- 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 +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- 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 +12 -60
- 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 +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- 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 +4 -5
- 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 +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- 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 +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- 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 -52
- package/dist/domain/appleApplication.js +24 -65
- 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 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- 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 +53 -54
- package/dist/domain/callPath.js +50 -169
- 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 +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- 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 +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- 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 +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- 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 +70 -77
- 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 +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- 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 +17 -14
- 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 +15 -18
- 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/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- 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 +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- 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 +66 -40
- 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 +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- 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 +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- 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 +48 -85
- 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 -42
- 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 +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- 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 +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- 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 +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- 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/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- 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 +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- 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 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- 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 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- 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
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -3,14 +3,11 @@ import canonicalize from "canonicalize";
|
|
|
3
3
|
import { CdpConnection } from "./CdpConnection.js";
|
|
4
4
|
import { optionalCdpCommand } from "./CdpOptionalCommand.js";
|
|
5
5
|
import { recordValue, recordsValue, stringValue } from "./CdpCaptureValues.js";
|
|
6
|
-
const MAX_CACHE_BODY_BYTES = 64 * 1_024;
|
|
7
6
|
/** Capture stable hashes of approved storage content without returning values. */
|
|
8
7
|
export const captureStorageFingerprints = async ({ context, origin, local, session, indexedDbNames, caches, limitations, }) => {
|
|
9
8
|
const state = {
|
|
10
9
|
items: [],
|
|
11
|
-
maximum: context.input.limits.max_storage_keys,
|
|
12
10
|
complete: local.complete && session.complete,
|
|
13
|
-
truncated: false,
|
|
14
11
|
};
|
|
15
12
|
const run = { context, limitations, state };
|
|
16
13
|
addStorageItems(state, "local_storage", local.items);
|
|
@@ -19,13 +16,8 @@ export const captureStorageFingerprints = async ({ context, origin, local, sessi
|
|
|
19
16
|
await addIndexedDb(run, origin, indexedDbNames);
|
|
20
17
|
await addCaches(run, caches);
|
|
21
18
|
state.items.sort((left, right) => compareCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
complete: state.complete &&
|
|
25
|
-
!state.truncated &&
|
|
26
|
-
state.items.every(({ complete }) => complete),
|
|
27
|
-
truncated: state.truncated,
|
|
28
|
-
};
|
|
19
|
+
const complete = state.complete && state.items.every(({ complete }) => complete);
|
|
20
|
+
return { items: state.items, complete };
|
|
29
21
|
};
|
|
30
22
|
const addStorageItems = (state, scope, items) => {
|
|
31
23
|
for (const item of items)
|
|
@@ -77,10 +69,6 @@ const addCookies = async (run, origin) => {
|
|
|
77
69
|
};
|
|
78
70
|
const addIndexedDb = async (run, origin, names) => {
|
|
79
71
|
for (const databaseName of names) {
|
|
80
|
-
if (run.state.items.length >= run.state.maximum) {
|
|
81
|
-
run.state.truncated = true;
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
72
|
const raw = await optionalCdpCommand(run.context, "IndexedDB.requestDatabase", { securityOrigin: origin, databaseName }, run.limitations);
|
|
85
73
|
const database = recordValue(recordValue(raw)?.databaseWithObjectStores);
|
|
86
74
|
if (raw === undefined || database === undefined) {
|
|
@@ -139,76 +127,88 @@ const indexedDbSchemaComplete = (stores) => stores.every((store) => stringValue(
|
|
|
139
127
|
typeof index.unique === "boolean" &&
|
|
140
128
|
typeof index.multiEntry === "boolean"));
|
|
141
129
|
const addIndexedDbRecords = async (run, input) => {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
run.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
skipCount: 0,
|
|
153
|
-
pageSize: remaining,
|
|
154
|
-
}, run.limitations);
|
|
155
|
-
const result = recordValue(raw);
|
|
156
|
-
if (raw === undefined || result === undefined) {
|
|
157
|
-
run.state.complete = false;
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
if (!Array.isArray(result.objectStoreDataEntries) ||
|
|
161
|
-
typeof result.hasMore !== "boolean") {
|
|
162
|
-
run.state.complete = false;
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
const entries = recordsValue(result.objectStoreDataEntries);
|
|
166
|
-
if (entries.length !== result.objectStoreDataEntries.length)
|
|
167
|
-
run.state.complete = false;
|
|
168
|
-
for (const entry of entries) {
|
|
169
|
-
const key = stableValue(entry.key);
|
|
170
|
-
const primaryKey = stableValue(entry.primaryKey);
|
|
171
|
-
const value = stableValue(entry.value);
|
|
172
|
-
addFingerprint(run.state, {
|
|
173
|
-
scope: "indexed_db_record",
|
|
174
|
-
identity: {
|
|
175
|
-
database: input.databaseName,
|
|
176
|
-
store: input.objectStoreName,
|
|
177
|
-
key,
|
|
178
|
-
primaryKey,
|
|
179
|
-
},
|
|
180
|
-
value,
|
|
181
|
-
complete: remoteObjectComplete(entry.value),
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
if (result.hasMore === true || entries.length > remaining)
|
|
185
|
-
run.state.truncated = true;
|
|
186
|
-
};
|
|
187
|
-
const addCaches = async (run, caches) => {
|
|
188
|
-
for (const cache of caches) {
|
|
189
|
-
const remaining = run.state.maximum - run.state.items.length;
|
|
190
|
-
if (remaining <= 0) {
|
|
191
|
-
run.state.truncated = true;
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const raw = await optionalCdpCommand(run.context, "CacheStorage.requestEntries", { cacheId: cache.id, skipCount: 0, pageSize: remaining }, run.limitations);
|
|
130
|
+
let skipCount = 0;
|
|
131
|
+
while (true) {
|
|
132
|
+
const raw = await optionalCdpCommand(run.context, "IndexedDB.requestData", {
|
|
133
|
+
securityOrigin: input.origin,
|
|
134
|
+
databaseName: input.databaseName,
|
|
135
|
+
objectStoreName: input.objectStoreName,
|
|
136
|
+
indexName: "",
|
|
137
|
+
skipCount,
|
|
138
|
+
pageSize: STORAGE_ENTRY_PAGE_SIZE,
|
|
139
|
+
}, run.limitations);
|
|
195
140
|
const result = recordValue(raw);
|
|
196
141
|
if (raw === undefined || result === undefined) {
|
|
197
142
|
run.state.complete = false;
|
|
198
|
-
|
|
143
|
+
return;
|
|
199
144
|
}
|
|
200
|
-
if (!Array.isArray(result.
|
|
201
|
-
typeof result.
|
|
145
|
+
if (!Array.isArray(result.objectStoreDataEntries) ||
|
|
146
|
+
typeof result.hasMore !== "boolean") {
|
|
202
147
|
run.state.complete = false;
|
|
203
|
-
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const entries = recordsValue(result.objectStoreDataEntries);
|
|
151
|
+
if (entries.length !== result.objectStoreDataEntries.length)
|
|
152
|
+
run.state.complete = false;
|
|
153
|
+
for (const entry of entries) {
|
|
154
|
+
const key = stableValue(entry.key);
|
|
155
|
+
const primaryKey = stableValue(entry.primaryKey);
|
|
156
|
+
const value = stableValue(entry.value);
|
|
157
|
+
addFingerprint(run.state, {
|
|
158
|
+
scope: "indexed_db_record",
|
|
159
|
+
identity: {
|
|
160
|
+
database: input.databaseName,
|
|
161
|
+
store: input.objectStoreName,
|
|
162
|
+
key,
|
|
163
|
+
primaryKey,
|
|
164
|
+
},
|
|
165
|
+
value,
|
|
166
|
+
complete: remoteObjectComplete(entry.value),
|
|
167
|
+
});
|
|
204
168
|
}
|
|
205
|
-
|
|
206
|
-
|
|
169
|
+
if (result.hasMore !== true)
|
|
170
|
+
return;
|
|
171
|
+
if (entries.length === 0 ||
|
|
172
|
+
skipCount > Number.MAX_SAFE_INTEGER - entries.length) {
|
|
207
173
|
run.state.complete = false;
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
skipCount += entries.length;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const addCaches = async (run, caches) => {
|
|
180
|
+
for (const cache of caches) {
|
|
181
|
+
let skipCount = 0;
|
|
182
|
+
let returnCount;
|
|
183
|
+
while (returnCount === undefined || skipCount < returnCount) {
|
|
184
|
+
const raw = await optionalCdpCommand(run.context, "CacheStorage.requestEntries", { cacheId: cache.id, skipCount, pageSize: STORAGE_ENTRY_PAGE_SIZE }, run.limitations);
|
|
185
|
+
const result = recordValue(raw);
|
|
186
|
+
if (raw === undefined || result === undefined) {
|
|
187
|
+
run.state.complete = false;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
if (!Array.isArray(result.cacheDataEntries) ||
|
|
191
|
+
typeof result.returnCount !== "number" ||
|
|
192
|
+
!Number.isSafeInteger(result.returnCount) ||
|
|
193
|
+
result.returnCount < 0) {
|
|
194
|
+
run.state.complete = false;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
const entries = recordsValue(result.cacheDataEntries);
|
|
198
|
+
if (entries.length !== result.cacheDataEntries.length)
|
|
199
|
+
run.state.complete = false;
|
|
200
|
+
for (const entry of entries)
|
|
201
|
+
await addCacheEntry(run, cache, entry);
|
|
202
|
+
returnCount = result.returnCount;
|
|
203
|
+
if (skipCount + entries.length >= returnCount)
|
|
204
|
+
break;
|
|
205
|
+
if (entries.length === 0 ||
|
|
206
|
+
skipCount > Number.MAX_SAFE_INTEGER - entries.length) {
|
|
207
|
+
run.state.complete = false;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
skipCount += entries.length;
|
|
211
|
+
}
|
|
212
212
|
}
|
|
213
213
|
};
|
|
214
214
|
const addCacheEntry = async (run, cache, entry) => {
|
|
@@ -236,7 +236,7 @@ const addCacheEntry = async (run, cache, entry) => {
|
|
|
236
236
|
const raw = await optionalCdpCommand(run.context, "CacheStorage.requestCachedResponse", { cacheId: cache.id, requestURL, requestHeaders }, run.limitations);
|
|
237
237
|
const body = stringValue(recordValue(recordValue(raw)?.response)?.body);
|
|
238
238
|
const decoded = body === undefined ? null : decodeBase64(body);
|
|
239
|
-
const complete = decoded !== null
|
|
239
|
+
const complete = decoded !== null;
|
|
240
240
|
if (!complete)
|
|
241
241
|
run.state.complete = false;
|
|
242
242
|
addFingerprint(run.state, {
|
|
@@ -247,10 +247,6 @@ const addCacheEntry = async (run, cache, entry) => {
|
|
|
247
247
|
});
|
|
248
248
|
};
|
|
249
249
|
const addFingerprint = (state, input) => {
|
|
250
|
-
if (state.items.length >= state.maximum) {
|
|
251
|
-
state.truncated = true;
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
250
|
state.items.push({
|
|
255
251
|
scope: input.scope,
|
|
256
252
|
identity_sha256: digest(input.identity),
|
|
@@ -260,6 +256,7 @@ const addFingerprint = (state, input) => {
|
|
|
260
256
|
stableValueComplete(input.value),
|
|
261
257
|
});
|
|
262
258
|
};
|
|
259
|
+
const STORAGE_ENTRY_PAGE_SIZE = 1_000;
|
|
263
260
|
const digest = (value) => createHash("sha256").update(encodedValue(value)).digest("hex");
|
|
264
261
|
const encodedValue = (value) => {
|
|
265
262
|
if (value instanceof Uint8Array)
|
|
@@ -269,26 +266,23 @@ const encodedValue = (value) => {
|
|
|
269
266
|
throw new TypeError("Expected canonical JSON");
|
|
270
267
|
return encoded;
|
|
271
268
|
};
|
|
272
|
-
const stableValue = (value
|
|
269
|
+
const stableValue = (value) => {
|
|
273
270
|
if (value === null ||
|
|
274
271
|
typeof value === "string" ||
|
|
275
272
|
typeof value === "number" ||
|
|
276
273
|
typeof value === "boolean")
|
|
277
274
|
return value;
|
|
278
|
-
if (depth >= 8)
|
|
279
|
-
return "<depth-limit>";
|
|
280
275
|
if (Array.isArray(value))
|
|
281
|
-
return value.
|
|
276
|
+
return value.map((item) => stableValue(item));
|
|
282
277
|
const record = recordValue(value);
|
|
283
278
|
if (record === undefined)
|
|
284
279
|
return String(value);
|
|
285
280
|
return Object.fromEntries(Object.entries(record)
|
|
286
281
|
.filter(([key]) => key !== "objectId" && key !== "customPreview")
|
|
287
282
|
.sort(([left], [right]) => compareCodePoints(left, right))
|
|
288
|
-
.
|
|
289
|
-
.map(([key, item]) => [key, stableValue(item, depth + 1)]));
|
|
283
|
+
.map(([key, item]) => [key, stableValue(item)]));
|
|
290
284
|
};
|
|
291
|
-
const stableValueComplete = (value
|
|
285
|
+
const stableValueComplete = (value) => {
|
|
292
286
|
if (value instanceof Uint8Array)
|
|
293
287
|
return true;
|
|
294
288
|
if (value === null ||
|
|
@@ -297,17 +291,13 @@ const stableValueComplete = (value, depth = 0) => {
|
|
|
297
291
|
typeof value === "number" ||
|
|
298
292
|
typeof value === "boolean")
|
|
299
293
|
return true;
|
|
300
|
-
if (depth >= 8)
|
|
301
|
-
return false;
|
|
302
294
|
if (Array.isArray(value))
|
|
303
|
-
return
|
|
304
|
-
value.every((item) => stableValueComplete(item, depth + 1)));
|
|
295
|
+
return value.every((item) => stableValueComplete(item));
|
|
305
296
|
const record = recordValue(value);
|
|
306
297
|
if (record === undefined)
|
|
307
298
|
return false;
|
|
308
299
|
const entries = Object.entries(record).filter(([key]) => key !== "objectId" && key !== "customPreview");
|
|
309
|
-
return
|
|
310
|
-
entries.every(([, item]) => stableValueComplete(item, depth + 1)));
|
|
300
|
+
return entries.every(([, item]) => stableValueComplete(item));
|
|
311
301
|
};
|
|
312
302
|
const remoteObjectComplete = (value) => {
|
|
313
303
|
const record = recordValue(value);
|
|
@@ -17,10 +17,6 @@ export const requiredRecord = (value) => {
|
|
|
17
17
|
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
18
18
|
return record;
|
|
19
19
|
};
|
|
20
|
-
export const boundedText = (value, maximum = 1_024) => {
|
|
21
|
-
const text = stringValue(value);
|
|
22
|
-
return text === undefined ? null : text.slice(0, maximum);
|
|
23
|
-
};
|
|
24
20
|
export const isHttpUrl = (value) => {
|
|
25
21
|
if (value === undefined)
|
|
26
22
|
return false;
|
|
@@ -47,22 +43,26 @@ export const sourceResult = (source) => ({
|
|
|
47
43
|
});
|
|
48
44
|
export const sourceExcluded = (reason) => ({ included: false, reason });
|
|
49
45
|
export const delayWithCancellation = async (durationMs, operation, signal) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
throw new AnalysisCancelledError(operation);
|
|
54
|
-
await new Promise((resolve, reject) => {
|
|
55
|
-
const timer = setTimeout(() => {
|
|
56
|
-
signal?.removeEventListener("abort", onAbort);
|
|
57
|
-
resolve();
|
|
58
|
-
}, durationMs);
|
|
59
|
-
const onAbort = () => {
|
|
60
|
-
clearTimeout(timer);
|
|
61
|
-
signal?.removeEventListener("abort", onAbort);
|
|
62
|
-
reject(new AnalysisCancelledError(operation));
|
|
63
|
-
};
|
|
64
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
46
|
+
const maximumTimerDelay = 2_147_483_647;
|
|
47
|
+
let remaining = durationMs;
|
|
48
|
+
while (remaining > 0) {
|
|
65
49
|
if (signal?.aborted === true)
|
|
66
|
-
|
|
67
|
-
|
|
50
|
+
throw new AnalysisCancelledError(operation);
|
|
51
|
+
const delay = Math.min(remaining, maximumTimerDelay);
|
|
52
|
+
await new Promise((resolve, reject) => {
|
|
53
|
+
const timer = setTimeout(() => {
|
|
54
|
+
signal?.removeEventListener("abort", onAbort);
|
|
55
|
+
resolve();
|
|
56
|
+
}, delay);
|
|
57
|
+
const onAbort = () => {
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
signal?.removeEventListener("abort", onAbort);
|
|
60
|
+
reject(new AnalysisCancelledError(operation));
|
|
61
|
+
};
|
|
62
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
63
|
+
if (signal?.aborted === true)
|
|
64
|
+
onAbort();
|
|
65
|
+
});
|
|
66
|
+
remaining -= delay;
|
|
67
|
+
}
|
|
68
68
|
};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import WebSocket, {} from "ws";
|
|
2
|
-
import { AnalysisCancelledError, AnalysisError,
|
|
3
|
-
|
|
4
|
-
const COMMAND_TIMEOUT_MS = 5_000;
|
|
5
|
-
const MAX_PAYLOAD_BYTES = 16 * 1_024 * 1_024;
|
|
6
|
-
const MAX_PENDING_COMMANDS = 128;
|
|
7
|
-
/** Correlated, bounded JSON-RPC transport for one CDP target operation. */
|
|
2
|
+
import { AnalysisCancelledError, AnalysisError, BrowserObservationError, } from "../domain/errors.js";
|
|
3
|
+
/** Correlated JSON-RPC transport for one CDP target operation. */
|
|
8
4
|
export class CdpConnection {
|
|
9
5
|
socket;
|
|
10
6
|
operation;
|
|
@@ -26,8 +22,8 @@ export class CdpConnection {
|
|
|
26
22
|
if (signal?.aborted === true)
|
|
27
23
|
throw new AnalysisCancelledError(operation);
|
|
28
24
|
const socket = new WebSocket(url, {
|
|
29
|
-
handshakeTimeout:
|
|
30
|
-
maxPayload:
|
|
25
|
+
handshakeTimeout: 0,
|
|
26
|
+
maxPayload: 0,
|
|
31
27
|
perMessageDeflate: false,
|
|
32
28
|
});
|
|
33
29
|
await waitForOpen(socket, operation, signal);
|
|
@@ -47,14 +43,12 @@ export class CdpConnection {
|
|
|
47
43
|
this.#disconnectListeners.add(listener);
|
|
48
44
|
return () => this.#disconnectListeners.delete(listener);
|
|
49
45
|
}
|
|
50
|
-
/** Execute one
|
|
46
|
+
/** Execute one command, optionally within a flat target session. */
|
|
51
47
|
async send(method, params = {}, sessionId, signal) {
|
|
52
48
|
if (this.#protocolFailed)
|
|
53
49
|
throw new BrowserObservationError(this.operation, "protocol_error");
|
|
54
50
|
if (this.#closed || this.socket.readyState !== WebSocket.OPEN)
|
|
55
51
|
throw new BrowserObservationError(this.operation, "disconnected");
|
|
56
|
-
if (this.#pending.size >= MAX_PENDING_COMMANDS)
|
|
57
|
-
throw new BrowserObservationError(this.operation, "payload_limit");
|
|
58
52
|
if (signal?.aborted === true)
|
|
59
53
|
throw new AnalysisCancelledError(this.operation);
|
|
60
54
|
const id = this.#nextId;
|
|
@@ -64,21 +58,14 @@ export class CdpConnection {
|
|
|
64
58
|
const pending = this.#pending.get(id);
|
|
65
59
|
if (pending === undefined)
|
|
66
60
|
return;
|
|
67
|
-
clearTimeout(pending.timer);
|
|
68
61
|
pending.removeAbort();
|
|
69
62
|
this.#pending.delete(id);
|
|
70
63
|
reject(new AnalysisCancelledError(this.operation));
|
|
71
64
|
};
|
|
72
65
|
signal?.addEventListener("abort", onAbort, { once: true });
|
|
73
|
-
const timer = setTimeout(() => {
|
|
74
|
-
signal?.removeEventListener("abort", onAbort);
|
|
75
|
-
this.#pending.delete(id);
|
|
76
|
-
reject(new AnalysisTimeoutError(this.operation, COMMAND_TIMEOUT_MS));
|
|
77
|
-
}, COMMAND_TIMEOUT_MS);
|
|
78
66
|
this.#pending.set(id, {
|
|
79
67
|
resolve,
|
|
80
68
|
reject,
|
|
81
|
-
timer,
|
|
82
69
|
removeAbort: () => signal?.removeEventListener("abort", onAbort),
|
|
83
70
|
});
|
|
84
71
|
this.socket.send(JSON.stringify({
|
|
@@ -171,7 +158,6 @@ export class CdpConnection {
|
|
|
171
158
|
pending.resolve("result" in message ? message.result : {});
|
|
172
159
|
}
|
|
173
160
|
#complete(id, pending) {
|
|
174
|
-
clearTimeout(pending.timer);
|
|
175
161
|
pending.removeAbort();
|
|
176
162
|
this.#pending.delete(id);
|
|
177
163
|
}
|
|
@@ -202,11 +188,6 @@ const rawText = (data) => Array.isArray(data)
|
|
|
202
188
|
: Buffer.from(data).toString("utf8");
|
|
203
189
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
204
190
|
const waitForOpen = async (socket, operation, signal) => await new Promise((resolve, reject) => {
|
|
205
|
-
const timer = setTimeout(() => {
|
|
206
|
-
cleanup();
|
|
207
|
-
terminateSocket(socket);
|
|
208
|
-
reject(new AnalysisTimeoutError(operation, CONNECT_TIMEOUT_MS));
|
|
209
|
-
}, CONNECT_TIMEOUT_MS);
|
|
210
191
|
const onOpen = () => {
|
|
211
192
|
cleanup();
|
|
212
193
|
resolve();
|
|
@@ -219,18 +200,22 @@ const waitForOpen = async (socket, operation, signal) => await new Promise((reso
|
|
|
219
200
|
cause,
|
|
220
201
|
}));
|
|
221
202
|
};
|
|
203
|
+
const onClose = (code, reason) => {
|
|
204
|
+
onFailure(new Error(`CDP WebSocket closed before opening (${code}: ${reason.toString("utf8")})`));
|
|
205
|
+
};
|
|
222
206
|
const onAbort = () => {
|
|
223
207
|
terminateSocket(socket);
|
|
224
208
|
onFailure(new AnalysisCancelledError(operation));
|
|
225
209
|
};
|
|
226
210
|
const cleanup = () => {
|
|
227
|
-
clearTimeout(timer);
|
|
228
211
|
socket.off("open", onOpen);
|
|
229
212
|
socket.off("error", onFailure);
|
|
213
|
+
socket.off("close", onClose);
|
|
230
214
|
signal?.removeEventListener("abort", onAbort);
|
|
231
215
|
};
|
|
232
216
|
socket.once("open", onOpen);
|
|
233
217
|
socket.once("error", onFailure);
|
|
218
|
+
socket.once("close", onClose);
|
|
234
219
|
signal?.addEventListener("abort", onAbort, { once: true });
|
|
235
220
|
if (signal?.aborted === true)
|
|
236
221
|
onAbort();
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import canonicalize from "canonicalize";
|
|
3
1
|
import { BrowserObservationError } from "../domain/errors.js";
|
|
4
2
|
import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
|
|
3
|
+
import { canonicalJsonDigest } from "./CdpCanonicalJsonDigest.js";
|
|
5
4
|
import { delayWithCancellation, numberValue, recordValue, recordsValue, requiredRecord, stringValue, } from "./CdpCaptureValues.js";
|
|
6
5
|
import { ingestElectronScriptEvent, } from "./CdpElectronScriptEvents.js";
|
|
7
6
|
import { captureElectronScripts } from "./CdpElectronScripts.js";
|
|
8
7
|
import { captureElectronWorkers } from "./CdpElectronWorkers.js";
|
|
9
|
-
import { authorizedElectronFile
|
|
10
|
-
/** Passively inspect one
|
|
8
|
+
import { authorizedElectronFile } from "./ElectronFileScope.js";
|
|
9
|
+
/** Passively inspect one Electron file page from the selected CDP endpoint. */
|
|
11
10
|
export const inspectCdpElectronPage = async (context) => {
|
|
12
11
|
const state = {
|
|
13
|
-
roots: await canonicalElectronRoots(context.input.allowed_file_roots),
|
|
14
12
|
completeness: new CdpCaptureCompleteness(),
|
|
15
13
|
scripts: [],
|
|
16
14
|
executionContextFrames: new Map(),
|
|
17
15
|
limitations: [
|
|
18
|
-
"
|
|
16
|
+
"Local file paths exposed by the selected CDP target are retained in the observation.",
|
|
19
17
|
"REA does not evaluate renderer JavaScript, invoke Electron APIs, navigate, click, or close the page.",
|
|
20
|
-
"Script contents require separate source-capture approval
|
|
18
|
+
"Script contents require separate source-capture approval.",
|
|
21
19
|
],
|
|
22
20
|
mainFrameId: undefined,
|
|
23
21
|
navigationDuringCapture: false,
|
|
@@ -44,7 +42,9 @@ export const inspectCdpElectronPage = async (context) => {
|
|
|
44
42
|
};
|
|
45
43
|
const runElectronInspection = async (context, state, startedAt) => {
|
|
46
44
|
const frames = await authorizeInitialFrames(context, state);
|
|
47
|
-
const main = frames
|
|
45
|
+
const main = frames.at(0);
|
|
46
|
+
if (main === undefined)
|
|
47
|
+
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
48
48
|
state.mainFrameId = main.frame_id;
|
|
49
49
|
await enableElectronCapture(context);
|
|
50
50
|
await delayWithCancellation(context.input.observation_ms, "inspect_electron_page", context.signal);
|
|
@@ -52,12 +52,11 @@ const runElectronInspection = async (context, state, startedAt) => {
|
|
|
52
52
|
await assertStableMainFrame(context, state, main.file_path);
|
|
53
53
|
await report(context.progress, 3, "Electron inspection complete");
|
|
54
54
|
return {
|
|
55
|
-
schema_version: 1,
|
|
56
55
|
browser: context.discovery.version,
|
|
57
56
|
target: {
|
|
58
57
|
target_id: context.target.id,
|
|
59
58
|
type: context.target.type,
|
|
60
|
-
title: context.target.title
|
|
59
|
+
title: context.target.title,
|
|
61
60
|
file_path: main.file_path,
|
|
62
61
|
attached: context.target.attached,
|
|
63
62
|
},
|
|
@@ -76,26 +75,25 @@ const authorizeInitialFrames = async (context, state) => {
|
|
|
76
75
|
await report(context.progress, 1, "Authorizing Electron file frames");
|
|
77
76
|
await context.connection.send("Page.enable", {}, context.sessionId, context.signal);
|
|
78
77
|
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
79
|
-
const frames = await captureFrames(result, state.
|
|
78
|
+
const frames = await captureFrames(result, state.completeness);
|
|
80
79
|
if (frames[0] === undefined)
|
|
81
80
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
82
81
|
return frames;
|
|
83
82
|
};
|
|
84
83
|
const enableElectronCapture = async (context) => {
|
|
85
84
|
await context.connection.send("Runtime.enable", {}, context.sessionId, context.signal);
|
|
86
|
-
await context.connection.send("Debugger.enable", {
|
|
85
|
+
await context.connection.send("Debugger.enable", {}, context.sessionId, context.signal);
|
|
87
86
|
};
|
|
88
87
|
const captureElectronContent = async (context, state, frames) => {
|
|
89
88
|
await report(context.progress, 2, "Capturing Electron structure");
|
|
90
89
|
const frameIds = new Set(frames.map((frame) => frame.frame_id));
|
|
91
|
-
const resources = await captureResources(context, state.
|
|
92
|
-
const dom = await captureDom(context, state.
|
|
90
|
+
const resources = await captureResources(context, state.completeness);
|
|
91
|
+
const dom = await captureDom(context, state.completeness);
|
|
93
92
|
const scripts = await captureElectronScripts({
|
|
94
93
|
connection: context.connection,
|
|
95
94
|
sessionId: context.sessionId,
|
|
96
95
|
...(context.signal === undefined ? {} : { signal: context.signal }),
|
|
97
96
|
request: context.input,
|
|
98
|
-
roots: state.roots,
|
|
99
97
|
scripts: state.scripts,
|
|
100
98
|
executionContextFrames: state.executionContextFrames,
|
|
101
99
|
frameIds,
|
|
@@ -106,7 +104,6 @@ const captureElectronContent = async (context, state, frames) => {
|
|
|
106
104
|
...(context.signal === undefined ? {} : { signal: context.signal }),
|
|
107
105
|
target: context.target,
|
|
108
106
|
request: context.input,
|
|
109
|
-
roots: state.roots,
|
|
110
107
|
frameIds,
|
|
111
108
|
completeness: state.completeness,
|
|
112
109
|
limitations: state.limitations,
|
|
@@ -115,7 +112,7 @@ const captureElectronContent = async (context, state, frames) => {
|
|
|
115
112
|
};
|
|
116
113
|
const assertStableMainFrame = async (context, state, expectedPath) => {
|
|
117
114
|
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
118
|
-
const afterPath = await mainFilePath(result
|
|
115
|
+
const afterPath = await mainFilePath(result);
|
|
119
116
|
if (afterPath === undefined)
|
|
120
117
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
121
118
|
if (state.navigationDuringCapture || afterPath !== expectedPath)
|
|
@@ -131,7 +128,7 @@ const navigatedFrameId = (event) => {
|
|
|
131
128
|
return stringValue(params.frameId);
|
|
132
129
|
return undefined;
|
|
133
130
|
};
|
|
134
|
-
const captureFrames = async (result,
|
|
131
|
+
const captureFrames = async (result, completeness) => {
|
|
135
132
|
const frameTree = recordValue(requiredRecord(result).frameTree);
|
|
136
133
|
if (frameTree === undefined)
|
|
137
134
|
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
@@ -143,26 +140,22 @@ const captureFrames = async (result, roots, maximum, completeness) => {
|
|
|
143
140
|
break;
|
|
144
141
|
const frame = recordValue(current.tree.frame);
|
|
145
142
|
const frameId = stringValue(frame?.id);
|
|
146
|
-
const path = await authorizedElectronFile(stringValue(frame?.url) ?? ""
|
|
143
|
+
const path = await authorizedElectronFile(stringValue(frame?.url) ?? "");
|
|
147
144
|
if (frameId === undefined || path === undefined) {
|
|
148
145
|
completeness.exclude("frames", "out_of_target_scope");
|
|
149
146
|
continue;
|
|
150
147
|
}
|
|
151
|
-
if (frames.length >= maximum) {
|
|
152
|
-
completeness.truncate("frames");
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
148
|
frames.push({
|
|
156
|
-
frame_id: frameId
|
|
149
|
+
frame_id: frameId,
|
|
157
150
|
parent_frame_id: current.parent,
|
|
158
151
|
file_path: path,
|
|
159
152
|
});
|
|
160
153
|
for (const child of recordsValue(current.tree.childFrames))
|
|
161
|
-
pending.push({ tree: child, parent: frameId
|
|
154
|
+
pending.push({ tree: child, parent: frameId });
|
|
162
155
|
}
|
|
163
156
|
return frames;
|
|
164
157
|
};
|
|
165
|
-
const captureResources = async (context,
|
|
158
|
+
const captureResources = async (context, completeness) => {
|
|
166
159
|
const result = await context.connection.send("Page.getResourceTree", {}, context.sessionId, context.signal);
|
|
167
160
|
const root = recordValue(requiredRecord(result).frameTree);
|
|
168
161
|
if (root === undefined)
|
|
@@ -175,27 +168,23 @@ const captureResources = async (context, roots, completeness) => {
|
|
|
175
168
|
if (tree === undefined)
|
|
176
169
|
break;
|
|
177
170
|
for (const resource of recordsValue(tree.resources)) {
|
|
178
|
-
const path = await authorizedElectronFile(stringValue(resource.url) ?? ""
|
|
171
|
+
const path = await authorizedElectronFile(stringValue(resource.url) ?? "");
|
|
179
172
|
if (path === undefined) {
|
|
180
173
|
completeness.exclude("resources", "out_of_target_scope");
|
|
181
174
|
continue;
|
|
182
175
|
}
|
|
183
176
|
const item = {
|
|
184
177
|
file_path: path,
|
|
185
|
-
type:
|
|
186
|
-
mime_type:
|
|
178
|
+
type: stringValue(resource.type) ?? "Other",
|
|
179
|
+
mime_type: stringValue(resource.mimeType) ?? "",
|
|
187
180
|
content_size: numberValue(resource.contentSize) === undefined
|
|
188
181
|
? null
|
|
189
182
|
: Math.max(0, numberValue(resource.contentSize) ?? 0),
|
|
190
183
|
};
|
|
191
|
-
const resourceKey = `electron_resource_${
|
|
184
|
+
const resourceKey = `electron_resource_${canonicalJsonDigest(item)}`;
|
|
192
185
|
if (seen.has(resourceKey))
|
|
193
186
|
continue;
|
|
194
187
|
seen.add(resourceKey);
|
|
195
|
-
if (resources.length >= context.input.limits.max_resources) {
|
|
196
|
-
completeness.truncate("resources");
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
188
|
resources.push({
|
|
200
189
|
resource_key: resourceKey,
|
|
201
190
|
...item,
|
|
@@ -205,7 +194,7 @@ const captureResources = async (context, roots, completeness) => {
|
|
|
205
194
|
}
|
|
206
195
|
return resources.sort((left, right) => left.resource_key.localeCompare(right.resource_key));
|
|
207
196
|
};
|
|
208
|
-
const captureDom = async (context,
|
|
197
|
+
const captureDom = async (context, completeness) => {
|
|
209
198
|
const result = requiredRecord(await context.connection.send("DOMSnapshot.captureSnapshot", { computedStyles: [], includePaintOrder: false, includeDOMRects: false }, context.sessionId, context.signal));
|
|
210
199
|
const strings = Array.isArray(result.strings)
|
|
211
200
|
? result.strings.map((value) => (typeof value === "string" ? value : ""))
|
|
@@ -214,7 +203,7 @@ const captureDom = async (context, roots, completeness) => {
|
|
|
214
203
|
let total = 0;
|
|
215
204
|
for (const document of recordsValue(result.documents)) {
|
|
216
205
|
const documentUrl = stringAt(strings, document.documentURL);
|
|
217
|
-
if ((await authorizedElectronFile(documentUrl
|
|
206
|
+
if ((await authorizedElectronFile(documentUrl)) === undefined) {
|
|
218
207
|
completeness.exclude("dom", "out_of_target_scope");
|
|
219
208
|
continue;
|
|
220
209
|
}
|
|
@@ -227,31 +216,26 @@ const captureDom = async (context, roots, completeness) => {
|
|
|
227
216
|
const baseIndex = nodes.length;
|
|
228
217
|
total += nodeTypes.length;
|
|
229
218
|
for (let index = 0; index < nodeTypes.length; index += 1) {
|
|
230
|
-
if (nodes.length >= context.input.limits.max_dom_nodes)
|
|
231
|
-
continue;
|
|
232
219
|
const attributeIndexes = arrayValue(attributes[index]);
|
|
233
220
|
const parent = integer(parents[index], -1);
|
|
234
221
|
nodes.push({
|
|
235
222
|
index: nodes.length,
|
|
236
223
|
parent_index: parent < 0 ? -1 : baseIndex + parent,
|
|
237
224
|
node_type: integer(nodeTypes[index], 0),
|
|
238
|
-
node_name: stringAt(strings, nodeNames[index])
|
|
225
|
+
node_name: stringAt(strings, nodeNames[index]),
|
|
239
226
|
node_value_length: Buffer.byteLength(stringAt(strings, nodeValues[index])),
|
|
240
227
|
attribute_names: attributeIndexes
|
|
241
228
|
.filter((_value, attributeIndex) => attributeIndex % 2 === 0)
|
|
242
|
-
.map((value) => stringAt(strings, value)
|
|
243
|
-
.slice(0, 256),
|
|
229
|
+
.map((value) => stringAt(strings, value)),
|
|
244
230
|
});
|
|
245
231
|
}
|
|
246
232
|
}
|
|
247
|
-
if (total > nodes.length)
|
|
248
|
-
completeness.truncate("dom");
|
|
249
233
|
return { total_nodes: total, nodes };
|
|
250
234
|
};
|
|
251
|
-
const mainFilePath = async (result
|
|
235
|
+
const mainFilePath = async (result) => {
|
|
252
236
|
const frameTree = recordValue(requiredRecord(result).frameTree);
|
|
253
237
|
const frame = recordValue(frameTree?.frame);
|
|
254
|
-
return await authorizedElectronFile(stringValue(frame?.url) ?? ""
|
|
238
|
+
return await authorizedElectronFile(stringValue(frame?.url) ?? "");
|
|
255
239
|
};
|
|
256
240
|
const arrayValue = (value) => Array.isArray(value) ? value : [];
|
|
257
241
|
const stringAt = (strings, value) => strings[integer(value, -1)] ?? "";
|
|
@@ -259,12 +243,6 @@ const integer = (value, fallback) => {
|
|
|
259
243
|
const number = numberValue(value);
|
|
260
244
|
return number === undefined ? fallback : Math.trunc(number);
|
|
261
245
|
};
|
|
262
|
-
const digest = (value) => {
|
|
263
|
-
const encoded = canonicalize(value);
|
|
264
|
-
if (encoded === undefined)
|
|
265
|
-
throw new TypeError("Expected canonical JSON");
|
|
266
|
-
return createHash("sha256").update(encoded).digest("hex");
|
|
267
|
-
};
|
|
268
246
|
const report = async (progress, completed, message) => await progress?.report({
|
|
269
247
|
phase: "browser_observation",
|
|
270
248
|
completed,
|