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,4 +1,3 @@
1
- import { homedir } from "node:os";
2
1
  import { join } from "node:path";
3
2
  import { PRODUCT_IDENTITY } from "../identity.js";
4
3
  import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
@@ -6,7 +5,7 @@ import { linuxHopperInstallDisclosure, } from "./LinuxHopper.js";
6
5
  import { macHopperInstallDisclosure } from "./MacHopper.js";
7
6
  /** Discover supported clients and current registrations without mutation. */
8
7
  export const discoverSetupState = async (input) => {
9
- const initialDoctor = input.initialDoctor ?? (await input.host.doctor(input.doctorScope));
8
+ const { initialDoctor } = input;
10
9
  const linuxHopperRepairNeeded = initialDoctor.checks.some(({ name, ok, detail }) => !ok &&
11
10
  (name === "hopper-demo-runtime" ||
12
11
  (name === "hopper-version" && detail === "/opt/hopper/bin/Hopper")));
@@ -22,7 +21,7 @@ export const discoverSetupState = async (input) => {
22
21
  (Object.keys(input.providerEnvironment).length === 0 ||
23
22
  linuxHopperRepairNeeded));
24
23
  const [clients, detectedClients, skillNeedsInstall] = await Promise.all([
25
- input.host.supportedClients?.() ?? input.host.detectedClients(),
24
+ input.host.supportedClients(),
26
25
  input.host.detectedClients(),
27
26
  input.host.skillNeedsInstall(),
28
27
  ]);
@@ -85,7 +84,7 @@ export const planSetupActions = async (input) => {
85
84
  });
86
85
  const inspections = await Promise.all(selectedClients.map(async (client) => ({
87
86
  client,
88
- inspection: (await input.host.inspectClientConfiguration?.(client, input.providerEnvironment, input.command)) ?? { status: "update" },
87
+ inspection: await input.host.inspectClientConfiguration(client, input.providerEnvironment, input.command),
89
88
  })));
90
89
  const invalid = inspections.find(({ inspection }) => inspection.status === "invalid");
91
90
  if (invalid?.inspection.status === "invalid") {
@@ -117,6 +116,7 @@ export const planSetupActions = async (input) => {
117
116
  return {
118
117
  plannedActions: setupPlan({
119
118
  platform: input.host.platform,
119
+ homeDirectory: input.host.homeDirectory,
120
120
  installHopper: input.discovery.installHopper,
121
121
  installSkill: input.installSkill,
122
122
  clients: clientPlans,
@@ -139,7 +139,7 @@ const setupPlan = (input) => [
139
139
  kind: "install_hopper",
140
140
  label: "Hopper deep-analysis provider",
141
141
  target: input.platform === "darwin"
142
- ? join(homedir(), "Applications/Hopper Disassembler.app")
142
+ ? join(input.homeDirectory, "Applications/Hopper Disassembler.app")
143
143
  : "system package manager",
144
144
  detail: input.platform === "linux"
145
145
  ? "Download, verify, and install Hopper plus its Xvfb demo-session dependencies. For the supported demo build, REA uses a private display and selects Hopper's offered demo mode for each analysis session."
@@ -175,7 +175,7 @@ const setupPlan = (input) => [
175
175
  id: "install_skill",
176
176
  kind: "install_skill",
177
177
  label: "REA reverse-engineering skill",
178
- target: join(homedir(), ".agents/skills", PRODUCT_IDENTITY.skillName),
178
+ target: join(input.homeDirectory, ".agents/skills", PRODUCT_IDENTITY.skillName),
179
179
  detail: "Install or update the bundled REA reverse-engineering skill and on-demand references.",
180
180
  external: false,
181
181
  operation: "install",
@@ -1,6 +1,7 @@
1
1
  import { parseClientConfiguration, serializeClientConfiguration, clientServerPath, legacyClientServerPath, withClientServers, } from "./ClientConfigurationDocument.js";
2
2
  import { copyFile, lstat, readFile, realpath, rm } from "node:fs/promises";
3
- import { homedir } from "node:os";
3
+ import { constants as fsConstants } from "node:fs";
4
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
4
5
  import { join } from "node:path";
5
6
  import writeFileAtomic from "write-file-atomic";
6
7
  import { z } from "zod";
@@ -10,7 +11,7 @@ import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
10
11
  import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
11
12
  const systemFileSystem = {
12
13
  readText: (path) => readFile(path, "utf8"),
13
- copy: (source, destination) => copyFile(source, destination),
14
+ copy: (source, destination) => copyFile(source, destination, fsConstants.COPYFILE_EXCL),
14
15
  writeText: (path, contents) => writeFileAtomic(path, contents, { encoding: "utf8" }),
15
16
  stat: (path) => lstat(path),
16
17
  realpath: (path) => realpath(path),
@@ -30,14 +31,26 @@ export const isUninstallFailure = (result) => {
30
31
  }
31
32
  }
32
33
  };
33
- /** Remove only REA-owned registrations and managed files, optionally including local state. */
34
+ /**
35
+ * Remove only REA-owned registrations and managed files, optionally including
36
+ * local state. A client configuration that cannot be read safely stops the
37
+ * operation before anything is removed; one that fails during removal stops
38
+ * the remaining removals.
39
+ */
34
40
  export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
35
- const items = [];
36
- for (const client of await host.clients())
37
- items.push(await host.removeClient(client));
38
- items.push(await host.removeSkill());
39
- if (purgeData)
40
- items.push(...(await host.purgeData()));
41
+ const clients = await host.clients();
42
+ const blocked = [];
43
+ for (const client of clients) {
44
+ const blocking = await host.inspectClient(client);
45
+ if (blocking !== undefined)
46
+ blocked.push(blocking);
47
+ }
48
+ const items = blocked.length > 0
49
+ ? [
50
+ ...blocked,
51
+ item("uninstall", "skipped", "No REA registration, skill, or data was removed. Repair each failed configuration, then rerun uninstall."),
52
+ ]
53
+ : await removeAll(clients, purgeData, host);
41
54
  items.push({
42
55
  name: "analysis_engine",
43
56
  status: "retained",
@@ -50,41 +63,80 @@ export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
50
63
  items,
51
64
  };
52
65
  };
66
+ /**
67
+ * Each client is reread when it is edited, so a concurrent change is never
68
+ * overwritten. A client that fails then still stops the remaining removals.
69
+ */
70
+ const removeAll = async (clients, purgeData, host) => {
71
+ const items = [];
72
+ for (const client of clients) {
73
+ const removed = await host.removeClient(client);
74
+ items.push(removed);
75
+ if (removed.status === "failed")
76
+ return [
77
+ ...items,
78
+ item("uninstall", "skipped", "Uninstall stopped at this failure; the items above report what changed. Repair the failed configuration, then rerun uninstall."),
79
+ ];
80
+ }
81
+ items.push(await host.removeSkill());
82
+ if (purgeData)
83
+ items.push(...(await host.purgeData()));
84
+ return items;
85
+ };
53
86
  /** Create uninstall effects contained to detected client configs and REA-owned paths. */
54
- export const systemUninstallHost = (home = homedir(), fileSystem = systemFileSystem) => ({
55
- clients: () => Promise.resolve(supportedClients(home)),
56
- removeClient: (client) => removeClient(client, fileSystem),
57
- removeSkill: () => removeManagedSkills(home, fileSystem),
58
- purgeData: async () => [
59
- await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
60
- await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
61
- ],
62
- });
63
- const removeClient = async (client, fileSystem) => {
87
+ export const systemUninstallHost = (selectedHome = undefined, fileSystem = systemFileSystem, environment = process.env, platform = process.platform) => {
88
+ const home = selectedHome ?? homeDirectoryFromEnvironment(environment, platform);
89
+ return {
90
+ clients: () => Promise.resolve(supportedClients(home, platform, environment)),
91
+ inspectClient: async (client) => {
92
+ const read = await readClientConfiguration(client, fileSystem);
93
+ return read.kind === "item" && read.item.status === "failed"
94
+ ? read.item
95
+ : undefined;
96
+ },
97
+ removeClient: (client) => removeClient(client, fileSystem),
98
+ removeSkill: () => removeManagedSkills(home, fileSystem),
99
+ purgeData: async () => [
100
+ await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
101
+ await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
102
+ ],
103
+ };
104
+ };
105
+ const readClientConfiguration = async (client, fileSystem) => {
64
106
  if (client.format === "unsupported")
65
- return item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
66
- "This client has no documented local MCP configuration boundary.");
107
+ return itemRead(item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
108
+ "This client has no documented local MCP configuration boundary."));
67
109
  const resolved = await resolveUninstallConfigPath(client, fileSystem);
68
110
  if (typeof resolved !== "string")
69
- return resolved;
111
+ return itemRead(resolved);
70
112
  const transactionPath = resolved;
71
113
  let original;
72
114
  try {
73
115
  original = await fileSystem.readText(transactionPath);
74
116
  }
75
117
  catch (cause) {
76
- return isMissing(cause)
118
+ return itemRead(isMissing(cause)
77
119
  ? item(client.name, "skipped", "Configuration does not exist.")
78
- : item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall.");
120
+ : item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall."));
79
121
  }
80
- let parsed;
81
122
  try {
82
- parsed = parseClientConfiguration(original, client.format);
123
+ const parsed = parseClientConfiguration(original, client.format);
124
+ return { kind: "configuration", transactionPath, original, parsed };
83
125
  }
84
126
  catch (cause) {
85
127
  void cause;
86
- return item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`);
128
+ return itemRead(item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`));
87
129
  }
130
+ };
131
+ const itemRead = (result) => ({
132
+ kind: "item",
133
+ item: result,
134
+ });
135
+ const removeClient = async (client, fileSystem) => {
136
+ const read = await readClientConfiguration(client, fileSystem);
137
+ if (read.kind === "item")
138
+ return read.item;
139
+ const { transactionPath, original, parsed } = read;
88
140
  const name = PRODUCT_IDENTITY.mcpServerKey;
89
141
  // Beside a native OpenCode V2 table, OpenCode also loads a V1 `mcp.rea`.
90
142
  const legacyPath = legacyClientServerPath(parsed, name);
@@ -109,8 +161,8 @@ const removeClient = async (client, fileSystem) => {
109
161
  await fileSystem.copy(transactionPath, backupPath);
110
162
  }
111
163
  catch (cause) {
112
- void cause;
113
- return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
164
+ if (!(cause instanceof Error && "code" in cause && cause.code === "EEXIST"))
165
+ return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
114
166
  }
115
167
  try {
116
168
  await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format, original, editedPaths));
@@ -21,9 +21,11 @@ const setupPlanSchema = z.object({
21
21
  })),
22
22
  });
23
23
  /** Discover owned registrations and an existing REA skill without writes. */
24
- export const existingMaintenanceScope = async (home, entryPoint) => {
25
- const registrations = await readClientRegistrationStatuses(home, entryPoint);
26
- const supported = supportedClients(home);
24
+ export const existingMaintenanceScope = async (home, entryPoint, environment) => {
25
+ const registrations = await readClientRegistrationStatuses(home, entryPoint, {
26
+ environment,
27
+ });
28
+ const supported = supportedClients(home, process.platform, environment);
27
29
  const clients = [];
28
30
  for (const registration of registrations) {
29
31
  if ((registration.state !== "aligned" && registration.state !== "stale") ||
@@ -56,9 +58,9 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
56
58
  return { clients, skill };
57
59
  };
58
60
  /** Ask the verified new executable to plan only existing REA integrations. */
59
- export const planIntegrationMaintenance = async (home, entryPoint, execute) => {
61
+ export const planIntegrationMaintenance = async (home, entryPoint, environment, execute) => {
60
62
  try {
61
- const scope = await existingMaintenanceScope(home, entryPoint);
63
+ const scope = await existingMaintenanceScope(home, entryPoint, environment);
62
64
  if (scope.clients.length === 0 && !scope.skill)
63
65
  return { status: "current", plannedActions: [] };
64
66
  const command = [
@@ -1,5 +1,5 @@
1
1
  import { realpath } from "node:fs/promises";
2
- import { homedir } from "node:os";
2
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
3
3
  import { basename, dirname, join, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import spawn from "cross-spawn";
@@ -9,13 +9,13 @@ import { safeParseJson } from "../domain/safeJson.js";
9
9
  import { updateInstallCommand, } from "./Update.js";
10
10
  import { planIntegrationMaintenance } from "./UpdateMaintenance.js";
11
11
  /** Run an updater subprocess with complete diagnostics and isolated machine output. */
12
- export const runUpdateCommand = (command, output = "structured") => new Promise((resolveResult) => {
12
+ export const runUpdateCommand = (command, selectedEnvironment, output = "structured") => new Promise((resolveResult) => {
13
13
  const [executable, ...args] = command;
14
14
  if (executable === undefined) {
15
15
  resolveResult(err("No executable supplied."));
16
16
  return;
17
17
  }
18
- const environment = { ...process.env };
18
+ const environment = { ...selectedEnvironment };
19
19
  // A fresh installed entry point must not inherit npx's invocation identity.
20
20
  delete environment.npm_command;
21
21
  const child = spawn(executable, args, {
@@ -46,8 +46,8 @@ export const runUpdateCommand = (command, output = "structured") => new Promise(
46
46
  ? `Process exited with code ${String(code)}.`
47
47
  : `Process terminated by ${signal}.`))));
48
48
  });
49
- const requireCommandOutput = async (command) => {
50
- const result = await runUpdateCommand(command);
49
+ const requireCommandOutput = async (command, environment) => {
50
+ const result = await runUpdateCommand(command, environment);
51
51
  if (!result.ok)
52
52
  throw new Error(result.error);
53
53
  return result.value;
@@ -130,21 +130,21 @@ export const npmReleaseLookup = (response) => {
130
130
  : err({ kind: "invalid-metadata", detail: parsed.error });
131
131
  };
132
132
  /** Create npm, registry, verification, and read-only maintenance effects. */
133
- export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home = homedir()) => ({
133
+ export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home = undefined, environment = process.env) => ({
134
134
  installation: () => detectNpmInstallation(packageRoot, {
135
135
  canonicalPath: realpath,
136
- globalRoot: () => requireCommandOutput(["npm", "root", "--global"]),
137
- globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"]),
136
+ globalRoot: () => requireCommandOutput(["npm", "root", "--global"], environment),
137
+ globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"], environment),
138
138
  }),
139
- latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation))),
139
+ latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation), environment)),
140
140
  installVersion: async (installation, version, output) => {
141
- const result = await runUpdateCommand(updateInstallCommand(installation, version), output);
141
+ const result = await runUpdateCommand(updateInstallCommand(installation, version), environment, output);
142
142
  return result.ok ? ok(undefined) : result;
143
143
  },
144
144
  installedVersion: (installation) => runUpdateCommand([
145
145
  process.execPath,
146
146
  join(installation.packageRoot, "scripts", "rea.mjs"),
147
147
  "--version",
148
- ]),
149
- planMaintenance: (installation) => planIntegrationMaintenance(home, join(installation.packageRoot, "scripts", "rea.mjs"), runUpdateCommand),
148
+ ], environment),
149
+ planMaintenance: (installation) => planIntegrationMaintenance(home ?? homeDirectoryFromEnvironment(environment, process.platform), join(installation.packageRoot, "scripts", "rea.mjs"), environment, (command) => runUpdateCommand(command, environment)),
150
150
  });
@@ -5,7 +5,7 @@ import { z } from "zod";
5
5
  import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
6
6
  import { publishWebScripts } from "../browser/assets/PublishWebScripts.js";
7
7
  import { selectScriptCapture } from "../browser/assets/ScriptCaptureAdapters.js";
8
- import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
8
+ import { AnalysisAccessDeniedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
9
9
  import { createEvidence } from "../domain/evidence.js";
10
10
  import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
11
11
  import { jsonValueSchema } from "../domain/jsonValue.js";
@@ -35,9 +35,10 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
35
35
  ]));
36
36
  try {
37
37
  options.signal?.throwIfAborted();
38
- const bytes = await readFile(input.capture_path, {
39
- signal: options.signal,
40
- });
38
+ const read = await readCapture(input.capture_path, options.signal);
39
+ if (!read.ok)
40
+ return read;
41
+ const bytes = read.value;
41
42
  const loaded = parseCapture(bytes);
42
43
  if (!loaded.ok)
43
44
  return loaded;
@@ -90,6 +91,31 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
90
91
  }));
91
92
  }
92
93
  };
94
+ /**
95
+ * Read the caller-selected capture. A missing, non-file or unreadable
96
+ * selection is a caller or host-permission failure, not an export failure.
97
+ */
98
+ const readCapture = async (path, signal) => {
99
+ try {
100
+ return ok(await readFile(path, { signal }));
101
+ }
102
+ catch (cause) {
103
+ const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
104
+ if (code === "EACCES" || code === "EPERM")
105
+ return err(new AnalysisAccessDeniedError(OPERATION, path, code, { cause }));
106
+ if (code === "ENOENT" || code === "ENOTDIR" || code === "EISDIR")
107
+ return err(new AnalysisInputError(OPERATION, { cause }, [
108
+ {
109
+ path: ["capture_path"],
110
+ reason: "invalid_value",
111
+ message: code === "EISDIR"
112
+ ? `Selected capture is a directory, not a file: ${path}`
113
+ : `Selected capture could not be read (${code}): ${path}`,
114
+ },
115
+ ]));
116
+ throw cause;
117
+ }
118
+ };
93
119
  const parseCapture = (bytes) => {
94
120
  try {
95
121
  const text = new TextDecoder("utf-8", {
@@ -1,6 +1,6 @@
1
1
  import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
2
2
  import { analysisProfileSchema, committedProviderSchema, } from "../domain/analysisProfile.js";
3
- import { createEvidence } from "../domain/evidence.js";
3
+ import { createEvidence, } from "../domain/evidence.js";
4
4
  import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
5
5
  /** Build the shared Evidence record for a successful composed binary workflow. */
6
6
  export const createWorkflowEvidence = (input) => createEvidence(input.target, REA_WORKFLOW_PROVIDER, {
@@ -14,10 +14,33 @@ export const createWorkflowEvidence = (input) => createEvidence(input.target, RE
14
14
  }),
15
15
  confidence: "derived",
16
16
  limitations: ["Derived by an REA composed workflow."],
17
+ ...(input.operation === "batch_decompile"
18
+ ? { locations: batchProcedureLocations(input.result) }
19
+ : {}),
17
20
  });
21
+ const batchProcedureLocations = (result) => {
22
+ if (result === null ||
23
+ typeof result !== "object" ||
24
+ Array.isArray(result) ||
25
+ !Array.isArray(result.items))
26
+ return [];
27
+ const addresses = new Set();
28
+ for (const item of result.items) {
29
+ if (item === null || typeof item !== "object" || Array.isArray(item))
30
+ continue;
31
+ const procedure = item.procedure;
32
+ if (procedure !== null &&
33
+ typeof procedure === "object" &&
34
+ !Array.isArray(procedure) &&
35
+ procedure.status === "resolved" &&
36
+ typeof procedure.address === "string")
37
+ addresses.add(procedure.address);
38
+ }
39
+ return [...addresses].map((address) => ({ kind: "address", address }));
40
+ };
18
41
  /** Convert workflow Evidence into its exact replay binding, when it has a profile. */
19
42
  export const workflowSnapshotRecord = (evidence, operation) => {
20
- if (!("analysis_profile" in evidence))
43
+ if (evidence.analysis_profile === null)
21
44
  return undefined;
22
45
  return {
23
46
  operation,
@@ -0,0 +1,45 @@
1
+ import { addressedValue } from "../contracts/toolOutputSchemaPrimitives.js";
2
+ import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
+ import { err, ok } from "../domain/result.js";
4
+ import { resolveProcedureAddress } from "./ProcedureAddressResolution.js";
5
+ /** Resolve a CLI symbol selector without changing existing address spellings. */
6
+ export const resolveXrefsAddress = async (analysis, selector, signal) => {
7
+ if (selector.length === 0 ||
8
+ /^[0-9a-f]+$/iu.test(selector) ||
9
+ /^0x/iu.test(selector) ||
10
+ /:0x/iu.test(selector))
11
+ return ok(selector);
12
+ const inventory = await analysis.execute("list_names", {}, { signal });
13
+ if (!inventory.ok) {
14
+ if (inventory.error instanceof AnalysisCapabilityUnavailableError &&
15
+ inventory.error.operation === "list_names" &&
16
+ !inventory.error.cleanupIncomplete)
17
+ return resolveProcedureAddress(async (operation, parameters, signal) => {
18
+ const result = await analysis.execute(operation, parameters, signal === undefined ? {} : { signal });
19
+ return result.ok ? ok(result.value.result) : result;
20
+ }, selector, signal);
21
+ return inventory;
22
+ }
23
+ if (!Array.isArray(inventory.value.result))
24
+ return err(new AnalysisOutputError("list_names", "Expected a symbol inventory array"));
25
+ const addresses = new Set();
26
+ for (const [index, item] of inventory.value.result.entries()) {
27
+ const parsed = addressedValue.safeParse(item);
28
+ if (!parsed.success || parsed.data.address.length === 0)
29
+ return err(new AnalysisOutputError("list_names", `Invalid symbol inventory entry at index ${index}`));
30
+ if (parsed.data.value === selector)
31
+ addresses.add(parsed.data.address);
32
+ }
33
+ const [address] = addresses;
34
+ if (addresses.size === 1 && address !== undefined)
35
+ return ok(address);
36
+ return err(new AnalysisInputError("xrefs", undefined, [
37
+ {
38
+ path: ["address"],
39
+ reason: "invalid_value",
40
+ message: addresses.size === 0
41
+ ? `Unknown analyzed symbol name ${JSON.stringify(selector)}. Use an exact analyzed name or a hexadecimal address.`
42
+ : `Analyzed symbol name ${JSON.stringify(selector)} is ambiguous at ${[...addresses].join(", ")}. Select an exact address.`,
43
+ },
44
+ ]));
45
+ };
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+ import { ANALYSIS_VIEW_PROVIDER } from "../InvestigationProviders.js";
3
+ import { resolveEvidenceInput } from "../EvidenceInputResolver.js";
4
+ import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
5
+ import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
6
+ import { createEvidence, parseEvidence, } from "../../domain/evidence.js";
7
+ import { INSPECT_ANALYSIS_VIEW_OPERATION, inspectAnalysisViewInputSchema, projectAnalysisView, } from "../../domain/analysisView/analysisView.js";
8
+ import { jsonValueSchema } from "../../domain/jsonValue.js";
9
+ import { err, ok } from "../../domain/result.js";
10
+ /** Authenticate a selected-view request and project already completed Evidence. */
11
+ export const inspectAnalysisView = (rawInput, lookup) => {
12
+ const parsed = inspectAnalysisViewInputSchema.safeParse(rawInput);
13
+ if (!parsed.success)
14
+ return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, parsed.error.issues, rawInput, { cause: parsed.error }));
15
+ return inspectAnalysisViewValidated(parsed.data, lookup);
16
+ };
17
+ /** Project a view from input already parsed by a trusted adapter. */
18
+ export const inspectAnalysisViewValidated = (input, lookup) => {
19
+ const resolved = resolveAnalysisViewSource(input.source, lookup);
20
+ if (!resolved.ok)
21
+ return resolved;
22
+ const parent = resolved.value;
23
+ const projected = projectAnalysisView({
24
+ evidenceId: parent.evidence_id,
25
+ operation: parent.operation,
26
+ normalizedResult: parent.normalized_result,
27
+ limitations: parent.limitations,
28
+ }, input.view);
29
+ if (!projected.ok)
30
+ return projected;
31
+ if (parent.subject !== null &&
32
+ parent.subject.digest.sha256 !== projected.value.artifact.sha256)
33
+ return err(new EvidenceIntegrityError(`Parent subject SHA-256 ${parent.subject.digest.sha256} differs from analysis artifact SHA-256 ${projected.value.artifact.sha256}.`));
34
+ return ok(createAnalysisViewEvidence(input, parent, projected.value));
35
+ };
36
+ const resolveAnalysisViewSource = (source, lookup) => {
37
+ if (source.kind === "retained-evidence")
38
+ return resolveEvidenceInput(source, lookup);
39
+ try {
40
+ return ok(parseEvidence(source.evidence));
41
+ }
42
+ catch (cause) {
43
+ if (cause instanceof z.ZodError)
44
+ return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues, source.evidence, { cause }));
45
+ if (cause instanceof TypeError)
46
+ return err(new EvidenceIntegrityError(cause.message, cause.message.length > 0 ? { userMessage: cause.message } : undefined));
47
+ throw cause;
48
+ }
49
+ };
50
+ const createAnalysisViewEvidence = (input, parent, result) => {
51
+ const target = parent.subject === null
52
+ ? undefined
53
+ : {
54
+ path: parent.subject.local_path,
55
+ sha256: parent.subject.digest.sha256,
56
+ format: parent.subject.format,
57
+ ...(parent.subject.architecture === null
58
+ ? {}
59
+ : { architecture: parent.subject.architecture }),
60
+ };
61
+ return createEvidence(target, ANALYSIS_VIEW_PROVIDER, {
62
+ predicateType: "rea.analysis-view",
63
+ operation: INSPECT_ANALYSIS_VIEW_OPERATION,
64
+ parameters: {
65
+ parent_evidence_id: parent.evidence_id,
66
+ view: jsonValueSchema.parse(input.view),
67
+ },
68
+ result: jsonValueSchema.parse(result),
69
+ rawResult: null,
70
+ confidence: "derived",
71
+ authority: parent.authority,
72
+ limitations: result.limitations,
73
+ locations: [{ kind: "artifact-path", path: result.artifact.path }],
74
+ evidenceLinks: [parent.evidence_id],
75
+ });
76
+ };
@@ -1,14 +1,39 @@
1
1
  import { ProviderCleanupError } from "../../domain/providerCleanupError.js";
2
- import { err, ok } from "../../domain/result.js";
2
+ import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
3
+ import { projectAnalysisError } from "../../domain/analysisErrorProjection.js";
4
+ import { err } from "../../domain/result.js";
5
+ import { AnalysisError } from "../../domain/analysisErrorBase.js";
3
6
  /** Close one provider client and normalize unexpected adapter rejection. */
4
7
  export const closeAnalysisClient = async (client, providerId, options = {}) => {
5
8
  try {
6
- if (client.closeWithOutcome !== undefined)
7
- return await client.closeWithOutcome(options);
8
- await client.close();
9
- return ok(null);
9
+ return await client.close(options);
10
10
  }
11
11
  catch (cause) {
12
+ // A typed cleanup failure already names its leftover resources.
13
+ if (cause instanceof AnalysisError && cause.cleanupIncomplete)
14
+ return err(cause);
12
15
  return err(new ProviderCleanupError(providerId, ["provider-client"], { reason: "provider client close rejected unexpectedly" }, { cause }));
13
16
  }
14
17
  };
18
+ /** Preserve the original lifecycle failure alongside incomplete cleanup. */
19
+ export const analysisErrorWithCleanupFailure = (primary, cleanup, operation = "close_binary") => {
20
+ const projected = projectAnalysisError(cleanup);
21
+ return new ProviderAdapterError(cleanup instanceof ProviderAdapterError ? cleanup.providerId : "rea", operation, {
22
+ cause: primary,
23
+ userMessage: projectAnalysisError(primary).message,
24
+ ...(primary.capturedOutput === undefined
25
+ ? {}
26
+ : { capturedOutput: primary.capturedOutput }),
27
+ ...(primary.partialObservation === undefined
28
+ ? {}
29
+ : { partialObservation: primary.partialObservation }),
30
+ cleanup: {
31
+ reason: projected.message,
32
+ resources: cleanup.cleanupResources,
33
+ },
34
+ diagnostics: {
35
+ primary_error: projectAnalysisError(primary),
36
+ cleanup_error: projected,
37
+ },
38
+ });
39
+ };
@@ -46,14 +46,13 @@ export const evaluateAnalysisProviderCandidate = async (candidate, status, targe
46
46
  if (resolved.value.profile === null)
47
47
  return ok(rejectedProfile(candidate, status, "Provider version or analysis profile could not be resolved"));
48
48
  const profile = analysisProfileSchema.parse(resolved.value.profile);
49
- const compatibility = jsonObjectSchema.parse(resolved.value.compatibility);
50
49
  const identity = candidate.identity();
51
50
  if (profile.provider.id !== identity.id ||
52
51
  profile.provider.name !== identity.name ||
53
52
  (identity.version !== null &&
54
53
  profile.provider.version !== identity.version))
55
54
  return ok(rejectedProfile(candidate, status, "Resolved analysis profile has mismatched provider identity"));
56
- return ok({ candidate, status, profile, compatibility });
55
+ return ok({ candidate, status, profile });
57
56
  }
58
57
  catch (cause) {
59
58
  void cause;
@@ -117,13 +117,11 @@ export class AnalysisProviderRegistry {
117
117
  if (evaluated.profileError !== undefined)
118
118
  return err(evaluated.profileError);
119
119
  const statuses = replaceCandidate(baseline, evaluated.status);
120
- if (evaluated.profile === undefined ||
121
- evaluated.compatibility === undefined)
120
+ if (evaluated.profile === undefined)
122
121
  return err(selectionError("provider_unavailable", providerId, statuses));
123
122
  return ok(selectedResult(providerId, source, {
124
123
  ...evaluated,
125
124
  profile: evaluated.profile,
126
- compatibility: evaluated.compatibility,
127
125
  }, statuses));
128
126
  }
129
127
  async #selectAutomatically(context) {
@@ -149,8 +147,7 @@ export class AnalysisProviderRegistry {
149
147
  return result.value;
150
148
  });
151
149
  const statuses = evaluations.map(({ status }) => status);
152
- const usable = evaluations.filter((evaluation) => evaluation.profile !== undefined &&
153
- evaluation.compatibility !== undefined);
150
+ const usable = evaluations.filter((evaluation) => evaluation.profile !== undefined);
154
151
  if (usable.length === 0)
155
152
  return ok({
156
153
  requestedProviderId: "auto",
@@ -195,7 +192,6 @@ const selectedResult = (requestedProviderId, source, evaluated, statuses) => {
195
192
  identity: structuredClone(evaluated.profile.provider),
196
193
  selectionSource: source,
197
194
  profile: structuredClone(evaluated.profile),
198
- compatibility: structuredClone(evaluated.compatibility),
199
195
  },
200
196
  candidates: replaceCandidate(statuses, selectedStatus),
201
197
  };