rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -0,0 +1,274 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { randomUUID } from "node:crypto";
3
+ import { fileURLToPath } from "node:url";
4
+ import { _electron as electron } from "playwright-core";
5
+ import { electronActiveObservationResultSchema, } from "../domain/electronActiveObservation.js";
6
+ import { AnalysisError, BrowserObservationError, ProviderAdapterError, } from "../domain/errors.js";
7
+ import { isPathContained } from "../domain/permissionPolicy.js";
8
+ import { err, ok } from "../domain/result.js";
9
+ import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, observeOwnedProcessLineage, selectCapturedProcessGroupIds, verifyNoTokenOwnedProcesses, } from "../process/ProcessOwnership.js";
10
+ import { runElectronActions, readApplicationState, runWithExecutionLimits, } from "./PlaywrightElectronActiveActions.js";
11
+ const OPERATION = "capture_electron_scenario";
12
+ const STARTUP_TIMEOUT_MS = 60_000;
13
+ /** Public identity for provider-owned Electron runtime experiments. */
14
+ export const PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY = Object.freeze({
15
+ id: "rea-playwright-electron-active",
16
+ name: "REA Playwright active Electron observation provider",
17
+ version: "1",
18
+ });
19
+ const hookPath = fileURLToPath(new URL("../../scripts/electron-active-hook.cjs", import.meta.url));
20
+ const observableEventFamilies = [
21
+ "app-lifecycle",
22
+ "window-lifecycle",
23
+ "web-contents-lifecycle",
24
+ "navigation",
25
+ "shell-attempt",
26
+ "process-lifecycle",
27
+ "permission",
28
+ "popup-attempt",
29
+ "download",
30
+ "protocol",
31
+ "preload",
32
+ "preload-configuration",
33
+ "renderer-ipc",
34
+ "native-addon",
35
+ "updater",
36
+ "error",
37
+ "ipc",
38
+ ];
39
+ const ipcEventKinds = new Set([
40
+ "main-handler-invocation",
41
+ "main-event-invocation",
42
+ "utility-process-fork",
43
+ "utility-process-message",
44
+ "ipc-main-to-renderer",
45
+ "ipc-utility-to-main",
46
+ "ipc-renderer-send",
47
+ "ipc-renderer-invoke",
48
+ "ipc-renderer-post-message",
49
+ ]);
50
+ const createCoverage = (hookSnapshot) => {
51
+ const observedEventFamilies = [
52
+ ...new Set(hookSnapshot.events.map(({ kind, process_type }) => {
53
+ if (kind === "preload" && process_type === "main")
54
+ return "preload-configuration";
55
+ if (kind.startsWith("ipc-renderer") && process_type !== "renderer")
56
+ return "ipc";
57
+ return ipcEventKinds.has(kind) ? "ipc" : kind;
58
+ })),
59
+ ].sort();
60
+ const unavailableEventFamilies = new Set(observableEventFamilies.filter((family) => !observedEventFamilies.includes(family)));
61
+ const observedRoles = [
62
+ ...new Set(hookSnapshot.events.flatMap(({ process_type, kind }) => [
63
+ ...(process_type === null ? [] : [process_type]),
64
+ ...(kind === "window-lifecycle" ? ["window"] : []),
65
+ ...(kind === "web-contents-lifecycle" || kind === "navigation"
66
+ ? ["web_contents"]
67
+ : []),
68
+ ...(kind === "preload" && process_type === "preload"
69
+ ? ["preload"]
70
+ : []),
71
+ ...(kind.startsWith("ipc-renderer") && process_type === "renderer"
72
+ ? ["renderer"]
73
+ : []),
74
+ ])),
75
+ ].sort();
76
+ const rendererContextObserved = hookSnapshot.events.some(({ process_type }) => process_type === "renderer" || process_type === "preload");
77
+ if (!rendererContextObserved) {
78
+ unavailableEventFamilies.add("preload");
79
+ unavailableEventFamilies.add("renderer-ipc");
80
+ }
81
+ return {
82
+ status: hookSnapshot.hook_error ? "hook_conflict" : "partial_attach",
83
+ observed_event_families: observedEventFamilies,
84
+ unavailable_event_families: [...unavailableEventFamilies].sort(),
85
+ observed_roles: observedRoles,
86
+ pre_capture_activity: "unavailable",
87
+ };
88
+ };
89
+ /** Launch an owned Electron application through the official Playwright API. */
90
+ export class PlaywrightElectronActiveProvider {
91
+ identity() {
92
+ return PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY;
93
+ }
94
+ async capture(input, options = {}) {
95
+ let application;
96
+ let ownership;
97
+ let lineage;
98
+ let outcome;
99
+ const runId = randomUUID();
100
+ try {
101
+ if (options.signal?.aborted === true)
102
+ throw new BrowserObservationError(OPERATION, "cancelled");
103
+ const startupDeadline = Date.now() + STARTUP_TIMEOUT_MS;
104
+ const paths = await canonicalPaths(input);
105
+ application = await electron.launch({
106
+ executablePath: paths.executable,
107
+ cwd: paths.root,
108
+ env: safeElectronEnvironment(runId),
109
+ args: ["-r", hookPath, paths.application, ...input.args],
110
+ timeout: Math.max(1, startupDeadline - Date.now()),
111
+ });
112
+ const leaderPid = application.process().pid;
113
+ if (typeof leaderPid !== "number" ||
114
+ !Number.isSafeInteger(leaderPid) ||
115
+ leaderPid <= 0)
116
+ throw new BrowserObservationError(OPERATION, "process_ownership_unavailable");
117
+ ownership = {
118
+ runId,
119
+ leaderPid,
120
+ processGroupId: leaderPid,
121
+ expectedParentPid: process.pid,
122
+ expectedCommand: paths.executable,
123
+ sweepTokenOwnedProcesses: true,
124
+ };
125
+ const actions = await runElectronActions(application, input, options);
126
+ const state = await runWithExecutionLimits(readApplicationState(application), options.signal);
127
+ outcome = ok(createResult(paths, input, actions, state));
128
+ }
129
+ catch (cause) {
130
+ outcome = err(providerError(cause));
131
+ }
132
+ if (application !== undefined) {
133
+ if (ownership !== undefined)
134
+ lineage = await observeOwnedProcessLineage(ownership);
135
+ let closeError;
136
+ try {
137
+ await runWithExecutionLimits(application.close(), undefined, Date.now() + 5_000);
138
+ }
139
+ catch (cause) {
140
+ closeError = cause;
141
+ }
142
+ const cleanup = ownership === undefined
143
+ ? {
144
+ cleaned: false,
145
+ reason: "owned Electron process identity was unavailable",
146
+ }
147
+ : await cleanupElectronProcesses(ownership, lineage);
148
+ if (!cleanup.cleaned)
149
+ return err(providerError(new BrowserObservationError(OPERATION, "cleanup_failed", {
150
+ cause: new Error(cleanup.reason),
151
+ })));
152
+ if (closeError !== undefined)
153
+ return err(providerError(closeError));
154
+ }
155
+ return outcome;
156
+ }
157
+ }
158
+ const cleanupElectronProcesses = async (ownership, lineage) => {
159
+ if (process.platform === "win32") {
160
+ const root = await cleanupWindowsProcessTree(ownership.leaderPid);
161
+ if (!root.cleaned)
162
+ return root;
163
+ if (lineage?.status !== "verified")
164
+ return {
165
+ cleaned: false,
166
+ reason: "owned Electron lineage was unavailable; helper cleanup was not proven",
167
+ };
168
+ for (const descendant of lineage.lineage.descendants) {
169
+ const result = await cleanupWindowsProcessTree(descendant.pid);
170
+ if (!result.cleaned)
171
+ return result;
172
+ }
173
+ return root;
174
+ }
175
+ if (lineage?.status !== "verified") {
176
+ const root = await cleanupOwnedProcessGroup(ownership);
177
+ return root.cleaned
178
+ ? {
179
+ cleaned: false,
180
+ reason: "owned Electron lineage was unavailable; helper cleanup was not proven",
181
+ }
182
+ : root;
183
+ }
184
+ const groupIds = selectCapturedProcessGroupIds(ownership.leaderPid, lineage.lineage.descendants.map(({ pid, processGroupId }) => ({
185
+ pid,
186
+ process_group_id: processGroupId,
187
+ })));
188
+ let signaled = false;
189
+ for (const processGroupId of groupIds) {
190
+ const cleanupOwnership = processGroupId === ownership.processGroupId
191
+ ? { ...ownership, leaderPid: processGroupId, processGroupId }
192
+ : {
193
+ runId: ownership.runId,
194
+ leaderPid: processGroupId,
195
+ processGroupId,
196
+ };
197
+ const result = await cleanupOwnedProcessGroup(cleanupOwnership);
198
+ if (!result.cleaned)
199
+ return result;
200
+ signaled ||= result.signaled;
201
+ }
202
+ const remaining = await verifyNoTokenOwnedProcesses(ownership.runId);
203
+ if (!remaining.cleaned)
204
+ return remaining;
205
+ return { cleaned: true, signaled };
206
+ };
207
+ const createResult = (paths, input, actions, state) => {
208
+ const { hookSnapshot } = state;
209
+ const ipcEvents = hookSnapshot.events.filter(({ kind }) => ipcEventKinds.has(kind));
210
+ return electronActiveObservationResultSchema.parse({
211
+ application: {
212
+ executable_path: paths.executable,
213
+ application_path: paths.application,
214
+ electron_version: state.electronVersion,
215
+ process_ownership: "provider-owned",
216
+ cleanup: "terminated-owned-process",
217
+ },
218
+ actions,
219
+ windows: state.windows,
220
+ processes: {
221
+ items: state.metrics,
222
+ },
223
+ ipc: {
224
+ events: ipcEvents,
225
+ observed: hookSnapshot.observed_ipc,
226
+ },
227
+ timeline: {
228
+ events: hookSnapshot.events,
229
+ observed: hookSnapshot.observed,
230
+ },
231
+ coverage: createCoverage(hookSnapshot),
232
+ limitations: [
233
+ "IPC payloads are represented by value shapes; payload values are never retained.",
234
+ "IPC direction and sender/receiver identifiers are observed only where Electron exposes them at the hooked boundary.",
235
+ "The runtime timeline records lifecycle, navigation, shell, permission, popup, download, protocol, preload, native-addon, process, and IPC events; activity before hook installation is unavailable.",
236
+ "The preload and renderer process contexts are not instrumented by the main-process -r hook; preload configuration and contextBridge API-shape events are main-boundary observations, not proof of renderer-side execution.",
237
+ "Process metrics are an Electron API snapshot and do not prove hostile-local-user isolation.",
238
+ "External shell opens, external navigation, permission grants, downloads, popup windows, updater relaunches, and OS integration are blocked and recorded by the active hook; other application filesystem and network behavior is not sandboxed by this provider.",
239
+ ...(hookSnapshot.hook_error
240
+ ? ["The active IPC hook could not be installed."]
241
+ : []),
242
+ ],
243
+ });
244
+ };
245
+ const canonicalPaths = async (input) => {
246
+ const [executable, application, root] = await Promise.all([
247
+ realpath(input.executable_path),
248
+ realpath(input.application_path),
249
+ realpath(input.application_root),
250
+ ]);
251
+ if (!isPathContained(root, application))
252
+ throw new BrowserObservationError(OPERATION, "target_not_allowed");
253
+ return { executable, application, root };
254
+ };
255
+ const safeElectronEnvironment = (runId) => Object.fromEntries([
256
+ ...[
257
+ "HOME",
258
+ "LANG",
259
+ "PATH",
260
+ "TMP",
261
+ "TMPDIR",
262
+ "USER",
263
+ "DISPLAY",
264
+ "WAYLAND_DISPLAY",
265
+ ]
266
+ .map((name) => [name, process.env[name]])
267
+ .filter((entry) => entry[1] !== undefined),
268
+ ["REA_PROCESS_RUN_ID", runId],
269
+ ]);
270
+ const providerError = (cause) => cause instanceof AnalysisError
271
+ ? cause
272
+ : new ProviderAdapterError(PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY.id, OPERATION, {
273
+ cause,
274
+ });
@@ -1,13 +1,25 @@
1
1
  import { AnalysisCancelledError, AnalysisTimeoutError, } from "../domain/errors.js";
2
2
  const OPERATION = "capture_browser_scenario";
3
- export const withPlaywrightExecutionBoundary = (work, maximumTimeoutMs, signal) => {
4
- if (maximumTimeoutMs <= 0)
5
- return Promise.reject(new AnalysisTimeoutError(OPERATION, maximumTimeoutMs));
3
+ export const withPlaywrightExecutionBoundary = (work, timeoutMs, signal) => {
4
+ if (timeoutMs !== undefined && timeoutMs <= 0)
5
+ return Promise.reject(new AnalysisTimeoutError(OPERATION, timeoutMs));
6
6
  if (signal?.aborted === true)
7
7
  return Promise.reject(new AnalysisCancelledError(OPERATION));
8
8
  return new Promise((resolve, reject) => {
9
9
  let settled = false;
10
10
  let timer;
11
+ const deadline = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
12
+ const scheduleTimeout = () => {
13
+ if (deadline === undefined)
14
+ return;
15
+ const remaining = deadline - Date.now();
16
+ if (remaining <= 0) {
17
+ fail(new AnalysisTimeoutError(OPERATION, timeoutMs ?? 0));
18
+ return;
19
+ }
20
+ timer = setTimeout(scheduleTimeout, Math.min(remaining, 2_147_483_647));
21
+ timer.unref();
22
+ };
11
23
  const cleanup = () => {
12
24
  if (timer !== undefined)
13
25
  clearTimeout(timer);
@@ -30,8 +42,7 @@ export const withPlaywrightExecutionBoundary = (work, maximumTimeoutMs, signal)
30
42
  const onAbort = () => {
31
43
  fail(new AnalysisCancelledError(OPERATION));
32
44
  };
33
- timer = setTimeout(() => fail(new AnalysisTimeoutError(OPERATION, maximumTimeoutMs)), maximumTimeoutMs);
34
- timer.unref();
45
+ scheduleTimeout();
35
46
  signal?.addEventListener("abort", onAbort, { once: true });
36
47
  if (signal?.aborted === true) {
37
48
  onAbort();
@@ -14,15 +14,13 @@ const resolveLocator = (page, locator) => {
14
14
  const resolveValue = (value, secrets) => secrets.value(value);
15
15
  /** Execute one admitted declarative action with no caller-supplied code. */
16
16
  export const performPlaywrightScenarioAction = async (input) => {
17
- const { page, action, secrets, defaultTimeoutMs, maximumTimeoutMs } = input;
17
+ const { page, action, secrets } = input;
18
18
  const timeout = "timeout_ms" in action ? action.timeout_ms : undefined;
19
- const options = {
20
- timeout: Math.min(timeout ?? defaultTimeoutMs, maximumTimeoutMs),
21
- };
19
+ const options = timeout === undefined ? {} : { timeout };
22
20
  switch (action.action) {
23
21
  case "goto":
24
22
  await page.goto(secrets.url(action.destination), {
25
- timeout: options.timeout,
23
+ ...options,
26
24
  waitUntil: action.wait_until,
27
25
  });
28
26
  return;
@@ -55,8 +53,6 @@ export const performPlaywrightScenarioAction = async (input) => {
55
53
  });
56
54
  return;
57
55
  case "wait_for_timeout":
58
- if (action.duration_ms > maximumTimeoutMs)
59
- throw new Error("Scenario duration limit reached");
60
56
  await page.waitForTimeout(action.duration_ms);
61
57
  }
62
58
  };
@@ -2,57 +2,21 @@ import { createHash } from "node:crypto";
2
2
  import { z } from "zod";
3
3
  import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
4
4
  import { browserStepArtifactsSchema, } from "../domain/browserScenarioCapture.js";
5
- const TEXT_ARTIFACT_MAX_BYTES = 1_048_576;
6
5
  const historyValueSchema = z.strictObject({
7
6
  length: z.number().int().min(0),
8
- navigation_entries: z
9
- .array(z.strictObject({
7
+ navigation_entries: z.array(z.strictObject({
10
8
  type: z.string(),
11
9
  name: z.string(),
12
- }))
13
- .max(10_000),
10
+ })),
14
11
  });
15
12
  const storageValueSchema = z.strictObject({
16
- local_storage: z.array(z.tuple([z.string(), z.string()])).max(10_000),
17
- session_storage: z.array(z.tuple([z.string(), z.string()])).max(10_000),
13
+ local_storage: z.array(z.tuple([z.string(), z.string()])),
14
+ session_storage: z.array(z.tuple([z.string(), z.string()])),
18
15
  });
19
- /** Shared retained-count budget for one scenario's screenshot artifacts. */
20
- export class BrowserScenarioCaptureBudget {
21
- maximumScreenshots;
22
- maximumMetadataBytes;
23
- screenshotCount = 0;
24
- metadataBytes = 0;
25
- constructor(maximumScreenshots, maximumMetadataBytes) {
26
- this.maximumScreenshots = maximumScreenshots;
27
- this.maximumMetadataBytes = maximumMetadataBytes;
28
- }
29
- claimScreenshot() {
30
- if (this.screenshotCount >= this.maximumScreenshots)
31
- return false;
32
- this.screenshotCount += 1;
33
- return true;
34
- }
35
- claimMetadata(bytes) {
36
- if (this.metadataBytes + bytes > this.maximumMetadataBytes)
37
- return false;
38
- this.metadataBytes += bytes;
39
- return true;
40
- }
41
- }
42
16
  const notRequested = () => ({ state: "not_requested" });
43
17
  const missing = (reason) => ({ state: "missing", reason });
44
- const truncated = (observed, retained, reason) => ({
45
- state: "truncated",
46
- observed,
47
- retained,
48
- reason,
49
- });
50
- const textArtifact = (text, maximumBytes, budget) => {
18
+ const textArtifact = (text) => {
51
19
  const bytes = Buffer.from(text);
52
- if (bytes.byteLength > maximumBytes)
53
- return truncated(bytes.byteLength, 0, `artifact exceeds ${maximumBytes} bytes`);
54
- if (!budget.claimMetadata(bytes.byteLength))
55
- return truncated(bytes.byteLength, 0, "scenario metadata byte limit reached");
56
20
  return {
57
21
  state: "captured",
58
22
  value: {
@@ -62,15 +26,7 @@ const textArtifact = (text, maximumBytes, budget) => {
62
26
  },
63
27
  };
64
28
  };
65
- const metadataArtifact = (value, budget) => {
66
- const bytes = Buffer.byteLength(JSON.stringify(value));
67
- return budget.claimMetadata(bytes)
68
- ? { state: "captured", value }
69
- : truncated(bytes, 0, "scenario metadata byte limit reached");
70
- };
71
- const captureScreenshot = async (page, scenario, budget) => {
72
- if (!budget.claimScreenshot())
73
- return truncated(1, 0, "scenario screenshot count limit reached");
29
+ const captureScreenshot = async (page) => {
74
30
  try {
75
31
  const bytes = await page.screenshot({
76
32
  type: "png",
@@ -78,13 +34,10 @@ const captureScreenshot = async (page, scenario, budget) => {
78
34
  animations: "disabled",
79
35
  caret: "hide",
80
36
  });
81
- if (bytes.byteLength > scenario.limits.max_screenshot_bytes)
82
- return truncated(bytes.byteLength, 0, "screenshot byte limit reached");
83
37
  const sha256 = createHash("sha256").update(bytes).digest("hex");
84
38
  return {
85
39
  state: "captured",
86
40
  value: {
87
- uri: `rea://web-screenshot/sha256/${sha256}`,
88
41
  sha256,
89
42
  bytes: bytes.byteLength,
90
43
  media_type: "image/png",
@@ -97,25 +50,19 @@ const captureScreenshot = async (page, scenario, budget) => {
97
50
  }
98
51
  };
99
52
  const captureDom = async (input) => {
100
- const { page, secrets, maximumBytes, maximumNodes, budget } = input;
53
+ const { page, secrets } = input;
101
54
  try {
102
- const nodes = await page.locator("*").count();
103
- if (nodes > maximumNodes)
104
- return truncated(nodes, 0, "DOM node limit reached");
105
- return textArtifact(secrets.redact(await page.content()), Math.min(maximumBytes, TEXT_ARTIFACT_MAX_BYTES), budget);
55
+ return textArtifact(secrets.redact(await page.content()));
106
56
  }
107
57
  catch {
108
58
  return missing("DOM capture failed");
109
59
  }
110
60
  };
111
61
  const captureAccessibility = async (input) => {
112
- const { page, secrets, maximumBytes, maximumNodes, budget } = input;
62
+ const { page, secrets } = input;
113
63
  try {
114
64
  const text = await page.locator("html").ariaSnapshot();
115
- const nodes = text.split("\n").filter((line) => line.trim() !== "").length;
116
- if (nodes > maximumNodes)
117
- return truncated(nodes, 0, "accessibility node limit reached");
118
- return textArtifact(secrets.redact(text), Math.min(maximumBytes, TEXT_ARTIFACT_MAX_BYTES), budget);
65
+ return textArtifact(secrets.redact(text));
119
66
  }
120
67
  catch {
121
68
  return missing("accessibility capture failed");
@@ -132,7 +79,7 @@ const navigationType = (value) => {
132
79
  return "unknown";
133
80
  }
134
81
  };
135
- const captureHistory = async (page, budget) => {
82
+ const captureHistory = async (page) => {
136
83
  try {
137
84
  const raw = historyValueSchema.parse(await page.evaluate(`(() => ({
138
85
  length: window.history.length,
@@ -143,8 +90,6 @@ const captureHistory = async (page, budget) => {
143
90
  })
144
91
  )
145
92
  }))()`));
146
- if (raw.navigation_entries.length > 256)
147
- return truncated(raw.navigation_entries.length, 0, "navigation history entry limit reached");
148
93
  const value = {
149
94
  length: raw.length,
150
95
  current_url: sanitizeBrowserUrl(page.url()),
@@ -153,25 +98,20 @@ const captureHistory = async (page, budget) => {
153
98
  name: sanitizeBrowserUrl(name),
154
99
  })),
155
100
  };
156
- return metadataArtifact(value, budget);
101
+ return { state: "captured", value };
157
102
  }
158
103
  catch {
159
104
  return missing("history capture failed");
160
105
  }
161
106
  };
162
107
  const captureStorage = async (input) => {
163
- const { context, page, scenario, secrets, budget } = input;
108
+ const { context, page, scenario, secrets } = input;
164
109
  try {
165
110
  const cookies = await context.cookies(scenario.allowed_origins);
166
111
  const pageStorage = storageValueSchema.parse(await page.evaluate(`(() => ({
167
112
  local_storage: Object.entries(window.localStorage),
168
113
  session_storage: Object.entries(window.sessionStorage)
169
114
  }))()`));
170
- const observed = cookies.length +
171
- pageStorage.local_storage.length +
172
- pageStorage.session_storage.length;
173
- if (observed > scenario.limits.max_storage_entries)
174
- return truncated(observed, 0, "storage entry limit reached");
175
115
  const value = {
176
116
  cookies: cookies.map((cookie) => ({
177
117
  name: cookie.name,
@@ -191,7 +131,7 @@ const captureStorage = async (input) => {
191
131
  ...secrets.fingerprint(value),
192
132
  })),
193
133
  };
194
- return metadataArtifact(value, budget);
134
+ return { state: "captured", value };
195
135
  }
196
136
  catch {
197
137
  return missing("storage capture failed");
@@ -207,7 +147,7 @@ const isAllowedPage = (page, allowedOrigins) => {
207
147
  };
208
148
  /** Capture selected step artifacts without retaining data after scope loss. */
209
149
  export const capturePlaywrightStepArtifacts = async (input) => {
210
- const { context, page, scenario, secrets, requested, budget } = input;
150
+ const { context, page, scenario, secrets, requested } = input;
211
151
  const allowed = isAllowedPage(page, new Set(scenario.allowed_origins));
212
152
  const denied = () => missing("current page is outside approved origins");
213
153
  const state = (kind, capture) => !requested.has(kind)
@@ -216,23 +156,14 @@ export const capturePlaywrightStepArtifacts = async (input) => {
216
156
  ? capture()
217
157
  : Promise.resolve(denied());
218
158
  return browserStepArtifactsSchema.parse({
219
- screenshot: await state("screenshot", () => captureScreenshot(page, scenario, budget)),
220
- dom: await state("dom", () => captureDom({
221
- page,
222
- secrets,
223
- maximumBytes: scenario.limits.max_total_metadata_bytes,
224
- maximumNodes: scenario.limits.max_dom_nodes,
225
- budget,
226
- })),
227
- accessibility: await state("accessibility", () => captureAccessibility({
228
- page,
229
- secrets,
230
- maximumBytes: scenario.limits.max_total_metadata_bytes,
231
- maximumNodes: scenario.limits.max_accessibility_nodes,
232
- budget,
159
+ screenshot: await state("screenshot", () => captureScreenshot(page)),
160
+ dom: await state("dom", () => captureDom({ page, secrets })),
161
+ accessibility: await state("accessibility", () => captureAccessibility({ page, secrets })),
162
+ url: await state("url", async () => ({
163
+ state: "captured",
164
+ value: sanitizeBrowserUrl(page.url()),
233
165
  })),
234
- url: await state("url", async () => metadataArtifact(sanitizeBrowserUrl(page.url()), budget)),
235
- history: await state("history", () => captureHistory(page, budget)),
236
- storage: await state("storage", () => captureStorage({ context, page, scenario, secrets, budget })),
166
+ history: await state("history", () => captureHistory(page)),
167
+ storage: await state("storage", () => captureStorage({ context, page, scenario, secrets })),
237
168
  });
238
169
  };
@@ -79,19 +79,17 @@ const configureAttachedEnvironment = async (context, page, scenario) => {
79
79
  await session.detach();
80
80
  }
81
81
  };
82
- export const openPlaywrightScenarioBrowser = async (scenario, environment, maximumTimeoutMs) => {
82
+ export const openPlaywrightScenarioBrowser = async (scenario, environment) => {
83
83
  if (scenario.browser.mode === "connect") {
84
- const browser = await chromium.connectOverCDP(scenario.browser.cdp_endpoint, {
85
- timeout: Math.min(scenario.limits.navigation_timeout_ms, maximumTimeoutMs),
86
- });
84
+ const browser = await chromium.connectOverCDP(scenario.browser.cdp_endpoint, { timeout: 0 });
87
85
  try {
88
86
  const target = await findConnectedPage(browser, scenario.browser.target_id, new Set(scenario.allowed_origins));
89
87
  await configureAttachedEnvironment(target.context, target.page, scenario);
90
88
  return { ...target, browser, profilePath: undefined };
91
89
  }
92
- catch (error) {
90
+ catch (cause) {
93
91
  await browser.close();
94
- throw error;
92
+ throw cause;
95
93
  }
96
94
  }
97
95
  const profilePath = await mkdtemp(join(tmpdir(), "rea-browser-scenario-"));
@@ -115,7 +113,7 @@ export const openPlaywrightScenarioBrowser = async (scenario, environment, maxim
115
113
  handleSIGHUP: false,
116
114
  handleSIGINT: false,
117
115
  handleSIGTERM: false,
118
- timeout: maximumTimeoutMs,
116
+ timeout: 0,
119
117
  });
120
118
  const browser = context.browser();
121
119
  if (browser === null) {
@@ -125,9 +123,9 @@ export const openPlaywrightScenarioBrowser = async (scenario, environment, maxim
125
123
  const page = context.pages()[0] ?? (await context.newPage());
126
124
  return { context, page, browser, profilePath };
127
125
  }
128
- catch (error) {
126
+ catch (cause) {
129
127
  await rm(profilePath, { recursive: true, force: true, maxRetries: 3 });
130
- throw error;
128
+ throw cause;
131
129
  }
132
130
  };
133
131
  export const closePlaywrightScenarioBrowser = async ({ context, browser, profilePath, }) => {