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
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { enhancedInputSchemas } from "../contracts/enhancedInputs.js";
3
- import { AnalysisCancelledError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
4
4
  import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
5
5
  import {} from "../domain/analysisErrorBase.js";
6
6
  import { addressDistance, functionDossierSchema, parseFunctionDossier, parseListCount, parseRelatedAddresses, parseSegments, } from "../domain/hopperValues.js";
@@ -179,20 +179,34 @@ export class EnhancedTools {
179
179
  }
180
180
  async #batchDecompile(addresses, signal) {
181
181
  const items = await Promise.all(addresses.map(async (address) => {
182
- const result = await this.#call("procedure_pseudo_code", { procedure: address }, signal);
182
+ const resolved = await resolveProcedureAddress(this.#call.bind(this), address, signal);
183
+ const procedure = resolved.ok
184
+ ? await this.#batchProcedureIdentity(resolved.value, signal)
185
+ : {
186
+ status: "unknown",
187
+ error: projectAnalysisError(resolved.error),
188
+ };
189
+ const result = await this.#call("procedure_pseudo_code", { procedure: resolved.ok ? resolved.value : address }, signal);
183
190
  if (!result.ok)
184
191
  return {
185
192
  address,
193
+ procedure,
186
194
  status: "error",
187
195
  error: projectAnalysisError(result.error),
188
196
  };
189
197
  if (typeof result.value !== "string" || result.value.length === 0)
190
198
  return {
191
199
  address,
200
+ procedure,
192
201
  status: "error",
193
202
  error: projectAnalysisError(new AnalysisOutputError("procedure_pseudo_code", "provider returned empty pseudocode")),
194
203
  };
195
- return { address, status: "ok", pseudocode: result.value };
204
+ return {
205
+ address,
206
+ procedure,
207
+ status: "ok",
208
+ pseudocode: result.value,
209
+ };
196
210
  }));
197
211
  const succeeded = items.filter(({ status }) => status === "ok").length;
198
212
  return ok({
@@ -202,6 +216,23 @@ export class EnhancedTools {
202
216
  failed: items.length - succeeded,
203
217
  });
204
218
  }
219
+ async #batchProcedureIdentity(address, signal) {
220
+ const observed = await this.#call("address_name", { address }, signal);
221
+ const named = observed.ok &&
222
+ (typeof observed.value === "string" || observed.value === null);
223
+ return {
224
+ status: "resolved",
225
+ address,
226
+ name: named ? observed.value : null,
227
+ ...(named
228
+ ? {}
229
+ : {
230
+ name_error: projectAnalysisError(observed.ok
231
+ ? new AnalysisOutputError("address_name", "provider returned an invalid entry label")
232
+ : observed.error),
233
+ }),
234
+ };
235
+ }
205
236
  async #callGraph(input, signal) {
206
237
  const relation = input.direction === "forward" ? "callees" : "callers";
207
238
  const tool = input.direction === "forward" ? "procedure_callees" : "procedure_callers";
@@ -254,9 +285,23 @@ export class EnhancedTools {
254
285
  }
255
286
  async #analyzeSwiftTypes(input, signal) {
256
287
  const procedures = await this.#allAddressed("list_procedures", signal);
257
- return procedures.ok
258
- ? ok(categorizeSwiftTypes(procedures.value, input))
259
- : procedures;
288
+ if (!procedures.ok)
289
+ return procedures;
290
+ const symbols = await this.#allAddressed("list_names", signal);
291
+ if (!symbols.ok &&
292
+ !(symbols.error instanceof AnalysisCapabilityUnavailableError))
293
+ return symbols;
294
+ const result = categorizeSwiftTypes(procedures.value, input, symbols.ok ? symbols.value : []);
295
+ return ok(symbols.ok
296
+ ? result
297
+ : {
298
+ ...result,
299
+ symbol_inventory_error: projectAnalysisError(symbols.error),
300
+ limitations: [
301
+ ...result.limitations,
302
+ "The provider's symbol inventory is unavailable; demangled procedures could not be joined to their Swift aliases.",
303
+ ],
304
+ });
260
305
  }
261
306
  async #findXrefs(name, signal) {
262
307
  const names = await this.#allAddressed("list_names", signal);
@@ -1,7 +1,8 @@
1
1
  import { describeEvidenceBundleFailure, describeValidationFailure, parseEvidenceBundle, } from "../domain/evidenceBundle.js";
2
2
  import { EvidenceFileError, EvidenceIntegrityError, } from "../domain/evidenceErrors.js";
3
3
  import { err, ok } from "../domain/result.js";
4
- import { parseProcessCapture } from "../domain/process/processCapture.js";
4
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
5
+ import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
5
6
  import { bufferedJsonParts, canonicalJsonParts, } from "../domain/jsonSerialization.js";
6
7
  import { readJsonFile, writeTextParts } from "./JsonFiles.js";
7
8
  /** Read and validate an evidence bundle at the caller-supplied path. */
@@ -35,7 +36,9 @@ export const readEvidenceBundle = async (path) => {
35
36
  return ok(bundle);
36
37
  };
37
38
  /** Atomically write deterministic evidence JSON at the caller-supplied path. */
38
- export const writeEvidenceBundle = async (bundle, path, overwrite) => {
39
+ export const writeEvidenceBundle = async (bundle, path, overwrite, signal) => {
40
+ if (signal?.aborted === true)
41
+ return err(new AnalysisCancelledError("export_evidence_bundle"));
39
42
  let checked;
40
43
  try {
41
44
  checked = parseEvidenceBundle(bundle);
@@ -45,5 +48,7 @@ export const writeEvidenceBundle = async (bundle, path, overwrite) => {
45
48
  cause,
46
49
  }));
47
50
  }
48
- return writeTextParts(bufferedJsonParts(canonicalJsonParts(checked)), path, overwrite);
51
+ return writeTextParts(bufferedJsonParts(canonicalJsonParts(checked)), path, overwrite, signal === undefined
52
+ ? undefined
53
+ : { signal, operation: "export_evidence_bundle" });
49
54
  };
@@ -8,7 +8,9 @@ export const REA_WORKFLOW_PROVIDER = {
8
8
  /** Commit a workflow result to its upstream profile and applicable semantic revision. */
9
9
  export const workflowAnalysisProfile = (upstream, operation) => createAnalysisProfile(REA_WORKFLOW_PROVIDER, {
10
10
  upstream_analysis_profile: upstream,
11
- ...(operation === "binary_overview" ? { workflow_revision: 2 } : {}),
11
+ ...(operation === "binary_overview" || operation === "batch_decompile"
12
+ ? { workflow_revision: 2 }
13
+ : {}),
12
14
  });
13
15
  /** Provider identity for deterministic artifact inventories. */
14
16
  export const ARTIFACT_GRAPH_PROVIDER = {
@@ -58,6 +60,12 @@ export const JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER = {
58
60
  name: "REA JavaScript runtime reconciliation",
59
61
  version: "1",
60
62
  };
63
+ /** Provider identity for selected views of retained analysis Evidence. */
64
+ export const ANALYSIS_VIEW_PROVIDER = {
65
+ id: "rea-analysis-view",
66
+ name: "REA analysis view projection",
67
+ version: "1",
68
+ };
61
69
  /** Provider identity for graph-native feature tracing and version comparison. */
62
70
  export const JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER = {
63
71
  id: "rea-javascript-application-workflows",
@@ -1,6 +1,7 @@
1
1
  import { link, lstat, mkdtemp, open, readFile, realpath, rename, rm, } from "node:fs/promises";
2
2
  import { basename, dirname, resolve } from "node:path";
3
3
  import { EvidenceFileError } from "../domain/evidenceErrors.js";
4
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
4
5
  import { err, ok } from "../domain/result.js";
5
6
  /** Read JSON data from a regular file at the caller-supplied path. */
6
7
  export const readJsonFile = async (path) => {
@@ -32,10 +33,10 @@ export const readJsonFile = async (path) => {
32
33
  };
33
34
  /** Atomically write text to the caller-supplied path. */
34
35
  export const writeTextFile = async (encoded, path, overwrite) => writeTextParts([encoded], path, overwrite);
35
- /** Publish complete streamed text atomically, keeping only one encoded part in memory. */
36
- export const writeTextParts = async (parts, path, overwrite) => {
36
+ export async function writeTextParts(parts, path, overwrite, cancellation) {
37
37
  const requestedPath = resolve(path);
38
38
  try {
39
+ assertWriteActive(cancellation);
39
40
  const canonicalParent = await realpath(dirname(requestedPath));
40
41
  const destination = resolve(canonicalParent, basename(requestedPath));
41
42
  const existing = await lstat(destination).catch((cause) => {
@@ -49,10 +50,15 @@ export const writeTextParts = async (parts, path, overwrite) => {
49
50
  if (!existing.isFile() || existing.isSymbolicLink())
50
51
  return err(new EvidenceFileError("write", "not-file", { path: requestedPath }));
51
52
  }
52
- const bytes = await publishFile(destination, parts, overwrite);
53
+ assertWriteActive(cancellation);
54
+ const bytes = await publishFile(destination, parts, overwrite, cancellation);
53
55
  return ok({ path: requestedPath, bytes });
54
56
  }
55
57
  catch (cause) {
58
+ if (cancellation?.signal.aborted === true &&
59
+ cause instanceof AnalysisCancelledError &&
60
+ cause.operation === cancellation.operation)
61
+ return err(cause);
56
62
  if (!overwrite && fileErrorCode(cause) === "EEXIST")
57
63
  return err(new EvidenceFileError("write", "exists", {
58
64
  cause,
@@ -63,28 +69,28 @@ export const writeTextParts = async (parts, path, overwrite) => {
63
69
  path: requestedPath,
64
70
  }));
65
71
  }
66
- };
72
+ }
67
73
  /** A missing path or parent is a selection error, not a permission failure. */
68
74
  const missingOrIo = (cause) => {
69
75
  const code = fileErrorCode(cause);
70
76
  return code === "ENOENT" || code === "ENOTDIR" ? "missing" : "io";
71
77
  };
72
- const publishFile = async (destination, parts, overwrite) => {
78
+ const publishFile = async (destination, parts, overwrite, cancellation) => {
73
79
  const stagingDirectory = await mkdtemp(resolve(dirname(destination), ".rea-write-"));
74
80
  try {
75
81
  const staged = resolve(stagingDirectory, "content");
76
82
  const file = await open(staged, "wx", 0o600);
77
83
  let bytes = 0;
78
84
  try {
79
- for (const part of parts) {
80
- await file.writeFile(part, { encoding: "utf8" });
81
- bytes += Buffer.byteLength(part, "utf8");
82
- }
85
+ bytes = await writeStagedParts(file, parts, cancellation);
86
+ assertWriteActive(cancellation);
83
87
  await file.sync();
84
88
  }
85
89
  finally {
86
90
  await file.close();
87
91
  }
92
+ // Once submitted, the atomic publication can win a later cancellation race.
93
+ assertWriteActive(cancellation);
88
94
  if (overwrite)
89
95
  await rename(staged, destination);
90
96
  // A hard link publishes complete bytes atomically and cannot replace an existing name.
@@ -96,6 +102,33 @@ const publishFile = async (destination, parts, overwrite) => {
96
102
  await rm(stagingDirectory, { recursive: true, force: true });
97
103
  }
98
104
  };
105
+ const writeStagedParts = async (file, parts, cancellation) => {
106
+ assertWriteActive(cancellation);
107
+ const iterator = parts[Symbol.iterator]();
108
+ let exhausted = false;
109
+ let bytes = 0;
110
+ try {
111
+ for (;;) {
112
+ assertWriteActive(cancellation);
113
+ const part = iterator.next();
114
+ if (part.done)
115
+ exhausted = true;
116
+ assertWriteActive(cancellation);
117
+ if (part.done)
118
+ return bytes;
119
+ await file.writeFile(part.value, { encoding: "utf8" });
120
+ bytes += Buffer.byteLength(part.value, "utf8");
121
+ }
122
+ }
123
+ finally {
124
+ if (!exhausted)
125
+ iterator.return?.();
126
+ }
127
+ };
128
+ const assertWriteActive = (cancellation) => {
129
+ if (cancellation?.signal.aborted === true)
130
+ throw new AnalysisCancelledError(cancellation.operation);
131
+ };
99
132
  const fileErrorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
100
133
  ? cause.code
101
134
  : undefined;
@@ -84,7 +84,7 @@ export const readLinuxDistribution = async () => {
84
84
  }
85
85
  };
86
86
  /** Download, verify, install, and read back the official Hopper Linux package. */
87
- export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(), options = {}) => {
87
+ export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(process.env), options = {}) => {
88
88
  if (options.signal?.aborted === true)
89
89
  return { status: "failed", reason: "cancelled" };
90
90
  const distribution = await host.distribution();
@@ -124,7 +124,8 @@ export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(),
124
124
  };
125
125
  /** Canonical launcher path for a legacy user-local Linux Hopper installation. */
126
126
  export const linuxHopperLauncherPath = (home) => join(home, ".local/share/rea/hopper/bin/Hopper");
127
- const systemLinuxHopperInstallHost = () => ({
127
+ /** Compose package-manager and linker checks from the selected caller environment. */
128
+ export const systemLinuxHopperInstallHost = (environment) => ({
128
129
  distribution: readLinuxDistribution,
129
130
  async download(url, options) {
130
131
  const response = await fetch(url, {
@@ -138,11 +139,11 @@ const systemLinuxHopperInstallHost = () => ({
138
139
  },
139
140
  createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-")),
140
141
  writeArchive: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
141
- installPackage: installSystemPackage,
142
+ installPackage: (family, archive) => installSystemPackage(family, archive, environment),
142
143
  async launcherStatus(path) {
143
144
  try {
144
145
  await access(path);
145
- const linked = await execFileOutput("ldd", [path]);
146
+ const linked = await execFileOutput("ldd", [path], { env: environment });
146
147
  if (!linuxSharedLibrariesAvailable(`${linked.stdout}\n${linked.stderr}`))
147
148
  return "runtime_dependencies";
148
149
  return (await linuxHopperBinarySupported(path))
@@ -175,10 +176,12 @@ export const linuxHopperBinarySupported = async (path) => {
175
176
  export const linuxHopperLauncherDigestSupported = (digest) => SUPPORTED_HOPPER_SHA256.has(digest);
176
177
  /** Interpret ldd output conservatively so a present but broken launcher is unhealthy. */
177
178
  export const linuxSharedLibrariesAvailable = (output) => !/(?:=>\s+not found|error while loading shared libraries)/iu.test(output);
178
- const installSystemPackage = async (family, archive) => {
179
+ const installSystemPackage = async (family, archive, environment) => {
179
180
  try {
180
181
  for (const command of linuxPackageManagerCommands(family, archive, process.getuid?.() === 0))
181
- await execFileAsync(command.executable, command.args);
182
+ await execFileAsync(command.executable, command.args, {
183
+ env: environment,
184
+ });
182
185
  return true;
183
186
  }
184
187
  catch (cause) {
@@ -1,10 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { execFile } from "node:child_process";
3
3
  import { access, mkdir, mkdtemp, readdir, rename, rm, writeFile, } from "node:fs/promises";
4
- import { homedir, tmpdir } from "node:os";
4
+ import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { promisify } from "node:util";
7
7
  import { z } from "zod";
8
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
8
9
  const execFileAsync = promisify(execFile);
9
10
  const RELEASES_URL = "https://www.hopperapp.com/include/files-api.php?request=releases&public=true";
10
11
  const DOWNLOAD_PREFIX = "https://www.hopperapp.com:443/downloader/public/";
@@ -21,7 +22,7 @@ export const macHopperInstallDisclosure = {
21
22
  ],
22
23
  };
23
24
  /** Download, verify, and install Hopper into the current user's Applications directory. */
24
- export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost()) => {
25
+ export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost(homeDirectoryFromEnvironment(process.env, process.platform), process.env)) => {
25
26
  let temporary;
26
27
  let mounted = false;
27
28
  try {
@@ -77,7 +78,8 @@ export const installMacHopper = async (options = {}, host = systemMacHopperInsta
77
78
  }
78
79
  }
79
80
  };
80
- const systemMacHopperInstallHost = () => ({
81
+ /** Compose installer paths and subprocesses from one selected caller context. */
82
+ export const systemMacHopperInstallHost = (homeDirectory, environment) => ({
81
83
  download: downloadPackage,
82
84
  createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-mac-")),
83
85
  createMountDirectory: (path) => mkdir(path),
@@ -90,10 +92,10 @@ const systemMacHopperInstallHost = () => ({
90
92
  "-mountpoint",
91
93
  mountPath,
92
94
  packagePath,
93
- ]);
95
+ ], environment);
94
96
  },
95
97
  async unmount(mountPath) {
96
- await commandSucceeds("hdiutil", ["detach", mountPath, "-force"]);
98
+ await commandSucceeds("hdiutil", ["detach", mountPath, "-force"], environment);
97
99
  },
98
100
  async appBundle(mountPath) {
99
101
  const entries = await readdir(mountPath, { withFileTypes: true });
@@ -101,19 +103,14 @@ const systemMacHopperInstallHost = () => ({
101
103
  return app === undefined ? undefined : join(mountPath, app.name);
102
104
  },
103
105
  async validBundle(appPath) {
104
- if (!(await commandSucceeds("codesign", [
105
- "--verify",
106
- "--deep",
107
- "--strict",
108
- appPath,
109
- ])))
106
+ if (!(await commandSucceeds("codesign", ["--verify", "--deep", "--strict", appPath], environment)))
110
107
  return false;
111
108
  try {
112
109
  const identifier = (await execFileAsync("/usr/libexec/PlistBuddy", [
113
110
  "-c",
114
111
  "Print :CFBundleIdentifier",
115
112
  join(appPath, "Contents/Info.plist"),
116
- ])).stdout.trim();
113
+ ], { env: environment })).stdout.trim();
117
114
  return identifier === BUNDLE_IDENTIFIER;
118
115
  }
119
116
  catch (cause) {
@@ -136,10 +133,10 @@ const systemMacHopperInstallHost = () => ({
136
133
  async installBundle(source, destination, stage, replaceExisting) {
137
134
  const previous = `${stage}-previous`;
138
135
  try {
139
- await mkdir(join(homedir(), "Applications"), { recursive: true });
136
+ await mkdir(join(homeDirectory, "Applications"), { recursive: true });
140
137
  await rm(stage, { recursive: true, force: true });
141
138
  await rm(previous, { recursive: true, force: true });
142
- await execFileAsync("ditto", [source, stage]);
139
+ await execFileAsync("ditto", [source, stage], { env: environment });
143
140
  await access(join(stage, "Contents/MacOS/hopper"));
144
141
  if (replaceExisting)
145
142
  await rename(destination, previous);
@@ -176,10 +173,10 @@ const systemMacHopperInstallHost = () => ({
176
173
  }
177
174
  },
178
175
  async openApplication(path) {
179
- await execFileAsync("open", [path]);
176
+ await execFileAsync("open", [path], { env: environment });
180
177
  },
181
178
  cleanup: (path) => rm(path, { recursive: true, force: true }),
182
- destination: () => join(homedir(), "Applications/Hopper Disassembler.app"),
179
+ destination: () => join(homeDirectory, "Applications/Hopper Disassembler.app"),
183
180
  });
184
181
  const downloadPackage = async (url) => {
185
182
  const response = await fetch(url, {
@@ -196,9 +193,9 @@ const parseJson = (bytes) => JSON.parse(new TextDecoder().decode(bytes));
196
193
  const integrityMatches = (bytes, release) => bytes.byteLength === Number(release.file_length) &&
197
194
  bytes.byteLength <= MAX_PACKAGE_BYTES &&
198
195
  createHash("sha1").update(bytes).digest("hex") === release.file_hash;
199
- const commandSucceeds = async (command, args) => {
196
+ const commandSucceeds = async (command, args, environment) => {
200
197
  try {
201
- await execFileAsync(command, args);
198
+ await execFileAsync(command, args, { env: environment });
202
199
  return true;
203
200
  }
204
201
  catch (cause) {
@@ -11,17 +11,6 @@ export const firstProcedureAddress = (input) => {
11
11
  throw new TypeError("Procedure inventory was empty");
12
12
  return first.address;
13
13
  };
14
- /** Reject two target paths that resolve to the same binary content. */
15
- export const requireDistinctTargetHashes = (firstHash, secondHash) => {
16
- if (typeof firstHash !== "string" ||
17
- typeof secondHash !== "string" ||
18
- firstHash.length === 0 ||
19
- secondHash.length === 0) {
20
- throw new TypeError("Target hashes must be non-empty strings");
21
- }
22
- if (firstHash === secondHash)
23
- throw new TypeError("Real-Hopper verification requires distinct binaries");
24
- };
25
14
  /** Reject empty and success-shaped embedded decompilation failures. */
26
15
  export const requirePseudocode = (input, operation) => {
27
16
  if (typeof input !== "string" || input.trim().length === 0)
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { parseEvidenceBundle, } from "../domain/evidenceBundle.js";
4
- import { parseProcessCapture } from "../domain/process/processCapture.js";
4
+ import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
5
5
  import { parseApplicationGraphEvidence } from "./javascript/JavaScriptApplicationEvidenceGraph.js";
6
6
  import { applicationObligationPolicy, semanticObligationPolicy, } from "./ReconstructionObligationPolicies.js";
7
7
  /** Derive conservative candidates from graph, process, and reviewed inputs. */
@@ -32,7 +32,7 @@ const failedEntry = (entry) => {
32
32
  return {
33
33
  path: entry.path,
34
34
  kind: "symlink",
35
- target: "<unreadable>",
35
+ target: null,
36
36
  target_state: "unreadable",
37
37
  classifications,
38
38
  limitations: [limitation],
@@ -1,7 +1,7 @@
1
1
  import { manualRegistrationRemediation, } from "./SupportedClients.js";
2
2
  import { configureDetectedClients } from "./SetupClients.js";
3
3
  import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
4
- import { filterClientsNeedingConfigure, hostRemediation, initialProviderEnvironment, setupRegistrationCommand, systemSetupHost, } from "./SetupHost.js";
4
+ import { filterClientsNeedingConfigure, hostRemediation, systemSetupHost, } from "./SetupHost.js";
5
5
  /** Discover, approve, and apply setup actions idempotently. */
6
6
  export const runSetup = async (options, host = systemSetupHost(), confirm) => {
7
7
  const appliedActions = [];
@@ -13,22 +13,14 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
13
13
  const unsupported = await hostRemediation(host, false);
14
14
  if (unsupported !== undefined)
15
15
  return fail(unsupported);
16
- const initialState = await host.initialSetupState?.(options.readinessScope);
17
- let hopperPath = initialState === undefined
18
- ? await host.hopperPath()
19
- : initialState.hopperPath;
20
- let providerEnvironment = initialState === undefined
21
- ? await initialProviderEnvironment(host, hopperPath)
22
- : initialState.providerEnvironment;
16
+ const initialState = await host.initialSetupState(options.readinessScope);
17
+ let { hopperPath, providerEnvironment } = initialState;
23
18
  const discovery = await discoverSetupState({
24
19
  host,
25
20
  providerEnvironment,
26
21
  forceHopperInstall: options.installHopper,
27
22
  proposeHopper: options.proposeHopper ?? (confirm !== undefined && !options.structured),
28
- doctorScope: options.readinessScope,
29
- ...(initialState === undefined
30
- ? {}
31
- : { initialDoctor: initialState.doctor }),
23
+ initialDoctor: initialState.doctor,
32
24
  });
33
25
  clientStates = discovery.clientStates;
34
26
  const clientSelectionAllowed = options.clientIds === undefined &&
@@ -52,7 +44,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
52
44
  discovery,
53
45
  host,
54
46
  providerEnvironment,
55
- command: setupRegistrationCommand(host.platform),
47
+ command: host.registrationCommand,
56
48
  clientIds: [],
57
49
  installSkill: offerSkillAction,
58
50
  });
@@ -92,7 +84,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
92
84
  discovery: planDiscovery,
93
85
  host,
94
86
  providerEnvironment,
95
- command: setupRegistrationCommand(host.platform),
87
+ command: host.registrationCommand,
96
88
  clientIds: selectedClientIds,
97
89
  installSkill,
98
90
  });
@@ -175,7 +167,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
175
167
  host,
176
168
  detectedClients: selectedClients,
177
169
  providerEnvironment,
178
- command: setupRegistrationCommand(host.platform),
170
+ command: host.registrationCommand,
179
171
  clients,
180
172
  appliedActions,
181
173
  ...(options.onProgress === undefined
@@ -241,7 +233,7 @@ const installHopperAction = async (input) => {
241
233
  return {
242
234
  hopperPath: installed.launcherPath,
243
235
  providerEnvironment,
244
- selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, setupRegistrationCommand(input.host.platform)),
236
+ selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, input.host.registrationCommand),
245
237
  };
246
238
  };
247
239
  const installSkillAction = async (host, options, appliedActions) => {
@@ -1,19 +1,18 @@
1
1
  import { access } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
2
  import { resolve } from "node:path";
4
3
  import { PRODUCT_IDENTITY } from "../identity.js";
5
4
  import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
6
5
  import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
7
6
  import { runDoctor, systemDoctorHost } from "./Doctor.js";
8
- import { installLinuxHopper, readLinuxDistribution } from "./LinuxHopper.js";
9
- import { installMacHopper } from "./MacHopper.js";
7
+ import { installLinuxHopper, readLinuxDistribution, systemLinuxHopperInstallHost, } from "./LinuxHopper.js";
8
+ import { installMacHopper, systemMacHopperInstallHost } from "./MacHopper.js";
10
9
  import { supportedClients } from "./SupportedClients.js";
11
10
  import { canonicalSkillNeedsInstall, installCanonicalSkill, } from "./SetupSkill.js";
12
11
  import { clientConfigurationAligned, configureClientConfiguration, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
13
12
  import { setupInstallFailure } from "./SetupInstallFailure.js";
14
13
  import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
15
14
  /** Resolve the executable and arguments used in a managed MCP registration. */
16
- export const setupRegistrationCommand = (platform, useNpmRunner = process.env.npm_command === "exec") => useNpmRunner
15
+ export const setupRegistrationCommand = (platform, useNpmRunner) => useNpmRunner
17
16
  ? npxRegistrationCommand(platform)
18
17
  : platform === "win32"
19
18
  ? [
@@ -26,10 +25,6 @@ export const filterClientsNeedingConfigure = async (host, detectedClients, provi
26
25
  const needs = await Promise.all(detectedClients.map((client) => host.clientNeedsConfigure(client, providerEnvironment, command)));
27
26
  return detectedClients.filter((_, index) => needs[index]);
28
27
  };
29
- export const initialProviderEnvironment = async (host, hopperPath) => ({
30
- ...(await host.providerEnvironment?.()),
31
- ...(hopperPath === undefined ? {} : { HOPPER_LAUNCHER_PATH: hopperPath }),
32
- });
33
28
  export const hostRemediation = async (host, installHopper) => {
34
29
  if (!supportsNodeVersion(host.nodeVersion))
35
30
  return `Install ${SUPPORTED_NODE_VERSION_PROSE} and rerun setup.`;
@@ -48,14 +43,17 @@ export const hostRemediation = async (host, installHopper) => {
48
43
  return "Automated Hopper setup supports Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, and CachyOS; configure an existing supported provider instead.";
49
44
  };
50
45
  /** Production setup effects for Hopper, agent configuration, and the canonical skill directory. */
51
- export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
46
+ export const systemSetupHost = (selectedDoctorHost = undefined, environment = process.env) => {
47
+ const doctorHost = selectedDoctorHost ?? systemDoctorHost({ environment });
52
48
  const platform = doctorHost.platform;
49
+ const { homeDirectory } = doctorHost;
53
50
  return {
54
51
  platform,
52
+ homeDirectory,
53
+ registrationCommand: setupRegistrationCommand(platform, environment.npm_command === "exec"),
55
54
  nodeVersion: process.versions.node,
56
55
  macosVersion: () => doctorHost.macosVersion(),
57
56
  linuxDistribution: readLinuxDistribution,
58
- hopperPath: async () => (await runDoctor(undefined, doctorHost)).hopperPath,
59
57
  initialSetupState: async (scope) => {
60
58
  const diagnosis = await runDoctor(undefined, doctorHost, scope);
61
59
  return {
@@ -71,25 +69,16 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
71
69
  doctor: diagnosis,
72
70
  };
73
71
  },
74
- providerEnvironment: async () => {
75
- const diagnosis = await runDoctor(undefined, doctorHost);
76
- return {
77
- ...providerRegistrationEnvironment(diagnosis.providerInspections ?? []),
78
- ...(diagnosis.hopperPath === undefined
79
- ? {}
80
- : { HOPPER_LAUNCHER_PATH: diagnosis.hopperPath }),
81
- };
82
- },
83
72
  installHopper: async (replaceExisting) => {
84
73
  const result = platform === "linux"
85
- ? await installLinuxHopper()
86
- : await installMacHopper({ replaceExisting });
74
+ ? await installLinuxHopper(systemLinuxHopperInstallHost(environment))
75
+ : await installMacHopper({ replaceExisting }, systemMacHopperInstallHost(homeDirectory, environment));
87
76
  if (result.status === "installed")
88
77
  return result;
89
78
  return setupInstallFailure(result.reason);
90
79
  },
91
- detectedClients: () => detectClients(homedir()),
92
- supportedClients: () => Promise.resolve(supportedClients(homedir())),
80
+ detectedClients: () => detectClients(homeDirectory, platform, environment),
81
+ supportedClients: () => Promise.resolve(supportedClients(homeDirectory, platform, environment)),
93
82
  configureClient: (client, providerEnvironment, command) => client.format === "unsupported"
94
83
  ? Promise.resolve({ status: "skipped" })
95
84
  : configureClientConfiguration(client, providerEnvironment, command),
@@ -97,15 +86,15 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
97
86
  ? Promise.resolve(false)
98
87
  : clientConfigurationAligned(client, providerEnvironment, command).then((aligned) => !aligned),
99
88
  inspectClientConfiguration: inspectClientConfiguration,
100
- skillNeedsInstall: () => canonicalSkillNeedsInstall(homedir()),
101
- installSkill: () => installCanonicalSkill(homedir()),
89
+ skillNeedsInstall: () => canonicalSkillNeedsInstall(homeDirectory),
90
+ installSkill: () => installCanonicalSkill(homeDirectory),
102
91
  doctor: (scope) => runDoctor(undefined, doctorHost, scope),
103
92
  };
104
93
  };
105
94
  /** Detect supported agents from their config files or stable installation markers. */
106
- export const detectClients = async (home) => {
95
+ export const detectClients = async (home, platform = process.platform, environment = process.env) => {
107
96
  const detected = [];
108
- for (const candidate of supportedClients(home)) {
97
+ for (const candidate of supportedClients(home, platform, environment)) {
109
98
  const [hasConfig, hasMarker] = await Promise.all([
110
99
  exists(candidate.configPath),
111
100
  candidate.markerPath === undefined ? false : exists(candidate.markerPath),