rea-agents 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -4,7 +4,7 @@ import { redactSensitiveText } from "./SensitiveTextCapture.js";
|
|
|
4
4
|
const OPERATION = "capture_electron_scenario";
|
|
5
5
|
const hookEventSchema = z.strictObject({
|
|
6
6
|
sequence: z.number().int().min(1),
|
|
7
|
-
correlation_id: z.string().
|
|
7
|
+
correlation_id: z.string().nullable(),
|
|
8
8
|
kind: z.enum([
|
|
9
9
|
"main-handler-invocation",
|
|
10
10
|
"main-event-invocation",
|
|
@@ -30,10 +30,9 @@ const hookEventSchema = z.strictObject({
|
|
|
30
30
|
"updater",
|
|
31
31
|
"error",
|
|
32
32
|
]),
|
|
33
|
-
event: z.string().
|
|
33
|
+
event: z.string().nullable(),
|
|
34
34
|
phase: z.enum(["attempted", "completed", "blocked", "failed", "observed"]),
|
|
35
|
-
channel: z.string().
|
|
36
|
-
channel_truncated: z.boolean().default(false),
|
|
35
|
+
channel: z.string().nullable(),
|
|
37
36
|
direction: z
|
|
38
37
|
.enum([
|
|
39
38
|
"renderer-to-main",
|
|
@@ -42,17 +41,16 @@ const hookEventSchema = z.strictObject({
|
|
|
42
41
|
"utility-to-main",
|
|
43
42
|
])
|
|
44
43
|
.nullable(),
|
|
45
|
-
sender: z.string().
|
|
46
|
-
receiver: z.string().
|
|
47
|
-
frame: z.string().
|
|
48
|
-
target: z.string().
|
|
49
|
-
argument_shapes: z.array(z.string()
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
source: z.string().max(64),
|
|
44
|
+
sender: z.string().nullable(),
|
|
45
|
+
receiver: z.string().nullable(),
|
|
46
|
+
frame: z.string().nullable(),
|
|
47
|
+
target: z.string().nullable(),
|
|
48
|
+
argument_shapes: z.array(z.string()),
|
|
49
|
+
result_shape: z.string().nullable(),
|
|
50
|
+
process_type: z.string().nullable(),
|
|
51
|
+
source: z.string(),
|
|
54
52
|
capture_method: z.enum(["api-wrapper", "event-emitter", "process-hook"]),
|
|
55
|
-
artifact_path: z.string().
|
|
53
|
+
artifact_path: z.string().nullable(),
|
|
56
54
|
artifact_sha256: z
|
|
57
55
|
.string()
|
|
58
56
|
.regex(/^[a-f0-9]{64}$/u)
|
|
@@ -60,27 +58,26 @@ const hookEventSchema = z.strictObject({
|
|
|
60
58
|
error: z.boolean(),
|
|
61
59
|
});
|
|
62
60
|
const hookSnapshotSchema = z.strictObject({
|
|
63
|
-
events: z.array(hookEventSchema)
|
|
61
|
+
events: z.array(hookEventSchema),
|
|
64
62
|
observed: z.number().int().min(0),
|
|
65
63
|
observed_ipc: z.number().int().min(0),
|
|
66
64
|
observed_runtime: z.number().int().min(0),
|
|
67
|
-
truncated: z.boolean(),
|
|
68
65
|
hook_error: z.boolean(),
|
|
69
66
|
});
|
|
70
67
|
const metricSchema = z.strictObject({
|
|
71
68
|
pid: z.number().int().min(1),
|
|
72
|
-
type: z.string().min(1)
|
|
73
|
-
name: z.string().
|
|
74
|
-
service_name: z.string().
|
|
69
|
+
type: z.string().min(1),
|
|
70
|
+
name: z.string().nullable(),
|
|
71
|
+
service_name: z.string().nullable(),
|
|
75
72
|
});
|
|
76
73
|
const windowMetadataSchema = z.strictObject({
|
|
77
|
-
window_id: z.string()
|
|
78
|
-
web_contents_id: z.string()
|
|
74
|
+
window_id: z.string(),
|
|
75
|
+
web_contents_id: z.string(),
|
|
79
76
|
visible: z.boolean().nullable(),
|
|
80
77
|
destroyed: z.boolean(),
|
|
81
78
|
});
|
|
82
|
-
/** Run
|
|
83
|
-
export const runElectronActions = async (application, input, options
|
|
79
|
+
/** Run explicit actions against provider-owned Electron windows. */
|
|
80
|
+
export const runElectronActions = async (application, input, options) => {
|
|
84
81
|
const actions = [];
|
|
85
82
|
for (const action of input.actions) {
|
|
86
83
|
if (options.signal?.aborted === true)
|
|
@@ -89,18 +86,13 @@ export const runElectronActions = async (application, input, options, deadline)
|
|
|
89
86
|
const windowIndex = actionWindowIndex(action);
|
|
90
87
|
let selectedWindow;
|
|
91
88
|
try {
|
|
92
|
-
const remaining = deadline - Date.now();
|
|
93
|
-
if (remaining <= 0)
|
|
94
|
-
throw new BrowserObservationError(OPERATION, "timeout");
|
|
95
89
|
selectedWindow =
|
|
96
90
|
windowIndex === null
|
|
97
91
|
? undefined
|
|
98
92
|
: await waitForWindow({
|
|
99
93
|
application,
|
|
100
94
|
windowIndex,
|
|
101
|
-
timeout: input.limits.action_timeout_ms,
|
|
102
95
|
signal: options.signal,
|
|
103
|
-
deadline,
|
|
104
96
|
});
|
|
105
97
|
if ((action.kind === "click" ||
|
|
106
98
|
action.kind === "renderer-reload" ||
|
|
@@ -111,10 +103,7 @@ export const runElectronActions = async (application, input, options, deadline)
|
|
|
111
103
|
application,
|
|
112
104
|
action,
|
|
113
105
|
selectedWindow,
|
|
114
|
-
remaining,
|
|
115
|
-
actionTimeoutMs: input.limits.action_timeout_ms,
|
|
116
106
|
options,
|
|
117
|
-
deadline,
|
|
118
107
|
});
|
|
119
108
|
actions.push({
|
|
120
109
|
step_id: action.step_id,
|
|
@@ -141,31 +130,29 @@ export const runElectronActions = async (application, input, options, deadline)
|
|
|
141
130
|
}
|
|
142
131
|
return actions;
|
|
143
132
|
};
|
|
144
|
-
const runAction = async ({ application, action, selectedWindow,
|
|
133
|
+
const runAction = async ({ application, action, selectedWindow, options, }) => {
|
|
145
134
|
switch (action.kind) {
|
|
146
135
|
case "click":
|
|
147
136
|
if (selectedWindow === undefined)
|
|
148
137
|
throw new BrowserObservationError(OPERATION, "window_not_found");
|
|
149
138
|
await runWithExecutionLimits(selectedWindow.locator(action.selector).click({
|
|
150
|
-
timeout:
|
|
151
|
-
}), options.signal
|
|
139
|
+
timeout: 0,
|
|
140
|
+
}), options.signal);
|
|
152
141
|
return;
|
|
153
142
|
case "wait": {
|
|
154
143
|
const page = selectedWindow ??
|
|
155
144
|
(await application.firstWindow({
|
|
156
|
-
timeout:
|
|
145
|
+
timeout: 0,
|
|
157
146
|
}));
|
|
158
|
-
await runWithExecutionLimits(page.waitForTimeout(
|
|
159
|
-
if (action.duration_ms > remaining)
|
|
160
|
-
throw new BrowserObservationError(OPERATION, "timeout");
|
|
147
|
+
await runWithExecutionLimits(page.waitForTimeout(action.duration_ms), options.signal);
|
|
161
148
|
return;
|
|
162
149
|
}
|
|
163
150
|
case "renderer-reload":
|
|
164
151
|
if (selectedWindow === undefined)
|
|
165
152
|
throw new BrowserObservationError(OPERATION, "window_not_found");
|
|
166
153
|
await runWithExecutionLimits(selectedWindow.reload({
|
|
167
|
-
timeout:
|
|
168
|
-
}), options.signal
|
|
154
|
+
timeout: 0,
|
|
155
|
+
}), options.signal);
|
|
169
156
|
return;
|
|
170
157
|
case "renderer-crash": {
|
|
171
158
|
const crashed = await runWithExecutionLimits(application.evaluate(({ BrowserWindow }, index) => {
|
|
@@ -174,13 +161,13 @@ const runAction = async ({ application, action, selectedWindow, remaining, actio
|
|
|
174
161
|
return false;
|
|
175
162
|
candidate.webContents.forcefullyCrashRenderer();
|
|
176
163
|
return true;
|
|
177
|
-
}, action.window_index), options.signal
|
|
164
|
+
}, action.window_index), options.signal);
|
|
178
165
|
if (!crashed)
|
|
179
166
|
throw new BrowserObservationError(OPERATION, "window_not_found");
|
|
180
167
|
return;
|
|
181
168
|
}
|
|
182
169
|
case "deep-link":
|
|
183
|
-
await runWithExecutionLimits(emitDeepLink(application, action), options.signal
|
|
170
|
+
await runWithExecutionLimits(emitDeepLink(application, action), options.signal);
|
|
184
171
|
return;
|
|
185
172
|
}
|
|
186
173
|
};
|
|
@@ -196,31 +183,29 @@ const actionWindowIndex = (action) => {
|
|
|
196
183
|
return null;
|
|
197
184
|
}
|
|
198
185
|
};
|
|
199
|
-
const waitForWindow = async ({ application, windowIndex,
|
|
200
|
-
|
|
201
|
-
while (Date.now() < stopAt) {
|
|
186
|
+
const waitForWindow = async ({ application, windowIndex, signal, }) => {
|
|
187
|
+
while (true) {
|
|
202
188
|
if (signal?.aborted === true)
|
|
203
189
|
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
204
190
|
const window = application.windows()[windowIndex];
|
|
205
191
|
if (window !== undefined)
|
|
206
192
|
return window;
|
|
207
|
-
await runWithExecutionLimits(new Promise((resolve) => setTimeout(resolve, 25)), signal
|
|
193
|
+
await runWithExecutionLimits(new Promise((resolve) => setTimeout(resolve, 25)), signal);
|
|
208
194
|
}
|
|
209
|
-
throw new BrowserObservationError(OPERATION, "window_not_found");
|
|
210
195
|
};
|
|
211
196
|
const emitDeepLink = (application, action) => application.evaluate(({ app }, payload) => {
|
|
212
197
|
if (payload.delivery === "open-url")
|
|
213
198
|
return app.emit("open-url", { preventDefault: () => undefined }, payload.url);
|
|
214
199
|
return app.emit("second-instance", {}, [payload.url], "", {});
|
|
215
200
|
}, { delivery: action.delivery, url: action.url });
|
|
216
|
-
/** Read the current Electron windows, metrics, and
|
|
201
|
+
/** Read the current Electron windows, metrics, and hook snapshot. */
|
|
217
202
|
// oxlint-disable-next-line max-lines-per-function -- one state read must share one capture boundary.
|
|
218
|
-
export const readApplicationState = async (application
|
|
203
|
+
export const readApplicationState = async (application) => {
|
|
219
204
|
const pages = application.windows();
|
|
220
|
-
const pageSnapshotsPromise = Promise.all(pages.
|
|
205
|
+
const pageSnapshotsPromise = Promise.all(pages.map(async (page, index) => ({
|
|
221
206
|
index,
|
|
222
|
-
url: page.url()
|
|
223
|
-
title:
|
|
207
|
+
url: page.url(),
|
|
208
|
+
title: await page.title(),
|
|
224
209
|
})));
|
|
225
210
|
const windowMetadataPromise = application
|
|
226
211
|
.evaluate(({ BrowserWindow }) => BrowserWindow.getAllWindows().map((window) => ({
|
|
@@ -253,7 +238,6 @@ export const readApplicationState = async (application, maxWindows) => {
|
|
|
253
238
|
observed: 0,
|
|
254
239
|
observed_ipc: 0,
|
|
255
240
|
observed_runtime: 0,
|
|
256
|
-
truncated: false,
|
|
257
241
|
hook_error: true,
|
|
258
242
|
};
|
|
259
243
|
})
|
|
@@ -279,32 +263,33 @@ export const readApplicationState = async (application, maxWindows) => {
|
|
|
279
263
|
destroyed: metadata.destroyed,
|
|
280
264
|
};
|
|
281
265
|
}),
|
|
282
|
-
windowsTruncated: pages.length > maxWindows,
|
|
283
266
|
metrics: processMetrics,
|
|
284
267
|
electronVersion,
|
|
285
268
|
hookSnapshot,
|
|
286
269
|
};
|
|
287
270
|
};
|
|
288
|
-
/** Apply
|
|
271
|
+
/** Apply an optional lifecycle deadline and caller cancellation to an operation. */
|
|
289
272
|
export const runWithExecutionLimits = async (operation, signal, deadline) => {
|
|
290
273
|
if (signal?.aborted === true)
|
|
291
274
|
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
275
|
+
if (signal === undefined && deadline === undefined)
|
|
276
|
+
return operation;
|
|
292
277
|
let timer;
|
|
293
278
|
let abortListener;
|
|
294
|
-
const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
new
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}),
|
|
305
|
-
]);
|
|
279
|
+
const interruptions = [];
|
|
280
|
+
if (deadline !== undefined)
|
|
281
|
+
interruptions.push(new Promise((_, reject) => {
|
|
282
|
+
timer = setTimeout(() => reject(new BrowserObservationError(OPERATION, "timeout")), Math.max(1, deadline - Date.now()));
|
|
283
|
+
}));
|
|
284
|
+
if (signal !== undefined)
|
|
285
|
+
interruptions.push(new Promise((_, reject) => {
|
|
286
|
+
abortListener = () => reject(new BrowserObservationError(OPERATION, "cancelled"));
|
|
287
|
+
signal.addEventListener("abort", abortListener, { once: true });
|
|
288
|
+
}));
|
|
306
289
|
try {
|
|
307
|
-
return
|
|
290
|
+
return interruptions.length === 0
|
|
291
|
+
? await operation
|
|
292
|
+
: await Promise.race([operation, ...interruptions]);
|
|
308
293
|
}
|
|
309
294
|
finally {
|
|
310
295
|
if (timer !== undefined)
|
|
@@ -320,5 +305,5 @@ const safeActionErrorMessage = (cause, action) => {
|
|
|
320
305
|
.sort((left, right) => right.length - left.length);
|
|
321
306
|
for (const value of inputValues)
|
|
322
307
|
message = message.split(value).join("<redacted-input>");
|
|
323
|
-
return redactSensitiveText(message)
|
|
308
|
+
return redactSensitiveText(message);
|
|
324
309
|
};
|
|
@@ -9,6 +9,7 @@ import { err, ok } from "../domain/result.js";
|
|
|
9
9
|
import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, observeOwnedProcessLineage, selectCapturedProcessGroupIds, verifyNoTokenOwnedProcesses, } from "../process/ProcessOwnership.js";
|
|
10
10
|
import { runElectronActions, readApplicationState, runWithExecutionLimits, } from "./PlaywrightElectronActiveActions.js";
|
|
11
11
|
const OPERATION = "capture_electron_scenario";
|
|
12
|
+
const STARTUP_TIMEOUT_MS = 60_000;
|
|
12
13
|
/** Public identity for provider-owned Electron runtime experiments. */
|
|
13
14
|
export const PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY = Object.freeze({
|
|
14
15
|
id: "rea-playwright-electron-active",
|
|
@@ -78,11 +79,7 @@ const createCoverage = (hookSnapshot) => {
|
|
|
78
79
|
unavailableEventFamilies.add("renderer-ipc");
|
|
79
80
|
}
|
|
80
81
|
return {
|
|
81
|
-
status: hookSnapshot.hook_error
|
|
82
|
-
? "hook_conflict"
|
|
83
|
-
: hookSnapshot.truncated
|
|
84
|
-
? "capture_truncated"
|
|
85
|
-
: "partial_attach",
|
|
82
|
+
status: hookSnapshot.hook_error ? "hook_conflict" : "partial_attach",
|
|
86
83
|
observed_event_families: observedEventFamilies,
|
|
87
84
|
unavailable_event_families: [...unavailableEventFamilies].sort(),
|
|
88
85
|
observed_roles: observedRoles,
|
|
@@ -103,14 +100,14 @@ export class PlaywrightElectronActiveProvider {
|
|
|
103
100
|
try {
|
|
104
101
|
if (options.signal?.aborted === true)
|
|
105
102
|
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
106
|
-
const
|
|
103
|
+
const startupDeadline = Date.now() + STARTUP_TIMEOUT_MS;
|
|
107
104
|
const paths = await canonicalPaths(input);
|
|
108
105
|
application = await electron.launch({
|
|
109
106
|
executablePath: paths.executable,
|
|
110
107
|
cwd: paths.root,
|
|
111
|
-
env: safeElectronEnvironment(
|
|
108
|
+
env: safeElectronEnvironment(runId),
|
|
112
109
|
args: ["-r", hookPath, paths.application, ...input.args],
|
|
113
|
-
timeout: Math.max(1,
|
|
110
|
+
timeout: Math.max(1, startupDeadline - Date.now()),
|
|
114
111
|
});
|
|
115
112
|
const leaderPid = application.process().pid;
|
|
116
113
|
if (typeof leaderPid !== "number" ||
|
|
@@ -125,8 +122,8 @@ export class PlaywrightElectronActiveProvider {
|
|
|
125
122
|
expectedCommand: paths.executable,
|
|
126
123
|
sweepTokenOwnedProcesses: true,
|
|
127
124
|
};
|
|
128
|
-
const actions = await runElectronActions(application, input, options
|
|
129
|
-
const state = await runWithExecutionLimits(readApplicationState(application
|
|
125
|
+
const actions = await runElectronActions(application, input, options);
|
|
126
|
+
const state = await runWithExecutionLimits(readApplicationState(application), options.signal);
|
|
130
127
|
outcome = ok(createResult(paths, input, actions, state));
|
|
131
128
|
}
|
|
132
129
|
catch (cause) {
|
|
@@ -211,7 +208,6 @@ const createResult = (paths, input, actions, state) => {
|
|
|
211
208
|
const { hookSnapshot } = state;
|
|
212
209
|
const ipcEvents = hookSnapshot.events.filter(({ kind }) => ipcEventKinds.has(kind));
|
|
213
210
|
return electronActiveObservationResultSchema.parse({
|
|
214
|
-
schema_version: 1,
|
|
215
211
|
application: {
|
|
216
212
|
executable_path: paths.executable,
|
|
217
213
|
application_path: paths.application,
|
|
@@ -220,37 +216,26 @@ const createResult = (paths, input, actions, state) => {
|
|
|
220
216
|
cleanup: "terminated-owned-process",
|
|
221
217
|
},
|
|
222
218
|
actions,
|
|
223
|
-
windows: state.windows
|
|
224
|
-
windows_truncated: state.windowsTruncated,
|
|
219
|
+
windows: state.windows,
|
|
225
220
|
processes: {
|
|
226
|
-
items: state.metrics
|
|
227
|
-
truncated: state.metrics.length > input.limits.max_processes,
|
|
221
|
+
items: state.metrics,
|
|
228
222
|
},
|
|
229
223
|
ipc: {
|
|
230
|
-
events: ipcEvents
|
|
224
|
+
events: ipcEvents,
|
|
231
225
|
observed: hookSnapshot.observed_ipc,
|
|
232
|
-
retained: Math.min(ipcEvents.length, input.limits.max_ipc_events),
|
|
233
|
-
truncated: hookSnapshot.truncated ||
|
|
234
|
-
ipcEvents.length > input.limits.max_ipc_events,
|
|
235
226
|
},
|
|
236
227
|
timeline: {
|
|
237
|
-
events: hookSnapshot.events
|
|
228
|
+
events: hookSnapshot.events,
|
|
238
229
|
observed: hookSnapshot.observed,
|
|
239
|
-
retained: Math.min(hookSnapshot.events.length, input.limits.max_runtime_events),
|
|
240
|
-
truncated: hookSnapshot.truncated ||
|
|
241
|
-
hookSnapshot.events.length > input.limits.max_runtime_events,
|
|
242
230
|
},
|
|
243
231
|
coverage: createCoverage(hookSnapshot),
|
|
244
232
|
limitations: [
|
|
245
|
-
"IPC payloads are represented
|
|
233
|
+
"IPC payloads are represented by value shapes; payload values are never retained.",
|
|
246
234
|
"IPC direction and sender/receiver identifiers are observed only where Electron exposes them at the hooked boundary.",
|
|
247
|
-
"The runtime timeline records
|
|
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.",
|
|
248
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.",
|
|
249
237
|
"Process metrics are an Electron API snapshot and do not prove hostile-local-user isolation.",
|
|
250
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.",
|
|
251
|
-
...(state.windowsTruncated
|
|
252
|
-
? ["Windows beyond max_windows were not retained."]
|
|
253
|
-
: []),
|
|
254
239
|
...(hookSnapshot.hook_error
|
|
255
240
|
? ["The active IPC hook could not be installed."]
|
|
256
241
|
: []),
|
|
@@ -267,7 +252,7 @@ const canonicalPaths = async (input) => {
|
|
|
267
252
|
throw new BrowserObservationError(OPERATION, "target_not_allowed");
|
|
268
253
|
return { executable, application, root };
|
|
269
254
|
};
|
|
270
|
-
const safeElectronEnvironment = (
|
|
255
|
+
const safeElectronEnvironment = (runId) => Object.fromEntries([
|
|
271
256
|
...[
|
|
272
257
|
"HOME",
|
|
273
258
|
"LANG",
|
|
@@ -280,11 +265,6 @@ const safeElectronEnvironment = (maxIpcEvents, maxRuntimeEvents, runId) => Objec
|
|
|
280
265
|
]
|
|
281
266
|
.map((name) => [name, process.env[name]])
|
|
282
267
|
.filter((entry) => entry[1] !== undefined),
|
|
283
|
-
["REA_ELECTRON_ACTIVE_MAX_IPC_EVENTS", String(maxIpcEvents)],
|
|
284
|
-
[
|
|
285
|
-
"REA_ELECTRON_ACTIVE_MAX_RUNTIME_EVENTS",
|
|
286
|
-
String(maxRuntimeEvents),
|
|
287
|
-
],
|
|
288
268
|
["REA_PROCESS_RUN_ID", runId],
|
|
289
269
|
]);
|
|
290
270
|
const providerError = (cause) => cause instanceof AnalysisError
|
|
@@ -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
|
};
|