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
@@ -16,9 +16,19 @@ const ipcEventKinds = new Set([
16
16
  "ipc-renderer-post-message",
17
17
  ]);
18
18
  const events = [];
19
+ // Budget serialized data and estimated retained object/array storage together.
20
+ const retentionBudgetBytes = 16 * 1024 * 1024;
21
+ const snapshotEnvelopeReserveBytes = 1024;
22
+ let estimatedRetainedBytes = 0;
23
+ let serializedBytes = 0;
19
24
  let observed = 0;
20
25
  let observedIpc = 0;
21
26
  let observedRuntime = 0;
27
+ let dropped = 0;
28
+ let droppedIpc = 0;
29
+ let droppedRuntime = 0;
30
+ const droppedFamilies = new Map();
31
+ const droppedRoles = new Map();
22
32
  let sequence = 0;
23
33
  let correlationSequence = 0;
24
34
 
@@ -43,6 +53,73 @@ const shape = (value, depth = 0) => {
43
53
  }
44
54
  };
45
55
 
56
+ // Measure JSON strings without allocating an encoded copy of a caller value.
57
+ const jsonStringBytes = (value) => {
58
+ let bytes = 2;
59
+ for (let index = 0; index < value.length; index += 1) {
60
+ const code = value.charCodeAt(index);
61
+ if (code === 0x22 || code === 0x5c) bytes += 2;
62
+ else if (
63
+ code === 0x08 ||
64
+ code === 0x09 ||
65
+ code === 0x0a ||
66
+ code === 0x0c ||
67
+ code === 0x0d
68
+ )
69
+ bytes += 2;
70
+ else if (code <= 0x1f) bytes += 6;
71
+ else if (code >= 0xd800 && code <= 0xdbff) {
72
+ const next = value.charCodeAt(index + 1);
73
+ if (next >= 0xdc00 && next <= 0xdfff) {
74
+ bytes += 4;
75
+ index += 1;
76
+ } else bytes += 6;
77
+ } else if (code >= 0xdc00 && code <= 0xdfff) bytes += 6;
78
+ else if (code <= 0x7f) bytes += 1;
79
+ else if (code <= 0x7ff) bytes += 2;
80
+ else bytes += 3;
81
+ if (bytes > retentionBudgetBytes) return bytes;
82
+ }
83
+ return bytes;
84
+ };
85
+
86
+ const jsonScalarBytes = (value) => {
87
+ if (value === null) return 4;
88
+ if (typeof value === "string") return jsonStringBytes(value);
89
+ if (typeof value === "boolean") return value ? 4 : 5;
90
+ return String(value).length;
91
+ };
92
+
93
+ const eventFamily = (kind, processTypeValue) => {
94
+ if (kind === "preload" && processTypeValue === "main")
95
+ return "preload-configuration";
96
+ if (kind.startsWith("ipc-renderer"))
97
+ return processTypeValue === "renderer" ? "renderer-ipc" : "ipc";
98
+ return ipcEventKinds.has(kind) ? "ipc" : kind;
99
+ };
100
+
101
+ const noteDropped = (kind, processTypeValue, isIpc) => {
102
+ dropped += 1;
103
+ if (isIpc) droppedIpc += 1;
104
+ else droppedRuntime += 1;
105
+ const family = eventFamily(kind, processTypeValue);
106
+ droppedFamilies.set(family, (droppedFamilies.get(family) ?? 0) + 1);
107
+ if (typeof processTypeValue === "string")
108
+ droppedRoles.set(
109
+ processTypeValue,
110
+ (droppedRoles.get(processTypeValue) ?? 0) + 1,
111
+ );
112
+ if (kind === "window-lifecycle")
113
+ droppedRoles.set("window", (droppedRoles.get("window") ?? 0) + 1);
114
+ if (kind === "web-contents-lifecycle" || kind === "navigation")
115
+ droppedRoles.set(
116
+ "web_contents",
117
+ (droppedRoles.get("web_contents") ?? 0) + 1,
118
+ );
119
+ if (kind === "preload" && processTypeValue === "preload")
120
+ droppedRoles.set("preload", (droppedRoles.get("preload") ?? 0) + 1);
121
+ };
122
+
46
123
  const isAllowedNavigation = (value) => {
47
124
  if (typeof value !== "string") return true;
48
125
  try {
@@ -83,7 +160,8 @@ const frameIdentity = (event) => {
83
160
 
84
161
  const record = (event) => {
85
162
  observed += 1;
86
- if (ipcEventKinds.has(event.kind)) observedIpc += 1;
163
+ const isIpc = ipcEventKinds.has(event.kind);
164
+ if (isIpc) observedIpc += 1;
87
165
  else observedRuntime += 1;
88
166
  const raw = {
89
167
  sequence: ++sequence,
@@ -109,10 +187,15 @@ const record = (event) => {
109
187
  error: false,
110
188
  ...event,
111
189
  };
112
- const argumentShapes = Array.isArray(raw.argument_shapes)
190
+ const shapeGroups = Array.isArray(raw.argument_shape_value_groups)
191
+ ? raw.argument_shape_value_groups.filter(Array.isArray)
192
+ : Array.isArray(raw.argument_shape_values)
193
+ ? [raw.argument_shape_values]
194
+ : [];
195
+ const existingShapes = Array.isArray(raw.argument_shapes)
113
196
  ? raw.argument_shapes
114
197
  : [];
115
- events.push({
198
+ const retainedEvent = {
116
199
  ...raw,
117
200
  correlation_id: raw.correlation_id,
118
201
  event: typeof raw.event === "string" ? raw.event : null,
@@ -121,9 +204,7 @@ const record = (event) => {
121
204
  receiver: typeof raw.receiver === "string" ? raw.receiver : null,
122
205
  frame: typeof raw.frame === "string" ? raw.frame : null,
123
206
  target: typeof raw.target === "string" ? raw.target : null,
124
- argument_shapes: argumentShapes.map((value) =>
125
- typeof value === "string" ? value : "unknown",
126
- ),
207
+ argument_shapes: [],
127
208
  result_shape:
128
209
  typeof raw.result_shape === "string" ? raw.result_shape : null,
129
210
  process_type:
@@ -132,8 +213,91 @@ const record = (event) => {
132
213
  typeof raw.artifact_path === "string" ? raw.artifact_path : null,
133
214
  artifact_sha256:
134
215
  typeof raw.artifact_sha256 === "string" ? raw.artifact_sha256 : null,
135
- });
136
- return events.at(-1);
216
+ };
217
+ delete retainedEvent.argument_shape_values;
218
+ delete retainedEvent.argument_shape_value_groups;
219
+
220
+ // All event values are JSON scalars except argument_shapes. Measure them
221
+ // incrementally so large channels, paths, or shape lists never require a
222
+ // full JSON.stringify temporary allocation before the budget decision.
223
+ let eventBytes = 2;
224
+ let argumentShapeCount = 0;
225
+ const eventKeys = Object.keys(retainedEvent);
226
+ for (let index = 0; index < eventKeys.length; index += 1) {
227
+ const key = eventKeys[index];
228
+ const value = retainedEvent[key];
229
+ if (index > 0) eventBytes += 1;
230
+ eventBytes += jsonStringBytes(key) + 1;
231
+ if (key === "argument_shapes") {
232
+ eventBytes += 2;
233
+ let shapeOverflow = false;
234
+ const countShape = (argument) => {
235
+ const encodedShapeBytes = jsonStringBytes(shape(argument));
236
+ eventBytes += encodedShapeBytes + (argumentShapeCount === 0 ? 0 : 1);
237
+ argumentShapeCount += 1;
238
+ shapeOverflow =
239
+ eventBytes + estimatedRetainedBytes + snapshotEnvelopeReserveBytes >
240
+ retentionBudgetBytes;
241
+ };
242
+ for (const group of shapeGroups)
243
+ for (const argument of group) {
244
+ countShape(argument);
245
+ if (shapeOverflow) break;
246
+ }
247
+ if (shapeOverflow) {
248
+ noteDropped(raw.kind, retainedEvent.process_type, isIpc);
249
+ return null;
250
+ }
251
+ for (const valueShape of existingShapes)
252
+ if (!shapeOverflow) {
253
+ eventBytes +=
254
+ jsonStringBytes(
255
+ typeof valueShape === "string" ? valueShape : "unknown",
256
+ ) + (argumentShapeCount++ === 0 ? 0 : 1);
257
+ shapeOverflow =
258
+ eventBytes + estimatedRetainedBytes + snapshotEnvelopeReserveBytes >
259
+ retentionBudgetBytes;
260
+ }
261
+ if (shapeOverflow) {
262
+ noteDropped(raw.kind, retainedEvent.process_type, isIpc);
263
+ return null;
264
+ }
265
+ } else eventBytes += jsonScalarBytes(value);
266
+ if (
267
+ eventBytes + estimatedRetainedBytes + snapshotEnvelopeReserveBytes >
268
+ retentionBudgetBytes
269
+ ) {
270
+ noteDropped(raw.kind, retainedEvent.process_type, isIpc);
271
+ return null;
272
+ }
273
+ }
274
+ // Reserve room for the only fields mutated after recording: result_shape and
275
+ // error. The shape vocabulary's longest value is "undefined".
276
+ const reservedMutationBytes = retainedEvent.result_shape === null ? 7 : 0;
277
+ // Include one byte for the event-array separator and reserve space for the
278
+ // snapshot's counters and JSON delimiters.
279
+ // One retained event, one defensive snapshot copy, and up to two serialized
280
+ // result views (timeline plus IPC), with per-object and per-array-slot costs.
281
+ const eventEstimateBytes = eventBytes * 3 + 512 + argumentShapeCount * 16;
282
+ const retainedEventBytes = eventEstimateBytes + reservedMutationBytes + 1;
283
+ if (
284
+ estimatedRetainedBytes + retainedEventBytes + snapshotEnvelopeReserveBytes >
285
+ retentionBudgetBytes
286
+ ) {
287
+ noteDropped(raw.kind, retainedEvent.process_type, isIpc);
288
+ return null;
289
+ }
290
+ for (const group of shapeGroups)
291
+ for (const argument of group)
292
+ retainedEvent.argument_shapes.push(shape(argument));
293
+ for (const valueShape of existingShapes)
294
+ retainedEvent.argument_shapes.push(
295
+ typeof valueShape === "string" ? valueShape : "unknown",
296
+ );
297
+ events.push(retainedEvent);
298
+ estimatedRetainedBytes += retainedEventBytes;
299
+ serializedBytes += eventBytes + reservedMutationBytes + 1;
300
+ return retainedEvent;
137
301
  };
138
302
 
139
303
  const recordRuntime = (kind, event, phase, details = {}) =>
@@ -145,7 +309,7 @@ const recordIpc = (kind, channel, args, details = {}) =>
145
309
  return record({
146
310
  kind,
147
311
  channel: typeof channel === "string" ? channel : null,
148
- argument_shapes: values.map((value) => shape(value)),
312
+ argument_shape_values: values,
149
313
  ...details,
150
314
  });
151
315
  })();
@@ -222,7 +386,7 @@ const patchNavigationMethods = (webContents, contentsId) => {
222
386
  webContents[method] = function patchedNavigation(...args) {
223
387
  recordRuntime("navigation", method, "attempted", {
224
388
  target: contentsId,
225
- argument_shapes: args.map((value) => shape(value)),
389
+ argument_shape_values: args,
226
390
  });
227
391
  if (method === "loadURL" && !isAllowedNavigation(args[0])) {
228
392
  recordRuntime("navigation", method, "blocked", {
@@ -354,7 +518,7 @@ const patchWebContents = (webContents, windowId) => {
354
518
  recordRuntime("navigation", event, "blocked", {
355
519
  target: contentsId,
356
520
  sender: windowId,
357
- argument_shapes: args.map((value) => shape(value)),
521
+ argument_shape_values: args,
358
522
  error: true,
359
523
  });
360
524
  return;
@@ -363,7 +527,7 @@ const patchWebContents = (webContents, windowId) => {
363
527
  recordRuntime(kind, event, "observed", {
364
528
  target: contentsId,
365
529
  sender: windowId,
366
- argument_shapes: args.map((value) => shape(value)),
530
+ argument_shape_values: args,
367
531
  error: kind === "error",
368
532
  });
369
533
  if (event === "did-create-window") {
@@ -379,31 +543,44 @@ const patchWebContents = (webContents, windowId) => {
379
543
  boundaries.patchWindowOpenHandler(webContents, contentsId);
380
544
  };
381
545
 
382
- const patchBrowserWindow = (electron) => {
383
- const original = electron.BrowserWindow;
384
- if (typeof original !== "function") return;
385
- electron.BrowserWindow = new Proxy(original, {
386
- construct(target, args, newTarget) {
387
- const window = Reflect.construct(target, args, newTarget);
388
- const targetId = identity(window, "window");
389
- recordRuntime("window-lifecycle", "created", "completed", {
390
- target: targetId,
391
- argument_shapes: args.map((value) => shape(value)),
392
- });
393
- const preload = args[0]?.webPreferences?.preload;
546
+ const patchWindows = (app) => {
547
+ if (app === null || app === undefined) return;
548
+ app.on("browser-window-created", (_event, window) => {
549
+ const targetId = identity(window, "window");
550
+ recordRuntime("window-lifecycle", "created", "completed", {
551
+ target: targetId,
552
+ capture_method: "event-emitter",
553
+ });
554
+ try {
555
+ // Electron 44 separates the preload descriptor from WebPreferences.
556
+ // Read the engine's descriptor, never infer a path from application code.
557
+ const preferences = window.webContents.getLastWebPreferences?.();
558
+ const preload =
559
+ typeof preferences?.preload === "string"
560
+ ? preferences.preload
561
+ : window.webContents._getPreloadScript?.()?.filePath;
394
562
  if (typeof preload === "string")
395
563
  recordRuntime("preload", "configured", "completed", {
396
564
  target: targetId,
397
565
  artifact_path: preload,
398
566
  });
399
- patchEmitter(window, (event) =>
400
- recordRuntime("window-lifecycle", event, "observed", {
567
+ } catch (cause) {
568
+ recordRuntime(
569
+ "error",
570
+ cause instanceof Error ? cause.message : String(cause),
571
+ "failed",
572
+ {
401
573
  target: targetId,
402
- }),
574
+ error: true,
575
+ },
403
576
  );
404
- patchWebContents(window.webContents, targetId);
405
- return window;
406
- },
577
+ }
578
+ patchEmitter(window, (event) =>
579
+ recordRuntime("window-lifecycle", event, "observed", {
580
+ target: targetId,
581
+ }),
582
+ );
583
+ patchWebContents(window.webContents, targetId);
407
584
  });
408
585
  };
409
586
 
@@ -427,7 +604,7 @@ try {
427
604
  "observed",
428
605
  {
429
606
  target: "app",
430
- argument_shapes: args.map((value) => shape(value)),
607
+ argument_shape_values: args,
431
608
  process_type: "main",
432
609
  },
433
610
  ),
@@ -435,33 +612,60 @@ try {
435
612
  patchIpcMain(electron.ipcMain);
436
613
  boundaries.patchIpcRenderer(electron.ipcRenderer);
437
614
  boundaries.patchContextBridge(electron.contextBridge);
438
- patchBrowserWindow(electron);
615
+ patchWindows(electron.app);
439
616
  boundaries.patchUtilityProcess(electron.utilityProcess);
440
617
  boundaries.patchShell(electron.shell);
441
- boundaries.patchSessionManager(electron.session);
618
+ boundaries.patchSessionManager(electron.session, electron.app);
442
619
  boundaries.patchApplicationEffects(electron.app);
443
620
  boundaries.patchNativeAddonLoading();
444
621
  boundaries.patchChildProcess();
445
622
  process.once("uncaughtException", (cause, origin) => {
446
623
  recordRuntime("process-lifecycle", "uncaught-exception", "observed", {
447
- argument_shapes: [shape(cause), shape(origin)],
624
+ argument_shape_values: [cause, origin],
448
625
  error: true,
449
626
  });
450
627
  throw cause;
451
628
  });
452
629
  process.once("unhandledRejection", (reason, promise) => {
453
630
  recordRuntime("process-lifecycle", "unhandled-rejection", "observed", {
454
- argument_shapes: [shape(reason), shape(promise)],
631
+ argument_shape_values: [reason, promise],
455
632
  error: true,
456
633
  });
457
634
  throw reason;
458
635
  });
459
- } catch {
636
+ } catch (cause) {
460
637
  globalThis.__reaElectronActiveHookError = true;
638
+ recordRuntime(
639
+ "error",
640
+ cause instanceof Error ? cause.message : String(cause),
641
+ "failed",
642
+ {
643
+ target: "active-hook-installation",
644
+ error: true,
645
+ },
646
+ );
461
647
  }
462
648
 
463
649
  globalThis.__reaElectronActiveSnapshot = () => ({
464
- events: events.slice(),
650
+ events: events.map((event) => ({
651
+ ...event,
652
+ argument_shapes: [...event.argument_shapes],
653
+ })),
654
+ retention_budget_bytes: retentionBudgetBytes,
655
+ estimated_retained_bytes: estimatedRetainedBytes,
656
+ event_serialized_byte_upper_bound: serializedBytes,
657
+ retained: events.length,
658
+ dropped,
659
+ dropped_ipc: droppedIpc,
660
+ dropped_runtime: droppedRuntime,
661
+ dropped_event_families: [...droppedFamilies].map(([family, count]) => ({
662
+ family,
663
+ count,
664
+ })),
665
+ dropped_event_roles: [...droppedRoles].map(([role, count]) => ({
666
+ role,
667
+ count,
668
+ })),
465
669
  observed,
466
670
  observed_ipc: observedIpc,
467
671
  observed_runtime: observedRuntime,
package/scripts/rea.mjs CHANGED
@@ -19,7 +19,7 @@ const runtimeFiles = isMcpMode
19
19
  ? ["dist/main.js"]
20
20
  : isMcpDoctorMode
21
21
  ? ["dist/main.js", "dist/mcpDoctor.js"]
22
- : ["dist/cli.js", "dist/cliOutput.js"];
22
+ : ["dist/cli.js", "dist/cliOutput.js", "dist/cli/streamedJsonOutput.js"];
23
23
 
24
24
  if (!(await compiledRuntimeExists(runtimeFiles))) {
25
25
  process.stderr.write(
@@ -39,6 +39,8 @@ if (!(await compiledRuntimeExists(runtimeFiles))) {
39
39
  process.exitCode = result.exitCode;
40
40
  } else {
41
41
  const { createCli } = await import("../dist/cli.js");
42
+ const { createStreamedCliJsonOutput } =
43
+ await import("../dist/cli/streamedJsonOutput.js");
42
44
  const {
43
45
  renderCliOutputArgumentError,
44
46
  renderEmptyFilteredCliOutput,
@@ -51,14 +53,20 @@ if (!(await compiledRuntimeExists(runtimeFiles))) {
51
53
  process.exitCode = 1;
52
54
  } else {
53
55
  let wroteOutput = false;
54
- await createCli().serve(args, {
56
+ const resultOutput = createStreamedCliJsonOutput(args, process.stdout);
57
+ await createCli(process.env, resultOutput).serve(args, {
55
58
  stdout: (output) => {
59
+ if (resultOutput?.handled) {
60
+ if (resultOutput.failed)
61
+ process.stderr.write(sanitizeCliOutput(output));
62
+ return;
63
+ }
56
64
  const sanitized = sanitizeCliOutput(output);
57
65
  if (sanitized.length > 0) wroteOutput = true;
58
66
  process.stdout.write(sanitized);
59
67
  },
60
68
  });
61
- if (!wroteOutput)
69
+ if (!wroteOutput && !resultOutput?.handled)
62
70
  process.stdout.write(renderEmptyFilteredCliOutput(args) ?? "");
63
71
  }
64
72
  }
@@ -2,9 +2,8 @@
2
2
  name: reverse-engineer-anything
3
3
  description: Reverse engineer native, managed, Electron/JavaScript, packaged, firmware, and browser targets with REA. Use shipped-artifact or requested runtime evidence to explain features, compare versions, decompile code, or guide a reconstruction. Skip REA for ordinary source-repository architecture analysis.
4
4
  metadata:
5
- version: "27"
6
- tool_count: 133
7
- catalog_digest: "83b4c3445ed0ec003c0aeefa3188f123d9ae319484f8b1e2b611d2fe278c9c72"
5
+ version: "33"
6
+ tool_count: 138
8
7
  ---
9
8
 
10
9
  # REA
@@ -33,7 +32,9 @@ When tools are absent or registration is stale:
33
32
  `npx -y rea-agents@latest doctor --client codex --json`. Substitute the current
34
33
  supported client: `claude_code`, `claude_desktop`, `codex`, `cursor`,
35
34
  `gemini_cli`, `windsurf`, `devin`, `opencode`, `antigravity`, `copilot_cli`,
36
- `commandcode`, or `vscode`. If the client is unknown, use `doctor --json` and
35
+ `commandcode`, `vscode`, `grok_build`, or `grok_bot`. `grok_bot` has no local
36
+ file registration: doctor reports the Grok Bot chat step, and setup does not
37
+ write `mcp.json`. If the client is unknown, use `doctor --json` and
37
38
  inspect its registration results before choosing a setup scope.
38
39
  2. Distinguish the reason. Missing, malformed, or stale registration needs a
39
40
  scoped configuration repair. An aligned registration with no tools in the
@@ -93,7 +94,27 @@ explicit path or endpoint and do not need it.
93
94
  consult the NativeAOT workflow in `references/native-and-artifacts.md` for
94
95
  optional metadata recovery and its supported host/layout boundary.
95
96
  - User-owned browser page already open: `list_browser_targets`.
97
+ - Retained HAR/native mitmproxy capture: `inspect_web_network_capture`. Select
98
+ original record ordinals when useful; inspect producer fields and byte/number
99
+ sidecars without fetching recorded URLs or claiming live attribution. See
100
+ [historical captures](https://github.com/morluto/rea/blob/main/docs/web-network-captures.md) for the exact upstream
101
+ profile and credential exclusions.
96
102
  - User-owned Electron runtime already open: `list_electron_targets`.
103
+ - Explicit local EVM bytecode carrier: `inspect_evm_interface` with caller-selected
104
+ `raw` or `hex` encoding. Preserve carrier/decoded digests and treat selectors,
105
+ argument strings and mutability as inferred candidates; this performs no chain
106
+ lookup or target execution. See the
107
+ [EVM bytecode guide](https://github.com/morluto/rea/blob/main/docs/evm-bytecode.md).
108
+ - Explicit Linux ELF file for offline layout, symbols, relocations or static
109
+ mitigation evidence: `inspect_binary_layout`. This target-free operation uses
110
+ caller-supplied pwntools without opening a disassembler database. Preserve its
111
+ raw locations and inference/coverage limits; see the
112
+ [offline binary guide](https://github.com/morluto/rea/blob/main/docs/binary-diagnostics.md).
113
+ - Supplied Linux x86-64 ELF core: `inspect_recorded_crash`. Read every recorded
114
+ thread, raw note and source-bound register without opening a live target.
115
+ Historical PIDs do not select live processes. Request `include_debugger_context`
116
+ only when core-only mapping candidates help; see the
117
+ [recorded crash guide](https://github.com/morluto/rea/blob/main/docs/recorded-crashes.md).
97
118
  - Native executable, library, or analysis database: `open_binary`, then
98
119
  use focused analysis tools directly; call `binary_overview` when metadata or
99
120
  inventory context is useful and available from the selected provider.
@@ -126,6 +147,13 @@ Start with the default result and use its inline Evidence and graph context.
126
147
  Do not repeat an identical tool call. Make a focused follow-up only when the
127
148
  returned result leaves a specific question unanswered.
128
149
 
150
+ If MCP reports `resource_constraint` with `details.resource: "transport"`, use
151
+ its reported same-session Evidence reference with a focused application tool,
152
+ or call `export_evidence_bundle` to write the complete session to a selected
153
+ path. The analysis remains complete in the ledger; avoid repeating it merely
154
+ to request the same oversized response. Complete CLI JSON output also streams
155
+ without a single MCP frame.
156
+
129
157
  Every conclusion must distinguish observations, inferences, and unknowns. Cite
130
158
  Evidence IDs, preserve limitations and incomplete coverage, and never imply
131
159
  that static analysis observed execution. Runtime requests execute the declared
@@ -2,10 +2,17 @@
2
2
 
3
3
  Use `analyze_javascript_application` directly on the operator-supplied ASAR or
4
4
  extracted tree. The complete result, graph, and Evidence context are returned
5
- inline. Source-map contents are part of the static analysis. Start from its
5
+ inline when they fit the MCP frame. Source-map contents are part of the static analysis. Start from its
6
6
  findings, coverage, unknowns, and graph context, then make a focused follow-up
7
7
  only when a specific question remains unanswered.
8
8
 
9
+ An oversized response reports `resource_constraint` and
10
+ `details.resource: "transport"`. Reuse
11
+ `details.reported_limits.evidence_reference` with `trace_application_feature`
12
+ for the module or feature under investigation. `export_evidence_bundle` writes
13
+ the complete canonical session to a caller-selected file. Both workflows keep
14
+ the original Evidence and coverage; a broad follow-up can also exceed framing.
15
+
9
16
  BrowserWindow preferences, preload and contextBridge surfaces, IPC
10
17
  registrations, utility processes, and native binding requests are static syntax
11
18
  observations. Only a unique exact literal IPC channel match supports an inferred
@@ -1,5 +1,21 @@
1
1
  # Native, managed, and packaged artifacts
2
2
 
3
+ ## Recorded Linux crashes
4
+
5
+ Use `inspect_recorded_crash` with an explicit Linux x86-64 ELF core path to
6
+ inspect historical thread registers, signals, raw notes and original file
7
+ ranges. It is independent of the active disassembler target. Source-bound
8
+ register values and note bytes are observations; missing notes, signal-thread
9
+ association and current executable/library identity remain unknown. PIDs are
10
+ historical metadata and never authorize live attach or control.
11
+
12
+ The optional `include_debugger_context` facet adds mapping candidates through
13
+ caller-supplied GDB/pwndbg in an owned core-only session. Display names do not
14
+ establish current file identity; zero reported flags leave permissions unknown.
15
+ Requested unavailable context fails with setup guidance. See
16
+ [recorded crashes](https://github.com/morluto/rea/blob/main/docs/recorded-crashes.md)
17
+ for exact upstream profiles, bounds and verification coverage.
18
+
3
19
  ## Native targets
4
20
 
5
21
  After `open_binary`, use focused search, procedure, or function tools directly.
@@ -9,6 +25,12 @@ cross-references. Addresses and recovered pseudocode are analysis observations,
9
25
  not original source. Provider unavailability and unsupported metadata remain
10
26
  unknown rather than false.
11
27
 
28
+ To see which functions or Objective-C methods a Mach-O actually calls in one
29
+ run, use `observe_native_calls` with explicit breakpoints and a bounded
30
+ `duration_ms`/`max_events`. It launches a new process under LLDB, so the target
31
+ runs and may change files or use the network. Hardened-runtime targets need the
32
+ `get-task-allow` entitlement.
33
+
12
34
  Use `binary_session` with no arguments to check the open target, selected
13
35
  provider, and alignment. Its default `result.tool_availability` includes the
14
36
  complete tool inventory with availability reasons and remediation. When choosing
@@ -77,6 +99,13 @@ helpers, launchd plists, symlinks, and each bundle's `info_plist_path` and
77
99
  executable candidates. Roles are path conventions, not parsed plists; read the
78
100
  listed plists with `inspect_plist`.
79
101
 
102
+ After `open_binary` on a `.app` or Mach-O, use `trace_dylib_resolution` to see
103
+ which file each `@rpath`, `@loader_path` and `@executable_path` load reaches for
104
+ every executable in the bundle. It also lists missing or weak loads and earlier
105
+ `@rpath` candidates that are absent. Narrow large bundles with `roots` or
106
+ `architecture`. System paths stay undetermined because the dyld shared cache
107
+ provides them.
108
+
80
109
  Use `extract_artifact` when materialized files are needed. It takes no arguments
81
110
  and materializes all regular files into a fresh temporary directory chosen by
82
111
  REA. Symlinks and encrypted entries are inventory facts, not extractable files.
@@ -0,0 +1,60 @@
1
+ # Upstream analysis engines
2
+
3
+ REA integrates existing tools through provider adapters. Upstream source remains
4
+ unmodified and retains its own license; it is not copied into REA's domain or
5
+ application code.
6
+
7
+ ## jadx-headless-mcp
8
+
9
+ - Source: <https://github.com/1013503897/jadx-headless-mcp>
10
+ - Submodule: `third_party/jadx-headless-mcp`
11
+ - Release: `v0.7.1`
12
+ - Commit: `5844800a486d2248fa949b74c9896285f5b54de2`
13
+ - License: Apache-2.0; see the submodule's `LICENSE`.
14
+ - Release identity: `src/android/JadxRelease.ts`.
15
+ - REA integration: `src/android/`; no upstream patches in this version.
16
+
17
+ Fetch source for inspection with:
18
+
19
+ ```sh
20
+ git submodule update --init third_party/jadx-headless-mcp
21
+ ```
22
+
23
+ Normal REA builds and installed npm packages do not require this submodule or a
24
+ Gradle build. Supply a separately obtained JAR with `REA_JADX_MCP_JAR`; REA never
25
+ downloads engines during an analysis operation. The audited release JAR is
26
+ identified by SHA-256. A caller-supplied build reporting the supported protocol
27
+ version retains its actual digest and an unknown source revision unless its
28
+ bytes match the audited release.
29
+
30
+ When updating: review upstream protocol and license changes, update the gitlink
31
+ and release identity together, exercise the adapter's producer regressions, and
32
+ run the real APK CLI/MCP lane. Never attribute modified engine bytes to the
33
+ audited source revision.
34
+
35
+ ## Public APK fixture
36
+
37
+ `scripts/fetch-android-fixtures.mjs` explicitly downloads the audited engine and
38
+ Appium ApiDemos v6.0.18 into ignored `_reference/apk-integration/`. Both downloads
39
+ are checked against fixed SHA-256 values. Fixture provenance is recorded in
40
+ `scripts/fixtures/android-apidemos.json`; the source uses Apache-2.0. This is a
41
+ static analysis fixture: no emulator, device, SDK installation or app execution
42
+ is needed. APKs and JARs are neither tracked nor included in npm packages.
43
+
44
+ ## Firmware engines
45
+
46
+ | Engine | Source | Release | Pinned commit | License |
47
+ | --- | --- | --- | --- | --- |
48
+ | Binwalk | <https://github.com/ReFirmLabs/binwalk> | v3.1.0 | `4fdab3d464d97b68e0af9088df3f9e2e1545b21c` | MIT, upstream `LICENSE` |
49
+ | Unblob | <https://github.com/onekey-sec/unblob> | 26.6.4 | `1fcc7a0a584a70a96c31f5a276c20944d199a089` | MIT, upstream `LICENSE` |
50
+
51
+ Source remains unmodified in `third_party/binwalk` and `third_party/unblob`.
52
+ Release records live in `src/firmware/FirmwareRelease.ts`; REA adapters own the
53
+ CLI/report interpretation and lifecycle in `src/firmware/`. Caller-supplied
54
+ executables retain their actual launcher digest and unknown source revision;
55
+ version output alone does not establish source identity. REA does not bundle
56
+ extractors or download/install firmware engines during analysis.
57
+
58
+ On updates: inspect actual pinned CLI and report producers, preserve licenses,
59
+ update gitlinks/release records, run report regressions and the real firmware
60
+ lane. See [firmware setup and coverage](../docs/firmware-analysis.md).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Maxim Andreev
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.