rea-agents 6.0.0 → 6.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 +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,63 +1,24 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { BrowserObservationError } from "../domain/browserObservationError.js";
|
|
3
|
+
import { electronActiveTimelineEventSchema, } from "../domain/javascript/electronActiveObservation.js";
|
|
3
4
|
const OPERATION = "capture_electron_scenario";
|
|
4
|
-
const hookEventSchema = z.strictObject({
|
|
5
|
-
sequence: z.number().int().min(1),
|
|
6
|
-
correlation_id: z.string().nullable(),
|
|
7
|
-
kind: z.enum([
|
|
8
|
-
"main-handler-invocation",
|
|
9
|
-
"main-event-invocation",
|
|
10
|
-
"utility-process-fork",
|
|
11
|
-
"utility-process-message",
|
|
12
|
-
"ipc-main-to-renderer",
|
|
13
|
-
"ipc-utility-to-main",
|
|
14
|
-
"ipc-renderer-send",
|
|
15
|
-
"ipc-renderer-invoke",
|
|
16
|
-
"ipc-renderer-post-message",
|
|
17
|
-
"app-lifecycle",
|
|
18
|
-
"window-lifecycle",
|
|
19
|
-
"web-contents-lifecycle",
|
|
20
|
-
"navigation",
|
|
21
|
-
"shell-attempt",
|
|
22
|
-
"process-lifecycle",
|
|
23
|
-
"permission",
|
|
24
|
-
"popup-attempt",
|
|
25
|
-
"download",
|
|
26
|
-
"protocol",
|
|
27
|
-
"preload",
|
|
28
|
-
"native-addon",
|
|
29
|
-
"updater",
|
|
30
|
-
"error",
|
|
31
|
-
]),
|
|
32
|
-
event: z.string().nullable(),
|
|
33
|
-
phase: z.enum(["attempted", "completed", "blocked", "failed", "observed"]),
|
|
34
|
-
channel: z.string().nullable(),
|
|
35
|
-
direction: z
|
|
36
|
-
.enum([
|
|
37
|
-
"renderer-to-main",
|
|
38
|
-
"main-to-renderer",
|
|
39
|
-
"main-to-utility",
|
|
40
|
-
"utility-to-main",
|
|
41
|
-
])
|
|
42
|
-
.nullable(),
|
|
43
|
-
sender: z.string().nullable(),
|
|
44
|
-
receiver: z.string().nullable(),
|
|
45
|
-
frame: z.string().nullable(),
|
|
46
|
-
target: z.string().nullable(),
|
|
47
|
-
argument_shapes: z.array(z.string()),
|
|
48
|
-
result_shape: z.string().nullable(),
|
|
49
|
-
process_type: z.string().nullable(),
|
|
50
|
-
source: z.string(),
|
|
51
|
-
capture_method: z.enum(["api-wrapper", "event-emitter", "process-hook"]),
|
|
52
|
-
artifact_path: z.string().nullable(),
|
|
53
|
-
artifact_sha256: z
|
|
54
|
-
.string()
|
|
55
|
-
.regex(/^[a-f0-9]{64}$/u)
|
|
56
|
-
.nullable(),
|
|
57
|
-
error: z.boolean(),
|
|
58
|
-
});
|
|
59
5
|
const hookSnapshotSchema = z.strictObject({
|
|
60
|
-
events: z.array(
|
|
6
|
+
events: z.array(electronActiveTimelineEventSchema),
|
|
7
|
+
retention_budget_bytes: z.number().int().min(0),
|
|
8
|
+
estimated_retained_bytes: z.number().int().min(0),
|
|
9
|
+
event_serialized_byte_upper_bound: z.number().int().min(0),
|
|
10
|
+
retained: z.number().int().min(0),
|
|
11
|
+
dropped: z.number().int().min(0),
|
|
12
|
+
dropped_ipc: z.number().int().min(0),
|
|
13
|
+
dropped_runtime: z.number().int().min(0),
|
|
14
|
+
dropped_event_families: z.array(z.strictObject({
|
|
15
|
+
family: z.string().min(1),
|
|
16
|
+
count: z.number().int().min(1),
|
|
17
|
+
})),
|
|
18
|
+
dropped_event_roles: z.array(z.strictObject({
|
|
19
|
+
role: z.string().min(1),
|
|
20
|
+
count: z.number().int().min(1),
|
|
21
|
+
})),
|
|
61
22
|
observed: z.number().int().min(0),
|
|
62
23
|
observed_ipc: z.number().int().min(0),
|
|
63
24
|
observed_runtime: z.number().int().min(0),
|
|
@@ -72,6 +33,8 @@ const metricSchema = z.strictObject({
|
|
|
72
33
|
const windowMetadataSchema = z.strictObject({
|
|
73
34
|
window_id: z.string(),
|
|
74
35
|
web_contents_id: z.string(),
|
|
36
|
+
url: z.string(),
|
|
37
|
+
title: z.string(),
|
|
75
38
|
visible: z.boolean().nullable(),
|
|
76
39
|
destroyed: z.boolean(),
|
|
77
40
|
});
|
|
@@ -79,12 +42,12 @@ const windowMetadataSchema = z.strictObject({
|
|
|
79
42
|
export const runElectronActions = async (application, input, options) => {
|
|
80
43
|
const actions = [];
|
|
81
44
|
for (const action of input.actions) {
|
|
82
|
-
if (options.signal?.aborted === true)
|
|
83
|
-
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
84
45
|
const actionStartedAt = Date.now();
|
|
85
46
|
const windowIndex = actionWindowIndex(action);
|
|
86
47
|
let selectedWindow;
|
|
87
48
|
try {
|
|
49
|
+
if (options.signal?.aborted === true)
|
|
50
|
+
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
88
51
|
selectedWindow =
|
|
89
52
|
windowIndex === null
|
|
90
53
|
? undefined
|
|
@@ -200,16 +163,12 @@ const emitDeepLink = (application, action) => application.evaluate(({ app }, pay
|
|
|
200
163
|
/** Read the current Electron windows, metrics, and hook snapshot. */
|
|
201
164
|
// oxlint-disable-next-line max-lines-per-function -- one state read must share one capture boundary.
|
|
202
165
|
export const readApplicationState = async (application) => {
|
|
203
|
-
const pages = application.windows();
|
|
204
|
-
const pageSnapshotsPromise = Promise.all(pages.map(async (page, index) => ({
|
|
205
|
-
index,
|
|
206
|
-
url: page.url(),
|
|
207
|
-
title: await page.title(),
|
|
208
|
-
})));
|
|
209
166
|
const windowMetadataPromise = application
|
|
210
167
|
.evaluate(({ BrowserWindow }) => BrowserWindow.getAllWindows().map((window) => ({
|
|
211
168
|
window_id: `window:${String(window.id)}`,
|
|
212
169
|
web_contents_id: `webContents:${String(window.webContents.id)}`,
|
|
170
|
+
url: window.webContents.getURL(),
|
|
171
|
+
title: window.webContents.getTitle(),
|
|
213
172
|
visible: window.isDestroyed() ? null : window.isVisible(),
|
|
214
173
|
destroyed: window.isDestroyed(),
|
|
215
174
|
})))
|
|
@@ -234,6 +193,15 @@ export const readApplicationState = async (application) => {
|
|
|
234
193
|
? candidate()
|
|
235
194
|
: {
|
|
236
195
|
events: [],
|
|
196
|
+
retention_budget_bytes: 0,
|
|
197
|
+
estimated_retained_bytes: 0,
|
|
198
|
+
event_serialized_byte_upper_bound: 0,
|
|
199
|
+
retained: 0,
|
|
200
|
+
dropped: 0,
|
|
201
|
+
dropped_ipc: 0,
|
|
202
|
+
dropped_runtime: 0,
|
|
203
|
+
dropped_event_families: [],
|
|
204
|
+
dropped_event_roles: [],
|
|
237
205
|
observed: 0,
|
|
238
206
|
observed_ipc: 0,
|
|
239
207
|
observed_runtime: 0,
|
|
@@ -241,27 +209,14 @@ export const readApplicationState = async (application) => {
|
|
|
241
209
|
};
|
|
242
210
|
})
|
|
243
211
|
.then((value) => hookSnapshotSchema.parse(value));
|
|
244
|
-
const [
|
|
245
|
-
pageSnapshotsPromise,
|
|
212
|
+
const [windowMetadata, processMetrics, electronVersion, hookSnapshot] = await Promise.all([
|
|
246
213
|
windowMetadataPromise,
|
|
247
214
|
processMetricsPromise,
|
|
248
215
|
electronVersionPromise,
|
|
249
216
|
hookSnapshotPromise,
|
|
250
217
|
]);
|
|
251
218
|
return {
|
|
252
|
-
windows:
|
|
253
|
-
const metadata = windowMetadata[page.index];
|
|
254
|
-
if (metadata === undefined)
|
|
255
|
-
throw new BrowserObservationError(OPERATION, "window_metadata_missing");
|
|
256
|
-
return {
|
|
257
|
-
window_id: metadata.window_id,
|
|
258
|
-
web_contents_id: metadata.web_contents_id,
|
|
259
|
-
url: page.url,
|
|
260
|
-
title: page.title,
|
|
261
|
-
visible: metadata.visible,
|
|
262
|
-
destroyed: metadata.destroyed,
|
|
263
|
-
};
|
|
264
|
-
}),
|
|
219
|
+
windows: windowMetadata,
|
|
265
220
|
metrics: processMetrics,
|
|
266
221
|
electronVersion,
|
|
267
222
|
hookSnapshot,
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { electronActiveObservationResultSchema, } from "../domain/javascript/electronActiveObservation.js";
|
|
2
|
+
const observableEventFamilies = [
|
|
3
|
+
"app-lifecycle",
|
|
4
|
+
"window-lifecycle",
|
|
5
|
+
"web-contents-lifecycle",
|
|
6
|
+
"navigation",
|
|
7
|
+
"shell-attempt",
|
|
8
|
+
"process-lifecycle",
|
|
9
|
+
"permission",
|
|
10
|
+
"popup-attempt",
|
|
11
|
+
"download",
|
|
12
|
+
"protocol",
|
|
13
|
+
"preload",
|
|
14
|
+
"preload-configuration",
|
|
15
|
+
"renderer-ipc",
|
|
16
|
+
"native-addon",
|
|
17
|
+
"updater",
|
|
18
|
+
"error",
|
|
19
|
+
"ipc",
|
|
20
|
+
];
|
|
21
|
+
const ipcEventKinds = new Set([
|
|
22
|
+
"main-handler-invocation",
|
|
23
|
+
"main-event-invocation",
|
|
24
|
+
"utility-process-fork",
|
|
25
|
+
"utility-process-message",
|
|
26
|
+
"ipc-main-to-renderer",
|
|
27
|
+
"ipc-utility-to-main",
|
|
28
|
+
"ipc-renderer-send",
|
|
29
|
+
"ipc-renderer-invoke",
|
|
30
|
+
"ipc-renderer-post-message",
|
|
31
|
+
]);
|
|
32
|
+
const eventFamily = (kind, processType) => {
|
|
33
|
+
if (kind === "preload" &&
|
|
34
|
+
(processType === "main" || processType === "browser"))
|
|
35
|
+
return "preload-configuration";
|
|
36
|
+
if (kind.startsWith("ipc-renderer"))
|
|
37
|
+
return processType === "renderer" ? "renderer-ipc" : "ipc";
|
|
38
|
+
return ipcEventKinds.has(kind) ? "ipc" : kind;
|
|
39
|
+
};
|
|
40
|
+
const createCoverage = (hookSnapshot) => {
|
|
41
|
+
const observedEventFamilies = [
|
|
42
|
+
...new Set([
|
|
43
|
+
...hookSnapshot.events.map(({ kind, process_type }) => eventFamily(kind, process_type)),
|
|
44
|
+
...hookSnapshot.dropped_event_families.map(({ family }) => family),
|
|
45
|
+
]),
|
|
46
|
+
].sort();
|
|
47
|
+
const unavailableEventFamilies = new Set(observableEventFamilies.filter((family) => !observedEventFamilies.includes(family)));
|
|
48
|
+
const observedRoles = [
|
|
49
|
+
...new Set([
|
|
50
|
+
...hookSnapshot.events.flatMap(({ process_type, kind }) => [
|
|
51
|
+
...(process_type === null ? [] : [process_type]),
|
|
52
|
+
...(kind === "window-lifecycle" ? ["window"] : []),
|
|
53
|
+
...(kind === "web-contents-lifecycle" || kind === "navigation"
|
|
54
|
+
? ["web_contents"]
|
|
55
|
+
: []),
|
|
56
|
+
...(kind === "preload" && process_type === "preload"
|
|
57
|
+
? ["preload"]
|
|
58
|
+
: []),
|
|
59
|
+
...(kind.startsWith("ipc-renderer") && process_type === "renderer"
|
|
60
|
+
? ["renderer"]
|
|
61
|
+
: []),
|
|
62
|
+
]),
|
|
63
|
+
...hookSnapshot.dropped_event_roles.map(({ role }) => role),
|
|
64
|
+
]),
|
|
65
|
+
].sort();
|
|
66
|
+
if (!observedRoles.includes("preload"))
|
|
67
|
+
unavailableEventFamilies.add("preload");
|
|
68
|
+
if (!observedRoles.includes("renderer"))
|
|
69
|
+
unavailableEventFamilies.add("renderer-ipc");
|
|
70
|
+
return {
|
|
71
|
+
status: hookSnapshot.hook_error ? "hook_conflict" : "partial_attach",
|
|
72
|
+
observed_event_families: observedEventFamilies,
|
|
73
|
+
unavailable_event_families: [...unavailableEventFamilies].sort(),
|
|
74
|
+
observed_roles: observedRoles,
|
|
75
|
+
pre_capture_activity: "unavailable",
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
/** Project one provider hook snapshot into the canonical public result. */
|
|
79
|
+
export const projectElectronActiveCapture = (paths, actions, state) => {
|
|
80
|
+
const { hookSnapshot } = state;
|
|
81
|
+
const ipcEvents = hookSnapshot.events.filter(({ kind }) => ipcEventKinds.has(kind));
|
|
82
|
+
return electronActiveObservationResultSchema.parse({
|
|
83
|
+
application: {
|
|
84
|
+
executable_path: paths.executable,
|
|
85
|
+
application_path: paths.application,
|
|
86
|
+
electron_version: state.electronVersion,
|
|
87
|
+
process_ownership: "provider-owned",
|
|
88
|
+
cleanup: "terminated-owned-process",
|
|
89
|
+
},
|
|
90
|
+
actions,
|
|
91
|
+
windows: state.windows,
|
|
92
|
+
processes: {
|
|
93
|
+
items: state.metrics,
|
|
94
|
+
},
|
|
95
|
+
ipc: {
|
|
96
|
+
events: ipcEvents,
|
|
97
|
+
observed: hookSnapshot.observed_ipc,
|
|
98
|
+
dropped: hookSnapshot.dropped_ipc,
|
|
99
|
+
},
|
|
100
|
+
timeline: {
|
|
101
|
+
events: hookSnapshot.events,
|
|
102
|
+
observed: hookSnapshot.observed,
|
|
103
|
+
dropped: hookSnapshot.dropped,
|
|
104
|
+
},
|
|
105
|
+
retention: {
|
|
106
|
+
budget_bytes: hookSnapshot.retention_budget_bytes,
|
|
107
|
+
estimated_retained_bytes: hookSnapshot.estimated_retained_bytes,
|
|
108
|
+
event_serialized_byte_upper_bound: hookSnapshot.event_serialized_byte_upper_bound,
|
|
109
|
+
retained: hookSnapshot.retained,
|
|
110
|
+
dropped: hookSnapshot.dropped,
|
|
111
|
+
dropped_event_families: hookSnapshot.dropped_event_families,
|
|
112
|
+
dropped_event_roles: hookSnapshot.dropped_event_roles,
|
|
113
|
+
observed_ipc: hookSnapshot.observed_ipc,
|
|
114
|
+
dropped_ipc: hookSnapshot.dropped_ipc,
|
|
115
|
+
observed_runtime: hookSnapshot.observed_runtime,
|
|
116
|
+
dropped_runtime: hookSnapshot.dropped_runtime,
|
|
117
|
+
},
|
|
118
|
+
coverage: createCoverage(hookSnapshot),
|
|
119
|
+
limitations: [
|
|
120
|
+
"IPC payloads are represented by value shapes; payload values are never retained.",
|
|
121
|
+
"IPC direction and sender/receiver identifiers are observed only where Electron exposes them at the hooked boundary.",
|
|
122
|
+
"The runtime timeline records lifecycle, navigation, shell, permission, popup, download, protocol, preload, native-addon, process, and IPC events; activity before hook installation is unavailable.",
|
|
123
|
+
"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.",
|
|
124
|
+
...(!hookSnapshot.events.some(({ kind }) => kind === "preload")
|
|
125
|
+
? [
|
|
126
|
+
"Preload configuration was not exposed by the observed Electron window metadata. Preload paths and execution remain unavailable.",
|
|
127
|
+
]
|
|
128
|
+
: []),
|
|
129
|
+
"Process metrics are an Electron API snapshot and do not prove hostile-local-user isolation.",
|
|
130
|
+
...(hookSnapshot.dropped > 0
|
|
131
|
+
? [
|
|
132
|
+
`The active hook retained ${hookSnapshot.retained} of ${hookSnapshot.observed} observed events within a ${hookSnapshot.retention_budget_bytes}-byte retained-data budget; ${hookSnapshot.dropped} events were dropped (${hookSnapshot.dropped_ipc} IPC, ${hookSnapshot.dropped_runtime} runtime).`,
|
|
133
|
+
]
|
|
134
|
+
: []),
|
|
135
|
+
"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.",
|
|
136
|
+
...(hookSnapshot.hook_error
|
|
137
|
+
? ["The active IPC hook could not be installed."]
|
|
138
|
+
: []),
|
|
139
|
+
],
|
|
140
|
+
});
|
|
141
|
+
};
|
|
@@ -3,7 +3,6 @@ import { dirname } from "node:path";
|
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { _electron as electron } from "playwright-core";
|
|
6
|
-
import { electronActiveObservationResultSchema, } from "../domain/javascript/electronActiveObservation.js";
|
|
7
6
|
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
8
7
|
import { BrowserObservationError } from "../domain/browserObservationError.js";
|
|
9
8
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
@@ -12,83 +11,19 @@ import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, verifyNoTokenOwned
|
|
|
12
11
|
import { observeOwnedProcessLineage, prepareProcessOwnershipInspection, systemProcessOwnershipHost, } from "../process/ProcessOwnershipObservation.js";
|
|
13
12
|
import { selectCapturedProcessGroupIds } from "../process/ProcessOwnershipProcessTree.js";
|
|
14
13
|
import { runElectronActions, readApplicationState, runWithExecutionLimits, } from "./PlaywrightElectronActiveActions.js";
|
|
14
|
+
import { projectElectronActiveCapture } from "./PlaywrightElectronActiveProjection.js";
|
|
15
15
|
const OPERATION = "capture_electron_scenario";
|
|
16
16
|
const STARTUP_TIMEOUT_MS = 60_000;
|
|
17
|
-
/** Public identity for provider-owned Electron runtime experiments. */
|
|
18
|
-
export { PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
19
17
|
import { PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
20
18
|
const hookPath = fileURLToPath(new URL("../../scripts/electron-active-hook.cjs", import.meta.url));
|
|
21
|
-
const observableEventFamilies = [
|
|
22
|
-
"app-lifecycle",
|
|
23
|
-
"window-lifecycle",
|
|
24
|
-
"web-contents-lifecycle",
|
|
25
|
-
"navigation",
|
|
26
|
-
"shell-attempt",
|
|
27
|
-
"process-lifecycle",
|
|
28
|
-
"permission",
|
|
29
|
-
"popup-attempt",
|
|
30
|
-
"download",
|
|
31
|
-
"protocol",
|
|
32
|
-
"preload",
|
|
33
|
-
"preload-configuration",
|
|
34
|
-
"renderer-ipc",
|
|
35
|
-
"native-addon",
|
|
36
|
-
"updater",
|
|
37
|
-
"error",
|
|
38
|
-
"ipc",
|
|
39
|
-
];
|
|
40
|
-
const ipcEventKinds = new Set([
|
|
41
|
-
"main-handler-invocation",
|
|
42
|
-
"main-event-invocation",
|
|
43
|
-
"utility-process-fork",
|
|
44
|
-
"utility-process-message",
|
|
45
|
-
"ipc-main-to-renderer",
|
|
46
|
-
"ipc-utility-to-main",
|
|
47
|
-
"ipc-renderer-send",
|
|
48
|
-
"ipc-renderer-invoke",
|
|
49
|
-
"ipc-renderer-post-message",
|
|
50
|
-
]);
|
|
51
|
-
const createCoverage = (hookSnapshot) => {
|
|
52
|
-
const observedEventFamilies = [
|
|
53
|
-
...new Set(hookSnapshot.events.map(({ kind, process_type }) => {
|
|
54
|
-
if (kind === "preload" && process_type === "main")
|
|
55
|
-
return "preload-configuration";
|
|
56
|
-
if (kind.startsWith("ipc-renderer") && process_type !== "renderer")
|
|
57
|
-
return "ipc";
|
|
58
|
-
return ipcEventKinds.has(kind) ? "ipc" : kind;
|
|
59
|
-
})),
|
|
60
|
-
].sort();
|
|
61
|
-
const unavailableEventFamilies = new Set(observableEventFamilies.filter((family) => !observedEventFamilies.includes(family)));
|
|
62
|
-
const observedRoles = [
|
|
63
|
-
...new Set(hookSnapshot.events.flatMap(({ process_type, kind }) => [
|
|
64
|
-
...(process_type === null ? [] : [process_type]),
|
|
65
|
-
...(kind === "window-lifecycle" ? ["window"] : []),
|
|
66
|
-
...(kind === "web-contents-lifecycle" || kind === "navigation"
|
|
67
|
-
? ["web_contents"]
|
|
68
|
-
: []),
|
|
69
|
-
...(kind === "preload" && process_type === "preload"
|
|
70
|
-
? ["preload"]
|
|
71
|
-
: []),
|
|
72
|
-
...(kind.startsWith("ipc-renderer") && process_type === "renderer"
|
|
73
|
-
? ["renderer"]
|
|
74
|
-
: []),
|
|
75
|
-
])),
|
|
76
|
-
].sort();
|
|
77
|
-
const rendererContextObserved = hookSnapshot.events.some(({ process_type }) => process_type === "renderer" || process_type === "preload");
|
|
78
|
-
if (!rendererContextObserved) {
|
|
79
|
-
unavailableEventFamilies.add("preload");
|
|
80
|
-
unavailableEventFamilies.add("renderer-ipc");
|
|
81
|
-
}
|
|
82
|
-
return {
|
|
83
|
-
status: hookSnapshot.hook_error ? "hook_conflict" : "partial_attach",
|
|
84
|
-
observed_event_families: observedEventFamilies,
|
|
85
|
-
unavailable_event_families: [...unavailableEventFamilies].sort(),
|
|
86
|
-
observed_roles: observedRoles,
|
|
87
|
-
pre_capture_activity: "unavailable",
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
19
|
/** Launch an owned Electron application through the official Playwright API. */
|
|
91
20
|
export class PlaywrightElectronActiveProvider {
|
|
21
|
+
environment;
|
|
22
|
+
launch;
|
|
23
|
+
constructor(environment, launch = (options) => electron.launch(options)) {
|
|
24
|
+
this.environment = environment;
|
|
25
|
+
this.launch = launch;
|
|
26
|
+
}
|
|
92
27
|
identity() {
|
|
93
28
|
return PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY;
|
|
94
29
|
}
|
|
@@ -96,6 +31,10 @@ export class PlaywrightElectronActiveProvider {
|
|
|
96
31
|
let application;
|
|
97
32
|
let ownership;
|
|
98
33
|
let lineage;
|
|
34
|
+
let capture;
|
|
35
|
+
let paths;
|
|
36
|
+
let initialState;
|
|
37
|
+
let actions = [];
|
|
99
38
|
let outcome;
|
|
100
39
|
const runId = randomUUID();
|
|
101
40
|
try {
|
|
@@ -103,14 +42,14 @@ export class PlaywrightElectronActiveProvider {
|
|
|
103
42
|
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
104
43
|
await prepareProcessOwnershipInspection(options.signal);
|
|
105
44
|
const startupDeadline = Date.now() + STARTUP_TIMEOUT_MS;
|
|
106
|
-
|
|
45
|
+
paths = await canonicalPaths(input);
|
|
107
46
|
const captureBaseline = await systemProcessOwnershipHost.captureBaseline?.(options.signal);
|
|
108
47
|
if (options.signal?.aborted)
|
|
109
48
|
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
110
|
-
application = await
|
|
49
|
+
application = await this.launch({
|
|
111
50
|
executablePath: paths.executable,
|
|
112
51
|
cwd: paths.root,
|
|
113
|
-
env: safeElectronEnvironment(runId),
|
|
52
|
+
env: safeElectronEnvironment(this.environment, runId),
|
|
114
53
|
args: ["-r", hookPath, paths.application, ...input.args],
|
|
115
54
|
timeout: Math.max(1, startupDeadline - Date.now()),
|
|
116
55
|
});
|
|
@@ -128,20 +67,53 @@ export class PlaywrightElectronActiveProvider {
|
|
|
128
67
|
sweepTokenOwnedProcesses: true,
|
|
129
68
|
...(captureBaseline === undefined ? {} : { captureBaseline }),
|
|
130
69
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
70
|
+
lineage = await observeOwnedProcessLineage(ownership);
|
|
71
|
+
initialState = await readApplicationState(application);
|
|
72
|
+
actions = await runElectronActions(application, input, options);
|
|
73
|
+
const state = await runWithExecutionLimits(readApplicationState(application), undefined, options.signal?.aborted ? Date.now() + 5_000 : undefined);
|
|
74
|
+
capture = projectElectronActiveCapture(paths, actions, state);
|
|
75
|
+
outcome = options.signal?.aborted
|
|
76
|
+
? err(new BrowserObservationError(OPERATION, "cancelled", {
|
|
77
|
+
partialObservation: {
|
|
78
|
+
kind: "electron-active-observation",
|
|
79
|
+
capture,
|
|
80
|
+
},
|
|
81
|
+
}))
|
|
82
|
+
: ok(capture);
|
|
134
83
|
}
|
|
135
84
|
catch (cause) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
85
|
+
if (options.signal?.aborted &&
|
|
86
|
+
paths !== undefined &&
|
|
87
|
+
initialState !== undefined) {
|
|
88
|
+
const retainedCapture = projectElectronActiveCapture(paths, actions, initialState);
|
|
89
|
+
capture = {
|
|
90
|
+
...retainedCapture,
|
|
91
|
+
limitations: [
|
|
92
|
+
...retainedCapture.limitations,
|
|
93
|
+
`Final Electron state was unavailable after cancellation: ${cause instanceof Error ? cause.message : String(cause)}. Windows, metrics, IPC, and timeline are the snapshot collected before actions and may omit their effects.`,
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
outcome = err(options.signal?.aborted === true
|
|
98
|
+
? new BrowserObservationError(OPERATION, "cancelled", {
|
|
99
|
+
cause,
|
|
100
|
+
...(capture === undefined
|
|
101
|
+
? {}
|
|
102
|
+
: {
|
|
103
|
+
partialObservation: {
|
|
104
|
+
kind: "electron-active-observation",
|
|
105
|
+
capture,
|
|
106
|
+
},
|
|
107
|
+
}),
|
|
108
|
+
})
|
|
140
109
|
: providerError(cause));
|
|
141
110
|
}
|
|
142
111
|
if (application !== undefined) {
|
|
143
|
-
if (ownership !== undefined)
|
|
144
|
-
|
|
112
|
+
if (ownership !== undefined) {
|
|
113
|
+
const currentLineage = await observeOwnedProcessLineage(ownership);
|
|
114
|
+
if (currentLineage.status === "verified" || lineage === undefined)
|
|
115
|
+
lineage = currentLineage;
|
|
116
|
+
}
|
|
145
117
|
let closeError;
|
|
146
118
|
try {
|
|
147
119
|
await runWithExecutionLimits(application.close(), undefined, Date.now() + 5_000);
|
|
@@ -156,11 +128,55 @@ export class PlaywrightElectronActiveProvider {
|
|
|
156
128
|
}
|
|
157
129
|
: await cleanupElectronProcesses(ownership, lineage);
|
|
158
130
|
if (!cleanup.cleaned)
|
|
159
|
-
return err(
|
|
160
|
-
cause: new Error(cleanup.reason),
|
|
161
|
-
|
|
131
|
+
return err(new BrowserObservationError(OPERATION, "cleanup_failed", {
|
|
132
|
+
cause: outcome.ok ? new Error(cleanup.reason) : outcome.error,
|
|
133
|
+
detail: `Electron cleanup could not be verified: ${cleanup.reason}.${capture !== undefined ? " Collected observations are retained in partial_observation." : ""}${outcome.ok ? "" : ` Capture also failed: ${outcome.error.message}.`} Inspect the reported process resources before launching another capture.`,
|
|
134
|
+
cleanup: {
|
|
135
|
+
reason: cleanup.reason,
|
|
136
|
+
resources: ownership === undefined
|
|
137
|
+
? ["owned_process_group"]
|
|
138
|
+
: [
|
|
139
|
+
"owned_process_group",
|
|
140
|
+
`run:${ownership.runId}`,
|
|
141
|
+
`process-group:${String(ownership.processGroupId)}`,
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
...(capture !== undefined
|
|
145
|
+
? {
|
|
146
|
+
partialObservation: {
|
|
147
|
+
kind: "electron-active-observation",
|
|
148
|
+
capture: {
|
|
149
|
+
...capture,
|
|
150
|
+
application: {
|
|
151
|
+
...capture.application,
|
|
152
|
+
cleanup: "unverified",
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
: {}),
|
|
158
|
+
}));
|
|
162
159
|
if (closeError !== undefined)
|
|
163
|
-
return err(
|
|
160
|
+
return err(new BrowserObservationError(OPERATION, "cleanup_failed", {
|
|
161
|
+
cause: outcome.ok ? closeError : outcome.error,
|
|
162
|
+
detail: `Electron transport teardown failed after process cleanup: ${closeError instanceof Error ? closeError.message : String(closeError)}.${capture !== undefined ? " Collected observations are retained in partial_observation." : ""}${outcome.ok ? "" : ` Capture also failed: ${outcome.error.message}.`}`,
|
|
163
|
+
...(capture !== undefined
|
|
164
|
+
? {
|
|
165
|
+
partialObservation: {
|
|
166
|
+
kind: "electron-active-observation",
|
|
167
|
+
capture,
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
: {}),
|
|
171
|
+
}));
|
|
172
|
+
if (outcome.ok && cleanup.unverified !== undefined)
|
|
173
|
+
outcome = ok({
|
|
174
|
+
...outcome.value,
|
|
175
|
+
limitations: [
|
|
176
|
+
...outcome.value.limitations,
|
|
177
|
+
...cleanup.unverified.map(({ pid, diagnostic }) => `Ownership of unrelated process ${String(pid)} could not be verified; it was left untouched: ${diagnostic}`),
|
|
178
|
+
],
|
|
179
|
+
});
|
|
164
180
|
}
|
|
165
181
|
return outcome;
|
|
166
182
|
}
|
|
@@ -196,6 +212,7 @@ const cleanupElectronProcesses = async (ownership, lineage) => {
|
|
|
196
212
|
process_group_id: processGroupId,
|
|
197
213
|
})));
|
|
198
214
|
let signaled = false;
|
|
215
|
+
const unverified = [];
|
|
199
216
|
for (const processGroupId of groupIds) {
|
|
200
217
|
const cleanupOwnership = processGroupId === ownership.processGroupId
|
|
201
218
|
? { ...ownership, leaderPid: processGroupId, processGroupId }
|
|
@@ -208,49 +225,32 @@ const cleanupElectronProcesses = async (ownership, lineage) => {
|
|
|
208
225
|
if (!result.cleaned)
|
|
209
226
|
return result;
|
|
210
227
|
signaled ||= result.signaled;
|
|
228
|
+
unverified.push(...(result.unverified ?? []));
|
|
211
229
|
}
|
|
212
|
-
const remaining = await verifyNoTokenOwnedProcesses(ownership.runId, undefined, ownership.captureBaseline
|
|
230
|
+
const remaining = await verifyNoTokenOwnedProcesses(ownership.runId, undefined, ownership.captureBaseline, {
|
|
231
|
+
leaderPid: ownership.leaderPid,
|
|
232
|
+
processGroupId: ownership.processGroupId,
|
|
233
|
+
...(ownership.sampledProcessGroupIds === undefined
|
|
234
|
+
? {}
|
|
235
|
+
: { sampledProcessGroupIds: ownership.sampledProcessGroupIds }),
|
|
236
|
+
});
|
|
213
237
|
if (!remaining.cleaned)
|
|
214
238
|
return remaining;
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
processes: {
|
|
231
|
-
items: state.metrics,
|
|
232
|
-
},
|
|
233
|
-
ipc: {
|
|
234
|
-
events: ipcEvents,
|
|
235
|
-
observed: hookSnapshot.observed_ipc,
|
|
236
|
-
},
|
|
237
|
-
timeline: {
|
|
238
|
-
events: hookSnapshot.events,
|
|
239
|
-
observed: hookSnapshot.observed,
|
|
240
|
-
},
|
|
241
|
-
coverage: createCoverage(hookSnapshot),
|
|
242
|
-
limitations: [
|
|
243
|
-
"IPC payloads are represented by value shapes; payload values are never retained.",
|
|
244
|
-
"IPC direction and sender/receiver identifiers are observed only where Electron exposes them at the hooked boundary.",
|
|
245
|
-
"The runtime timeline records lifecycle, navigation, shell, permission, popup, download, protocol, preload, native-addon, process, and IPC events; activity before hook installation is unavailable.",
|
|
246
|
-
"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.",
|
|
247
|
-
"Process metrics are an Electron API snapshot and do not prove hostile-local-user isolation.",
|
|
248
|
-
"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.",
|
|
249
|
-
...(hookSnapshot.hook_error
|
|
250
|
-
? ["The active IPC hook could not be installed."]
|
|
251
|
-
: []),
|
|
252
|
-
],
|
|
253
|
-
});
|
|
239
|
+
unverified.push(...(remaining.unverified ?? []));
|
|
240
|
+
return {
|
|
241
|
+
cleaned: true,
|
|
242
|
+
signaled,
|
|
243
|
+
...(unverified.length === 0
|
|
244
|
+
? {}
|
|
245
|
+
: {
|
|
246
|
+
unverified: [
|
|
247
|
+
...new Map(unverified.map((item) => [
|
|
248
|
+
`${String(item.pid)}:${item.diagnostic}`,
|
|
249
|
+
item,
|
|
250
|
+
])).values(),
|
|
251
|
+
],
|
|
252
|
+
}),
|
|
253
|
+
};
|
|
254
254
|
};
|
|
255
255
|
const canonicalPaths = async (input) => {
|
|
256
256
|
const [executable, application] = await Promise.all([
|
|
@@ -262,7 +262,7 @@ const canonicalPaths = async (input) => {
|
|
|
262
262
|
: await realpath(input.application_root);
|
|
263
263
|
return { executable, application, root };
|
|
264
264
|
};
|
|
265
|
-
const safeElectronEnvironment = (runId) => Object.fromEntries([
|
|
265
|
+
const safeElectronEnvironment = (environment, runId) => Object.fromEntries([
|
|
266
266
|
...[
|
|
267
267
|
"HOME",
|
|
268
268
|
"LANG",
|
|
@@ -273,7 +273,7 @@ const safeElectronEnvironment = (runId) => Object.fromEntries([
|
|
|
273
273
|
"DISPLAY",
|
|
274
274
|
"WAYLAND_DISPLAY",
|
|
275
275
|
]
|
|
276
|
-
.map((name) => [name,
|
|
276
|
+
.map((name) => [name, environment[name]])
|
|
277
277
|
.filter((entry) => entry[1] !== undefined),
|
|
278
278
|
["REA_PROCESS_RUN_ID", runId],
|
|
279
279
|
]);
|
|
@@ -281,4 +281,7 @@ const providerError = (cause) => cause instanceof AnalysisError
|
|
|
281
281
|
? cause
|
|
282
282
|
: new ProviderAdapterError(PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY.id, OPERATION, {
|
|
283
283
|
cause,
|
|
284
|
+
diagnostics: {
|
|
285
|
+
message: cause instanceof Error ? cause.message : String(cause),
|
|
286
|
+
},
|
|
284
287
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { browserStepArtifactsSchema, } from "../domain/
|
|
3
|
+
import { browserStepArtifactsSchema, } from "../domain/browserScenarioCaptureValues.js";
|
|
4
4
|
const historyValueSchema = z.strictObject({
|
|
5
5
|
length: z.number().int().min(0),
|
|
6
6
|
navigation_entries: z.array(z.strictObject({
|