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
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { realpath } from "node:fs/promises";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { _electron as electron } from "playwright-core";
|
|
5
|
+
import { electronActiveObservationResultSchema, } from "../domain/electronActiveObservation.js";
|
|
6
|
+
import { AnalysisError, BrowserObservationError, ProviderAdapterError, } from "../domain/errors.js";
|
|
7
|
+
import { isPathContained } from "../domain/permissionPolicy.js";
|
|
8
|
+
import { err, ok } from "../domain/result.js";
|
|
9
|
+
import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, observeOwnedProcessLineage, selectCapturedProcessGroupIds, verifyNoTokenOwnedProcesses, } from "../process/ProcessOwnership.js";
|
|
10
|
+
import { runElectronActions, readApplicationState, runWithExecutionLimits, } from "./PlaywrightElectronActiveActions.js";
|
|
11
|
+
const OPERATION = "capture_electron_scenario";
|
|
12
|
+
const STARTUP_TIMEOUT_MS = 60_000;
|
|
13
|
+
/** Public identity for provider-owned Electron runtime experiments. */
|
|
14
|
+
export const PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY = Object.freeze({
|
|
15
|
+
id: "rea-playwright-electron-active",
|
|
16
|
+
name: "REA Playwright active Electron observation provider",
|
|
17
|
+
version: "1",
|
|
18
|
+
});
|
|
19
|
+
const hookPath = fileURLToPath(new URL("../../scripts/electron-active-hook.cjs", import.meta.url));
|
|
20
|
+
const observableEventFamilies = [
|
|
21
|
+
"app-lifecycle",
|
|
22
|
+
"window-lifecycle",
|
|
23
|
+
"web-contents-lifecycle",
|
|
24
|
+
"navigation",
|
|
25
|
+
"shell-attempt",
|
|
26
|
+
"process-lifecycle",
|
|
27
|
+
"permission",
|
|
28
|
+
"popup-attempt",
|
|
29
|
+
"download",
|
|
30
|
+
"protocol",
|
|
31
|
+
"preload",
|
|
32
|
+
"preload-configuration",
|
|
33
|
+
"renderer-ipc",
|
|
34
|
+
"native-addon",
|
|
35
|
+
"updater",
|
|
36
|
+
"error",
|
|
37
|
+
"ipc",
|
|
38
|
+
];
|
|
39
|
+
const ipcEventKinds = new Set([
|
|
40
|
+
"main-handler-invocation",
|
|
41
|
+
"main-event-invocation",
|
|
42
|
+
"utility-process-fork",
|
|
43
|
+
"utility-process-message",
|
|
44
|
+
"ipc-main-to-renderer",
|
|
45
|
+
"ipc-utility-to-main",
|
|
46
|
+
"ipc-renderer-send",
|
|
47
|
+
"ipc-renderer-invoke",
|
|
48
|
+
"ipc-renderer-post-message",
|
|
49
|
+
]);
|
|
50
|
+
const createCoverage = (hookSnapshot) => {
|
|
51
|
+
const observedEventFamilies = [
|
|
52
|
+
...new Set(hookSnapshot.events.map(({ kind, process_type }) => {
|
|
53
|
+
if (kind === "preload" && process_type === "main")
|
|
54
|
+
return "preload-configuration";
|
|
55
|
+
if (kind.startsWith("ipc-renderer") && process_type !== "renderer")
|
|
56
|
+
return "ipc";
|
|
57
|
+
return ipcEventKinds.has(kind) ? "ipc" : kind;
|
|
58
|
+
})),
|
|
59
|
+
].sort();
|
|
60
|
+
const unavailableEventFamilies = new Set(observableEventFamilies.filter((family) => !observedEventFamilies.includes(family)));
|
|
61
|
+
const observedRoles = [
|
|
62
|
+
...new Set(hookSnapshot.events.flatMap(({ process_type, kind }) => [
|
|
63
|
+
...(process_type === null ? [] : [process_type]),
|
|
64
|
+
...(kind === "window-lifecycle" ? ["window"] : []),
|
|
65
|
+
...(kind === "web-contents-lifecycle" || kind === "navigation"
|
|
66
|
+
? ["web_contents"]
|
|
67
|
+
: []),
|
|
68
|
+
...(kind === "preload" && process_type === "preload"
|
|
69
|
+
? ["preload"]
|
|
70
|
+
: []),
|
|
71
|
+
...(kind.startsWith("ipc-renderer") && process_type === "renderer"
|
|
72
|
+
? ["renderer"]
|
|
73
|
+
: []),
|
|
74
|
+
])),
|
|
75
|
+
].sort();
|
|
76
|
+
const rendererContextObserved = hookSnapshot.events.some(({ process_type }) => process_type === "renderer" || process_type === "preload");
|
|
77
|
+
if (!rendererContextObserved) {
|
|
78
|
+
unavailableEventFamilies.add("preload");
|
|
79
|
+
unavailableEventFamilies.add("renderer-ipc");
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
status: hookSnapshot.hook_error ? "hook_conflict" : "partial_attach",
|
|
83
|
+
observed_event_families: observedEventFamilies,
|
|
84
|
+
unavailable_event_families: [...unavailableEventFamilies].sort(),
|
|
85
|
+
observed_roles: observedRoles,
|
|
86
|
+
pre_capture_activity: "unavailable",
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
/** Launch an owned Electron application through the official Playwright API. */
|
|
90
|
+
export class PlaywrightElectronActiveProvider {
|
|
91
|
+
identity() {
|
|
92
|
+
return PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY;
|
|
93
|
+
}
|
|
94
|
+
async capture(input, options = {}) {
|
|
95
|
+
let application;
|
|
96
|
+
let ownership;
|
|
97
|
+
let lineage;
|
|
98
|
+
let outcome;
|
|
99
|
+
const runId = randomUUID();
|
|
100
|
+
try {
|
|
101
|
+
if (options.signal?.aborted === true)
|
|
102
|
+
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
103
|
+
const startupDeadline = Date.now() + STARTUP_TIMEOUT_MS;
|
|
104
|
+
const paths = await canonicalPaths(input);
|
|
105
|
+
application = await electron.launch({
|
|
106
|
+
executablePath: paths.executable,
|
|
107
|
+
cwd: paths.root,
|
|
108
|
+
env: safeElectronEnvironment(runId),
|
|
109
|
+
args: ["-r", hookPath, paths.application, ...input.args],
|
|
110
|
+
timeout: Math.max(1, startupDeadline - Date.now()),
|
|
111
|
+
});
|
|
112
|
+
const leaderPid = application.process().pid;
|
|
113
|
+
if (typeof leaderPid !== "number" ||
|
|
114
|
+
!Number.isSafeInteger(leaderPid) ||
|
|
115
|
+
leaderPid <= 0)
|
|
116
|
+
throw new BrowserObservationError(OPERATION, "process_ownership_unavailable");
|
|
117
|
+
ownership = {
|
|
118
|
+
runId,
|
|
119
|
+
leaderPid,
|
|
120
|
+
processGroupId: leaderPid,
|
|
121
|
+
expectedParentPid: process.pid,
|
|
122
|
+
expectedCommand: paths.executable,
|
|
123
|
+
sweepTokenOwnedProcesses: true,
|
|
124
|
+
};
|
|
125
|
+
const actions = await runElectronActions(application, input, options);
|
|
126
|
+
const state = await runWithExecutionLimits(readApplicationState(application), options.signal);
|
|
127
|
+
outcome = ok(createResult(paths, input, actions, state));
|
|
128
|
+
}
|
|
129
|
+
catch (cause) {
|
|
130
|
+
outcome = err(providerError(cause));
|
|
131
|
+
}
|
|
132
|
+
if (application !== undefined) {
|
|
133
|
+
if (ownership !== undefined)
|
|
134
|
+
lineage = await observeOwnedProcessLineage(ownership);
|
|
135
|
+
let closeError;
|
|
136
|
+
try {
|
|
137
|
+
await runWithExecutionLimits(application.close(), undefined, Date.now() + 5_000);
|
|
138
|
+
}
|
|
139
|
+
catch (cause) {
|
|
140
|
+
closeError = cause;
|
|
141
|
+
}
|
|
142
|
+
const cleanup = ownership === undefined
|
|
143
|
+
? {
|
|
144
|
+
cleaned: false,
|
|
145
|
+
reason: "owned Electron process identity was unavailable",
|
|
146
|
+
}
|
|
147
|
+
: await cleanupElectronProcesses(ownership, lineage);
|
|
148
|
+
if (!cleanup.cleaned)
|
|
149
|
+
return err(providerError(new BrowserObservationError(OPERATION, "cleanup_failed", {
|
|
150
|
+
cause: new Error(cleanup.reason),
|
|
151
|
+
})));
|
|
152
|
+
if (closeError !== undefined)
|
|
153
|
+
return err(providerError(closeError));
|
|
154
|
+
}
|
|
155
|
+
return outcome;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const cleanupElectronProcesses = async (ownership, lineage) => {
|
|
159
|
+
if (process.platform === "win32") {
|
|
160
|
+
const root = await cleanupWindowsProcessTree(ownership.leaderPid);
|
|
161
|
+
if (!root.cleaned)
|
|
162
|
+
return root;
|
|
163
|
+
if (lineage?.status !== "verified")
|
|
164
|
+
return {
|
|
165
|
+
cleaned: false,
|
|
166
|
+
reason: "owned Electron lineage was unavailable; helper cleanup was not proven",
|
|
167
|
+
};
|
|
168
|
+
for (const descendant of lineage.lineage.descendants) {
|
|
169
|
+
const result = await cleanupWindowsProcessTree(descendant.pid);
|
|
170
|
+
if (!result.cleaned)
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
return root;
|
|
174
|
+
}
|
|
175
|
+
if (lineage?.status !== "verified") {
|
|
176
|
+
const root = await cleanupOwnedProcessGroup(ownership);
|
|
177
|
+
return root.cleaned
|
|
178
|
+
? {
|
|
179
|
+
cleaned: false,
|
|
180
|
+
reason: "owned Electron lineage was unavailable; helper cleanup was not proven",
|
|
181
|
+
}
|
|
182
|
+
: root;
|
|
183
|
+
}
|
|
184
|
+
const groupIds = selectCapturedProcessGroupIds(ownership.leaderPid, lineage.lineage.descendants.map(({ pid, processGroupId }) => ({
|
|
185
|
+
pid,
|
|
186
|
+
process_group_id: processGroupId,
|
|
187
|
+
})));
|
|
188
|
+
let signaled = false;
|
|
189
|
+
for (const processGroupId of groupIds) {
|
|
190
|
+
const cleanupOwnership = processGroupId === ownership.processGroupId
|
|
191
|
+
? { ...ownership, leaderPid: processGroupId, processGroupId }
|
|
192
|
+
: {
|
|
193
|
+
runId: ownership.runId,
|
|
194
|
+
leaderPid: processGroupId,
|
|
195
|
+
processGroupId,
|
|
196
|
+
};
|
|
197
|
+
const result = await cleanupOwnedProcessGroup(cleanupOwnership);
|
|
198
|
+
if (!result.cleaned)
|
|
199
|
+
return result;
|
|
200
|
+
signaled ||= result.signaled;
|
|
201
|
+
}
|
|
202
|
+
const remaining = await verifyNoTokenOwnedProcesses(ownership.runId);
|
|
203
|
+
if (!remaining.cleaned)
|
|
204
|
+
return remaining;
|
|
205
|
+
return { cleaned: true, signaled };
|
|
206
|
+
};
|
|
207
|
+
const createResult = (paths, input, actions, state) => {
|
|
208
|
+
const { hookSnapshot } = state;
|
|
209
|
+
const ipcEvents = hookSnapshot.events.filter(({ kind }) => ipcEventKinds.has(kind));
|
|
210
|
+
return electronActiveObservationResultSchema.parse({
|
|
211
|
+
application: {
|
|
212
|
+
executable_path: paths.executable,
|
|
213
|
+
application_path: paths.application,
|
|
214
|
+
electron_version: state.electronVersion,
|
|
215
|
+
process_ownership: "provider-owned",
|
|
216
|
+
cleanup: "terminated-owned-process",
|
|
217
|
+
},
|
|
218
|
+
actions,
|
|
219
|
+
windows: state.windows,
|
|
220
|
+
processes: {
|
|
221
|
+
items: state.metrics,
|
|
222
|
+
},
|
|
223
|
+
ipc: {
|
|
224
|
+
events: ipcEvents,
|
|
225
|
+
observed: hookSnapshot.observed_ipc,
|
|
226
|
+
},
|
|
227
|
+
timeline: {
|
|
228
|
+
events: hookSnapshot.events,
|
|
229
|
+
observed: hookSnapshot.observed,
|
|
230
|
+
},
|
|
231
|
+
coverage: createCoverage(hookSnapshot),
|
|
232
|
+
limitations: [
|
|
233
|
+
"IPC payloads are represented by value shapes; payload values are never retained.",
|
|
234
|
+
"IPC direction and sender/receiver identifiers are observed only where Electron exposes them at the hooked boundary.",
|
|
235
|
+
"The runtime timeline records lifecycle, navigation, shell, permission, popup, download, protocol, preload, native-addon, process, and IPC events; activity before hook installation is unavailable.",
|
|
236
|
+
"The preload and renderer process contexts are not instrumented by the main-process -r hook; preload configuration and contextBridge API-shape events are main-boundary observations, not proof of renderer-side execution.",
|
|
237
|
+
"Process metrics are an Electron API snapshot and do not prove hostile-local-user isolation.",
|
|
238
|
+
"External shell opens, external navigation, permission grants, downloads, popup windows, updater relaunches, and OS integration are blocked and recorded by the active hook; other application filesystem and network behavior is not sandboxed by this provider.",
|
|
239
|
+
...(hookSnapshot.hook_error
|
|
240
|
+
? ["The active IPC hook could not be installed."]
|
|
241
|
+
: []),
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
};
|
|
245
|
+
const canonicalPaths = async (input) => {
|
|
246
|
+
const [executable, application, root] = await Promise.all([
|
|
247
|
+
realpath(input.executable_path),
|
|
248
|
+
realpath(input.application_path),
|
|
249
|
+
realpath(input.application_root),
|
|
250
|
+
]);
|
|
251
|
+
if (!isPathContained(root, application))
|
|
252
|
+
throw new BrowserObservationError(OPERATION, "target_not_allowed");
|
|
253
|
+
return { executable, application, root };
|
|
254
|
+
};
|
|
255
|
+
const safeElectronEnvironment = (runId) => Object.fromEntries([
|
|
256
|
+
...[
|
|
257
|
+
"HOME",
|
|
258
|
+
"LANG",
|
|
259
|
+
"PATH",
|
|
260
|
+
"TMP",
|
|
261
|
+
"TMPDIR",
|
|
262
|
+
"USER",
|
|
263
|
+
"DISPLAY",
|
|
264
|
+
"WAYLAND_DISPLAY",
|
|
265
|
+
]
|
|
266
|
+
.map((name) => [name, process.env[name]])
|
|
267
|
+
.filter((entry) => entry[1] !== undefined),
|
|
268
|
+
["REA_PROCESS_RUN_ID", runId],
|
|
269
|
+
]);
|
|
270
|
+
const providerError = (cause) => cause instanceof AnalysisError
|
|
271
|
+
? cause
|
|
272
|
+
: new ProviderAdapterError(PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY.id, OPERATION, {
|
|
273
|
+
cause,
|
|
274
|
+
});
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import { AnalysisCancelledError, AnalysisTimeoutError, } from "../domain/errors.js";
|
|
2
2
|
const OPERATION = "capture_browser_scenario";
|
|
3
|
-
export const withPlaywrightExecutionBoundary = (work,
|
|
4
|
-
if (
|
|
5
|
-
return Promise.reject(new AnalysisTimeoutError(OPERATION,
|
|
3
|
+
export const withPlaywrightExecutionBoundary = (work, timeoutMs, signal) => {
|
|
4
|
+
if (timeoutMs !== undefined && timeoutMs <= 0)
|
|
5
|
+
return Promise.reject(new AnalysisTimeoutError(OPERATION, timeoutMs));
|
|
6
6
|
if (signal?.aborted === true)
|
|
7
7
|
return Promise.reject(new AnalysisCancelledError(OPERATION));
|
|
8
8
|
return new Promise((resolve, reject) => {
|
|
9
9
|
let settled = false;
|
|
10
10
|
let timer;
|
|
11
|
+
const deadline = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
|
|
12
|
+
const scheduleTimeout = () => {
|
|
13
|
+
if (deadline === undefined)
|
|
14
|
+
return;
|
|
15
|
+
const remaining = deadline - Date.now();
|
|
16
|
+
if (remaining <= 0) {
|
|
17
|
+
fail(new AnalysisTimeoutError(OPERATION, timeoutMs ?? 0));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
timer = setTimeout(scheduleTimeout, Math.min(remaining, 2_147_483_647));
|
|
21
|
+
timer.unref();
|
|
22
|
+
};
|
|
11
23
|
const cleanup = () => {
|
|
12
24
|
if (timer !== undefined)
|
|
13
25
|
clearTimeout(timer);
|
|
@@ -30,8 +42,7 @@ export const withPlaywrightExecutionBoundary = (work, maximumTimeoutMs, signal)
|
|
|
30
42
|
const onAbort = () => {
|
|
31
43
|
fail(new AnalysisCancelledError(OPERATION));
|
|
32
44
|
};
|
|
33
|
-
|
|
34
|
-
timer.unref();
|
|
45
|
+
scheduleTimeout();
|
|
35
46
|
signal?.addEventListener("abort", onAbort, { once: true });
|
|
36
47
|
if (signal?.aborted === true) {
|
|
37
48
|
onAbort();
|
|
@@ -14,15 +14,13 @@ const resolveLocator = (page, locator) => {
|
|
|
14
14
|
const resolveValue = (value, secrets) => secrets.value(value);
|
|
15
15
|
/** Execute one admitted declarative action with no caller-supplied code. */
|
|
16
16
|
export const performPlaywrightScenarioAction = async (input) => {
|
|
17
|
-
const { page, action, secrets
|
|
17
|
+
const { page, action, secrets } = input;
|
|
18
18
|
const timeout = "timeout_ms" in action ? action.timeout_ms : undefined;
|
|
19
|
-
const options = {
|
|
20
|
-
timeout: Math.min(timeout ?? defaultTimeoutMs, maximumTimeoutMs),
|
|
21
|
-
};
|
|
19
|
+
const options = timeout === undefined ? {} : { timeout };
|
|
22
20
|
switch (action.action) {
|
|
23
21
|
case "goto":
|
|
24
22
|
await page.goto(secrets.url(action.destination), {
|
|
25
|
-
|
|
23
|
+
...options,
|
|
26
24
|
waitUntil: action.wait_until,
|
|
27
25
|
});
|
|
28
26
|
return;
|
|
@@ -55,8 +53,6 @@ export const performPlaywrightScenarioAction = async (input) => {
|
|
|
55
53
|
});
|
|
56
54
|
return;
|
|
57
55
|
case "wait_for_timeout":
|
|
58
|
-
if (action.duration_ms > maximumTimeoutMs)
|
|
59
|
-
throw new Error("Scenario duration limit reached");
|
|
60
56
|
await page.waitForTimeout(action.duration_ms);
|
|
61
57
|
}
|
|
62
58
|
};
|
|
@@ -2,57 +2,21 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
|
|
4
4
|
import { browserStepArtifactsSchema, } from "../domain/browserScenarioCapture.js";
|
|
5
|
-
const TEXT_ARTIFACT_MAX_BYTES = 1_048_576;
|
|
6
5
|
const historyValueSchema = z.strictObject({
|
|
7
6
|
length: z.number().int().min(0),
|
|
8
|
-
navigation_entries: z
|
|
9
|
-
.array(z.strictObject({
|
|
7
|
+
navigation_entries: z.array(z.strictObject({
|
|
10
8
|
type: z.string(),
|
|
11
9
|
name: z.string(),
|
|
12
|
-
}))
|
|
13
|
-
.max(10_000),
|
|
10
|
+
})),
|
|
14
11
|
});
|
|
15
12
|
const storageValueSchema = z.strictObject({
|
|
16
|
-
local_storage: z.array(z.tuple([z.string(), z.string()]))
|
|
17
|
-
session_storage: z.array(z.tuple([z.string(), z.string()]))
|
|
13
|
+
local_storage: z.array(z.tuple([z.string(), z.string()])),
|
|
14
|
+
session_storage: z.array(z.tuple([z.string(), z.string()])),
|
|
18
15
|
});
|
|
19
|
-
/** Shared retained-count budget for one scenario's screenshot artifacts. */
|
|
20
|
-
export class BrowserScenarioCaptureBudget {
|
|
21
|
-
maximumScreenshots;
|
|
22
|
-
maximumMetadataBytes;
|
|
23
|
-
screenshotCount = 0;
|
|
24
|
-
metadataBytes = 0;
|
|
25
|
-
constructor(maximumScreenshots, maximumMetadataBytes) {
|
|
26
|
-
this.maximumScreenshots = maximumScreenshots;
|
|
27
|
-
this.maximumMetadataBytes = maximumMetadataBytes;
|
|
28
|
-
}
|
|
29
|
-
claimScreenshot() {
|
|
30
|
-
if (this.screenshotCount >= this.maximumScreenshots)
|
|
31
|
-
return false;
|
|
32
|
-
this.screenshotCount += 1;
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
claimMetadata(bytes) {
|
|
36
|
-
if (this.metadataBytes + bytes > this.maximumMetadataBytes)
|
|
37
|
-
return false;
|
|
38
|
-
this.metadataBytes += bytes;
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
16
|
const notRequested = () => ({ state: "not_requested" });
|
|
43
17
|
const missing = (reason) => ({ state: "missing", reason });
|
|
44
|
-
const
|
|
45
|
-
state: "truncated",
|
|
46
|
-
observed,
|
|
47
|
-
retained,
|
|
48
|
-
reason,
|
|
49
|
-
});
|
|
50
|
-
const textArtifact = (text, maximumBytes, budget) => {
|
|
18
|
+
const textArtifact = (text) => {
|
|
51
19
|
const bytes = Buffer.from(text);
|
|
52
|
-
if (bytes.byteLength > maximumBytes)
|
|
53
|
-
return truncated(bytes.byteLength, 0, `artifact exceeds ${maximumBytes} bytes`);
|
|
54
|
-
if (!budget.claimMetadata(bytes.byteLength))
|
|
55
|
-
return truncated(bytes.byteLength, 0, "scenario metadata byte limit reached");
|
|
56
20
|
return {
|
|
57
21
|
state: "captured",
|
|
58
22
|
value: {
|
|
@@ -62,15 +26,7 @@ const textArtifact = (text, maximumBytes, budget) => {
|
|
|
62
26
|
},
|
|
63
27
|
};
|
|
64
28
|
};
|
|
65
|
-
const
|
|
66
|
-
const bytes = Buffer.byteLength(JSON.stringify(value));
|
|
67
|
-
return budget.claimMetadata(bytes)
|
|
68
|
-
? { state: "captured", value }
|
|
69
|
-
: truncated(bytes, 0, "scenario metadata byte limit reached");
|
|
70
|
-
};
|
|
71
|
-
const captureScreenshot = async (page, scenario, budget) => {
|
|
72
|
-
if (!budget.claimScreenshot())
|
|
73
|
-
return truncated(1, 0, "scenario screenshot count limit reached");
|
|
29
|
+
const captureScreenshot = async (page) => {
|
|
74
30
|
try {
|
|
75
31
|
const bytes = await page.screenshot({
|
|
76
32
|
type: "png",
|
|
@@ -78,13 +34,10 @@ const captureScreenshot = async (page, scenario, budget) => {
|
|
|
78
34
|
animations: "disabled",
|
|
79
35
|
caret: "hide",
|
|
80
36
|
});
|
|
81
|
-
if (bytes.byteLength > scenario.limits.max_screenshot_bytes)
|
|
82
|
-
return truncated(bytes.byteLength, 0, "screenshot byte limit reached");
|
|
83
37
|
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
84
38
|
return {
|
|
85
39
|
state: "captured",
|
|
86
40
|
value: {
|
|
87
|
-
uri: `rea://web-screenshot/sha256/${sha256}`,
|
|
88
41
|
sha256,
|
|
89
42
|
bytes: bytes.byteLength,
|
|
90
43
|
media_type: "image/png",
|
|
@@ -97,25 +50,19 @@ const captureScreenshot = async (page, scenario, budget) => {
|
|
|
97
50
|
}
|
|
98
51
|
};
|
|
99
52
|
const captureDom = async (input) => {
|
|
100
|
-
const { page, secrets
|
|
53
|
+
const { page, secrets } = input;
|
|
101
54
|
try {
|
|
102
|
-
|
|
103
|
-
if (nodes > maximumNodes)
|
|
104
|
-
return truncated(nodes, 0, "DOM node limit reached");
|
|
105
|
-
return textArtifact(secrets.redact(await page.content()), Math.min(maximumBytes, TEXT_ARTIFACT_MAX_BYTES), budget);
|
|
55
|
+
return textArtifact(secrets.redact(await page.content()));
|
|
106
56
|
}
|
|
107
57
|
catch {
|
|
108
58
|
return missing("DOM capture failed");
|
|
109
59
|
}
|
|
110
60
|
};
|
|
111
61
|
const captureAccessibility = async (input) => {
|
|
112
|
-
const { page, secrets
|
|
62
|
+
const { page, secrets } = input;
|
|
113
63
|
try {
|
|
114
64
|
const text = await page.locator("html").ariaSnapshot();
|
|
115
|
-
|
|
116
|
-
if (nodes > maximumNodes)
|
|
117
|
-
return truncated(nodes, 0, "accessibility node limit reached");
|
|
118
|
-
return textArtifact(secrets.redact(text), Math.min(maximumBytes, TEXT_ARTIFACT_MAX_BYTES), budget);
|
|
65
|
+
return textArtifact(secrets.redact(text));
|
|
119
66
|
}
|
|
120
67
|
catch {
|
|
121
68
|
return missing("accessibility capture failed");
|
|
@@ -132,7 +79,7 @@ const navigationType = (value) => {
|
|
|
132
79
|
return "unknown";
|
|
133
80
|
}
|
|
134
81
|
};
|
|
135
|
-
const captureHistory = async (page
|
|
82
|
+
const captureHistory = async (page) => {
|
|
136
83
|
try {
|
|
137
84
|
const raw = historyValueSchema.parse(await page.evaluate(`(() => ({
|
|
138
85
|
length: window.history.length,
|
|
@@ -143,8 +90,6 @@ const captureHistory = async (page, budget) => {
|
|
|
143
90
|
})
|
|
144
91
|
)
|
|
145
92
|
}))()`));
|
|
146
|
-
if (raw.navigation_entries.length > 256)
|
|
147
|
-
return truncated(raw.navigation_entries.length, 0, "navigation history entry limit reached");
|
|
148
93
|
const value = {
|
|
149
94
|
length: raw.length,
|
|
150
95
|
current_url: sanitizeBrowserUrl(page.url()),
|
|
@@ -153,25 +98,20 @@ const captureHistory = async (page, budget) => {
|
|
|
153
98
|
name: sanitizeBrowserUrl(name),
|
|
154
99
|
})),
|
|
155
100
|
};
|
|
156
|
-
return
|
|
101
|
+
return { state: "captured", value };
|
|
157
102
|
}
|
|
158
103
|
catch {
|
|
159
104
|
return missing("history capture failed");
|
|
160
105
|
}
|
|
161
106
|
};
|
|
162
107
|
const captureStorage = async (input) => {
|
|
163
|
-
const { context, page, scenario, secrets
|
|
108
|
+
const { context, page, scenario, secrets } = input;
|
|
164
109
|
try {
|
|
165
110
|
const cookies = await context.cookies(scenario.allowed_origins);
|
|
166
111
|
const pageStorage = storageValueSchema.parse(await page.evaluate(`(() => ({
|
|
167
112
|
local_storage: Object.entries(window.localStorage),
|
|
168
113
|
session_storage: Object.entries(window.sessionStorage)
|
|
169
114
|
}))()`));
|
|
170
|
-
const observed = cookies.length +
|
|
171
|
-
pageStorage.local_storage.length +
|
|
172
|
-
pageStorage.session_storage.length;
|
|
173
|
-
if (observed > scenario.limits.max_storage_entries)
|
|
174
|
-
return truncated(observed, 0, "storage entry limit reached");
|
|
175
115
|
const value = {
|
|
176
116
|
cookies: cookies.map((cookie) => ({
|
|
177
117
|
name: cookie.name,
|
|
@@ -191,7 +131,7 @@ const captureStorage = async (input) => {
|
|
|
191
131
|
...secrets.fingerprint(value),
|
|
192
132
|
})),
|
|
193
133
|
};
|
|
194
|
-
return
|
|
134
|
+
return { state: "captured", value };
|
|
195
135
|
}
|
|
196
136
|
catch {
|
|
197
137
|
return missing("storage capture failed");
|
|
@@ -207,7 +147,7 @@ const isAllowedPage = (page, allowedOrigins) => {
|
|
|
207
147
|
};
|
|
208
148
|
/** Capture selected step artifacts without retaining data after scope loss. */
|
|
209
149
|
export const capturePlaywrightStepArtifacts = async (input) => {
|
|
210
|
-
const { context, page, scenario, secrets, requested
|
|
150
|
+
const { context, page, scenario, secrets, requested } = input;
|
|
211
151
|
const allowed = isAllowedPage(page, new Set(scenario.allowed_origins));
|
|
212
152
|
const denied = () => missing("current page is outside approved origins");
|
|
213
153
|
const state = (kind, capture) => !requested.has(kind)
|
|
@@ -216,23 +156,14 @@ export const capturePlaywrightStepArtifacts = async (input) => {
|
|
|
216
156
|
? capture()
|
|
217
157
|
: Promise.resolve(denied());
|
|
218
158
|
return browserStepArtifactsSchema.parse({
|
|
219
|
-
screenshot: await state("screenshot", () => captureScreenshot(page
|
|
220
|
-
dom: await state("dom", () => captureDom({
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
budget,
|
|
226
|
-
})),
|
|
227
|
-
accessibility: await state("accessibility", () => captureAccessibility({
|
|
228
|
-
page,
|
|
229
|
-
secrets,
|
|
230
|
-
maximumBytes: scenario.limits.max_total_metadata_bytes,
|
|
231
|
-
maximumNodes: scenario.limits.max_accessibility_nodes,
|
|
232
|
-
budget,
|
|
159
|
+
screenshot: await state("screenshot", () => captureScreenshot(page)),
|
|
160
|
+
dom: await state("dom", () => captureDom({ page, secrets })),
|
|
161
|
+
accessibility: await state("accessibility", () => captureAccessibility({ page, secrets })),
|
|
162
|
+
url: await state("url", async () => ({
|
|
163
|
+
state: "captured",
|
|
164
|
+
value: sanitizeBrowserUrl(page.url()),
|
|
233
165
|
})),
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
storage: await state("storage", () => captureStorage({ context, page, scenario, secrets, budget })),
|
|
166
|
+
history: await state("history", () => captureHistory(page)),
|
|
167
|
+
storage: await state("storage", () => captureStorage({ context, page, scenario, secrets })),
|
|
237
168
|
});
|
|
238
169
|
};
|
|
@@ -79,19 +79,17 @@ const configureAttachedEnvironment = async (context, page, scenario) => {
|
|
|
79
79
|
await session.detach();
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
|
-
export const openPlaywrightScenarioBrowser = async (scenario, environment
|
|
82
|
+
export const openPlaywrightScenarioBrowser = async (scenario, environment) => {
|
|
83
83
|
if (scenario.browser.mode === "connect") {
|
|
84
|
-
const browser = await chromium.connectOverCDP(scenario.browser.cdp_endpoint, {
|
|
85
|
-
timeout: Math.min(scenario.limits.navigation_timeout_ms, maximumTimeoutMs),
|
|
86
|
-
});
|
|
84
|
+
const browser = await chromium.connectOverCDP(scenario.browser.cdp_endpoint, { timeout: 0 });
|
|
87
85
|
try {
|
|
88
86
|
const target = await findConnectedPage(browser, scenario.browser.target_id, new Set(scenario.allowed_origins));
|
|
89
87
|
await configureAttachedEnvironment(target.context, target.page, scenario);
|
|
90
88
|
return { ...target, browser, profilePath: undefined };
|
|
91
89
|
}
|
|
92
|
-
catch (
|
|
90
|
+
catch (cause) {
|
|
93
91
|
await browser.close();
|
|
94
|
-
throw
|
|
92
|
+
throw cause;
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
const profilePath = await mkdtemp(join(tmpdir(), "rea-browser-scenario-"));
|
|
@@ -115,7 +113,7 @@ export const openPlaywrightScenarioBrowser = async (scenario, environment, maxim
|
|
|
115
113
|
handleSIGHUP: false,
|
|
116
114
|
handleSIGINT: false,
|
|
117
115
|
handleSIGTERM: false,
|
|
118
|
-
timeout:
|
|
116
|
+
timeout: 0,
|
|
119
117
|
});
|
|
120
118
|
const browser = context.browser();
|
|
121
119
|
if (browser === null) {
|
|
@@ -125,9 +123,9 @@ export const openPlaywrightScenarioBrowser = async (scenario, environment, maxim
|
|
|
125
123
|
const page = context.pages()[0] ?? (await context.newPage());
|
|
126
124
|
return { context, page, browser, profilePath };
|
|
127
125
|
}
|
|
128
|
-
catch (
|
|
126
|
+
catch (cause) {
|
|
129
127
|
await rm(profilePath, { recursive: true, force: true, maxRetries: 3 });
|
|
130
|
-
throw
|
|
128
|
+
throw cause;
|
|
131
129
|
}
|
|
132
130
|
};
|
|
133
131
|
export const closePlaywrightScenarioBrowser = async ({ context, browser, profilePath, }) => {
|