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,22 @@
1
+ # EVM interface upstream profile
2
+
3
+ REA integrates unchanged [EVMole](https://github.com/cdump/evmole) as the exact
4
+ npm dependency `evmole@0.9.3`, with lockfile integrity verification. Tag `0.9.3`
5
+ resolves to commit `0409707c2efef11a9043f9b4505cad5719054a7e`.
6
+
7
+ The JavaScript binding and WASM engine remain in the original upstream package;
8
+ REA contains only carrier validation, a worker adapter and portable contracts.
9
+ No submodule or vendored engine fork is required. No signature database,
10
+ LLM decompiler, blockchain node or RPC dependency is acquired.
11
+
12
+ Upstream is MIT, copyright (c) 2023 Maxim Andreev. Its npm tarball omits the
13
+ license file, so REA packages the unchanged tag's [LICENSE](LICENSE) here.
14
+ The engine is initialized through the upstream `no_tla`/`initSync` interface
15
+ only inside an owned worker; importing REA services performs no WASM/file I/O.
16
+
17
+ Initial interface analysis uses `contractInfo` with selectors, arguments and
18
+ stateMutability enabled. Selector recovery also extracts/reports terminal metadata;
19
+ its reported representation is retained with explicit unknown precision/coverage.
20
+ Other upstream outputs are separate future contracts;
21
+ in particular, CFG destination IDs are not byte addresses and terminal CBOR
22
+ metadata cannot establish a lossless integer claim through the current binding.
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 Dominik 'Disconnect3d' Czarnota
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,23 @@
1
+ # pwndbg core context adapter
2
+
3
+ REA uses caller-supplied unchanged [pwndbg](https://github.com/pwndbg/pwndbg)
4
+ 2026.09.15, commit `55596aa676a2756efb8d67034f31675170eabe48`, and GDB.
5
+ The original MIT license is retained in `LICENSE.md`. Engine source and its
6
+ dependencies are not vendored or acquired by REA.
7
+
8
+ The adapter executes the selected upstream `gdbinit.py` with its original
9
+ `__file__`, an explicitly selected existing virtual environment, and
10
+ `PWNDBG_NO_AUTOUPDATE=1`. The upstream entrypoint and dependencies are trusted
11
+ caller-supplied executable code. Reported versions establish observed behavior,
12
+ not source authenticity. The real verification lane checks out the exact commit
13
+ and uses its frozen `uv.lock` in isolated runner storage.
14
+
15
+ Only `pwndbg.aglib.vmmap.get()` is queried, after establishing a core-only GDB
16
+ connection without an executable. All original core notes and recorded register
17
+ values come from the independent pwntools/pyelftools decoder. Mapping candidates
18
+ are derived; original pathnames do not identify current host files, and reported
19
+ flags zero leave permissions unknown. REA does not expose upstream command
20
+ execution, live attach, target launch, implicit executable pairing or updates.
21
+
22
+ Local actual verification uses Linux x64, GDB 13.1 and the exact upstream tag/build.
23
+ Other GDB versions require their corresponding real workflow before being claimed.
@@ -0,0 +1,40 @@
1
+ # Offline ELF upstream profile
2
+
3
+ REA uses caller-supplied, unchanged Python packages. It vendors no pwntools,
4
+ pyelftools or Unicorn implementation and never installs these dependencies.
5
+
6
+ | Upstream | Exact verified profile | License | Role |
7
+ | --- | --- | --- | --- |
8
+ | [pwntools](https://github.com/Gallopsled/pwntools) | 4.15.0; tag commit `3ad86ec5adab1abf9781ca7552a6f5d7cff7a33c` | MIT | ELF analysis and static mitigation/GOT/PLT heuristics |
9
+ | [pyelftools](https://github.com/eliben/pyelftools) | 0.33 | Public domain | Original ELF sections, segments, symbols and relocations |
10
+ | [Unicorn](https://github.com/unicorn-engine/unicorn) | 2.1.2 | GPL-2.0 | Upstream PLT emulation; distinct from executing the target as a host process |
11
+
12
+ The adapter checks all three runtime versions before importing the ELF engine.
13
+ Original upstream code/licenses remain in the caller-selected environment.
14
+ No target or core binaries are committed. Fixtures are compiled in owned
15
+ temporary storage from repository source and are never executed.
16
+
17
+ `bridge/pwntools/layout.py` is an owned allocation-failure bootstrap;
18
+ `layout_impl.py` is the adapter. It reads original tables through
19
+ unchanged upstream APIs, preserves raw name bytes/ranges, and serializes uint64
20
+ values as strings. It never accesses `ELF.libs`, `ELF.maps`, `ELF.libc` or
21
+ `process.corefile`, which have materially different execution authority.
22
+
23
+ The real verification lane traces host exec syscalls, checks original artifact
24
+ hashes and observes released owned processes. No negative claim relies only on
25
+ an unmodified target's sentinel: upstream can execute a patched copy when its
26
+ runtime-library accessors are used.
27
+
28
+ The instance-local adapter subclass forwards the documented pyelftools 0.33
29
+ `iter_segments(type=...)` / `iter_sections(type=...)` filters missing from
30
+ pwntools 4.15.0 cached overrides. No upstream file or global method is changed.
31
+ Sectionless dynamic string tables use unique DT_STRTAB/DT_STRSZ mappings to
32
+ file-backed PT_LOAD bytes; ambiguous or non-file-backed mappings are explicitly
33
+ unsupported. Section-name table escapes follow the [ELF ABI](https://gabi.xinuos.com/elf/02-eheader.html):
34
+ SHN_XINDEX represents actual indices at least 0xff00; ordinary absence uses index
35
+ zero. Raw name offsets remain reported when the name table is absent.
36
+
37
+ PLT convenience inference uses the unchanged upstream Unicorn instruction
38
+ emulator. REA labels those maps as derived static evidence. The no-execution
39
+ verification claim concerns launching the selected object as a host process,
40
+ not the absence of static instruction emulation inside an analysis engine.
@@ -1,7 +0,0 @@
1
- import { realpath } from "node:fs/promises";
2
- import { scanCanonicalArtifactInventory, } from "./ArtifactInventory.js";
3
- /** Resolve, authorize, and scan one artifact without a second path resolution. */
4
- export const scanAuthorizedArtifactInventory = async (inputPath, options = {}) => {
5
- const path = await realpath(inputPath);
6
- return scanCanonicalArtifactInventory(path, options);
7
- };
@@ -1,299 +0,0 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { createReadStream } from "node:fs";
3
- import { mkdtemp, rm } from "node:fs/promises";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { digestProcessCommitment, processComparisonContract, processScenarioCommitment, } from "../domain/processCapture.js";
7
- import { PRODUCT_IDENTITY } from "../identity.js";
8
- import { snapshotRoots } from "./FilesystemSnapshot.js";
9
- import { classifyFilesystemEffects } from "./ProcessFilesystemEffects.js";
10
- import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
11
- import { observeOwnedProcessGroup } from "../process/ProcessOwnershipObservation.js";
12
- import { ProcessCaptureError } from "./ProcessCaptureError.js";
13
- import { assertNotCancelled } from "./ProcessScenarioRuntimeValidation.js";
14
- import { normalizeProcessElapsedTime, normalizeProcessSamples, normalizeProcessText, } from "./ProcessNormalization.js";
15
- import { PROCESS_PROVIDER } from "./ProcessEvidence.js";
16
- import { TerminalRenderer } from "./TerminalRenderer.js";
17
- import { scheduleProcessInterval } from "./ProcessTimer.js";
18
- /** Wait for trailing PTY callbacks before the capture becomes immutable. */
19
- export const settleProcessCaptureJournal = async (journal, quietMs = 25, maxWaitMs = 500) => {
20
- const deadline = Date.now() + maxWaitMs;
21
- let observed = journal.length;
22
- let lastChangeAt = Date.now();
23
- while (Date.now() < deadline) {
24
- await new Promise((resolve) => setTimeout(resolve, 4));
25
- if (journal.length !== observed) {
26
- observed = journal.length;
27
- lastChangeAt = Date.now();
28
- }
29
- else if (Date.now() - lastChangeAt >= quietMs)
30
- return;
31
- }
32
- };
33
- export const buildCaptureResult = (options) => {
34
- const hasSensitiveScriptedInput = options.scenario.events.some((event) => event.type === "input" && event.sensitive);
35
- const sensitiveInputUnknown = "Sensitive scripted input values are redacted from process capture Evidence.";
36
- const filesystemObservationUnknown = "No filesystem observation paths were selected; filesystem effects remain unknown.";
37
- const hasFilesystemObservations = options.scenario.filesystem_observation_paths.length > 0;
38
- return {
39
- manifest: options.manifest,
40
- normalization: options.scenario.normalization,
41
- frames: options.frames,
42
- rendered_frames: options.renderedFrames,
43
- interaction_events: options.interactions,
44
- exit: {
45
- code: options.exit.reason === "exited" && options.exit.exitCode >= 0
46
- ? options.exit.exitCode
47
- : null,
48
- signal: options.exit.signal ?? null,
49
- reason: options.exit.reason,
50
- },
51
- settlement: options.settlement,
52
- process_samples: normalizeProcessSamples(options.samples, options.scenario, options.rootPid),
53
- filesystem_checkpoints: options.checkpoints,
54
- event_journal: options.eventJournal,
55
- files_before: options.before.files,
56
- files_after: options.after.files,
57
- filesystem_effects: classifyFilesystemEffects(options.before.files, options.after.files),
58
- truncated: options.truncated,
59
- limitations: [
60
- "Process trees are sampled and may omit short-lived descendants.",
61
- ...(options.samplingPartial
62
- ? ["Process-tree sampling ended with an incomplete observation."]
63
- : []),
64
- "Filesystem observations are before/after snapshots, not syscall traces.",
65
- "Inherited host environment variables are not recorded and may affect results.",
66
- ...(!hasFilesystemObservations ? [filesystemObservationUnknown] : []),
67
- ...(hasSensitiveScriptedInput ? [sensitiveInputUnknown] : []),
68
- ],
69
- residual_unknowns: [
70
- {
71
- scope: "process",
72
- reason: "Process trees are sampled and may omit short-lived descendants.",
73
- },
74
- {
75
- scope: "environment",
76
- reason: "Inherited host environment variables are not recorded.",
77
- },
78
- {
79
- scope: "network",
80
- reason: "Network activity is not observed by this capture.",
81
- },
82
- ...(!hasFilesystemObservations
83
- ? [
84
- {
85
- scope: "filesystem",
86
- reason: filesystemObservationUnknown,
87
- },
88
- ]
89
- : []),
90
- ...(hasSensitiveScriptedInput
91
- ? [{ scope: "interaction", reason: sensitiveInputUnknown }]
92
- : []),
93
- ],
94
- };
95
- };
96
- const hashFile = async (path) => {
97
- const hash = createHash("sha256");
98
- for await (const chunk of createReadStream(path))
99
- hash.update(chunk);
100
- return hash.digest("hex");
101
- };
102
- export const createRunManifest = async (scenario, startedAt, completedAt, host = {
103
- platform: process.platform,
104
- architecture: process.arch,
105
- }) => {
106
- const executableSha256 = await hashFile(scenario.executable);
107
- const scenarioCommitment = processScenarioCommitment(scenario, executableSha256);
108
- const comparisonContract = processComparisonContract(scenario);
109
- return {
110
- rea_version: PRODUCT_IDENTITY.packageVersion,
111
- provider_version: PROCESS_PROVIDER.version,
112
- platform: host.platform,
113
- architecture: host.architecture,
114
- pty_backend: "node-pty",
115
- started_at: startedAt.toISOString(),
116
- completed_at: completedAt.toISOString(),
117
- scenario: scenarioCommitment,
118
- comparison_contract: comparisonContract,
119
- full_scenario_sha256: digestProcessCommitment(scenarioCommitment),
120
- comparison_contract_sha256: digestProcessCommitment(comparisonContract),
121
- executable_sha256: executableSha256,
122
- normalization_sha256: digestProcessCommitment(scenario.normalization),
123
- };
124
- };
125
- export const observeSettlement = async (runId, processGroupIds, settleMs, recordEvent = () => undefined, platform = process.platform) => {
126
- if (platform === "win32") {
127
- recordEvent("lifecycle", 1);
128
- return { state: "unverifiable", elapsed_ms: 0 };
129
- }
130
- const started = Date.now();
131
- let consecutiveEmpty = 0;
132
- let deadlineReached = false;
133
- while (!deadlineReached) {
134
- const observations = await Promise.all([...new Set(processGroupIds)].map((processGroupId) => observeOwnedProcessGroup({
135
- runId,
136
- leaderPid: processGroupId,
137
- processGroupId,
138
- })));
139
- if (observations.some(({ state }) => state === "unverifiable")) {
140
- recordEvent("lifecycle", 1);
141
- return { state: "unverifiable", elapsed_ms: Date.now() - started };
142
- }
143
- if (observations.every(({ state }) => state === "empty")) {
144
- consecutiveEmpty += 1;
145
- if (consecutiveEmpty >= 2) {
146
- recordEvent("lifecycle", 1);
147
- return { state: "quiesced", elapsed_ms: Date.now() - started };
148
- }
149
- }
150
- else
151
- consecutiveEmpty = 0;
152
- deadlineReached = Date.now() - started >= settleMs;
153
- if (deadlineReached)
154
- break;
155
- await new Promise((resolve) => setTimeout(resolve, 50));
156
- }
157
- recordEvent("lifecycle", 1);
158
- return { state: "alive_at_deadline", elapsed_ms: Date.now() - started };
159
- };
160
- export const awaitTerminalExit = async ({ terminal, scenario, started, lastOutput, signal, timers, interactions, dispatchedEventIndexes, recordEvent, }) => new Promise((resolveExit) => {
161
- // The kill caused by a deadline is observed later as an ordinary PTY exit.
162
- // Keep the initiating lifecycle reason so comparisons distinguish a target
163
- // exit from harness-owned timeout, idle-timeout, and cancellation cleanup.
164
- let reason = "exited";
165
- terminal.onExit((exit) => {
166
- recordEvent("lifecycle", 0);
167
- for (const [eventIndex, event] of scenario.events.entries()) {
168
- if (dispatchedEventIndexes.has(eventIndex))
169
- continue;
170
- const sequence = interactions.length;
171
- interactions.push({
172
- sequence,
173
- scheduled_at_ms: event.at_ms,
174
- dispatched_at_ms: Math.max(0, Date.now() - started),
175
- type: event.type,
176
- data: event.type === "input"
177
- ? "<not-dispatched>"
178
- : event.type === "resize"
179
- ? `${String(event.columns)}x${String(event.rows)}`
180
- : event.signal,
181
- outcome: "target_exited",
182
- });
183
- recordEvent("interaction_events", sequence);
184
- }
185
- for (const timer of timers) {
186
- timer.cancel();
187
- }
188
- timers.clear();
189
- resolveExit({ ...exit, reason });
190
- });
191
- const timeout = scheduleProcessInterval(() => {
192
- if (signal?.aborted === true) {
193
- reason = "cancelled";
194
- terminal.kill("SIGKILL");
195
- }
196
- else if (Date.now() - started >= scenario.timeout_ms) {
197
- reason = "timeout";
198
- terminal.kill("SIGKILL");
199
- }
200
- else if (Date.now() - lastOutput() >= scenario.idle_timeout_ms) {
201
- reason = "idle_timeout";
202
- terminal.kill("SIGKILL");
203
- }
204
- }, 20);
205
- timers.add(timeout);
206
- });
207
- const processCaptureCleanupHost = {
208
- platform: process.platform,
209
- cleanupProcessGroup: cleanupOwnedProcessGroup,
210
- removeTemporaryRoot: (path) => rm(path, { recursive: true, force: true }),
211
- };
212
- export const releaseProcessResources = async (options) => {
213
- const host = options.host ?? processCaptureCleanupHost;
214
- for (const timer of options.timers)
215
- timer.cancel();
216
- let failure;
217
- try {
218
- await options.renderer?.dispose();
219
- }
220
- catch (cause) {
221
- void cause;
222
- failure ??= "terminal renderer cleanup failed";
223
- }
224
- if (options.terminal !== undefined && host.platform !== "win32") {
225
- for (const processGroupId of new Set(options.capturedProcessGroupIds)) {
226
- const cleaned = await host.cleanupProcessGroup({
227
- runId: options.runId,
228
- leaderPid: processGroupId,
229
- processGroupId,
230
- });
231
- if (!cleaned.cleaned)
232
- failure ??= cleaned.reason;
233
- }
234
- }
235
- try {
236
- await host.removeTemporaryRoot(options.temporaryRoot);
237
- }
238
- catch (cause) {
239
- void cause;
240
- failure ??= "temporary process root cleanup failed";
241
- }
242
- return failure;
243
- };
244
- export const captureTerminalFrames = (options) => {
245
- let outputBytes = 0;
246
- let truncated = false;
247
- options.terminal.onData((data) => {
248
- options.onOutput();
249
- const bytes = Buffer.byteLength(data);
250
- if (outputBytes + bytes > options.scenario.limits.output_bytes) {
251
- truncated = true;
252
- return;
253
- }
254
- outputBytes += bytes;
255
- const atMs = normalizeProcessElapsedTime(Date.now() - options.started, options.scenario.normalization.time_bucket_ms);
256
- const normalized = normalizeProcessText(data, options.scenario, options.temporaryRoot, options.terminal.pid);
257
- const sequence = options.frames.length;
258
- options.frames.push({
259
- sequence,
260
- at_ms: atMs,
261
- data: normalized,
262
- });
263
- options.renderer.write(data, atMs);
264
- options.recordEvent("frames", sequence);
265
- });
266
- return () => truncated;
267
- };
268
- export const resolveProcessResult = (capture, executionFailure, cleanupFailure) => {
269
- if (executionFailure instanceof ProcessCaptureError)
270
- throw executionFailure;
271
- if (executionFailure !== undefined)
272
- throw new ProcessCaptureError("process capture failed", {
273
- cause: executionFailure,
274
- });
275
- if (cleanupFailure !== undefined)
276
- throw new ProcessCaptureError(cleanupFailure, {
277
- reason: "cleanup_incomplete",
278
- });
279
- if (capture === undefined)
280
- throw new ProcessCaptureError("process capture produced no result");
281
- return capture;
282
- };
283
- export const prepareProcessCapture = async (scenario, signal, captureSnapshot = snapshotRoots, host = systemProcessPreparationHost) => {
284
- assertNotCancelled(signal);
285
- const before = await captureSnapshot(scenario, signal);
286
- const temporaryRoot = await host.createTemporaryRoot();
287
- try {
288
- const runId = randomUUID();
289
- return { temporaryRoot, runId, before };
290
- }
291
- catch (cause) {
292
- await host.cleanup(temporaryRoot);
293
- throw cause;
294
- }
295
- };
296
- const systemProcessPreparationHost = {
297
- createTemporaryRoot: () => mkdtemp(join(tmpdir(), "rea-process-")),
298
- cleanup: (path) => rm(path, { recursive: true, force: true }),
299
- };
@@ -1,124 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { lstat, mkdtemp, open, readdir, rename, rm, rmdir, unlink, } from "node:fs/promises";
3
- import { dirname, join } from "node:path";
4
- import { readBoundedFileBytes } from "../process/BoundedFileBytes.js";
5
- class StoreFileLockOccupied extends Error {
6
- code = "EEXIST";
7
- constructor(cause) {
8
- super("Store transaction lock is occupied", { cause });
9
- }
10
- }
11
- /** Atomically publish a populated directory so another owner cannot replace a live lock. */
12
- export const createStoreFileLock = async (path) => {
13
- if (await exists(path))
14
- throw new StoreFileLockOccupied();
15
- const staged = await mkdtemp(join(dirname(path), ".rea-store-lock-"));
16
- const owner = `owner-${randomUUID()}`;
17
- try {
18
- const handle = await open(join(staged, owner), "wx", 0o600);
19
- try {
20
- await handle.writeFile(`${String(process.pid)}\n`, "utf8");
21
- await handle.sync();
22
- }
23
- finally {
24
- await handle.close();
25
- }
26
- try {
27
- // Rename cannot replace a nonempty directory: the owner entry is present before publication.
28
- await rename(staged, path);
29
- }
30
- catch (cause) {
31
- if (await exists(path))
32
- throw new StoreFileLockOccupied(cause);
33
- throw cause;
34
- }
35
- return {
36
- release: async () => {
37
- await removeOwner(path, owner).catch((cause) => {
38
- // best-effort cleanup: lock release must not reject unhandled.
39
- void cause;
40
- });
41
- },
42
- };
43
- }
44
- finally {
45
- await rm(staged, { recursive: true, force: true });
46
- }
47
- };
48
- /** Recover a dead owner's directory lock or a legacy PID file; leave live and unknown owners intact. */
49
- export const removeStaleStoreFileLock = async (path) => {
50
- try {
51
- const stats = await lstat(path);
52
- if (stats.isFile()) {
53
- if (!(await ownerIsDead(path)))
54
- return false;
55
- await unlink(path);
56
- return true;
57
- }
58
- if (!stats.isDirectory())
59
- return false;
60
- const entries = await readdir(path);
61
- if (entries.length === 0) {
62
- await rmdir(path);
63
- return true;
64
- }
65
- const owner = entries[0];
66
- if (entries.length !== 1 ||
67
- owner === undefined ||
68
- !/^owner-[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/u.test(owner) ||
69
- !(await ownerIsDead(join(path, owner))))
70
- return false;
71
- await removeOwner(path, owner);
72
- return true;
73
- }
74
- catch (cause) {
75
- // best-effort cleanup: stale lock probing; failure means the lock stands.
76
- void cause;
77
- return false;
78
- }
79
- };
80
- const removeOwner = async (path, owner) => {
81
- // A successor has a different entry, so stale cleanup cannot make its directory empty.
82
- await unlink(join(path, owner));
83
- await rmdir(path);
84
- };
85
- const ownerIsDead = async (path) => {
86
- const stats = await lstat(path);
87
- if (!stats.isFile() || stats.size > 32)
88
- return false;
89
- const handle = await open(path, "r");
90
- let bytes;
91
- try {
92
- bytes = await readBoundedFileBytes(handle, 32);
93
- }
94
- finally {
95
- await handle.close();
96
- }
97
- const encoded = bytes?.toString("utf8").trim();
98
- return (encoded !== undefined &&
99
- /^[1-9][0-9]{0,9}$/u.test(encoded) &&
100
- !processIsAlive(Number(encoded)));
101
- };
102
- const exists = async (path) => {
103
- try {
104
- await lstat(path);
105
- return true;
106
- }
107
- catch (cause) {
108
- if (errorCode(cause) === "ENOENT")
109
- return false;
110
- throw cause;
111
- }
112
- };
113
- const processIsAlive = (pid) => {
114
- try {
115
- process.kill(pid, 0);
116
- return true;
117
- }
118
- catch (cause) {
119
- return errorCode(cause) !== "ESRCH";
120
- }
121
- };
122
- const errorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
123
- ? cause.code
124
- : undefined;
@@ -1,2 +0,0 @@
1
- /** Minimal valid process capture retained as a public contract example. */
2
- export { EMPTY_PROCESS_CAPTURE_EXAMPLE } from "../domain/processCaptureExample.js";