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,3 +1,4 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { randomUUID } from "node:crypto";
2
3
  import { open, readFile, writeFile } from "node:fs/promises";
3
4
  import { join } from "node:path";
@@ -5,19 +6,22 @@ import { fileURLToPath } from "node:url";
5
6
  import { z } from "zod";
6
7
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
7
8
  import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
9
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
8
10
  import { nativeCallEventSchema, nativeCodeLocationSchema, } from "../domain/native/nativeCallObservation.js";
9
11
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
12
+ import { ProviderCleanupError } from "../domain/providerCleanupError.js";
10
13
  import { err, ok } from "../domain/result.js";
11
14
  import { safeParseJson } from "../domain/safeJson.js";
12
15
  import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
13
16
  import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
14
- import { observeProcessStartIdentity, prepareProcessOwnershipInspection, signalProcessWithStartIdentity, } from "../process/ProcessOwnershipObservation.js";
17
+ import { observeProcessStartIdentity, signalProcessWithStartIdentity, } from "../process/ProcessOwnershipObservation.js";
15
18
  import { ProviderStartupDeadline, waitForAbortableDelay, } from "../process/ProviderDeadline.js";
16
19
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
17
20
  import { resolveXcrunTool } from "./CommandRunner.js";
18
21
  import { readLldbObservationJournal, readBoundedPrefix, readPartialCapture, projectLldbPartialObservation, } from "./LldbRetainedObservations.js";
19
22
  const OPERATION = "observe_native_calls";
20
23
  const PROVIDER = "native-macos";
24
+ const LLDB_REQUIREMENT = "LLDB from Xcode or the Command Line Tools is not available";
21
25
  /** Captured target output kept per stream; the rest is counted, not stored. */
22
26
  const MAX_OUTPUT_BYTES = 1024 * 1024;
23
27
  /** LLDB startup, symbol loading and teardown beyond the observation window. */
@@ -90,36 +94,148 @@ const ATTACH_REMEDIATION = "Allow debugging for this user (Developer Tools acces
90
94
  export class LldbCallTracer {
91
95
  launch;
92
96
  resolveTool;
93
- constructor(launch = runLldb, resolveTool = resolveXcrunTool) {
97
+ environment;
98
+ #tail = Promise.resolve();
99
+ #pendingCleanup;
100
+ constructor(environment, launch = runLldb, resolveTool = (tool, signal) => resolveXcrunTool(tool, this.environment, signal)) {
94
101
  this.launch = launch;
95
102
  this.resolveTool = resolveTool;
103
+ this.environment = snapshotEnvironment(environment);
96
104
  }
97
105
  async trace(request, signal) {
106
+ return this.#serialize(() => this.#trace(request, signal));
107
+ }
108
+ async #trace(request, signal) {
109
+ const pendingCleanup = await this.#retryPendingCleanup();
110
+ if (pendingCleanup !== undefined)
111
+ return err(pendingCleanup);
98
112
  const lldb = await this.resolveTool("lldb", signal);
99
113
  if (!lldb.ok)
100
114
  return err(lldb.error.reason === "cancelled"
101
115
  ? new AnalysisCancelledError(OPERATION)
102
- : new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, "LLDB from Xcode or the Command Line Tools is not available"));
116
+ : new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, LLDB_REQUIREMENT, { userMessage: LLDB_REQUIREMENT }));
103
117
  const root = await PrivateRuntimeRoot.create({ prefix: "rea-lldb-" });
118
+ const paths = lldbRuntimePaths(root.path);
119
+ let result;
104
120
  try {
105
- return await this.#run(lldb.value, root.path, request, signal);
121
+ result = await this.#run(lldb.value, root, request, signal);
106
122
  }
107
- finally {
123
+ catch (cause) {
124
+ const partialObservation = await partialNativeObservation({
125
+ request,
126
+ pidPath: paths.pid,
127
+ stdoutPath: paths.stdoutCapture,
128
+ stderrPath: paths.stderrCapture,
129
+ observationPath: paths.observations,
130
+ version: null,
131
+ reason: "tracer-failure",
132
+ });
133
+ const retained = this.#pendingCleanup;
134
+ const resources = retained === undefined ? [] : await lldbCleanupResources(retained);
135
+ result = err(new ProviderAdapterError(PROVIDER, OPERATION, {
136
+ cause,
137
+ diagnostics: {
138
+ reason: cause instanceof Error ? cause.message : String(cause),
139
+ },
140
+ partialObservation,
141
+ ...(retained === undefined
142
+ ? {}
143
+ : {
144
+ cleanup: {
145
+ reason: "LLDB trace failed while owned resources remain",
146
+ resources,
147
+ },
148
+ }),
149
+ }));
150
+ }
151
+ if (this.#pendingCleanup?.root === root)
152
+ return result;
153
+ try {
108
154
  await root.close();
109
155
  }
156
+ catch (cause) {
157
+ this.#pendingCleanup = {
158
+ root,
159
+ supervisor: undefined,
160
+ pidPath: paths.pid,
161
+ targetIdentity: undefined,
162
+ processStopped: true,
163
+ targetStopped: true,
164
+ };
165
+ const partialObservation = result.ok
166
+ ? partialObservationFromTrace(request, result.value)
167
+ : result.error.partialObservation;
168
+ return err(new ProviderCleanupError(PROVIDER, [root.path], {
169
+ reason: cause instanceof Error ? cause.message : String(cause),
170
+ ...(result.ok
171
+ ? {}
172
+ : {
173
+ execution_failure: projectAnalysisError(result.error).code,
174
+ primary_failure: result.error.message,
175
+ }),
176
+ }, {
177
+ operation: OPERATION,
178
+ cause: result.ok
179
+ ? cause
180
+ : new AggregateError([result.error, cause], "LLDB trace and runtime cleanup both failed"),
181
+ ...(partialObservation === undefined ? {} : { partialObservation }),
182
+ }));
183
+ }
184
+ return result;
110
185
  }
111
- async #run(lldb, directory, request, signal) {
112
- const paths = {
113
- config: join(directory, "config.json"),
114
- result: join(directory, "result.json"),
115
- pid: join(directory, "pid"),
116
- identityAck: join(directory, "identity.ack"),
117
- stdout: join(directory, "stdout"),
118
- stderr: join(directory, "stderr"),
119
- stdoutCapture: join(directory, "stdout.capture"),
120
- stderrCapture: join(directory, "stderr.capture"),
121
- observations: join(directory, "observations.jsonl"),
122
- };
186
+ /** Retry retained LLDB cleanup without abandoning its process or runtime owner. */
187
+ async close() {
188
+ return this.#serialize(() => this.#close());
189
+ }
190
+ async #close() {
191
+ const failure = await this.#retryPendingCleanup();
192
+ return failure === undefined ? ok(null) : err(failure);
193
+ }
194
+ #serialize(operation) {
195
+ const call = this.#tail.then(operation, operation);
196
+ this.#tail = call.then(() => undefined, () => undefined);
197
+ return call;
198
+ }
199
+ async #retryPendingCleanup() {
200
+ const owner = this.#pendingCleanup;
201
+ if (owner === undefined)
202
+ return undefined;
203
+ let firstFailure;
204
+ if (!owner.processStopped) {
205
+ const stopped = await owner.supervisor?.stop();
206
+ if (stopped?.status === "incomplete")
207
+ firstFailure = stopped.reason;
208
+ else {
209
+ owner.supervisor?.dispose();
210
+ owner.processStopped = true;
211
+ }
212
+ }
213
+ if (firstFailure === undefined && !owner.targetStopped) {
214
+ const targetTermination = await ensureTerminated(owner.pidPath, owner.targetIdentity, true);
215
+ if (targetTermination !== "terminated")
216
+ firstFailure = targetTerminationReason(targetTermination);
217
+ else
218
+ owner.targetStopped = true;
219
+ }
220
+ if (firstFailure === undefined) {
221
+ try {
222
+ await owner.root.close();
223
+ this.#pendingCleanup = undefined;
224
+ return undefined;
225
+ }
226
+ catch (cause) {
227
+ firstFailure = cause instanceof Error ? cause.message : String(cause);
228
+ }
229
+ }
230
+ const resources = await lldbCleanupResources(owner);
231
+ return new ProviderCleanupError(PROVIDER, resources, {
232
+ reason: firstFailure ?? "LLDB cleanup remains incomplete",
233
+ resources,
234
+ }, { operation: OPERATION });
235
+ }
236
+ async #run(lldb, root, request, signal) {
237
+ const directory = root.path;
238
+ const paths = lldbRuntimePaths(directory);
123
239
  const { input } = request;
124
240
  await writeFile(paths.config, JSON.stringify({
125
241
  executable: request.executable,
@@ -145,7 +261,6 @@ export class LldbCallTracer {
145
261
  identity_ack_path: paths.identityAck,
146
262
  observation_path: paths.observations,
147
263
  }), { mode: 0o600 });
148
- await prepareProcessOwnershipInspection(signal);
149
264
  const exited = await this.launch(lldb.path, [
150
265
  "--batch",
151
266
  "--no-lldbinit",
@@ -158,18 +273,33 @@ export class LldbCallTracer {
158
273
  deadlineMs: input.duration_ms + DEADLINE_GRACE_MS,
159
274
  pidPath: paths.pid,
160
275
  identityAckPath: paths.identityAck,
276
+ environment: this.environment,
161
277
  ...(signal === undefined ? {} : { signal }),
162
278
  });
279
+ const retained = {
280
+ root,
281
+ supervisor: exited.cleanupOwner,
282
+ pidPath: paths.pid,
283
+ targetIdentity: exited.targetIdentity,
284
+ processStopped: exited.cleanupOwner === undefined,
285
+ targetStopped: !exited.targetLaunched,
286
+ };
287
+ this.#pendingCleanup = retained;
163
288
  const output = exited.kind === "exited"
164
289
  ? await readTracerOutput(paths.result)
165
290
  : undefined;
166
- let targetTermination = await ensureTerminated(paths.pid, exited.targetIdentity, true);
291
+ let targetTermination = exited.targetLaunched
292
+ ? await ensureTerminated(paths.pid, exited.targetIdentity, true)
293
+ : "terminated";
167
294
  // These two bridge outcomes are emitted before a target process exists.
168
295
  // Other missing-PID cases, including a missing result, remain unknown.
169
296
  if (output !== undefined &&
170
297
  (output.status === "target-error" || output.status === "launch-error") &&
171
298
  (await readTargetPid(paths.pid)) === undefined)
172
299
  targetTermination = "terminated";
300
+ retained.targetStopped = targetTermination === "terminated";
301
+ if (retained.processStopped && retained.targetStopped)
302
+ this.#pendingCleanup = undefined;
173
303
  const terminated = targetTermination === "terminated";
174
304
  const cleanupDetails = [
175
305
  exited.cleanupFailure,
@@ -179,16 +309,7 @@ export class LldbCallTracer {
179
309
  ? undefined
180
310
  : {
181
311
  reason: cleanupDetails.join("; "),
182
- resources: [
183
- ...(exited.cleanupFailure === undefined
184
- ? []
185
- : ["lldb-process-group"]),
186
- ...(terminated
187
- ? []
188
- : [
189
- `native-target:${String((await readTargetPid(paths.pid)) ?? "unknown")}`,
190
- ]),
191
- ],
312
+ resources: await lldbCleanupResources(retained),
192
313
  };
193
314
  const partialReason = exited.kind === "cancelled"
194
315
  ? "cancelled"
@@ -223,18 +344,24 @@ export class LldbCallTracer {
223
344
  if (output !== undefined && output.status !== "traced")
224
345
  return err(tracerFailure(output, lifecycleCleanup, await getPartialObservation()));
225
346
  if (exited.cleanupFailure !== undefined)
226
- return err(new ProviderAdapterError(PROVIDER, OPERATION, {
227
- cleanup: lifecycleCleanup ?? {
228
- reason: exited.cleanupFailure,
229
- resources: ["lldb-process-group"],
230
- },
231
- diagnostics: {
232
- reason: "LLDB process-group cleanup could not be verified",
233
- cleanup_failure: exited.cleanupFailure,
234
- ...(lifecycleCleanup === undefined
235
- ? {}
236
- : { target_cleanup: lifecycleCleanup }),
237
- },
347
+ return err(new ProviderCleanupError(PROVIDER, await lldbCleanupResources(retained), {
348
+ reason: "LLDB process-group cleanup could not be verified",
349
+ cleanup_failure: exited.cleanupFailure,
350
+ ...(lifecycleCleanup === undefined
351
+ ? {}
352
+ : { target_cleanup: lifecycleCleanup }),
353
+ }, {
354
+ operation: OPERATION,
355
+ partialObservation: await getPartialObservation(),
356
+ }));
357
+ if (!terminated)
358
+ return err(new ProviderCleanupError(PROVIDER, await lldbCleanupResources(retained), {
359
+ reason: "LLDB target process termination could not be verified",
360
+ ...(lifecycleCleanup === undefined
361
+ ? {}
362
+ : { target_cleanup: lifecycleCleanup }),
363
+ }, {
364
+ operation: OPERATION,
238
365
  partialObservation: await getPartialObservation(),
239
366
  }));
240
367
  if (output === undefined)
@@ -340,6 +467,37 @@ const partialNativeObservation = async (options) => {
340
467
  reason: options.reason,
341
468
  });
342
469
  };
470
+ const partialObservationFromTrace = (request, trace) => projectLldbPartialObservation({
471
+ target: {
472
+ path: request.executable,
473
+ sha256: request.expectedSha256,
474
+ architecture: request.architecture,
475
+ arguments: request.input.arguments,
476
+ environment: request.input.environment,
477
+ working_directory: request.input.working_directory ?? null,
478
+ },
479
+ pid: trace.run.pid,
480
+ stdout: trace.stdout,
481
+ stderr: trace.stderr,
482
+ version: trace.run.version,
483
+ journal: {
484
+ events: trace.run.events,
485
+ otherStops: trace.run.other_stops,
486
+ limitations: [],
487
+ },
488
+ reason: "cleanup-failure",
489
+ });
490
+ const lldbRuntimePaths = (directory) => ({
491
+ config: join(directory, "config.json"),
492
+ result: join(directory, "result.json"),
493
+ pid: join(directory, "pid"),
494
+ identityAck: join(directory, "identity.ack"),
495
+ stdout: join(directory, "stdout"),
496
+ stderr: join(directory, "stderr"),
497
+ stdoutCapture: join(directory, "stdout.capture"),
498
+ stderrCapture: join(directory, "stderr.capture"),
499
+ observations: join(directory, "observations.jsonl"),
500
+ });
343
501
  const readTracerOutput = async (path) => {
344
502
  let text;
345
503
  try {
@@ -384,17 +542,43 @@ const capturedOutput = async (path, observedBytes, truncated, complete) => {
384
542
  return err(failure);
385
543
  }
386
544
  };
545
+ const lldbCleanupResources = async (owner) => [
546
+ ...(owner.processStopped ? [] : ["lldb-process-group"]),
547
+ ...(owner.targetStopped
548
+ ? []
549
+ : [
550
+ `native-target:${String((await readTargetPid(owner.pidPath)) ?? "unknown")}`,
551
+ ]),
552
+ owner.root.path,
553
+ ];
387
554
  /** Supervise LLDB as an owned process group while observing its target PID identity. */
388
555
  const runLldb = async (executable, arguments_, options) => {
389
556
  if (options.signal?.aborted === true)
390
557
  return {
391
558
  kind: "cancelled",
559
+ targetLaunched: false,
392
560
  targetIdentity: undefined,
393
561
  cleanupFailure: undefined,
394
562
  };
395
563
  const deadline = new ProviderStartupDeadline(options.deadlineMs, options.signal);
396
564
  let targetIdentity;
397
565
  let supervisor;
566
+ let retained = false;
567
+ const finish = async (outcome) => {
568
+ const stopped = await supervisor?.stop();
569
+ retained = stopped?.status === "incomplete";
570
+ return {
571
+ ...(deadline.interruption === undefined
572
+ ? outcome
573
+ : { kind: deadline.interruption }),
574
+ targetLaunched: supervisor !== undefined,
575
+ targetIdentity,
576
+ cleanupFailure: stopped?.status === "incomplete" ? stopped.reason : undefined,
577
+ ...(retained && supervisor !== undefined
578
+ ? { cleanupOwner: supervisor }
579
+ : {}),
580
+ };
581
+ };
398
582
  try {
399
583
  const launched = await spawnOwnedProviderProcess({
400
584
  command: executable,
@@ -402,6 +586,7 @@ const runLldb = async (executable, arguments_, options) => {
402
586
  runId: randomUUID(),
403
587
  expectedCommand: executable,
404
588
  signal: deadline.signal,
589
+ hostEnvironment: options.environment,
405
590
  });
406
591
  supervisor = new ProviderProcessSupervisor({
407
592
  ...launched,
@@ -425,49 +610,33 @@ const runLldb = async (executable, arguments_, options) => {
425
610
  identityAckWritten = true;
426
611
  }
427
612
  const interruption = deadline.interruption;
428
- if (interruption !== undefined) {
429
- const stopped = await supervisor.stop();
430
- const cleanupFailure = stopped.status === "incomplete" ? stopped.reason : undefined;
431
- return interruption === "cancelled"
432
- ? { kind: "cancelled", targetIdentity, cleanupFailure }
433
- : { kind: "timeout", targetIdentity, cleanupFailure };
434
- }
613
+ if (interruption !== undefined)
614
+ return await finish({ kind: interruption });
435
615
  await waitForAbortableDelay(20, deadline.signal);
436
616
  }
437
617
  const snapshot = supervisor.snapshot();
438
- const stopped = await supervisor.stop();
439
- const cleanupFailure = stopped.status === "incomplete" ? stopped.reason : undefined;
440
618
  const interruption = deadline.interruption;
441
- if (interruption === "cancelled")
442
- return { kind: "cancelled", targetIdentity, cleanupFailure };
443
- if (interruption === "timeout")
444
- return { kind: "timeout", targetIdentity, cleanupFailure };
445
- return {
446
- kind: "exited",
447
- exitCode: snapshot.exitCode ?? null,
448
- output: `${snapshot.stdout.text}${snapshot.stderr.text}`.slice(-DIAGNOSTIC_BYTES),
449
- targetIdentity,
450
- cleanupFailure,
451
- };
619
+ return await finish(interruption === undefined
620
+ ? {
621
+ kind: "exited",
622
+ exitCode: snapshot.exitCode ?? null,
623
+ output: `${snapshot.stdout.text}${snapshot.stderr.text}`.slice(-DIAGNOSTIC_BYTES),
624
+ }
625
+ : { kind: interruption });
452
626
  }
453
627
  catch (cause) {
454
628
  const interruption = deadline.interruption;
455
- const stopped = await supervisor?.stop();
456
- const cleanupFailure = stopped?.status === "incomplete" ? stopped.reason : undefined;
457
- return interruption === "timeout"
458
- ? { kind: "timeout", targetIdentity, cleanupFailure }
459
- : interruption === "cancelled"
460
- ? { kind: "cancelled", targetIdentity, cleanupFailure }
461
- : {
462
- kind: "exited",
463
- exitCode: null,
464
- output: cause instanceof Error ? cause.message : String(cause),
465
- targetIdentity,
466
- cleanupFailure,
467
- };
629
+ return await finish(interruption === undefined
630
+ ? {
631
+ kind: "exited",
632
+ exitCode: null,
633
+ output: cause instanceof Error ? cause.message : String(cause),
634
+ }
635
+ : { kind: interruption });
468
636
  }
469
637
  finally {
470
- supervisor?.dispose();
638
+ if (!retained)
639
+ supervisor?.dispose();
471
640
  deadline.dispose();
472
641
  }
473
642
  };
@@ -477,8 +646,11 @@ const runLldb = async (executable, arguments_, options) => {
477
646
  */
478
647
  const readTargetPid = async (pidPath) => {
479
648
  try {
480
- const pid = Number.parseInt(await readFile(pidPath, "utf8"), 10);
481
- return Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;
649
+ const contents = (await readFile(pidPath, "utf8")).trim();
650
+ if (!/^[1-9]\d*$/u.test(contents))
651
+ return undefined;
652
+ const pid = Number(contents);
653
+ return Number.isSafeInteger(pid) ? pid : undefined;
482
654
  }
483
655
  catch {
484
656
  return undefined;
@@ -1,5 +1,5 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { NATIVE_MACOS_PROVIDER_IDENTITY as IDENTITY, nativeMacOSCapabilities, } from "./NativeMacOSProviderMetadata.js";
2
- export { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
3
3
  import { inspectAppleDispatchMetadata } from "./AppleDispatchMetadata.js";
4
4
  import { observeNativeUi } from "./NativeUiObservation.js";
5
5
  import { LldbCallTracer } from "./LldbCallTracer.js";
@@ -9,6 +9,8 @@ import { open, realpath, stat } from "node:fs/promises";
9
9
  import { z } from "zod";
10
10
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
11
11
  import { NATIVE_TOOL_CONTRACTS, } from "../contracts/native/nativeToolContracts.js";
12
+ import { toolContract } from "../contracts/toolContracts.js";
13
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
12
14
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
13
15
  import { BinaryTargetError } from "../domain/configurationErrors.js";
14
16
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
@@ -27,11 +29,14 @@ import { architectureLocations, inspectNativeMacho, } from "./NativeMachoInspect
27
29
  /** Read-only semantic provider composed from Xcode command-line utilities. */
28
30
  export class NativeMacOSProvider {
29
31
  runner;
30
- tracer;
31
32
  #capabilities;
32
- constructor(runner = new XcrunCommandRunner(), platform = process.platform, tracer = new LldbCallTracer()) {
33
+ #environment;
34
+ #tracerFactory;
35
+ constructor(environment, runner = new XcrunCommandRunner(environment), platform = process.platform, tracerFactory) {
33
36
  this.runner = runner;
34
- this.tracer = tracer;
37
+ this.#environment = snapshotEnvironment(environment, platform);
38
+ this.#tracerFactory =
39
+ tracerFactory ?? (() => new LldbCallTracer(this.#environment));
35
40
  this.#capabilities = nativeMacOSCapabilities(platform);
36
41
  }
37
42
  identity() {
@@ -41,17 +46,19 @@ export class NativeMacOSProvider {
41
46
  return this.#capabilities;
42
47
  }
43
48
  createClient(target) {
44
- return new NativeMacOSClient(target, this.runner, this.tracer);
49
+ return new NativeMacOSClient(target, this.runner, this.#tracerFactory(), this.#environment);
45
50
  }
46
51
  }
47
52
  class NativeMacOSClient {
48
53
  target;
49
54
  runner;
50
55
  tracer;
51
- constructor(target, runner, tracer) {
56
+ environment;
57
+ constructor(target, runner, tracer, environment) {
52
58
  this.target = target;
53
59
  this.runner = runner;
54
60
  this.tracer = tracer;
61
+ this.environment = environment;
55
62
  }
56
63
  async execute(operation, parameters, options) {
57
64
  if (options?.signal?.aborted === true)
@@ -59,16 +66,15 @@ class NativeMacOSClient {
59
66
  if (operation === "health")
60
67
  return ok(createAnalysisExecution(null, IDENTITY));
61
68
  if (operation === "inspect_native_dispatch_metadata") {
69
+ const input = toolContract(operation).inputSchema.safeParse(parameters);
70
+ if (!input.success)
71
+ return err(analysisInputErrorFromIssues(operation, input.error.issues, parameters, {
72
+ cause: input.error,
73
+ }));
62
74
  if (this.target.kind !== "executable" || this.target.format !== "mach-o")
63
75
  return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Binary Apple metadata requires Mach-O; other providers can report symbol-only metadata"));
64
76
  try {
65
- const maxRecords = z
66
- .number()
67
- .int()
68
- .min(1)
69
- .max(20000)
70
- .parse(parameters.max_records ?? 5000);
71
- const result = await inspectAppleDispatchMetadata(this.target, maxRecords, options?.signal);
77
+ const result = await inspectAppleDispatchMetadata(this.target, input.data.max_records, options?.signal);
72
78
  return ok(createAnalysisExecution(result, result.provider, {
73
79
  locations: [{ kind: "artifact-path", path: this.target.path }],
74
80
  limitations: result.result.coverage.flatMap(({ reason }) => reason === null ? [] : [reason]),
@@ -102,6 +108,7 @@ class NativeMacOSClient {
102
108
  if (operation === "observe_native_ui" ||
103
109
  operation === "capture_native_ui_scenario") {
104
110
  const result = await observeNativeUi(this.target, operation, parameters, {
111
+ environment: this.environment,
105
112
  signal: options?.signal,
106
113
  });
107
114
  return result.ok
@@ -127,7 +134,7 @@ class NativeMacOSClient {
127
134
  }
128
135
  }
129
136
  close() {
130
- return Promise.resolve();
137
+ return this.tracer.close();
131
138
  }
132
139
  #dispatch(operation, parameters, signal) {
133
140
  switch (operation) {
@@ -148,6 +155,10 @@ class NativeMacOSClient {
148
155
  }
149
156
  }
150
157
  async #listArchitectures(signal) {
158
+ // lipo reads only Mach-O; its refusal of a PE, ELF, or plist target is not
159
+ // a tool failure that a retry or `rea doctor` could repair.
160
+ if (this.target.format !== "mach-o")
161
+ return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, "list_architectures", "Active artifact is not Mach-O."));
151
162
  const capture = await this.#run("list_architectures", "lipo", ["-detailed_info", this.target.path], { signal });
152
163
  if (!capture.ok)
153
164
  return capture;
@@ -424,8 +435,10 @@ const translateCommandFailure = (operation, failure) => {
424
435
  ...(capturedOutput === undefined ? {} : { capturedOutput }),
425
436
  ...(cleanup === undefined ? {} : { cleanup }),
426
437
  };
427
- if (failure.reason === "unavailable")
428
- return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun.`, errorOptions);
438
+ if (failure.reason === "unavailable") {
439
+ const reason = `${failure.tool} is unavailable through xcrun.`;
440
+ return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, reason, { ...errorOptions, userMessage: reason });
441
+ }
429
442
  if (failure.reason === "cancelled")
430
443
  return new AnalysisCancelledError(operation, errorOptions);
431
444
  if (failure.reason === "timeout")
@@ -513,8 +526,10 @@ const parseEntitlements = (output) => {
513
526
  */
514
527
  const unreadablePlist = (path, requested, reason) => {
515
528
  const sentence = reason.endsWith(".") ? reason : `${reason}.`;
529
+ // Name the default that is missing and the selection that still works.
530
+ const missingDefault = `The target has no readable Contents/Info.plist at ${path}: ${sentence} Select another plist in the target with the path input (CLI: --relative-path).`;
516
531
  return requested === undefined
517
- ? new AnalysisCapabilityUnavailableError(IDENTITY.id, "inspect_plist", `The target has no readable Contents/Info.plist at ${path}: ${sentence} Pass path to inspect another plist.`)
532
+ ? new AnalysisCapabilityUnavailableError(IDENTITY.id, "inspect_plist", missingDefault, { userMessage: missingDefault })
518
533
  : new AnalysisInputError("inspect_plist", undefined, [
519
534
  {
520
535
  path: ["path"],
@@ -5,7 +5,6 @@ export const NATIVE_MACOS_PROVIDER_IDENTITY = Object.freeze({
5
5
  name: "macOS native inspection utilities",
6
6
  version: null,
7
7
  });
8
- const IDENTITY = NATIVE_MACOS_PROVIDER_IDENTITY;
9
8
  /** Operations whose target process can show UI, use the network and write files. */
10
9
  const OWNED_PROCESS_OPERATIONS = new Set([
11
10
  "capture_native_ui_scenario",
@@ -26,7 +25,7 @@ export const nativeMacOSCapabilities = (platform = process.platform) => {
26
25
  reason: "Native macOS utilities require macOS.",
27
26
  };
28
27
  return Object.freeze({
29
- provider: IDENTITY,
28
+ provider: NATIVE_MACOS_PROVIDER_IDENTITY,
30
29
  operation: contract.name,
31
30
  ...availability,
32
31
  effects: Object.freeze({
@@ -1,12 +1,15 @@
1
- import { mkdtemp, rm, symlink } from "node:fs/promises";
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
+ import { mkdir, mkdtemp, rm, symlink } from "node:fs/promises";
2
3
  import { tmpdir } from "node:os";
3
4
  import { join } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
6
+ import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js";
5
7
  import { execFileOutput } from "../process/ExecFileOutput.js";
6
8
  import { safeParseJson } from "../domain/safeJson.js";
7
9
  import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js";
8
10
  /** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */
9
- export const createNativeUiHelperRuntime = () => {
11
+ export const createNativeUiHelperRuntime = (environment) => {
12
+ const selectedEnvironment = snapshotEnvironment(environment);
10
13
  let root;
11
14
  let executable;
12
15
  const invoke = async (parameters, signal) => {
@@ -15,6 +18,9 @@ export const createNativeUiHelperRuntime = () => {
15
18
  const output = join(root, "observer");
16
19
  const main = join(root, "main.swift");
17
20
  await symlink(fileURLToPath(new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url)), main);
21
+ // Keep swiftc's intermediate objects inside the removable root.
22
+ const compilerTemporary = join(root, "tmp");
23
+ await mkdir(compilerTemporary);
18
24
  await execFileOutput("/usr/bin/xcrun", [
19
25
  "swiftc",
20
26
  "-module-cache-path",
@@ -26,6 +32,8 @@ export const createNativeUiHelperRuntime = () => {
26
32
  ], {
27
33
  timeout: 60_000,
28
34
  maxBuffer: 1024 * 1024,
35
+ stopSignal: SWIFTC_INTERRUPT,
36
+ env: { ...selectedEnvironment, TMPDIR: compilerTemporary },
29
37
  ...(signal === undefined ? {} : { signal }),
30
38
  });
31
39
  executable = output;
@@ -33,6 +41,7 @@ export const createNativeUiHelperRuntime = () => {
33
41
  const output = await execFileOutput(executable, [JSON.stringify(parameters)], {
34
42
  timeout: 30_000,
35
43
  maxBuffer: NATIVE_UI_HELPER_MAX_BUFFER,
44
+ env: selectedEnvironment,
36
45
  ...(signal === undefined ? {} : { signal }),
37
46
  });
38
47
  const parsed = safeParseJson(output.stdout);
@@ -17,8 +17,8 @@ const responseSchema = z.discriminatedUnion("ok", [
17
17
  }),
18
18
  ]);
19
19
  /** Capture a selected existing app window and run explicitly selected scenarios. */
20
- export const observeNativeUi = async (target, operation, parameters, options = {}) => {
21
- const runtime = createNativeUiHelperRuntime();
20
+ export const observeNativeUi = async (target, operation, parameters, options) => {
21
+ const runtime = createNativeUiHelperRuntime(options.environment);
22
22
  try {
23
23
  return await observeWithHelper(target, operation, parameters, {
24
24
  ...options,