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.
Files changed (507) hide show
  1. package/README.md +168 -655
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +173 -47
  4. package/bridge/hopper_bridge.py +310 -128
  5. package/bridge/mitmproxy/capture.py +208 -0
  6. package/bridge/native/rea_lldb_tracer.py +839 -0
  7. package/bridge/process/ProcessRunTokenReader.swift +297 -0
  8. package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
  9. package/bridge/pwndbg/core_context.py +101 -0
  10. package/bridge/pwndbg/launch.py +39 -0
  11. package/bridge/pwndbg/launch_impl.py +34 -0
  12. package/bridge/pwntools/decoder_runtime.py +59 -0
  13. package/bridge/pwntools/layout.py +39 -0
  14. package/bridge/pwntools/layout_impl.py +309 -0
  15. package/bridge/pwntools/recorded_crash.py +39 -0
  16. package/bridge/pwntools/recorded_crash_impl.py +147 -0
  17. package/dist/android/JadxConfiguration.js +196 -33
  18. package/dist/android/JadxMcpTransport.js +4 -0
  19. package/dist/android/JadxProtocol.js +6 -0
  20. package/dist/android/JadxProvider.js +20 -2
  21. package/dist/android/JadxSession.js +23 -4
  22. package/dist/application/AnalysisContextQueries.js +8 -35
  23. package/dist/application/AnalysisDocument.js +32 -0
  24. package/dist/application/AppBundleExecutable.js +67 -21
  25. package/dist/application/CallPathTracing.js +19 -3
  26. package/dist/application/CapabilityInventory.js +27 -3
  27. package/dist/application/ClientConfigurationDocument.js +871 -6
  28. package/dist/application/ClientRegistrationIdentity.js +26 -5
  29. package/dist/application/ClientRegistrationStatus.js +29 -14
  30. package/dist/application/DirectAnalysis.js +97 -33
  31. package/dist/application/Doctor.js +4 -2
  32. package/dist/application/DoctorScope.js +25 -13
  33. package/dist/application/EnhancedLiteralTracing.js +22 -25
  34. package/dist/application/EnhancedTools.js +13 -11
  35. package/dist/application/EvidenceBundleFiles.js +24 -12
  36. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  37. package/dist/application/InventoryProjectionEvidence.js +4 -3
  38. package/dist/application/InvestigationProviders.js +3 -2
  39. package/dist/application/JsonFiles.js +50 -28
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/ReconstructionCoverageService.js +7 -4
  42. package/dist/application/ReconstructionObligationCandidates.js +5 -1
  43. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  44. package/dist/application/Setup.js +13 -1
  45. package/dist/application/SetupClientConfiguration.js +10 -15
  46. package/dist/application/SetupHost.js +5 -2
  47. package/dist/application/SetupPlan.js +5 -3
  48. package/dist/application/SupportedClients.js +34 -1
  49. package/dist/application/Uninstall.js +4 -3
  50. package/dist/application/Update.js +18 -3
  51. package/dist/application/UpdateRuntime.js +46 -25
  52. package/dist/application/WebModuleTraceService.js +4 -2
  53. package/dist/application/WebNetworkCapturePort.js +1 -0
  54. package/dist/application/WebNetworkCaptureService.js +134 -0
  55. package/dist/application/WebRuntimeService.js +5 -3
  56. package/dist/application/WebScriptExportService.js +2 -2
  57. package/dist/application/WebSourceLocationService.js +4 -2
  58. package/dist/application/WindowsCapabilities.js +1 -1
  59. package/dist/application/WorkflowEvidence.js +82 -0
  60. package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
  61. package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
  62. package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
  63. package/dist/application/binary/BinarySession.js +131 -76
  64. package/dist/application/binary/BinarySessionOpen.js +19 -6
  65. package/dist/application/binary/BinarySessionRecords.js +45 -3
  66. package/dist/application/binary/BinarySessionStatus.js +17 -1
  67. package/dist/application/binary/CompositeProvider.js +13 -0
  68. package/dist/application/binary/LazyAnalysisProvider.js +3 -0
  69. package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
  70. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
  71. package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
  72. package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
  73. package/dist/application/evm/EvmInterfacePort.js +1 -0
  74. package/dist/application/evm/EvmInterfaceService.js +64 -0
  75. package/dist/application/investigation/EvidenceLedger.js +21 -7
  76. package/dist/application/investigation/InvestigationRecords.js +8 -0
  77. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  78. package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
  79. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  80. package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
  81. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  82. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
  83. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
  84. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
  85. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
  86. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  89. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
  90. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  91. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
  92. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
  93. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
  94. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
  95. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
  96. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
  97. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
  98. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
  99. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
  100. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
  101. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  102. package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
  103. package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
  104. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  105. package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
  106. package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
  107. package/dist/application/workflowInputError.js +18 -0
  108. package/dist/artifacts/ArtifactProvider.js +42 -5
  109. package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
  110. package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
  111. package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
  112. package/dist/artifacts/ZipArtifactReader.js +3 -0
  113. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
  114. package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
  115. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  116. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  117. package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
  118. package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
  119. package/dist/artifacts/apple/NibArchive.js +81 -14
  120. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  121. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  122. package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
  123. package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
  124. package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
  125. package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
  126. package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
  127. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
  128. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
  129. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  130. package/dist/artifacts/readStableArtifact.js +20 -4
  131. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  132. package/dist/browser/CdpCaptureEventHandlers.js +165 -12
  133. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  134. package/dist/browser/CdpCaptureEvents.js +34 -0
  135. package/dist/browser/CdpConnection.js +30 -11
  136. package/dist/browser/CdpOptionalCommand.js +2 -3
  137. package/dist/browser/CdpPageCapture.js +23 -1
  138. package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
  139. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  140. package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
  141. package/dist/browser/WebSourceMapFetcher.js +426 -72
  142. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  143. package/dist/browser/history/CaptureFailures.js +137 -0
  144. package/dist/browser/history/CaptureFormatError.js +10 -0
  145. package/dist/browser/history/CaptureRedaction.js +65 -0
  146. package/dist/browser/history/CaptureRelease.js +17 -0
  147. package/dist/browser/history/HarCapture.js +165 -0
  148. package/dist/browser/history/HarCaptureAdapter.js +20 -0
  149. package/dist/browser/history/HarCaptureProcess.js +57 -0
  150. package/dist/browser/history/HarJson.js +92 -0
  151. package/dist/browser/history/HarSchema.js +72 -0
  152. package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
  153. package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
  154. package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
  155. package/dist/cli/analysisSelector.js +23 -0
  156. package/dist/cli/applicationCommands.js +2 -3
  157. package/dist/cli/artifactCommands.js +26 -1
  158. package/dist/cli/binaryDiagnosticsCommands.js +39 -0
  159. package/dist/cli/coreAnalysisCommands.js +2 -2
  160. package/dist/cli/coreBinaryCommands.js +78 -20
  161. package/dist/cli/electronCommands.js +21 -13
  162. package/dist/cli/evmCommands.js +24 -0
  163. package/dist/cli/firmwareCommands.js +6 -3
  164. package/dist/cli/javascriptApplicationAnalysis.js +20 -3
  165. package/dist/cli/jsonOutput.js +38 -0
  166. package/dist/cli/nativeCallCommands.js +34 -0
  167. package/dist/cli/processCommands.js +1 -1
  168. package/dist/cli/streamedJsonOutput.js +56 -0
  169. package/dist/cli/utilityCommands.js +2 -0
  170. package/dist/cli/webNetworkCaptureCommands.js +40 -0
  171. package/dist/cli/webRuntimeCommands.js +8 -8
  172. package/dist/cli.js +11 -4
  173. package/dist/cliBrowserScenarioCommands.js +2 -2
  174. package/dist/cliCommandNames.js +6 -1
  175. package/dist/cliJsonInput.js +35 -1
  176. package/dist/cliOutput.js +21 -6
  177. package/dist/composition/binaryDiagnostics.js +8 -0
  178. package/dist/composition/evm.js +4 -0
  179. package/dist/composition/webNetworkCaptures.js +6 -0
  180. package/dist/config/environment.js +4 -0
  181. package/dist/config/ghidraStartupTimeout.js +17 -0
  182. package/dist/config/mcpResponseBudget.js +22 -0
  183. package/dist/config/parseConfig.js +2 -1
  184. package/dist/contracts/artifactToolContracts.js +6 -0
  185. package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
  186. package/dist/contracts/browserToolContracts.js +4 -3
  187. package/dist/contracts/enhancedInputs.js +5 -3
  188. package/dist/contracts/enhancedToolContracts.js +3 -3
  189. package/dist/contracts/errorSchemas.js +8 -1
  190. package/dist/contracts/evm/evmToolContracts.js +20 -0
  191. package/dist/contracts/hopperMemoryContracts.js +2 -5
  192. package/dist/contracts/investigationExamples.js +2 -2
  193. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  194. package/dist/contracts/managed/managedToolContracts.js +8 -6
  195. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
  196. package/dist/contracts/native/nativeToolContracts.js +21 -3
  197. package/dist/contracts/officialToolContracts.js +26 -24
  198. package/dist/contracts/process/processCaptureExample.js +2 -0
  199. package/dist/contracts/promptContracts.js +3 -3
  200. package/dist/contracts/sessionLifecycleInputs.js +18 -5
  201. package/dist/contracts/sessionStatusContract.js +8 -2
  202. package/dist/contracts/sessionToolContracts.js +8 -3
  203. package/dist/contracts/sessionToolSchemas.js +8 -4
  204. package/dist/contracts/toolContractExamples.js +1 -2
  205. package/dist/contracts/toolContractHelpers.js +4 -1
  206. package/dist/contracts/toolContracts.js +6 -0
  207. package/dist/contracts/toolEffects.js +30 -1
  208. package/dist/contracts/toolOutputSchemaGroups.js +33 -28
  209. package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
  210. package/dist/contracts/toolSchemaMetadata.js +69 -10
  211. package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
  212. package/dist/domain/analysisErrorBase.js +22 -2
  213. package/dist/domain/analysisErrorCore.js +61 -5
  214. package/dist/domain/analysisErrorPresentation.js +95 -12
  215. package/dist/domain/analysisErrorProjection.js +148 -19
  216. package/dist/domain/analysisSnapshot.js +166 -2
  217. package/dist/domain/android/androidAnalysis.js +2 -4
  218. package/dist/domain/android/androidApplication.js +17 -9
  219. package/dist/domain/apple/appleApplication.js +41 -14
  220. package/dist/domain/apple/dyldEnvironment.js +73 -0
  221. package/dist/domain/apple/dyldPaths.js +81 -0
  222. package/dist/domain/apple/dylibResolution.js +478 -0
  223. package/dist/domain/apple/dylibResolutionFindings.js +77 -0
  224. package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
  225. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  226. package/dist/domain/apple/keyedArchive.js +9 -1
  227. package/dist/domain/apple/machoContainer.js +54 -0
  228. package/dist/domain/apple/plistNumbers.js +76 -0
  229. package/dist/domain/artifactIdentity.js +29 -0
  230. package/dist/domain/artifactInventoryEvidence.js +19 -24
  231. package/dist/domain/artifactPathSyntax.js +1 -1
  232. package/dist/domain/bridgeCandidateProjection.js +71 -0
  233. package/dist/domain/browserCompleteness.js +1 -0
  234. package/dist/domain/browserObservation.js +1 -1
  235. package/dist/domain/browserObservationError.js +24 -5
  236. package/dist/domain/browserObservationSchemas.js +13 -0
  237. package/dist/domain/browserScenarioValues.js +5 -2
  238. package/dist/domain/bundleComparison.js +3 -2
  239. package/dist/domain/callPathSchemas.js +1 -1
  240. package/dist/domain/canonicalDigest.js +13 -1
  241. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  242. package/dist/domain/canonicalOrdering.js +9 -5
  243. package/dist/domain/changedBehavior.js +9 -9
  244. package/dist/domain/comparisonSourceEvidence.js +40 -0
  245. package/dist/domain/comparisonStatus.js +2 -30
  246. package/dist/domain/configurationErrors.js +1 -1
  247. package/dist/domain/conformanceTrustGate.js +0 -16
  248. package/dist/domain/evidence.js +78 -11
  249. package/dist/domain/evidenceBundle.js +42 -1
  250. package/dist/domain/evidenceErrors.js +12 -1
  251. package/dist/domain/evm/evmInterface.js +63 -0
  252. package/dist/domain/explicitSensitiveFailure.js +108 -0
  253. package/dist/domain/explicitSensitiveValues.js +10 -0
  254. package/dist/domain/firmware/firmwareAnalysis.js +10 -4
  255. package/dist/domain/hopperErrors.js +23 -2
  256. package/dist/domain/hopperValues.js +51 -8
  257. package/dist/domain/immutableJson.js +114 -0
  258. package/dist/domain/inputIssueProjection.js +3 -0
  259. package/dist/domain/javascript/electronActiveObservation.js +37 -6
  260. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  261. package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
  262. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  263. package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
  264. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  265. package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
  266. package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
  267. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  268. package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
  269. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  270. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  271. package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
  272. package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
  273. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  274. package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
  275. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  276. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  277. package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
  278. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  279. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  280. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  281. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
  282. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  283. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
  284. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  285. package/dist/domain/jsonSerialization.js +109 -0
  286. package/dist/domain/jsonValue.js +91 -3
  287. package/dist/domain/localPath.js +8 -0
  288. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  289. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  290. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  291. package/dist/domain/managed/managedNativeVerification.js +3 -9
  292. package/dist/domain/native/binaryLayout.js +357 -0
  293. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  294. package/dist/domain/native/nativeCallObservation.js +186 -0
  295. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  296. package/dist/domain/native/objcSwiftMetadata.js +0 -39
  297. package/dist/domain/native/recordedCrash.js +266 -0
  298. package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
  299. package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
  300. package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
  301. package/dist/domain/process/processCaptureParsing.js +54 -0
  302. package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
  303. package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
  304. package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
  305. package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
  306. package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
  307. package/dist/domain/propertyListKeys.js +1 -1
  308. package/dist/domain/propertyListXmlText.js +19 -0
  309. package/dist/domain/providerAdapterError.js +1 -1
  310. package/dist/domain/providerOperationHealth.js +54 -0
  311. package/dist/domain/providerSelectionError.js +4 -2
  312. package/dist/domain/reconstructionVerification.js +9 -46
  313. package/dist/domain/reconstructionVerificationSchemas.js +3 -3
  314. package/dist/domain/residualUnknown.js +3 -2
  315. package/dist/domain/staticRuntimeCorrelation.js +9 -46
  316. package/dist/domain/webBundleAnalysis.js +20 -8
  317. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  318. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  319. package/dist/domain/webCaptureDiff.js +1 -0
  320. package/dist/domain/webNetworkCapture.js +118 -0
  321. package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
  322. package/dist/domain/webRuntime.js +19 -5
  323. package/dist/domain/webSourceLocation.js +1 -0
  324. package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
  325. package/dist/dotnet/ManagedMemberInspector.js +4 -2
  326. package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
  327. package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
  328. package/dist/dotnet/ManagedMemberRows.js +14 -3
  329. package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
  330. package/dist/dotnet/ManagedMetadataInventory.js +38 -28
  331. package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
  332. package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
  333. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
  334. package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
  335. package/dist/dotnet/ManagedPeReader.js +11 -0
  336. package/dist/evm/EvmBytecodeCarrier.js +21 -0
  337. package/dist/evm/EvmWorkerLimits.js +40 -0
  338. package/dist/evm/EvmoleFailures.js +126 -0
  339. package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
  340. package/dist/evm/EvmoleInterfaceProvider.js +273 -0
  341. package/dist/evm/EvmoleInterfaceWorker.js +87 -0
  342. package/dist/evm/EvmoleRelease.js +16 -0
  343. package/dist/firmware/FirmwareCommand.js +1 -0
  344. package/dist/firmware/FirmwareFiles.js +1 -1
  345. package/dist/generatedPackageMetadata.js +2 -2
  346. package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
  347. package/dist/ghidra/GhidraClient.js +47 -14
  348. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  349. package/dist/ghidra/GhidraFunctionValues.js +10 -7
  350. package/dist/ghidra/GhidraInstallation.js +18 -21
  351. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  352. package/dist/ghidra/GhidraJavaLaunch.js +62 -0
  353. package/dist/ghidra/GhidraLauncher.js +34 -16
  354. package/dist/ghidra/GhidraProvider.js +2 -2
  355. package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
  356. package/dist/ghidra/GhidraProviderClient.js +23 -12
  357. package/dist/ghidra/GhidraSessionError.js +11 -7
  358. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  359. package/dist/ghidra/GhidraTransport.js +20 -0
  360. package/dist/hopper/BridgeLauncher.js +33 -11
  361. package/dist/hopper/HopperAnalysisProfile.js +62 -4
  362. package/dist/hopper/HopperCleanup.js +15 -3
  363. package/dist/hopper/HopperClient.js +222 -14
  364. package/dist/hopper/HopperFileOffset.js +237 -0
  365. package/dist/hopper/HopperMachOImage.js +196 -0
  366. package/dist/hopper/HopperOperationStage.js +6 -0
  367. package/dist/hopper/HopperProvider.js +63 -9
  368. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  369. package/dist/hopper/HopperRegexSearch.js +137 -0
  370. package/dist/hopper/HopperRegexWorker.js +27 -0
  371. package/dist/hopper/HopperRequestQueue.js +68 -19
  372. package/dist/hopper/HopperTargetLease.js +3 -2
  373. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
  374. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  375. package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
  376. package/dist/inspector/V8InspectorProvider.js +47 -11
  377. package/dist/javascript/recovery/WakaruCommand.js +3 -0
  378. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  379. package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
  380. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  381. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  382. package/dist/mcpDoctor.js +62 -2
  383. package/dist/native/AppleDispatchCoverage.js +47 -6
  384. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  385. package/dist/native/AppleDispatchMetadata.js +6 -3
  386. package/dist/native/AppleMachoFixups.js +48 -24
  387. package/dist/native/AppleMachoSelection.js +32 -16
  388. package/dist/native/AppleObjcCategories.js +6 -2
  389. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  390. package/dist/native/AppleObjcProperties.js +2 -1
  391. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  392. package/dist/native/AppleSwiftVtables.js +21 -15
  393. package/dist/native/CommandRunner.js +82 -84
  394. package/dist/native/LldbCallTracer.js +541 -0
  395. package/dist/native/LldbRetainedObservations.js +178 -0
  396. package/dist/native/NativeCallObservation.js +194 -0
  397. package/dist/native/NativeMacOSProvider.js +117 -20
  398. package/dist/native/NativeMacOSProviderMetadata.js +8 -3
  399. package/dist/native/SignatureTargetBinding.js +155 -0
  400. package/dist/native/parsers/lipo.js +71 -1
  401. package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
  402. package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
  403. package/dist/native/pwntools/PwntoolsFailures.js +180 -0
  404. package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
  405. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
  406. package/dist/native/pwntools/PwntoolsRelease.js +19 -0
  407. package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
  408. package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
  409. package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
  410. package/dist/process/DarwinProcessRunTokenReader.js +293 -0
  411. package/dist/process/ExecFileOutput.js +20 -0
  412. package/dist/process/OwnedCommand.js +118 -0
  413. package/dist/process/ProcessOwnership.js +431 -51
  414. package/dist/process/ProcessOwnershipObservation.js +209 -27
  415. package/dist/process/ProviderProcess.js +68 -10
  416. package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
  417. package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
  418. package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
  419. package/dist/{application → process/capture}/ProcessHarness.js +195 -29
  420. package/dist/{application → process/capture}/ProcessSampling.js +2 -2
  421. package/dist/server/EvidenceMcpServer.js +146 -0
  422. package/dist/server/createServer.js +37 -8
  423. package/dist/server/promptCompletion.js +10 -3
  424. package/dist/server/registerAndroidTools.js +2 -4
  425. package/dist/server/registerApplicationTools/helpers.js +2 -4
  426. package/dist/server/registerArtifactComparisonTool.js +11 -7
  427. package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
  428. package/dist/server/registerBrowserScenarioTool.js +2 -4
  429. package/dist/server/registerBrowserTools.js +2 -4
  430. package/dist/server/registerBundleComparisonTool.js +2 -3
  431. package/dist/server/registerCloseLifecycleTool.js +8 -18
  432. package/dist/server/registerElectronTools.js +2 -4
  433. package/dist/server/registerEnhancedTools.js +18 -59
  434. package/dist/server/registerEvidenceTools.js +3 -5
  435. package/dist/server/registerEvmTools.js +15 -0
  436. package/dist/server/registerFirmwareTools.js +2 -4
  437. package/dist/server/registerFunctionComparisonTool.js +10 -6
  438. package/dist/server/registerInvestigationTools.js +7 -7
  439. package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
  440. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
  441. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
  442. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
  443. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
  444. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
  445. package/dist/server/registerOfficialTools.js +2 -4
  446. package/dist/server/registerProcessComparisonTool.js +72 -46
  447. package/dist/server/registerRecordedCrashTools.js +15 -0
  448. package/dist/server/registerSessionRecordTools.js +5 -6
  449. package/dist/server/registerSessionStatusTool.js +17 -3
  450. package/dist/server/registerSessionTools.js +13 -5
  451. package/dist/server/registerWebModuleTool.js +2 -4
  452. package/dist/server/registerWebNetworkCaptureTool.js +26 -0
  453. package/dist/server/registerWebRuntimeTools.js +3 -7
  454. package/dist/server/registerWebScriptTool.js +2 -4
  455. package/dist/server/registerWebSourceLocationTool.js +2 -4
  456. package/dist/server/runDerivedOperation.js +15 -3
  457. package/dist/server/sessionAvailabilityPolicy.js +3 -1
  458. package/dist/server/sessionToolPolicies.js +1 -1
  459. package/dist/server/toolRegistrationOptions.js +2 -2
  460. package/dist/server/toolResult.js +63 -11
  461. package/dist/server/toolResultEncoding.js +33 -0
  462. package/install.sh +1 -1
  463. package/native/windows/build/manifest.json +2 -2
  464. package/native/windows/build/rea-windows-x64.node +0 -0
  465. package/package.json +42 -9
  466. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  467. package/scripts/electron-active-hook.cjs +241 -37
  468. package/scripts/rea.mjs +11 -3
  469. package/skills/reverse-engineer-anything/SKILL.md +32 -4
  470. package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
  471. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
  472. package/third_party/README.md +60 -0
  473. package/third_party/evmole/LICENSE +21 -0
  474. package/third_party/evmole/README.md +22 -0
  475. package/third_party/pwndbg/LICENSE.md +21 -0
  476. package/third_party/pwndbg/README.md +23 -0
  477. package/third_party/pwntools/README.md +40 -0
  478. package/dist/application/AuthorizedArtifactInventory.js +0 -7
  479. package/dist/application/ProcessCaptureLifecycle.js +0 -299
  480. package/dist/application/StoreFileLock.js +0 -124
  481. package/dist/contracts/processCaptureExample.js +0 -2
  482. package/dist/domain/bytecodeProvider.js +0 -178
  483. package/dist/domain/customProtocolCapture.js +0 -137
  484. package/dist/domain/eventProcessTree.js +0 -225
  485. package/dist/domain/mobileApplicationInvestigation.js +0 -159
  486. package/dist/domain/packageAnalysis.js +0 -123
  487. package/dist/domain/peInspection.js +0 -197
  488. package/dist/domain/processCaptureParsing.js +0 -21
  489. package/dist/domain/protocolCapture.js +0 -217
  490. package/dist/domain/runtimeIdentification.js +0 -212
  491. package/dist/generatedMcpToolCatalog.js +0 -37
  492. package/dist/ghidra/GhidraDefaults.js +0 -2
  493. /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
  494. /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
  495. /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
  496. /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
  497. /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
  498. /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
  499. /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
  500. /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
  501. /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
  502. /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
  503. /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
  504. /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
  505. /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
  506. /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
  507. /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
- const paths = await canonicalPaths(input);
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
- const actions = await runElectronActions(application, input, options);
127
- const state = await runWithExecutionLimits(readApplicationState(application), options.signal);
128
- outcome = ok(createResult(paths, input, actions, state));
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
- outcome = err(providerError(cause));
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
- lineage = await observeOwnedProcessLineage(ownership);
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(providerError(new BrowserObservationError(OPERATION, "cleanup_failed", {
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(providerError(closeError));
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
- return { cleaned: true, signaled };
207
- };
208
- const createResult = (paths, input, actions, state) => {
209
- const { hookSnapshot } = state;
210
- const ipcEvents = hookSnapshot.events.filter(({ kind }) => ipcEventKinds.has(kind));
211
- return electronActiveObservationResultSchema.parse({
212
- application: {
213
- executable_path: paths.executable,
214
- application_path: paths.application,
215
- electron_version: state.electronVersion,
216
- process_ownership: "provider-owned",
217
- cleanup: "terminated-owned-process",
218
- },
219
- actions,
220
- windows: state.windows,
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
  });