rea-agents 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,13 +1,14 @@
1
1
  import { constants } from "node:fs";
2
- import { access, readFile, readdir } from "node:fs/promises";
3
- import { homedir } from "node:os";
4
- import { delimiter, join } from "node:path";
2
+ import { access, readdir } from "node:fs/promises";
3
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
4
+ import { join } from "node:path";
5
5
  import { analysisErrorRemediationAction } from "../domain/analysisErrorPresentation.js";
6
+ import { BinaryTargetError } from "../domain/configurationErrors.js";
6
7
  import { parseBinaryTarget } from "./BinaryTargetResolver.js";
7
8
  import { execFileOutput } from "../process/ExecFileOutput.js";
8
- import { probeHomebrew } from "./homebrew.js";
9
+ import { installedCaskAppdir, probeHomebrew } from "./homebrew.js";
9
10
  import { linuxHopperBinarySupported, linuxSharedLibrariesAvailable, readLinuxDistribution, } from "./LinuxHopper.js";
10
- import { canonicalSkillNeedsInstall } from "./SetupSkill.js";
11
+ import { claudeCodeSkillsDirectory, readInstalledSkillIdentity, } from "./SetupSkill.js";
11
12
  import { CATALOG_IDENTITY } from "../catalogIdentity.js";
12
13
  import { PRODUCT_IDENTITY, SDK_IDENTITY } from "../identity.js";
13
14
  import { readClientRegistrationStatuses, } from "./ClientRegistrationStatus.js";
@@ -21,8 +22,9 @@ export const DOCTOR_PROVIDER_IDS = ["hopper", "ghidra", "ida"];
21
22
  * or an agent consuming the structured result.
22
23
  */
23
24
  export const runDoctor = async (target, host = systemDoctorHost(), requestedScope) => {
25
+ const scope = normalizeDoctorScope(requestedScope, target);
24
26
  const { checks: diagnosticChecks, hopperPath, providerInspections, } = await collectDoctorDiagnostics(target, host);
25
- const identity = await collectDoctorIdentity(host);
27
+ const identity = await collectDoctorIdentity(host, scope);
26
28
  const checks = [...diagnosticChecks, ...identity.checks];
27
29
  const providers = {
28
30
  hopperAvailable: hopperPath !== undefined &&
@@ -33,7 +35,6 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
33
35
  providerInspections,
34
36
  };
35
37
  const environmentHealthy = doctorHealthy(checks, providers);
36
- const scope = normalizeDoctorScope(requestedScope, target);
37
38
  const scoped = scopeDoctorChecks({
38
39
  checks,
39
40
  registrations: identity.value.registrations,
@@ -53,11 +54,14 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
53
54
  identity: identity.value,
54
55
  };
55
56
  };
56
- const collectDoctorIdentity = async (host) => {
57
+ const collectDoctorIdentity = async (host, scope) => {
57
58
  const installationPaths = (await host.installationPaths?.()) ?? [];
58
- const installedSkillIdentity = await host.installedSkillIdentity?.();
59
- const skillAligned = skillIdentityAligned(installedSkillIdentity);
60
59
  const registrations = (await host.clientRegistrations?.()) ?? [];
60
+ const skillClientIds = scope.mode === "audit-wide"
61
+ ? registrations.map(({ client }) => client)
62
+ : scope.clients;
63
+ const installedSkillIdentity = await host.installedSkillIdentity?.(skillClientIds);
64
+ const skillAligned = skillIdentityAligned(installedSkillIdentity);
61
65
  return {
62
66
  checks: [
63
67
  ...(skillAligned ? [] : [skillIdentityCheck(installedSkillIdentity)]),
@@ -81,7 +85,6 @@ const collectDoctorIdentity = async (host) => {
81
85
  skill: {
82
86
  installed_version: installedSkillIdentity?.version ?? null,
83
87
  installed_tool_count: installedSkillIdentity?.toolCount ?? null,
84
- installed_catalog_digest: installedSkillIdentity?.catalogDigest ?? null,
85
88
  state: installedSkillIdentity === undefined
86
89
  ? "missing"
87
90
  : skillAligned
@@ -115,23 +118,13 @@ const registrationCheck = (registration) => ({
115
118
  remediation: registration.remediation,
116
119
  });
117
120
  const installationState = (paths) => paths.length === 0 ? "unknown" : paths.length === 1 ? "single" : "multiple";
118
- const homeFromEnvironment = (environment, platform) => {
119
- const selected = platform === "win32"
120
- ? (environment.USERPROFILE ??
121
- (environment.HOMEDRIVE !== undefined &&
122
- environment.HOMEPATH !== undefined
123
- ? `${environment.HOMEDRIVE}${environment.HOMEPATH}`
124
- : environment.HOME))
125
- : (environment.HOME ?? environment.USERPROFILE);
126
- return selected ?? homedir();
127
- };
128
121
  /** Create diagnostics backed by the current process and host commands. */
129
122
  export const systemDoctorHost = (options = {}) => {
130
123
  const platform = options.platform ?? process.platform;
131
124
  const architecture = options.architecture ?? process.arch;
132
125
  const environment = options.environment ?? process.env;
133
126
  const hostExecFileOutput = options.execFileOutput ?? execFileOutput;
134
- const homeDirectory = homeFromEnvironment(environment, platform);
127
+ const homeDirectory = homeDirectoryFromEnvironment(environment, platform);
135
128
  const commandEnvironment = { env: environment };
136
129
  return {
137
130
  platform,
@@ -147,10 +140,16 @@ export const systemDoctorHost = (options = {}) => {
147
140
  macosVersion: () => readMacosVersion(hostExecFileOutput, commandEnvironment),
148
141
  linuxDistribution: readLinuxDistribution,
149
142
  async validTarget(path) {
150
- return (await parseBinaryTarget(path, process.cwd(), architecture)).ok;
143
+ return (await parseBinaryTarget(path, {
144
+ cwd: process.cwd(),
145
+ hostArchitecture: architecture,
146
+ })).ok;
151
147
  },
152
148
  async inspectTarget(path) {
153
- const result = await parseBinaryTarget(path, process.cwd(), architecture);
149
+ const result = await parseBinaryTarget(path, {
150
+ cwd: process.cwd(),
151
+ hostArchitecture: architecture,
152
+ });
154
153
  if (result.ok)
155
154
  return {
156
155
  name: "target",
@@ -159,18 +158,19 @@ export const systemDoctorHost = (options = {}) => {
159
158
  detail: path,
160
159
  };
161
160
  const error = result.error;
161
+ const targetError = error instanceof BinaryTargetError ? error : undefined;
162
162
  return {
163
163
  name: "target",
164
164
  ok: false,
165
- classification: error.constraint === "directory_requires_file"
165
+ classification: targetError?.constraint === "directory_requires_file"
166
166
  ? "unsupported_target"
167
167
  : "config_drift",
168
168
  detail: path,
169
169
  details: {
170
- reason: error.reason,
171
- ...(error.constraint === undefined
170
+ reason: targetError?.reason ?? error.message,
171
+ ...(targetError?.constraint === undefined
172
172
  ? {}
173
- : { constraint: error.constraint }),
173
+ : { constraint: targetError.constraint }),
174
174
  },
175
175
  remediation: analysisErrorRemediationAction(error),
176
176
  };
@@ -180,15 +180,21 @@ export const systemDoctorHost = (options = {}) => {
180
180
  supportedLinuxHopper: linuxHopperBinarySupported,
181
181
  async brewHopperPath() {
182
182
  return probeHomebrew(async (command) => {
183
+ let caskroom;
183
184
  try {
184
- const prefix = (await hostExecFileOutput(command, ["--prefix", "--cask", "hopper-disassembler"], commandEnvironment)).stdout.trim();
185
- return `${prefix}/Hopper Disassembler.app/Contents/MacOS/hopper`;
185
+ // Without a cask argument, `--caskroom` does not load Homebrew's
186
+ // cask API, so doctor writes no Homebrew cache files.
187
+ caskroom = (await hostExecFileOutput(command, ["--caskroom"], commandEnvironment)).stdout.trim();
186
188
  }
187
189
  catch (cause) {
188
190
  // best-effort cleanup: optional Homebrew probing; absence means uninstalled.
189
191
  void cause;
190
192
  return undefined;
191
193
  }
194
+ const appdir = await installedCaskAppdir(caskroom, "hopper-disassembler", homeDirectory);
195
+ return appdir === undefined
196
+ ? undefined
197
+ : join(appdir, "Hopper Disassembler.app/Contents/MacOS/hopper");
192
198
  });
193
199
  },
194
200
  manualHopperPaths: () => manualHopperPaths(homeDirectory),
@@ -222,14 +228,14 @@ export const systemDoctorHost = (options = {}) => {
222
228
  return [];
223
229
  }
224
230
  },
225
- installedSkillIdentity: () => installedSkillIdentity(homeDirectory),
231
+ installedSkillIdentity: (clientIds) => readInstalledSkillIdentity(homeDirectory, clientIds, claudeCodeSkillsDirectory(homeDirectory, environment)),
226
232
  clientRegistrations: () => readClientRegistrationStatuses(homeDirectory, undefined, {
227
233
  platform,
228
234
  environment,
229
235
  }),
230
236
  };
231
237
  };
232
- const readMacosVersion = async (run = execFileOutput, options = { env: process.env }) => {
238
+ const readMacosVersion = async (run, options) => {
233
239
  try {
234
240
  return (await run("sw_vers", ["-productVersion"], options)).stdout.trim();
235
241
  }
@@ -239,7 +245,7 @@ const readMacosVersion = async (run = execFileOutput, options = { env: process.e
239
245
  return undefined;
240
246
  }
241
247
  };
242
- const executableAvailable = async (path, platform = process.platform, run = execFileOutput, options = { env: process.env }) => {
248
+ const executableAvailable = async (path, platform, run, options) => {
243
249
  try {
244
250
  await access(path, constants.X_OK);
245
251
  if (platform !== "linux")
@@ -260,7 +266,7 @@ const uncomposedLinuxDemoRuntimeCheck = () => Promise.resolve({
260
266
  detail: "Linux Hopper private-display diagnostics were not composed",
261
267
  remediation: "Run rea doctor through the production CLI adapter.",
262
268
  });
263
- const manualHopperPaths = async (home = homedir()) => {
269
+ const manualHopperPaths = async (home) => {
264
270
  const paths = [];
265
271
  for (const root of ["/Applications", join(home, "Applications")]) {
266
272
  try {
@@ -276,25 +282,6 @@ const manualHopperPaths = async (home = homedir()) => {
276
282
  }
277
283
  return paths;
278
284
  };
279
- const readInstalledSkill = (home) => readFile(join(home, ".agents/skills", PRODUCT_IDENTITY.skillName, "SKILL.md"), "utf8");
280
- const installedSkillIdentity = async (home) => {
281
- try {
282
- const content = await readInstalledSkill(home);
283
- const countText = /^\s{2}tool_count:\s*(\d+)\s*$/mu.exec(content)?.[1];
284
- return {
285
- canonical: !(await canonicalSkillNeedsInstall(home)),
286
- version: /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(content)?.[1] ?? null,
287
- toolCount: countText === undefined ? null : Number.parseInt(countText, 10),
288
- catalogDigest: /^\s{2}catalog_digest:\s*"([a-f0-9]{64})"\s*$/mu.exec(content)?.[1] ??
289
- null,
290
- };
291
- }
292
- catch (cause) {
293
- // best-effort cleanup: optional skill probing; failure means unknown.
294
- void cause;
295
- return undefined;
296
- }
297
- };
298
285
  const uniqueLines = (value) => [
299
286
  ...new Set(value
300
287
  .split(/\r?\n/u)
@@ -1,4 +1,3 @@
1
- import { homedir } from "node:os";
2
1
  import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
3
2
  import { linuxHopperLauncherPath } from "./LinuxHopper.js";
4
3
  const DEFAULT_HOPPER = "/Applications/Hopper Disassembler.app/Contents/MacOS/hopper";
@@ -66,7 +65,7 @@ const hostCheck = async (host) => {
66
65
  ? `${host.platform} ${host.architecture}`
67
66
  : `${linuxDistribution.id} ${linuxDistribution.versionId ?? "unknown"}`);
68
67
  return check("host", supported, detail, {
69
- remediation: "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, CachyOS, and the experimental Windows x64 Ghidra P0 boundary.",
68
+ remediation: "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, Nobara 44+, 64-bit Arch Linux, CachyOS, and the experimental Windows x64 Ghidra P0 boundary.",
70
69
  classification: "unsupported_host",
71
70
  });
72
71
  };
@@ -75,7 +74,7 @@ const findHopper = async (host) => {
75
74
  ? [
76
75
  DEFAULT_HOPPER,
77
76
  SYSTEM_LINUX_HOPPER,
78
- linuxHopperLauncherPath(host.homeDirectory ?? homedir()),
77
+ linuxHopperLauncherPath(host.homeDirectory),
79
78
  ...(await host.manualHopperPaths()),
80
79
  ]
81
80
  : [host.configuredHopperPath];
@@ -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,20 +8,22 @@ 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
- export const ARTIFACT_GRAPH_PROVIDER = {
16
+ export const ARTIFACT_GRAPH_PROVIDER = Object.freeze({
15
17
  id: "rea-artifact-graph",
16
18
  name: "REA safe artifact graph provider",
17
19
  version: "1",
18
- };
20
+ });
19
21
  /** Provider identity for execution-free managed PE/CLI analysis. */
20
- export const MANAGED_STATIC_PROVIDER = {
22
+ export const MANAGED_STATIC_PROVIDER = Object.freeze({
21
23
  id: "rea-dotnet-static",
22
24
  name: "REA managed static analysis provider",
23
25
  version: "1",
24
- };
26
+ });
25
27
  /** Provider identity for deterministic managed-code comparison workflows. */
26
28
  export const MANAGED_WORKFLOW_PROVIDER = {
27
29
  id: "rea-dotnet-workflows",
@@ -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,30 +1,31 @@
1
- import { link, lstat, mkdtemp, open, readFile, realpath, rename, rm, } from "node:fs/promises";
1
+ import { link, lstat, mkdtemp, open, 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, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
4
5
  import { err, ok } from "../domain/result.js";
6
+ import { parseUtf8Json } from "./Utf8JsonInput.js";
7
+ import { readRegularFile } from "./RegularFileRead.js";
8
+ import { NonRegularFileReadError } from "../filesystem/RegularFile.js";
5
9
  /** Read JSON data from a regular file at the caller-supplied path. */
6
10
  export const readJsonFile = async (path) => {
7
11
  const requestedPath = resolve(path);
8
12
  try {
9
- const canonicalPath = await realpath(requestedPath);
10
- const stats = await lstat(canonicalPath);
11
- if (!stats.isFile())
12
- return err(new EvidenceFileError("read", "not-file", { path: requestedPath }));
13
- const encoded = await readFile(canonicalPath);
14
- let decoded;
15
- try {
16
- decoded = JSON.parse(new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(encoded));
17
- }
18
- catch (cause) {
13
+ const encoded = await readRegularFile(requestedPath);
14
+ const decoded = parseUtf8Json(encoded, "read_evidence_file", requestedPath);
15
+ if (!decoded.ok) {
19
16
  return err(new EvidenceFileError("read", "invalid-json", {
20
- cause,
17
+ cause: decoded.cause,
21
18
  path: requestedPath,
22
19
  }));
23
20
  }
24
- return ok(decoded);
21
+ return ok(decoded.value);
25
22
  }
26
23
  catch (cause) {
27
- return err(new EvidenceFileError("read", missingOrIo(cause), {
24
+ if (cause instanceof AnalysisResourceConstraintError)
25
+ return err(cause);
26
+ return err(new EvidenceFileError("read", cause instanceof NonRegularFileReadError
27
+ ? "not-file"
28
+ : missingOrIo(cause), {
28
29
  cause,
29
30
  path: requestedPath,
30
31
  }));
@@ -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;
@@ -63,7 +63,8 @@ export const parseLinuxDistribution = (text) => {
63
63
  (id === "arch" ||
64
64
  id === "cachyos" ||
65
65
  (id === "ubuntu" && versionAtLeast(versionId, 24)) ||
66
- (id === "fedora" && versionAtLeast(versionId, 41)));
66
+ (id === "fedora" && versionAtLeast(versionId, 41)) ||
67
+ (id === "nobara" && versionAtLeast(versionId, 44)));
67
68
  const identity = {
68
69
  id,
69
70
  ...(versionId === undefined ? {} : { versionId }),
@@ -84,7 +85,7 @@ export const readLinuxDistribution = async () => {
84
85
  }
85
86
  };
86
87
  /** Download, verify, install, and read back the official Hopper Linux package. */
87
- export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(), options = {}) => {
88
+ export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(process.env), options = {}) => {
88
89
  if (options.signal?.aborted === true)
89
90
  return { status: "failed", reason: "cancelled" };
90
91
  const distribution = await host.distribution();
@@ -124,7 +125,8 @@ export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(),
124
125
  };
125
126
  /** Canonical launcher path for a legacy user-local Linux Hopper installation. */
126
127
  export const linuxHopperLauncherPath = (home) => join(home, ".local/share/rea/hopper/bin/Hopper");
127
- const systemLinuxHopperInstallHost = () => ({
128
+ /** Compose package-manager and linker checks from the selected caller environment. */
129
+ export const systemLinuxHopperInstallHost = (environment) => ({
128
130
  distribution: readLinuxDistribution,
129
131
  async download(url, options) {
130
132
  const response = await fetch(url, {
@@ -138,11 +140,11 @@ const systemLinuxHopperInstallHost = () => ({
138
140
  },
139
141
  createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-")),
140
142
  writeArchive: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
141
- installPackage: installSystemPackage,
143
+ installPackage: (family, archive) => installSystemPackage(family, archive, environment),
142
144
  async launcherStatus(path) {
143
145
  try {
144
146
  await access(path);
145
- const linked = await execFileOutput("ldd", [path]);
147
+ const linked = await execFileOutput("ldd", [path], { env: environment });
146
148
  if (!linuxSharedLibrariesAvailable(`${linked.stdout}\n${linked.stderr}`))
147
149
  return "runtime_dependencies";
148
150
  return (await linuxHopperBinarySupported(path))
@@ -175,10 +177,12 @@ export const linuxHopperBinarySupported = async (path) => {
175
177
  export const linuxHopperLauncherDigestSupported = (digest) => SUPPORTED_HOPPER_SHA256.has(digest);
176
178
  /** Interpret ldd output conservatively so a present but broken launcher is unhealthy. */
177
179
  export const linuxSharedLibrariesAvailable = (output) => !/(?:=>\s+not found|error while loading shared libraries)/iu.test(output);
178
- const installSystemPackage = async (family, archive) => {
180
+ const installSystemPackage = async (family, archive, environment) => {
179
181
  try {
180
182
  for (const command of linuxPackageManagerCommands(family, archive, process.getuid?.() === 0))
181
- await execFileAsync(command.executable, command.args);
183
+ await execFileAsync(command.executable, command.args, {
184
+ env: environment,
185
+ });
182
186
  return true;
183
187
  }
184
188
  catch (cause) {