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.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. 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(hookEventSchema),
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 [pageSnapshots, windowMetadata, processMetrics, electronVersion, hookSnapshot,] = await Promise.all([
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: pageSnapshots.map((page) => {
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
- const paths = await canonicalPaths(input);
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 electron.launch({
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
- const actions = await runElectronActions(application, input, options);
132
- const state = await runWithExecutionLimits(readApplicationState(application), options.signal);
133
- outcome = ok(createResult(paths, input, actions, state));
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
- outcome = err(options.signal?.aborted === true &&
137
- (cause === options.signal.reason ||
138
- (cause instanceof Error && cause.name === "AbortError"))
139
- ? new BrowserObservationError(OPERATION, "cancelled", { cause })
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
- lineage = await observeOwnedProcessLineage(ownership);
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(providerError(new BrowserObservationError(OPERATION, "cleanup_failed", {
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(providerError(closeError));
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
- return { cleaned: true, signaled };
216
- };
217
- const createResult = (paths, input, actions, state) => {
218
- const { hookSnapshot } = state;
219
- const ipcEvents = hookSnapshot.events.filter(({ kind }) => ipcEventKinds.has(kind));
220
- return electronActiveObservationResultSchema.parse({
221
- application: {
222
- executable_path: paths.executable,
223
- application_path: paths.application,
224
- electron_version: state.electronVersion,
225
- process_ownership: "provider-owned",
226
- cleanup: "terminated-owned-process",
227
- },
228
- actions,
229
- windows: state.windows,
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, process.env[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/browserScenarioCapture.js";
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({