rea-agents 6.3.0 → 6.4.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 (487) hide show
  1. package/README.md +7 -4
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -8,12 +8,57 @@ import { snapshotRoots } from "./FilesystemSnapshot.js";
8
8
  import { TerminalRenderer } from "./TerminalRenderer.js";
9
9
  import { normalizeProcessText } from "./ProcessNormalization.js";
10
10
  import { selectCapturedProcessGroupIds } from "../ProcessOwnershipProcessTree.js";
11
- import { awaitTerminalExit, buildCaptureResult, cleanupReportFailure, captureTerminalFrames, createProcessCaptureObservationBuffer, createRunManifest, observeLaunchedExecutable, observeSelectedExecutable, observeSettlement, prepareProcessCapture, releaseProcessResources, resolveProcessResult, settleProcessCaptureJournal, } from "./ProcessCaptureLifecycle.js";
11
+ import { awaitTerminalExit, buildCaptureResult, cleanupReportFailure, captureTerminalFrames, createProcessCaptureObservationBuffer, createRunManifest, observeLaunchedExecutable, observeSelectedExecutable, observeSettlement, prepareProcessCapture, releaseProcessResources, resolveProcessResult, settleProcessCaptureJournal, describeUnverifiedCause, ProcessCaptureResourceScope, } from "./ProcessCaptureLifecycle.js";
12
12
  import { assertNotCancelled, resolveProcessScenarioRuntimePaths, } from "./ProcessScenarioRuntimeValidation.js";
13
13
  import { createProcessCaptureJournal, scheduleScenarioInteractions, } from "./ProcessCaptureJournal.js";
14
14
  import { makeProcessCaptureEnvironment } from "./ProcessCaptureEnvironment.js";
15
15
  import { classifyFilesystemEffects } from "./ProcessFilesystemEffects.js";
16
16
  import { processCaptureOwnershipUnavailableReason } from "./ProcessCaptureCapability.js";
17
+ import { createProcessCaptureProgressTracker, } from "./ProcessCaptureProgress.js";
18
+ import { observeProcessStartIdentity, signalProcessWithStartIdentity, } from "../ProcessOwnershipObservation.js";
19
+ /** Bind the captured root's initial identity to its run token before retaining it. */
20
+ export const retainRootSignaller = (pid, finalizationMs, runId, host = {
21
+ observe: (rootPid) => observeProcessStartIdentity(rootPid, undefined, runId),
22
+ signal: signalProcessWithStartIdentity,
23
+ }) => {
24
+ const retained = finalizationMs > 0
25
+ ? host.observe(pid).then((observation) => observation === undefined
26
+ ? { state: "gone" }
27
+ : observation.state === "readable"
28
+ ? {
29
+ state: "identity",
30
+ identity: observation.identity,
31
+ }
32
+ : {
33
+ state: "unverified",
34
+ reason: observation.reason.trim() === ""
35
+ ? "start identity is unavailable without a diagnostic"
36
+ : observation.reason,
37
+ }, (cause) => ({
38
+ state: "unverified",
39
+ reason: describeUnverifiedCause(cause, "start identity inspection failed without a message"),
40
+ }))
41
+ : undefined;
42
+ return async (signal) => {
43
+ const identity = await retained;
44
+ if (identity === undefined)
45
+ return {
46
+ delivery: "unverified",
47
+ reason: "root identity was not retained",
48
+ };
49
+ if (identity.state === "unverified")
50
+ return { delivery: "unverified", reason: identity.reason };
51
+ if (identity.state === "gone")
52
+ return { delivery: "gone" };
53
+ const delivery = await host.signal(pid, identity.identity, signal);
54
+ return delivery === "unverified"
55
+ ? {
56
+ delivery,
57
+ reason: "start identity could not be verified or the signal call failed",
58
+ }
59
+ : { delivery };
60
+ };
61
+ };
17
62
  const cleanupFailedStartup = async (options) => {
18
63
  const sampledProcessGroupIds = options.terminal !== undefined &&
19
64
  options.observations?.process_samples.state === "available"
@@ -33,7 +78,7 @@ const cleanupFailedStartup = async (options) => {
33
78
  };
34
79
  }
35
80
  }
36
- const cleanupFailure = await releaseProcessResources({
81
+ const cleanupOptions = {
37
82
  timers: options.timers,
38
83
  terminal: options.terminal,
39
84
  renderer: options.renderer,
@@ -42,9 +87,13 @@ const cleanupFailedStartup = async (options) => {
42
87
  ...(sampledProcessGroupIds === undefined ? {} : { sampledProcessGroupIds }),
43
88
  temporaryRoot: options.temporaryRoot,
44
89
  ...(options.cleanupHost === undefined ? {} : { host: options.cleanupHost }),
45
- });
46
- if (cleanupReportFailure(cleanupFailure) !== undefined) {
47
- resolveProcessResult(undefined, options.cause, cleanupFailure, options.observations, {
90
+ };
91
+ const cleanup = options.resourceScope === undefined
92
+ ? await releaseProcessResources(cleanupOptions)
93
+ : await options.resourceScope.release(cleanupOptions);
94
+ const cleanupFailure = cleanupReportFailure(cleanup);
95
+ if (cleanupFailure !== undefined) {
96
+ resolveProcessResult(undefined, options.cause, cleanup, options.observations, {
48
97
  scenario: options.scenario,
49
98
  ...(options.terminal === undefined
50
99
  ? {}
@@ -115,6 +164,7 @@ const startCaptureRuntime = async (options) => {
115
164
  lastOutput: () => lastOutput,
116
165
  rawTerminalRetention,
117
166
  stopSampler,
167
+ signalRoot: retainRootSignaller(terminal.pid, scenario.finalization_ms, options.runId, options.finalizationHost),
118
168
  };
119
169
  }
120
170
  catch (cause) {
@@ -131,15 +181,19 @@ const startCaptureRuntime = async (options) => {
131
181
  : { cleanupHost: options.cleanupHost }),
132
182
  observations: options.observationBuffer,
133
183
  temporaryRoot: options.temporaryRoot,
184
+ ...(options.resourceScope === undefined
185
+ ? {}
186
+ : { resourceScope: options.resourceScope }),
134
187
  });
135
188
  }
136
189
  };
137
190
  const finishProcessRun = async (options) => {
191
+ options.progress.closeLive();
138
192
  await options.stopSampler();
139
193
  const sampledProcessGroupIds = options.runtime === undefined
140
194
  ? undefined
141
195
  : selectCapturedProcessGroupIds(options.runtime.terminal.pid, options.samples).filter((groupId) => groupId !== options.runtime?.terminal.pid);
142
- const cleanup = await releaseProcessResources({
196
+ const cleanupOptions = {
143
197
  timers: options.timers,
144
198
  terminal: options.runtime?.terminal,
145
199
  renderer: options.runtime?.renderer,
@@ -148,6 +202,19 @@ const finishProcessRun = async (options) => {
148
202
  ...(sampledProcessGroupIds === undefined ? {} : { sampledProcessGroupIds }),
149
203
  temporaryRoot: options.temporaryRoot,
150
204
  ...(options.cleanupHost === undefined ? {} : { host: options.cleanupHost }),
205
+ };
206
+ const cleanup = options.resourceScope === undefined
207
+ ? await releaseProcessResources(cleanupOptions)
208
+ : await options.resourceScope.release(cleanupOptions);
209
+ const observedExit = options.observations?.exit.state === "available"
210
+ ? options.observations.exit.value.reason
211
+ : options.capture?.exit.reason;
212
+ await options.progress.report({
213
+ phase: "cleanup",
214
+ counts: options.progressCounts(),
215
+ terminal: true,
216
+ disposition: captureProgressDisposition(observedExit, options.executionFailure),
217
+ cleanup,
151
218
  });
152
219
  const cleanupFailure = cleanupReportFailure(cleanup);
153
220
  let { capture, executionFailure } = options;
@@ -185,7 +252,7 @@ const completeCapture = async (options) => {
185
252
  throw processCaptureCancelled();
186
253
  let settlement;
187
254
  try {
188
- settlement = await observeSettlement(options.runId, selectCapturedProcessGroupIds(runtime.terminal.pid, options.samples), scenario.settle_ms, options.recordEvent, options.hostPlatform, options.signal);
255
+ settlement = await observeSettlement(options.runId, selectCapturedProcessGroupIds(runtime.terminal.pid, options.samples), scenario.settle_ms, options.recordEvent, options.hostPlatform, options.signal, options.onLiveProgress);
189
256
  }
190
257
  catch (cause) {
191
258
  options.observationBuffer.settlement = {
@@ -291,12 +358,56 @@ const completeCapture = async (options) => {
291
358
  eventJournal: options.eventJournal,
292
359
  });
293
360
  };
361
+ const captureProgressDisposition = (exitReason, executionFailure) => {
362
+ if (exitReason === "exited" ||
363
+ exitReason === "timeout" ||
364
+ exitReason === "idle_timeout" ||
365
+ exitReason === "cancelled")
366
+ return exitReason;
367
+ if (executionFailure instanceof ProcessCaptureError &&
368
+ executionFailure.reason === "cancelled")
369
+ return "cancelled";
370
+ return "failed";
371
+ };
294
372
  /** Execute one caller-selected scenario and return bounded observations. */
295
- const runProcessScenario = async (scenario, signal, hostEnvironment = process.env, hostPlatform = process.platform, captureSnapshot = snapshotRoots, cleanupHost) => {
296
- const { temporaryRoot, runId, ownershipBaseline, before } = await prepareProcessCapture(scenario, signal, captureSnapshot);
373
+ const runProcessScenario = async (scenario, signal, hostEnvironment = process.env, hostPlatform = process.platform, captureSnapshot = snapshotRoots, cleanupHost, progress, resourceScope, finalizationHost) => {
374
+ const progressTracker = createProcessCaptureProgressTracker(progress);
297
375
  const frames = [];
298
376
  const samples = [];
299
377
  const interactions = [];
378
+ const progressCounts = () => ({
379
+ frames: frames.length,
380
+ samples: samples.length,
381
+ interactions: interactions.length,
382
+ });
383
+ const reportRunning = () => {
384
+ void progressTracker.report({ phase: "running", counts: progressCounts() });
385
+ };
386
+ const reportSettling = () => {
387
+ void progressTracker.report({
388
+ phase: "settling",
389
+ counts: progressCounts(),
390
+ });
391
+ };
392
+ let prepared;
393
+ try {
394
+ await progressTracker.report({
395
+ phase: "prepare",
396
+ counts: progressCounts(),
397
+ });
398
+ prepared = await prepareProcessCapture(scenario, signal, captureSnapshot, undefined, resourceScope);
399
+ }
400
+ catch (cause) {
401
+ progressTracker.closeLive();
402
+ await progressTracker.report({
403
+ phase: "cleanup",
404
+ counts: progressCounts(),
405
+ terminal: true,
406
+ disposition: signal?.aborted === true ? "cancelled" : "failed",
407
+ });
408
+ throw cause;
409
+ }
410
+ const { temporaryRoot, runId, ownershipBaseline, before } = prepared;
300
411
  const journal = createProcessCaptureJournal();
301
412
  const { entries: eventJournal, recordEvent } = journal;
302
413
  recordEvent("filesystem_checkpoints", 0);
@@ -306,6 +417,7 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
306
417
  samples,
307
418
  eventJournal,
308
419
  before,
420
+ finalizationEnabled: scenario.finalization_ms > 0,
309
421
  });
310
422
  let runtime;
311
423
  let actualRootPid;
@@ -322,6 +434,7 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
322
434
  runId,
323
435
  ownershipBaseline,
324
436
  ...(cleanupHost === undefined ? {} : { cleanupHost }),
437
+ ...(resourceScope === undefined ? {} : { resourceScope }),
325
438
  observationBuffer: observations,
326
439
  onSpawn: (pid) => {
327
440
  actualRootPid = pid;
@@ -333,6 +446,7 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
333
446
  dispatchedEventIndexes,
334
447
  recordEvent,
335
448
  ...(signal === undefined ? {} : { signal }),
449
+ ...(finalizationHost === undefined ? {} : { finalizationHost }),
336
450
  });
337
451
  stopSampler = runtime.stopSampler;
338
452
  const exit = await awaitTerminalExit({
@@ -341,17 +455,43 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
341
455
  started: runtime.started,
342
456
  lastOutput: runtime.lastOutput,
343
457
  signal,
458
+ signalTarget: runtime.signalRoot,
459
+ recordFinalization: (finalization) => {
460
+ observations.finalization = { state: "available", value: finalization };
461
+ },
344
462
  timers,
345
463
  interactions,
346
464
  dispatchedEventIndexes,
347
465
  recordEvent,
466
+ ...(progress === undefined ? {} : { onLiveProgress: reportRunning }),
348
467
  });
468
+ if (exit.unobserved === true) {
469
+ observations.finalization = {
470
+ state: "available",
471
+ value: exit.finalization,
472
+ };
473
+ observations.exit = {
474
+ state: "unavailable",
475
+ reason: `The captured process exit was not observed because the finalization SIGKILL could not be delivered (initiating reason: ${exit.reason}).`,
476
+ };
477
+ if (exit.reason === "cancelled")
478
+ throw processCaptureCancelled();
479
+ throw new Error("The captured process exit was not observed because the finalization SIGKILL could not be delivered.");
480
+ }
481
+ if (exit.finalization !== undefined)
482
+ observations.finalization = {
483
+ state: "available",
484
+ value: exit.finalization,
485
+ };
349
486
  observations.exit = {
350
487
  state: "available",
351
488
  value: {
352
489
  code: exit.reason === "exited" && exit.exitCode >= 0 ? exit.exitCode : null,
353
490
  signal: exit.signal ?? null,
354
491
  reason: exit.reason,
492
+ ...(exit.finalization === undefined
493
+ ? {}
494
+ : { finalization: exit.finalization }),
355
495
  },
356
496
  };
357
497
  capture = await completeCapture({
@@ -370,6 +510,7 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
370
510
  recordEvent,
371
511
  captureSnapshot,
372
512
  ...(signal === undefined ? {} : { signal }),
513
+ ...(progress === undefined ? {} : { onLiveProgress: reportSettling }),
373
514
  });
374
515
  }
375
516
  catch (cause) {
@@ -408,28 +549,55 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
408
549
  executionFailure,
409
550
  observations,
410
551
  ...(actualRootPid === undefined ? {} : { rootPid: actualRootPid }),
552
+ progress: progressTracker,
553
+ progressCounts,
554
+ ...(resourceScope === undefined ? {} : { resourceScope }),
411
555
  });
412
556
  };
413
557
  /** Execute one scenario through a typed expected-failure channel. */
414
- export const captureProcessScenario = async (scenario, signal, platform = process.platform, environment = process.env, captureSnapshot = snapshotRoots, cleanupHost) => {
558
+ export const captureProcessScenario = async (scenario, signal, platform = process.platform, environment = process.env, captureSnapshot, cleanupHost, progress, resourceScope, finalizationHost) => {
415
559
  const ownershipReason = processCaptureOwnershipUnavailableReason(platform);
416
560
  if (ownershipReason !== undefined)
417
561
  return err(new AnalysisCapabilityUnavailableError("rea-process", "capture_process_scenario", ownershipReason, { userMessage: ownershipReason }));
418
- try {
419
- assertNotCancelled(signal);
420
- const resolvedScenario = await resolveProcessScenarioRuntimePaths(scenario, environment);
421
- return ok(await runProcessScenario(resolvedScenario, signal, environment, platform, captureSnapshot, cleanupHost));
422
- }
423
- catch (cause) {
424
- const failure = normalizeCaptureFailure(cause, signal);
425
- const executionFailureReason = describeProcessCaptureExecutionFailure(cause);
426
- return err(failure instanceof ProcessCaptureError
427
- ? failure
428
- : new ProcessCaptureError("process capture failed", {
429
- cause,
430
- ...(executionFailureReason === undefined
431
- ? {}
432
- : { executionFailure: executionFailureReason }),
433
- }));
562
+ const runResourceScope = resourceScope ?? new ProcessCaptureResourceScope();
563
+ const execute = async () => {
564
+ try {
565
+ assertNotCancelled(signal);
566
+ const resolvedScenario = await resolveProcessScenarioRuntimePaths(scenario, environment);
567
+ const capture = await runProcessScenario(resolvedScenario, signal, environment, platform, captureSnapshot ?? snapshotRoots, cleanupHost, progress, runResourceScope, finalizationHost);
568
+ return ok(capture);
569
+ }
570
+ catch (cause) {
571
+ const failure = normalizeCaptureFailure(cause, signal);
572
+ const executionFailureReason = describeProcessCaptureExecutionFailure(cause);
573
+ return err(failure instanceof ProcessCaptureError
574
+ ? failure
575
+ : new ProcessCaptureError("process capture failed", {
576
+ cause,
577
+ ...(executionFailureReason === undefined
578
+ ? {}
579
+ : { executionFailure: executionFailureReason }),
580
+ }));
581
+ }
582
+ };
583
+ if (resourceScope !== undefined) {
584
+ try {
585
+ return await resourceScope.run(execute);
586
+ }
587
+ catch (cause) {
588
+ const failure = normalizeCaptureFailure(cause, signal);
589
+ const executionFailure = describeProcessCaptureExecutionFailure(cause);
590
+ return err(failure instanceof ProcessCaptureError
591
+ ? failure
592
+ : new ProcessCaptureError("process capture lifecycle failed", {
593
+ cause,
594
+ reason: "cleanup_incomplete",
595
+ cleanupResources: ["process_capture_lifecycle"],
596
+ ...(executionFailure === undefined ? {} : { executionFailure }),
597
+ }));
598
+ }
434
599
  }
600
+ const capture = await runResourceScope.run(execute);
601
+ await runResourceScope.close().catch(() => undefined);
602
+ return capture;
435
603
  };
@@ -15,8 +15,10 @@ export const normalizeProcessText = (value, scenario, temporaryRoot, pid) => {
15
15
  normalized = normalizePortTokens(normalized);
16
16
  if (scenario.normalization.pids)
17
17
  normalized = normalizePidTokens(normalized, [pid]);
18
+ // A callback keeps replacement text literal while preserving replaceAll's
19
+ // empty-pattern boundaries, which the process scenario contract permits.
18
20
  for (const pattern of scenario.normalization.patterns)
19
- normalized = normalized.replaceAll(pattern.pattern, pattern.replacement);
21
+ normalized = normalized.replaceAll(pattern.pattern, () => pattern.replacement);
20
22
  return normalized;
21
23
  };
22
24
  // A port may end a sentence, but a period followed by a letter, digit, or
@@ -1,9 +1,10 @@
1
1
  import { access, realpath, stat } from "node:fs/promises";
2
2
  import { constants as fsConstants } from "node:fs";
3
3
  import { delimiter, isAbsolute, join, resolve } from "node:path";
4
+ import { snapshotEnvironment } from "../snapshotEnvironment.js";
4
5
  import { ProcessCaptureError, processCaptureCancelled, } from "./ProcessCaptureError.js";
5
6
  /** Resolve caller-selected executable and observation paths for this execution. */
6
- export const resolveProcessScenarioRuntimePaths = async (scenario, environment = process.env) => {
7
+ export const resolveProcessScenarioRuntimePaths = async (scenario, environment = process.env, platform = process.platform) => {
7
8
  const selectedWorkingDirectory = resolve(scenario.working_directory);
8
9
  let workingDirectory;
9
10
  try {
@@ -21,7 +22,9 @@ export const resolveProcessScenarioRuntimePaths = async (scenario, environment =
21
22
  }
22
23
  if (!workingDirectoryStat.isDirectory())
23
24
  throw new ProcessCaptureError(`working directory is not a directory: ${workingDirectory}`);
24
- const executable = await resolveExecutable(scenario.executable, workingDirectory, scenario.environment.PATH ?? environment.PATH ?? "");
25
+ const executable = await resolveExecutable(scenario.executable, workingDirectory, snapshotEnvironment(scenario.environment, platform).PATH ??
26
+ snapshotEnvironment(environment, platform).PATH ??
27
+ "");
25
28
  const observationPaths = scenario.filesystem_observation_paths.map((path) => resolve(workingDirectory, path));
26
29
  return {
27
30
  ...scenario,
@@ -4,6 +4,7 @@ const require = createRequire(import.meta.url);
4
4
  const HeadlessPackage = require("@xterm/headless");
5
5
  // SAFETY: the addon package is pinned with the compatible headless xterm release.
6
6
  const SerializePackage = require("@xterm/addon-serialize");
7
+ const TRAILING_SPACES = / +$/u;
7
8
  /**
8
9
  * Owns one headless terminal and serializes writes into deterministic frames.
9
10
  * Reconstructs bounded terminal states while raw PTY chunks remain authoritative.
@@ -34,16 +35,21 @@ export class TerminalRenderer {
34
35
  }
35
36
  /** Queue one PTY chunk and capture state only after xterm has parsed it. */
36
37
  write(data, atMs) {
37
- this.#pending = this.#pending.then(() => new Promise((resolveWrite) => {
38
+ this.#queue(() => new Promise((resolveWrite, rejectWrite) => {
38
39
  this.#terminal.write(data, () => {
39
- this.#capture(atMs);
40
- resolveWrite();
40
+ try {
41
+ this.#capture(atMs);
42
+ resolveWrite();
43
+ }
44
+ catch (error) {
45
+ rejectWrite(error);
46
+ }
41
47
  });
42
48
  }));
43
49
  }
44
50
  /** Queue a terminal resize after every preceding write. */
45
51
  resize(columns, rows, atMs) {
46
- this.#pending = this.#pending.then(() => {
52
+ this.#queue(() => {
47
53
  this.#terminal.resize(columns, rows);
48
54
  this.#capture(atMs);
49
55
  });
@@ -69,16 +75,27 @@ export class TerminalRenderer {
69
75
  }
70
76
  /** Release addon and terminal resources after all writes settle. */
71
77
  async dispose() {
72
- await this.#pending;
73
- this.#serializeAddon.dispose();
78
+ // frames() owns observation failures; cleanup reports only disposal failures.
79
+ await this.#pending.catch(() => undefined);
80
+ // xterm owns and disposes every addon loaded through loadAddon().
74
81
  this.#terminal.dispose();
75
82
  }
83
+ #queue(operation) {
84
+ this.#pending = this.#pending.then(operation);
85
+ // PTY callbacks can fail before capture completion awaits frames(). Keep
86
+ // the original rejection observable there without an unhandled rejection.
87
+ void this.#pending.catch(() => undefined);
88
+ }
76
89
  #capture(atMs) {
77
90
  const buffer = this.#terminal.buffer.active;
78
91
  const lines = [];
79
92
  for (let row = 0; row < this.#terminal.rows; row += 1) {
80
93
  const line = buffer.getLine(buffer.viewportY + row);
81
- lines.push(this.options.normalize((line?.translateToString(false, 0, this.#terminal.cols) ?? "").padEnd(this.#terminal.cols, " ")));
94
+ // Trailing blank cells carry no information beyond `columns`; dropping
95
+ // them keeps sparse screens from costing a full row per blank line.
96
+ lines.push(this.options
97
+ .normalize((line?.translateToString(false, 0, this.#terminal.cols) ?? "").padEnd(this.#terminal.cols, " "))
98
+ .replace(TRAILING_SPACES, ""));
82
99
  }
83
100
  const serializedState = this.options.normalize(this.#serializeAddon.serialize());
84
101
  const bytes = Buffer.byteLength(serializedState) +
@@ -1,11 +1,28 @@
1
1
  import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
2
2
  import { err, ok } from "../domain/result.js";
3
+ import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
3
4
  import { traverseDirectory } from "./ReferenceSourceReaderEntries.js";
4
5
  import {} from "./ReferenceSourceReaderTypes.js";
5
6
  import { isAborted, noFollowOpenSupported, prepareRoot, } from "./ReferenceSourceReaderValidate.js";
6
7
  const PATH_RACE_LIMITATION = "Path identity is revalidated around operations; Node lacks portable descriptor-relative openat traversal, so a syscall-boundary pathname race remains.";
7
8
  /** Read a source tree without intentionally following symbolic links. */
8
- export const readReferenceSource = async (root, options = {}) => {
9
+ export const readReferenceSource = async (root, resources, options = {}) => {
10
+ try {
11
+ return await resources.run(() => readSource(root, resources, options));
12
+ }
13
+ catch (cause) {
14
+ if (!(cause instanceof ArtifactReaderFailure))
15
+ throw cause;
16
+ return err({
17
+ tag: "reference-source-reader",
18
+ code: cause.reason === "cancelled" ? "cancelled" : "io",
19
+ message: cause.message,
20
+ ...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
21
+ cause,
22
+ });
23
+ }
24
+ };
25
+ const readSource = async (root, resources, options) => {
9
26
  if (!noFollowOpenSupported())
10
27
  return err({
11
28
  tag: "reference-source-reader",
@@ -17,6 +34,7 @@ export const readReferenceSource = async (root, options = {}) => {
17
34
  return prepared;
18
35
  const { canonicalRoot, rootIdentity } = prepared.value;
19
36
  const state = {
37
+ resources,
20
38
  root: canonicalRoot,
21
39
  rootIdentity,
22
40
  ...(options.signal === undefined ? {} : { signal: options.signal }),
@@ -28,15 +46,14 @@ export const readReferenceSource = async (root, options = {}) => {
28
46
  bytesRead: 0,
29
47
  };
30
48
  const traversal = await traverse(state);
31
- if (!traversal.ok)
32
- return traversal;
33
49
  state.entries.sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
34
- return ok({
50
+ const read = {
35
51
  root: canonicalRoot,
36
52
  entries: state.entries,
37
53
  bytesRead: state.bytesRead,
38
54
  limitations: [PATH_RACE_LIMITATION],
39
- });
55
+ };
56
+ return traversal.ok ? ok(read) : err({ ...traversal.error, partial: read });
40
57
  };
41
58
  const traverse = async (state) => {
42
59
  while (state.pending.length > 0) {