rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- **English** · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md)
3
+ **English** · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md)
4
4
 
5
5
  # REA: Reverse Engineer Anything
6
6
 
@@ -11,7 +11,7 @@
11
11
  [![npm version](https://img.shields.io/npm/v/rea-agents?style=flat-square&color=cb3837)](https://www.npmjs.com/package/rea-agents)
12
12
  [![CI](https://img.shields.io/github/actions/workflow/status/morluto/rea/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/morluto/rea/actions/workflows/ci.yml)
13
13
  [![MCP tool catalog](https://img.shields.io/badge/MCP-tool_catalog-5c4ee5?style=flat-square)](docs/mcp-contracts.md#generated-catalog)
14
- [![Node.js 22+](https://img.shields.io/badge/Node.js-22.19%2B-339933?style=flat-square&logo=nodedotjs&logoColor=white)](https://nodejs.org/)
14
+ [![Node.js requirements](https://img.shields.io/badge/Node.js-requirements-339933?style=flat-square&logo=nodedotjs&logoColor=white)](#what-you-can-analyze)
15
15
  [![skills.sh](https://skills.sh/b/morluto/rea?style=flat-square)](https://skills.sh/morluto/rea/reverse-engineer-anything)
16
16
  [![MIT license](https://img.shields.io/badge/license-MIT-f4c430?style=flat-square)](LICENSE)
17
17
  [![Discord](https://img.shields.io/discord/1556595354999332884?logo=discord&logoColor=white&label=Discord&color=5865F2)](https://discord.gg/GkcryMnJDM)
@@ -28,7 +28,7 @@
28
28
 
29
29
  <img src="docs/assets/rea-hopper-analysis.png" alt="REA launching its analysis bridge inside Hopper while inspecting a native binary" width="1200" />
30
30
 
31
- <br />
31
+ <br /><br />
32
32
 
33
33
  <table aria-label="REA community">
34
34
  <tr>
@@ -52,7 +52,7 @@ See a feature in an app that you want in your own product? Ask your agent to inv
52
52
 
53
53
  REA connects your agent to tools for inspecting native binaries, JavaScript and Electron apps, .NET assemblies, and websites. You can also use the same tools from your terminal. Analysis runs locally, and results include the evidence and limitations behind each conclusion.
54
54
 
55
- Setup registers REA with your agent and installs matching workflow instructions. Native analysis can use an existing Hopper or Ghidra installation; setup can optionally install Hopper with approval. Static JavaScript analysis needs neither engine.
55
+ Setup registers REA with your agent and installs matching workflow instructions. Native analysis can use an existing Hopper, Ghidra, or IDA installation; setup can optionally install Hopper with approval. Static JavaScript analysis needs no native analysis engine.
56
56
 
57
57
  > **[Visit the REA website](https://rea.tools/)** for setup instructions, illustrated guides, and real case studies.
58
58
 
@@ -156,8 +156,8 @@ Additional tools and host support depend on the target:
156
156
  | JavaScript / Electron | Modules, imports, source maps, routes, IPC and native add-on relationships | Node.js and npm; [application analysis](https://rea.tools/guides/javascript/) |
157
157
  | Websites | Page structure, scripts, network observations and requested screenshots | A Chrome-family browser; [browser analysis](https://rea.tools/guides/browser/) |
158
158
  | Saved network captures | Requests, responses, exposed payloads and source locations | HAR; mitmdump on Linux for native mitmproxy captures; [capture guide](docs/web-network-captures.md) |
159
- | .NET assemblies | Metadata, CIL instructions, declared native dependencies and build comparisons | Static inspection; [managed-code guide](docs/managed-code-analysis.md) |
160
- | Android APKs | Manifest declarations, classes, decompiled methods and references | Headless JADX and a full JDK on Linux/macOS; [Android guide](docs/android-analysis.md) |
159
+ | .NET assemblies | Metadata, CIL instructions, declared native dependencies and build comparisons | None (static only); [managed-code guide](docs/managed-code-analysis.md) |
160
+ | Android APKs | Manifest declarations, classes, decompiled methods and references | Headless JADX and a full JDK on Linux/macOS/Windows x64; [Android guide](docs/android-analysis.md) |
161
161
  | Firmware | Regions, extraction results and native-analysis handoffs | Binwalk / Unblob on Linux; [firmware guide](docs/firmware-analysis.md) |
162
162
  | Packages and resources | File inventories, digests, plists, Apple bundle anatomy and extracted resources | [Artifact and JavaScript guide](docs/javascript-artifact-reconstruction.md), [Apple applications](docs/apple-application-analysis.md) |
163
163
  | Process behavior | Terminal output, interactions, exit and filesystem observations, and run comparisons | Linux/macOS with a native PTY; [process capture](docs/process-capture.md) |
@@ -181,6 +181,8 @@ for features added since the latest npm release.
181
181
 
182
182
  ## Showcases
183
183
 
184
+ [![Illustrations of the DX-Ball sound-pan, Notion clipboard-bridge, and TH04 bullet-ring showcases](docs/assets/rea-showcases.png)](https://rea.tools/showcase/)
185
+
184
186
  ### DX-Ball: reconstruct a sound-pan calculation
185
187
 
186
188
  Follow a sound call into its position-to-pan helper, inspect the instructions,
@@ -243,7 +245,7 @@ ask you to choose demo mode or activate your license. See
243
245
  <details>
244
246
  <summary><strong>What does installing the skill from skills.sh do?</strong></summary>
245
247
 
246
- The skill supplies investigation instructions for your agent. Use `rea setup`
248
+ The skill supplies investigation instructions for your agent. Use `npx rea-agents setup`
247
249
  to register REA's MCP server and install the matching instructions, then restart
248
250
  your agent. See [skill-only installation](docs/installation.md#skill-only-installation).
249
251
 
@@ -298,30 +300,16 @@ For exact options, prerequisites and result contracts:
298
300
  - [Readiness and troubleshooting](docs/installation.md#check-readiness-for-your-task): diagnose one agent or analysis engine.
299
301
  - [CLI and Evidence](docs/cli.md): commands, provider selection, snapshots, import/export and exit statuses.
300
302
  - [MCP contracts](docs/mcp-contracts.md) and [agent prompts](docs/mcp-prompts.md): tool results, sessions and guided investigations.
301
- - [Tool catalog](docs/mcp-contracts.md#generated-catalog): build-generated inventory of tools, providers and CLI commands.
303
+ - [Tool catalog](docs/mcp-contracts.md#generated-catalog): generated inventory of tools, providers and CLI commands.
302
304
  - [Roadmap](docs/roadmap.md): planned work and capability trackers.
303
305
 
304
306
  Report vulnerabilities through [SECURITY.md](SECURITY.md).
305
307
 
306
- ## Contributing
307
-
308
- We'd love your help with REA! [Open an issue](https://github.com/morluto/rea/issues) to
309
- report a bug or suggest a feature, or [send a pull request](https://github.com/morluto/rea/pulls)
310
- to improve the code or docs.
311
-
312
- See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and checks,
313
- [testing](docs/testing.md) for verification lanes, and the
314
- [architecture map](docs/architecture.mermaid) for the project structure.
315
-
316
- ## Project links
317
-
318
- [Website](https://rea.tools/) · [npm](https://www.npmjs.com/package/rea-agents) · [skills.sh](https://skills.sh/morluto/rea/reverse-engineer-anything) · [Issues](https://github.com/morluto/rea/issues) · [Security](SECURITY.md)
319
-
320
308
  ## Star history
321
309
 
322
- 🎉 **20,000 GitHub stars — thank you!**
310
+ 🎉 **40,000 GitHub stars — thank you!**
323
311
 
324
- Thanks to everyone using REA, reporting bugs, testing builds, and contributing fixes.
312
+ Thanks to everyone using REA, reporting bugs, requesting features, testing builds, and contributing fixes.
325
313
 
326
314
  <a href="https://www.star-history.com/?repos=morluto%2Frea&amp;type=date">
327
315
  <picture>
@@ -335,6 +323,18 @@ Thanks to everyone using REA, reporting bugs, testing builds, and contributing f
335
323
 
336
324
  REA provides tools for lawful reverse-engineering research, analysis, and reconstruction. You are responsible for obtaining any required authorization and complying with applicable laws. The project does not endorse illegal or unauthorized use.
337
325
 
326
+ REA is an open-source software project. We have not issued or endorsed any cryptocurrency or token. Tokens using the REA name are not affiliated with the project.
327
+
328
+ ## Contributing
329
+
330
+ We'd love your help with REA! [Open an issue](https://github.com/morluto/rea/issues) to
331
+ report a bug or suggest a feature, or [send a pull request](https://github.com/morluto/rea/pulls)
332
+ to improve the code or docs.
333
+
334
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and checks,
335
+ [testing](docs/testing.md) for verification lanes, and the
336
+ [architecture map](docs/architecture.mermaid) for the project structure.
337
+
338
338
  ## License
339
339
 
340
340
  [MIT](LICENSE)
@@ -866,6 +866,7 @@ public final class ReaGhidraBridge extends HeadlessScript {
866
866
  JsonArray operands = new JsonArray();
867
867
  JsonArray references = new JsonArray();
868
868
  JsonArray destinations = new JsonArray();
869
+ JsonArray flowEvidence = new JsonArray();
869
870
  JsonObject flow = new JsonObject();
870
871
  flow.addProperty("kind", "unavailable");
871
872
  flow.addProperty("conditional", false);
@@ -881,7 +882,20 @@ public final class ReaGhidraBridge extends HeadlessScript {
881
882
  result.addProperty("mnemonic", instruction.getMnemonicString());
882
883
  result.addProperty("raw_disassembly", instruction.toString());
883
884
  RefType type = instruction.getFlowType();
884
- flow.addProperty("kind", type.isCall() ? "call" : type.isJump() ? "jump" : type.isTerminal() ? "terminal" : "fallthrough");
885
+ JsonObject listingFlow = new JsonObject();
886
+ listingFlow.addProperty("source", "ghidra-listing-flow-type");
887
+ listingFlow.addProperty("value", type.getName());
888
+ flowEvidence.add(listingFlow);
889
+ boolean decodedReturn = false;
890
+ for (PcodeOp operation : instruction.getPcode()) {
891
+ if (operation.getOpcode() != PcodeOp.RETURN) continue;
892
+ decodedReturn = true;
893
+ JsonObject returnEvidence = new JsonObject();
894
+ returnEvidence.addProperty("source", "ghidra-instruction-pcode");
895
+ returnEvidence.addProperty("value", operation.getMnemonic());
896
+ flowEvidence.add(returnEvidence);
897
+ }
898
+ flow.addProperty("kind", type.isCall() ? "call" : type.isJump() ? "jump" : decodedReturn ? "return" : type.isTerminal() ? "terminal" : "fallthrough");
885
899
  flow.addProperty("conditional", type.isConditional());
886
900
  flow.addProperty("computed", type.isComputed());
887
901
  if (!type.isComputed()) for (Address target : instruction.getFlows()) destinations.add(canonicalAddress(target));
@@ -917,10 +931,13 @@ public final class ReaGhidraBridge extends HeadlessScript {
917
931
  }
918
932
  }
919
933
  flow.add("direct_destinations", destinations);
934
+ flow.add("classification_evidence", flowEvidence);
920
935
  result.add("operands", operands);
921
936
  result.add("flow", flow);
922
937
  result.add("references", references);
923
- result.add("limitations", GSON.toJsonTree(List.of("Operand components are Ghidra Listing decoder tokens; effective memory base/index/displacement roles and per-instruction context mode are unavailable. The mode field is the program language variant.", "Terminal flow is not classified as a return without provider evidence.")));
938
+ List<String> limitations = new ArrayList<>(List.of("Operand components are Ghidra Listing decoder tokens; effective memory base/index/displacement roles and per-instruction context mode are unavailable. The mode field is the program language variant."));
939
+ if (flow.get("kind").getAsString().equals("terminal")) limitations.add("No RETURN operation was observed in the provider's instruction p-code; terminal classification remains generic.");
940
+ result.add("limitations", GSON.toJsonTree(limitations));
924
941
  return result;
925
942
  }
926
943
 
@@ -1629,9 +1646,20 @@ public final class ReaGhidraBridge extends HeadlessScript {
1629
1646
  Function function = entry.function;
1630
1647
  Symbol symbol = function.getSymbol();
1631
1648
  String qualified = symbol == null ? function.getName() : symbol.getName(true);
1632
- if (function.getName().equals(value) || qualified.equals(value)) {
1633
- matches.add(function);
1649
+ boolean matchesName = function.getName().equals(value) || qualified.equals(value);
1650
+ if (!matchesName) {
1651
+ // Imported labels (for example Mach-O _main) can share a
1652
+ // function entry without becoming its primary symbol. Only
1653
+ // exact entries qualify; an interior label is not a selector.
1654
+ for (Symbol entrySymbol : currentProgram.getSymbolTable().getSymbols(function.getEntryPoint())) {
1655
+ monitor.checkCancelled();
1656
+ if (entrySymbol.getName().equals(value) || entrySymbol.getName(true).equals(value)) {
1657
+ matchesName = true;
1658
+ break;
1659
+ }
1660
+ }
1634
1661
  }
1662
+ if (matchesName) matches.add(function);
1635
1663
  }
1636
1664
  if (matches.size() > 1)
1637
1665
  throw new RequestFailure("ambiguous", "Ghidra procedure name is ambiguous: " + value +
@@ -553,7 +553,12 @@ def _search_results(document, kind, params):
553
553
  if not matches(item[1]):
554
554
  continue
555
555
  selected.append(item)
556
- return [{"address": address, **_string_inventory(document)[address]} for address, _ in selected] if kind == "string" else [
556
+ if not selected:
557
+ return []
558
+ if kind == "string":
559
+ records = _string_inventory(document)
560
+ return [{"address": address, **records[address]} for address, _ in selected]
561
+ return [
557
562
  {
558
563
  "address": address,
559
564
  "value": value,
@@ -711,6 +716,8 @@ def _analyze_function(document, params):
711
716
  "referenced_strings": referenced_strings,
712
717
  "referenced_names": referenced_names,
713
718
  "basic_blocks": blocks,
719
+ "native_api": None,
720
+ "native_value_flow": None,
714
721
  "limitations": [
715
722
  "Native CallReference classifications are observed where available; detailed reference flags remain unknown.",
716
723
  "Hopper's public Python API does not expose equivalent external or thunk classification in this dossier.",
@@ -1,11 +1,16 @@
1
1
  import { constants } from "node:fs";
2
2
  import { access, realpath, stat } from "node:fs/promises";
3
- import { isAbsolute, join } from "node:path";
3
+ import { delimiter, isAbsolute, join, resolve } from "node:path";
4
+ import { systemWindowsNativeAuthority } from "../windows/WindowsNativeLoader.js";
4
5
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
6
+ import { ZipArtifactReader } from "../artifacts/ZipArtifactReader.js";
5
7
  import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
6
8
  import { JADX_JAR_CONFIGURATION_REMEDIATION } from "./JadxRelease.js";
7
9
  const JAVA_MODULE_LISTING_TIMEOUT_MS = 10_000;
8
10
  const JAVA_MODULE_LISTING_MAX_OUTPUT_BYTES = 1024 * 1024;
11
+ // Bound ZIP metadata allocation during discovery. The audited 0.7.1 JAR's
12
+ // central directory occupies 2,294,350 bytes; class bodies are not read here.
13
+ const JAR_METADATA_READ_MAX_BYTES = 8 * 1024 * 1024;
9
14
  class JadxConfigurationFailure extends Error {
10
15
  code;
11
16
  diagnostics;
@@ -74,16 +79,65 @@ export const resolveJadxConfiguration = async (environment, operation, signal) =
74
79
  const readJadxConfiguration = async (environment, signal) => {
75
80
  requireSupportedHost();
76
81
  const jar = await resolveJar(environment);
77
- const java = resolveJava(environment);
82
+ const java = await resolveJava(environment, signal);
78
83
  await requireJavaHomeExecutable(environment.JAVA_HOME, java);
79
84
  const jvmArguments = resolveJvmArguments(environment);
80
85
  await inspectJavaRuntime(java, environment, signal);
86
+ await requireEngineArchive(jar, signal);
81
87
  return { jar, java, jvmArguments };
82
88
  };
89
+ const requireEngineArchive = async (jar, signal) => {
90
+ // These classes are consumed directly by ReaJadxBridge.java. This checks the
91
+ // classpath inventory without loading engine code or starting a JADX session.
92
+ const missing = new Set([
93
+ "com/atxx/jhmcp/JadxSession.class",
94
+ "com/atxx/jhmcp/SessionHolder.class",
95
+ "jadx/api/JadxDecompiler.class",
96
+ "com/google/gson/Gson.class",
97
+ "io/modelcontextprotocol/kotlin/sdk/server/Server.class",
98
+ ]);
99
+ const reader = new ZipArtifactReader(jar, "zip", JAR_METADATA_READ_MAX_BYTES);
100
+ try {
101
+ for await (const entry of reader.entries(signal)) {
102
+ if (entry.kind === "file" && !entry.encrypted)
103
+ missing.delete(entry.path);
104
+ if (missing.size === 0)
105
+ return;
106
+ }
107
+ }
108
+ catch (cause) {
109
+ if (signal?.aborted === true)
110
+ throw cause;
111
+ const reason = cause instanceof Error ? cause.message : String(cause);
112
+ throw configurationFailure("version_unresolved", `Cannot inspect REA_JADX_MCP_JAR ${jar} as a Java archive: ${reason}. ${JADX_JAR_CONFIGURATION_REMEDIATION}`, {
113
+ jar_path: jar,
114
+ phase: "jar-inspection",
115
+ archive_error: reason,
116
+ maximum_metadata_read_bytes: JAR_METADATA_READ_MAX_BYTES,
117
+ }, cause);
118
+ }
119
+ finally {
120
+ await reader.close();
121
+ }
122
+ throw configurationFailure("unsupported_version", `REA_JADX_MCP_JAR ${jar} does not contain the required metadata bridge classes: ${[...missing].join(", ")}. ${JADX_JAR_CONFIGURATION_REMEDIATION}`, { jar_path: jar, phase: "jar-inspection", missing_classes: [...missing] });
123
+ };
83
124
  const requireSupportedHost = () => {
84
125
  if (process.platform === "linux" || process.platform === "darwin")
85
126
  return;
86
- throw configurationFailure("unsupported_host", `Android JADX subprocess ownership is unsupported on ${process.platform}; use Linux or macOS. The metadata bridge has real-provider verification on macOS arm64.`, { platform: process.platform });
127
+ if (process.platform === "win32" && process.arch === "x64") {
128
+ const loaded = systemWindowsNativeAuthority();
129
+ if (loaded.available && loaded.authority.inspection.protocolStdin === true)
130
+ return;
131
+ throw configurationFailure("runtime_missing", loaded.available
132
+ ? "The bundled Windows native artifact lacks owned protocol stdin; use a matching current Windows x64 REA package."
133
+ : loaded.reason, {
134
+ platform: process.platform,
135
+ architecture: process.arch,
136
+ phase: "process-ownership",
137
+ owned_protocol_stdin: false,
138
+ });
139
+ }
140
+ throw configurationFailure("unsupported_host", `Android JADX subprocess ownership is unsupported on ${process.platform}/${process.arch}; use Linux, macOS, or Windows x64 with its bundled native controls.`, { platform: process.platform });
87
141
  };
88
142
  const resolveJar = async (environment) => {
89
143
  const jar = environment.REA_JADX_MCP_JAR;
@@ -101,11 +155,37 @@ const resolveJar = async (environment) => {
101
155
  throw configurationFailure("executable_missing", `Cannot read REA_JADX_MCP_JAR ${jar}: ${cause instanceof Error ? cause.message : String(cause)}`, { jar_path: jar }, cause);
102
156
  }
103
157
  };
104
- const resolveJava = (environment) => {
105
- if (environment.JAVA_HOME === undefined)
106
- return "java";
158
+ const resolveJava = async (environment, signal) => {
159
+ const executable = process.platform === "win32" ? "java.exe" : "java";
160
+ if (environment.JAVA_HOME === undefined) {
161
+ if (process.platform !== "win32")
162
+ return executable;
163
+ const path = Object.entries(environment).find(([key]) => key.toLowerCase() === "path")?.[1] ?? "";
164
+ for (const directory of [process.cwd(), ...path.split(delimiter)]) {
165
+ signal?.throwIfAborted();
166
+ // Windows PATH commonly quotes individual entries containing spaces.
167
+ const selected = directory.startsWith('"') && directory.endsWith('"')
168
+ ? directory.slice(1, -1)
169
+ : directory;
170
+ const candidate = resolve(selected, executable);
171
+ try {
172
+ await access(candidate, constants.R_OK | constants.X_OK);
173
+ if ((await stat(candidate)).isFile())
174
+ return await realpath(candidate);
175
+ }
176
+ catch (cause) {
177
+ if (typeof cause === "object" &&
178
+ cause !== null &&
179
+ "code" in cause &&
180
+ (cause.code === "ENOENT" || cause.code === "ENOTDIR"))
181
+ continue;
182
+ throw configurationFailure("runtime_missing", `Cannot inspect selected Java executable ${candidate}: ${errorText(cause)}`, { java_executable: candidate }, cause);
183
+ }
184
+ }
185
+ throw configurationFailure("runtime_missing", "Cannot find java.exe on the selected Windows PATH. Select a full JDK with JAVA_HOME or PATH, then verify it with java --list-modules. REA does not install Java.", { java_executable: executable });
186
+ }
107
187
  if (isAbsolute(environment.JAVA_HOME))
108
- return join(environment.JAVA_HOME, "bin", "java");
188
+ return join(environment.JAVA_HOME, "bin", executable);
109
189
  throw configurationFailure("open_options_invalid", "JAVA_HOME must select an existing JDK by absolute path; omit it to use java on PATH.", { java_home: environment.JAVA_HOME });
110
190
  };
111
191
  const requireJavaHomeExecutable = async (javaHome, java) => {
@@ -1,5 +1,6 @@
1
1
  import { deserializeMessage, serializeMessage, } from "@modelcontextprotocol/client";
2
2
  import { randomUUID } from "node:crypto";
3
+ import { finished } from "node:stream/promises";
3
4
  import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
4
5
  import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
5
6
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
@@ -71,7 +72,10 @@ export class JadxMcpTransport {
71
72
  }
72
73
  /** Verifies owned process exit before declaring the transport closed. */
73
74
  close() {
74
- this.#closePromise ??= this.#stop();
75
+ this.#closePromise ??= this.#stop().catch((cause) => {
76
+ this.#closePromise = undefined;
77
+ throw cause;
78
+ });
75
79
  return this.#closePromise;
76
80
  }
77
81
  /** Captured provider stderr without persisting inherited environment values. */
@@ -102,8 +106,16 @@ export class JadxMcpTransport {
102
106
  process?.stderr?.off("data", this.#countStderr);
103
107
  process?.off("error", this.#error);
104
108
  process?.off("exit", this.#exit);
105
- process?.stdin?.off("error", this.#error);
109
+ const input = process?.stdin;
110
+ // A job termination can complete an in-flight pipe write asynchronously.
111
+ // Observe its errors until the owned Writable has finished closing.
112
+ const inputClosed = input === undefined || input === null
113
+ ? undefined
114
+ : finished(input, { readable: false, cleanup: true }).catch(() => undefined);
106
115
  const stopped = await this.#supervisor?.stop();
116
+ input?.destroy();
117
+ await inputClosed;
118
+ input?.off("error", this.#error);
107
119
  this.onclose?.();
108
120
  if (stopped?.status === "incomplete")
109
121
  throw new ProviderCleanupError("jadx", [this.runId], {
@@ -6,6 +6,7 @@ import { AnalysisError } from "../domain/analysisErrorBase.js";
6
6
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisInputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
7
7
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
8
8
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
9
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
9
10
  import { err, ok } from "../domain/result.js";
10
11
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
11
12
  import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
@@ -59,18 +60,18 @@ const executionError = (context) => {
59
60
  },
60
61
  });
61
62
  };
62
- const cleanup = async (session, root, previous) => {
63
+ const cleanup = async (resources) => {
64
+ const { session, root, previousError } = resources;
63
65
  const diagnostics = {
64
- previous_error: previous.ok
65
- ? null
66
- : { tag: previous.error._tag, message: previous.error.message },
66
+ previous_error: previousError === undefined ? null : projectAnalysisError(previousError),
67
67
  };
68
68
  try {
69
69
  await session?.close();
70
+ resources.session = undefined;
70
71
  }
71
72
  catch (cause) {
72
73
  // Retain an uncertain workspace until the caller can resolve process ownership.
73
- return err(new ProviderCleanupError("jadx", [
74
+ const error = new ProviderCleanupError("jadx", [
74
75
  session?.transport.runId ?? "unknown",
75
76
  ...(root === undefined ? [] : [root.path]),
76
77
  ], {
@@ -79,30 +80,34 @@ const cleanup = async (session, root, previous) => {
79
80
  provider_cleanup: cause instanceof ProviderCleanupError
80
81
  ? (cause.diagnostics ?? null)
81
82
  : null,
82
- }, { cause }));
83
+ }, { cause: previousError ?? cause });
84
+ if (previousError?.partialObservation !== undefined)
85
+ error.retainPartialObservation(previousError.partialObservation);
86
+ return err(error);
83
87
  }
84
88
  try {
85
89
  await root?.close();
90
+ resources.root = undefined;
86
91
  }
87
92
  catch (cause) {
88
93
  return err(new ProviderCleanupError("jadx", [root?.path ?? "unknown"], {
89
94
  ...diagnostics,
90
95
  reason: cause instanceof Error ? cause.message : String(cause),
91
- }, { cause }));
96
+ }, { cause: previousError ?? cause }));
92
97
  }
93
- return previous;
98
+ return ok(undefined);
94
99
  };
95
100
  /** One serialized, immutable APK session per REA instance, retired on idle or shutdown. */
96
101
  export class JadxProvider {
97
102
  environment;
98
103
  launcher;
99
104
  #tail = Promise.resolve();
100
- #cleanupFailure;
105
+ #pendingCleanup;
101
106
  #retained;
102
107
  #idle;
103
108
  #shutdown = new AbortController();
104
109
  #closePromise;
105
- constructor(environment = process.env, launcher) {
110
+ constructor(environment, launcher) {
106
111
  this.environment = environment;
107
112
  this.launcher = launcher;
108
113
  }
@@ -132,12 +137,13 @@ export class JadxProvider {
132
137
  try {
133
138
  if (signal.aborted)
134
139
  return err(new AnalysisCancelledError(request.operation));
135
- if (this.#cleanupFailure !== undefined)
136
- return err(this.#cleanupFailure);
137
140
  clearTimeout(this.#idle);
141
+ if (this.#pendingCleanup !== undefined) {
142
+ const retired = await this.#retire();
143
+ if (!retired.ok)
144
+ return retired;
145
+ }
138
146
  const outcome = await this.#execute(target, request, { signal });
139
- if (!outcome.ok && outcome.error.cleanupIncomplete)
140
- this.#cleanupFailure = outcome.error;
141
147
  if (outcome.ok)
142
148
  this.#scheduleIdle();
143
149
  return outcome;
@@ -150,24 +156,39 @@ export class JadxProvider {
150
156
  close() {
151
157
  this.#shutdown.abort();
152
158
  clearTimeout(this.#idle);
153
- this.#closePromise ??= this.#tail.then(() => this.#retire());
159
+ this.#closePromise ??= this.#tail
160
+ .then(async () => {
161
+ const retired = await this.#retire();
162
+ if (!retired.ok)
163
+ throw retired.error;
164
+ })
165
+ .catch((cause) => {
166
+ this.#closePromise = undefined;
167
+ throw cause;
168
+ });
154
169
  return this.#closePromise;
155
170
  }
156
171
  async #retire() {
157
- if (this.#cleanupFailure !== undefined)
158
- throw this.#cleanupFailure;
159
- const retained = this.#retained;
160
- this.#retained = undefined;
161
- const result = await cleanup(retained?.session, retained?.root, ok(undefined));
162
- if (!result.ok) {
163
- this.#cleanupFailure = result.error;
164
- throw result.error;
172
+ if (this.#pendingCleanup === undefined && this.#retained !== undefined) {
173
+ this.#pendingCleanup = {
174
+ session: this.#retained.session,
175
+ root: this.#retained.root,
176
+ previousError: undefined,
177
+ };
178
+ this.#retained = undefined;
165
179
  }
180
+ if (this.#pendingCleanup === undefined)
181
+ return ok(undefined);
182
+ const result = await cleanup(this.#pendingCleanup);
183
+ if (result.ok)
184
+ this.#pendingCleanup = undefined;
185
+ return result;
166
186
  }
167
187
  #scheduleIdle() {
168
188
  this.#idle = setTimeout(() => {
169
- const retirement = this.#tail.then(() => this.#retire());
170
- this.#tail = retirement.catch(() => undefined);
189
+ this.#tail = this.#tail.then(async () => {
190
+ await this.#retire();
191
+ });
171
192
  }, 60_000);
172
193
  this.#idle.unref();
173
194
  }
@@ -178,7 +199,6 @@ export class JadxProvider {
178
199
  : AbortSignal.any([options.signal, timeout]);
179
200
  let root;
180
201
  let session;
181
- let outcome;
182
202
  try {
183
203
  if (target.format !== "apk")
184
204
  throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
@@ -210,8 +230,11 @@ export class JadxProvider {
210
230
  this.environment.JAVA_HOME,
211
231
  ],
212
232
  });
213
- if (this.#retained !== undefined && this.#retained.key !== key)
214
- await this.#retire();
233
+ if (this.#retained !== undefined && this.#retained.key !== key) {
234
+ const retired = await this.#retire();
235
+ if (!retired.ok)
236
+ return retired;
237
+ }
215
238
  let retained = this.#retained;
216
239
  if (retained === undefined) {
217
240
  root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
@@ -247,7 +270,7 @@ export class JadxProvider {
247
270
  root = retained.root;
248
271
  session = retained.session;
249
272
  const { snapshot } = retained;
250
- outcome = ok(await session.execute({
273
+ const outcome = ok(await session.execute({
251
274
  request,
252
275
  target,
253
276
  snapshot,
@@ -260,18 +283,23 @@ export class JadxProvider {
260
283
  return outcome;
261
284
  }
262
285
  catch (cause) {
263
- outcome = err(executionError({
286
+ const previousError = executionError({
264
287
  cause,
265
288
  request,
266
289
  timeout,
267
290
  signal: options?.signal,
268
291
  session,
269
- }));
292
+ });
293
+ const partialObservation = session?.partialObservation();
294
+ if (partialObservation !== undefined)
295
+ previousError.retainPartialObservation(partialObservation);
296
+ // Admission can fail before selecting an existing session for execution.
297
+ root ??= this.#retained?.root;
298
+ session ??= this.#retained?.session;
299
+ this.#retained = undefined;
300
+ this.#pendingCleanup = { session, root, previousError };
301
+ const retired = await this.#retire();
302
+ return retired.ok ? err(previousError) : retired;
270
303
  }
271
- // An existing session also needs retirement when admission fails before selection.
272
- root ??= this.#retained?.root;
273
- session ??= this.#retained?.session;
274
- this.#retained = undefined;
275
- return cleanup(session, root, outcome);
276
304
  }
277
305
  }