rea-agents 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -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 observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost, 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",
@@ -39,8 +45,14 @@ export const observeOwnedProcessGroupWithHost = async (ownership, host) => {
39
45
  }
40
46
  return { state: "alive" };
41
47
  };
42
- /** Record the live launcher and descendant lineage after run-token validation. */
43
- export const observeOwnedProcessLineageWithHost = async (ownership, host) => {
48
+ /**
49
+ * Record the live launcher and descendant lineage after run-token validation.
50
+ *
51
+ * The observation is intentionally point-in-time. A verified empty descendant
52
+ * list means no descendants were live during this observation, not that the
53
+ * run never created a short-lived child.
54
+ */
55
+ export const observeOwnedProcessLineage = async (ownership, host = systemProcessOwnershipHost) => {
44
56
  let processes;
45
57
  try {
46
58
  processes = liveProcesses(await host.listProcesses());
@@ -325,16 +337,6 @@ export const signalProcessWithStartIdentity = async (pid, expectedIdentity, sign
325
337
  export const prepareProcessOwnershipInspection = async (signal) => {
326
338
  await systemProcessOwnershipHost.prepare?.(signal);
327
339
  };
328
- /** Observe one group without signaling it, failing closed on identity doubt. */
329
- export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost) => observeOwnedProcessGroupWithHost(ownership, host);
330
- /**
331
- * Record the live launcher and descendant lineage after run-token validation.
332
- *
333
- * The observation is intentionally point-in-time. A verified empty descendant
334
- * list means no descendants were live during this observation, not that the
335
- * run never created a short-lived child.
336
- */
337
- export const observeOwnedProcessLineage = async (ownership, host = systemProcessOwnershipHost) => observeOwnedProcessLineageWithHost(ownership, host);
338
340
  const processIsGone = async (host, pid) => {
339
341
  try {
340
342
  return !liveProcesses(await host.listProcesses()).some((process) => process.pid === pid);
@@ -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: {
@@ -13,6 +13,23 @@ const hasSameFileState = (before, after) => before.dev === after.dev &&
13
13
  before.size === after.size &&
14
14
  before.mtimeMs === after.mtimeMs &&
15
15
  before.ctimeMs === after.ctimeMs;
16
+ const fileUnavailableSystemCode = (cause) => {
17
+ if (!(cause instanceof Error) || !("code" in cause))
18
+ return undefined;
19
+ const code = cause.code;
20
+ return typeof code === "string" &&
21
+ [
22
+ "EACCES",
23
+ "EISDIR",
24
+ "ELOOP",
25
+ "ENOTDIR",
26
+ "ENOENT",
27
+ "EPERM",
28
+ "ESTALE",
29
+ ].includes(code)
30
+ ? code
31
+ : undefined;
32
+ };
16
33
  const lstatIfPresent = async (path) => {
17
34
  try {
18
35
  return await lstat(path);
@@ -26,15 +43,33 @@ const lstatIfPresent = async (path) => {
26
43
  /** Hash a file only when its opened descriptor still matches the captured path state. */
27
44
  export const hashFile = async (path, expected, maxBytes, signal) => {
28
45
  signal?.throwIfAborted();
29
- const handle = await open(path, fsConstants.O_RDONLY |
30
- (fsConstants.O_NOFOLLOW ?? 0) |
31
- (fsConstants.O_NONBLOCK ?? 0));
46
+ let handle;
47
+ try {
48
+ handle = await open(path, fsConstants.O_RDONLY |
49
+ (fsConstants.O_NOFOLLOW ?? 0) |
50
+ (fsConstants.O_NONBLOCK ?? 0));
51
+ }
52
+ catch (cause) {
53
+ signal?.throwIfAborted();
54
+ const systemCode = fileUnavailableSystemCode(cause);
55
+ if (systemCode === undefined)
56
+ throw cause;
57
+ return {
58
+ state: "omitted",
59
+ reason: "file_unavailable",
60
+ system_code: systemCode,
61
+ };
62
+ }
32
63
  try {
33
64
  signal?.throwIfAborted();
34
65
  const stats = await handle.stat();
35
66
  signal?.throwIfAborted();
36
67
  if (!hasSameFileState(expected, stats) || stats.size > maxBytes)
37
- return null;
68
+ return {
69
+ state: "omitted",
70
+ reason: "file_changed_or_short_read",
71
+ system_code: null,
72
+ };
38
73
  const hash = createHash("sha256");
39
74
  const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, maxBytes));
40
75
  let position = 0;
@@ -42,15 +77,34 @@ export const hashFile = async (path, expected, maxBytes, signal) => {
42
77
  signal?.throwIfAborted();
43
78
  const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, stats.size - position), position);
44
79
  if (bytesRead === 0)
45
- return null;
80
+ return {
81
+ state: "omitted",
82
+ reason: "file_changed_or_short_read",
83
+ system_code: null,
84
+ };
46
85
  hash.update(buffer.subarray(0, bytesRead));
47
86
  position += bytesRead;
48
87
  }
49
88
  const after = await handle.stat();
50
89
  signal?.throwIfAborted();
51
90
  if (!hasSameFileState(stats, after))
52
- return null;
53
- return hash.digest("hex");
91
+ return {
92
+ state: "omitted",
93
+ reason: "file_changed_or_short_read",
94
+ system_code: null,
95
+ };
96
+ return { state: "hashed", sha256: hash.digest("hex") };
97
+ }
98
+ catch (cause) {
99
+ signal?.throwIfAborted();
100
+ const systemCode = fileUnavailableSystemCode(cause);
101
+ if (systemCode === undefined)
102
+ throw cause;
103
+ return {
104
+ state: "omitted",
105
+ reason: "file_unavailable",
106
+ system_code: systemCode,
107
+ };
54
108
  }
55
109
  finally {
56
110
  await handle.close();
@@ -59,25 +113,33 @@ export const hashFile = async (path, expected, maxBytes, signal) => {
59
113
  /** Capture bounded, root-aliased filesystem state without following symlinks. */
60
114
  export const snapshotRoots = async (scenario, signal) => {
61
115
  const entries = [];
116
+ const completeRoots = [];
62
117
  let remainingBytes = scenario.limits.file_bytes;
63
118
  let truncated = false;
119
+ const enumerationReasons = new Set();
120
+ const hashOmissions = [];
64
121
  const visit = async (root, rootAlias, path, depth) => {
65
122
  signal?.throwIfAborted();
66
123
  if (entries.length >= scenario.limits.files ||
67
124
  depth > scenario.limits.filesystem_depth) {
68
125
  truncated = true;
69
- return;
126
+ if (entries.length >= scenario.limits.files)
127
+ enumerationReasons.add("files_limit");
128
+ if (depth > scenario.limits.filesystem_depth)
129
+ enumerationReasons.add("depth_limit");
130
+ return false;
70
131
  }
71
132
  const stats = await lstatIfPresent(path);
72
133
  if (stats === undefined)
73
- return;
134
+ return true;
74
135
  const relativePath = relative(root, path) || ".";
75
136
  if (stats.isSymbolicLink()) {
76
137
  const target = resolve(dirname(path), await readlink(path));
77
138
  const afterRead = await lstat(path);
78
139
  if (!hasSameIdentity(stats, afterRead, "symlink")) {
79
140
  truncated = true;
80
- return;
141
+ enumerationReasons.add("identity_changed");
142
+ return false;
81
143
  }
82
144
  entries.push({
83
145
  path: `${rootAlias}:${relativePath}`,
@@ -87,15 +149,40 @@ export const snapshotRoots = async (scenario, signal) => {
87
149
  sha256: null,
88
150
  symlink_target: target,
89
151
  });
90
- return;
152
+ return true;
91
153
  }
92
154
  if (stats.isFile()) {
93
- const sha256 = remainingBytes >= stats.size
94
- ? await hashFile(path, stats, remainingBytes, signal)
95
- : null;
96
- remainingBytes -= sha256 === null ? 0 : stats.size;
97
- if (sha256 === null)
155
+ let sha256 = null;
156
+ let omission;
157
+ if (remainingBytes < stats.size) {
158
+ omission = {
159
+ path: `${rootAlias}:${relativePath}`,
160
+ size_bytes: stats.size,
161
+ remaining_budget_bytes: remainingBytes,
162
+ reason: "file_bytes_budget",
163
+ system_code: null,
164
+ };
165
+ }
166
+ else {
167
+ const outcome = await hashFile(path, stats, remainingBytes, signal);
168
+ if (outcome.state === "hashed") {
169
+ sha256 = outcome.sha256;
170
+ remainingBytes -= stats.size;
171
+ }
172
+ else {
173
+ omission = {
174
+ path: `${rootAlias}:${relativePath}`,
175
+ size_bytes: stats.size,
176
+ remaining_budget_bytes: remainingBytes,
177
+ reason: outcome.reason,
178
+ system_code: outcome.system_code,
179
+ };
180
+ }
181
+ }
182
+ if (omission !== undefined) {
98
183
  truncated = true;
184
+ hashOmissions.push(omission);
185
+ }
99
186
  entries.push({
100
187
  path: `${rootAlias}:${relativePath}`,
101
188
  type: "file",
@@ -104,7 +191,7 @@ export const snapshotRoots = async (scenario, signal) => {
104
191
  sha256,
105
192
  symlink_target: null,
106
193
  });
107
- return;
194
+ return true;
108
195
  }
109
196
  const type = stats.isDirectory() ? "directory" : "other";
110
197
  entries.push({
@@ -116,22 +203,42 @@ export const snapshotRoots = async (scenario, signal) => {
116
203
  symlink_target: null,
117
204
  });
118
205
  if (type !== "directory")
119
- return;
206
+ return true;
120
207
  const children = await readdir(path);
121
208
  const afterRead = await lstat(path);
122
209
  if (!hasSameIdentity(stats, afterRead, "directory")) {
123
210
  truncated = true;
124
- return;
211
+ enumerationReasons.add("identity_changed");
212
+ return false;
125
213
  }
126
- for (const child of children.sort())
127
- await visit(root, rootAlias, join(path, child), depth + 1);
214
+ let complete = true;
215
+ for (const child of children.sort()) {
216
+ if (!(await visit(root, rootAlias, join(path, child), depth + 1)))
217
+ complete = false;
218
+ }
219
+ return complete;
128
220
  };
129
221
  for (const [index, root] of scenario.filesystem_observation_paths.entries()) {
222
+ const alias = `root_${String(index)}`;
130
223
  if ((await lstatIfPresent(root)) === undefined) {
131
- truncated = true;
224
+ completeRoots.push(alias);
132
225
  continue;
133
226
  }
134
- await visit(root, `root_${String(index)}`, root, 0);
227
+ if (await visit(root, alias, root, 0))
228
+ completeRoots.push(alias);
135
229
  }
136
- return { files: entries, truncated };
230
+ return {
231
+ files: entries,
232
+ truncated,
233
+ completeRoots,
234
+ coverage: {
235
+ files_limit: scenario.limits.files,
236
+ depth_limit: scenario.limits.filesystem_depth,
237
+ enumeration_truncated: completeRoots.length !== scenario.filesystem_observation_paths.length,
238
+ enumeration_reasons: [...enumerationReasons],
239
+ hash_budget_bytes: scenario.limits.file_bytes,
240
+ hashed_bytes: scenario.limits.file_bytes - remainingBytes,
241
+ hash_omissions: hashOmissions,
242
+ },
243
+ };
137
244
  };
@@ -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
+ };