rea-agents 5.0.0 → 6.1.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 +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- 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/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- 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/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- 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/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- 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 +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- 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 +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- 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 +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- 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 +32 -16
- 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 +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -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,90 +3,21 @@ 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";
|
|
10
9
|
import { err, ok } from "../domain/result.js";
|
|
11
10
|
import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, verifyNoTokenOwnedProcesses, } from "../process/ProcessOwnership.js";
|
|
12
|
-
import { observeOwnedProcessLineage } from "../process/ProcessOwnershipObservation.js";
|
|
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
17
|
/** Public identity for provider-owned Electron runtime experiments. */
|
|
18
18
|
export { PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
19
19
|
import { PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
20
20
|
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
21
|
/** Launch an owned Electron application through the official Playwright API. */
|
|
91
22
|
export class PlaywrightElectronActiveProvider {
|
|
92
23
|
identity() {
|
|
@@ -96,13 +27,21 @@ export class PlaywrightElectronActiveProvider {
|
|
|
96
27
|
let application;
|
|
97
28
|
let ownership;
|
|
98
29
|
let lineage;
|
|
30
|
+
let capture;
|
|
31
|
+
let paths;
|
|
32
|
+
let initialState;
|
|
33
|
+
let actions = [];
|
|
99
34
|
let outcome;
|
|
100
35
|
const runId = randomUUID();
|
|
101
36
|
try {
|
|
102
37
|
if (options.signal?.aborted === true)
|
|
103
38
|
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
39
|
+
await prepareProcessOwnershipInspection(options.signal);
|
|
104
40
|
const startupDeadline = Date.now() + STARTUP_TIMEOUT_MS;
|
|
105
|
-
|
|
41
|
+
paths = await canonicalPaths(input);
|
|
42
|
+
const captureBaseline = await systemProcessOwnershipHost.captureBaseline?.(options.signal);
|
|
43
|
+
if (options.signal?.aborted)
|
|
44
|
+
throw new BrowserObservationError(OPERATION, "cancelled");
|
|
106
45
|
application = await electron.launch({
|
|
107
46
|
executablePath: paths.executable,
|
|
108
47
|
cwd: paths.root,
|
|
@@ -122,17 +61,55 @@ export class PlaywrightElectronActiveProvider {
|
|
|
122
61
|
expectedParentPid: process.pid,
|
|
123
62
|
expectedCommand: paths.executable,
|
|
124
63
|
sweepTokenOwnedProcesses: true,
|
|
64
|
+
...(captureBaseline === undefined ? {} : { captureBaseline }),
|
|
125
65
|
};
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
66
|
+
lineage = await observeOwnedProcessLineage(ownership);
|
|
67
|
+
initialState = await readApplicationState(application);
|
|
68
|
+
actions = await runElectronActions(application, input, options);
|
|
69
|
+
const state = await runWithExecutionLimits(readApplicationState(application), undefined, options.signal?.aborted ? Date.now() + 5_000 : undefined);
|
|
70
|
+
capture = projectElectronActiveCapture(paths, actions, state);
|
|
71
|
+
outcome = options.signal?.aborted
|
|
72
|
+
? err(new BrowserObservationError(OPERATION, "cancelled", {
|
|
73
|
+
partialObservation: {
|
|
74
|
+
kind: "electron-active-observation",
|
|
75
|
+
capture,
|
|
76
|
+
},
|
|
77
|
+
}))
|
|
78
|
+
: ok(capture);
|
|
129
79
|
}
|
|
130
80
|
catch (cause) {
|
|
131
|
-
|
|
81
|
+
if (options.signal?.aborted &&
|
|
82
|
+
paths !== undefined &&
|
|
83
|
+
initialState !== undefined) {
|
|
84
|
+
const retainedCapture = projectElectronActiveCapture(paths, actions, initialState);
|
|
85
|
+
capture = {
|
|
86
|
+
...retainedCapture,
|
|
87
|
+
limitations: [
|
|
88
|
+
...retainedCapture.limitations,
|
|
89
|
+
`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.`,
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
outcome = err(options.signal?.aborted === true
|
|
94
|
+
? new BrowserObservationError(OPERATION, "cancelled", {
|
|
95
|
+
cause,
|
|
96
|
+
...(capture === undefined
|
|
97
|
+
? {}
|
|
98
|
+
: {
|
|
99
|
+
partialObservation: {
|
|
100
|
+
kind: "electron-active-observation",
|
|
101
|
+
capture,
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
})
|
|
105
|
+
: providerError(cause));
|
|
132
106
|
}
|
|
133
107
|
if (application !== undefined) {
|
|
134
|
-
if (ownership !== undefined)
|
|
135
|
-
|
|
108
|
+
if (ownership !== undefined) {
|
|
109
|
+
const currentLineage = await observeOwnedProcessLineage(ownership);
|
|
110
|
+
if (currentLineage.status === "verified" || lineage === undefined)
|
|
111
|
+
lineage = currentLineage;
|
|
112
|
+
}
|
|
136
113
|
let closeError;
|
|
137
114
|
try {
|
|
138
115
|
await runWithExecutionLimits(application.close(), undefined, Date.now() + 5_000);
|
|
@@ -147,11 +124,55 @@ export class PlaywrightElectronActiveProvider {
|
|
|
147
124
|
}
|
|
148
125
|
: await cleanupElectronProcesses(ownership, lineage);
|
|
149
126
|
if (!cleanup.cleaned)
|
|
150
|
-
return err(
|
|
151
|
-
cause: new Error(cleanup.reason),
|
|
152
|
-
|
|
127
|
+
return err(new BrowserObservationError(OPERATION, "cleanup_failed", {
|
|
128
|
+
cause: outcome.ok ? new Error(cleanup.reason) : outcome.error,
|
|
129
|
+
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.`,
|
|
130
|
+
cleanup: {
|
|
131
|
+
reason: cleanup.reason,
|
|
132
|
+
resources: ownership === undefined
|
|
133
|
+
? ["owned_process_group"]
|
|
134
|
+
: [
|
|
135
|
+
"owned_process_group",
|
|
136
|
+
`run:${ownership.runId}`,
|
|
137
|
+
`process-group:${String(ownership.processGroupId)}`,
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
...(capture !== undefined
|
|
141
|
+
? {
|
|
142
|
+
partialObservation: {
|
|
143
|
+
kind: "electron-active-observation",
|
|
144
|
+
capture: {
|
|
145
|
+
...capture,
|
|
146
|
+
application: {
|
|
147
|
+
...capture.application,
|
|
148
|
+
cleanup: "unverified",
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
}
|
|
153
|
+
: {}),
|
|
154
|
+
}));
|
|
153
155
|
if (closeError !== undefined)
|
|
154
|
-
return err(
|
|
156
|
+
return err(new BrowserObservationError(OPERATION, "cleanup_failed", {
|
|
157
|
+
cause: outcome.ok ? closeError : outcome.error,
|
|
158
|
+
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}.`}`,
|
|
159
|
+
...(capture !== undefined
|
|
160
|
+
? {
|
|
161
|
+
partialObservation: {
|
|
162
|
+
kind: "electron-active-observation",
|
|
163
|
+
capture,
|
|
164
|
+
},
|
|
165
|
+
}
|
|
166
|
+
: {}),
|
|
167
|
+
}));
|
|
168
|
+
if (outcome.ok && cleanup.unverified !== undefined)
|
|
169
|
+
outcome = ok({
|
|
170
|
+
...outcome.value,
|
|
171
|
+
limitations: [
|
|
172
|
+
...outcome.value.limitations,
|
|
173
|
+
...cleanup.unverified.map(({ pid, diagnostic }) => `Ownership of unrelated process ${String(pid)} could not be verified; it was left untouched: ${diagnostic}`),
|
|
174
|
+
],
|
|
175
|
+
});
|
|
155
176
|
}
|
|
156
177
|
return outcome;
|
|
157
178
|
}
|
|
@@ -187,6 +208,7 @@ const cleanupElectronProcesses = async (ownership, lineage) => {
|
|
|
187
208
|
process_group_id: processGroupId,
|
|
188
209
|
})));
|
|
189
210
|
let signaled = false;
|
|
211
|
+
const unverified = [];
|
|
190
212
|
for (const processGroupId of groupIds) {
|
|
191
213
|
const cleanupOwnership = processGroupId === ownership.processGroupId
|
|
192
214
|
? { ...ownership, leaderPid: processGroupId, processGroupId }
|
|
@@ -199,49 +221,32 @@ const cleanupElectronProcesses = async (ownership, lineage) => {
|
|
|
199
221
|
if (!result.cleaned)
|
|
200
222
|
return result;
|
|
201
223
|
signaled ||= result.signaled;
|
|
224
|
+
unverified.push(...(result.unverified ?? []));
|
|
202
225
|
}
|
|
203
|
-
const remaining = await verifyNoTokenOwnedProcesses(ownership.runId
|
|
226
|
+
const remaining = await verifyNoTokenOwnedProcesses(ownership.runId, undefined, ownership.captureBaseline, {
|
|
227
|
+
leaderPid: ownership.leaderPid,
|
|
228
|
+
processGroupId: ownership.processGroupId,
|
|
229
|
+
...(ownership.sampledProcessGroupIds === undefined
|
|
230
|
+
? {}
|
|
231
|
+
: { sampledProcessGroupIds: ownership.sampledProcessGroupIds }),
|
|
232
|
+
});
|
|
204
233
|
if (!remaining.cleaned)
|
|
205
234
|
return remaining;
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
processes: {
|
|
222
|
-
items: state.metrics,
|
|
223
|
-
},
|
|
224
|
-
ipc: {
|
|
225
|
-
events: ipcEvents,
|
|
226
|
-
observed: hookSnapshot.observed_ipc,
|
|
227
|
-
},
|
|
228
|
-
timeline: {
|
|
229
|
-
events: hookSnapshot.events,
|
|
230
|
-
observed: hookSnapshot.observed,
|
|
231
|
-
},
|
|
232
|
-
coverage: createCoverage(hookSnapshot),
|
|
233
|
-
limitations: [
|
|
234
|
-
"IPC payloads are represented by value shapes; payload values are never retained.",
|
|
235
|
-
"IPC direction and sender/receiver identifiers are observed only where Electron exposes them at the hooked boundary.",
|
|
236
|
-
"The runtime timeline records lifecycle, navigation, shell, permission, popup, download, protocol, preload, native-addon, process, and IPC events; activity before hook installation is unavailable.",
|
|
237
|
-
"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.",
|
|
238
|
-
"Process metrics are an Electron API snapshot and do not prove hostile-local-user isolation.",
|
|
239
|
-
"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.",
|
|
240
|
-
...(hookSnapshot.hook_error
|
|
241
|
-
? ["The active IPC hook could not be installed."]
|
|
242
|
-
: []),
|
|
243
|
-
],
|
|
244
|
-
});
|
|
235
|
+
unverified.push(...(remaining.unverified ?? []));
|
|
236
|
+
return {
|
|
237
|
+
cleaned: true,
|
|
238
|
+
signaled,
|
|
239
|
+
...(unverified.length === 0
|
|
240
|
+
? {}
|
|
241
|
+
: {
|
|
242
|
+
unverified: [
|
|
243
|
+
...new Map(unverified.map((item) => [
|
|
244
|
+
`${String(item.pid)}:${item.diagnostic}`,
|
|
245
|
+
item,
|
|
246
|
+
])).values(),
|
|
247
|
+
],
|
|
248
|
+
}),
|
|
249
|
+
};
|
|
245
250
|
};
|
|
246
251
|
const canonicalPaths = async (input) => {
|
|
247
252
|
const [executable, application] = await Promise.all([
|
|
@@ -272,4 +277,7 @@ const providerError = (cause) => cause instanceof AnalysisError
|
|
|
272
277
|
? cause
|
|
273
278
|
: new ProviderAdapterError(PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY.id, OPERATION, {
|
|
274
279
|
cause,
|
|
280
|
+
diagnostics: {
|
|
281
|
+
message: cause instanceof Error ? cause.message : String(cause),
|
|
282
|
+
},
|
|
275
283
|
});
|