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,681 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { constants, statSync } from "node:fs";
3
+ import { open, mkdtemp, rm, stat } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { digestProcessCommitment, parseProcessCapture, partialProcessCaptureObservationSchema, processComparisonContract, processScenarioCommitment, } from "../../domain/process/processCapture.js";
7
+ import { PRODUCT_IDENTITY } from "../../identity.js";
8
+ import { snapshotRoots } from "./FilesystemSnapshot.js";
9
+ import { classifyFilesystemEffects } from "./ProcessFilesystemEffects.js";
10
+ import { cleanupOwnedProcessGroup, verifyNoTokenOwnedProcesses, } from "../ProcessOwnership.js";
11
+ import { observeOwnedProcessGroup, prepareProcessOwnershipInspection, systemProcessOwnershipHost, } from "../ProcessOwnershipObservation.js";
12
+ import { describeProcessCaptureExecutionFailure, ProcessCaptureError, } from "./ProcessCaptureError.js";
13
+ import { assertNotCancelled } from "./ProcessScenarioRuntimeValidation.js";
14
+ import { normalizeProcessElapsedTime, normalizeProcessSamples, normalizeProcessText, } from "./ProcessNormalization.js";
15
+ import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
16
+ import { TerminalRenderer } from "./TerminalRenderer.js";
17
+ import { scheduleProcessInterval } from "./ProcessTimer.js";
18
+ /** Seed explicit observation availability before capture completion begins. */
19
+ export const createProcessCaptureObservationBuffer = (options) => ({
20
+ target_pid: {
21
+ state: "unavailable",
22
+ reason: "No PTY process was spawned before the run failed.",
23
+ },
24
+ frames: { state: "available", value: options.frames },
25
+ rendered_frames: {
26
+ state: "unavailable",
27
+ reason: "Rendered terminal frames were not collected before capture completion finished.",
28
+ },
29
+ interaction_events: { state: "available", value: options.interactions },
30
+ exit: {
31
+ state: "unavailable",
32
+ reason: "Terminal exit was not observed before the run failed.",
33
+ },
34
+ settlement: {
35
+ state: "unavailable",
36
+ reason: "Process settlement was not observed before capture completion finished.",
37
+ },
38
+ process_samples: { state: "available", value: options.samples },
39
+ filesystem_snapshots: {
40
+ before: {
41
+ state: "available",
42
+ value: {
43
+ files: options.before.files,
44
+ truncated: options.before.truncated,
45
+ },
46
+ },
47
+ after: {
48
+ state: "unavailable",
49
+ reason: "Final filesystem snapshot was not collected before capture completion finished.",
50
+ },
51
+ },
52
+ event_journal: { state: "available", value: options.eventJournal },
53
+ manifest: {
54
+ state: "unavailable",
55
+ reason: "Capture manifest was not produced before capture completion finished.",
56
+ },
57
+ });
58
+ const normalizePartialProcessObservations = (observations, context) => {
59
+ const targetPid = observations.target_pid;
60
+ const target_pid = targetPid.state === "available" && context.rootPid !== undefined
61
+ ? {
62
+ state: "available",
63
+ value: context.scenario.normalization.pids ? 1 : context.rootPid,
64
+ }
65
+ : targetPid;
66
+ const samples = observations.process_samples;
67
+ const process_samples = samples.state === "available" && context.rootPid !== undefined
68
+ ? {
69
+ state: "available",
70
+ value: normalizeProcessSamples(samples.value, context.scenario, context.rootPid),
71
+ }
72
+ : samples;
73
+ return { ...observations, target_pid, process_samples };
74
+ };
75
+ /** Wait for trailing PTY callbacks before the capture becomes immutable. */
76
+ export const settleProcessCaptureJournal = async (journal, quietMs = 25, maxWaitMs = 500) => {
77
+ const deadline = Date.now() + maxWaitMs;
78
+ let observed = journal.length;
79
+ let lastChangeAt = Date.now();
80
+ while (Date.now() < deadline) {
81
+ await new Promise((resolve) => setTimeout(resolve, 4));
82
+ if (journal.length !== observed) {
83
+ observed = journal.length;
84
+ lastChangeAt = Date.now();
85
+ }
86
+ else if (Date.now() - lastChangeAt >= quietMs)
87
+ return;
88
+ }
89
+ };
90
+ export const buildCaptureResult = (options) => {
91
+ const hasSensitiveScriptedInput = options.scenario.events.some((event) => event.type === "input" && event.sensitive);
92
+ const sensitiveInputUnknown = "Sensitive scripted input values are redacted from process capture Evidence.";
93
+ const filesystemObservationUnknown = "No filesystem observation paths were selected; filesystem effects remain unknown.";
94
+ const hasFilesystemObservations = options.scenario.filesystem_observation_paths.length > 0;
95
+ return {
96
+ manifest: options.manifest,
97
+ normalization: options.scenario.normalization,
98
+ frames: options.frames,
99
+ rendered_frames: options.renderedFrames,
100
+ interaction_events: options.interactions,
101
+ exit: {
102
+ code: options.exit.reason === "exited" && options.exit.exitCode >= 0
103
+ ? options.exit.exitCode
104
+ : null,
105
+ signal: options.exit.signal ?? null,
106
+ reason: options.exit.reason,
107
+ },
108
+ settlement: options.settlement,
109
+ process_samples: normalizeProcessSamples(options.samples, options.scenario, options.rootPid),
110
+ filesystem_checkpoints: options.checkpoints,
111
+ event_journal: options.eventJournal,
112
+ files_before: options.before.files,
113
+ files_after: options.after.files,
114
+ filesystem_effects: classifyFilesystemEffects(options.before.files, options.after.files),
115
+ truncated: options.truncated,
116
+ limitations: [
117
+ "The executable digest is a prelaunch file sample; matching path metadata immediately after spawn does not prove an atomic operating-system image binding.",
118
+ "Process trees are sampled and may omit short-lived descendants.",
119
+ ...(options.samplingPartial
120
+ ? ["Process-tree sampling ended with an incomplete observation."]
121
+ : []),
122
+ "Filesystem observations are before/after snapshots, not syscall traces.",
123
+ "Inherited host environment variables are not recorded and may affect results.",
124
+ ...(!hasFilesystemObservations ? [filesystemObservationUnknown] : []),
125
+ ...(hasSensitiveScriptedInput ? [sensitiveInputUnknown] : []),
126
+ ],
127
+ residual_unknowns: [
128
+ {
129
+ scope: "process",
130
+ reason: "Process trees are sampled and may omit short-lived descendants.",
131
+ },
132
+ {
133
+ scope: "process",
134
+ reason: "The executable digest is a prelaunch file sample; operating-system image binding is not atomically observed.",
135
+ },
136
+ {
137
+ scope: "environment",
138
+ reason: "Inherited host environment variables are not recorded.",
139
+ },
140
+ {
141
+ scope: "network",
142
+ reason: "Network activity is not observed by this capture.",
143
+ },
144
+ ...(!hasFilesystemObservations
145
+ ? [
146
+ {
147
+ scope: "filesystem",
148
+ reason: filesystemObservationUnknown,
149
+ },
150
+ ]
151
+ : []),
152
+ ...(hasSensitiveScriptedInput
153
+ ? [{ scope: "interaction", reason: sensitiveInputUnknown }]
154
+ : []),
155
+ ],
156
+ };
157
+ };
158
+ const identityFromStats = (stats) => ({
159
+ dev: stats.dev,
160
+ ino: stats.ino,
161
+ mode: stats.mode,
162
+ size: stats.size,
163
+ mtimeNs: stats.mtimeNs,
164
+ ctimeNs: stats.ctimeNs,
165
+ });
166
+ const sameExecutableIdentity = (left, right) => left.dev === right.dev &&
167
+ left.ino === right.ino &&
168
+ left.mode === right.mode &&
169
+ left.size === right.size &&
170
+ left.mtimeNs === right.mtimeNs &&
171
+ left.ctimeNs === right.ctimeNs;
172
+ const filesystemFailure = (cause) => {
173
+ if (!(cause instanceof Error) || !("code" in cause) || !("syscall" in cause))
174
+ return undefined;
175
+ return `Executable file observation failed: ${cause.message}`;
176
+ };
177
+ const selectedExecutableFileSystem = {
178
+ open,
179
+ stat: (path) => stat(path, { bigint: true }),
180
+ };
181
+ /** Sample the selected file without launching it; retain cancellation and file identity. */
182
+ export const observeSelectedExecutable = async (path, signal, fileSystem = selectedExecutableFileSystem) => {
183
+ assertNotCancelled(signal);
184
+ let handle;
185
+ try {
186
+ handle = await fileSystem.open(path, constants.O_RDONLY | constants.O_NONBLOCK);
187
+ const openedStats = await handle.stat({ bigint: true });
188
+ if (!openedStats.isFile())
189
+ return {
190
+ sha256: null,
191
+ identity: null,
192
+ reason: "Selected executable is not a regular file.",
193
+ };
194
+ const openedIdentity = identityFromStats(openedStats);
195
+ const selectedPathIdentity = identityFromStats(await fileSystem.stat(path));
196
+ if (!sameExecutableIdentity(openedIdentity, selectedPathIdentity))
197
+ return {
198
+ sha256: null,
199
+ identity: null,
200
+ reason: "Selected executable path changed while it was being opened.",
201
+ };
202
+ // IO above can settle after cancellation. Do not construct a stream with an
203
+ // already-aborted signal: Node can emit a second, unhandled AbortError.
204
+ assertNotCancelled(signal);
205
+ const hash = createHash("sha256");
206
+ for await (const chunk of handle.createReadStream({
207
+ autoClose: false,
208
+ signal,
209
+ })) {
210
+ assertNotCancelled(signal);
211
+ hash.update(chunk);
212
+ }
213
+ assertNotCancelled(signal);
214
+ const finalIdentity = identityFromStats(await handle.stat({ bigint: true }));
215
+ if (!sameExecutableIdentity(openedIdentity, finalIdentity))
216
+ return {
217
+ sha256: null,
218
+ identity: null,
219
+ reason: "Selected executable changed while its contents were sampled.",
220
+ };
221
+ return {
222
+ sha256: hash.digest("hex"),
223
+ identity: openedIdentity,
224
+ reason: null,
225
+ };
226
+ }
227
+ catch (cause) {
228
+ assertNotCancelled(signal);
229
+ const reason = filesystemFailure(cause);
230
+ if (reason !== undefined)
231
+ return { sha256: null, identity: null, reason };
232
+ throw cause;
233
+ }
234
+ finally {
235
+ await handle?.close();
236
+ }
237
+ };
238
+ /** Compare the selected file metadata with the path immediately after PTY spawn. */
239
+ export const observeLaunchedExecutable = (path, selected) => {
240
+ if (selected.identity === null || selected.sha256 === null)
241
+ return {
242
+ selectedSha256: selected.sha256,
243
+ sha256: null,
244
+ state: "unknown",
245
+ reason: selected.reason ?? "Selected executable identity is unavailable.",
246
+ };
247
+ try {
248
+ const currentStats = statSync(path, { bigint: true });
249
+ const currentIdentity = identityFromStats(currentStats);
250
+ if (currentStats.isFile() &&
251
+ sameExecutableIdentity(selected.identity, currentIdentity))
252
+ return {
253
+ selectedSha256: selected.sha256,
254
+ sha256: selected.sha256,
255
+ state: "path_metadata_unchanged",
256
+ reason: null,
257
+ };
258
+ return {
259
+ selectedSha256: selected.sha256,
260
+ sha256: null,
261
+ state: "unknown",
262
+ reason: "Executable path metadata changed between sampling and spawn.",
263
+ };
264
+ }
265
+ catch (cause) {
266
+ const reason = filesystemFailure(cause);
267
+ if (reason !== undefined)
268
+ return {
269
+ selectedSha256: selected.sha256,
270
+ sha256: null,
271
+ state: "unknown",
272
+ reason,
273
+ };
274
+ throw cause;
275
+ }
276
+ };
277
+ export const createRunManifest = async (scenario, startedAt, completedAt, executable, host = {
278
+ platform: process.platform,
279
+ architecture: process.arch,
280
+ }) => {
281
+ const scenarioCommitment = processScenarioCommitment(scenario, executable.selectedSha256 ?? undefined);
282
+ const comparisonContract = processComparisonContract(scenario);
283
+ return {
284
+ rea_version: PRODUCT_IDENTITY.packageVersion,
285
+ provider_version: PROCESS_PROVIDER.version,
286
+ platform: host.platform,
287
+ architecture: host.architecture,
288
+ pty_backend: "node-pty",
289
+ started_at: startedAt.toISOString(),
290
+ completed_at: completedAt.toISOString(),
291
+ scenario: scenarioCommitment,
292
+ comparison_contract: comparisonContract,
293
+ full_scenario_sha256: digestProcessCommitment(scenarioCommitment),
294
+ comparison_contract_sha256: digestProcessCommitment(comparisonContract),
295
+ selected_executable_sha256: executable.selectedSha256,
296
+ executable_sha256: executable.sha256,
297
+ executable_identity: {
298
+ state: executable.state,
299
+ reason: executable.reason,
300
+ },
301
+ normalization_sha256: digestProcessCommitment(scenario.normalization),
302
+ };
303
+ };
304
+ export const observeSettlement = async (runId, processGroupIds, settleMs, recordEvent = () => undefined, platform = process.platform) => {
305
+ if (platform === "win32") {
306
+ recordEvent("lifecycle", 1);
307
+ return { state: "unverifiable", elapsed_ms: 0 };
308
+ }
309
+ const started = Date.now();
310
+ let consecutiveEmpty = 0;
311
+ let deadlineReached = false;
312
+ while (!deadlineReached) {
313
+ const observations = await Promise.all([...new Set(processGroupIds)].map((processGroupId) => observeOwnedProcessGroup({
314
+ runId,
315
+ leaderPid: processGroupId,
316
+ processGroupId,
317
+ })));
318
+ if (observations.some(({ state }) => state === "unverifiable")) {
319
+ recordEvent("lifecycle", 1);
320
+ return { state: "unverifiable", elapsed_ms: Date.now() - started };
321
+ }
322
+ if (observations.every(({ state }) => state === "empty")) {
323
+ consecutiveEmpty += 1;
324
+ if (consecutiveEmpty >= 2) {
325
+ recordEvent("lifecycle", 1);
326
+ return { state: "quiesced", elapsed_ms: Date.now() - started };
327
+ }
328
+ }
329
+ else
330
+ consecutiveEmpty = 0;
331
+ deadlineReached = Date.now() - started >= settleMs;
332
+ if (deadlineReached)
333
+ break;
334
+ await new Promise((resolve) => setTimeout(resolve, 50));
335
+ }
336
+ recordEvent("lifecycle", 1);
337
+ return { state: "alive_at_deadline", elapsed_ms: Date.now() - started };
338
+ };
339
+ export const awaitTerminalExit = async ({ terminal, scenario, started, lastOutput, signal, timers, interactions, dispatchedEventIndexes, recordEvent, }) => new Promise((resolveExit) => {
340
+ // The kill caused by a deadline is observed later as an ordinary PTY exit.
341
+ // Keep the initiating lifecycle reason so comparisons distinguish a target
342
+ // exit from harness-owned timeout, idle-timeout, and cancellation cleanup.
343
+ let reason = "exited";
344
+ terminal.onExit((exit) => {
345
+ recordEvent("lifecycle", 0);
346
+ for (const [eventIndex, event] of scenario.events.entries()) {
347
+ if (dispatchedEventIndexes.has(eventIndex))
348
+ continue;
349
+ const sequence = interactions.length;
350
+ interactions.push({
351
+ sequence,
352
+ scheduled_at_ms: event.at_ms,
353
+ dispatched_at_ms: Math.max(0, Date.now() - started),
354
+ type: event.type,
355
+ data: event.type === "input"
356
+ ? "<not-dispatched>"
357
+ : event.type === "resize"
358
+ ? `${String(event.columns)}x${String(event.rows)}`
359
+ : event.signal,
360
+ outcome: "target_exited",
361
+ });
362
+ recordEvent("interaction_events", sequence);
363
+ }
364
+ for (const timer of timers) {
365
+ timer.cancel();
366
+ }
367
+ timers.clear();
368
+ resolveExit({ ...exit, reason });
369
+ });
370
+ const timeout = scheduleProcessInterval(() => {
371
+ if (signal?.aborted === true) {
372
+ reason = "cancelled";
373
+ terminal.kill("SIGKILL");
374
+ }
375
+ else if (Date.now() - started >= scenario.timeout_ms) {
376
+ reason = "timeout";
377
+ terminal.kill("SIGKILL");
378
+ }
379
+ else if (Date.now() - lastOutput() >= scenario.idle_timeout_ms) {
380
+ reason = "idle_timeout";
381
+ terminal.kill("SIGKILL");
382
+ }
383
+ }, 20);
384
+ timers.add(timeout);
385
+ });
386
+ const processCaptureCleanupHost = {
387
+ platform: process.platform,
388
+ cleanupProcessGroup: cleanupOwnedProcessGroup,
389
+ verifyTokenOwnedProcesses: verifyNoTokenOwnedProcesses,
390
+ removeTemporaryRoot: (path) => rm(path, { recursive: true, force: true }),
391
+ };
392
+ const PROCESS_CLEANUP_VERIFICATION_GRACE_MS = 1_000;
393
+ const PROCESS_CLEANUP_VERIFICATION_INTERVAL_MS = 25;
394
+ const verifyTokenOwnedProcessesUntilSettled = async (verify) => {
395
+ const deadline = Date.now() + PROCESS_CLEANUP_VERIFICATION_GRACE_MS;
396
+ let result = await verify();
397
+ while (!result.cleaned) {
398
+ const remaining = deadline - Date.now();
399
+ if (remaining <= 0)
400
+ return result;
401
+ await new Promise((resolve) => setTimeout(resolve, Math.min(PROCESS_CLEANUP_VERIFICATION_INTERVAL_MS, remaining)));
402
+ result = await verify();
403
+ }
404
+ return result;
405
+ };
406
+ export const releaseProcessResources = async (options) => {
407
+ const host = options.host ?? processCaptureCleanupHost;
408
+ for (const timer of options.timers)
409
+ timer.cancel();
410
+ let terminalRenderer = {
411
+ state: options.renderer === undefined ? "not_required" : "cleaned",
412
+ reason: null,
413
+ };
414
+ try {
415
+ await options.renderer?.dispose();
416
+ }
417
+ catch (cause) {
418
+ terminalRenderer = {
419
+ state: "failed",
420
+ reason: cause instanceof Error
421
+ ? cause.message || cause.name || "renderer dispose failed"
422
+ : "renderer dispose failed",
423
+ };
424
+ }
425
+ let ownedProcessGroup = {
426
+ state: options.terminal === undefined ? "not_required" : "cleaned",
427
+ reason: null,
428
+ };
429
+ if (options.terminal !== undefined) {
430
+ if (host.platform === "win32") {
431
+ ownedProcessGroup = {
432
+ state: "unverified",
433
+ reason: "owned process cleanup is unverifiable on Windows without process-job authority",
434
+ };
435
+ }
436
+ else {
437
+ const terminalPid = options.terminal.pid;
438
+ const relation = {
439
+ leaderPid: terminalPid,
440
+ processGroupId: terminalPid,
441
+ ...(options.sampledProcessGroupIds === undefined
442
+ ? {}
443
+ : { sampledProcessGroupIds: options.sampledProcessGroupIds }),
444
+ };
445
+ const cleaned = await host.cleanupProcessGroup({
446
+ runId: options.runId,
447
+ leaderPid: terminalPid,
448
+ processGroupId: terminalPid,
449
+ sweepTokenOwnedProcesses: true,
450
+ ...(options.sampledProcessGroupIds === undefined
451
+ ? {}
452
+ : { sampledProcessGroupIds: options.sampledProcessGroupIds }),
453
+ ...(options.captureBaseline === undefined
454
+ ? {}
455
+ : { captureBaseline: options.captureBaseline }),
456
+ });
457
+ const unverified = [...(cleaned.unverified ?? [])];
458
+ if (!cleaned.cleaned) {
459
+ ownedProcessGroup = { state: "unverified", reason: cleaned.reason };
460
+ }
461
+ else {
462
+ const verified = await verifyTokenOwnedProcessesUntilSettled(() => host.verifyTokenOwnedProcesses(options.runId, undefined, options.captureBaseline, relation));
463
+ unverified.push(...(verified.unverified ?? []));
464
+ if (!verified.cleaned)
465
+ ownedProcessGroup = { state: "unverified", reason: verified.reason };
466
+ }
467
+ if (unverified.length > 0)
468
+ ownedProcessGroup = {
469
+ ...ownedProcessGroup,
470
+ unverified_processes: [
471
+ ...new Map(unverified.map(({ pid, diagnostic }) => [
472
+ `${String(pid)}:${diagnostic}`,
473
+ { pid, reason: diagnostic },
474
+ ])).values(),
475
+ ],
476
+ };
477
+ }
478
+ }
479
+ let temporaryRoot = {
480
+ state: "cleaned",
481
+ reason: null,
482
+ };
483
+ try {
484
+ await host.removeTemporaryRoot(options.temporaryRoot);
485
+ }
486
+ catch (cause) {
487
+ temporaryRoot = {
488
+ state: "failed",
489
+ reason: cause instanceof Error
490
+ ? cause.message || cause.name || "temporary root removal failed"
491
+ : "temporary root removal failed",
492
+ };
493
+ }
494
+ return {
495
+ owned_process_group: ownedProcessGroup,
496
+ terminal_renderer: terminalRenderer,
497
+ temporary_root: temporaryRoot,
498
+ };
499
+ };
500
+ export const cleanupReportFailure = (report) => {
501
+ const failures = Object.entries(report).filter(([, outcome]) => outcome.state === "failed" || outcome.state === "unverified");
502
+ return failures.length === 0
503
+ ? undefined
504
+ : failures
505
+ .map(([resource, outcome]) => `${resource}: ${outcome.reason ?? outcome.state}`)
506
+ .join("; ");
507
+ };
508
+ export const captureTerminalFrames = (options) => {
509
+ let outputBytes = 0;
510
+ let truncated = false;
511
+ options.terminal.onData((data) => {
512
+ options.onOutput();
513
+ const bytes = Buffer.byteLength(data);
514
+ if (outputBytes + bytes > options.scenario.limits.output_bytes) {
515
+ truncated = true;
516
+ return;
517
+ }
518
+ outputBytes += bytes;
519
+ const atMs = normalizeProcessElapsedTime(Date.now() - options.started, options.scenario.normalization.time_bucket_ms);
520
+ const normalized = normalizeProcessText(data, options.scenario, options.temporaryRoot, options.terminal.pid);
521
+ const sequence = options.frames.length;
522
+ options.frames.push({
523
+ sequence,
524
+ at_ms: atMs,
525
+ data: normalized,
526
+ });
527
+ options.renderer.write(data, atMs);
528
+ options.recordEvent("frames", sequence);
529
+ });
530
+ return () => truncated;
531
+ };
532
+ export const resolveProcessResult = (capture, executionFailure, cleanup, observations, partialContext) => {
533
+ const cleanupFailure = cleanupReportFailure(cleanup);
534
+ const executionFailureReason = describeProcessCaptureExecutionFailure(executionFailure);
535
+ let partialObservation;
536
+ if ((cleanupFailure !== undefined || executionFailure !== undefined) &&
537
+ (capture !== undefined || observations !== undefined)) {
538
+ const normalizedObservations = observations === undefined || partialContext === undefined
539
+ ? observations
540
+ : normalizePartialProcessObservations(observations, partialContext);
541
+ if (capture === undefined) {
542
+ if (normalizedObservations !== undefined) {
543
+ const partialResult = partialProcessCaptureObservationSchema.safeParse({
544
+ observations: normalizedObservations,
545
+ cleanup,
546
+ execution_failure: executionFailureReason ?? null,
547
+ });
548
+ if (partialResult.success)
549
+ partialObservation = partialResult.data;
550
+ }
551
+ }
552
+ else {
553
+ const captureData = "cleanup" in capture
554
+ ? (() => {
555
+ const { cleanup: _cleanup, ...data } = capture;
556
+ void _cleanup;
557
+ return data;
558
+ })()
559
+ : capture;
560
+ const settlement = cleanupFailure !== undefined
561
+ ? { ...capture.settlement, cleanup_outcome: "failed" }
562
+ : capture.settlement.state === "quiesced"
563
+ ? {
564
+ ...capture.settlement,
565
+ cleanup_outcome: "not_required",
566
+ }
567
+ : { ...capture.settlement, cleanup_outcome: "cleaned" };
568
+ const partialResult = partialProcessCaptureObservationSchema.safeParse({
569
+ capture: { ...captureData, settlement },
570
+ cleanup,
571
+ execution_failure: executionFailureReason ?? null,
572
+ });
573
+ if (partialResult.success)
574
+ partialObservation = partialResult.data;
575
+ }
576
+ }
577
+ if (cleanupFailure !== undefined) {
578
+ const cleanupResources = Object.entries(cleanup)
579
+ .filter(([, outcome]) => outcome.state === "failed" || outcome.state === "unverified")
580
+ .map(([resource]) => resource);
581
+ throw new ProcessCaptureError(cleanupFailure, {
582
+ cause: executionFailure,
583
+ reason: "cleanup_incomplete",
584
+ cleanupResources,
585
+ ...(executionFailureReason === undefined
586
+ ? {}
587
+ : { executionFailure: executionFailureReason }),
588
+ ...(partialObservation === undefined ? {} : { partialObservation }),
589
+ cleanupReport: cleanup,
590
+ });
591
+ }
592
+ if (executionFailure instanceof ProcessCaptureError) {
593
+ const retainedExecutionFailure = executionFailure.executionFailure ?? executionFailureReason;
594
+ const retainedPartialObservation = executionFailure.partialObservation ?? partialObservation;
595
+ throw new ProcessCaptureError(executionFailure.message, {
596
+ cause: executionFailure,
597
+ ...(executionFailure.userMessage === undefined
598
+ ? {}
599
+ : { userMessage: executionFailure.userMessage }),
600
+ ...(executionFailure.userCategory === undefined
601
+ ? {}
602
+ : { userCategory: executionFailure.userCategory }),
603
+ reason: executionFailure.reason,
604
+ cleanupResources: executionFailure.cleanupResources,
605
+ ...(retainedExecutionFailure === undefined
606
+ ? {}
607
+ : { executionFailure: retainedExecutionFailure }),
608
+ ...(retainedPartialObservation === undefined
609
+ ? {}
610
+ : { partialObservation: retainedPartialObservation }),
611
+ cleanupReport: executionFailure.cleanupReport ?? cleanup,
612
+ });
613
+ }
614
+ if (executionFailure !== undefined) {
615
+ throw new ProcessCaptureError("process capture failed", {
616
+ cause: executionFailure,
617
+ reason: "capture_failed",
618
+ ...(executionFailureReason === undefined
619
+ ? {}
620
+ : { executionFailure: executionFailureReason }),
621
+ ...(partialObservation === undefined ? {} : { partialObservation }),
622
+ cleanupReport: cleanup,
623
+ });
624
+ }
625
+ if (capture === undefined)
626
+ throw new ProcessCaptureError("process capture produced no result");
627
+ const unverifiedProcesses = cleanup.owned_process_group.unverified_processes;
628
+ if ("cleanup" in capture && unverifiedProcesses === undefined)
629
+ return capture;
630
+ const settlement = capture.settlement.state === "quiesced"
631
+ ? { ...capture.settlement, cleanup_outcome: "not_required" }
632
+ : { ...capture.settlement, cleanup_outcome: "cleaned" };
633
+ try {
634
+ return parseProcessCapture({
635
+ ...capture,
636
+ settlement,
637
+ residual_unknowns: [
638
+ ...capture.residual_unknowns,
639
+ ...(unverifiedProcesses ?? []).map(({ pid, reason }) => ({
640
+ scope: "process",
641
+ reason: `Ownership of unrelated process ${String(pid)} could not be verified; it was left untouched: ${reason}`,
642
+ })),
643
+ ],
644
+ cleanup: {
645
+ ...("cleanup" in capture ? capture.cleanup : {}),
646
+ owned_process_group: "verified",
647
+ temporary_root: "removed",
648
+ ...(unverifiedProcesses === undefined
649
+ ? {}
650
+ : { unverified_processes: unverifiedProcesses }),
651
+ },
652
+ });
653
+ }
654
+ catch (cause) {
655
+ throw new ProcessCaptureError(`process capture validation failed${cause instanceof Error ? `: ${cause.message}` : ""}`, { cause });
656
+ }
657
+ };
658
+ export const prepareProcessCapture = async (scenario, signal, captureSnapshot = snapshotRoots, host = systemProcessPreparationHost) => {
659
+ assertNotCancelled(signal);
660
+ await host.prepareOwnershipInspector?.(signal);
661
+ assertNotCancelled(signal);
662
+ const before = await captureSnapshot(scenario, signal);
663
+ const temporaryRoot = await host.createTemporaryRoot();
664
+ try {
665
+ assertNotCancelled(signal);
666
+ const runId = randomUUID();
667
+ const ownershipBaseline = (await host.captureOwnershipBaseline?.(signal)) ?? [];
668
+ assertNotCancelled(signal);
669
+ return { temporaryRoot, runId, ownershipBaseline, before };
670
+ }
671
+ catch (cause) {
672
+ await host.cleanup(temporaryRoot);
673
+ throw cause;
674
+ }
675
+ };
676
+ const systemProcessPreparationHost = {
677
+ prepareOwnershipInspector: prepareProcessOwnershipInspection,
678
+ captureOwnershipBaseline: (signal) => systemProcessOwnershipHost.captureBaseline?.(signal) ?? Promise.resolve([]),
679
+ createTemporaryRoot: () => mkdtemp(join(tmpdir(), "rea-process-")),
680
+ cleanup: (path) => rm(path, { recursive: true, force: true }),
681
+ };