rea-agents 4.1.0 → 5.0.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 (577) hide show
  1. package/README.md +184 -86
  2. package/bridge/android/ReaJadxBridge.java +247 -0
  3. package/bridge/native/NativeUIChildren.swift +27 -0
  4. package/bridge/native/ReaNativeUI.swift +30 -16
  5. package/dist/android/AndroidTargetSnapshot.js +5 -3
  6. package/dist/android/JadxAnalysis.js +8 -6
  7. package/dist/android/JadxConfiguration.js +19 -3
  8. package/dist/android/JadxMcpTransport.js +43 -16
  9. package/dist/android/JadxProtocol.js +8 -0
  10. package/dist/android/JadxProvider.js +117 -28
  11. package/dist/android/JadxRelease.js +8 -0
  12. package/dist/android/JadxSession.js +32 -18
  13. package/dist/application/AppBundleExecutable.js +141 -0
  14. package/dist/application/ArtifactInventory/classify.js +1 -1
  15. package/dist/application/ArtifactInventory/scanCanonical.js +1 -1
  16. package/dist/application/ArtifactInventory/scanReader.js +1 -1
  17. package/dist/application/ArtifactInventory.js +1 -1
  18. package/dist/application/BinaryTargetResolver.js +9 -64
  19. package/dist/application/CapabilityInventory.js +61 -3
  20. package/dist/application/ClientConfigurationDocument.js +72 -12
  21. package/dist/application/ClientRegistrationStatus.js +7 -8
  22. package/dist/application/DirectAnalysis.js +12 -14
  23. package/dist/application/DirectAnalysisStatus.js +4 -5
  24. package/dist/application/DoctorDiagnostics.js +3 -3
  25. package/dist/application/EnhancedTools.js +4 -4
  26. package/dist/application/EvidenceBundleCommands.js +1 -1
  27. package/dist/application/FilesystemSnapshot.js +20 -5
  28. package/dist/application/InvestigationProviders.js +6 -0
  29. package/dist/application/LinuxHopper.js +8 -2
  30. package/dist/application/OptionalObservationProviders.js +3 -0
  31. package/dist/application/ProcessCaptureCapability.js +1 -1
  32. package/dist/application/ProcessCaptureLifecycle.js +2 -2
  33. package/dist/application/ProcessCli.js +5 -1
  34. package/dist/application/ProcessHarness.js +20 -9
  35. package/dist/application/ReconstructionCoverageService.js +2 -6
  36. package/dist/application/ReconstructionObligationCandidates.js +5 -2
  37. package/dist/application/ReferenceSourceImport.js +2 -0
  38. package/dist/application/ReferenceSourceImportEntries.js +20 -3
  39. package/dist/application/ReferenceSourceImportTypes.js +5 -0
  40. package/dist/application/Setup.js +10 -2
  41. package/dist/application/SetupClientConfiguration.js +19 -16
  42. package/dist/application/SetupHost.js +18 -3
  43. package/dist/application/SetupPlan.js +1 -1
  44. package/dist/application/Uninstall.js +23 -17
  45. package/dist/application/UpdateMaintenance.js +3 -3
  46. package/dist/application/ValidateSelectedWebScript.js +27 -0
  47. package/dist/application/WebModuleTraceService.js +209 -0
  48. package/dist/application/WebRuntimeService.js +73 -0
  49. package/dist/application/WebScriptExportService.js +115 -0
  50. package/dist/application/WebSourceLocationService.js +160 -0
  51. package/dist/application/{AndroidAnalysisService.js → android/AndroidAnalysisService.js} +6 -6
  52. package/dist/application/{AndroidApplicationService.js → android/AndroidApplicationService.js} +3 -3
  53. package/dist/application/{AppleApplicationService.js → apple/AppleApplicationService.js} +5 -5
  54. package/dist/application/{AnalysisClientCleanup.js → binary/AnalysisClientCleanup.js} +2 -2
  55. package/dist/application/{AnalysisProviderEvaluation.js → binary/AnalysisProviderEvaluation.js} +4 -4
  56. package/dist/application/{AnalysisProviderRegistry.js → binary/AnalysisProviderRegistry.js} +5 -5
  57. package/dist/application/{AnalysisSnapshotCache.js → binary/AnalysisSnapshotCache.js} +7 -9
  58. package/dist/application/{AnalysisSnapshotFiles.js → binary/AnalysisSnapshotFiles.js} +4 -4
  59. package/dist/application/{BinarySession.js → binary/BinarySession.js} +12 -10
  60. package/dist/application/{BinarySessionComposition.js → binary/BinarySessionComposition.js} +2 -1
  61. package/dist/application/{BinarySessionExecution.js → binary/BinarySessionExecution.js} +9 -7
  62. package/dist/application/{BinarySessionOpen.js → binary/BinarySessionOpen.js} +6 -6
  63. package/dist/application/{BinarySessionRecords.js → binary/BinarySessionRecords.js} +28 -40
  64. package/dist/application/{CompositeProvider.js → binary/CompositeProvider.js} +2 -2
  65. package/dist/application/{LazyAnalysisProvider.js → binary/LazyAnalysisProvider.js} +6 -6
  66. package/dist/application/{SessionProviderRouter.js → binary/SessionProviderRouter.js} +7 -7
  67. package/dist/application/{FirmwareAnalysisService.js → firmware/FirmwareAnalysisService.js} +5 -5
  68. package/dist/application/{EvidenceLedger.js → investigation/EvidenceLedger.js} +44 -7
  69. package/dist/application/investigation/InvestigationRecords.js +69 -0
  70. package/dist/application/{UnknownEvidence.js → investigation/UnknownEvidence.js} +1 -1
  71. package/dist/application/{ElectronActiveEvidence.js → javascript/ElectronActiveEvidence.js} +3 -3
  72. package/dist/application/javascript/ElectronActiveObservationPort.js +1 -0
  73. package/dist/application/{ElectronActiveObservationService.js → javascript/ElectronActiveObservationService.js} +3 -3
  74. package/dist/application/{ElectronBoundaryAnalysis.js → javascript/ElectronBoundaryAnalysis.js} +1 -1
  75. package/dist/application/{ElectronBoundaryGraphContext.js → javascript/ElectronBoundaryGraphContext.js} +1 -1
  76. package/dist/application/{ElectronEvidence.js → javascript/ElectronEvidence.js} +2 -2
  77. package/dist/application/javascript/ElectronObservationPort.js +1 -0
  78. package/dist/application/{ElectronObservationService.js → javascript/ElectronObservationService.js} +3 -3
  79. package/dist/application/{JavaScriptApplicationEvidence.js → javascript/JavaScriptApplicationEvidence.js} +3 -3
  80. package/dist/application/{JavaScriptApplicationEvidenceGraph.js → javascript/JavaScriptApplicationEvidenceGraph.js} +5 -5
  81. package/dist/application/{JavaScriptApplicationService.js → javascript/JavaScriptApplicationService.js} +10 -10
  82. package/dist/application/{JavaScriptApplicationWorkflowEvidence.js → javascript/JavaScriptApplicationWorkflowEvidence.js} +3 -3
  83. package/dist/application/{JavaScriptApplicationWorkflowService.js → javascript/JavaScriptApplicationWorkflowService.js} +12 -12
  84. package/dist/application/{JavaScriptArtifactAnalysis.js → javascript/JavaScriptArtifactAnalysis.js} +8 -24
  85. package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +1 -0
  86. package/dist/application/{JavaScriptArtifactGraphAccumulator.js → javascript/JavaScriptArtifactGraphAccumulator.js} +16 -2
  87. package/dist/application/{JavaScriptArtifactGraphBuilder.js → javascript/JavaScriptArtifactGraphBuilder.js} +2 -2
  88. package/dist/application/{JavaScriptArtifactGraphContext.js → javascript/JavaScriptArtifactGraphContext.js} +1 -1
  89. package/dist/application/{JavaScriptArtifactGraphDocuments.js → javascript/JavaScriptArtifactGraphDocuments.js} +1 -1
  90. package/dist/application/{JavaScriptArtifactGraphFindings.js → javascript/JavaScriptArtifactGraphFindings.js} +20 -7
  91. package/dist/application/{JavaScriptArtifactGraphStructure.js → javascript/JavaScriptArtifactGraphStructure.js} +1 -1
  92. package/dist/application/{JavaScriptArtifactPathResolution.js → javascript/JavaScriptArtifactPathResolution.js} +6 -12
  93. package/dist/application/{JavaScriptArtifactReconstruction.js → javascript/JavaScriptArtifactReconstruction.js} +4 -8
  94. package/dist/application/{JavaScriptJsonModules.js → javascript/JavaScriptJsonModules.js} +1 -1
  95. package/dist/application/{JavaScriptModuleRelationships.js → javascript/JavaScriptModuleRelationships.js} +2 -2
  96. package/dist/application/javascript/JavaScriptRecoveryPort.js +1 -0
  97. package/dist/application/javascript/JavaScriptRecoveryService.js +52 -0
  98. package/dist/application/{JavaScriptReturnShapeProjection.js → javascript/JavaScriptReturnShapeProjection.js} +3 -3
  99. package/dist/application/{JavaScriptRuntimeObservationEvidence.js → javascript/JavaScriptRuntimeObservationEvidence.js} +2 -2
  100. package/dist/application/javascript/JavaScriptRuntimeObservationPort.js +1 -0
  101. package/dist/application/{JavaScriptRuntimeObservationService.js → javascript/JavaScriptRuntimeObservationService.js} +3 -3
  102. package/dist/application/{JavaScriptRuntimeReconciliationEvidence.js → javascript/JavaScriptRuntimeReconciliationEvidence.js} +3 -3
  103. package/dist/application/{JavaScriptRuntimeReconciliationService.js → javascript/JavaScriptRuntimeReconciliationService.js} +6 -6
  104. package/dist/application/{JavaScriptSemanticGraphAsyncProjection.js → javascript/JavaScriptSemanticGraphAsyncProjection.js} +1 -1
  105. package/dist/application/{JavaScriptSemanticGraphBuilder.js → javascript/JavaScriptSemanticGraphBuilder.js} +5 -3
  106. package/dist/application/{JavaScriptSemanticGraphChildProcessProjection.js → javascript/JavaScriptSemanticGraphChildProcessProjection.js} +1 -1
  107. package/dist/application/{JavaScriptSemanticGraphConstruction.js → javascript/JavaScriptSemanticGraphConstruction.js} +3 -2
  108. package/dist/application/{JavaScriptSemanticGraphDataProjection.js → javascript/JavaScriptSemanticGraphDataProjection.js} +1 -1
  109. package/dist/application/{JavaScriptSemanticGraphFingerprintProjection.js → javascript/JavaScriptSemanticGraphFingerprintProjection.js} +1 -1
  110. package/dist/application/{JavaScriptSemanticGraphFlowProjection.js → javascript/JavaScriptSemanticGraphFlowProjection.js} +2 -2
  111. package/dist/application/{JavaScriptSemanticGraphObjectProjection.js → javascript/JavaScriptSemanticGraphObjectProjection.js} +1 -1
  112. package/dist/application/{JavaScriptSemanticGraphProjection.js → javascript/JavaScriptSemanticGraphProjection.js} +2 -2
  113. package/dist/application/{JavaScriptSemanticGraphResourceProjection.js → javascript/JavaScriptSemanticGraphResourceProjection.js} +1 -1
  114. package/dist/application/{JavaScriptSemanticTraceService.js → javascript/JavaScriptSemanticTraceService.js} +6 -6
  115. package/dist/application/{ManagedApplicationGraphService.js → managed/ManagedApplicationGraphService.js} +7 -7
  116. package/dist/application/{ManagedMemberComparisonService.js → managed/ManagedMemberComparisonService.js} +10 -10
  117. package/dist/application/{ManagedNativeVerificationService.js → managed/ManagedNativeVerificationService.js} +7 -7
  118. package/dist/application/{ManagedReconstructionService.js → managed/ManagedReconstructionService.js} +7 -7
  119. package/dist/application/{NativeApiInspection.js → native/NativeApiInspection.js} +1 -1
  120. package/dist/application/{NativeCallRoutes.js → native/NativeCallRoutes.js} +3 -3
  121. package/dist/application/{NativeDispatchMetadataInspection.js → native/NativeDispatchMetadataInspection.js} +4 -4
  122. package/dist/application/{NativeUiActionTrace.js → native/NativeUiActionTrace.js} +7 -7
  123. package/dist/application/{NativeValueTrace.js → native/NativeValueTrace.js} +6 -6
  124. package/dist/{application/ArtifactInventory/hash.js → artifacts/ArtifactHash.js} +4 -2
  125. package/dist/artifacts/ArtifactPaths.js +3 -3
  126. package/dist/artifacts/ArtifactProvider.js +7 -37
  127. package/dist/artifacts/ArtifactProviderMetadata.js +36 -0
  128. package/dist/artifacts/AsarArtifactReader.js +195 -23
  129. package/dist/artifacts/AsarEntryStream.js +76 -0
  130. package/dist/artifacts/DirectoryArtifactReader.js +41 -7
  131. package/dist/artifacts/NativeDmgArtifactReader.js +161 -9
  132. package/dist/{application → artifacts/apple}/AppleAssetCatalogAnalysis.js +4 -4
  133. package/dist/{application → artifacts/apple}/InterfaceBuilderAnalysis.js +125 -51
  134. package/dist/artifacts/{KeyedArchiveReader.js → apple/KeyedArchiveReader.js} +21 -27
  135. package/dist/artifacts/apple/NibViewHierarchy.js +150 -0
  136. package/dist/{application → artifacts/javascript}/JavaScriptArtifactFiles.js +27 -6
  137. package/dist/artifacts/javascript/JavaScriptArtifactReader.js +6 -0
  138. package/dist/artifacts/readStableArtifact.js +52 -0
  139. package/dist/browser/BrowserScenarioSecrets.js +50 -8
  140. package/dist/browser/CdpAuthorizedMainFrame.js +4 -4
  141. package/dist/browser/CdpAuthorizedTarget.js +22 -0
  142. package/dist/browser/CdpBrowserProvider.js +4 -15
  143. package/dist/browser/CdpCaptureDocuments.js +33 -21
  144. package/dist/browser/CdpCaptureEventBodyShapes.js +3 -3
  145. package/dist/browser/CdpCaptureEventHandlers.js +26 -26
  146. package/dist/browser/CdpCaptureEventHelpers.js +6 -6
  147. package/dist/browser/CdpCaptureStorage.js +10 -8
  148. package/dist/browser/CdpCaptureStorageFingerprints.js +24 -22
  149. package/dist/browser/CdpCaptureValues.js +2 -2
  150. package/dist/browser/CdpCommandRejection.js +17 -0
  151. package/dist/browser/CdpConnection.js +51 -11
  152. package/dist/browser/CdpElectronInspection.js +10 -10
  153. package/dist/browser/CdpElectronProvider.js +3 -6
  154. package/dist/browser/CdpElectronScriptEvents.js +6 -6
  155. package/dist/browser/CdpElectronScripts.js +2 -2
  156. package/dist/browser/CdpElectronWorkers.js +4 -4
  157. package/dist/browser/CdpObservationSession.js +18 -23
  158. package/dist/browser/CdpPageCapture.js +4 -4
  159. package/dist/browser/CdpPageCaptureScripts.js +2 -2
  160. package/dist/browser/CdpPageCaptureWorkers.js +9 -9
  161. package/dist/browser/CdpSafeMetadata.js +48 -10
  162. package/dist/browser/CdpScreenshot.js +5 -5
  163. package/dist/browser/CdpTargetEvents.js +8 -0
  164. package/dist/browser/CdpTargetSession.js +2 -2
  165. package/dist/browser/CdpWebMcpDiscovery.js +22 -16
  166. package/dist/browser/PlaywrightBrowserScenarioProvider.js +7 -6
  167. package/dist/browser/PlaywrightElectronActiveProvider.js +3 -6
  168. package/dist/browser/PlaywrightScenarioEvents.js +59 -51
  169. package/dist/browser/PlaywrightScenarioSession.js +8 -1
  170. package/dist/browser/WebSourceMapFetcher.js +37 -53
  171. package/dist/browser/assets/LocalWebScriptArtifacts.js +87 -0
  172. package/dist/browser/assets/PageScriptCapture.js +32 -0
  173. package/dist/browser/assets/PublishWebScripts.js +74 -0
  174. package/dist/browser/assets/ScenarioScriptCapture.js +76 -0
  175. package/dist/browser/assets/ScriptCaptureAdapters.js +57 -0
  176. package/dist/browser/assets/WebArtifactReads.js +56 -0
  177. package/dist/browser/assets/WebSourceLocationArtifacts.js +40 -0
  178. package/dist/browser/execution/CdpEventListeners.js +79 -0
  179. package/dist/browser/execution/CdpExecutionCapture.js +135 -0
  180. package/dist/browser/execution/CdpExecutionCollection.js +57 -0
  181. package/dist/browser/execution/CdpExecutionWindow.js +100 -0
  182. package/dist/browser/execution/CdpListenerSelector.js +22 -0
  183. package/dist/browser/execution/CdpPreciseCoverage.js +48 -0
  184. package/dist/browser/execution/CdpRuntimeInitiator.js +18 -0
  185. package/dist/browser/execution/CdpRuntimeProtocol.js +106 -0
  186. package/dist/browser/execution/CdpRuntimeRequests.js +81 -0
  187. package/dist/browser/execution/CdpRuntimeSession.js +163 -0
  188. package/dist/browser/execution/CdpRuntimeSources.js +223 -0
  189. package/dist/browser/execution/CdpWebRuntimeProvider.js +51 -0
  190. package/dist/browser/modules/NativeModuleResolver.js +210 -0
  191. package/dist/browser/modules/WebModuleArtifacts.js +40 -0
  192. package/dist/browser/network/PlaywrightNetworkContent.js +71 -0
  193. package/dist/browser/network/PlaywrightScenarioNetwork.js +180 -0
  194. package/dist/browser/providerIdentities.js +24 -0
  195. package/dist/catalogIdentity.js +23 -15
  196. package/dist/cli/androidCommands.js +13 -3
  197. package/dist/cli/applicationCommands.js +39 -8
  198. package/dist/cli/artifactCommands.js +1 -1
  199. package/dist/cli/browserAdvancedCommands.js +27 -9
  200. package/dist/cli/coreAnalysisCommands.js +5 -493
  201. package/dist/cli/coreBinaryCommands.js +211 -0
  202. package/dist/cli/coreNativeCommands.js +293 -0
  203. package/dist/cli/electronCommands.js +13 -18
  204. package/dist/cli/firmwareCommands.js +3 -3
  205. package/dist/cli/javascriptApplicationAnalysis.js +1 -1
  206. package/dist/cli/javascriptRecoveryCommands.js +45 -0
  207. package/dist/cli/managedCommands.js +4 -4
  208. package/dist/cli/managedProjectGraphCommand.js +1 -1
  209. package/dist/cli/referenceSourceImportStatus.js +6 -1
  210. package/dist/cli/utilityCommands.js +47 -23
  211. package/dist/cli/webModuleCommands.js +56 -0
  212. package/dist/cli/webRuntimeCommands.js +60 -0
  213. package/dist/cli/webScriptCommands.js +31 -0
  214. package/dist/cli/webSourceLocationCommands.js +42 -0
  215. package/dist/cli.js +10 -0
  216. package/dist/cliBrowserContext.js +4 -2
  217. package/dist/cliBrowserScenarioCommands.js +4 -3
  218. package/dist/cliCommandNames.js +8 -0
  219. package/dist/cliJavaScriptRuntimeCommands.js +6 -4
  220. package/dist/cliJsonInput.js +9 -2
  221. package/dist/cliOutput.js +37 -11
  222. package/dist/composition/android.js +3 -0
  223. package/dist/composition/auxiliaryAnalysisProviders.js +30 -0
  224. package/dist/composition/binary.js +25 -0
  225. package/dist/composition/browserObservation.js +3 -0
  226. package/dist/composition/browserScenario.js +3 -0
  227. package/dist/composition/directAnalysis.js +17 -0
  228. package/dist/composition/electronObservation.js +3 -0
  229. package/dist/composition/electronScenario.js +3 -0
  230. package/dist/composition/firmware.js +3 -0
  231. package/dist/composition/javascriptRecovery.js +3 -0
  232. package/dist/composition/javascriptRuntimeObservation.js +3 -0
  233. package/dist/composition/optionalObservationProviders.js +49 -0
  234. package/dist/composition/webModules.js +5 -0
  235. package/dist/composition/webRuntime.js +4 -0
  236. package/dist/composition/webSourceLocations.js +5 -0
  237. package/dist/config/parseConfig.js +22 -3
  238. package/dist/contracts/{androidToolContracts.js → android/androidToolContracts.js} +5 -5
  239. package/dist/contracts/applicationToolContracts.js +43 -8
  240. package/dist/contracts/artifactToolContracts.js +2 -2
  241. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  242. package/dist/contracts/enhancedInputs.js +1 -1
  243. package/dist/contracts/{firmwareToolContracts.js → firmware/firmwareToolContracts.js} +5 -5
  244. package/dist/contracts/{applicationWorkflowInputContracts.js → javascript/applicationWorkflowInputContracts.js} +6 -6
  245. package/dist/contracts/{electronToolContracts.js → javascript/electronToolContracts.js} +6 -6
  246. package/dist/contracts/{javascriptApplicationWorkflowExamples.js → javascript/javascriptApplicationWorkflowExamples.js} +3 -3
  247. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +23 -0
  248. package/dist/contracts/{javascriptRuntimeObservationToolContracts.js → javascript/javascriptRuntimeObservationToolContracts.js} +3 -3
  249. package/dist/contracts/{javascriptRuntimeReconciliationExample.js → javascript/javascriptRuntimeReconciliationExample.js} +5 -5
  250. package/dist/contracts/{managedToolContracts.js → managed/managedToolContracts.js} +3 -3
  251. package/dist/contracts/{managedWorkflowExamples.js → managed/managedWorkflowExamples.js} +1 -1
  252. package/dist/contracts/{managedWorkflowToolContracts.js → managed/managedWorkflowToolContracts.js} +6 -6
  253. package/dist/contracts/mobileApplicationGraphExamples.js +105 -0
  254. package/dist/contracts/{nativeToolContracts.js → native/nativeToolContracts.js} +14 -7
  255. package/dist/contracts/officialToolContracts.js +3 -3
  256. package/dist/contracts/sessionToolContracts.js +1 -1
  257. package/dist/contracts/toolContracts.js +13 -7
  258. package/dist/contracts/toolEffects.js +32 -0
  259. package/dist/contracts/toolOutputSchemaGroups.js +18 -18
  260. package/dist/contracts/webRuntimeToolContracts.js +43 -0
  261. package/dist/contracts/webScriptToolContracts.js +68 -0
  262. package/dist/domain/analysisErrorCore.js +4 -2
  263. package/dist/domain/analysisErrorProjection.js +1 -0
  264. package/dist/domain/{androidApplication.js → android/androidApplication.js} +7 -6
  265. package/dist/domain/apple/appleApplication.js +277 -0
  266. package/dist/domain/{appleAssetCatalog.js → apple/appleAssetCatalog.js} +2 -2
  267. package/dist/domain/apple/appleBundleAnatomy.js +236 -0
  268. package/dist/domain/{interfaceBuilderGraph.js → apple/interfaceBuilderGraph.js} +47 -314
  269. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +411 -0
  270. package/dist/domain/{keyedArchive.js → apple/keyedArchive.js} +10 -9
  271. package/dist/domain/apple/plistValue.js +35 -0
  272. package/dist/domain/artifactInventoryEvidence.js +12 -2
  273. package/dist/domain/artifactInventorySnapshot.js +1 -0
  274. package/dist/domain/artifactOperationError.js +5 -1
  275. package/dist/domain/artifactPathSyntax.js +26 -0
  276. package/dist/domain/browserNetworkEvidence.js +82 -0
  277. package/dist/domain/browserObservationError.js +2 -0
  278. package/dist/domain/browserObservationSchemas.js +2 -1
  279. package/dist/domain/browserScenarioCapture.js +22 -0
  280. package/dist/domain/browserScenarioCaptureValues.js +25 -0
  281. package/dist/domain/browserScenarioDiff.js +6 -3
  282. package/dist/domain/browserScenarioDiffEvidence.js +35 -1
  283. package/dist/domain/browserScenarioValues.js +12 -1
  284. package/dist/domain/browserSession.js +2 -7
  285. package/dist/domain/bundleComparison.js +2 -1
  286. package/dist/domain/callPath.js +52 -44
  287. package/dist/domain/comparisonStatus.js +39 -0
  288. package/dist/domain/evidenceBundle.js +98 -35
  289. package/dist/domain/{firmwareAnalysis.js → firmware/firmwareAnalysis.js} +2 -2
  290. package/dist/domain/functionComparisonNormalization.js +11 -13
  291. package/dist/domain/hopperValues.js +2 -2
  292. package/dist/domain/inputIssueProjection.js +17 -2
  293. package/dist/domain/{electronObservation.js → javascript/electronObservation.js} +5 -11
  294. package/dist/domain/{electronStaticAnalysisBrowser.js → javascript/electronStaticAnalysisBrowser.js} +4 -3
  295. package/dist/domain/{electronStaticAnalysisIpc.js → javascript/electronStaticAnalysisIpc.js} +2 -2
  296. package/dist/domain/{electronStaticAnalysisNative.js → javascript/electronStaticAnalysisNative.js} +12 -13
  297. package/dist/domain/javascript/electronStaticAnalysisTypes.js +1 -0
  298. package/dist/domain/{electronStaticAnalysisValues.js → javascript/electronStaticAnalysisValues.js} +3 -3
  299. package/dist/domain/{javascriptApplicationAnalysis.js → javascript/javascriptApplicationAnalysis.js} +2 -2
  300. package/dist/domain/{javascriptApplicationChangeGraph.js → javascript/javascriptApplicationChangeGraph.js} +1 -1
  301. package/dist/domain/{javascriptApplicationEvidenceSchemas.js → javascript/javascriptApplicationEvidenceSchemas.js} +6 -4
  302. package/dist/domain/{javascriptApplicationGraph.js → javascript/javascriptApplicationGraph.js} +2 -2
  303. package/dist/domain/{javascriptApplicationGraphSchemas.js → javascript/javascriptApplicationGraphSchemas.js} +2 -2
  304. package/dist/domain/{javascriptApplicationVersionComparison.js → javascript/javascriptApplicationVersionComparison.js} +2 -2
  305. package/dist/domain/{javascriptApplicationVersionComparisonSchemas.js → javascript/javascriptApplicationVersionComparisonSchemas.js} +3 -3
  306. package/dist/domain/{javascriptApplicationVersionItems.js → javascript/javascriptApplicationVersionItems.js} +2 -2
  307. package/dist/domain/{javascriptApplicationVersionKeys.js → javascript/javascriptApplicationVersionKeys.js} +16 -9
  308. package/dist/domain/javascript/javascriptArtifactFiles.js +1 -0
  309. package/dist/domain/{javascriptAstFingerprint.js → javascript/javascriptAstFingerprint.js} +38 -22
  310. package/dist/domain/javascript/javascriptAstValues.js +23 -0
  311. package/dist/domain/{javascriptExportShapeComparison.js → javascript/javascriptExportShapeComparison.js} +1 -1
  312. package/dist/domain/{javascriptExportShapeComparisonSchemas.js → javascript/javascriptExportShapeComparisonSchemas.js} +2 -2
  313. package/dist/domain/{javascriptExportShapeSelection.js → javascript/javascriptExportShapeSelection.js} +1 -1
  314. package/dist/domain/{javascriptExportShapeVariants.js → javascript/javascriptExportShapeVariants.js} +1 -1
  315. package/dist/domain/{javascriptFeatureSeed.js → javascript/javascriptFeatureSeed.js} +4 -3
  316. package/dist/domain/{javascriptFeatureTrace.js → javascript/javascriptFeatureTrace.js} +2 -2
  317. package/dist/domain/{javascriptFeatureTraceSchemas.js → javascript/javascriptFeatureTraceSchemas.js} +32 -18
  318. package/dist/domain/{javascriptFeatureTraversal.js → javascript/javascriptFeatureTraversal.js} +6 -2
  319. package/dist/domain/{javascriptNativeHandoff.js → javascript/javascriptNativeHandoff.js} +1 -1
  320. package/dist/domain/javascript/javascriptRecovery.js +88 -0
  321. package/dist/domain/{javascriptRuntimeLoadState.js → javascript/javascriptRuntimeLoadState.js} +1 -1
  322. package/dist/domain/{javascriptRuntimeObservation.js → javascript/javascriptRuntimeObservation.js} +2 -2
  323. package/dist/domain/{javascriptRuntimeReconciliationActive.js → javascript/javascriptRuntimeReconciliationActive.js} +3 -3
  324. package/dist/domain/{javascriptRuntimeReconciliationGraph.js → javascript/javascriptRuntimeReconciliationGraph.js} +1 -1
  325. package/dist/domain/{javascriptRuntimeReconciliationMatching.js → javascript/javascriptRuntimeReconciliationMatching.js} +2 -2
  326. package/dist/domain/{javascriptRuntimeReconciliationParsing.js → javascript/javascriptRuntimeReconciliationParsing.js} +5 -5
  327. package/dist/domain/{javascriptRuntimeReconciliationResult.js → javascript/javascriptRuntimeReconciliationResult.js} +2 -2
  328. package/dist/domain/{javascriptRuntimeReconciliationSchemas.js → javascript/javascriptRuntimeReconciliationSchemas.js} +4 -4
  329. package/dist/domain/{javascriptRuntimeStaticCandidates.js → javascript/javascriptRuntimeStaticCandidates.js} +1 -1
  330. package/dist/domain/{javascriptSemanticAnalysis.js → javascript/javascriptSemanticAnalysis.js} +40 -14
  331. package/dist/domain/{javascriptSemanticAsyncEffects.js → javascript/javascriptSemanticAsyncEffects.js} +2 -1
  332. package/dist/domain/{javascriptSemanticCallResolution.js → javascript/javascriptSemanticCallResolution.js} +10 -5
  333. package/dist/domain/{javascriptSemanticCalls.js → javascript/javascriptSemanticCalls.js} +7 -4
  334. package/dist/domain/{javascriptSemanticChildProcesses.js → javascript/javascriptSemanticChildProcesses.js} +4 -2
  335. package/dist/domain/{javascriptSemanticDataEffectHelpers.js → javascript/javascriptSemanticDataEffectHelpers.js} +7 -6
  336. package/dist/domain/{javascriptSemanticDataEffects.js → javascript/javascriptSemanticDataEffects.js} +8 -6
  337. package/dist/domain/{javascriptSemanticFingerprints.js → javascript/javascriptSemanticFingerprints.js} +40 -16
  338. package/dist/domain/{javascriptSemanticGraph.js → javascript/javascriptSemanticGraph.js} +2 -2
  339. package/dist/domain/{javascriptSemanticGraphSchemas.js → javascript/javascriptSemanticGraphSchemas.js} +3 -3
  340. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +116 -0
  341. package/dist/domain/javascript/javascriptSemanticMutationValues.js +53 -0
  342. package/dist/domain/{javascriptSemanticObjects.js → javascript/javascriptSemanticObjects.js} +5 -5
  343. package/dist/domain/{javascriptSemanticPrimitives.js → javascript/javascriptSemanticPrimitives.js} +1 -1
  344. package/dist/domain/{javascriptSemanticProjection.js → javascript/javascriptSemanticProjection.js} +31 -44
  345. package/dist/domain/{javascriptSemanticPromises.js → javascript/javascriptSemanticPromises.js} +77 -22
  346. package/dist/domain/{javascriptSemanticProvenance.js → javascript/javascriptSemanticProvenance.js} +4 -1
  347. package/dist/domain/{javascriptSemanticQuery.js → javascript/javascriptSemanticQuery.js} +1 -1
  348. package/dist/domain/{javascriptSemanticQueryAssessment.js → javascript/javascriptSemanticQueryAssessment.js} +1 -1
  349. package/dist/domain/{javascriptSemanticQueryIdentity.js → javascript/javascriptSemanticQueryIdentity.js} +1 -1
  350. package/dist/domain/{javascriptSemanticQuerySchemas.js → javascript/javascriptSemanticQuerySchemas.js} +3 -3
  351. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +25 -0
  352. package/dist/domain/{javascriptSemanticResources.js → javascript/javascriptSemanticResources.js} +2 -1
  353. package/dist/domain/{javascriptSemanticReturns.js → javascript/javascriptSemanticReturns.js} +1 -1
  354. package/dist/domain/{javascriptSemanticTraceSchemas.js → javascript/javascriptSemanticTraceSchemas.js} +2 -2
  355. package/dist/domain/javascript/javascriptSemanticTraversal.js +55 -0
  356. package/dist/domain/javascript/javascriptSemanticValueTypes.js +1 -0
  357. package/dist/domain/{javascriptSemanticValues.js → javascript/javascriptSemanticValues.js} +72 -48
  358. package/dist/domain/{javascriptStaticAnalysis.js → javascript/javascriptStaticAnalysis.js} +7 -4
  359. package/dist/domain/{javascriptStaticAnalysisBundler.js → javascript/javascriptStaticAnalysisBundler.js} +14 -11
  360. package/dist/domain/{javascriptStaticAnalysisCalls.js → javascript/javascriptStaticAnalysisCalls.js} +2 -2
  361. package/dist/domain/{javascriptStaticAnalysisHelpers.js → javascript/javascriptStaticAnalysisHelpers.js} +231 -40
  362. package/dist/domain/{sourceToBundleComparison.js → javascript/sourceToBundleComparison.js} +2 -2
  363. package/dist/domain/{sourceToBundleComparisonSchemas.js → javascript/sourceToBundleComparisonSchemas.js} +4 -4
  364. package/dist/domain/{sourceToBundleSignals.js → javascript/sourceToBundleSignals.js} +2 -2
  365. package/dist/domain/{managedApplicationGraph.js → managed/managedApplicationGraph.js} +4 -4
  366. package/dist/domain/{managedApplicationGraphNodes.js → managed/managedApplicationGraphNodes.js} +1 -1
  367. package/dist/domain/{managedArtifact.js → managed/managedArtifact.js} +1 -1
  368. package/dist/domain/{managedMemberComparison.js → managed/managedMemberComparison.js} +4 -4
  369. package/dist/domain/{managedMemberComparisonCoverage.js → managed/managedMemberComparisonCoverage.js} +2 -1
  370. package/dist/domain/{managedMemberComparisonItems.js → managed/managedMemberComparisonItems.js} +97 -40
  371. package/dist/domain/{managedMemberComparisonMatch.js → managed/managedMemberComparisonMatch.js} +22 -11
  372. package/dist/domain/{managedNativeVerification.js → managed/managedNativeVerification.js} +1 -1
  373. package/dist/domain/{managedNativeVerificationMatch.js → managed/managedNativeVerificationMatch.js} +3 -3
  374. package/dist/domain/{managedNativeVerificationSchemas.js → managed/managedNativeVerificationSchemas.js} +6 -5
  375. package/dist/domain/{managedReconstruction.js → managed/managedReconstruction.js} +3 -3
  376. package/dist/domain/{nativeFunctionAnnotations.js → native/nativeFunctionAnnotations.js} +1 -1
  377. package/dist/domain/{nativeInspection.js → native/nativeInspection.js} +1 -1
  378. package/dist/domain/{nativeInvestigationGraph.js → native/nativeInvestigationGraph.js} +13 -4
  379. package/dist/domain/{nativeLoadImage.js → native/nativeLoadImage.js} +1 -1
  380. package/dist/domain/{nativeUiObservation.js → native/nativeUiObservation.js} +20 -6
  381. package/dist/domain/{objcSwiftMetadata.js → native/objcSwiftMetadata.js} +17 -0
  382. package/dist/domain/processCapture.js +4 -2
  383. package/dist/domain/processScenario.js +17 -17
  384. package/dist/domain/propertyListKeys.js +69 -0
  385. package/dist/domain/providerCleanupError.js +5 -2
  386. package/dist/domain/reconstructionCoverageEvaluation.js +46 -24
  387. package/dist/domain/reconstructionCoverageInput.js +7 -0
  388. package/dist/domain/runtimeVersion.js +2 -0
  389. package/dist/domain/sourceMapEnvelope.js +38 -0
  390. package/dist/domain/unicodeCodePointOrder.js +11 -6
  391. package/dist/domain/webBundleAnalyzerAst.js +2 -34
  392. package/dist/domain/webBundleAnalyzerInspection.js +12 -9
  393. package/dist/domain/webEventListeners.js +28 -0
  394. package/dist/domain/webExecution.js +74 -0
  395. package/dist/domain/webMcpDiscovery.js +1 -7
  396. package/dist/domain/webModuleImports.js +104 -0
  397. package/dist/domain/webModuleTrace.js +106 -0
  398. package/dist/domain/webRuntime.js +69 -0
  399. package/dist/domain/webScreenshot.js +1 -7
  400. package/dist/domain/webScriptArtifacts.js +39 -0
  401. package/dist/domain/webScriptExport.js +86 -0
  402. package/dist/domain/webScriptExportError.js +13 -0
  403. package/dist/domain/webScriptExportPlan.js +108 -0
  404. package/dist/domain/webSourceLocation.js +106 -0
  405. package/dist/domain/webSourcePosition.js +21 -0
  406. package/dist/dotnet/ManagedArtifactInspector.js +1 -1
  407. package/dist/dotnet/ManagedMemberInspector.js +1 -1
  408. package/dist/dotnet/ManagedMemberInspectorCore.js +34 -0
  409. package/dist/dotnet/ManagedMemberRows.js +5 -3
  410. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +22 -16
  411. package/dist/dotnet/ManagedNativeBoundaryInspector.js +56 -50
  412. package/dist/dotnet/ManagedStaticProvider.js +3 -33
  413. package/dist/dotnet/ManagedStaticProviderMetadata.js +36 -0
  414. package/dist/evaluation/CodexAgentEval.js +2 -1
  415. package/dist/firmware/FirmwareProvider.js +18 -12
  416. package/dist/firmware/FirmwarePublication.js +1 -1
  417. package/dist/firmware/FirmwareRelease.js +1 -1
  418. package/dist/firmware/FirmwareReports.js +12 -0
  419. package/dist/firmware/FirmwareVersion.js +80 -0
  420. package/dist/generatedMcpToolCatalog.js +1 -1
  421. package/dist/generatedPackageMetadata.js +2 -2
  422. package/dist/ghidra/GhidraFunctionValues.js +5 -5
  423. package/dist/ghidra/GhidraInstallation.js +38 -34
  424. package/dist/ghidra/GhidraInstallationPolicy.js +140 -0
  425. package/dist/ghidra/GhidraInventoryValues.js +1 -1
  426. package/dist/ghidra/GhidraLauncher.js +12 -4
  427. package/dist/ghidra/GhidraLoadImageAttest.js +36 -0
  428. package/dist/ghidra/GhidraLoadImageValues.js +1 -1
  429. package/dist/ghidra/GhidraProvider.js +15 -233
  430. package/dist/ghidra/GhidraProviderCapabilities.js +7 -14
  431. package/dist/ghidra/GhidraProviderClient.js +209 -0
  432. package/dist/ghidra/GhidraResponseBuffer.js +7 -1
  433. package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +17 -1
  434. package/dist/hopper/HopperProvider.js +2 -48
  435. package/dist/hopper/HopperProviderCapabilities.js +73 -0
  436. package/dist/hopper/HopperResponseStream.js +7 -1
  437. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -4
  438. package/dist/ida/IdaProviderCapabilities.js +3 -11
  439. package/dist/ida/IdaSessionClient.js +12 -0
  440. package/dist/{browser → inspector}/JavaScriptRuntimeScope.js +16 -5
  441. package/dist/{browser → inspector}/V8InspectorCaptureProjection.js +46 -8
  442. package/dist/{browser → inspector}/V8InspectorEndpoint.js +1 -1
  443. package/dist/{browser → inspector}/V8InspectorProvider.js +10 -13
  444. package/dist/inspector/providerIdentity.js +6 -0
  445. package/dist/javascript/recovery/RecoveryFiles.js +122 -0
  446. package/dist/javascript/recovery/WakaruCommand.js +116 -0
  447. package/dist/javascript/recovery/WakaruExecution.js +100 -0
  448. package/dist/javascript/recovery/WakaruProvider.js +96 -0
  449. package/dist/javascript/recovery/WakaruPublication.js +102 -0
  450. package/dist/javascript/recovery/WakaruRelease.js +29 -0
  451. package/dist/javascript/recovery/WakaruReport.js +134 -0
  452. package/dist/javascript/sourceMaps/SourceMapCodecProcess.js +37 -0
  453. package/dist/javascript/sourceMaps/SourceMapCodecProtocol.js +20 -0
  454. package/dist/javascript/sourceMaps/SourceMapCommand.js +176 -0
  455. package/dist/javascript/sourceMaps/SourceMapDecoder.js +61 -0
  456. package/dist/javascript/sourceMaps/SourceMapFormat.js +185 -0
  457. package/dist/javascript/sourceMaps/TraceSourceMap.js +138 -0
  458. package/dist/main/shutdown.js +8 -2
  459. package/dist/main/transport.js +24 -7
  460. package/dist/main.js +4 -18
  461. package/dist/native/AppleDispatchCoverage.js +58 -0
  462. package/dist/native/AppleDispatchMetadata.js +71 -509
  463. package/dist/native/AppleMachoFixups.js +292 -0
  464. package/dist/native/AppleMachoSelection.js +188 -0
  465. package/dist/native/AppleObjcCategories.js +59 -0
  466. package/dist/native/AppleObjcDispatchFacets.js +257 -0
  467. package/dist/native/AppleObjcProperties.js +68 -0
  468. package/dist/native/AppleObjcProtocols.js +2 -1
  469. package/dist/native/AppleSwiftDispatchFacets.js +150 -0
  470. package/dist/native/NativeMacOSProvider.js +132 -72
  471. package/dist/native/NativeMacOSProviderMetadata.js +42 -0
  472. package/dist/native/NativeMachoInspection.js +45 -14
  473. package/dist/native/NativeUiHelperRuntime.js +7 -3
  474. package/dist/native/NativeUiObservation.js +8 -4
  475. package/dist/native/NativeUiOutputBudget.js +8 -0
  476. package/dist/native/parsers/codesign.js +40 -5
  477. package/dist/native/parsers/demangle.js +6 -2
  478. package/dist/native/parsers/dyldInfo.js +13 -4
  479. package/dist/native/parsers/echoedPath.js +14 -0
  480. package/dist/native/parsers/lipo.js +14 -0
  481. package/dist/native/parsers/otool.js +1 -1
  482. package/dist/native/parsers/plist.js +174 -19
  483. package/dist/process/ExecFileOutput.js +2 -0
  484. package/dist/process/ProviderProcess.js +38 -17
  485. package/dist/reference/ReferenceSourceReaderEntries.js +6 -1
  486. package/dist/server/createServer.js +48 -6
  487. package/dist/server/mcpClientMetadata.js +6 -3
  488. package/dist/server/registerAndroidTools.js +1 -1
  489. package/dist/server/registerApplicationTools/compareExportShapes.js +2 -2
  490. package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -2
  491. package/dist/server/registerApplicationTools/compareVersions.js +2 -2
  492. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +43 -0
  493. package/dist/server/registerApplicationTools/traceFeature.js +1 -1
  494. package/dist/server/registerApplicationTools/traceSemantics.js +1 -1
  495. package/dist/server/registerApplicationTools.js +2 -0
  496. package/dist/server/registerBrowserScenarioTool.js +6 -2
  497. package/dist/server/registerBrowserTools.js +13 -2
  498. package/dist/server/registerCloseLifecycleTool.js +1 -1
  499. package/dist/server/registerElectronTools.js +21 -7
  500. package/dist/server/registerJavaScriptRecoveryTool.js +17 -0
  501. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -4
  502. package/dist/server/registerManagedTools.js +3 -3
  503. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -2
  504. package/dist/server/registerManagedWorkflowTools/contract.js +1 -1
  505. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +1 -1
  506. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +1 -1
  507. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -2
  508. package/dist/server/registerNativeTools.js +1 -1
  509. package/dist/server/registerPrompts.js +5 -1
  510. package/dist/server/registerSessionTools.js +1 -1
  511. package/dist/server/registerWebModuleTool.js +17 -0
  512. package/dist/server/registerWebRuntimeTools.js +31 -0
  513. package/dist/server/registerWebScriptTool.js +18 -0
  514. package/dist/server/registerWebSourceLocationTool.js +17 -0
  515. package/dist/server/sessionAvailabilityPolicy.js +24 -12
  516. package/dist/windows/WindowsOwnedProcess.js +3 -1
  517. package/install.sh +12 -2
  518. package/native/windows/README.md +5 -0
  519. package/native/windows/build/manifest.json +2 -2
  520. package/native/windows/build/rea-windows-x64.node +0 -0
  521. package/package.json +40 -19
  522. package/scripts/hopper-demo-x11.py +67 -8
  523. package/scripts/rea.mjs +9 -1
  524. package/skills/reverse-engineer-anything/SKILL.md +3 -3
  525. package/skills/reverse-engineer-anything/references/android-applications.md +2 -2
  526. package/skills/reverse-engineer-anything/references/javascript-applications.md +1 -1
  527. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +32 -23
  528. package/dist/application/runtime.js +0 -53
  529. package/dist/domain/appleApplication.js +0 -181
  530. package/dist/domain/javascriptAstValues.js +0 -13
  531. package/dist/domain/javascriptSemanticTraversal.js +0 -30
  532. package/dist/native/NativeHostCapabilities.js +0 -23
  533. /package/dist/application/{AndroidAnalysisPort.js → DirectAnalysisDependencies.js} +0 -0
  534. /package/dist/application/{BinarySessionPort.js → WebModulePorts.js} +0 -0
  535. /package/dist/application/{ElectronActiveObservationPort.js → WebRuntimePort.js} +0 -0
  536. /package/dist/application/{ElectronObservationPort.js → WebScriptArtifactPort.js} +0 -0
  537. /package/dist/application/{FirmwareAnalysisPort.js → WebSourceLocationPorts.js} +0 -0
  538. /package/dist/application/{JavaScriptArtifactAnalysisTypes.js → android/AndroidAnalysisPort.js} +0 -0
  539. /package/dist/application/{AbortablePromise.js → binary/AbortablePromise.js} +0 -0
  540. /package/dist/application/{JavaScriptRuntimeObservationPort.js → binary/BinarySessionPort.js} +0 -0
  541. /package/dist/application/{BinarySessionStatus.js → binary/BinarySessionStatus.js} +0 -0
  542. /package/dist/{domain/electronStaticAnalysisTypes.js → application/firmware/FirmwareAnalysisPort.js} +0 -0
  543. /package/dist/{domain/javascriptSemanticValueTypes.js → application/investigation/InvestigationRecordPort.js} +0 -0
  544. /package/dist/application/{ElectronBoundaryGraph.js → javascript/ElectronBoundaryGraph.js} +0 -0
  545. /package/dist/application/{ElectronBoundaryGraphIpc.js → javascript/ElectronBoundaryGraphIpc.js} +0 -0
  546. /package/dist/application/{ElectronBoundaryGraphNative.js → javascript/ElectronBoundaryGraphNative.js} +0 -0
  547. /package/dist/application/{ElectronBoundaryGraphWindows.js → javascript/ElectronBoundaryGraphWindows.js} +0 -0
  548. /package/dist/application/{JavaScriptArtifactGraphBundlers.js → javascript/JavaScriptArtifactGraphBundlers.js} +0 -0
  549. /package/dist/application/{JavaScriptArtifactGraphEvidence.js → javascript/JavaScriptArtifactGraphEvidence.js} +0 -0
  550. /package/dist/application/{JavaScriptArtifactReconstructionInput.js → javascript/JavaScriptArtifactReconstructionInput.js} +0 -0
  551. /package/dist/application/{JavaScriptSemanticGraphEvidence.js → javascript/JavaScriptSemanticGraphEvidence.js} +0 -0
  552. /package/dist/application/{JavaScriptSemanticGraphValueProjection.js → javascript/JavaScriptSemanticGraphValueProjection.js} +0 -0
  553. /package/dist/artifacts/{NibArchive.js → apple/NibArchive.js} +0 -0
  554. /package/dist/domain/{androidAnalysis.js → android/androidAnalysis.js} +0 -0
  555. /package/dist/domain/{electronActiveObservation.js → javascript/electronActiveObservation.js} +0 -0
  556. /package/dist/domain/{electronStaticAnalysis.js → javascript/electronStaticAnalysis.js} +0 -0
  557. /package/dist/domain/{javascriptExportShapeComparisonIdentity.js → javascript/javascriptExportShapeComparisonIdentity.js} +0 -0
  558. /package/dist/domain/{javascriptRuntimeReconciliation.js → javascript/javascriptRuntimeReconciliation.js} +0 -0
  559. /package/dist/domain/{javascriptRuntimeReconciliationRuntime.js → javascript/javascriptRuntimeReconciliationRuntime.js} +0 -0
  560. /package/dist/domain/{javascriptSemanticCoverage.js → javascript/javascriptSemanticCoverage.js} +0 -0
  561. /package/dist/domain/{javascriptSemanticDerivedAnalysis.js → javascript/javascriptSemanticDerivedAnalysis.js} +0 -0
  562. /package/dist/domain/{javascriptSemanticGraphSerialization.js → javascript/javascriptSemanticGraphSerialization.js} +0 -0
  563. /package/dist/domain/{javascriptSemanticIr.js → javascript/javascriptSemanticIr.js} +0 -0
  564. /package/dist/domain/{javascriptSemanticQueryRelations.js → javascript/javascriptSemanticQueryRelations.js} +0 -0
  565. /package/dist/domain/{javascriptSemanticState.js → javascript/javascriptSemanticState.js} +0 -0
  566. /package/dist/domain/{javascriptSourceParser.js → javascript/javascriptSourceParser.js} +0 -0
  567. /package/dist/domain/{javascriptStaticAnalysisFindings.js → javascript/javascriptStaticAnalysisFindings.js} +0 -0
  568. /package/dist/domain/{javascriptStaticAnalysisState.js → javascript/javascriptStaticAnalysisState.js} +0 -0
  569. /package/dist/domain/{javascriptStaticAnalysisTypes.js → javascript/javascriptStaticAnalysisTypes.js} +0 -0
  570. /package/dist/domain/{managedApplicationGraphCoverage.js → managed/managedApplicationGraphCoverage.js} +0 -0
  571. /package/dist/domain/{managedApplicationGraphNodeCoverage.js → managed/managedApplicationGraphNodeCoverage.js} +0 -0
  572. /package/dist/domain/{nativeApiBoundary.js → native/nativeApiBoundary.js} +0 -0
  573. /package/dist/domain/{nativeDataType.js → native/nativeDataType.js} +0 -0
  574. /package/dist/domain/{nativeInstruction.js → native/nativeInstruction.js} +0 -0
  575. /package/dist/domain/{nativeMetadataRecovery.js → native/nativeMetadataRecovery.js} +0 -0
  576. /package/dist/domain/{nativeValueFlow.js → native/nativeValueFlow.js} +0 -0
  577. /package/dist/domain/{nativeValueTrace.js → native/nativeValueTrace.js} +0 -0
@@ -0,0 +1,247 @@
1
+ import com.atxx.jhmcp.*;
2
+ import com.google.gson.*;
3
+ import io.modelcontextprotocol.kotlin.sdk.server.*;
4
+ import io.modelcontextprotocol.kotlin.sdk.types.*;
5
+ import jadx.api.*;
6
+ import jadx.core.dex.nodes.*;
7
+ import java.io.PrintStream;
8
+ import java.util.*;
9
+ import java.util.concurrent.CountDownLatch;
10
+ import java.util.stream.Collectors;
11
+ import kotlin.Unit;
12
+ import kotlin.coroutines.EmptyCoroutineContext;
13
+ import kotlinx.coroutines.BuildersKt;
14
+ import kotlinx.io.CoreKt;
15
+ import kotlinx.io.JvmCoreKt;
16
+ import kotlinx.serialization.json.JsonObject;
17
+
18
+ /** REA-owned metadata boundary for the unmodified jadx-headless-mcp 0.7.1 JAR. */
19
+ class ReaJadxBridge {
20
+ private static final Gson JSON = new Gson();
21
+ private final SessionHolder holder;
22
+ private JadxSession indexedSession;
23
+ private Map<String, List<ClassSnapshot>> classes = Map.of();
24
+
25
+ private record MethodSnapshot(String name, String shortId, Map<String, Object> summary) {}
26
+ private record ClassSnapshot(JavaClass node, List<MethodSnapshot> methods, Map<String, Object> summary) {}
27
+
28
+ private ReaJadxBridge(SessionHolder holder) { this.holder = holder; }
29
+
30
+ private static CallToolResult text(String value, boolean failed) {
31
+ return new CallToolResult(List.of(new TextContent(value, null, null)), failed, null, null);
32
+ }
33
+
34
+ private static CallToolResult json(Object value) { return text(JSON.toJson(value), false); }
35
+
36
+ private static String string(JsonObject args, String name) {
37
+ JsonElement value = JsonParser.parseString(args.toString()).getAsJsonObject().get(name);
38
+ if (value == null || !value.isJsonPrimitive() || !value.getAsJsonPrimitive().isString())
39
+ throw new IllegalArgumentException(name + " must be a string");
40
+ return value.getAsString();
41
+ }
42
+
43
+ private static int integer(JsonObject args, String name, int fallback) {
44
+ JsonElement value = JsonParser.parseString(args.toString()).getAsJsonObject().get(name);
45
+ if (value == null) return fallback;
46
+ if (!value.isJsonPrimitive() || !value.getAsJsonPrimitive().isNumber())
47
+ throw new IllegalArgumentException(name + " must be a nonnegative integer");
48
+ try {
49
+ int result = value.getAsBigDecimal().intValueExact();
50
+ if (result < 0) throw new ArithmeticException();
51
+ return result;
52
+ } catch (ArithmeticException error) {
53
+ throw new IllegalArgumentException(name + " must be a nonnegative integer", error);
54
+ }
55
+ }
56
+
57
+ private JadxSession session() {
58
+ JadxSession current = holder.current();
59
+ if (current == null) throw new IllegalArgumentException("No APK loaded");
60
+ return current;
61
+ }
62
+
63
+ private ClassSnapshot selected(JsonObject args) {
64
+ JadxSession current = session();
65
+ if (indexedSession != current) {
66
+ Map<String, List<ClassSnapshot>> index = new LinkedHashMap<>();
67
+ if (!current.getClasses().isEmpty()) {
68
+ JadxDecompiler decompiler = current.getClasses().get(0).getClassNode().root().getDecompiler();
69
+ // JavaClass.getMethods/getFields/getInnerClasses all load code. Raw nodes do not.
70
+ // Snapshot every identity before code generation can rewrite aliases or members.
71
+ for (JavaClass cls : decompiler.getClassesWithInners()) {
72
+ ClassNode node = cls.getClassNode();
73
+ List<MethodNode> ordered = new ArrayList<>(node.getMethods());
74
+ ordered.sort(Comparator.comparing(MethodNode::getAlias));
75
+ List<MethodSnapshot> methods = ordered.stream().map(method -> {
76
+ String name = method.getAlias();
77
+ String signature = name + "(" + method.getArgTypes().stream()
78
+ .map(Object::toString).collect(Collectors.joining(", "))
79
+ + "): " + method.getReturnType().toString();
80
+ return new MethodSnapshot(name, method.getMethodInfo().getShortId(), Map.of(
81
+ "name", name, "signature", signature,
82
+ "is_constructor", method.isConstructor(), "def_pos", 0));
83
+ }).toList();
84
+ List<Map<String, Object>> fields = node.getFields().stream()
85
+ .sorted(Comparator.comparing(FieldNode::getAlias))
86
+ .map(field -> Map.<String, Object>of("name", field.getAlias(),
87
+ "type", field.getType().toString(), "def_pos", 0)).toList();
88
+ List<String> inner = node.getInnerClasses().stream().map(ClassNode::getFullName).toList();
89
+ Map<String, Object> summary = Map.of(
90
+ "full_name", cls.getFullName(), "name", cls.getName(),
91
+ "method_count", methods.size(), "field_count", fields.size(),
92
+ "inner_class_count", inner.size(), "inner_classes", inner,
93
+ "methods", methods.stream().map(MethodSnapshot::summary).toList(), "fields", fields);
94
+ index.computeIfAbsent(cls.getFullName(), ignored -> new ArrayList<>())
95
+ .add(new ClassSnapshot(cls, methods, summary));
96
+ }
97
+ }
98
+ classes = Collections.unmodifiableMap(index);
99
+ indexedSession = current;
100
+ }
101
+ String name = string(args, "class_name");
102
+ List<ClassSnapshot> candidates = classes.get(name);
103
+ if (candidates == null) throw new IllegalArgumentException("Exact class not found: " + name);
104
+ if (candidates.size() != 1) throw new IllegalArgumentException("Ambiguous metadata class identity: " + name
105
+ + "; raw identities: " + candidates.stream().map(candidate -> candidate.node().getRawName()).toList());
106
+ return candidates.get(0);
107
+ }
108
+
109
+ private List<MethodSnapshot> methods(ClassSnapshot cls, JsonObject args) {
110
+ String name = string(args, "method_name");
111
+ List<MethodSnapshot> result = cls.methods().stream().filter(method -> method.name().equals(name)).toList();
112
+ if (result.isEmpty()) throw new IllegalArgumentException("Method not found: " + name);
113
+ return result;
114
+ }
115
+
116
+ private JavaMethod method(ClassSnapshot cls, MethodSnapshot selected) {
117
+ JavaMethod result = cls.node().searchMethodByShortId(selected.shortId());
118
+ if (result == null) throw new IllegalArgumentException("Method identity no longer available: " + selected.shortId());
119
+ return result;
120
+ }
121
+
122
+ private CallToolResult handle(String name, JsonObject args) {
123
+ if (name.equals("rea_jvm_status")) return json(Map.of(
124
+ "engine_reported_version", BuildInfo.VERSION,
125
+ "max_heap_bytes", Runtime.getRuntime().maxMemory(),
126
+ "available_processors", Runtime.getRuntime().availableProcessors(),
127
+ "java_version", System.getProperty("java.version"),
128
+ "metadata_scope", "parsed_members"));
129
+ JadxSession current = session();
130
+ if (name.equals("list_classes")) {
131
+ List<String> names = current.getClassFqns();
132
+ int offset = integer(args, "offset", 0);
133
+ int limit = integer(args, "limit", 200);
134
+ int start = Math.min(offset, names.size());
135
+ int end = (int) Math.min((long) start + limit, names.size());
136
+ return json(Map.of("total", names.size(), "offset", offset, "limit", limit,
137
+ "items", names.subList(start, end)));
138
+ }
139
+ ClassSnapshot cls = selected(args);
140
+ if (name.equals("get_class_summary")) return json(cls.summary());
141
+ if (name.equals("get_method_body")) {
142
+ List<MethodSnapshot> overloads = methods(cls, args);
143
+ int index = integer(args, "overload_index", 0);
144
+ if (index >= overloads.size()) throw new IllegalArgumentException("overload_index out of range: " + index);
145
+ JavaMethod method = method(cls, overloads.get(index));
146
+ JadxSession.SmartCode code = current.getMethodBodySmart(method, current.getMaxSourceBytes(), true);
147
+ return json(Map.of("class_name", cls.summary().get("full_name"),
148
+ "method_name", overloads.get(index).name(), "full_name", method.getFullName(),
149
+ "overload_index", index, "overload_count", overloads.size(),
150
+ "mode", code.getKind(), "fell_back", code.getFellBack(),
151
+ "markers", code.getMarkers(), "body", code.getText()));
152
+ }
153
+ List<JavaNode> uses;
154
+ String target = string(args, "class_name");
155
+ if (name.equals("get_xrefs_to_class")) uses = cls.node().getUseIn();
156
+ else {
157
+ List<MethodSnapshot> overloads = methods(cls, args);
158
+ if (overloads.size() != 1) throw new IllegalArgumentException("Method references require a unique overload");
159
+ target += "." + overloads.get(0).name();
160
+ uses = method(cls, overloads.get(0)).getUseIn();
161
+ }
162
+ // REA consumes all references without materializing source line information.
163
+ List<Map<String, Object>> items = uses.stream().map(node -> current.describeUsage(node, false)).toList();
164
+ return json(Map.of("target", target, "total", uses.size(), "count", items.size(),
165
+ "resolve_line", false, "items", items));
166
+ }
167
+
168
+ public static void main(String[] args) throws Exception {
169
+ PrintStream protocolOut = System.out;
170
+ System.setOut(System.err);
171
+ SessionHolder holder = new SessionHolder(new SessionConfig(
172
+ 1048576, 0, 90000L, 1, List.of(), List.of(), 64, ResourceMode.FULL));
173
+ ServerCapabilities capabilities = new ServerCapabilities(
174
+ new ServerCapabilities.Tools(null), null, null, null, null, null, null, Map.of());
175
+ Server server = new Server(new Implementation("rea-jadx-bridge", "1", null, null, null),
176
+ new ServerOptions(capabilities), "", ignored -> Unit.INSTANCE);
177
+ SessionToolsKt.registerSessionTools(server, holder);
178
+ ManifestToolsKt.registerManifestTools(server, holder);
179
+ ClassToolsKt.registerClassTools(server, holder);
180
+ MethodToolsKt.registerMethodTools(server, holder);
181
+ XrefToolsKt.registerXrefTools(server, holder);
182
+ ReaJadxBridge bridge = new ReaJadxBridge(holder);
183
+ Set<String> consumed = Set.of("load_apk", "get_app_info", "get_android_manifest",
184
+ "list_classes", "get_class_summary", "get_method_body",
185
+ "get_xrefs_to_class", "get_xrefs_to_method");
186
+ for (String name : new ArrayList<>(server.getTools().keySet()))
187
+ if (!consumed.contains(name)) server.removeTool(name);
188
+ Tool diagnostics = new Tool("rea_jvm_status",
189
+ new ToolSchema(null, new JsonObject(Map.of()), List.of(), null),
190
+ "Observed worker JVM and metadata scope", null, null, null, null, null, null);
191
+ server.addTool(diagnostics, (connection, request, continuation) -> bridge.handle("rea_jvm_status", request.getArguments()));
192
+ for (String name : List.of("list_classes", "get_class_summary",
193
+ "get_method_body", "get_xrefs_to_class", "get_xrefs_to_method")) {
194
+ Tool tool = server.getTools().get(name).getTool();
195
+ server.removeTool(name);
196
+ List<String> fields = switch (name) {
197
+ case "list_classes" -> List.of("offset", "limit");
198
+ case "get_method_body" -> List.of("class_name", "method_name", "overload_index");
199
+ case "get_xrefs_to_method" -> List.of("class_name", "method_name");
200
+ default -> List.of("class_name");
201
+ };
202
+ Map<String, kotlinx.serialization.json.JsonElement> properties = new LinkedHashMap<>();
203
+ for (String field : fields) properties.put(field, tool.getInputSchema().getProperties().get(field));
204
+ String description = switch (name) {
205
+ case "list_classes" -> "Indexed pages of all top-level class names, with offset and limit.";
206
+ case "get_class_summary" -> "Parsed member metadata for one exact class name; no source generation.";
207
+ case "get_method_body" -> "Source for an exact class and stable same-name overload index, with smali fallback.";
208
+ default -> "Complete static references to an exact class or unique method; source lines are unresolved.";
209
+ };
210
+ Tool narrowed = new Tool(name, new ToolSchema(null, new JsonObject(properties),
211
+ tool.getInputSchema().getRequired(), null), description, null, null, null, null, null, null);
212
+ server.addTool(narrowed, (connection, request, continuation) -> {
213
+ try { return bridge.handle(name, request.getArguments()); }
214
+ catch (IllegalArgumentException error) { return text(error.getMessage(), true); }
215
+ });
216
+ }
217
+ CountDownLatch done = new CountDownLatch(1);
218
+ server.onClose(() -> { done.countDown(); return Unit.INSTANCE; });
219
+ StdioServerTransport transport = new StdioServerTransport(
220
+ CoreKt.buffered(JvmCoreKt.asSource(System.in)),
221
+ CoreKt.buffered(JvmCoreKt.asSink(protocolOut)));
222
+ transport.onClose(() -> { done.countDown(); return Unit.INSTANCE; });
223
+ ServerSession connection = null;
224
+ try {
225
+ connection = BuildersKt.runBlocking(EmptyCoroutineContext.INSTANCE,
226
+ (scope, continuation) -> server.createSession(transport, continuation));
227
+ done.await();
228
+ } finally {
229
+ try {
230
+ if (connection != null) {
231
+ ServerSession connected = connection;
232
+ // Unsubscribe the connection before the SDK joins its notification service.
233
+ BuildersKt.runBlocking(EmptyCoroutineContext.INSTANCE,
234
+ (scope, continuation) -> connected.close(continuation));
235
+ }
236
+ } finally {
237
+ try {
238
+ BuildersKt.runBlocking(EmptyCoroutineContext.INSTANCE,
239
+ (scope, continuation) -> server.close(continuation));
240
+ } finally {
241
+ BuildersKt.runBlocking(EmptyCoroutineContext.INSTANCE,
242
+ (scope, continuation) -> holder.unload(continuation));
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
@@ -0,0 +1,27 @@
1
+ import Foundation
2
+
3
+ struct ChildBatch<Element> {
4
+ let values: [Element]
5
+ let complete: Bool
6
+ }
7
+
8
+ struct ChildCount {
9
+ let value: Int?
10
+ let error: Int32?
11
+ }
12
+
13
+ func serializeHelperOutput(_ value: Any) throws -> Data {
14
+ try JSONSerialization.data(withJSONObject: value, options: [.sortedKeys, .withoutEscapingSlashes])
15
+ }
16
+
17
+ func captureChildCount(status: Int32, success: Int32, value: Int) -> ChildCount {
18
+ guard status == success else { return ChildCount(value: nil, error: status) }
19
+ return ChildCount(value: value, error: nil)
20
+ }
21
+
22
+ func captureChildValues<Element>(requestedCount: Int, copy: () -> [Element]?) -> ChildBatch<Element> {
23
+ guard requestedCount > 0 else { return ChildBatch(values: [], complete: true) }
24
+ let returned = copy() ?? []
25
+ let values = Array(returned.prefix(requestedCount))
26
+ return ChildBatch(values: values, complete: values.count == requestedCount)
27
+ }
@@ -22,15 +22,17 @@ func attribute(_ element: AXUIElement, _ key: String) -> CFTypeRef? {
22
22
  var value: CFTypeRef?
23
23
  return AXUIElementCopyAttributeValue(element, key as CFString, &value) == .success ? value : nil
24
24
  }
25
- func childCount(_ element: AXUIElement) -> Int {
25
+ func childCount(_ element: AXUIElement) -> ChildCount {
26
26
  var count = 0
27
- return AXUIElementGetAttributeValueCount(element, kAXChildrenAttribute as CFString, &count) == .success ? count : 0
27
+ let status = AXUIElementGetAttributeValueCount(element, kAXChildrenAttribute as CFString, &count)
28
+ return captureChildCount(status: status.rawValue, success: AXError.success.rawValue, value: count)
28
29
  }
29
- func children(_ element: AXUIElement, limit: Int) -> [AXUIElement] {
30
- var value: CFArray?
31
- let count = min(limit, childCount(element))
32
- if count == 0 { return [] }
33
- return AXUIElementCopyAttributeValues(element, kAXChildrenAttribute as CFString, 0, count, &value) == .success ? value as? [AXUIElement] ?? [] : []
30
+ func children(_ element: AXUIElement, count: Int) -> ChildBatch<AXUIElement> {
31
+ captureChildValues(requestedCount: count) {
32
+ var value: CFArray?
33
+ guard AXUIElementCopyAttributeValues(element, kAXChildrenAttribute as CFString, 0, count, &value) == .success else { return nil }
34
+ return value as? [AXUIElement]
35
+ }
34
36
  }
35
37
  func text(_ element: AXUIElement, _ key: String) -> Any { (attribute(element, key) as? String) ?? NSNull() as Any }
36
38
  func windowBounds(_ element: AXUIElement) -> CGRect? {
@@ -87,7 +89,11 @@ func observe(_ request: Request) async throws -> [String: Any] {
87
89
  var element = root
88
90
  for index in action.path ?? [] {
89
91
  var selectedChild: CFArray?
90
- guard index >= 0 && index < childCount(element),
92
+ let count = childCount(element)
93
+ guard let available = count.value else {
94
+ try fail("element-count-unavailable", "Cannot validate selected accessibility path because child count failed with AXError \(count.error ?? -1)")
95
+ }
96
+ guard index >= 0 && index < available,
91
97
  AXUIElementCopyAttributeValues(element, kAXChildrenAttribute as CFString, index, 1, &selectedChild) == .success,
92
98
  let item = (selectedChild as? [AXUIElement])?.first else { try fail("element-missing", "Selected accessibility path no longer exists") }
93
99
  element = item
@@ -103,21 +109,29 @@ func observe(_ request: Request) async throws -> [String: Any] {
103
109
  }
104
110
  guard outcome == .success else { try fail("action-failed", "Accessibility action failed with AXError \(outcome.rawValue)") }
105
111
  }
106
- var nodes: [[String: Any]] = []; var truncated = false
112
+ var nodes: [[String: Any]] = []; var truncated = false; var gaps: [String] = []
107
113
  if request.accessibility, let root = selected {
108
114
  var pending: [(AXUIElement, [Int])] = [(root, [])]
109
115
  while let (element, path) = pending.popLast() {
110
116
  if nodes.count >= request.max_nodes { truncated = true; break }
111
- let totalChildren = childCount(element)
117
+ let childCountResult = childCount(element)
112
118
  var actions: CFArray?
113
119
  AXUIElementCopyActionNames(element, &actions)
114
- nodes.append(["path": path, "role": text(element, kAXRoleAttribute), "title": text(element, kAXTitleAttribute), "value": text(element, kAXValueAttribute), "actions": actions as? [String] ?? [], "children_count": totalChildren])
120
+ nodes.append(["path": path, "role": text(element, kAXRoleAttribute), "title": text(element, kAXTitleAttribute), "value": text(element, kAXValueAttribute), "actions": actions as? [String] ?? [], "children_count": childCountResult.value.map { $0 as Any } ?? NSNull()])
121
+ guard let totalChildren = childCountResult.value else {
122
+ truncated = true
123
+ gaps.append("AX child count unavailable at path \(path): AXError \(childCountResult.error ?? -1)")
124
+ continue
125
+ }
115
126
  if path.count >= 32 { if totalChildren > 0 { truncated = true }; continue }
116
127
  let available = max(0, request.max_nodes - nodes.count - pending.count)
117
128
  let count = min(available, totalChildren)
118
- let items = children(element, limit: count)
129
+ let batch = children(element, count: count)
130
+ if !batch.complete { truncated = true }
119
131
  if totalChildren > count { truncated = true }
120
- for index in (0..<count).reversed() { pending.append((items[index], path + [index])) }
132
+ for (index, item) in batch.values.enumerated().reversed() {
133
+ pending.append((item, path + [index]))
134
+ }
121
135
  }
122
136
  }
123
137
  var screenshot: Any = NSNull()
@@ -139,18 +153,18 @@ func observe(_ request: Request) async throws -> [String: Any] {
139
153
  }
140
154
  screenshot = ["mime_type": "image/png", "base64": png.base64EncodedString(), "sha256": SHA256.hash(data: png).map({ String(format: "%02x", $0) }).joined(), "width": image.width, "height": image.height]
141
155
  }
142
- return ["window": ["pid": request.pid, "window_id": request.window_id, "executable": request.executable, "launch_time": launch, "title": window[kCGWindowName as String] as? String ?? ""], "nodes": nodes, "truncated": truncated, "screenshot": screenshot, "gaps": request.accessibility ? [] : ["Accessibility capture was disabled"]]
156
+ return ["window": ["pid": request.pid, "window_id": request.window_id, "executable": request.executable, "launch_time": launch, "title": window[kCGWindowName as String] as? String ?? ""], "nodes": nodes, "truncated": truncated, "screenshot": screenshot, "gaps": request.accessibility ? gaps : ["Accessibility capture was disabled"]]
143
157
  }
144
158
  Task { @MainActor in
145
159
  do {
146
160
  let request = try JSONDecoder().decode(Request.self, from: Data(CommandLine.arguments[1].utf8))
147
161
  let result = try await observe(request)
148
- let output = try JSONSerialization.data(withJSONObject: ["ok": true, "result": result], options: [.sortedKeys])
162
+ let output = try serializeHelperOutput(["ok": true, "result": result])
149
163
  FileHandle.standardOutput.write(output)
150
164
  } catch {
151
165
  let failure = error as? BoundaryFailure
152
166
  let output: [String: Any] = ["ok": false, "code": failure?.code ?? "capture-failed", "message": failure?.message ?? error.localizedDescription]
153
- if let data = try? JSONSerialization.data(withJSONObject: output, options: [.sortedKeys]) { FileHandle.standardOutput.write(data) }
167
+ if let data = try? serializeHelperOutput(output) { FileHandle.standardOutput.write(data) }
154
168
  }
155
169
  exit(0)
156
170
  }
@@ -2,7 +2,7 @@ import { constants, createReadStream } from "node:fs";
2
2
  import { chmod, copyFile } from "node:fs/promises";
3
3
  import { createHash } from "node:crypto";
4
4
  import { join } from "node:path";
5
- import { AnalysisInputError } from "../domain/analysisErrorCore.js";
5
+ import { AnalysisInputError, AnalysisCapabilityUnavailableError, } from "../domain/analysisErrorCore.js";
6
6
  /** Stream a local file digest without retaining the APK or JAR in memory. */
7
7
  export const hashAndroidFile = async (path) => {
8
8
  const hash = createHash("sha256");
@@ -26,9 +26,11 @@ export const snapshotAndroidTarget = async (path, sha256, root, operation) => {
26
26
  return snapshot;
27
27
  };
28
28
  /** Fingerprint the actual immutable engine bytes executed for this observation. */
29
- export const snapshotAndroidEngine = async (source, root) => {
29
+ export const snapshotAndroidEngine = async (source, sha256, root, operation) => {
30
30
  const path = join(root, "engine.jar");
31
31
  await copyFile(source, path, constants.COPYFILE_EXCL);
32
32
  await chmod(path, 0o400);
33
- return { path, sha256: await hashAndroidFile(path) };
33
+ if ((await hashAndroidFile(path)) !== sha256)
34
+ throw new AnalysisCapabilityUnavailableError("jadx", operation, "REA_JADX_MCP_JAR bytes changed during admission; retry with a stable engine file.");
35
+ return { path, sha256 };
34
36
  };
@@ -1,6 +1,7 @@
1
- import { androidResultSchemas } from "../domain/androidAnalysis.js";
1
+ import { androidResultSchemas } from "../domain/android/androidAnalysis.js";
2
2
  import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
3
  import { jadxAppSchema, jadxClassPageSchema, jadxClassSchema, jadxLoadSchema, jadxMethodSchema, jadxXrefsSchema, normalizeJadxText, } from "./JadxProtocol.js";
4
+ import { JADX_RELEASE } from "./JadxRelease.js";
4
5
  const methodsOf = (summary) => {
5
6
  const seen = new Map();
6
7
  return summary.methods.map((method) => {
@@ -60,16 +61,17 @@ const inspectPackage = async (tools, loaded, engine) => {
60
61
  };
61
62
  const searchClasses = async (tools, request, loaded, engine) => {
62
63
  const classes = [];
64
+ const pageSize = 4096;
63
65
  let total;
64
66
  do {
65
67
  const page = jadxClassPageSchema.parse(await tools.json("list_classes", {
66
68
  offset: classes.length,
67
- limit: 200,
69
+ limit: pageSize,
68
70
  }));
69
71
  if ((total !== undefined && total !== page.total) ||
70
72
  page.offset !== classes.length ||
71
- page.limit !== 200 ||
72
- page.items.length > 200)
73
+ page.limit !== pageSize ||
74
+ page.items.length > pageSize)
73
75
  throw new AnalysisOutputError(request.operation, "JADX class pagination changed identity or counts");
74
76
  total = page.total;
75
77
  classes.push(...page.items);
@@ -115,7 +117,7 @@ const inspectMethod = async (tools, request, summary, engine) => {
115
117
  if (body.body.startsWith("// ERROR:"))
116
118
  throw new AnalysisOutputError(request.operation, `JADX did not produce method source: ${body.body}`);
117
119
  if (body.mode === "smali" && candidates.length > 1)
118
- throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `JADX 0.7.1 smali fallback joins all same-name overloads for ${summary.full_name}.${request.input.method_name}; it cannot establish source for only overload ${index}.`);
120
+ throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `JADX ${JADX_RELEASE.version} smali fallback joins all same-name overloads for ${summary.full_name}.${request.input.method_name}; it cannot establish source for only overload ${index}.`);
119
121
  return androidResultSchemas.inspect_android_method.parse({
120
122
  engine,
121
123
  class_name: summary.full_name,
@@ -158,7 +160,7 @@ const traceReferences = async (tools, request, summary, engine) => {
158
160
  const methodName = request.input.method_name;
159
161
  const candidates = matchingMethods(summary, request);
160
162
  if (candidates.length > 1)
161
- throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `JADX 0.7.1 references select the first same-name method; ${summary.full_name}.${methodName} has ${candidates.length} overloads. No unambiguous reference result is available.`);
163
+ throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `References require a unique method name; ${summary.full_name}.${methodName} has ${candidates.length} overloads. No unambiguous reference result is available.`);
162
164
  const expectedTarget = methodName === undefined
163
165
  ? summary.full_name
164
166
  : `${summary.full_name}.${methodName}`;
@@ -2,16 +2,17 @@ import { access, realpath, stat } from "node:fs/promises";
2
2
  import { constants } from "node:fs";
3
3
  import { isAbsolute, join } from "node:path";
4
4
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
5
+ import { JADX_JAR_CONFIGURATION_REMEDIATION } from "./JadxRelease.js";
5
6
  /** Admit explicit local tooling without installing or changing host configuration. */
6
7
  export const resolveJadxConfiguration = async (environment, operation) => {
7
8
  const unavailable = (reason) => new AnalysisCapabilityUnavailableError("jadx", operation, reason);
8
9
  if (process.platform !== "linux" && process.platform !== "darwin")
9
- throw unavailable(`Android JADX subprocess ownership is unsupported on ${process.platform}; use Linux or macOS. Only Linux has real-provider verification.`);
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.`);
10
11
  const jar = environment.REA_JADX_MCP_JAR;
11
12
  if (environment.JAVA_HOME !== undefined && !isAbsolute(environment.JAVA_HOME))
12
13
  throw unavailable("JAVA_HOME must select an existing JDK by absolute path; omit it to use java on PATH.");
13
14
  if (jar === undefined || !isAbsolute(jar))
14
- throw unavailable("Set REA_JADX_MCP_JAR to the absolute path of a caller-supplied jadx-headless-mcp 0.7.1 JAR. REA does not download or install it.");
15
+ throw unavailable(JADX_JAR_CONFIGURATION_REMEDIATION);
15
16
  const java = environment.JAVA_HOME === undefined
16
17
  ? "java"
17
18
  : join(environment.JAVA_HOME, "bin", "java");
@@ -37,5 +38,20 @@ export const resolveJadxConfiguration = async (environment, operation) => {
37
38
  throw unavailable(`Cannot execute JAVA_HOME java ${java}: ${cause instanceof Error ? cause.message : String(cause)}`);
38
39
  }
39
40
  }
40
- return { jar: await realpath(jar), java };
41
+ const jvmArguments = [];
42
+ for (const [name, prefix, suffix] of [
43
+ ["REA_JADX_HEAP_MIB", "-Xmx", "m"],
44
+ ["REA_JADX_ACTIVE_PROCESSOR_COUNT", "-XX:ActiveProcessorCount=", ""],
45
+ ]) {
46
+ const value = environment[name];
47
+ if (value === undefined)
48
+ continue;
49
+ if (!/^[1-9]\d*$/u.test(value) || !Number.isSafeInteger(Number(value)))
50
+ throw unavailable(`${name} must be a positive safe integer; received ${value}.`);
51
+ if (name === "REA_JADX_ACTIVE_PROCESSOR_COUNT" &&
52
+ 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}`);
55
+ }
56
+ return { jar: await realpath(jar), java, jvmArguments };
41
57
  };
@@ -4,7 +4,7 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../proces
4
4
  import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
5
5
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
6
6
  const MAX_FRAME_BYTES = 8 * 1024 * 1024;
7
- const MAX_SESSION_BYTES = 32 * 1024 * 1024;
7
+ const MAX_OPERATION_BYTES = 32 * 1024 * 1024;
8
8
  /** SDK-framed stdio with REA-owned process cleanup rather than an unowned child. */
9
9
  export class JadxMcpTransport {
10
10
  options;
@@ -15,7 +15,8 @@ export class JadxMcpTransport {
15
15
  runId = randomUUID();
16
16
  #spawned;
17
17
  #supervisor;
18
- #buffer = Buffer.alloc(0);
18
+ #frameBuffer = Buffer.alloc(0);
19
+ #frameLength = 0;
19
20
  #bytes = 0;
20
21
  #started = false;
21
22
  #closed = false;
@@ -44,8 +45,9 @@ export class JadxMcpTransport {
44
45
  this.#supervisor = new ProviderProcessSupervisor({
45
46
  ...spawned,
46
47
  ownsProcessLifetime: true,
47
- cleanup: spawned.cleanup ?? (() => cleanupOwnedProcessGroup(spawned.ownership)),
48
- });
48
+ cleanup: spawned.cleanup ??
49
+ (() => cleanupOwnedProcessGroup(spawned.ownership)),
50
+ }, { captureStdout: false });
49
51
  if (spawned.process.stdin === undefined ||
50
52
  spawned.process.stdin === null ||
51
53
  spawned.process.stdout === null)
@@ -80,8 +82,15 @@ export class JadxMcpTransport {
80
82
  failureReason() {
81
83
  return this.#failure;
82
84
  }
85
+ /** Scope both the byte budget and diagnostic retention to the next serialized request. */
86
+ beginOperation() {
87
+ this.#bytes = 0;
88
+ this.#supervisor?.resetOutput();
89
+ }
83
90
  async #stop() {
84
91
  this.#closed = true;
92
+ this.#frameBuffer = Buffer.alloc(0);
93
+ this.#frameLength = 0;
85
94
  // A cancellation may race acquisition. Join it before inspecting ownership.
86
95
  await this.#starting?.catch(() => undefined);
87
96
  const process = this.#spawned?.process;
@@ -106,35 +115,53 @@ export class JadxMcpTransport {
106
115
  };
107
116
  #countStderr = (chunk) => {
108
117
  this.#bytes += Buffer.byteLength(chunk);
109
- if (this.#bytes > MAX_SESSION_BYTES)
110
- this.#fail(new Error(`JADX session output exceeds ${MAX_SESSION_BYTES} bytes; no complete result is available`));
118
+ if (this.#bytes > MAX_OPERATION_BYTES)
119
+ this.#fail(new Error(`JADX operation output exceeds ${MAX_OPERATION_BYTES} bytes; no complete result is available`));
111
120
  };
112
121
  #read = (chunk) => {
113
122
  if (this.#closed)
114
123
  return;
115
124
  const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
116
125
  this.#bytes += bytes.length;
117
- if (this.#bytes > MAX_SESSION_BYTES) {
118
- this.#fail(new Error(`JADX session output exceeds ${MAX_SESSION_BYTES} bytes; no complete result is available`));
126
+ if (this.#bytes > MAX_OPERATION_BYTES) {
127
+ this.#fail(new Error(`JADX operation output exceeds ${MAX_OPERATION_BYTES} bytes; no complete result is available`));
119
128
  return;
120
129
  }
121
- this.#buffer = Buffer.concat([this.#buffer, bytes]);
122
130
  try {
123
- let newline;
124
- while ((newline = this.#buffer.indexOf(10)) !== -1) {
125
- if (newline > MAX_FRAME_BYTES)
131
+ let offset = 0;
132
+ while (offset < bytes.length) {
133
+ const newline = bytes.indexOf(10, offset);
134
+ const end = newline === -1 ? bytes.length : newline;
135
+ const fragment = bytes.subarray(offset, end);
136
+ const frameBytes = this.#frameLength + fragment.length;
137
+ if (frameBytes > MAX_FRAME_BYTES)
126
138
  throw new Error(`JADX MCP frame exceeds ${MAX_FRAME_BYTES} bytes`);
127
- const line = this.#buffer.subarray(0, newline).toString("utf8");
128
- this.#buffer = this.#buffer.subarray(newline + 1);
139
+ this.#appendFrame(fragment, frameBytes);
140
+ if (newline === -1)
141
+ return;
142
+ const line = this.#frameBuffer
143
+ .subarray(0, this.#frameLength)
144
+ .toString("utf8");
145
+ this.#frameBuffer = Buffer.alloc(0);
146
+ this.#frameLength = 0;
129
147
  this.onmessage?.(deserializeMessage(line));
148
+ offset = newline + 1;
130
149
  }
131
- if (this.#buffer.length > MAX_FRAME_BYTES)
132
- throw new Error(`JADX MCP frame exceeds ${MAX_FRAME_BYTES} bytes`);
133
150
  }
134
151
  catch (cause) {
135
152
  this.#fail(cause instanceof Error ? cause : new Error(String(cause)));
136
153
  }
137
154
  };
155
+ #appendFrame(fragment, frameBytes) {
156
+ if (frameBytes > this.#frameBuffer.length) {
157
+ const capacity = Math.min(MAX_FRAME_BYTES, Math.max(frameBytes, this.#frameBuffer.length * 2, 1));
158
+ const grown = Buffer.allocUnsafe(capacity);
159
+ this.#frameBuffer.copy(grown, 0, 0, this.#frameLength);
160
+ this.#frameBuffer = grown;
161
+ }
162
+ fragment.copy(this.#frameBuffer, this.#frameLength);
163
+ this.#frameLength = frameBytes;
164
+ }
138
165
  #fail(error) {
139
166
  this.#failure ??= error.message;
140
167
  this.onerror?.(error);
@@ -2,6 +2,14 @@ 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
+ /** Values observed inside the exact JVM producing the analysis. */
6
+ export const jadxRuntimeSchema = z.object({
7
+ engine_reported_version: z.string().min(1),
8
+ max_heap_bytes: z.number().int().positive().safe(),
9
+ available_processors: z.number().int().positive(),
10
+ java_version: z.string().min(1),
11
+ metadata_scope: z.literal("parsed_members"),
12
+ });
5
13
  export const jadxLoadSchema = z.object({
6
14
  state: z.literal("LOADED"),
7
15
  apk_path: z.string(),