rea-agents 6.1.0 → 6.2.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 (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -2,6 +2,8 @@ import { randomBytes, randomUUID } from "node:crypto";
2
2
  import { access } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
+ import writeFileAtomic from "write-file-atomic";
6
+ import { analysisErrorWithCleanupFailure } from "../application/binary/AnalysisClientCleanup.js";
5
7
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
6
8
  import { HopperCancelledError, HopperProcessError, HopperProtocolError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "../domain/hopperErrors.js";
7
9
  import {} from "../domain/analysisErrorBase.js";
@@ -14,7 +16,7 @@ import { ProviderStartupDeadline } from "../process/ProviderDeadline.js";
14
16
  import { ProviderRunLineage } from "../process/ProviderRunLineage.js";
15
17
  import { ProviderProcessSupervisor, } from "../process/ProviderProcess.js";
16
18
  import { hopperOperationStage } from "./HopperOperationStage.js";
17
- import { cleanupHopperSession } from "./HopperCleanup.js";
19
+ import { cleanupHopperSession, } from "./HopperCleanup.js";
18
20
  import { parseHopperServerInfo, } from "./HopperSessionValues.js";
19
21
  import { connectHopperSocketOnce } from "./HopperSocketConnection.js";
20
22
  import { hopperLauncherFailureDiagnostic } from "./HopperProcessDiagnostic.js";
@@ -37,9 +39,12 @@ export class HopperClient {
37
39
  #responses;
38
40
  #logger;
39
41
  #socket;
40
- #launch;
41
- #process;
42
- #runtimeRoot;
42
+ #resources = {
43
+ launch: undefined,
44
+ processSupervisor: undefined,
45
+ runtimeRoot: undefined,
46
+ shutdownConfirmed: false,
47
+ };
43
48
  #token;
44
49
  #lineage = new ProviderRunLineage();
45
50
  #nextId = 1;
@@ -61,7 +66,7 @@ export class HopperClient {
61
66
  #onSocketClose = () => {
62
67
  if (this.#closing)
63
68
  return;
64
- const launch = this.#launch;
69
+ const launch = this.#resources.launch;
65
70
  if (launch?.providerLifetime === "launcher-process" &&
66
71
  this.#launcherExitCode !== undefined)
67
72
  return;
@@ -166,7 +171,7 @@ export class HopperClient {
166
171
  /** Launch the bridge once and complete its authenticated health handshake. */
167
172
  start(signal) {
168
173
  if (this.#closePromise !== undefined) {
169
- return this.#closePromise.then(() => this.start(signal));
174
+ return this.#closePromise.then((closed) => closed.ok ? this.start(signal) : closed);
170
175
  }
171
176
  if (this.#startPromise !== undefined)
172
177
  return this.#startPromise;
@@ -193,19 +198,7 @@ export class HopperClient {
193
198
  void started.then((result) => {
194
199
  release();
195
200
  if (!result.ok) {
196
- if (result.error instanceof HopperProcessError)
197
- this.#rememberProcessFailure(result.error, []);
198
- else if (this.#operationFailure === undefined &&
199
- (result.error instanceof HopperTimeoutError ||
200
- result.error instanceof HopperStartError))
201
- this.#operationFailure = {
202
- state: result.error instanceof HopperTimeoutError
203
- ? "not_started"
204
- : "unknown",
205
- exitCode: null,
206
- startupFailure: true,
207
- requests: [],
208
- };
201
+ this.#rememberStartupFailure(result.error);
209
202
  reset();
210
203
  }
211
204
  }, (cause) => {
@@ -219,9 +212,12 @@ export class HopperClient {
219
212
  if (isAborted(signal))
220
213
  return err(new HopperCancelledError());
221
214
  this.#operationFailure = undefined;
222
- if (this.#socket !== undefined || this.#runtimeRoot !== undefined) {
215
+ if (this.#socket !== undefined ||
216
+ this.#resources.launch !== undefined ||
217
+ this.#resources.runtimeRoot !== undefined) {
223
218
  return err(new HopperProtocolError("Hopper client is already started"));
224
219
  }
220
+ this.#resources.shutdownConfirmed = false;
225
221
  const deadline = new ProviderStartupDeadline(this.#options.startupTimeoutMs, signal);
226
222
  try {
227
223
  return await this.#startWithin(deadline);
@@ -232,7 +228,7 @@ export class HopperClient {
232
228
  }
233
229
  async #startWithin(deadline) {
234
230
  try {
235
- this.#runtimeRoot = await PrivateRuntimeRoot.create({
231
+ this.#resources.runtimeRoot = await PrivateRuntimeRoot.create({
236
232
  parent: SESSION_ROOT,
237
233
  prefix: "rea-",
238
234
  });
@@ -241,10 +237,9 @@ export class HopperClient {
241
237
  return err(new HopperStartError({ cause }));
242
238
  }
243
239
  if (deadline.signal.aborted) {
244
- await this.#cleanup();
245
- return err(startupInterruption(deadline));
240
+ return this.#startupFailure(startupInterruption(deadline));
246
241
  }
247
- const socketPath = join(this.#runtimeRoot.path, "bridge.sock");
242
+ const socketPath = join(this.#resources.runtimeRoot.path, "bridge.sock");
248
243
  this.#token = randomBytes(32).toString("hex");
249
244
  this.#lineage.reset();
250
245
  this.#launcherExitCode = undefined;
@@ -252,47 +247,76 @@ export class HopperClient {
252
247
  const runId = this.#options.runId ?? randomUUID();
253
248
  const launched = await this.#options.launcher
254
249
  .launch({
255
- directory: this.#runtimeRoot.path,
250
+ directory: this.#resources.runtimeRoot.path,
256
251
  socketPath,
257
252
  token: this.#token,
258
253
  runId,
259
254
  }, { signal: deadline.signal })
260
255
  .catch((cause) => err(new HopperStartError({ cause })));
261
256
  if (!launched.ok) {
262
- await this.#cleanup();
263
- return deadline.signal.aborted
264
- ? err(startupInterruption(deadline))
265
- : launched;
257
+ return this.#startupFailure(deadline.signal.aborted
258
+ ? startupInterruption(deadline)
259
+ : launched.error);
266
260
  }
267
- this.#launch = launched.value;
261
+ this.#resources.launch = launched.value;
268
262
  this.#attachLauncher(launched.value);
263
+ const ownership = launched.value.ownership;
264
+ if (ownership !== undefined) {
265
+ try {
266
+ await writeFileAtomic(join(this.#resources.runtimeRoot.path, "ownership.json"), `${JSON.stringify({
267
+ run_id: runId,
268
+ pid: ownership.leaderPid,
269
+ process_group_id: ownership.processGroupId,
270
+ parent_pid: process.pid,
271
+ launcher: launched.value.launcherCommand ?? null,
272
+ created_at: new Date().toISOString(),
273
+ })}\n`, { encoding: "utf8", mode: 0o600 });
274
+ }
275
+ catch (cause) {
276
+ return this.#startupFailure(new HopperStartError({ cause }));
277
+ }
278
+ }
269
279
  const connected = await this.#connect(socketPath, deadline);
270
280
  if (!connected.ok) {
271
- await this.#cleanup();
272
- return connected;
281
+ return this.#startupFailure(connected.error);
273
282
  }
274
283
  const remainingMs = deadline.remainingMs();
275
284
  if (remainingMs <= 0) {
276
- await this.#cleanup();
277
- return err(new HopperTimeoutError(this.#options.startupTimeoutMs));
285
+ return this.#startupFailure(new HopperTimeoutError(this.#options.startupTimeoutMs));
278
286
  }
279
287
  const health = await this.#request("health", {}, {
280
288
  timeoutMs: remainingMs,
281
289
  signal: deadline.signal,
282
290
  });
283
291
  if (!health.ok) {
284
- await this.#cleanup();
285
- return deadline.signal.aborted
286
- ? err(startupInterruption(deadline))
287
- : health;
292
+ return this.#startupFailure(deadline.signal.aborted ? startupInterruption(deadline) : health.error);
288
293
  }
289
294
  const parsed = parseHopperServerInfo(health.value, runId);
290
- if (parsed.ok)
291
- await this.#lineage.observe(this.#launch);
292
- else
293
- await this.#cleanup();
295
+ if (!parsed.ok)
296
+ return this.#startupFailure(parsed.error);
297
+ await this.#lineage.observe(this.#resources.launch);
294
298
  return parsed;
295
299
  }
300
+ async #startupFailure(primary) {
301
+ this.#rememberStartupFailure(primary);
302
+ const closed = await this.#cleanup();
303
+ return err(closed.ok
304
+ ? primary
305
+ : analysisErrorWithCleanupFailure(primary, closed.error, "open_binary"));
306
+ }
307
+ #rememberStartupFailure(failure) {
308
+ if (failure instanceof HopperProcessError)
309
+ this.#rememberProcessFailure(failure, []);
310
+ else if (this.#operationFailure === undefined &&
311
+ (failure instanceof HopperTimeoutError ||
312
+ failure instanceof HopperStartError))
313
+ this.#operationFailure = {
314
+ state: failure instanceof HopperTimeoutError ? "not_started" : "unknown",
315
+ exitCode: null,
316
+ startupFailure: true,
317
+ requests: [],
318
+ };
319
+ }
296
320
  /** Invoke one declared operation, returning timeout and cancellation as values. */
297
321
  async callTool(name, arguments_ = {}, options = {}) {
298
322
  const started = await this.start(options.signal);
@@ -305,12 +329,8 @@ export class HopperClient {
305
329
  ? err(new AnalysisCapabilityUnavailableError("hopper", name, result.error.safeMessage))
306
330
  : result;
307
331
  }
308
- /** Stop the bridge, settle outstanding requests, and remove session artifacts. */
309
- close() {
310
- return this.closeWithOutcome().then(() => undefined);
311
- }
312
332
  /** Stop the bridge and report whether every owned resource was verified clean. */
313
- closeWithOutcome(options = {}) {
333
+ close(options = {}) {
314
334
  const starting = this.#startPromise;
315
335
  const controller = this.#startupController;
316
336
  controller?.abort();
@@ -338,9 +358,7 @@ export class HopperClient {
338
358
  try {
339
359
  return await cleanupHopperSession({
340
360
  socket: this.#socket,
341
- launch: this.#launch,
342
- processSupervisor: this.#process,
343
- runtimeRoot: this.#runtimeRoot,
361
+ resources: this.#resources,
344
362
  activeRequest: this.#requests.activity(),
345
363
  progress: options.progress,
346
364
  logger: this.#logger,
@@ -356,14 +374,16 @@ export class HopperClient {
356
374
  });
357
375
  }
358
376
  finally {
359
- this.#socket = undefined;
360
- this.#process = undefined;
361
- this.#launch = undefined;
362
- this.#runtimeRoot = undefined;
363
- this.#token = undefined;
364
- this.#responses.reset();
365
- this.#launcherExitCode = undefined;
366
- this.#launcherFailureDiagnostic = undefined;
377
+ if (this.#socket?.destroyed === true)
378
+ this.#socket = undefined;
379
+ if (this.#socket === undefined)
380
+ this.#token = undefined;
381
+ if (this.#socket === undefined)
382
+ this.#responses.reset();
383
+ if (this.#resources.processSupervisor === undefined) {
384
+ this.#launcherExitCode = undefined;
385
+ this.#launcherFailureDiagnostic = undefined;
386
+ }
367
387
  this.#closing = false;
368
388
  }
369
389
  }
@@ -374,10 +394,10 @@ export class HopperClient {
374
394
  if (this.#closing)
375
395
  return err(new HopperProcessError(null));
376
396
  if (this.#launcherExitCode !== undefined &&
377
- this.#launch !== undefined &&
378
- (this.#launch.providerLifetime === "launcher-process" ||
397
+ this.#resources.launch !== undefined &&
398
+ (this.#resources.launch.providerLifetime === "launcher-process" ||
379
399
  this.#launcherExitCode !== 0)) {
380
- const failure = await this.#launcherStartupFailure(this.#launch.providerLifetime === "launcher-process", this.#launcherExitCode, deadline);
400
+ const failure = await this.#launcherStartupFailure(this.#resources.launch.providerLifetime === "launcher-process", this.#launcherExitCode, deadline);
381
401
  return deadline.interruption === "cancelled"
382
402
  ? err(await this.#startupInterruption(deadline))
383
403
  : err(failure);
@@ -406,10 +426,11 @@ export class HopperClient {
406
426
  async #startupInterruption(deadline) {
407
427
  if (deadline.interruption === "cancelled")
408
428
  return new HopperCancelledError();
409
- return new HopperTimeoutError(deadline.timeoutMs, undefined, undefined, "not_started", "launch", this.#launcherOutcome((await this.#process?.waitForOutputClose(0)) ?? false));
429
+ return new HopperTimeoutError(deadline.timeoutMs, undefined, undefined, "not_started", "launch", this.#launcherOutcome((await this.#resources.processSupervisor?.waitForOutputClose(0)) ??
430
+ false));
410
431
  }
411
432
  #launcherOutcome(outputClosed) {
412
- const snapshot = this.#process?.snapshot();
433
+ const snapshot = this.#resources.processSupervisor?.snapshot();
413
434
  const token = this.#token;
414
435
  if (snapshot === undefined)
415
436
  return undefined;
@@ -426,7 +447,7 @@ export class HopperClient {
426
447
  };
427
448
  }
428
449
  async #launcherStartupFailure(ownsProviderLifetime, exitCode, deadline) {
429
- const process = this.#process;
450
+ const process = this.#resources.processSupervisor;
430
451
  // Descendants may inherit the helper's pipes. Bound drainage independently
431
452
  // from readiness, and report whether producer output actually closed.
432
453
  const outputClosed = (await process?.waitForOutputClose(Math.min(1_000, deadline.remainingMs()))) ?? false;
@@ -502,7 +523,7 @@ export class HopperClient {
502
523
  socket.off("close", this.#onSocketClose);
503
524
  }
504
525
  #attachLauncher(launch) {
505
- this.#process = new ProviderProcessSupervisor(launch, {
526
+ this.#resources.processSupervisor = new ProviderProcessSupervisor(launch, {
506
527
  onDiagnostic: (event) => this.#onLauncherDiagnostic(launch, event),
507
528
  });
508
529
  }
@@ -18,7 +18,7 @@ export const hopperMachOImageSchema = z.strictObject({
18
18
  });
19
19
  /** Validate the selected FAT64 slice without depending on Apple's lipo tool. */
20
20
  export const resolveHopperMachOImage = async (target, signal) => {
21
- const invalid = (reason) => err(new BinaryTargetError(target.path, reason));
21
+ const invalid = (reason, cause) => err(new BinaryTargetError(target.path, reason, cause === undefined ? undefined : { cause }));
22
22
  if (signal?.aborted)
23
23
  return err(new AnalysisCancelledError("open_binary"));
24
24
  let file;
@@ -26,7 +26,8 @@ export const resolveHopperMachOImage = async (target, signal) => {
26
26
  file = await open(target.path, "r");
27
27
  }
28
28
  catch (cause) {
29
- return invalid(`Cannot read FAT64 source for Hopper image preparation: ${cause instanceof Error ? cause.message : String(cause)}`);
29
+ // Keep the OS error so a read-permission denial reports access_denied.
30
+ return invalid(`Cannot read FAT64 source for Hopper image preparation: ${cause instanceof Error ? cause.message : String(cause)}`, cause);
30
31
  }
31
32
  try {
32
33
  const read = async (offset, length) => {
@@ -1,8 +1,9 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { fileURLToPath } from "node:url";
2
3
  import { accessSync, constants } from "node:fs";
3
4
  import { createAnalysisExecution } from "../application/AnalysisProvider.js";
4
5
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
5
- import { err } from "../domain/result.js";
6
+ import { err, ok } from "../domain/result.js";
6
7
  import { HopperApplicationLauncher } from "./BridgeLauncher.js";
7
8
  import { hopperLoaderArgsForTarget, resolveHopperAnalysisProfile, } from "./HopperAnalysisProfile.js";
8
9
  import { mapHopperFileOffset } from "./HopperFileOffset.js";
@@ -10,26 +11,26 @@ import { HopperRegexSearch } from "./HopperRegexSearch.js";
10
11
  import { HopperClient } from "./HopperClient.js";
11
12
  import { hopperMachOImageSchema } from "./HopperMachOImage.js";
12
13
  import { CAPABILITIES, HOPPER_PROVIDER_IDENTITY, } from "./HopperProviderCapabilities.js";
13
- export { HOPPER_PROVIDER_IDENTITY, HOPPER_OPERATIONS, } from "./HopperProviderCapabilities.js";
14
- const IDENTITY = HOPPER_PROVIDER_IDENTITY;
15
14
  /** Concrete analysis provider backed by REA's private Hopper bridge. */
16
15
  export class HopperProvider {
17
16
  config;
18
17
  logger;
19
18
  platform;
19
+ environment;
20
20
  /**
21
21
  * Host platform, injected so availability and launch-mode decisions can be
22
22
  * exercised for any host rather than only the machine running the suite.
23
23
  * Mirrors `GhidraProvider`, which already threads its installation host's
24
24
  * platform the same way.
25
25
  */
26
- constructor(config, logger, platform = process.platform) {
26
+ constructor(config, logger, environment, platform = process.platform) {
27
27
  this.config = config;
28
28
  this.logger = logger;
29
29
  this.platform = platform;
30
+ this.environment = snapshotEnvironment(environment, platform);
30
31
  }
31
32
  identity() {
32
- return IDENTITY;
33
+ return HOPPER_PROVIDER_IDENTITY;
33
34
  }
34
35
  capabilities() {
35
36
  return CAPABILITIES;
@@ -104,15 +105,15 @@ export class HopperProvider {
104
105
  return resolveHopperAnalysisProfile(target, {
105
106
  launcherPath: this.config.hopperLauncherPath,
106
107
  loaderArgsOverride: this.config.hopperLoaderArgs,
107
- provider: IDENTITY,
108
+ provider: HOPPER_PROVIDER_IDENTITY,
108
109
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
109
110
  });
110
111
  }
111
112
  createClient(target, profile, context) {
112
113
  if (target.kind !== "executable" && target.kind !== "database")
113
114
  return {
114
- execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `Hopper cannot open ${target.kind} targets directly. Inventory or extract the artifact first.`))),
115
- close: () => Promise.resolve(),
115
+ execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(HOPPER_PROVIDER_IDENTITY.id, operation, `Hopper cannot open ${target.kind} targets directly. Inventory or extract the artifact first.`))),
116
+ close: () => Promise.resolve(ok(null)),
116
117
  };
117
118
  const preparation = profile?.parameters.prepared_image;
118
119
  const parsedImage = preparation === undefined
@@ -120,8 +121,8 @@ export class HopperProvider {
120
121
  : hopperMachOImageSchema.safeParse(preparation);
121
122
  if (parsedImage?.success === false)
122
123
  return {
123
- execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Hopper prepared-image profile is malformed; resolve the analysis profile again."))),
124
- close: () => Promise.resolve(),
124
+ execute: (operation) => Promise.resolve(err(new AnalysisCapabilityUnavailableError(HOPPER_PROVIDER_IDENTITY.id, operation, "Hopper prepared-image profile is malformed; resolve the analysis profile again."))),
125
+ close: () => Promise.resolve(ok(null)),
125
126
  };
126
127
  const preparedImage = parsedImage?.data;
127
128
  const container = preparedImage === undefined
@@ -133,11 +134,12 @@ export class HopperProvider {
133
134
  if (!derivedLoaderArgs.ok)
134
135
  return {
135
136
  execute: () => Promise.resolve(err(derivedLoaderArgs.error)),
136
- close: () => Promise.resolve(),
137
+ close: () => Promise.resolve(ok(null)),
137
138
  };
138
- const executionProvider = profile?.provider ?? IDENTITY;
139
+ const executionProvider = profile?.provider ?? HOPPER_PROVIDER_IDENTITY;
139
140
  const client = new HopperClient({
140
141
  launcher: new HopperApplicationLauncher({
142
+ environment: this.environment,
141
143
  launcherPath: this.config.hopperLauncherPath,
142
144
  targetPath: target.path,
143
145
  targetKind: target.kind,
@@ -229,13 +231,9 @@ export class HopperProvider {
229
231
  ];
230
232
  },
231
233
  operationHealthSnapshot: () => client.operationHealth(),
232
- closeWithOutcome: async (options) => {
234
+ close: async (options) => {
233
235
  await regexSearch.close();
234
- return client.closeWithOutcome(options);
235
- },
236
- close: async () => {
237
- await regexSearch.close();
238
- await client.close();
236
+ return client.close(options);
239
237
  },
240
238
  };
241
239
  }
@@ -9,11 +9,6 @@ const MATCHING_DEADLINE_MS = 5_000;
9
9
  const inputSchema = z.strictObject({
10
10
  ...analysisSearchInput,
11
11
  mode: z.literal("regex"),
12
- document: z.string().nullish(),
13
- case_sensitive: z
14
- .boolean()
15
- .nullish()
16
- .transform((value) => value ?? false),
17
12
  });
18
13
  const replySchema = z.discriminatedUnion("status", [
19
14
  z.strictObject({
@@ -68,7 +63,9 @@ export class HopperRegexSearch {
68
63
  },
69
64
  }),
70
65
  };
71
- const inventory = await this.client.callTool(operation === "search_strings" ? "list_strings" : "list_procedures", input.data.document == null ? {} : { document: input.data.document }, inventoryOptions);
66
+ const inventory = await this.client.callTool(operation === "search_strings" ? "list_strings" : "list_procedures", input.data.document === undefined
67
+ ? {}
68
+ : { document: input.data.document }, inventoryOptions);
72
69
  if (!inventory.ok)
73
70
  return inventory;
74
71
  const parsed = z.array(analysisStringSchema).safeParse(inventory.value);