rea-agents 3.1.0 → 3.2.1
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
|
@@ -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,
|
|
@@ -54,12 +52,11 @@ const runElectronInspection = async (context, state, startedAt) => {
|
|
|
54
52
|
await assertStableMainFrame(context, state, main.file_path);
|
|
55
53
|
await report(context.progress, 3, "Electron inspection complete");
|
|
56
54
|
return {
|
|
57
|
-
schema_version: 1,
|
|
58
55
|
browser: context.discovery.version,
|
|
59
56
|
target: {
|
|
60
57
|
target_id: context.target.id,
|
|
61
58
|
type: context.target.type,
|
|
62
|
-
title: context.target.title
|
|
59
|
+
title: context.target.title,
|
|
63
60
|
file_path: main.file_path,
|
|
64
61
|
attached: context.target.attached,
|
|
65
62
|
},
|
|
@@ -78,26 +75,25 @@ const authorizeInitialFrames = async (context, state) => {
|
|
|
78
75
|
await report(context.progress, 1, "Authorizing Electron file frames");
|
|
79
76
|
await context.connection.send("Page.enable", {}, context.sessionId, context.signal);
|
|
80
77
|
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
81
|
-
const frames = await captureFrames(result, state.
|
|
78
|
+
const frames = await captureFrames(result, state.completeness);
|
|
82
79
|
if (frames[0] === undefined)
|
|
83
80
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
84
81
|
return frames;
|
|
85
82
|
};
|
|
86
83
|
const enableElectronCapture = async (context) => {
|
|
87
84
|
await context.connection.send("Runtime.enable", {}, context.sessionId, context.signal);
|
|
88
|
-
await context.connection.send("Debugger.enable", {
|
|
85
|
+
await context.connection.send("Debugger.enable", {}, context.sessionId, context.signal);
|
|
89
86
|
};
|
|
90
87
|
const captureElectronContent = async (context, state, frames) => {
|
|
91
88
|
await report(context.progress, 2, "Capturing Electron structure");
|
|
92
89
|
const frameIds = new Set(frames.map((frame) => frame.frame_id));
|
|
93
|
-
const resources = await captureResources(context, state.
|
|
94
|
-
const dom = await captureDom(context, state.
|
|
90
|
+
const resources = await captureResources(context, state.completeness);
|
|
91
|
+
const dom = await captureDom(context, state.completeness);
|
|
95
92
|
const scripts = await captureElectronScripts({
|
|
96
93
|
connection: context.connection,
|
|
97
94
|
sessionId: context.sessionId,
|
|
98
95
|
...(context.signal === undefined ? {} : { signal: context.signal }),
|
|
99
96
|
request: context.input,
|
|
100
|
-
roots: state.roots,
|
|
101
97
|
scripts: state.scripts,
|
|
102
98
|
executionContextFrames: state.executionContextFrames,
|
|
103
99
|
frameIds,
|
|
@@ -108,7 +104,6 @@ const captureElectronContent = async (context, state, frames) => {
|
|
|
108
104
|
...(context.signal === undefined ? {} : { signal: context.signal }),
|
|
109
105
|
target: context.target,
|
|
110
106
|
request: context.input,
|
|
111
|
-
roots: state.roots,
|
|
112
107
|
frameIds,
|
|
113
108
|
completeness: state.completeness,
|
|
114
109
|
limitations: state.limitations,
|
|
@@ -117,7 +112,7 @@ const captureElectronContent = async (context, state, frames) => {
|
|
|
117
112
|
};
|
|
118
113
|
const assertStableMainFrame = async (context, state, expectedPath) => {
|
|
119
114
|
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
120
|
-
const afterPath = await mainFilePath(result
|
|
115
|
+
const afterPath = await mainFilePath(result);
|
|
121
116
|
if (afterPath === undefined)
|
|
122
117
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
123
118
|
if (state.navigationDuringCapture || afterPath !== expectedPath)
|
|
@@ -133,7 +128,7 @@ const navigatedFrameId = (event) => {
|
|
|
133
128
|
return stringValue(params.frameId);
|
|
134
129
|
return undefined;
|
|
135
130
|
};
|
|
136
|
-
const captureFrames = async (result,
|
|
131
|
+
const captureFrames = async (result, completeness) => {
|
|
137
132
|
const frameTree = recordValue(requiredRecord(result).frameTree);
|
|
138
133
|
if (frameTree === undefined)
|
|
139
134
|
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
@@ -145,26 +140,22 @@ const captureFrames = async (result, roots, maximum, completeness) => {
|
|
|
145
140
|
break;
|
|
146
141
|
const frame = recordValue(current.tree.frame);
|
|
147
142
|
const frameId = stringValue(frame?.id);
|
|
148
|
-
const path = await authorizedElectronFile(stringValue(frame?.url) ?? ""
|
|
143
|
+
const path = await authorizedElectronFile(stringValue(frame?.url) ?? "");
|
|
149
144
|
if (frameId === undefined || path === undefined) {
|
|
150
145
|
completeness.exclude("frames", "out_of_target_scope");
|
|
151
146
|
continue;
|
|
152
147
|
}
|
|
153
|
-
if (frames.length >= maximum) {
|
|
154
|
-
completeness.truncate("frames");
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
148
|
frames.push({
|
|
158
|
-
frame_id: frameId
|
|
149
|
+
frame_id: frameId,
|
|
159
150
|
parent_frame_id: current.parent,
|
|
160
151
|
file_path: path,
|
|
161
152
|
});
|
|
162
153
|
for (const child of recordsValue(current.tree.childFrames))
|
|
163
|
-
pending.push({ tree: child, parent: frameId
|
|
154
|
+
pending.push({ tree: child, parent: frameId });
|
|
164
155
|
}
|
|
165
156
|
return frames;
|
|
166
157
|
};
|
|
167
|
-
const captureResources = async (context,
|
|
158
|
+
const captureResources = async (context, completeness) => {
|
|
168
159
|
const result = await context.connection.send("Page.getResourceTree", {}, context.sessionId, context.signal);
|
|
169
160
|
const root = recordValue(requiredRecord(result).frameTree);
|
|
170
161
|
if (root === undefined)
|
|
@@ -177,27 +168,23 @@ const captureResources = async (context, roots, completeness) => {
|
|
|
177
168
|
if (tree === undefined)
|
|
178
169
|
break;
|
|
179
170
|
for (const resource of recordsValue(tree.resources)) {
|
|
180
|
-
const path = await authorizedElectronFile(stringValue(resource.url) ?? ""
|
|
171
|
+
const path = await authorizedElectronFile(stringValue(resource.url) ?? "");
|
|
181
172
|
if (path === undefined) {
|
|
182
173
|
completeness.exclude("resources", "out_of_target_scope");
|
|
183
174
|
continue;
|
|
184
175
|
}
|
|
185
176
|
const item = {
|
|
186
177
|
file_path: path,
|
|
187
|
-
type:
|
|
188
|
-
mime_type:
|
|
178
|
+
type: stringValue(resource.type) ?? "Other",
|
|
179
|
+
mime_type: stringValue(resource.mimeType) ?? "",
|
|
189
180
|
content_size: numberValue(resource.contentSize) === undefined
|
|
190
181
|
? null
|
|
191
182
|
: Math.max(0, numberValue(resource.contentSize) ?? 0),
|
|
192
183
|
};
|
|
193
|
-
const resourceKey = `electron_resource_${
|
|
184
|
+
const resourceKey = `electron_resource_${canonicalJsonDigest(item)}`;
|
|
194
185
|
if (seen.has(resourceKey))
|
|
195
186
|
continue;
|
|
196
187
|
seen.add(resourceKey);
|
|
197
|
-
if (resources.length >= context.input.limits.max_resources) {
|
|
198
|
-
completeness.truncate("resources");
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
188
|
resources.push({
|
|
202
189
|
resource_key: resourceKey,
|
|
203
190
|
...item,
|
|
@@ -207,7 +194,7 @@ const captureResources = async (context, roots, completeness) => {
|
|
|
207
194
|
}
|
|
208
195
|
return resources.sort((left, right) => left.resource_key.localeCompare(right.resource_key));
|
|
209
196
|
};
|
|
210
|
-
const captureDom = async (context,
|
|
197
|
+
const captureDom = async (context, completeness) => {
|
|
211
198
|
const result = requiredRecord(await context.connection.send("DOMSnapshot.captureSnapshot", { computedStyles: [], includePaintOrder: false, includeDOMRects: false }, context.sessionId, context.signal));
|
|
212
199
|
const strings = Array.isArray(result.strings)
|
|
213
200
|
? result.strings.map((value) => (typeof value === "string" ? value : ""))
|
|
@@ -216,7 +203,7 @@ const captureDom = async (context, roots, completeness) => {
|
|
|
216
203
|
let total = 0;
|
|
217
204
|
for (const document of recordsValue(result.documents)) {
|
|
218
205
|
const documentUrl = stringAt(strings, document.documentURL);
|
|
219
|
-
if ((await authorizedElectronFile(documentUrl
|
|
206
|
+
if ((await authorizedElectronFile(documentUrl)) === undefined) {
|
|
220
207
|
completeness.exclude("dom", "out_of_target_scope");
|
|
221
208
|
continue;
|
|
222
209
|
}
|
|
@@ -229,31 +216,26 @@ const captureDom = async (context, roots, completeness) => {
|
|
|
229
216
|
const baseIndex = nodes.length;
|
|
230
217
|
total += nodeTypes.length;
|
|
231
218
|
for (let index = 0; index < nodeTypes.length; index += 1) {
|
|
232
|
-
if (nodes.length >= context.input.limits.max_dom_nodes)
|
|
233
|
-
continue;
|
|
234
219
|
const attributeIndexes = arrayValue(attributes[index]);
|
|
235
220
|
const parent = integer(parents[index], -1);
|
|
236
221
|
nodes.push({
|
|
237
222
|
index: nodes.length,
|
|
238
223
|
parent_index: parent < 0 ? -1 : baseIndex + parent,
|
|
239
224
|
node_type: integer(nodeTypes[index], 0),
|
|
240
|
-
node_name: stringAt(strings, nodeNames[index])
|
|
225
|
+
node_name: stringAt(strings, nodeNames[index]),
|
|
241
226
|
node_value_length: Buffer.byteLength(stringAt(strings, nodeValues[index])),
|
|
242
227
|
attribute_names: attributeIndexes
|
|
243
228
|
.filter((_value, attributeIndex) => attributeIndex % 2 === 0)
|
|
244
|
-
.map((value) => stringAt(strings, value)
|
|
245
|
-
.slice(0, 256),
|
|
229
|
+
.map((value) => stringAt(strings, value)),
|
|
246
230
|
});
|
|
247
231
|
}
|
|
248
232
|
}
|
|
249
|
-
if (total > nodes.length)
|
|
250
|
-
completeness.truncate("dom");
|
|
251
233
|
return { total_nodes: total, nodes };
|
|
252
234
|
};
|
|
253
|
-
const mainFilePath = async (result
|
|
235
|
+
const mainFilePath = async (result) => {
|
|
254
236
|
const frameTree = recordValue(requiredRecord(result).frameTree);
|
|
255
237
|
const frame = recordValue(frameTree?.frame);
|
|
256
|
-
return await authorizedElectronFile(stringValue(frame?.url) ?? ""
|
|
238
|
+
return await authorizedElectronFile(stringValue(frame?.url) ?? "");
|
|
257
239
|
};
|
|
258
240
|
const arrayValue = (value) => Array.isArray(value) ? value : [];
|
|
259
241
|
const stringAt = (strings, value) => strings[integer(value, -1)] ?? "";
|
|
@@ -261,12 +243,6 @@ const integer = (value, fallback) => {
|
|
|
261
243
|
const number = numberValue(value);
|
|
262
244
|
return number === undefined ? fallback : Math.trunc(number);
|
|
263
245
|
};
|
|
264
|
-
const digest = (value) => {
|
|
265
|
-
const encoded = canonicalize(value);
|
|
266
|
-
if (encoded === undefined)
|
|
267
|
-
throw new TypeError("Expected canonical JSON");
|
|
268
|
-
return createHash("sha256").update(encoded).digest("hex");
|
|
269
|
-
};
|
|
270
246
|
const report = async (progress, completed, message) => await progress?.report({
|
|
271
247
|
phase: "browser_observation",
|
|
272
248
|
completed,
|
|
@@ -4,7 +4,7 @@ import { err, ok } from "../domain/result.js";
|
|
|
4
4
|
import { discoverCdpEndpoint, hasCdpTargetWebSocket, } from "./CdpEndpoint.js";
|
|
5
5
|
import { closeCdpTargetSession, openCdpTargetSession, } from "./CdpTargetSession.js";
|
|
6
6
|
import { inspectCdpElectronPage } from "./CdpElectronInspection.js";
|
|
7
|
-
import { authorizedElectronFile
|
|
7
|
+
import { authorizedElectronFile } from "./ElectronFileScope.js";
|
|
8
8
|
/** Public identity committed by passive Electron observations. */
|
|
9
9
|
export const CDP_ELECTRON_PROVIDER_IDENTITY = Object.freeze({
|
|
10
10
|
id: "rea-cdp-electron",
|
|
@@ -12,17 +12,15 @@ export const CDP_ELECTRON_PROVIDER_IDENTITY = Object.freeze({
|
|
|
12
12
|
version: "1",
|
|
13
13
|
});
|
|
14
14
|
const IDENTITY = CDP_ELECTRON_PROVIDER_IDENTITY;
|
|
15
|
-
/** Passive Electron provider
|
|
15
|
+
/** Passive Electron provider for local file pages exposed by loopback CDP. */
|
|
16
16
|
export class CdpElectronProvider {
|
|
17
17
|
identity() {
|
|
18
18
|
return IDENTITY;
|
|
19
19
|
}
|
|
20
20
|
async listTargets(input, options = {}) {
|
|
21
21
|
try {
|
|
22
|
-
const roots = await canonicalElectronRoots(input.allowed_file_roots);
|
|
23
22
|
const discovery = await discoverCdpEndpoint(input.cdp_endpoint, "list_electron_targets", options.signal);
|
|
24
23
|
const allowed = [];
|
|
25
|
-
let outsideRoot = 0;
|
|
26
24
|
let unsupportedUrl = 0;
|
|
27
25
|
let nonPage = 0;
|
|
28
26
|
let unconnectable = 0;
|
|
@@ -31,12 +29,9 @@ export class CdpElectronProvider {
|
|
|
31
29
|
nonPage += 1;
|
|
32
30
|
continue;
|
|
33
31
|
}
|
|
34
|
-
const path = await authorizedElectronFile(target.url
|
|
32
|
+
const path = await authorizedElectronFile(target.url);
|
|
35
33
|
if (path === undefined) {
|
|
36
|
-
|
|
37
|
-
outsideRoot += 1;
|
|
38
|
-
else
|
|
39
|
-
unsupportedUrl += 1;
|
|
34
|
+
unsupportedUrl += 1;
|
|
40
35
|
continue;
|
|
41
36
|
}
|
|
42
37
|
if (!hasCdpTargetWebSocket(discovery, target)) {
|
|
@@ -46,32 +41,21 @@ export class CdpElectronProvider {
|
|
|
46
41
|
allowed.push({
|
|
47
42
|
target_id: target.id,
|
|
48
43
|
type: target.type,
|
|
49
|
-
title: target.title
|
|
44
|
+
title: target.title,
|
|
50
45
|
file_path: path,
|
|
51
46
|
attached: target.attached,
|
|
52
47
|
});
|
|
53
48
|
}
|
|
54
49
|
allowed.sort((left, right) => left.target_id.localeCompare(right.target_id));
|
|
55
|
-
const items = allowed.slice(input.offset, input.offset + input.limit);
|
|
56
|
-
const next = input.offset + items.length;
|
|
57
50
|
return ok(electronTargetListSchema.parse({
|
|
58
|
-
schema_version: 1,
|
|
59
51
|
browser: discovery.version,
|
|
60
|
-
targets:
|
|
61
|
-
items,
|
|
62
|
-
offset: input.offset,
|
|
63
|
-
limit: input.limit,
|
|
64
|
-
total: allowed.length,
|
|
65
|
-
next_offset: next < allowed.length ? next : null,
|
|
66
|
-
has_more: next < allowed.length,
|
|
67
|
-
},
|
|
52
|
+
targets: allowed,
|
|
68
53
|
excluded: {
|
|
69
|
-
outside_root: outsideRoot,
|
|
70
54
|
unsupported_url: unsupportedUrl,
|
|
71
55
|
non_page: nonPage,
|
|
72
56
|
},
|
|
73
57
|
limitations: [
|
|
74
|
-
"
|
|
58
|
+
"Every local file page exposed by the selected loopback CDP endpoint is eligible for listing.",
|
|
75
59
|
...(unconnectable === 0
|
|
76
60
|
? []
|
|
77
61
|
: [
|
|
@@ -87,9 +71,8 @@ export class CdpElectronProvider {
|
|
|
87
71
|
async inspectPage(input, options = {}) {
|
|
88
72
|
let targetSession;
|
|
89
73
|
try {
|
|
90
|
-
const roots = await canonicalElectronRoots(input.allowed_file_roots);
|
|
91
74
|
const discovery = await discoverCdpEndpoint(input.cdp_endpoint, "inspect_electron_page", options.signal);
|
|
92
|
-
const target = await authorizeTarget(discovery.targets, input.target_id
|
|
75
|
+
const target = await authorizeTarget(discovery.targets, input.target_id);
|
|
93
76
|
targetSession = await openCdpTargetSession(discovery, target, "inspect_electron_page", options.signal);
|
|
94
77
|
return ok(electronPageInspectionSchema.parse(await inspectCdpElectronPage({
|
|
95
78
|
connection: targetSession.connection,
|
|
@@ -116,23 +99,15 @@ export class CdpElectronProvider {
|
|
|
116
99
|
}
|
|
117
100
|
}
|
|
118
101
|
}
|
|
119
|
-
const authorizeTarget = async (targets, targetId
|
|
102
|
+
const authorizeTarget = async (targets, targetId) => {
|
|
120
103
|
const target = targets.find(({ id }) => id === targetId);
|
|
121
104
|
if (target === undefined)
|
|
122
105
|
throw new BrowserObservationError("inspect_web_page", "target_not_found");
|
|
123
106
|
if (target.type !== "page" ||
|
|
124
|
-
(await authorizedElectronFile(target.url
|
|
107
|
+
(await authorizedElectronFile(target.url)) === undefined)
|
|
125
108
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
126
109
|
return target;
|
|
127
110
|
};
|
|
128
|
-
const isFileUrl = (value) => {
|
|
129
|
-
try {
|
|
130
|
-
return new URL(value).protocol === "file:";
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
111
|
const providerError = (cause, operation) => cause instanceof BrowserObservationError && cause.operation !== operation
|
|
137
112
|
? new BrowserObservationError(operation, cause.reason, { cause })
|
|
138
113
|
: cause instanceof AnalysisError
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
|
|
2
|
-
import {
|
|
3
|
-
/** Retain
|
|
2
|
+
import { numberValue, recordValue, stringValue } from "./CdpCaptureValues.js";
|
|
3
|
+
/** Retain script/frame metadata from passive Electron events. */
|
|
4
4
|
export const ingestElectronScriptEvent = (input) => {
|
|
5
5
|
if (input.event.method === "Runtime.executionContextsCleared") {
|
|
6
6
|
input.executionContextFrames.clear();
|
|
@@ -14,7 +14,7 @@ export const ingestElectronScriptEvent = (input) => {
|
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
16
|
if (input.event.method === "Runtime.executionContextCreated") {
|
|
17
|
-
retainExecutionContext(input.event, input.executionContextFrames
|
|
17
|
+
retainExecutionContext(input.event, input.executionContextFrames);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
20
|
if (input.event.method !== "Debugger.scriptParsed")
|
|
@@ -22,7 +22,7 @@ export const ingestElectronScriptEvent = (input) => {
|
|
|
22
22
|
const value = recordValue(input.event.params);
|
|
23
23
|
const scriptId = stringValue(value?.scriptId);
|
|
24
24
|
const rawUrl = stringValue(value?.url);
|
|
25
|
-
if (scriptId === undefined
|
|
25
|
+
if (scriptId === undefined) {
|
|
26
26
|
input.completeness.exclude("scripts", "invalid_protocol_value");
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
@@ -30,31 +30,23 @@ export const ingestElectronScriptEvent = (input) => {
|
|
|
30
30
|
input.completeness.exclude("scripts", "unattributed_origin");
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
if (input.scripts.length >= 2_000) {
|
|
34
|
-
input.completeness.drop("scripts");
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
33
|
input.scripts.push({
|
|
38
34
|
scriptId,
|
|
39
35
|
rawUrl,
|
|
40
|
-
hash:
|
|
36
|
+
hash: stringValue(value?.hash) ?? "",
|
|
41
37
|
length: nonnegativeInteger(value?.length),
|
|
42
38
|
isModule: value?.isModule === true,
|
|
43
|
-
language:
|
|
39
|
+
language: stringValue(value?.scriptLanguage) ?? null,
|
|
44
40
|
executionContextKey: executionContextKey(value?.executionContextId),
|
|
45
41
|
});
|
|
46
42
|
};
|
|
47
|
-
const retainExecutionContext = (event, frames
|
|
43
|
+
const retainExecutionContext = (event, frames) => {
|
|
48
44
|
const parameters = recordValue(event.params);
|
|
49
45
|
const runtimeContext = recordValue(parameters?.context);
|
|
50
46
|
const contextKey = executionContextKey(runtimeContext?.id);
|
|
51
47
|
const frameId = stringValue(recordValue(runtimeContext?.auxData)?.frameId);
|
|
52
|
-
if (contextKey === null || frameId === undefined
|
|
48
|
+
if (contextKey === null || frameId === undefined)
|
|
53
49
|
return;
|
|
54
|
-
if (frames.size >= 2_000 && !frames.has(contextKey)) {
|
|
55
|
-
completeness.truncate("scripts");
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
50
|
frames.set(contextKey, frameId);
|
|
59
51
|
};
|
|
60
52
|
const nonnegativeInteger = (value) => {
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import canonicalize from "canonicalize";
|
|
3
1
|
import { createWebTextArtifact } from "../domain/webContentArtifact.js";
|
|
4
2
|
import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
|
|
3
|
+
import { canonicalJsonDigest } from "./CdpCanonicalJsonDigest.js";
|
|
5
4
|
import { requiredRecord, stringValue } from "./CdpCaptureValues.js";
|
|
6
5
|
import { authorizedElectronFile } from "./ElectronFileScope.js";
|
|
7
|
-
/** Normalize
|
|
6
|
+
/** Normalize local script metadata and optionally approved source. */
|
|
8
7
|
export const captureElectronScripts = async (input) => {
|
|
9
8
|
let total = 0;
|
|
10
|
-
let sourceBytes = 0;
|
|
11
9
|
const items = [];
|
|
12
10
|
const seen = new Set();
|
|
13
11
|
for (const script of input.scripts) {
|
|
14
|
-
const path = await authorizedElectronFile(script.rawUrl
|
|
12
|
+
const path = await authorizedElectronFile(script.rawUrl);
|
|
15
13
|
if (path === undefined) {
|
|
16
14
|
input.completeness.exclude("scripts", "out_of_target_scope");
|
|
17
15
|
continue;
|
|
@@ -29,17 +27,12 @@ export const captureElectronScripts = async (input) => {
|
|
|
29
27
|
is_module: script.isModule,
|
|
30
28
|
language: script.language,
|
|
31
29
|
};
|
|
32
|
-
const scriptKey = `electron_script_${
|
|
30
|
+
const scriptKey = `electron_script_${canonicalJsonDigest(identity)}`;
|
|
33
31
|
if (seen.has(scriptKey))
|
|
34
32
|
continue;
|
|
35
33
|
seen.add(scriptKey);
|
|
36
34
|
total += 1;
|
|
37
|
-
|
|
38
|
-
input.completeness.drop("scripts");
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
const capturedSource = await captureScriptSource(input, script, sourceBytes);
|
|
42
|
-
sourceBytes += capturedSource.bytes;
|
|
35
|
+
const capturedSource = await captureScriptSource(input, script);
|
|
43
36
|
items.push({
|
|
44
37
|
script_key: scriptKey,
|
|
45
38
|
...identity,
|
|
@@ -53,42 +46,20 @@ export const captureElectronScripts = async (input) => {
|
|
|
53
46
|
items: items.sort((left, right) => left.script_key.localeCompare(right.script_key)),
|
|
54
47
|
};
|
|
55
48
|
};
|
|
56
|
-
const captureScriptSource = async (input, script
|
|
49
|
+
const captureScriptSource = async (input, script) => {
|
|
57
50
|
if (!input.request.include_script_sources)
|
|
58
51
|
return {
|
|
59
52
|
source: {
|
|
60
53
|
included: false,
|
|
61
54
|
reason: "source capture was not approved",
|
|
62
55
|
},
|
|
63
|
-
bytes: 0,
|
|
64
56
|
};
|
|
65
|
-
if (sourceLimitReached(input.request.limits, script.length, sourceBytes))
|
|
66
|
-
return sourceLimitResult(input.completeness);
|
|
67
57
|
const result = requiredRecord(await input.connection.send("Debugger.getScriptSource", { scriptId: script.scriptId }, input.sessionId, input.signal));
|
|
68
58
|
const text = stringValue(result.scriptSource) ?? "";
|
|
69
|
-
const bytes = Buffer.byteLength(text);
|
|
70
|
-
if (sourceLimitReached(input.request.limits, bytes, sourceBytes))
|
|
71
|
-
return sourceLimitResult(input.completeness);
|
|
72
59
|
return {
|
|
73
60
|
source: {
|
|
74
61
|
included: true,
|
|
75
62
|
artifact: createWebTextArtifact(text, "text/javascript"),
|
|
76
63
|
},
|
|
77
|
-
bytes,
|
|
78
|
-
};
|
|
79
|
-
};
|
|
80
|
-
const sourceLimitReached = (limits, bytes, previousBytes) => bytes > limits.max_script_source_bytes ||
|
|
81
|
-
previousBytes + bytes > limits.max_total_script_source_bytes;
|
|
82
|
-
const sourceLimitResult = (completeness) => {
|
|
83
|
-
completeness.truncate("script_sources");
|
|
84
|
-
return {
|
|
85
|
-
source: { included: false, reason: "script source byte limit reached" },
|
|
86
|
-
bytes: 0,
|
|
87
64
|
};
|
|
88
65
|
};
|
|
89
|
-
const digest = (value) => {
|
|
90
|
-
const encoded = canonicalize(value);
|
|
91
|
-
if (encoded === undefined)
|
|
92
|
-
throw new TypeError("Expected canonical JSON");
|
|
93
|
-
return createHash("sha256").update(encoded).digest("hex");
|
|
94
|
-
};
|