rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -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,
@@ -0,0 +1,155 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { lstat, mkdtemp, open, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { basename, join } from "node:path";
6
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
7
+ import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
8
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
9
+ import { err, ok } from "../domain/result.js";
10
+ import { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
11
+ const identity = (stat) => [stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
12
+ const changedTarget = (target, reason) => err(new AnalysisArtifactChangedError("inspect_signature", target.path, reason));
13
+ const signatureReadFailure = (target, cause) => {
14
+ if (cause instanceof AnalysisError)
15
+ return cause;
16
+ const code = cause instanceof Error && "code" in cause ? cause.code : undefined;
17
+ if (code === "EACCES" || code === "EPERM")
18
+ return new AnalysisAccessDeniedError("inspect_signature", target.path, code, { cause });
19
+ if (code === "ENOENT" || code === "ENOTDIR" || code === "ELOOP")
20
+ return new AnalysisArtifactChangedError("inspect_signature", target.path, `Registered signature target is no longer readable (${code}): ${target.path}`, { cause });
21
+ return new ProviderAdapterError(NATIVE_MACOS_PROVIDER_IDENTITY.id, "inspect_signature", {
22
+ cause,
23
+ diagnostics: {
24
+ path: target.path,
25
+ phase: "target-version-binding",
26
+ system_code: typeof code === "string" ? code : null,
27
+ reason: cause instanceof Error ? cause.message : String(cause),
28
+ },
29
+ });
30
+ };
31
+ /** Inspect a digest-verified private copy, releasing it on every exit path. */
32
+ export const withSignatureTarget = async (target, inspect, signal) => {
33
+ let directory;
34
+ try {
35
+ signal?.throwIfAborted();
36
+ directory = await mkdtemp(join(tmpdir(), "rea-signature-"));
37
+ }
38
+ catch (cause) {
39
+ return err(signal?.aborted
40
+ ? new AnalysisCancelledError("inspect_signature")
41
+ : snapshotFailure(target, "create", cause));
42
+ }
43
+ let result;
44
+ let cleanup;
45
+ try {
46
+ const binding = await bindSignatureTarget(target, join(directory, basename(target.path)), signal);
47
+ result = binding.ok ? await inspect(binding.value) : binding;
48
+ }
49
+ finally {
50
+ try {
51
+ await rm(directory, { recursive: true, force: true });
52
+ cleanup = ok(undefined);
53
+ }
54
+ catch (cause) {
55
+ cleanup = err(snapshotFailure(target, "cleanup", cause));
56
+ }
57
+ }
58
+ // Cleanup cannot replace the operation's original actionable failure.
59
+ return result.ok && !cleanup.ok ? cleanup : result;
60
+ };
61
+ const snapshotFailure = (target, phase, cause) => new ProviderAdapterError(NATIVE_MACOS_PROVIDER_IDENTITY.id, "inspect_signature", {
62
+ cause,
63
+ diagnostics: {
64
+ path: target.path,
65
+ phase: `signature-snapshot-${phase}`,
66
+ reason: cause instanceof Error ? cause.message : String(cause),
67
+ },
68
+ });
69
+ const snapshotIO = async (target, phase, operation) => {
70
+ try {
71
+ return await operation();
72
+ }
73
+ catch (cause) {
74
+ throw snapshotFailure(target, phase, cause);
75
+ }
76
+ };
77
+ const copySignatureBytes = async (target, source, snapshot, signal) => {
78
+ const size = Number(source.stat.size);
79
+ if (!Number.isSafeInteger(size))
80
+ throw new AnalysisResourceConstraintError("inspect_signature", "file-size", `Signature target size is not exactly representable: ${target.path}`, null);
81
+ const hash = createHash("sha256");
82
+ const chunk = Buffer.alloc(64 * 1024);
83
+ let position = 0;
84
+ while (position < size) {
85
+ signal?.throwIfAborted();
86
+ const { bytesRead } = await source.file.read(chunk, 0, Math.min(chunk.length, size - position), position);
87
+ signal?.throwIfAborted();
88
+ if (bytesRead === 0)
89
+ throw new AnalysisArtifactChangedError("inspect_signature", target.path, `Signature target was truncated while hashing: ${target.path}`);
90
+ const bytes = chunk.subarray(0, bytesRead);
91
+ hash.update(bytes);
92
+ // writeFile retries short writes; memory remains bounded to this chunk.
93
+ await snapshotIO(target, "write", () => snapshot.writeFile(bytes));
94
+ position += bytesRead;
95
+ }
96
+ return hash.digest("hex");
97
+ };
98
+ /** Hash and copy the same descriptor bytes, without reopening the mutable path. */
99
+ const bindSignatureTarget = async (target, snapshotPath, signal) => {
100
+ try {
101
+ signal?.throwIfAborted();
102
+ const before = await lstat(target.path, { bigint: true });
103
+ signal?.throwIfAborted();
104
+ if (!before.isFile() || before.isSymbolicLink())
105
+ return changedTarget(target, `Signature target is no longer a regular file: ${target.path}`);
106
+ const file = await open(target.path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
107
+ try {
108
+ const opened = await file.stat({ bigint: true });
109
+ signal?.throwIfAborted();
110
+ if (identity(opened) !== identity(before))
111
+ return changedTarget(target, `Signature target changed before open: ${target.path}`);
112
+ const snapshot = await snapshotIO(target, "create-file", () => open(snapshotPath, "wx", 0o600));
113
+ try {
114
+ const observed = await copySignatureBytes(target, { file, stat: opened }, snapshot, signal);
115
+ if (observed !== target.sha256)
116
+ return changedTarget(target, `Signature target digest changed: ${target.path}; expected ${target.sha256}, observed ${observed}`);
117
+ const after = await file.stat({ bigint: true });
118
+ const current = await lstat(target.path, { bigint: true });
119
+ signal?.throwIfAborted();
120
+ if (identity(after) !== identity(opened) ||
121
+ identity(current) !== identity(opened))
122
+ return changedTarget(target, `Signature target changed while establishing its version: ${target.path}`);
123
+ await snapshotIO(target, "seal", () => snapshot.chmod(0o400));
124
+ return ok({ identity: identity(opened), snapshotPath });
125
+ }
126
+ finally {
127
+ await snapshotIO(target, "close", () => snapshot.close());
128
+ }
129
+ }
130
+ finally {
131
+ await file.close();
132
+ }
133
+ }
134
+ catch (cause) {
135
+ return err(signal?.aborted
136
+ ? new AnalysisCancelledError("inspect_signature")
137
+ : signatureReadFailure(target, cause));
138
+ }
139
+ };
140
+ /** Reject target drift across signature command captures. */
141
+ export const verifySignatureTarget = async (target, binding, signal) => {
142
+ try {
143
+ signal?.throwIfAborted();
144
+ const current = await lstat(target.path, { bigint: true });
145
+ signal?.throwIfAborted();
146
+ return current.isFile() && identity(current) === binding.identity
147
+ ? ok(undefined)
148
+ : changedTarget(target, `Signature target changed during inspection: ${target.path}`);
149
+ }
150
+ catch (cause) {
151
+ return err(signal?.aborted
152
+ ? new AnalysisCancelledError("inspect_signature")
153
+ : signatureReadFailure(target, cause));
154
+ }
155
+ };
@@ -3,6 +3,9 @@ const architectureSchema = z.object({
3
3
  name: z.string().min(1),
4
4
  cpu_type: z.string().nullable(),
5
5
  cpu_subtype: z.string().nullable(),
6
+ cpu_type_code: z.number().int().nonnegative().nullable(),
7
+ cpu_subtype_code: z.number().int().nonnegative().nullable(),
8
+ capabilities: z.string().nullable(),
6
9
  file_offset: z.number().int().min(0).nullable(),
7
10
  size: z.number().int().min(0).nullable(),
8
11
  alignment: z.number().int().min(0).nullable(),
@@ -18,6 +21,9 @@ export const parseLipoArchitectures = (output) => {
18
21
  name: thinArchitecture,
19
22
  cpu_type: null,
20
23
  cpu_subtype: null,
24
+ cpu_type_code: null,
25
+ cpu_subtype_code: null,
26
+ capabilities: null,
21
27
  file_offset: null,
22
28
  size: null,
23
29
  alignment: null,
@@ -36,6 +42,9 @@ export const parseLipoArchitectures = (output) => {
36
42
  : name,
37
43
  cpu_type: current.cputype ?? null,
38
44
  cpu_subtype: current.cpusubtype ?? null,
45
+ cpu_type_code: cpuTypeCode(current.cputype),
46
+ cpu_subtype_code: cpuSubtypeCode(current.cpusubtype, current.capabilities),
47
+ capabilities: current.capabilities ?? null,
39
48
  file_offset: integer(current.offset),
40
49
  size: integer(current.size),
41
50
  alignment: alignment(current.align),
@@ -54,7 +63,7 @@ export const parseLipoArchitectures = (output) => {
54
63
  current = { architecture: line.slice("architecture ".length).trim() };
55
64
  continue;
56
65
  }
57
- const match = /^(cputype|cpusubtype|offset|size|align)\s+(.+)$/u.exec(line);
66
+ const match = /^(cputype|cpusubtype|capabilities|offset|size|align)\s+(.+)$/u.exec(line);
58
67
  if (match?.[1] !== undefined && match[2] !== undefined) {
59
68
  current ??= {};
60
69
  current[match[1]] = match[2].trim();
@@ -71,6 +80,67 @@ const integer = (value) => {
71
80
  const parsed = Number.parseInt(value, 10);
72
81
  return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;
73
82
  };
83
+ const CPU_TYPES = {
84
+ CPU_TYPE_X86: 7,
85
+ CPU_TYPE_X86_64: 0x01000007,
86
+ CPU_TYPE_ARM: 12,
87
+ CPU_TYPE_ARM64: 0x0100000c,
88
+ CPU_TYPE_ARM64_32: 0x0200000c,
89
+ CPU_TYPE_POWERPC: 18,
90
+ CPU_TYPE_POWERPC64: 0x01000012,
91
+ };
92
+ const CPU_SUBTYPES = {
93
+ CPU_SUBTYPE_X86_ALL: 3,
94
+ CPU_SUBTYPE_X86_64_ALL: 3,
95
+ CPU_SUBTYPE_X86_64_H: 8,
96
+ CPU_SUBTYPE_ARM64_ALL: 0,
97
+ CPU_SUBTYPE_ARM64_V8: 1,
98
+ CPU_SUBTYPE_ARM64E: 2,
99
+ CPU_SUBTYPE_ARM64_32_ALL: 0,
100
+ CPU_SUBTYPE_ARM64_32_V8: 1,
101
+ CPU_SUBTYPE_ARM_V7: 9,
102
+ CPU_SUBTYPE_ARM_V7S: 11,
103
+ CPU_SUBTYPE_ARM_V7K: 12,
104
+ CPU_SUBTYPE_POWERPC_ALL: 0,
105
+ CPU_SUBTYPE_POWERPC_970: 100,
106
+ };
107
+ /** Normalize known lipo names while retaining the producer's original text. */
108
+ const cpuTypeCode = (value) => {
109
+ if (value === undefined)
110
+ return null;
111
+ const numeric = unsigned32(value);
112
+ return numeric ?? CPU_TYPES[value] ?? null;
113
+ };
114
+ /** Normalize the subtype and its separately printed ptrauth capability bits. */
115
+ const cpuSubtypeCode = (value, capabilities) => {
116
+ if (value === undefined)
117
+ return null;
118
+ const numeric = unsigned32(value);
119
+ if (numeric !== null)
120
+ return numeric;
121
+ const subtype = CPU_SUBTYPES[value];
122
+ if (subtype === undefined)
123
+ return null;
124
+ if (value !== "CPU_SUBTYPE_ARM64E")
125
+ return subtype;
126
+ const version = /PTR_AUTH_VERSION\s+USERSPACE\s+(\d+)/u.exec(capabilities ?? "")?.[1];
127
+ if (version === undefined)
128
+ return null;
129
+ const parsedVersion = Number(version);
130
+ if (!Number.isInteger(parsedVersion) ||
131
+ parsedVersion < 0 ||
132
+ parsedVersion > 15)
133
+ return null;
134
+ return (0x80000000 | (parsedVersion << 24) | subtype) >>> 0;
135
+ };
136
+ const unsigned32 = (value) => {
137
+ if (!/^(?:\d+|0x[\da-f]+)$/iu.test(value))
138
+ return null;
139
+ const parsed = Number(value);
140
+ return Number.isInteger(parsed) && parsed >= 0 && parsed <= 0xffffffff
141
+ ? parsed >>> 0
142
+ : null;
143
+ };
74
144
  const alignment = (value) => {
75
145
  if (value === undefined)
76
146
  return null;
@@ -28,7 +28,7 @@ const replySchema = z.discriminatedUnion("ok", [
28
28
  }),
29
29
  ]);
30
30
  /** Add mapping candidates from an owned core-only debugger, using the existing snapshot. */
31
- export const inspectPwndbgCore = async ({ environment, rootPath, diagnostics, options, launcher, }) => {
31
+ export const inspectPwndbgCore = async ({ environment, rootPath, diagnostics, options, launcher, probePath, }) => {
32
32
  const gdb = environment.REA_PWNDBG_GDB ?? "/usr/bin/gdb";
33
33
  const entry = environment.REA_PWNDBG_GDBINIT ?? "";
34
34
  const venv = environment.REA_PWNDBG_VENV_PATH ?? "";
@@ -37,23 +37,43 @@ export const inspectPwndbgCore = async ({ environment, rootPath, diagnostics, op
37
37
  userMessage: message,
38
38
  capturedOutput: diagnostics,
39
39
  });
40
+ const checkCancelled = () => {
41
+ if (options?.signal?.aborted)
42
+ throw new AnalysisCancelledError(OPERATION, {
43
+ capturedOutput: diagnostics,
44
+ });
45
+ };
46
+ checkCancelled();
40
47
  for (const [key, path, kind] of [
41
48
  ["REA_PWNDBG_GDB", gdb, "file"],
42
49
  ["REA_PWNDBG_GDBINIT", entry, "file"],
43
50
  ["REA_PWNDBG_VENV_PATH", venv, "directory"],
44
51
  ]) {
45
52
  try {
53
+ checkCancelled();
46
54
  if (!isAbsolute(path))
47
55
  throw new Error("Expected an absolute caller-supplied path.");
48
- await access(path, key === "REA_PWNDBG_GDB" ? constants.X_OK : constants.R_OK);
49
- const information = await stat(path);
50
- if (kind === "file" ? !information.isFile() : !information.isDirectory())
51
- throw new Error(`Expected a ${kind}.`);
56
+ const mode = key === "REA_PWNDBG_GDB" ? constants.X_OK : constants.R_OK;
57
+ if (probePath !== undefined) {
58
+ await probePath(path, kind, mode);
59
+ }
60
+ else {
61
+ await access(path, mode);
62
+ checkCancelled();
63
+ const information = await stat(path);
64
+ checkCancelled();
65
+ if (kind === "file" ? !information.isFile() : !information.isDirectory())
66
+ throw new Error(`Expected a ${kind}.`);
67
+ }
68
+ checkCancelled();
52
69
  }
53
70
  catch (cause) {
71
+ if (options?.signal?.aborted)
72
+ checkCancelled();
54
73
  throw unavailable(`${key} is unavailable at ${path}: ${cause instanceof Error ? cause.message : String(cause)}. Configure the requested core-only context, or omit include_debugger_context for basic recorded evidence.`, cause);
55
74
  }
56
75
  }
76
+ checkCancelled();
57
77
  const stage = join(rootPath, "debugger");
58
78
  await mkdir(stage, { mode: 0o700 });
59
79
  const requestPath = join(stage, "request.json");
@@ -16,6 +16,7 @@ import { OwnedCommandFailure } from "../../process/OwnedCommand.js";
16
16
  import { pwntoolsResourceLimitsSchema, readPwntoolsFailureEvidence, } from "./PwntoolsResourceLimits.js";
17
17
  import { PrivateRuntimeRoot } from "../../process/PrivateRuntimeRoot.js";
18
18
  import { PWNTOOLS_PROVIDER_IDENTITY, PWNTOOLS_LIMITS, } from "./PwntoolsRelease.js";
19
+ const HOST_REQUIREMENT = "The initial real-verified pwntools artifact profile supports Linux x64 only.";
19
20
  /** Thin owned-process adapter; all ELF parsing and heuristics come from unchanged upstream code. */
20
21
  export class PwntoolsDecoder {
21
22
  profile;
@@ -64,7 +65,7 @@ export class PwntoolsDecoder {
64
65
  if (options?.signal?.aborted)
65
66
  throw new AnalysisCancelledError(OPERATION);
66
67
  if (process.platform !== "linux" || process.arch !== "x64")
67
- throw new AnalysisCapabilityUnavailableError(this.identity.id, OPERATION, "The initial real-verified pwntools artifact profile supports Linux x64 only.");
68
+ throw new AnalysisCapabilityUnavailableError(this.identity.id, OPERATION, HOST_REQUIREMENT, { userMessage: HOST_REQUIREMENT });
68
69
  if (!isAbsolute(selectedPath))
69
70
  throw pwntoolsUnavailable("Set REA_PWNTOOLS_PYTHON to an absolute caller-supplied Python executable with pwntools 4.15.0, pyelftools 0.33 and Unicorn 2.1.2; REA never installs Python or packages.", selectedPath, undefined, undefined, context);
70
71
  await access(selectedPath, constants.X_OK);
@@ -60,6 +60,8 @@ export function validateRecordedCrashStructure(report, snapshot, diagnostics) {
60
60
  if (!header
61
61
  .subarray(0, 6)
62
62
  .equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46, 2, 1])) ||
63
+ header[6] !== 1 ||
64
+ header.readUInt32LE(20) !== 1 ||
63
65
  ![0, 3].includes(header[7] ?? -1) ||
64
66
  header[8] !== 0 ||
65
67
  header.readUInt16LE(16) !== 4 ||
@@ -1,4 +1,4 @@
1
- import { mkdtemp, rm } from "node:fs/promises";
1
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
2
2
  import { rmSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
@@ -42,6 +42,12 @@ const sourceFiles = [
42
42
  fileURLToPath(new URL("../../bridge/process/ProcessRunTokenReader.swift", import.meta.url)),
43
43
  fileURLToPath(new URL("../../bridge/process/ProcessRunTokenReaderMain.swift", import.meta.url)),
44
44
  ];
45
+ /**
46
+ * swift-driver runs each frontend job in its own process group. On SIGINT it
47
+ * stops those jobs and deletes their objects before exiting; on SIGTERM it
48
+ * exits while a job can still write objects under TMPDIR.
49
+ */
50
+ export const SWIFTC_INTERRUPT = "SIGINT";
45
51
  /** The native Darwin process-ownership reader could not be prepared. */
46
52
  export class DarwinProcessOwnershipInspectionError extends Error {
47
53
  constructor(message, options) {
@@ -114,18 +120,23 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
114
120
  if (signal.aborted || closed)
115
121
  throw abortReason(signal);
116
122
  const output = join(operationRoot, "reader");
123
+ // swiftc keeps intermediate objects under TMPDIR, so keep them inside
124
+ // the root that cleanup removes.
125
+ const compilerTemporary = join(operationRoot, "tmp");
126
+ await mkdir(compilerTemporary);
127
+ const compilerEnvironment = {
128
+ ...process.env,
129
+ TMPDIR: compilerTemporary,
130
+ };
131
+ // Use Swift's reusable default cache for REA's internal helper compilation.
132
+ delete compilerEnvironment.CLANG_MODULE_CACHE_PATH;
117
133
  try {
118
- await execFileOutput(options.xcrun ?? "/usr/bin/xcrun", [
119
- "swiftc",
120
- "-module-cache-path",
121
- join(operationRoot, "modules"),
122
- ...sourceFiles,
123
- "-o",
124
- output,
125
- ], {
134
+ await execFileOutput(options.xcrun ?? "/usr/bin/xcrun", ["swiftc", ...sourceFiles, "-o", output], {
126
135
  timeout: 60_000,
127
136
  maxBuffer: 1024 * 1024,
128
137
  signal,
138
+ stopSignal: SWIFTC_INTERRUPT,
139
+ env: compilerEnvironment,
129
140
  });
130
141
  }
131
142
  catch (cause) {
@@ -134,7 +145,9 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
134
145
  const code = cause instanceof Error && "code" in cause
135
146
  ? String(cause.code)
136
147
  : "unknown";
137
- throw new DarwinProcessOwnershipInspectionError(`macOS process ownership inspection requires the Apple Swift compiler via xcrun (compiler result: ${code})`, { cause });
148
+ throw new DarwinProcessOwnershipInspectionError(code === "ENOENT"
149
+ ? `macOS process ownership inspection requires the Apple Swift compiler via xcrun (compiler result: ${code})`
150
+ : `macOS process ownership helper compilation failed via xcrun (compiler result: ${code}): ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
138
151
  }
139
152
  if (signal.aborted || closed)
140
153
  throw abortReason(signal);
@@ -1,17 +1,119 @@
1
1
  import { execFile, } from "node:child_process";
2
+ /** How long a stopped process may take to exit before it is killed. */
3
+ const STOP_GRACE_MS = 5_000;
4
+ const abortError = (signal) => {
5
+ const error = new Error("The operation was aborted", {
6
+ cause: signal.reason,
7
+ });
8
+ error.name = "AbortError";
9
+ Reflect.set(error, "code", "ABORT_ERR");
10
+ return error;
11
+ };
12
+ /**
13
+ * A command stopped at its timeout can still exit cleanly, so the timeout is
14
+ * the failure. Like Node's execFile timeout, it reports `killed: true`.
15
+ */
16
+ const timeoutError = (command, timeout, exit) => {
17
+ const error = new Error(`Command timed out after ${String(timeout)} ms: ${command}`, exit === null ? undefined : { cause: exit });
18
+ Reflect.set(error, "code", "ETIMEDOUT");
19
+ Reflect.set(error, "killed", true);
20
+ Reflect.set(error, "signal", exit === null ? null : (Reflect.get(exit, "signal") ?? null));
21
+ return error;
22
+ };
23
+ /**
24
+ * The `timeout` contract for both modes, checked before spawning. A stoppable
25
+ * command keeps its own deadline, so execFile never validates it. Node 26's
26
+ * execFile also caps it at Number.MAX_SAFE_INTEGER; Node 22 and 24 accept
27
+ * larger integers, which their timers then clamp to 1 ms.
28
+ */
29
+ const invalidTimeout = (timeout) => {
30
+ if (Number.isSafeInteger(timeout) && timeout >= 0)
31
+ return undefined;
32
+ const error = new RangeError(`The value of "timeout" is out of range. It must be an unsigned integer. Received ${String(timeout)}`);
33
+ Reflect.set(error, "code", "ERR_OUT_OF_RANGE");
34
+ return error;
35
+ };
36
+ /** Read captured output metadata from a failed execFileOutput invocation. */
37
+ export const execFileOutputFailure = (cause) => {
38
+ if (!(cause instanceof Error))
39
+ return undefined;
40
+ const stdout = Reflect.get(cause, "stdout");
41
+ const stderr = Reflect.get(cause, "stderr");
42
+ const code = Reflect.get(cause, "code");
43
+ const signal = Reflect.get(cause, "signal");
44
+ const killed = Reflect.get(cause, "killed");
45
+ if (typeof stdout !== "string" || typeof stderr !== "string")
46
+ return undefined;
47
+ return {
48
+ stdout,
49
+ stderr,
50
+ code: typeof code === "string" || typeof code === "number" ? code : null,
51
+ signal: typeof signal === "string" ? signal : null,
52
+ killed: killed === true,
53
+ outputTruncated: code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER",
54
+ };
55
+ };
2
56
  /** Run a shell-free command while capturing its complete UTF-8 output. */
3
57
  export const execFileOutput = (command, arguments_, options = {}) => new Promise((resolve, reject) => {
4
- execFile(command, [...arguments_], {
5
- ...options,
58
+ const { stopSignal, signal, timeout, ...execOptions } = options;
59
+ const invalid = timeout === undefined ? undefined : invalidTimeout(timeout);
60
+ if (invalid !== undefined) {
61
+ reject(invalid);
62
+ return;
63
+ }
64
+ if (stopSignal !== undefined && signal?.aborted === true) {
65
+ reject(abortError(signal));
66
+ return;
67
+ }
68
+ let stopped;
69
+ let deadline;
70
+ let grace;
71
+ const child = execFile(command, [...arguments_], {
72
+ ...execOptions,
73
+ // A stoppable command's abort and timeout are handled below, because
74
+ // execFile neither waits for the exit on abort nor kills a process
75
+ // that ignores its timeout signal.
76
+ ...(stopSignal === undefined
77
+ ? {
78
+ ...(signal === undefined ? {} : { signal }),
79
+ ...(timeout === undefined ? {} : { timeout }),
80
+ }
81
+ : { killSignal: stopSignal }),
6
82
  encoding: "utf8",
7
83
  maxBuffer: options.maxBuffer ?? Number.POSITIVE_INFINITY,
8
84
  }, (error, stdout, stderr) => {
9
- if (error !== null) {
10
- Reflect.set(error, "stdout", stdout);
11
- Reflect.set(error, "stderr", stderr);
12
- reject(error);
85
+ signal?.removeEventListener("abort", onAbort);
86
+ clearTimeout(deadline);
87
+ clearTimeout(grace);
88
+ const failure = stopped === "abort" && signal !== undefined
89
+ ? abortError(signal)
90
+ : stopped === "timeout" && timeout !== undefined
91
+ ? timeoutError(command, timeout, error)
92
+ : error;
93
+ if (failure !== null) {
94
+ Reflect.set(failure, "stdout", stdout);
95
+ Reflect.set(failure, "stderr", stderr);
96
+ reject(failure);
13
97
  return;
14
98
  }
15
99
  resolve({ stdout, stderr });
16
100
  });
101
+ // The first stop request names the failure; a later one is not resent.
102
+ const stop = (reason) => {
103
+ if (stopped !== undefined)
104
+ return;
105
+ stopped = reason;
106
+ child.kill(stopSignal);
107
+ grace = setTimeout(() => child.kill("SIGKILL"), STOP_GRACE_MS);
108
+ };
109
+ const onAbort = () => {
110
+ stop("abort");
111
+ };
112
+ if (stopSignal === undefined)
113
+ return;
114
+ signal?.addEventListener("abort", onAbort, { once: true });
115
+ if (timeout !== undefined && timeout > 0)
116
+ deadline = setTimeout(() => {
117
+ stop("timeout");
118
+ }, timeout);
17
119
  });
@@ -83,9 +83,14 @@ const collectOwnedCommand = async (spawn, limits, launcher, deadline, callerSign
83
83
  : "Command deadline elapsed.", snapshot);
84
84
  if (exceeded)
85
85
  throw new OwnedCommandFailure("output-limit", "Command diagnostic output exceeded its complete-output budget.", snapshot);
86
+ const acceptedNonzeroExit = limits.acceptNonZeroExit === true &&
87
+ snapshot.exitCode !== null &&
88
+ snapshot.exitCode !== undefined &&
89
+ snapshot.exitCode !== 0 &&
90
+ snapshot.signal === null;
86
91
  if (processFailure !== undefined ||
87
- snapshot.exitCode !== 0 ||
88
- snapshot.signal !== null)
92
+ ((snapshot.exitCode !== 0 || snapshot.signal !== null) &&
93
+ !acceptedNonzeroExit))
89
94
  throw new OwnedCommandFailure("process", processFailure ??
90
95
  "Command failed; inspect its exit status and diagnostics.", snapshot);
91
96
  }
@@ -50,12 +50,17 @@ export class PrivateRuntimeRoot {
50
50
  throw cause;
51
51
  }
52
52
  }
53
- /** Remove the runtime root; concurrent and repeated callers share cleanup. */
53
+ /**
54
+ * Remove the runtime root; concurrent callers share one attempt. A failed
55
+ * attempt is not cached, so a later close retries the removal.
56
+ */
54
57
  close() {
55
- this.#closePromise ??=
56
- this.windowsRuntime === undefined
57
- ? rm(this.path, { recursive: true, force: true })
58
- : Promise.resolve().then(() => this.windowsRuntime?.close());
58
+ this.#closePromise ??= (this.windowsRuntime === undefined
59
+ ? rm(this.path, { recursive: true, force: true })
60
+ : Promise.resolve().then(() => this.windowsRuntime?.close())).catch((cause) => {
61
+ this.#closePromise = undefined;
62
+ throw cause;
63
+ });
59
64
  return this.#closePromise;
60
65
  }
61
66
  }