rea-agents 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,15 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
- import { chmod, lstat, mkdir, realpath, rm } from "node:fs/promises";
2
+ import { chmod, lstat, mkdir, realpath, rm, rmdir } from "node:fs/promises";
3
3
  import { createConnection, createServer, } from "node:net";
4
4
  import { join, resolve } from "node:path";
5
5
  import { HopperStartError } from "../domain/hopperErrors.js";
6
6
  import { safeParseJson } from "../domain/safeJson.js";
7
- /** Shared private parent of per-target lease sockets; it outlives individual sessions. */
7
+ /** Shared private parent of Hopper lease sockets; it outlives individual sessions. */
8
8
  export const HOPPER_TARGET_LEASE_DIRECTORY = join("/tmp", `rea-hopper-${process.getuid?.() ?? 0}`);
9
9
  /** Keep two REA processes from opening duplicate Hopper documents for one target/profile. */
10
10
  export const acquireHopperTargetLease = async (input) => {
11
- const directory = input.directory ?? HOPPER_TARGET_LEASE_DIRECTORY;
12
- await ensureLeaseDirectory(directory);
13
11
  // The canonical path only derives the lease key; it never authorizes access.
14
12
  // Common expected `realpath` failures include a missing target or path
15
13
  // component (ENOENT, ENOTDIR), an unreadable component (EACCES), or a
@@ -18,43 +16,105 @@ export const acquireHopperTargetLease = async (input) => {
18
16
  // still yields a deterministic key, but aliases may take separate leases
19
17
  // whenever `realpath` cannot resolve them.
20
18
  const targetPath = await realpath(input.targetPath).catch(() => resolve(input.targetPath));
19
+ return acquireLease({
20
+ ...input,
21
+ identity: {
22
+ targetPath,
23
+ targetKind: input.targetKind,
24
+ loaderArgs: input.loaderArgs,
25
+ },
26
+ });
27
+ };
28
+ /** Reserve the Linux demo's singleton application before it can forward a target to another owner. */
29
+ export const acquireLinuxHopperApplicationLease = (input) => acquireLease({ ...input, identity: { application: "linux-hopper-demo" } });
30
+ const acquireLease = async (input) => {
31
+ const directory = input.directory ?? HOPPER_TARGET_LEASE_DIRECTORY;
32
+ await ensureLeaseDirectory(directory);
21
33
  const key = createHash("sha256")
22
- .update(JSON.stringify({
23
- targetPath,
24
- targetKind: input.targetKind,
25
- loaderArgs: input.loaderArgs,
26
- }))
34
+ .update(JSON.stringify(input.identity))
27
35
  .digest("hex")
28
36
  .slice(0, 32);
29
37
  const socketPath = join(directory, `${key}.sock`);
30
38
  const owner = { runId: input.runId, processId: process.pid };
31
- for (let attempt = 0; attempt < 2; attempt += 1) {
32
- const server = createServer((socket) => sendOwner(socket, owner));
33
- const bound = await bind(server, socketPath);
34
- if (bound) {
35
- await chmod(socketPath, 0o600);
36
- let released = false;
37
- return {
38
- acquired: true,
39
- lease: {
40
- release: async () => {
41
- if (released)
42
- return;
43
- released = true;
44
- await closeServer(server);
45
- await rm(socketPath, { force: true });
46
- },
47
- },
48
- };
39
+ const acquisition = await tryAcquireLease(socketPath, owner);
40
+ if (typeof acquisition !== "string")
41
+ return acquisition;
42
+ // Serialize stale cleanup through the replacement bind: otherwise two
43
+ // recoverers can unlink the socket that one of them has just acquired.
44
+ const recoveryPath = `${socketPath}.recovery`;
45
+ await reserveRecovery(recoveryPath);
46
+ let recovered;
47
+ try {
48
+ recovered = await tryAcquireLease(socketPath, owner);
49
+ if (recovered === "stale")
50
+ await rm(socketPath, { force: true });
51
+ if (typeof recovered === "string")
52
+ recovered = await tryAcquireLease(socketPath, owner);
53
+ if (typeof recovered !== "string")
54
+ return recovered;
55
+ throw new HopperStartError({
56
+ userMessage: "REA could not reserve Hopper for this request. Close competing REA sessions and retry.",
57
+ });
58
+ }
59
+ finally {
60
+ try {
61
+ await rmdir(recoveryPath);
62
+ }
63
+ catch (cause) {
64
+ if (typeof recovered !== "string" && recovered?.acquired)
65
+ await recovered.lease.release();
66
+ throw new HopperStartError({
67
+ cause,
68
+ userMessage: `REA could not remove its Hopper recovery directory at ${JSON.stringify(recoveryPath)}. Check this directory's write access before retrying.`,
69
+ });
49
70
  }
71
+ }
72
+ };
73
+ const reserveRecovery = async (recoveryPath) => {
74
+ try {
75
+ await mkdir(recoveryPath, { mode: 0o700 });
76
+ }
77
+ catch (cause) {
78
+ const busy = typeof cause === "object" &&
79
+ cause !== null &&
80
+ Reflect.get(cause, "code") === "EEXIST";
81
+ throw new HopperStartError({
82
+ cause,
83
+ userMessage: busy
84
+ ? `REA could not reserve Hopper lease recovery at ${JSON.stringify(recoveryPath)}; the existing socket was left unchanged. Retry after concurrent startup finishes. If recovery was interrupted, stop REA sessions and remove this recovery directory before retrying.`
85
+ : `REA could not create its Hopper recovery directory at ${JSON.stringify(recoveryPath)}; the existing socket was left unchanged. Check the parent directory's write access before retrying.`,
86
+ });
87
+ }
88
+ };
89
+ const tryAcquireLease = async (socketPath, owner) => {
90
+ const server = createServer((socket) => sendOwner(socket, owner));
91
+ if (!(await bind(server, socketPath))) {
50
92
  const existingOwner = await readOwner(socketPath);
51
- if (existingOwner !== undefined)
52
- return { acquired: false, owner: existingOwner };
53
- await rm(socketPath, { force: true });
93
+ return typeof existingOwner === "string"
94
+ ? existingOwner
95
+ : { acquired: false, owner: existingOwner };
54
96
  }
55
- throw new HopperStartError({
56
- userMessage: "REA could not reserve this Hopper target. Close competing REA sessions and retry.",
57
- });
97
+ try {
98
+ await chmod(socketPath, 0o600);
99
+ }
100
+ catch (cause) {
101
+ await closeServer(server);
102
+ throw cause;
103
+ }
104
+ let released = false;
105
+ return {
106
+ acquired: true,
107
+ lease: {
108
+ release: async () => {
109
+ if (released)
110
+ return;
111
+ // Node removes a bound Unix socket on close. A second unlink here
112
+ // could remove a new owner's socket bound after that close.
113
+ await closeServer(server);
114
+ released = true;
115
+ },
116
+ },
117
+ };
58
118
  };
59
119
  const ensureLeaseDirectory = async (directory) => {
60
120
  let directoryStat;
@@ -96,14 +156,26 @@ const bind = (server, socketPath) => new Promise((resolveBind, reject) => {
96
156
  const sendOwner = (socket, owner) => {
97
157
  socket.end(`${JSON.stringify(owner)}\n`);
98
158
  };
99
- const readOwner = (socketPath) => new Promise((resolveOwner) => {
159
+ const readOwner = (socketPath) => new Promise((resolveOwner, rejectOwner) => {
100
160
  const socket = createConnection(socketPath);
101
161
  let response = "";
102
- const timer = setTimeout(() => {
162
+ let settled = false;
163
+ const fail = (reason, cause) => {
164
+ if (settled)
165
+ return;
166
+ settled = true;
167
+ clearTimeout(timer);
103
168
  socket.destroy();
104
- resolveOwner(undefined);
105
- }, 250);
169
+ rejectOwner(new HopperStartError({
170
+ cause,
171
+ userMessage: `REA could not verify the existing Hopper lease (${reason}); it was left unchanged. Retry when the owning REA session is responsive.`,
172
+ }));
173
+ };
174
+ const timer = setTimeout(() => fail("owner response timed out"), 250);
106
175
  const finish = (owner) => {
176
+ if (settled)
177
+ return;
178
+ settled = true;
107
179
  clearTimeout(timer);
108
180
  socket.destroy();
109
181
  resolveOwner(owner);
@@ -115,23 +187,34 @@ const readOwner = (socketPath) => new Promise((resolveOwner) => {
115
187
  return;
116
188
  const parsed = safeParseJson(response.slice(0, newline));
117
189
  if (!parsed.ok) {
118
- finish(undefined);
190
+ fail("malformed owner response");
119
191
  return;
120
192
  }
121
193
  const value = parsed.value;
122
- if (typeof value === "object" &&
123
- value !== null &&
124
- typeof Reflect.get(value, "runId") === "string" &&
125
- typeof Reflect.get(value, "processId") === "number")
126
- finish({
127
- runId: Reflect.get(value, "runId"),
128
- processId: Reflect.get(value, "processId"),
129
- });
194
+ const runId = typeof value === "object" && value !== null
195
+ ? Reflect.get(value, "runId")
196
+ : undefined;
197
+ const processId = typeof value === "object" && value !== null
198
+ ? Reflect.get(value, "processId")
199
+ : undefined;
200
+ if (typeof runId === "string" &&
201
+ runId.length > 0 &&
202
+ typeof processId === "number" &&
203
+ Number.isSafeInteger(processId) &&
204
+ processId > 0)
205
+ finish({ runId, processId });
206
+ else
207
+ fail("invalid owner identity");
208
+ });
209
+ socket.on("error", (cause) => {
210
+ if (cause.code === "ENOENT")
211
+ finish("missing");
212
+ else if (cause.code === "ECONNREFUSED")
213
+ finish("stale");
130
214
  else
131
- finish(undefined);
215
+ fail(cause.code ?? "owner connection failed", cause);
132
216
  });
133
- socket.on("error", () => finish(undefined));
134
- socket.on("end", () => finish(undefined));
217
+ socket.on("end", () => fail("owner closed without a complete response"));
135
218
  });
136
219
  const closeServer = (server) => new Promise((resolveClose, reject) => {
137
220
  if (!server.listening) {
@@ -50,6 +50,9 @@ export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
50
50
  arguments: command.arguments,
51
51
  runId: randomUUID(),
52
52
  expectedCommand: null,
53
+ ...(options.environment === undefined
54
+ ? {}
55
+ : { hostEnvironment: options.environment }),
53
56
  ...(options.signal === undefined ? {} : { signal: options.signal }),
54
57
  });
55
58
  }
@@ -111,6 +114,9 @@ const evaluatedProbe = async (strategy, options, timeoutMs, runner) => {
111
114
  try {
112
115
  processResult = await runner(strategy, {
113
116
  helperPath: options.helperPath,
117
+ ...(options.environment === undefined
118
+ ? {}
119
+ : { environment: options.environment }),
114
120
  timeoutMs,
115
121
  ...(options.signal === undefined ? {} : { signal: options.signal }),
116
122
  });
@@ -40,7 +40,7 @@ const registrationSchema = z.union([
40
40
  export const readIdaConfiguration = (path) => {
41
41
  try {
42
42
  if (statSync(path).size > 65_536)
43
- return err(new ConfigurationError("REA_IDA_MCP_CONFIG exceeds the 64 KiB registration size."));
43
+ return err(idaConfigurationError("REA_IDA_MCP_CONFIG exceeds the 64 KiB registration size."));
44
44
  const input = JSON.parse(readFileSync(path, "utf8"));
45
45
  const envelope = z
46
46
  .object({ mcpServers: z.object({ "ida-pro-mcp": z.unknown() }) })
@@ -48,9 +48,14 @@ export const readIdaConfiguration = (path) => {
48
48
  const parsed = registrationSchema.safeParse(envelope.success ? envelope.data.mcpServers["ida-pro-mcp"] : input);
49
49
  return parsed.success
50
50
  ? ok(parsed.data)
51
- : err(new ConfigurationError("REA_IDA_MCP_CONFIG must contain an IDA MCP command/args or local url registration; see docs/ida-provider.md.", { cause: parsed.error }));
51
+ : err(idaConfigurationError("REA_IDA_MCP_CONFIG must contain an IDA MCP command/args or local url registration; see docs/ida-provider.md.", parsed.error));
52
52
  }
53
53
  catch (cause) {
54
- return err(new ConfigurationError(`Cannot read IDA MCP registration ${path}; provide a readable JSON configuration.`, { cause }));
54
+ return err(idaConfigurationError(`Cannot read IDA MCP registration ${path}; provide a readable JSON configuration.`, cause));
55
55
  }
56
56
  };
57
+ /** A REA_IDA_MCP_CONFIG rejection that names the setting it concerns. */
58
+ export const idaConfigurationError = (constraint, cause) => new ConfigurationError(constraint, {
59
+ ...(cause === undefined ? {} : { cause }),
60
+ settings: [{ setting: "REA_IDA_MCP_CONFIG", constraint }],
61
+ });
@@ -1,4 +1,3 @@
1
- import { z } from "zod";
2
1
  import { TOOL_CONTRACTS } from "../contracts/toolContracts.js";
3
2
  import { AnalysisInputError } from "../domain/analysisErrorCore.js";
4
3
  import { jsonObjectSchema } from "../domain/jsonValue.js";
@@ -8,12 +7,7 @@ import { projectInputIssues } from "../domain/inputIssueProjection.js";
8
7
  /** Apply the named public contract and IDA's explicit-address boundary before startup. */
9
8
  export const parseIdaInput = (operation, parameters) => {
10
9
  const contract = TOOL_CONTRACTS.find(({ name }) => name === operation);
11
- const schema = contract?.inputSchema;
12
- if (schema instanceof z.ZodObject) {
13
- const shape = schema.shape;
14
- parameters = Object.fromEntries(Object.entries(parameters).filter(([key, value]) => value !== null || shape[key]?.safeParse(undefined).success !== true));
15
- }
16
- const parsed = (schema instanceof z.ZodObject ? schema.strict() : schema)?.safeParse(parameters);
10
+ const parsed = contract?.inputSchema.safeParse(parameters);
17
11
  if (parsed?.success !== true)
18
12
  return err(new AnalysisInputError(operation, { cause: parsed?.error }, parsed?.error === undefined
19
13
  ? []
@@ -1,5 +1,6 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { Client, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
2
- import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
3
+ import { DEFAULT_INHERITED_ENV_VARS, StdioClientTransport, } from "@modelcontextprotocol/client/stdio";
3
4
  import { z } from "zod";
4
5
  import { jsonValueSchema } from "../domain/jsonValue.js";
5
6
  import { AnalysisProtocolError } from "../domain/analysisErrorCore.js";
@@ -66,7 +67,7 @@ export const redactIdaTransportFailure = (cause, config) => {
66
67
  return new Error(message, { cause });
67
68
  };
68
69
  /** Create a standard SDK connection to an existing upstream registration. */
69
- export const createIdaMcpConnection = (config) => {
70
+ export const createIdaMcpConnection = (config, environment) => {
70
71
  const client = new Client({ name: "rea-ida-provider", version: "1" });
71
72
  const transportFailure = (cause) => {
72
73
  throw redactIdaTransportFailure(cause, config);
@@ -76,9 +77,12 @@ export const createIdaMcpConnection = (config) => {
76
77
  command: config.command,
77
78
  args: config.args,
78
79
  env: {
79
- ...Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined)),
80
+ // The SDK always merges ambient defaults. Its string-only environment
81
+ // API requires empty values to suppress omitted caller-selected keys.
82
+ ...Object.fromEntries(DEFAULT_INHERITED_ENV_VARS.map((key) => [key, ""])),
83
+ ...Object.fromEntries(Object.entries(snapshotEnvironment(environment)).filter((entry) => entry[1] !== undefined)),
80
84
  IDA_MCP_MAX_WORKERS: "1",
81
- ...config.env,
85
+ ...snapshotEnvironment(config.env),
82
86
  },
83
87
  stderr: "pipe",
84
88
  })
@@ -141,7 +141,7 @@ export class IdaOperationRunner {
141
141
  offset,
142
142
  max_lines: 100,
143
143
  }));
144
- if (page.code === null)
144
+ if (page.code === null || page.error !== undefined)
145
145
  throw new AnalysisProtocolError(`IDA decompilation failed: ${page.error ?? "missing code"}`);
146
146
  result.push(page.code);
147
147
  offset = nextOffset(page.cursor, offset);
@@ -152,7 +152,7 @@ export class IdaOperationRunner {
152
152
  if (this.protocol === "legacy")
153
153
  return legacyXrefsSchema.parse(await this.call("get_xrefs_to", { address }));
154
154
  const page = modernXrefsSchema.parse(await this.call("xrefs_to", { addrs: [address], limit: 1000 }))[0];
155
- if (page?.xrefs == null)
155
+ if (page?.xrefs == null || page.error !== undefined)
156
156
  throw new AnalysisProtocolError(`IDA xrefs failed: ${page?.error ?? "missing references"}`);
157
157
  if (page.more === true)
158
158
  this.limitations.push("Upstream xrefs_to capped results at 1000 references; additional references remain unknown.");
@@ -183,7 +183,7 @@ export class IdaOperationRunner {
183
183
  }
184
184
  else {
185
185
  const page = modernCalleesSchema.parse(await this.call("callees", { addrs: [fn.address], limit: 500 }))[0];
186
- if (page?.callees == null)
186
+ if (page?.callees == null || page.error !== undefined)
187
187
  throw new AnalysisProtocolError(`IDA callees failed: ${page?.error ?? "missing callees"}`);
188
188
  if (page.more === true)
189
189
  this.limitations.push("Upstream callees capped results at 500; additional callees remain unknown.");
@@ -288,6 +288,8 @@ export class IdaOperationRunner {
288
288
  referenced_strings: [],
289
289
  referenced_names: [],
290
290
  basic_blocks: [],
291
+ native_api: null,
292
+ native_value_flow: null,
291
293
  limitations: [
292
294
  ...IDA_LIMITATIONS,
293
295
  ...this.limitations,
@@ -1,23 +1,24 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { createAnalysisProfile } from "../domain/analysisProfile.js";
2
3
  import { err, ok } from "../domain/result.js";
3
4
  import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
4
- import { ConfigurationError } from "../domain/configurationErrors.js";
5
5
  import { createHash } from "node:crypto";
6
6
  import canonicalize from "canonicalize";
7
- import { readIdaConfiguration, } from "./IdaConfiguration.js";
7
+ import { readIdaConfiguration, idaConfigurationError, } from "./IdaConfiguration.js";
8
8
  import { createIdaMcpConnection, } from "./IdaMcpConnection.js";
9
9
  import { idaCapabilities, IDA_PROVIDER_IDENTITY, } from "./IdaProviderCapabilities.js";
10
10
  import { IdaSessionClient } from "./IdaSessionClient.js";
11
11
  import { privateRuntimeRootCapability } from "../process/PrivateRuntimeRoot.js";
12
- export { IDA_PROVIDER_IDENTITY } from "./IdaProviderCapabilities.js";
13
12
  /** Bring-your-own IDA MCP candidate; discovery performs no provider startup. */
14
13
  export class IdaProvider {
15
14
  config;
16
15
  connectionFactory;
17
16
  #registration;
18
- constructor(config, connectionFactory = createIdaMcpConnection) {
17
+ environment;
18
+ constructor(config, environment, connectionFactory = createIdaMcpConnection) {
19
19
  this.config = config;
20
20
  this.connectionFactory = connectionFactory;
21
+ this.environment = snapshotEnvironment(environment);
21
22
  }
22
23
  identity() {
23
24
  return IDA_PROVIDER_IDENTITY;
@@ -99,11 +100,6 @@ export class IdaProvider {
99
100
  .update(canonicalize(config.value) ?? "")
100
101
  .digest("hex"),
101
102
  }),
102
- compatibility: {
103
- mode: config.value.mode,
104
- engine_version: null,
105
- upstream_distribution_version: null,
106
- },
107
103
  });
108
104
  }
109
105
  createClient(target, profile) {
@@ -111,9 +107,9 @@ export class IdaProvider {
111
107
  if (!config.ok)
112
108
  return {
113
109
  execute: async () => err(config.error),
114
- close: async () => undefined,
110
+ close: async () => ok(null),
115
111
  };
116
- return new IdaSessionClient(config.value, target, this.connectionFactory(config.value), profile);
112
+ return new IdaSessionClient(config.value, target, this.connectionFactory(config.value, this.environment), profile);
117
113
  }
118
114
  #configuration() {
119
115
  this.#registration ??=
@@ -123,4 +119,4 @@ export class IdaProvider {
123
119
  return this.#registration;
124
120
  }
125
121
  }
126
- const readIdaConfigurationNotConfigured = () => err(new ConfigurationError("Set REA_IDA_MCP_CONFIG to an upstream IDA MCP JSON registration; see docs/ida-provider.md."));
122
+ const readIdaConfigurationNotConfigured = () => err(idaConfigurationError("Set REA_IDA_MCP_CONFIG to an upstream IDA MCP JSON registration; see docs/ida-provider.md."));
@@ -46,7 +46,8 @@ class IdaCleanupError extends ProviderAdapterError {
46
46
  super("ida", "close", {
47
47
  cause,
48
48
  diagnostics: {
49
- reason: "IDA worker release could not be verified. The private workspace was retained.",
49
+ reason: "IDA cleanup could not be verified; the remaining connection or private workspace is retained for retry.",
50
+ failure_reason: cause instanceof Error ? cause.message : String(cause),
50
51
  workspace: path,
51
52
  },
52
53
  });
@@ -66,6 +67,7 @@ export class IdaSessionClient {
66
67
  #closePromise;
67
68
  #workspace;
68
69
  #database;
70
+ #databaseCloseAcknowledged = false;
69
71
  #openAttempted = false;
70
72
  #openCompleted = false;
71
73
  #initialIdentity;
@@ -99,8 +101,10 @@ export class IdaSessionClient {
99
101
  }
100
102
  const document = parameters.document;
101
103
  if (document !== undefined &&
102
- document !== this.target.path &&
103
- document !== this.target.sourcePath)
104
+ (typeof document !== "string" ||
105
+ (!sameIdaHostPath(document, this.target.path) &&
106
+ (this.target.sourcePath === undefined ||
107
+ !sameIdaHostPath(document, this.target.sourcePath)))))
104
108
  return err(new AnalysisInputError(operation, undefined, [
105
109
  {
106
110
  path: ["document"],
@@ -185,7 +189,8 @@ export class IdaSessionClient {
185
189
  if (missing.length > 0)
186
190
  throw new AnalysisProtocolError(`IDA MCP ${this.config.mode} compatibility profile is missing tools: ${missing.join(", ")}. Attached mode requires the legacy 1.4 profile; headless mode requires the database supervisor profile. See docs/ida-provider.md.`);
187
191
  if (this.config.mode === "headless") {
188
- this.#workspace = await IdaWorkspace.create(this.target, this.config.workspaceRoot);
192
+ this.#workspace = await IdaWorkspace.allocate(this.target, this.config.workspaceRoot);
193
+ await this.#workspace.copyInput();
189
194
  this.#openAttempted = true;
190
195
  const raw = await this.connection.call("idb_open", {
191
196
  input_path: this.#workspace.inputPath,
@@ -253,7 +258,7 @@ export class IdaSessionClient {
253
258
  this.#initialIdentity = identity;
254
259
  return this.#metadata;
255
260
  }
256
- async closeWithOutcome() {
261
+ async close() {
257
262
  if (this.#closePromise !== undefined)
258
263
  return this.#closePromise;
259
264
  const closing = this.#closeOnce();
@@ -283,22 +288,27 @@ export class IdaSessionClient {
283
288
  throw new AnalysisProtocolError("An unowned worker still uses the private workspace; it was retained.");
284
289
  }
285
290
  if (this.#database !== undefined) {
286
- const closed = closeDatabaseSchema.parse(await this.connection.call("idb_close", {
287
- database: this.#database,
288
- save: false,
289
- }));
290
- if (closed.session_id !== this.#database ||
291
- closed.saved === true ||
292
- closed.owned !== true ||
293
- closed.backend !== "worker")
294
- throw new AnalysisProtocolError("IDA database close did not confirm the requested owned, unsaved session release.");
291
+ if (!this.#databaseCloseAcknowledged) {
292
+ const closed = closeDatabaseSchema.parse(await this.connection.call("idb_close", {
293
+ database: this.#database,
294
+ save: false,
295
+ }));
296
+ if (closed.session_id !== this.#database ||
297
+ closed.saved === true ||
298
+ closed.owned !== true ||
299
+ closed.backend !== "worker")
300
+ throw new AnalysisProtocolError("IDA database close did not confirm the requested owned, unsaved session release.");
301
+ this.#databaseCloseAcknowledged = true;
302
+ }
295
303
  const inventory = databaseListSchema.parse(await this.connection.call("idb_list", {}));
296
304
  if (inventory.sessions.some((entry) => entry.session_id === this.#database ||
297
305
  sameIdaHostPath(entry.input_path, this.#workspace?.inputPath ?? "")))
298
306
  throw new AnalysisProtocolError("IDA worker remains registered after close.");
307
+ this.#database = undefined;
299
308
  }
300
309
  if (!this.#openCompleted)
301
310
  throw new AnalysisProtocolError("IDA database open did not return a completed response. Worker inventory cannot prove that the request has stopped; the private workspace was retained.");
311
+ this.#openAttempted = false;
302
312
  }
303
313
  await this.connection.close();
304
314
  await this.#workspace?.remove();
@@ -306,13 +316,7 @@ export class IdaSessionClient {
306
316
  return ok(null);
307
317
  }
308
318
  catch (cause) {
309
- await this.connection.close().catch(() => undefined);
310
319
  return err(new IdaCleanupError(this.#workspace?.directory ?? "IDA MCP connection", cause));
311
320
  }
312
321
  }
313
- async close() {
314
- const result = await this.closeWithOutcome();
315
- if (!result.ok)
316
- throw result.error;
317
- }
318
322
  }
@@ -20,32 +20,31 @@ export const sameIdaHostPath = (left, right) => process.platform === "win32"
20
20
  export class IdaWorkspace {
21
21
  runtime;
22
22
  inputPath;
23
+ target;
23
24
  sessionId = `rea-${randomUUID()}`;
24
- constructor(runtime, inputPath) {
25
+ constructor(runtime, inputPath, target) {
25
26
  this.runtime = runtime;
26
27
  this.inputPath = inputPath;
28
+ this.target = target;
27
29
  }
28
30
  /** Filesystem root owned exclusively by this headless session. */
29
31
  get directory() {
30
32
  return this.runtime.path;
31
33
  }
32
- /** Allocate a protected workspace and copy the admitted input with digest verification. */
33
- static async create(target, root = tmpdir()) {
34
+ /** Allocate a protected workspace so its owner can retain it before input preparation. */
35
+ static async allocate(target, root = tmpdir()) {
34
36
  const runtime = await PrivateRuntimeRoot.create({
35
37
  parent: normalize(root),
36
38
  prefix: "rea-ida-",
37
39
  });
38
40
  const inputPath = join(runtime.path, basename(target.path));
39
- try {
40
- await copyFile(target.path, inputPath, constants.COPYFILE_EXCL);
41
- if ((await idaFileDigest(inputPath)) !== target.sha256)
42
- throw new AnalysisProtocolError("IDA target changed between admission and the private input copy; reopen the target.");
43
- return new IdaWorkspace(runtime, inputPath);
44
- }
45
- catch (cause) {
46
- await runtime.close();
47
- throw cause;
48
- }
41
+ return new IdaWorkspace(runtime, inputPath, target);
42
+ }
43
+ /** Copy and verify admitted bytes after the session owns this workspace's cleanup. */
44
+ async copyInput() {
45
+ await copyFile(this.target.path, this.inputPath, constants.COPYFILE_EXCL);
46
+ if ((await idaFileDigest(this.inputPath)) !== this.target.sha256)
47
+ throw new AnalysisProtocolError("IDA target changed between admission and the private input copy; reopen the target.");
49
48
  }
50
49
  /** Delete only this object's privately allocated directory after worker cleanup. */
51
50
  async remove() {
@@ -21,11 +21,6 @@ export const inspectorExclusionKey = (reason) => {
21
21
  /** Resolve a protocol location exposed by the explicitly selected Inspector endpoint. */
22
22
  export const authorizeRuntimeLocation = async (value, signal) => {
23
23
  throwIfRuntimeObservationCancelled(signal);
24
- if (value.startsWith("node:") && value.length > 0)
25
- return {
26
- allowed: true,
27
- location: { kind: "builtin", specifier: value },
28
- };
29
24
  if (value.startsWith("file:")) {
30
25
  const filePath = await authorizedElectronFile(value);
31
26
  throwIfRuntimeObservationCancelled(signal);
@@ -33,6 +28,15 @@ export const authorizeRuntimeLocation = async (value, signal) => {
33
28
  ? { allowed: false, reason: "not_approved" }
34
29
  : { allowed: true, location: { kind: "file", file_path: filePath } };
35
30
  }
31
+ return projectReportedRuntimeUrl(value);
32
+ };
33
+ /** Project non-file Inspector URLs without filesystem access. */
34
+ export const projectReportedRuntimeUrl = (value) => {
35
+ if (value.startsWith("node:") && value.length > 0)
36
+ return {
37
+ allowed: true,
38
+ location: { kind: "builtin", specifier: value },
39
+ };
36
40
  let url;
37
41
  try {
38
42
  url = new URL(value);