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
@@ -1,14 +1,18 @@
1
1
  import { z } from "zod";
2
+ import { chmod, copyFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
2
5
  import { AnalysisError } from "../domain/analysisErrorBase.js";
3
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
6
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisInputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
4
7
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
8
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
6
9
  import { err, ok } from "../domain/result.js";
7
10
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
8
- import { snapshotAndroidEngine, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
11
+ import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
9
12
  import { resolveJadxConfiguration } from "./JadxConfiguration.js";
10
13
  import { JadxSession } from "./JadxSession.js";
11
14
  const OPERATION_TIMEOUT_MS = 120_000;
15
+ const BRIDGE_SOURCE = fileURLToPath(new URL("../../bridge/android/ReaJadxBridge.java", import.meta.url));
12
16
  const waitForTurn = (predecessor, request, signal) => new Promise((resolve, reject) => {
13
17
  const abort = () => reject(new AnalysisCancelledError(request.operation));
14
18
  signal?.addEventListener("abort", abort, { once: true });
@@ -75,44 +79,81 @@ const cleanup = async (session, root, previous) => {
75
79
  }
76
80
  return previous;
77
81
  };
78
- /** One queued engine per REA instance, with a fresh owned workspace for every request. */
82
+ /** One serialized, immutable APK session per REA instance, retired on idle or shutdown. */
79
83
  export class JadxProvider {
80
84
  environment;
81
85
  launcher;
82
86
  #tail = Promise.resolve();
83
87
  #cleanupFailure;
88
+ #retained;
89
+ #idle;
90
+ #shutdown = new AbortController();
91
+ #closePromise;
84
92
  constructor(environment = process.env, launcher) {
85
93
  this.environment = environment;
86
94
  this.launcher = launcher;
87
95
  }
88
96
  /** Serialize expensive work and bind both raw and normalized results to the APK. */
89
97
  async execute(target, request, options) {
98
+ if (this.#shutdown.signal.aborted)
99
+ return err(new AnalysisCancelledError(request.operation));
100
+ const signal = options?.signal === undefined
101
+ ? this.#shutdown.signal
102
+ : AbortSignal.any([options.signal, this.#shutdown.signal]);
90
103
  const predecessor = this.#tail;
91
104
  let release = () => { };
92
105
  this.#tail = new Promise((resolve) => {
93
106
  release = resolve;
94
107
  });
95
108
  try {
96
- await waitForTurn(predecessor, request, options?.signal);
109
+ await waitForTurn(predecessor, request, signal);
97
110
  }
98
111
  catch {
99
112
  void predecessor.then(release);
100
113
  return err(new AnalysisCancelledError(request.operation));
101
114
  }
102
115
  try {
103
- if (options?.signal?.aborted === true)
116
+ if (signal.aborted)
104
117
  return err(new AnalysisCancelledError(request.operation));
105
118
  if (this.#cleanupFailure !== undefined)
106
119
  return err(this.#cleanupFailure);
107
- const outcome = await this.#execute(target, request, options);
120
+ clearTimeout(this.#idle);
121
+ const outcome = await this.#execute(target, request, { signal });
108
122
  if (!outcome.ok && outcome.error.cleanupIncomplete)
109
123
  this.#cleanupFailure = outcome.error;
124
+ if (outcome.ok)
125
+ this.#scheduleIdle();
110
126
  return outcome;
111
127
  }
112
128
  finally {
113
129
  release();
114
130
  }
115
131
  }
132
+ /** Cancel queued/active operations and join the owned engine and workspace cleanup. */
133
+ close() {
134
+ this.#shutdown.abort();
135
+ clearTimeout(this.#idle);
136
+ this.#closePromise ??= this.#tail.then(() => this.#retire());
137
+ return this.#closePromise;
138
+ }
139
+ async #retire() {
140
+ if (this.#cleanupFailure !== undefined)
141
+ throw this.#cleanupFailure;
142
+ const retained = this.#retained;
143
+ this.#retained = undefined;
144
+ const result = await cleanup(retained?.session, retained?.root, ok(undefined));
145
+ if (!result.ok) {
146
+ this.#cleanupFailure = result.error;
147
+ throw result.error;
148
+ }
149
+ }
150
+ #scheduleIdle() {
151
+ this.#idle = setTimeout(() => {
152
+ const retirement = this.#tail.then(() => this.#retire());
153
+ this.#tail = retirement.catch(() => undefined);
154
+ }, 60_000);
155
+ this.#idle.unref();
156
+ }
116
157
  async #execute(target, request, options) {
117
158
  const timeout = AbortSignal.timeout(OPERATION_TIMEOUT_MS);
118
159
  const signal = options?.signal === undefined
@@ -126,35 +167,79 @@ export class JadxProvider {
126
167
  throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
127
168
  const configuration = await resolveJadxConfiguration(this.environment, request.operation);
128
169
  signal.throwIfAborted();
129
- root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
130
- const engine = await snapshotAndroidEngine(configuration.jar, root.path);
131
- const snapshot = await snapshotAndroidTarget(target.path, target.sha256, root.path, request.operation);
132
- signal.throwIfAborted();
133
- session = new JadxSession({
134
- command: configuration.java,
135
- arguments: [
136
- "-Xmx512m",
137
- "-XX:ActiveProcessorCount=1",
138
- "-jar",
139
- engine.path,
140
- "--threads",
141
- "1",
142
- "--max-source-bytes",
143
- "1048576",
144
- "--decompile-timeout-ms",
145
- "90000",
170
+ const jarHash = await hashAndroidFile(configuration.jar);
171
+ const bridgeHash = await hashAndroidFile(BRIDGE_SOURCE);
172
+ if ((await hashAndroidFile(target.path)) !== target.sha256)
173
+ throw new AnalysisInputError(request.operation, undefined, [
174
+ {
175
+ path: ["path"],
176
+ reason: "invalid_value",
177
+ message: "APK bytes changed after admission; retry against a stable file.",
178
+ },
179
+ ]);
180
+ const key = JSON.stringify({
181
+ path: target.path,
182
+ sha256: target.sha256,
183
+ jar: configuration.jar,
184
+ jarHash,
185
+ bridgeHash,
186
+ java: configuration.java,
187
+ arguments: configuration.jvmArguments,
188
+ options: [
189
+ this.environment.JAVA_TOOL_OPTIONS,
190
+ this.environment._JAVA_OPTIONS,
191
+ this.environment.JDK_JAVA_OPTIONS,
192
+ this.environment.PATH,
193
+ this.environment.JAVA_HOME,
146
194
  ],
147
- cwd: root.path,
148
- hostEnvironment: this.environment,
149
- env: { _JAVA_OPTIONS: "-Xmx512m -XX:ActiveProcessorCount=1" },
150
- }, this.launcher);
195
+ });
196
+ if (this.#retained !== undefined && this.#retained.key !== key)
197
+ await this.#retire();
198
+ let retained = this.#retained;
199
+ if (retained === undefined) {
200
+ root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
201
+ const engine = await snapshotAndroidEngine(configuration.jar, jarHash, root.path, request.operation);
202
+ const snapshot = await snapshotAndroidTarget(target.path, target.sha256, root.path, request.operation);
203
+ const bridge = join(root.path, "ReaJadxBridge.java");
204
+ await copyFile(BRIDGE_SOURCE, bridge);
205
+ await chmod(bridge, 0o400);
206
+ if ((await hashAndroidFile(bridge)) !== bridgeHash)
207
+ throw new AnalysisCapabilityUnavailableError("jadx", request.operation, "REA Android bridge bytes changed during admission; retry with a stable installation.");
208
+ signal.throwIfAborted();
209
+ session = new JadxSession({
210
+ command: configuration.java,
211
+ arguments: [
212
+ ...configuration.jvmArguments,
213
+ "--class-path",
214
+ engine.path,
215
+ bridge,
216
+ ],
217
+ cwd: root.path,
218
+ hostEnvironment: this.environment,
219
+ }, this.launcher);
220
+ retained = {
221
+ key,
222
+ root,
223
+ session,
224
+ snapshot,
225
+ jarHash: engine.sha256,
226
+ bridgeHash,
227
+ };
228
+ }
229
+ root = retained.root;
230
+ session = retained.session;
231
+ const { snapshot } = retained;
151
232
  outcome = ok(await session.execute({
152
233
  request,
153
234
  target,
154
235
  snapshot,
155
- jarHash: engine.sha256,
236
+ jarHash: retained.jarHash,
237
+ bridgeHash: retained.bridgeHash,
156
238
  signal,
157
239
  }));
240
+ signal.throwIfAborted();
241
+ this.#retained = retained;
242
+ return outcome;
158
243
  }
159
244
  catch (cause) {
160
245
  outcome = err(executionError({
@@ -165,6 +250,10 @@ export class JadxProvider {
165
250
  session,
166
251
  }));
167
252
  }
253
+ // An existing session also needs retirement when admission fails before selection.
254
+ root ??= this.#retained?.root;
255
+ session ??= this.#retained?.session;
256
+ this.#retained = undefined;
168
257
  return cleanup(session, root, outcome);
169
258
  }
170
259
  }
@@ -5,6 +5,13 @@ export const JADX_RELEASE = Object.freeze({
5
5
  sha256: "6e5eacf500b64292bfb73c49797c1958f6ee44646e43e868039ae7feb573ff75",
6
6
  url: "https://github.com/1013503897/jadx-headless-mcp/releases/download/v0.7.1/jadx-headless-mcp-0.7.1-all.jar",
7
7
  });
8
+ /** Identity of REA's metadata bridge, distinct from the producing engine. */
9
+ export const JADX_BRIDGE_IDENTITY = Object.freeze({
10
+ name: "rea-jadx-bridge",
11
+ version: "1",
12
+ });
13
+ /** Remediation when `REA_JADX_MCP_JAR` is missing or not an absolute path. */
14
+ export const JADX_JAR_CONFIGURATION_REMEDIATION = `Set REA_JADX_MCP_JAR to the absolute path of a caller-supplied jadx-headless-mcp ${JADX_RELEASE.version} JAR. REA does not download or install it.`;
8
15
  /** Producing engine identity used by Evidence and the generated product catalog. */
9
16
  export const JADX_PROVIDER_IDENTITY = Object.freeze({
10
17
  id: "jadx",
@@ -15,5 +22,6 @@ export const JADX_PROVIDER_IDENTITY = Object.freeze({
15
22
  export const JADX_LIMITATIONS = [
16
23
  "Static decompiler observations do not establish runtime behavior; the APK is never executed.",
17
24
  "Method signatures use provider display types; exact DEX descriptors and instruction offsets are unavailable. Overload indices are local to this engine and artifact.",
25
+ "Class inventories use parsed metadata before code generation, including synthetic members that may be omitted from decompiled source. Source positions remain unknown.",
18
26
  "Manifest summary fields are extracted by the upstream engine; decoded XML is retained for verification. APK signatures, split APKs, native libraries and Android runtime capture are not verified by this provider.",
19
27
  ];
@@ -5,13 +5,13 @@ 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, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
9
- import { JADX_RELEASE, JADX_PROVIDER_IDENTITY, JADX_LIMITATIONS, } from "./JadxRelease.js";
8
+ import { jadxLoadSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
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
- #raw = [];
14
+ #loaded;
15
15
  constructor(options, launcher) {
16
16
  this.transport = new JadxMcpTransport(options, launcher);
17
17
  }
@@ -24,30 +24,44 @@ export class JadxSession {
24
24
  signal.addEventListener("abort", abort, { once: true });
25
25
  try {
26
26
  signal.throwIfAborted();
27
- await this.#client.connect(this.transport, { timeout: 30_000 });
27
+ this.transport.beginOperation();
28
+ const raw = [];
29
+ if (this.#loaded === undefined)
30
+ await this.#client.connect(this.transport, { timeout: 30_000 });
28
31
  const server = this.#client.getServerVersion();
29
- if (server?.name !== "jadx-headless-mcp" ||
30
- server.version !== JADX_RELEASE.version)
31
- throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected jadx-headless-mcp ${JADX_RELEASE.version}; server reported ${server?.name ?? "unknown"} ${server?.version ?? "unknown"}.`);
32
- const tools = this.#tools(request, target, signal);
33
- const loaded = jadxLoadSchema.parse(await tools.json("load_apk", {
34
- path: snapshot,
35
- threads: 1,
36
- resources: "full",
37
- }));
32
+ if (server?.name !== JADX_BRIDGE_IDENTITY.name ||
33
+ server.version !== JADX_BRIDGE_IDENTITY.version)
34
+ throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected ${JADX_BRIDGE_IDENTITY.name} ${JADX_BRIDGE_IDENTITY.version}; server reported ${server?.name ?? "unknown"} ${server?.version ?? "unknown"}.`);
35
+ const tools = this.#tools(request, target, signal, raw);
36
+ const runtime = jadxRuntimeSchema.parse(await tools.json("rea_jvm_status", {}));
37
+ if (runtime.engine_reported_version !== JADX_RELEASE.version)
38
+ throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected engine ${JADX_RELEASE.version}; JAR reported ${runtime.engine_reported_version}.`);
39
+ const loaded = this.#loaded ??
40
+ jadxLoadSchema.parse(await tools.json("load_apk", {
41
+ path: snapshot,
42
+ threads: 1,
43
+ resources: "full",
44
+ }));
38
45
  if (loaded.apk_path !== snapshot)
39
46
  throw new AnalysisOutputError(request.operation, "JADX loaded a different APK path than the admitted snapshot");
47
+ this.#loaded = loaded;
40
48
  const engine = {
41
49
  name: "jadx-headless-mcp",
42
- version: "0.7.1",
50
+ version: runtime.engine_reported_version,
43
51
  artifact_sha256: jarHash,
44
52
  source_revision: jarHash === JADX_RELEASE.sha256 ? JADX_RELEASE.revision : null,
45
53
  worker_count: 1,
46
- heap_limit_mib: 512,
54
+ heap_limit_mib: Math.floor(runtime.max_heap_bytes / (1024 * 1024)) || null,
47
55
  };
48
56
  const result = await analyzeJadxRequest(tools, request, loaded, engine);
49
57
  return createAnalysisExecution(result, JADX_PROVIDER_IDENTITY, {
50
- rawResult: { server, jar_sha256: jarHash, calls: this.#raw },
58
+ rawResult: {
59
+ server,
60
+ bridge_sha256: context.bridgeHash,
61
+ jar_sha256: jarHash,
62
+ loaded,
63
+ calls: raw,
64
+ },
51
65
  subject: target,
52
66
  limitations: JADX_LIMITATIONS,
53
67
  locations: request.operation === "inspect_android_package"
@@ -68,12 +82,12 @@ export class JadxSession {
68
82
  await this.transport.close();
69
83
  }
70
84
  }
71
- #tools(request, target, signal) {
85
+ #tools(request, target, signal, raw) {
72
86
  const call = async (name, input) => {
73
87
  signal.throwIfAborted();
74
88
  const response = await this.#client.callTool({ name, arguments: input }, { timeout: 120_000, signal });
75
89
  const envelope = parseJadxEnvelope(response, request.operation);
76
- this.#raw.push({
90
+ raw.push({
77
91
  operation: name,
78
92
  input,
79
93
  response: jsonValueSchema.parse(response),
@@ -0,0 +1,141 @@
1
+ import { execFile } from "node:child_process";
2
+ import { lstat, readdir, readFile, realpath, stat } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { z } from "zod";
6
+ import { BinaryTargetError } from "../domain/configurationErrors.js";
7
+ import { isPathWithinRoot } from "../domain/localPath.js";
8
+ import { parseXmlPropertyList } from "../domain/propertyListKeys.js";
9
+ import { err, ok } from "../domain/result.js";
10
+ const execFileAsync = promisify(execFile);
11
+ const BUNDLE_LAYOUTS = [
12
+ // macOS bundles keep both under Contents.
13
+ {
14
+ plist: ["Contents", "Info.plist"],
15
+ programs: ["Contents", "MacOS"],
16
+ programsLabel: "Contents/MacOS",
17
+ },
18
+ // iOS-style bundles, as extracted from an IPA, keep both at the root.
19
+ { plist: ["Info.plist"], programs: [], programsLabel: "the bundle root" },
20
+ ];
21
+ /**
22
+ * Resolve an app bundle directory to its declared program file. macOS and
23
+ * flat iOS-style layouts are read directly. An iOS app installed on a Mac is
24
+ * a wrapper whose `Wrapper` directory holds the iOS bundle; that bundle is
25
+ * found by listing `Wrapper`, never by following the `WrappedBundle` link.
26
+ */
27
+ export const resolveAppBundleExecutable = async (path) => {
28
+ const layout = await presentLayout(path);
29
+ if (layout !== undefined)
30
+ return resolveLayoutExecutable(path, layout);
31
+ const wrapped = await wrappedBundle(path);
32
+ if (wrapped !== undefined) {
33
+ const wrappedLayout = await presentLayout(wrapped);
34
+ if (wrappedLayout !== undefined)
35
+ return resolveLayoutExecutable(wrapped, wrappedLayout);
36
+ }
37
+ return err(new BinaryTargetError(path, "app has no readable CFBundleExecutable", {
38
+ cause: new Error("No Contents/Info.plist, root Info.plist, or single Wrapper/*.app bundle was found"),
39
+ }));
40
+ };
41
+ const presentLayout = async (bundle) => {
42
+ for (const layout of BUNDLE_LAYOUTS)
43
+ if (await layoutPlistPresent(join(bundle, ...layout.plist)))
44
+ return layout;
45
+ return undefined;
46
+ };
47
+ /**
48
+ * Whether a layout's Info.plist exists. Readable symlinks count, as they did
49
+ * when the plist was read directly; any failure other than absence, such as
50
+ * a permission denial, is left for the caller to report.
51
+ */
52
+ const layoutPlistPresent = async (path) => {
53
+ try {
54
+ return (await stat(path)).isFile();
55
+ }
56
+ catch (cause) {
57
+ if (isAbsence(cause))
58
+ return false;
59
+ throw cause;
60
+ }
61
+ };
62
+ const isAbsence = (cause) => {
63
+ const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
64
+ return code === "ENOENT" || code === "ENOTDIR";
65
+ };
66
+ /** The single real `.app` directory inside an iOS-on-Mac `Wrapper`. */
67
+ const wrappedBundle = async (bundle) => {
68
+ const wrapper = join(bundle, "Wrapper");
69
+ try {
70
+ if (!(await lstat(wrapper)).isDirectory())
71
+ return undefined;
72
+ }
73
+ catch (cause) {
74
+ if (isAbsence(cause))
75
+ return undefined;
76
+ throw cause;
77
+ }
78
+ const apps = (await readdir(wrapper, { withFileTypes: true })).filter((entry) => entry.isDirectory() && entry.name.toLowerCase().endsWith(".app"));
79
+ const [app] = apps;
80
+ return apps.length === 1 && app !== undefined
81
+ ? join(wrapper, app.name)
82
+ : undefined;
83
+ };
84
+ const resolveLayoutExecutable = async (bundle, layout) => {
85
+ const plistPath = join(bundle, ...layout.plist);
86
+ let name;
87
+ try {
88
+ const plist = await readFile(plistPath);
89
+ name =
90
+ plist.subarray(0, 6).toString("ascii") === "bplist"
91
+ ? await readBinaryPlistExecutable(plistPath)
92
+ : parseXmlPlistExecutable(plist.toString("utf8"));
93
+ }
94
+ catch (cause) {
95
+ return err(new BinaryTargetError(bundle, "app has no readable CFBundleExecutable", {
96
+ cause,
97
+ }));
98
+ }
99
+ if (!isSafeExecutableName(name))
100
+ return err(new BinaryTargetError(bundle, "app has an unsafe CFBundleExecutable"));
101
+ const programs = join(bundle, ...layout.programs);
102
+ const executable = join(programs, name);
103
+ try {
104
+ const [canonicalPrograms, canonicalExecutable] = await Promise.all([
105
+ realpath(programs),
106
+ realpath(executable),
107
+ ]);
108
+ if (!isPathWithinRoot(canonicalPrograms, canonicalExecutable))
109
+ return err(new BinaryTargetError(bundle, `app program file leaves ${layout.programsLabel}`));
110
+ return ok({ executable: canonicalExecutable, infoPlist: plistPath });
111
+ }
112
+ catch (cause) {
113
+ return err(new BinaryTargetError(bundle, "app program file is missing", { cause }));
114
+ }
115
+ };
116
+ /** Decode the top-level executable name with an XML parser, not a pattern. */
117
+ const parseXmlPlistExecutable = (plist) => {
118
+ // An unrelated `__proto__` entry must not make the bundle unreadable.
119
+ const { value } = parseXmlPropertyList(plist);
120
+ const executable = executableEntrySchema.safeParse(value);
121
+ if (!executable.success)
122
+ throw new Error("CFBundleExecutable is missing");
123
+ return executable.data.CFBundleExecutable;
124
+ };
125
+ const executableEntrySchema = z.looseObject({ CFBundleExecutable: z.string() });
126
+ const readBinaryPlistExecutable = async (plistPath) =>
127
+ // `-n` strips only the newline plutil appends; it requires macOS 12+.
128
+ (await execFileAsync("/usr/bin/plutil", [
129
+ "-extract",
130
+ "CFBundleExecutable",
131
+ "raw",
132
+ "-n",
133
+ "-o",
134
+ "-",
135
+ plistPath,
136
+ ])).stdout;
137
+ const isSafeExecutableName = (name) => name.length > 0 &&
138
+ name !== "." &&
139
+ name !== ".." &&
140
+ !name.includes("\0") &&
141
+ !/[/\\]/u.test(name);
@@ -1,6 +1,6 @@
1
1
  import { open } from "node:fs/promises";
2
2
  import { classifyArtifactContent } from "../ArtifactGraphConstruction.js";
3
- import { ARTIFACT_CLASSIFICATION_PREFIX_BYTES } from "./hash.js";
3
+ import { ARTIFACT_CLASSIFICATION_PREFIX_BYTES } from "../../artifacts/ArtifactHash.js";
4
4
  import { hasZipSignature, zipPackageFormatForPath, } from "../../domain/zipPackageFormat.js";
5
5
  const classifyContainerExtension = (path) => {
6
6
  const lower = path.toLowerCase();
@@ -5,7 +5,7 @@ import { artifactInventoryResultSchema, } from "../../domain/artifactGraph.js";
5
5
  import { createArtifactEdges, createRootNode, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor, } from "../ArtifactGraphConstruction.js";
6
6
  import { canonicalDigest } from "../../domain/comparisonSemantics.js";
7
7
  import { classifyRoot } from "./classify.js";
8
- import { hashReadable } from "./hash.js";
8
+ import { hashReadable } from "../../artifacts/ArtifactHash.js";
9
9
  import { createReader, inventoryLimitations } from "./reader.js";
10
10
  import { scanReader, } from "./scanReader.js";
11
11
  import { STRICT_INTEGRITY_POLICY, } from "./types.js";
@@ -4,7 +4,7 @@ import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
4
4
  import { AsarArtifactReader } from "../../artifacts/AsarArtifactReader.js";
5
5
  import { classifyArtifactContent, createArtifactNode, createOccurrence, nearestParent, } from "../ArtifactGraphConstruction.js";
6
6
  import { STRICT_INTEGRITY_POLICY, } from "./types.js";
7
- import { hashReadable } from "./hash.js";
7
+ import { hashReadable } from "../../artifacts/ArtifactHash.js";
8
8
  const UNAVAILABLE_UNPACKED_LIMITATION = "ASAR unpacked companion bytes were unavailable; no content hash or child artifact was produced.";
9
9
  const emptyScan = () => ({ nodes: new Map(), occurrences: [], pendingContradictions: [] });
10
10
  export const scanReader = async (reader, signal, integrity = STRICT_INTEGRITY_POLICY) => {
@@ -1,6 +1,6 @@
1
1
  import { realpath } from "node:fs/promises";
2
2
  import { artifactInventoryResultSchema, } from "../domain/artifactGraph.js";
3
- import { abortIfNeeded } from "./ArtifactInventory/hash.js";
3
+ import { abortIfNeeded } from "../artifacts/ArtifactHash.js";
4
4
  import { scanCanonicalArtifactInventory } from "./ArtifactInventory/scanCanonical.js";
5
5
  export { scanCanonicalArtifactInventory } from "./ArtifactInventory/scanCanonical.js";
6
6
  /** Inventory one local artifact and return every graph collection inline. */
@@ -1,17 +1,14 @@
1
1
  import { constants } from "node:fs";
2
2
  import { createHash } from "node:crypto";
3
- import { access, open, readFile, realpath, stat, } from "node:fs/promises";
4
- import { execFile } from "node:child_process";
5
- import { extname, isAbsolute, join, resolve } from "node:path";
6
- import { promisify } from "node:util";
7
- import { isPathWithinRoot } from "../domain/localPath.js";
3
+ import { access, open, realpath, stat, } from "node:fs/promises";
4
+ import { extname, isAbsolute, resolve } from "node:path";
8
5
  import { BinaryTargetError } from "../domain/configurationErrors.js";
9
6
  import { err, ok } from "../domain/result.js";
7
+ import { resolveAppBundleExecutable, } from "./AppBundleExecutable.js";
10
8
  import { validateDosComLength, } from "../domain/dosCom.js";
11
9
  import { mzWindowsHeaderOffset } from "../domain/dosMz.js";
12
10
  import { hasZipSignature, zipPackageFormatForPath, } from "../domain/zipPackageFormat.js";
13
11
  import { parseExecutableHeader, parsePeRecord, } from "../domain/binaryTarget.js";
14
- const execFileAsync = promisify(execFile);
15
12
  /**
16
13
  * Resolve and classify a readable local target before a provider is selected.
17
14
  * FAT Mach-O inputs select only a host-compatible architecture so setup remains
@@ -25,7 +22,8 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
25
22
  const resolved = await resolveAppBundle(canonical);
26
23
  if (!resolved.ok)
27
24
  return err(resolved.error);
28
- const path = resolved.value;
25
+ const { executable: path, infoPlist } = resolved.value;
26
+ const bundle = infoPlist === undefined ? {} : { bundleInfoPlist: infoPlist };
29
27
  const handle = await open(path, "r");
30
28
  try {
31
29
  if (!(await handle.stat()).isFile())
@@ -72,6 +70,7 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
72
70
  return ok({
73
71
  path,
74
72
  sourcePath: process.platform === "win32" ? candidate : canonical,
73
+ ...bundle,
75
74
  sha256: await sha256Handle(handle),
76
75
  kind: "executable",
77
76
  ...detected.value,
@@ -159,67 +158,13 @@ const sha256Handle = async (handle) => {
159
158
  const resolveAppBundle = async (path) => {
160
159
  const metadata = await stat(path);
161
160
  if (!metadata.isDirectory())
162
- return ok(path);
161
+ return ok({ executable: path });
163
162
  if (extname(path).toLowerCase() !== ".app")
164
- return err(new BinaryTargetError(path, "this opening route requires a file or macOS app bundle", {
163
+ return err(new BinaryTargetError(path, "this opening route requires a file or app bundle", {
165
164
  constraint: "directory_requires_file",
166
165
  }));
167
- const plistPath = join(path, "Contents", "Info.plist");
168
- let name;
169
- try {
170
- const plist = await readFile(plistPath);
171
- name =
172
- plist.subarray(0, 6).toString("ascii") === "bplist"
173
- ? await readBinaryPlistExecutable(plistPath)
174
- : parseXmlPlistExecutable(plist.toString("utf8"));
175
- }
176
- catch (cause) {
177
- return err(new BinaryTargetError(path, "app has no readable CFBundleExecutable", {
178
- cause,
179
- }));
180
- }
181
- if (!isSafeExecutableName(name))
182
- return err(new BinaryTargetError(path, "app has an unsafe CFBundleExecutable"));
183
- const programs = join(path, "Contents", "MacOS");
184
- const executable = join(programs, name);
185
- try {
186
- const [canonicalPrograms, canonicalExecutable] = await Promise.all([
187
- realpath(programs),
188
- realpath(executable),
189
- ]);
190
- if (!isPathWithinRoot(canonicalPrograms, canonicalExecutable))
191
- return err(new BinaryTargetError(path, "app program file leaves Contents/MacOS"));
192
- return ok(canonicalExecutable);
193
- }
194
- catch (cause) {
195
- return err(new BinaryTargetError(path, "app program file is missing", { cause }));
196
- }
197
- };
198
- const parseXmlPlistExecutable = (plist) => {
199
- const match = /<key>\s*CFBundleExecutable\s*<\/key>\s*<string>([^<]+)<\/string>/u.exec(plist);
200
- if (match?.[1] === undefined)
201
- throw new Error("CFBundleExecutable is missing");
202
- return decodeXml(match[1].trim());
166
+ return resolveAppBundleExecutable(path);
203
167
  };
204
- const readBinaryPlistExecutable = async (plistPath) => (await execFileAsync("/usr/bin/plutil", [
205
- "-extract",
206
- "CFBundleExecutable",
207
- "raw",
208
- "-o",
209
- "-",
210
- plistPath,
211
- ])).stdout.trim();
212
- const isSafeExecutableName = (name) => name.length > 0 &&
213
- name !== "." &&
214
- name !== ".." &&
215
- !name.includes("\0") &&
216
- !/[/\\]/u.test(name);
217
- const decodeXml = (value) => value
218
- .replaceAll("&amp;", "&")
219
- .replaceAll("&lt;", "<")
220
- .replaceAll("&gt;", ">")
221
- .replaceAll("&quot;", '"')
222
- .replaceAll("&apos;", "'");
223
168
  const readExecutableMetadata = async (handle, hostArchitecture) => {
224
169
  const prefix = Buffer.alloc(4096);
225
170
  const prefixRead = await handle.read(prefix, 0, prefix.length, 0);