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
|
@@ -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
|
-
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
|
|
2
|
-
import {
|
|
2
|
+
import { recordValue, recordsValue, stringValue } from "./CdpCaptureValues.js";
|
|
3
3
|
import { optionalCdpCommand } from "./CdpOptionalCommand.js";
|
|
4
4
|
import { authorizedElectronFile } from "./ElectronFileScope.js";
|
|
5
|
-
/** Inventory
|
|
5
|
+
/** Inventory local worker targets without attaching to them. */
|
|
6
6
|
export const captureElectronWorkers = async (input) => {
|
|
7
7
|
const result = await optionalCdpCommand({
|
|
8
8
|
connection: input.connection,
|
|
@@ -25,15 +25,11 @@ export const captureElectronWorkers = async (input) => {
|
|
|
25
25
|
input.completeness.exclude("workers", "out_of_target_scope");
|
|
26
26
|
continue;
|
|
27
27
|
}
|
|
28
|
-
const path = await authorizedElectronFile(stringValue(target.url) ?? ""
|
|
28
|
+
const path = await authorizedElectronFile(stringValue(target.url) ?? "");
|
|
29
29
|
if (path === undefined) {
|
|
30
30
|
input.completeness.exclude("workers", "out_of_target_scope");
|
|
31
31
|
continue;
|
|
32
32
|
}
|
|
33
|
-
if (workers.length >= input.request.limits.max_workers) {
|
|
34
|
-
input.completeness.truncate("workers");
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
33
|
const targetId = boundedTargetField(target.targetId);
|
|
38
34
|
if (targetId === null) {
|
|
39
35
|
input.completeness.exclude("workers", "invalid_protocol_value");
|
|
@@ -41,7 +37,7 @@ export const captureElectronWorkers = async (input) => {
|
|
|
41
37
|
}
|
|
42
38
|
workers.push({
|
|
43
39
|
target_id: targetId,
|
|
44
|
-
type
|
|
40
|
+
type,
|
|
45
41
|
file_path: path,
|
|
46
42
|
attached: target.attached === true,
|
|
47
43
|
opener_target_id: openerTargetId,
|
|
@@ -51,6 +47,6 @@ export const captureElectronWorkers = async (input) => {
|
|
|
51
47
|
return workers.sort((left, right) => left.target_id.localeCompare(right.target_id));
|
|
52
48
|
};
|
|
53
49
|
const boundedTargetField = (value) => {
|
|
54
|
-
const field =
|
|
55
|
-
return field ===
|
|
50
|
+
const field = stringValue(value);
|
|
51
|
+
return field === undefined || field === "" ? null : field;
|
|
56
52
|
};
|
|
@@ -1,31 +1,28 @@
|
|
|
1
1
|
import { request } from "node:http";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { AnalysisCancelledError, AnalysisError,
|
|
3
|
+
import { AnalysisCancelledError, AnalysisError, BrowserObservationError, } from "../domain/errors.js";
|
|
4
4
|
import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
|
|
5
|
-
const HTTP_TIMEOUT_MS = 5_000;
|
|
6
|
-
const MAX_VERSION_BYTES = 64 * 1_024;
|
|
7
|
-
const MAX_TARGET_LIST_BYTES = 2 * 1_024 * 1_024;
|
|
8
5
|
const endpointVersionSchema = z.object({
|
|
9
|
-
Browser: z.string().min(1)
|
|
10
|
-
"Protocol-Version": z.string().min(1)
|
|
11
|
-
"User-Agent": z.string()
|
|
12
|
-
"V8-Version": z.string()
|
|
13
|
-
"WebKit-Version": z.string()
|
|
14
|
-
webSocketDebuggerUrl: z.string().min(1)
|
|
6
|
+
Browser: z.string().min(1),
|
|
7
|
+
"Protocol-Version": z.string().min(1),
|
|
8
|
+
"User-Agent": z.string(),
|
|
9
|
+
"V8-Version": z.string(),
|
|
10
|
+
"WebKit-Version": z.string(),
|
|
11
|
+
webSocketDebuggerUrl: z.string().min(1),
|
|
15
12
|
});
|
|
16
13
|
const endpointTargetSchema = z.object({
|
|
17
|
-
id: z.string().min(1)
|
|
18
|
-
type: z.string().min(1)
|
|
19
|
-
title: z.string().
|
|
20
|
-
url: z.string()
|
|
14
|
+
id: z.string().min(1),
|
|
15
|
+
type: z.string().min(1),
|
|
16
|
+
title: z.string().default(""),
|
|
17
|
+
url: z.string(),
|
|
21
18
|
attached: z.boolean().default(false),
|
|
22
|
-
webSocketDebuggerUrl: z.string().min(1).
|
|
19
|
+
webSocketDebuggerUrl: z.string().min(1).optional(),
|
|
23
20
|
});
|
|
24
|
-
const endpointTargetsSchema = z.array(endpointTargetSchema)
|
|
25
|
-
/** Read
|
|
21
|
+
const endpointTargetsSchema = z.array(endpointTargetSchema);
|
|
22
|
+
/** Read CDP discovery endpoints without following redirects. */
|
|
26
23
|
export const discoverCdpEndpoint = async (endpoint, operation, signal) => {
|
|
27
|
-
const versionInput = await
|
|
28
|
-
const targetsInput = await
|
|
24
|
+
const versionInput = await readCdpJson(new URL("/json/version", endpoint), operation, signal);
|
|
25
|
+
const targetsInput = await readCdpJson(new URL("/json/list", endpoint), operation, signal);
|
|
29
26
|
const version = parseCdpEndpointValue(endpointVersionSchema, versionInput, operation);
|
|
30
27
|
const targets = parseCdpEndpointValue(endpointTargetsSchema, targetsInput, operation);
|
|
31
28
|
return {
|
|
@@ -56,7 +53,7 @@ const sanitizeTargetTitle = (value, targetUrl) => {
|
|
|
56
53
|
return sanitizeTargetUrlAlias(value, targetUrl);
|
|
57
54
|
}
|
|
58
55
|
return url.protocol === "http:" || url.protocol === "https:"
|
|
59
|
-
? sanitizeBrowserUrl(value).url
|
|
56
|
+
? sanitizeBrowserUrl(value).url
|
|
60
57
|
: sanitizeTargetUrlAlias(value, targetUrl);
|
|
61
58
|
};
|
|
62
59
|
const sanitizeTargetUrlAlias = (value, targetUrl) => {
|
|
@@ -71,9 +68,7 @@ const sanitizeTargetUrlAlias = (value, targetUrl) => {
|
|
|
71
68
|
if (parsed.pathname !== "/")
|
|
72
69
|
markers.push(parsed.pathname);
|
|
73
70
|
const candidatePattern = new RegExp(`(?:${markers.map(escapeRegExp).join("|")})[^\\s<>"']*`, "gu");
|
|
74
|
-
return value
|
|
75
|
-
.replace(candidatePattern, (candidate) => sanitizeSameOriginTitleUrl(candidate, parsed))
|
|
76
|
-
.slice(0, 16_384);
|
|
71
|
+
return value.replace(candidatePattern, (candidate) => sanitizeSameOriginTitleUrl(candidate, parsed));
|
|
77
72
|
};
|
|
78
73
|
const sanitizeSameOriginTitleUrl = (candidate, target) => {
|
|
79
74
|
let parsed;
|
|
@@ -145,19 +140,17 @@ const safeCdpWebSocketEndpoint = (endpoint, reported, operation) => {
|
|
|
145
140
|
: { scope: "page", targetId: path.targetId, url: parsed.href };
|
|
146
141
|
};
|
|
147
142
|
const cdpWebSocketPath = (pathname) => {
|
|
148
|
-
const browserId = pathIdentifier(pathname, "/devtools/browser/"
|
|
143
|
+
const browserId = pathIdentifier(pathname, "/devtools/browser/");
|
|
149
144
|
if (browserId !== undefined)
|
|
150
145
|
return { scope: "browser" };
|
|
151
|
-
const targetId = pathIdentifier(pathname, "/devtools/page/"
|
|
146
|
+
const targetId = pathIdentifier(pathname, "/devtools/page/");
|
|
152
147
|
return targetId === undefined ? undefined : { scope: "page", targetId };
|
|
153
148
|
};
|
|
154
|
-
const pathIdentifier = (pathname, prefix
|
|
149
|
+
const pathIdentifier = (pathname, prefix) => {
|
|
155
150
|
if (!pathname.startsWith(prefix))
|
|
156
151
|
return undefined;
|
|
157
152
|
const identifier = pathname.slice(prefix.length);
|
|
158
|
-
return identifier.length > 0 &&
|
|
159
|
-
identifier.length <= maximumLength &&
|
|
160
|
-
!identifier.includes("/")
|
|
153
|
+
return identifier.length > 0 && !identifier.includes("/")
|
|
161
154
|
? identifier
|
|
162
155
|
: undefined;
|
|
163
156
|
};
|
|
@@ -174,8 +167,8 @@ const targetWebSocket = (endpoint, target, operation) => {
|
|
|
174
167
|
return {};
|
|
175
168
|
}
|
|
176
169
|
};
|
|
177
|
-
/** Read one
|
|
178
|
-
export const
|
|
170
|
+
/** Read one loopback CDP discovery document without redirects. */
|
|
171
|
+
export const readCdpJson = async (url, operation, signal) => await new Promise((resolve, reject) => {
|
|
179
172
|
if (signal?.aborted === true) {
|
|
180
173
|
reject(new AnalysisCancelledError(operation));
|
|
181
174
|
return;
|
|
@@ -187,15 +180,7 @@ export const readBoundedCdpJson = async (url, maximumBytes, operation, signal) =
|
|
|
187
180
|
return;
|
|
188
181
|
}
|
|
189
182
|
const chunks = [];
|
|
190
|
-
|
|
191
|
-
response.on("data", (chunk) => {
|
|
192
|
-
bytes += chunk.length;
|
|
193
|
-
if (bytes > maximumBytes) {
|
|
194
|
-
response.destroy(new BrowserObservationError(operation, "payload_limit"));
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
chunks.push(chunk);
|
|
198
|
-
});
|
|
183
|
+
response.on("data", (chunk) => chunks.push(chunk));
|
|
199
184
|
response.on("end", () => {
|
|
200
185
|
try {
|
|
201
186
|
resolve(JSON.parse(Buffer.concat(chunks).toString("utf8")));
|
|
@@ -206,7 +191,6 @@ export const readBoundedCdpJson = async (url, maximumBytes, operation, signal) =
|
|
|
206
191
|
});
|
|
207
192
|
response.on("error", (cause) => reject(endpointFailure(cause, operation, signal)));
|
|
208
193
|
});
|
|
209
|
-
request_.setTimeout(HTTP_TIMEOUT_MS, () => request_.destroy(new AnalysisTimeoutError(operation, HTTP_TIMEOUT_MS)));
|
|
210
194
|
request_.on("error", (cause) => reject(endpointFailure(cause, operation, signal)));
|
|
211
195
|
request_.end();
|
|
212
196
|
});
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import { AnalysisCancelledError, BrowserObservationError, } from "../domain/errors.js";
|
|
2
2
|
import { CdpConnection } from "./CdpConnection.js";
|
|
3
3
|
import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
|
|
4
|
-
import {
|
|
4
|
+
import { authorizedMainFrame } from "./CdpAuthorizedMainFrame.js";
|
|
5
|
+
import { allowedSanitizedUrl, isHttpUrl, numberValue, recordValue, stringValue, } from "./CdpCaptureValues.js";
|
|
5
6
|
import { mainFrameUrl } from "./CdpCaptureDocuments.js";
|
|
6
7
|
/** Observe external user actions without rejecting approved same-origin navigation. */
|
|
7
8
|
export const observeCdpSession = async (context) => {
|
|
8
9
|
const allowedOrigins = new Set(context.input.allowed_origins);
|
|
9
|
-
const initial = await
|
|
10
|
+
const initial = await authorizedMainFrame({
|
|
11
|
+
connection: context.connection,
|
|
12
|
+
sessionId: context.sessionId,
|
|
13
|
+
signal: context.signal,
|
|
14
|
+
allowedOrigins,
|
|
15
|
+
delayOperation: "observe_web_session",
|
|
16
|
+
});
|
|
10
17
|
const initialUrl = mainFrameUrl(initial) ?? "";
|
|
11
18
|
const mainFrameId = frameId(initial);
|
|
12
19
|
if (mainFrameId === undefined)
|
|
13
20
|
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
14
|
-
const capture = new TimelineCapture(
|
|
21
|
+
const capture = new TimelineCapture(allowedOrigins, mainFrameId, initialUrl);
|
|
15
22
|
const removeListener = context.connection.onEvent((event) => {
|
|
16
23
|
if (observationEventMatches(event, context.sessionId))
|
|
17
24
|
capture.ingest(event);
|
|
@@ -19,7 +26,7 @@ export const observeCdpSession = async (context) => {
|
|
|
19
26
|
const removeDisconnectListener = context.connection.onDisconnect(() => capture.targetTerminated());
|
|
20
27
|
try {
|
|
21
28
|
await context.connection.send("Page.enable", {}, context.sessionId, context.signal);
|
|
22
|
-
await context.connection.send("Network.enable", {
|
|
29
|
+
await context.connection.send("Network.enable", {}, context.sessionId, context.signal);
|
|
23
30
|
await context.connection.send("Page.setLifecycleEventsEnabled", { enabled: true }, context.sessionId, context.signal);
|
|
24
31
|
const armedAt = new Date().toISOString();
|
|
25
32
|
await context.progress?.report({
|
|
@@ -39,7 +46,6 @@ export const observeCdpSession = async (context) => {
|
|
|
39
46
|
terminal: true,
|
|
40
47
|
});
|
|
41
48
|
return {
|
|
42
|
-
schema_version: 1,
|
|
43
49
|
browser: context.discovery.version,
|
|
44
50
|
target: {
|
|
45
51
|
target_id: context.target.id,
|
|
@@ -67,7 +73,6 @@ export const observeCdpSession = async (context) => {
|
|
|
67
73
|
}
|
|
68
74
|
};
|
|
69
75
|
class TimelineCapture {
|
|
70
|
-
maximum;
|
|
71
76
|
allowedOrigins;
|
|
72
77
|
mainFrameId;
|
|
73
78
|
timeline = [];
|
|
@@ -77,8 +82,7 @@ class TimelineCapture {
|
|
|
77
82
|
#pendingReload = false;
|
|
78
83
|
#endReason;
|
|
79
84
|
#listeners = new Set();
|
|
80
|
-
constructor(
|
|
81
|
-
this.maximum = maximum;
|
|
85
|
+
constructor(allowedOrigins, mainFrameId, initialUrl) {
|
|
82
86
|
this.allowedOrigins = allowedOrigins;
|
|
83
87
|
this.mainFrameId = mainFrameId;
|
|
84
88
|
this.finalUrl =
|
|
@@ -246,10 +250,6 @@ class TimelineCapture {
|
|
|
246
250
|
#add(options) {
|
|
247
251
|
const { type, params, rawUrl = null, requestId = null, detail = null, } = options;
|
|
248
252
|
const destination = rawUrl == null ? null : scopedUrl(rawUrl, this.allowedOrigins);
|
|
249
|
-
if (this.timeline.length >= this.maximum) {
|
|
250
|
-
this.completeness.drop("timeline_events");
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
253
|
this.#sequence += 1;
|
|
254
254
|
this.timeline.push({
|
|
255
255
|
sequence: this.#sequence,
|
|
@@ -257,7 +257,7 @@ class TimelineCapture {
|
|
|
257
257
|
timestamp: Math.max(0, numberValue(params.timestamp) ?? 0),
|
|
258
258
|
frame_id: boundedId(params.frameId),
|
|
259
259
|
loader_id: boundedId(params.loaderId),
|
|
260
|
-
request_id: requestId
|
|
260
|
+
request_id: requestId ?? null,
|
|
261
261
|
url: destination?.scope === "approved" ? destination.url : null,
|
|
262
262
|
destination_scope: destination?.scope ?? null,
|
|
263
263
|
detail,
|
|
@@ -296,18 +296,6 @@ const waitForWindow = async (durationMs, capture, signal) => await new Promise((
|
|
|
296
296
|
if (signal?.aborted === true)
|
|
297
297
|
onAbort();
|
|
298
298
|
});
|
|
299
|
-
const authorizedFrame = async (context, allowedOrigins) => {
|
|
300
|
-
for (let attempt = 0; attempt < 80; attempt += 1) {
|
|
301
|
-
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
302
|
-
const url = mainFrameUrl(result);
|
|
303
|
-
if (allowedSanitizedUrl(url, allowedOrigins) !== undefined)
|
|
304
|
-
return result;
|
|
305
|
-
if (isHttpUrl(url))
|
|
306
|
-
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
307
|
-
await delayWithCancellation(25, "observe_web_session", context.signal);
|
|
308
|
-
}
|
|
309
|
-
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
310
|
-
};
|
|
311
299
|
const captureFinalUrl = async (context, capture, allowedOrigins) => {
|
|
312
300
|
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
313
301
|
const url = mainFrameUrl(result);
|
|
@@ -329,7 +317,7 @@ const scopedUrl = (value, allowedOrigins) => {
|
|
|
329
317
|
? { url: null, scope: "outside_policy" }
|
|
330
318
|
: { url: null, scope: "unsupported" };
|
|
331
319
|
};
|
|
332
|
-
const boundedId = (value) => stringValue(value)
|
|
320
|
+
const boundedId = (value) => stringValue(value) ?? null;
|
|
333
321
|
const safeDetail = (value) => {
|
|
334
322
|
const detail = stringValue(value)?.toLowerCase();
|
|
335
323
|
return detail !== undefined && /^[a-z0-9_.:-]{1,100}$/u.test(detail)
|