rea-agents 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,12 +1,15 @@
1
- import { mkdtemp, rm, symlink } from "node:fs/promises";
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
+ import { mkdir, mkdtemp, rm, symlink } from "node:fs/promises";
2
3
  import { tmpdir } from "node:os";
3
4
  import { join } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
6
+ import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js";
5
7
  import { execFileOutput } from "../process/ExecFileOutput.js";
6
8
  import { safeParseJson } from "../domain/safeJson.js";
7
9
  import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js";
8
10
  /** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */
9
- export const createNativeUiHelperRuntime = () => {
11
+ export const createNativeUiHelperRuntime = (environment) => {
12
+ const selectedEnvironment = snapshotEnvironment(environment);
10
13
  let root;
11
14
  let executable;
12
15
  const invoke = async (parameters, signal) => {
@@ -15,6 +18,9 @@ export const createNativeUiHelperRuntime = () => {
15
18
  const output = join(root, "observer");
16
19
  const main = join(root, "main.swift");
17
20
  await symlink(fileURLToPath(new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url)), main);
21
+ // Keep swiftc's intermediate objects inside the removable root.
22
+ const compilerTemporary = join(root, "tmp");
23
+ await mkdir(compilerTemporary);
18
24
  await execFileOutput("/usr/bin/xcrun", [
19
25
  "swiftc",
20
26
  "-module-cache-path",
@@ -26,6 +32,8 @@ export const createNativeUiHelperRuntime = () => {
26
32
  ], {
27
33
  timeout: 60_000,
28
34
  maxBuffer: 1024 * 1024,
35
+ stopSignal: SWIFTC_INTERRUPT,
36
+ env: { ...selectedEnvironment, TMPDIR: compilerTemporary },
29
37
  ...(signal === undefined ? {} : { signal }),
30
38
  });
31
39
  executable = output;
@@ -33,6 +41,7 @@ export const createNativeUiHelperRuntime = () => {
33
41
  const output = await execFileOutput(executable, [JSON.stringify(parameters)], {
34
42
  timeout: 30_000,
35
43
  maxBuffer: NATIVE_UI_HELPER_MAX_BUFFER,
44
+ env: selectedEnvironment,
36
45
  ...(signal === undefined ? {} : { signal }),
37
46
  });
38
47
  const parsed = safeParseJson(output.stdout);
@@ -17,8 +17,8 @@ const responseSchema = z.discriminatedUnion("ok", [
17
17
  }),
18
18
  ]);
19
19
  /** Capture a selected existing app window and run explicitly selected scenarios. */
20
- export const observeNativeUi = async (target, operation, parameters, options = {}) => {
21
- const runtime = createNativeUiHelperRuntime();
20
+ export const observeNativeUi = async (target, operation, parameters, options) => {
21
+ const runtime = createNativeUiHelperRuntime(options.environment);
22
22
  try {
23
23
  return await observeWithHelper(target, operation, parameters, {
24
24
  ...options,
@@ -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);
@@ -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,7 +120,14 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
114
120
  if (signal.aborted || closed)
115
121
  throw abortReason(signal);
116
122
  const output = join(operationRoot, "reader");
117
- const compilerEnvironment = { ...process.env };
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
+ };
118
131
  // Use Swift's reusable default cache for REA's internal helper compilation.
119
132
  delete compilerEnvironment.CLANG_MODULE_CACHE_PATH;
120
133
  try {
@@ -122,6 +135,7 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
122
135
  timeout: 60_000,
123
136
  maxBuffer: 1024 * 1024,
124
137
  signal,
138
+ stopSignal: SWIFTC_INTERRUPT,
125
139
  env: compilerEnvironment,
126
140
  });
127
141
  }
@@ -1,4 +1,38 @@
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
+ };
2
36
  /** Read captured output metadata from a failed execFileOutput invocation. */
3
37
  export const execFileOutputFailure = (cause) => {
4
38
  if (!(cause instanceof Error))
@@ -21,17 +55,65 @@ export const execFileOutputFailure = (cause) => {
21
55
  };
22
56
  /** Run a shell-free command while capturing its complete UTF-8 output. */
23
57
  export const execFileOutput = (command, arguments_, options = {}) => new Promise((resolve, reject) => {
24
- execFile(command, [...arguments_], {
25
- ...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 }),
26
82
  encoding: "utf8",
27
83
  maxBuffer: options.maxBuffer ?? Number.POSITIVE_INFINITY,
28
84
  }, (error, stdout, stderr) => {
29
- if (error !== null) {
30
- Reflect.set(error, "stdout", stdout);
31
- Reflect.set(error, "stderr", stderr);
32
- 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);
33
97
  return;
34
98
  }
35
99
  resolve({ stdout, stderr });
36
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);
37
119
  });
@@ -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
  }
@@ -19,12 +19,9 @@ export const cleanupWindowsProcessTree = async (rootPid, host = systemWindowsPro
19
19
  return { cleaned: true, signaled: result === "terminated" };
20
20
  }
21
21
  catch (cause) {
22
- // The reason string is a pinned validation contract; keep it stable and
23
- // do not interpolate the cause into caller-visible diagnostics here.
24
- void cause;
25
22
  return {
26
23
  cleaned: false,
27
- reason: "Windows P0 process-tree termination failed; Job Object ownership is unavailable",
24
+ reason: `Windows process-tree termination failed for PID ${String(rootPid)}: ${errorMessage(cause)}`,
28
25
  };
29
26
  }
30
27
  };
@@ -5,30 +5,36 @@ import { descendantsOf, liveProcesses } from "./ProcessOwnershipProcessTree.js";
5
5
  import { execFileOutput } from "./ExecFileOutput.js";
6
6
  import { createDarwinProcessRunTokenReader } from "./DarwinProcessRunTokenReader.js";
7
7
  /** Observe one group without signaling it, failing closed on identity doubt. */
8
- export const observeOwnedProcessGroupWithHost = async (ownership, host) => {
8
+ export const observeOwnedProcessGroupWithHost = async (ownership, host, signal) => {
9
+ signal?.throwIfAborted();
9
10
  let members;
10
11
  try {
11
- members = (await host.listProcesses()).filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
12
+ members = (await host.listProcesses(signal)).filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
12
13
  }
13
14
  catch (cause) {
15
+ signal?.throwIfAborted();
14
16
  return {
15
17
  state: "unverifiable",
16
18
  reason: `process group could not be inspected: ${errorMessage(cause)}`,
17
19
  };
18
20
  }
21
+ signal?.throwIfAborted();
19
22
  const liveMembers = liveProcesses(members);
20
23
  if (liveMembers.length === 0)
21
24
  return { state: "empty" };
22
25
  for (const member of liveMembers) {
26
+ signal?.throwIfAborted();
23
27
  try {
24
- if ((await host.environment(member.pid)).REA_PROCESS_RUN_ID !==
25
- ownership.runId)
28
+ const runId = (await host.environment(member.pid)).REA_PROCESS_RUN_ID;
29
+ signal?.throwIfAborted();
30
+ if (runId !== ownership.runId)
26
31
  return {
27
32
  state: "unverifiable",
28
33
  reason: "process ownership did not match",
29
34
  };
30
35
  }
31
36
  catch (cause) {
37
+ signal?.throwIfAborted();
32
38
  if (!(await processIsGone(host, member.pid))) {
33
39
  return {
34
40
  state: "unverifiable",
@@ -326,7 +332,7 @@ export const prepareProcessOwnershipInspection = async (signal) => {
326
332
  await systemProcessOwnershipHost.prepare?.(signal);
327
333
  };
328
334
  /** Observe one group without signaling it, failing closed on identity doubt. */
329
- export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost) => observeOwnedProcessGroupWithHost(ownership, host);
335
+ export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost, signal) => observeOwnedProcessGroupWithHost(ownership, host, signal);
330
336
  /**
331
337
  * Record the live launcher and descendant lineage after run-token validation.
332
338
  *
@@ -21,9 +21,7 @@ export const spawnOwnedProviderProcess = async (options) => {
21
21
  REA_PROCESS_RUN_ID: options.runId,
22
22
  };
23
23
  if (platform === "win32" && process.platform === "win32") {
24
- if (options.stdin === "pipe")
25
- throw new Error("Owned Windows provider processes do not support protocol stdin");
26
- const child = new WindowsOwnedProcess(options.command, options.arguments, options.cwd, environment, options.windowsVerbatimArguments ?? false);
24
+ const child = new WindowsOwnedProcess(options.command, options.arguments, options.cwd, environment, options.windowsVerbatimArguments ?? false, options.stdin === "pipe");
27
25
  return {
28
26
  process: child,
29
27
  ownership: {
@@ -59,25 +59,33 @@ export const hashFile = async (path, expected, maxBytes, signal) => {
59
59
  /** Capture bounded, root-aliased filesystem state without following symlinks. */
60
60
  export const snapshotRoots = async (scenario, signal) => {
61
61
  const entries = [];
62
+ const completeRoots = [];
62
63
  let remainingBytes = scenario.limits.file_bytes;
63
64
  let truncated = false;
65
+ const enumerationReasons = new Set();
66
+ const hashOmissions = [];
64
67
  const visit = async (root, rootAlias, path, depth) => {
65
68
  signal?.throwIfAborted();
66
69
  if (entries.length >= scenario.limits.files ||
67
70
  depth > scenario.limits.filesystem_depth) {
68
71
  truncated = true;
69
- return;
72
+ if (entries.length >= scenario.limits.files)
73
+ enumerationReasons.add("files_limit");
74
+ if (depth > scenario.limits.filesystem_depth)
75
+ enumerationReasons.add("depth_limit");
76
+ return false;
70
77
  }
71
78
  const stats = await lstatIfPresent(path);
72
79
  if (stats === undefined)
73
- return;
80
+ return true;
74
81
  const relativePath = relative(root, path) || ".";
75
82
  if (stats.isSymbolicLink()) {
76
83
  const target = resolve(dirname(path), await readlink(path));
77
84
  const afterRead = await lstat(path);
78
85
  if (!hasSameIdentity(stats, afterRead, "symlink")) {
79
86
  truncated = true;
80
- return;
87
+ enumerationReasons.add("identity_changed");
88
+ return false;
81
89
  }
82
90
  entries.push({
83
91
  path: `${rootAlias}:${relativePath}`,
@@ -87,15 +95,24 @@ export const snapshotRoots = async (scenario, signal) => {
87
95
  sha256: null,
88
96
  symlink_target: target,
89
97
  });
90
- return;
98
+ return true;
91
99
  }
92
100
  if (stats.isFile()) {
93
101
  const sha256 = remainingBytes >= stats.size
94
102
  ? await hashFile(path, stats, remainingBytes, signal)
95
103
  : null;
96
104
  remainingBytes -= sha256 === null ? 0 : stats.size;
97
- if (sha256 === null)
105
+ if (sha256 === null) {
98
106
  truncated = true;
107
+ hashOmissions.push({
108
+ path: `${rootAlias}:${relativePath}`,
109
+ size_bytes: stats.size,
110
+ remaining_budget_bytes: remainingBytes,
111
+ reason: remainingBytes < stats.size
112
+ ? "file_bytes_budget"
113
+ : "file_changed_or_short_read",
114
+ });
115
+ }
99
116
  entries.push({
100
117
  path: `${rootAlias}:${relativePath}`,
101
118
  type: "file",
@@ -104,7 +121,7 @@ export const snapshotRoots = async (scenario, signal) => {
104
121
  sha256,
105
122
  symlink_target: null,
106
123
  });
107
- return;
124
+ return true;
108
125
  }
109
126
  const type = stats.isDirectory() ? "directory" : "other";
110
127
  entries.push({
@@ -116,22 +133,42 @@ export const snapshotRoots = async (scenario, signal) => {
116
133
  symlink_target: null,
117
134
  });
118
135
  if (type !== "directory")
119
- return;
136
+ return true;
120
137
  const children = await readdir(path);
121
138
  const afterRead = await lstat(path);
122
139
  if (!hasSameIdentity(stats, afterRead, "directory")) {
123
140
  truncated = true;
124
- return;
141
+ enumerationReasons.add("identity_changed");
142
+ return false;
143
+ }
144
+ let complete = true;
145
+ for (const child of children.sort()) {
146
+ if (!(await visit(root, rootAlias, join(path, child), depth + 1)))
147
+ complete = false;
125
148
  }
126
- for (const child of children.sort())
127
- await visit(root, rootAlias, join(path, child), depth + 1);
149
+ return complete;
128
150
  };
129
151
  for (const [index, root] of scenario.filesystem_observation_paths.entries()) {
152
+ const alias = `root_${String(index)}`;
130
153
  if ((await lstatIfPresent(root)) === undefined) {
131
- truncated = true;
154
+ completeRoots.push(alias);
132
155
  continue;
133
156
  }
134
- await visit(root, `root_${String(index)}`, root, 0);
157
+ if (await visit(root, alias, root, 0))
158
+ completeRoots.push(alias);
135
159
  }
136
- return { files: entries, truncated };
160
+ return {
161
+ files: entries,
162
+ truncated,
163
+ completeRoots,
164
+ coverage: {
165
+ files_limit: scenario.limits.files,
166
+ depth_limit: scenario.limits.filesystem_depth,
167
+ enumeration_truncated: completeRoots.length !== scenario.filesystem_observation_paths.length,
168
+ enumeration_reasons: [...enumerationReasons],
169
+ hash_budget_bytes: scenario.limits.file_bytes,
170
+ hashed_bytes: scenario.limits.file_bytes - remainingBytes,
171
+ hash_omissions: hashOmissions,
172
+ },
173
+ };
137
174
  };
@@ -1,3 +1,4 @@
1
+ import { DarwinProcessOwnershipInspectionError } from "../DarwinProcessRunTokenReader.js";
1
2
  import { AnalysisError } from "../../domain/analysisErrorBase.js";
2
3
  /** Typed application failure produced by controlled process capture. */
3
4
  export class ProcessCaptureError extends AnalysisError {
@@ -40,3 +41,15 @@ export const processCaptureCancelled = () => new ProcessCaptureError("process ca
40
41
  reason: "cancelled",
41
42
  userMessage: "Process capture was cancelled. Start it again when ready.",
42
43
  });
44
+ /** Preserve typed process-inspection preflight failures at the capture boundary. */
45
+ export const normalizeCaptureFailure = (cause, signal) => {
46
+ if (cause instanceof ProcessCaptureError)
47
+ return cause;
48
+ if (cause instanceof DarwinProcessOwnershipInspectionError)
49
+ return new ProcessCaptureError(cause.message, { cause });
50
+ if (signal?.aborted === true &&
51
+ (cause === signal.reason ||
52
+ (cause instanceof Error && cause.name === "AbortError")))
53
+ return processCaptureCancelled();
54
+ return cause;
55
+ };