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
@@ -1,44 +1,130 @@
1
- import { access, realpath, stat } from "node:fs/promises";
2
1
  import { constants } from "node:fs";
2
+ import { access, realpath, stat } from "node:fs/promises";
3
3
  import { isAbsolute, join } from "node:path";
4
4
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
5
+ import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
5
6
  import { JADX_JAR_CONFIGURATION_REMEDIATION } from "./JadxRelease.js";
6
- /** Admit explicit local tooling without installing or changing host configuration. */
7
- export const resolveJadxConfiguration = async (environment, operation) => {
8
- const unavailable = (reason) => new AnalysisCapabilityUnavailableError("jadx", operation, reason);
9
- if (process.platform !== "linux" && process.platform !== "darwin")
10
- throw unavailable(`Android JADX subprocess ownership is unsupported on ${process.platform}; use Linux or macOS. The metadata bridge has real-provider verification on macOS arm64.`);
7
+ const JAVA_MODULE_LISTING_TIMEOUT_MS = 10_000;
8
+ const JAVA_MODULE_LISTING_MAX_OUTPUT_BYTES = 1024 * 1024;
9
+ class JadxConfigurationFailure extends Error {
10
+ code;
11
+ diagnostics;
12
+ constructor(code, message, diagnostics, options) {
13
+ super(message, options);
14
+ this.code = code;
15
+ this.diagnostics = diagnostics;
16
+ }
17
+ }
18
+ /** Inspect the same JAR and Java prerequisites that gate actual execution. */
19
+ export const inspectJadxAvailability = async (environment, signal) => {
20
+ try {
21
+ const configuration = await readJadxConfiguration(environment, signal);
22
+ return {
23
+ status: "available",
24
+ code: null,
25
+ reason: null,
26
+ diagnostics: {
27
+ configured: true,
28
+ java_executable: configuration.java,
29
+ jdk_compiler: true,
30
+ jar_path: configuration.jar,
31
+ },
32
+ };
33
+ }
34
+ catch (cause) {
35
+ if (signal?.aborted === true)
36
+ throw cause;
37
+ if (cause instanceof JadxConfigurationFailure)
38
+ return {
39
+ status: "unavailable",
40
+ code: cause.code,
41
+ reason: cause.message,
42
+ diagnostics: cause.diagnostics,
43
+ };
44
+ throw cause;
45
+ }
46
+ };
47
+ /** Resolve caller-selected tools and preserve the same prerequisite diagnostics. */
48
+ export const resolveJadxConfiguration = async (environment, operation, signal) => {
49
+ try {
50
+ return await readJadxConfiguration(environment, signal);
51
+ }
52
+ catch (cause) {
53
+ if (signal?.aborted === true)
54
+ throw cause;
55
+ if (!(cause instanceof JadxConfigurationFailure))
56
+ throw cause;
57
+ const output = cause.diagnostics;
58
+ throw new AnalysisCapabilityUnavailableError("jadx", operation, cause.message, {
59
+ cause,
60
+ userMessage: cause.message,
61
+ ...(typeof output.stdout === "string" &&
62
+ typeof output.stderr === "string"
63
+ ? {
64
+ capturedOutput: {
65
+ stdout: output.stdout,
66
+ stderr: output.stderr,
67
+ truncated: output.output_truncated === true,
68
+ },
69
+ }
70
+ : {}),
71
+ });
72
+ }
73
+ };
74
+ const readJadxConfiguration = async (environment, signal) => {
75
+ requireSupportedHost();
76
+ const jar = await resolveJar(environment);
77
+ const java = resolveJava(environment);
78
+ await requireJavaHomeExecutable(environment.JAVA_HOME, java);
79
+ const jvmArguments = resolveJvmArguments(environment);
80
+ await inspectJavaRuntime(java, environment, signal);
81
+ return { jar, java, jvmArguments };
82
+ };
83
+ const requireSupportedHost = () => {
84
+ if (process.platform === "linux" || process.platform === "darwin")
85
+ 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 });
87
+ };
88
+ const resolveJar = async (environment) => {
11
89
  const jar = environment.REA_JADX_MCP_JAR;
12
- if (environment.JAVA_HOME !== undefined && !isAbsolute(environment.JAVA_HOME))
13
- throw unavailable("JAVA_HOME must select an existing JDK by absolute path; omit it to use java on PATH.");
14
90
  if (jar === undefined || !isAbsolute(jar))
15
- throw unavailable(JADX_JAR_CONFIGURATION_REMEDIATION);
16
- const java = environment.JAVA_HOME === undefined
17
- ? "java"
18
- : join(environment.JAVA_HOME, "bin", "java");
91
+ throw configurationFailure("not_configured", JADX_JAR_CONFIGURATION_REMEDIATION, { jar_configured: false });
19
92
  try {
20
93
  await access(jar, constants.R_OK);
21
94
  if (!(await stat(jar)).isFile())
22
- throw unavailable(`REA_JADX_MCP_JAR is not a regular file: ${jar}`);
95
+ throw configurationFailure("executable_missing", `REA_JADX_MCP_JAR is not a regular file: ${jar}`, { jar_path: jar });
96
+ return await realpath(jar);
23
97
  }
24
98
  catch (cause) {
25
- if (cause instanceof AnalysisCapabilityUnavailableError)
99
+ if (cause instanceof JadxConfigurationFailure)
26
100
  throw cause;
27
- throw unavailable(`Cannot read REA_JADX_MCP_JAR ${jar}: ${cause instanceof Error ? cause.message : String(cause)}`);
28
- }
29
- if (environment.JAVA_HOME !== undefined) {
30
- try {
31
- await access(java, constants.R_OK | constants.X_OK);
32
- if (!(await stat(java)).isFile())
33
- throw unavailable(`JAVA_HOME java is not a regular file: ${java}`);
34
- }
35
- catch (cause) {
36
- if (cause instanceof AnalysisCapabilityUnavailableError)
37
- throw cause;
38
- throw unavailable(`Cannot execute JAVA_HOME java ${java}: ${cause instanceof Error ? cause.message : String(cause)}`);
39
- }
40
- }
41
- const jvmArguments = [];
101
+ throw configurationFailure("executable_missing", `Cannot read REA_JADX_MCP_JAR ${jar}: ${cause instanceof Error ? cause.message : String(cause)}`, { jar_path: jar }, cause);
102
+ }
103
+ };
104
+ const resolveJava = (environment) => {
105
+ if (environment.JAVA_HOME === undefined)
106
+ return "java";
107
+ if (isAbsolute(environment.JAVA_HOME))
108
+ return join(environment.JAVA_HOME, "bin", "java");
109
+ 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
+ };
111
+ const requireJavaHomeExecutable = async (javaHome, java) => {
112
+ if (javaHome === undefined)
113
+ return;
114
+ try {
115
+ await access(java, constants.R_OK | constants.X_OK);
116
+ if ((await stat(java)).isFile())
117
+ return;
118
+ throw configurationFailure("runtime_missing", `JAVA_HOME java is not a regular file: ${java}`, { java_executable: java });
119
+ }
120
+ catch (cause) {
121
+ if (cause instanceof JadxConfigurationFailure)
122
+ throw cause;
123
+ throw configurationFailure("runtime_missing", `Cannot execute JAVA_HOME java ${java}: ${cause instanceof Error ? cause.message : String(cause)}`, { java_executable: java }, cause);
124
+ }
125
+ };
126
+ const resolveJvmArguments = (environment) => {
127
+ const result = [];
42
128
  for (const [name, prefix, suffix] of [
43
129
  ["REA_JADX_HEAP_MIB", "-Xmx", "m"],
44
130
  ["REA_JADX_ACTIVE_PROCESSOR_COUNT", "-XX:ActiveProcessorCount=", ""],
@@ -47,11 +133,88 @@ export const resolveJadxConfiguration = async (environment, operation) => {
47
133
  if (value === undefined)
48
134
  continue;
49
135
  if (!/^[1-9]\d*$/u.test(value) || !Number.isSafeInteger(Number(value)))
50
- throw unavailable(`${name} must be a positive safe integer; received ${value}.`);
136
+ throw configurationFailure("open_options_invalid", `${name} must be a positive safe integer; received ${value}.`, { setting: name, value });
51
137
  if (name === "REA_JADX_ACTIVE_PROCESSOR_COUNT" &&
52
138
  Number(value) > 2_147_483_647)
53
- throw unavailable(`${name} exceeds the JVM's signed 32-bit processor-count range.`);
54
- jvmArguments.push(`${prefix}${value}${suffix}`);
139
+ throw configurationFailure("open_options_invalid", `${name} exceeds the JVM's signed 32-bit processor-count range.`, { setting: name, value });
140
+ result.push(`${prefix}${value}${suffix}`);
141
+ }
142
+ return result;
143
+ };
144
+ const inspectJavaRuntime = async (java, environment, signal) => {
145
+ let stdout;
146
+ let stderr;
147
+ try {
148
+ ({ stdout, stderr } = await execFileOutput(java, ["--list-modules"], {
149
+ env: { ...environment },
150
+ timeout: JAVA_MODULE_LISTING_TIMEOUT_MS,
151
+ maxBuffer: JAVA_MODULE_LISTING_MAX_OUTPUT_BYTES,
152
+ ...(signal === undefined ? {} : { signal }),
153
+ }));
154
+ }
155
+ catch (cause) {
156
+ if (signal?.aborted === true)
157
+ throw cause;
158
+ const output = execFileOutputFailure(cause);
159
+ if (output === undefined)
160
+ throw cause;
161
+ const diagnostics = {
162
+ java_executable: java,
163
+ phase: "module-inspection",
164
+ exit_code: typeof output.code === "number" ? output.code : null,
165
+ process_error_code: typeof output.code === "string" ? output.code : null,
166
+ signal: output.signal,
167
+ killed: output.killed,
168
+ stdout: output.stdout,
169
+ stderr: output.stderr,
170
+ output_truncated: output.outputTruncated,
171
+ };
172
+ if (output.outputTruncated)
173
+ throw configurationFailure("version_unresolved", `The selected Java launcher ${java} exceeded the ${JAVA_MODULE_LISTING_MAX_OUTPUT_BYTES / (1024 * 1024)} MiB output budget while listing modules. REA retained partial output but could not establish compiler or version availability. Inspect the selected launcher for verbose or unbounded output; ` +
174
+ "java --list-modules should return a concise module listing.", {
175
+ ...diagnostics,
176
+ failure: "output_limit",
177
+ output_limit_bytes: JAVA_MODULE_LISTING_MAX_OUTPUT_BYTES,
178
+ }, cause);
179
+ if (output.killed)
180
+ throw configurationFailure("version_unresolved", `The selected Java launcher ${java} was terminated or did not finish the module-listing probe within ${JAVA_MODULE_LISTING_TIMEOUT_MS / 1000} seconds. Inspect the launcher and its startup responsiveness, then verify it returns compiler and version modules with java --list-modules.`, {
181
+ ...diagnostics,
182
+ failure: "probe_terminated",
183
+ deadline_ms: JAVA_MODULE_LISTING_TIMEOUT_MS,
184
+ }, cause);
185
+ throw configurationFailure("runtime_missing", `Cannot inspect selected Java runtime ${java}: ${output.stderr.trim() || errorText(cause)}. Select a full JDK including jdk.compiler via JAVA_HOME or PATH; verify it with java --list-modules.`, diagnostics, cause);
55
186
  }
56
- return { jar: await realpath(jar), java, jvmArguments };
187
+ const compiler = /^jdk\.compiler(?:@|$)/mu.test(stdout);
188
+ if (!compiler)
189
+ throw configurationFailure("runtime_missing", `Selected Java runtime ${java} does not provide jdk.compiler. Select a full JDK including jdk.compiler via JAVA_HOME or PATH; verify it with java --list-modules. A JRE cannot compile REA's source bridge.`, {
190
+ java_executable: java,
191
+ phase: "module-inspection",
192
+ jdk_compiler: false,
193
+ stdout,
194
+ stderr,
195
+ output_truncated: false,
196
+ });
197
+ const major = /^java\.base@(\d+)(?:[.+_-]|$)/mu.exec(stdout)?.[1];
198
+ if (major === undefined)
199
+ throw configurationFailure("version_unresolved", `The selected Java launcher ${java} did not report a parseable java.base version in its module listing. Inspect the launcher output and verify it with java --list-modules.`, {
200
+ java_executable: java,
201
+ phase: "module-inspection",
202
+ jdk_compiler: true,
203
+ java_major: null,
204
+ stdout,
205
+ stderr,
206
+ output_truncated: false,
207
+ });
208
+ if (Number(major) < 17)
209
+ throw configurationFailure("unsupported_version", `Selected Java runtime ${java} must be JDK 17 or newer and include jdk.compiler; verify it with java --list-modules.`, {
210
+ java_executable: java,
211
+ phase: "module-inspection",
212
+ jdk_compiler: true,
213
+ java_major: major ?? null,
214
+ stdout,
215
+ stderr,
216
+ output_truncated: false,
217
+ });
57
218
  };
219
+ const configurationFailure = (code, message, diagnostics, cause) => new JadxConfigurationFailure(code, message, diagnostics, cause === undefined ? undefined : { cause });
220
+ const errorText = (cause) => cause instanceof Error ? cause.message : String(cause);
@@ -78,6 +78,10 @@ export class JadxMcpTransport {
78
78
  diagnostics() {
79
79
  return this.#supervisor?.snapshot().stderr.text ?? "";
80
80
  }
81
+ /** Whether the retained startup/operation diagnostics lost bytes. */
82
+ diagnosticsTruncated() {
83
+ return this.#supervisor?.snapshot().diagnosticTruncated ?? false;
84
+ }
81
85
  /** Preserve the failed protocol/resource constraint after the SDK closes requests. */
82
86
  failureReason() {
83
87
  return this.#failure;
@@ -2,6 +2,12 @@ import { z } from "zod";
2
2
  import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
3
3
  import { jsonValueSchema } from "../domain/jsonValue.js";
4
4
  const count = z.number().int().nonnegative();
5
+ /** Selector failures authored by REA's bridge, separate from arbitrary engine errors. */
6
+ export const jadxInputFailureSchema = z.strictObject({
7
+ kind: z.literal("invalid-input"),
8
+ field: z.enum(["class_name", "method_name", "overload_index"]),
9
+ message: z.string().min(1),
10
+ });
5
11
  /** Values observed inside the exact JVM producing the analysis. */
6
12
  export const jadxRuntimeSchema = z.object({
7
13
  engine_reported_version: z.string().min(1),
@@ -9,7 +9,7 @@ import { ProviderCleanupError } from "../domain/providerCleanupError.js";
9
9
  import { err, ok } from "../domain/result.js";
10
10
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
11
11
  import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
12
- import { resolveJadxConfiguration } from "./JadxConfiguration.js";
12
+ import { inspectJadxAvailability, resolveJadxConfiguration, } from "./JadxConfiguration.js";
13
13
  import { JadxSession } from "./JadxSession.js";
14
14
  const OPERATION_TIMEOUT_MS = 120_000;
15
15
  const BRIDGE_SOURCE = fileURLToPath(new URL("../../bridge/android/ReaJadxBridge.java", import.meta.url));
@@ -38,6 +38,19 @@ const executionError = (context) => {
38
38
  });
39
39
  if (cause instanceof z.ZodError)
40
40
  return new AnalysisOutputError(request.operation, "JADX response violated the pinned upstream protocol", { cause });
41
+ if (session !== undefined && !session.initialized()) {
42
+ const stderr = session.transport.diagnostics();
43
+ const reason = `Java could not start REA's Android bridge using ${session.transport.options.command}: ${cause instanceof Error ? cause.message : String(cause)}.${stderr.length === 0 ? "" : ` Java diagnostics: ${stderr}`} Select a full JDK including jdk.compiler via JAVA_HOME, or a working java on PATH; verify it with java --list-modules. A JRE cannot compile REA's source bridge. If the JDK works, verify the REA bridge and configured JADX JAR installation.`;
44
+ return new AnalysisCapabilityUnavailableError("jadx", request.operation, reason, {
45
+ cause,
46
+ userMessage: reason,
47
+ capturedOutput: {
48
+ stdout: "",
49
+ stderr,
50
+ truncated: session.transport.diagnosticsTruncated(),
51
+ },
52
+ });
53
+ }
41
54
  return new ProviderAdapterError("jadx", request.operation, {
42
55
  cause,
43
56
  diagnostics: {
@@ -93,6 +106,10 @@ export class JadxProvider {
93
106
  this.environment = environment;
94
107
  this.launcher = launcher;
95
108
  }
109
+ /** Report actual local prerequisites without starting JADX or opening a target. */
110
+ inspectAvailability(signal) {
111
+ return inspectJadxAvailability(this.environment, signal);
112
+ }
96
113
  /** Serialize expensive work and bind both raw and normalized results to the APK. */
97
114
  async execute(target, request, options) {
98
115
  if (this.#shutdown.signal.aborted)
@@ -165,7 +182,7 @@ export class JadxProvider {
165
182
  try {
166
183
  if (target.format !== "apk")
167
184
  throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
168
- const configuration = await resolveJadxConfiguration(this.environment, request.operation);
185
+ const configuration = await resolveJadxConfiguration(this.environment, request.operation, signal);
169
186
  signal.throwIfAborted();
170
187
  const jarHash = await hashAndroidFile(configuration.jar);
171
188
  const bridgeHash = await hashAndroidFile(BRIDGE_SOURCE);
@@ -216,6 +233,7 @@ export class JadxProvider {
216
233
  ],
217
234
  cwd: root.path,
218
235
  hostEnvironment: this.environment,
236
+ signal,
219
237
  }, this.launcher);
220
238
  retained = {
221
239
  key,
@@ -1,17 +1,18 @@
1
1
  import { Client } from "@modelcontextprotocol/client";
2
2
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
3
- import { AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
+ import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
4
4
  import { jsonValueSchema } from "../domain/jsonValue.js";
5
5
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
6
  import { analyzeJadxRequest } from "./JadxAnalysis.js";
7
7
  import { JadxMcpTransport } from "./JadxMcpTransport.js";
8
- import { jadxLoadSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
8
+ import { jadxLoadSchema, jadxInputFailureSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
9
9
  import { JADX_BRIDGE_IDENTITY, JADX_RELEASE, JADX_PROVIDER_IDENTITY, JADX_LIMITATIONS, } from "./JadxRelease.js";
10
10
  /** One owned engine connection; its wire protocol stays inside the Android adapter. */
11
11
  export class JadxSession {
12
12
  transport;
13
13
  #client = new Client({ name: "rea-android-adapter", version: "1" });
14
14
  #loaded;
15
+ #connected = false;
15
16
  constructor(options, launcher) {
16
17
  this.transport = new JadxMcpTransport(options, launcher);
17
18
  }
@@ -26,8 +27,10 @@ export class JadxSession {
26
27
  signal.throwIfAborted();
27
28
  this.transport.beginOperation();
28
29
  const raw = [];
29
- if (this.#loaded === undefined)
30
+ if (!this.#connected) {
30
31
  await this.#client.connect(this.transport, { timeout: 30_000 });
32
+ this.#connected = true;
33
+ }
31
34
  const server = this.#client.getServerVersion();
32
35
  if (server?.name !== JADX_BRIDGE_IDENTITY.name ||
33
36
  server.version !== JADX_BRIDGE_IDENTITY.version)
@@ -73,6 +76,10 @@ export class JadxSession {
73
76
  signal.removeEventListener("abort", abort);
74
77
  }
75
78
  }
79
+ /** Whether the selected Java runtime established the REA bridge protocol. */
80
+ initialized() {
81
+ return this.#connected;
82
+ }
76
83
  /** Join owned cleanup even if SDK connection teardown itself fails. */
77
84
  async close() {
78
85
  try {
@@ -92,7 +99,18 @@ export class JadxSession {
92
99
  input,
93
100
  response: jsonValueSchema.parse(response),
94
101
  });
95
- if (envelope.failed)
102
+ if (envelope.failed) {
103
+ if (envelope.text.startsWith("{")) {
104
+ const failure = jadxInputFailureSchema.safeParse(parseJadxJson(envelope.text, request.operation));
105
+ if (failure.success)
106
+ throw new AnalysisInputError(request.operation, undefined, [
107
+ {
108
+ path: [failure.data.field],
109
+ reason: "invalid_value",
110
+ message: failure.data.message,
111
+ },
112
+ ]);
113
+ }
96
114
  throw new ProviderAdapterError("jadx", request.operation, {
97
115
  diagnostics: {
98
116
  upstream_operation: name,
@@ -101,6 +119,7 @@ export class JadxSession {
101
119
  target_sha256: target.sha256,
102
120
  },
103
121
  });
122
+ }
104
123
  return envelope.text;
105
124
  };
106
125
  return {
@@ -1,6 +1,7 @@
1
- import { AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
1
+ import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
2
2
  import {} from "../domain/analysisErrorBase.js";
3
- import { parseDocuments } from "../domain/hopperValues.js";
3
+ import { analysisBookmarkSchema } from "../domain/hopperValues.js";
4
+ import { resolveAnalysisDocument } from "./AnalysisDocument.js";
4
5
  import { err, ok } from "../domain/result.js";
5
6
  const parameters = (document, address) => ({
6
7
  ...(document === undefined ? {} : { document }),
@@ -42,7 +43,7 @@ export const getNavigationContext = async (analysis, input, signal) => {
42
43
  };
43
44
  /** Inspect bounded provider-neutral facets at one explicit reproducible address. */
44
45
  export const inspectAddressContext = async (analysis, input, signal) => {
45
- const document = await resolveDocument(analysis, input.document, signal);
46
+ const document = await resolveAnalysisDocument(analysis, input.document, signal);
46
47
  if (!document.ok)
47
48
  return document;
48
49
  const args = parameters(document.value, input.address);
@@ -75,30 +76,6 @@ export const inspectAddressContext = async (analysis, input, signal) => {
75
76
  : bookmarks,
76
77
  });
77
78
  };
78
- const resolveDocument = async (analysis, document, signal) => {
79
- if (document !== undefined)
80
- return ok(document);
81
- const current = await analysis.execute("current_document", {}, executionOptions(signal));
82
- if (!current.ok) {
83
- if (!(current.error instanceof AnalysisCapabilityUnavailableError))
84
- return current;
85
- const listed = await analysis.execute("list_documents", {}, executionOptions(signal));
86
- if (!listed.ok)
87
- return listed;
88
- const parsed = parseDocuments(listed.value.result);
89
- if (!parsed.ok)
90
- return err(new AnalysisOutputError("list_documents", "expected one document identity when resolving a headless provider", { cause: parsed.error }));
91
- if (parsed.value.length !== 1)
92
- return err(new AnalysisOutputError("list_documents", `expected exactly one document identity for a provider without current-document selection, received ${parsed.value.length}`));
93
- const [documentName] = parsed.value;
94
- if (documentName === undefined)
95
- return err(new AnalysisOutputError("list_documents", "provider returned no document identity"));
96
- return ok(documentName);
97
- }
98
- return typeof current.value.result === "string"
99
- ? ok(current.value.result)
100
- : err(new AnalysisOutputError("current_document", "expected a document identity string"));
101
- };
102
79
  const facet = (result, operation) => result?.ok === true
103
80
  ? { state: "available", value: result.value.result }
104
81
  : {
@@ -139,19 +116,15 @@ const matchingBookmarks = (value, address) => {
139
116
  reason: "list_bookmarks returned malformed output; expected an array.",
140
117
  remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
141
118
  };
142
- if (!value.every(isBookmark))
119
+ const parsed = analysisBookmarkSchema.array().safeParse(value);
120
+ if (!parsed.success)
143
121
  return {
144
122
  state: "unavailable",
145
- reason: "list_bookmarks returned malformed entries; expected address and name strings.",
123
+ reason: "list_bookmarks returned malformed entries; expected an address string and a string or null name.",
146
124
  remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
147
125
  };
148
126
  return {
149
127
  state: "available",
150
- value: value.filter((bookmark) => bookmark.address === address),
128
+ value: parsed.data.filter((bookmark) => bookmark.address === address),
151
129
  };
152
130
  };
153
- const isBookmark = (value) => typeof value === "object" &&
154
- value !== null &&
155
- !Array.isArray(value) &&
156
- typeof value.address === "string" &&
157
- typeof value.name === "string";
@@ -0,0 +1,32 @@
1
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
2
+ import { parseDocuments } from "../domain/hopperValues.js";
3
+ import { err, ok } from "../domain/result.js";
4
+ const executionOptions = (signal) => signal === undefined ? undefined : { signal };
5
+ /** Resolve an explicit or provider-selected document without guessing among candidates. */
6
+ export const resolveAnalysisDocument = async (analysis, document, signal) => {
7
+ if (document !== undefined)
8
+ return ok(document);
9
+ if (signal?.aborted === true)
10
+ return err(new AnalysisCancelledError("current_document"));
11
+ const current = await analysis.execute("current_document", {}, executionOptions(signal));
12
+ if (!current.ok) {
13
+ if (!(current.error instanceof AnalysisCapabilityUnavailableError))
14
+ return current;
15
+ const listed = await analysis.execute("list_documents", {}, executionOptions(signal));
16
+ if (!listed.ok)
17
+ return listed;
18
+ const parsed = parseDocuments(listed.value.result);
19
+ if (!parsed.ok)
20
+ return err(new AnalysisOutputError("list_documents", "expected one document identity when resolving a headless provider", { cause: parsed.error }));
21
+ if (parsed.value.length !== 1)
22
+ return err(new AnalysisOutputError("list_documents", `expected exactly one document identity for a provider without current-document selection, received ${parsed.value.length}`));
23
+ const [documentName] = parsed.value;
24
+ if (documentName === undefined || documentName.length === 0)
25
+ return err(new AnalysisOutputError("list_documents", "provider returned no document identity"));
26
+ return ok(documentName);
27
+ }
28
+ return typeof current.value.result === "string" &&
29
+ current.value.result.length > 0
30
+ ? ok(current.value.result)
31
+ : err(new AnalysisOutputError("current_document", "expected a nonempty document identity string"));
32
+ };