rea-agents 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/README.md +7 -4
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -0,0 +1,286 @@
1
+ import { createHash } from "node:crypto";
2
+ import { setImmediate } from "node:timers/promises";
3
+ import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
4
+ import { jsonParts } from "../../domain/jsonSerialization.js";
5
+ import { peFailure, readPeResourceLayout, requirePeRange, } from "./PeResourceLayout.js";
6
+ const METADATA_BYTES = 8 * 1024 * 1024;
7
+ const limit = (message) => {
8
+ throw new ArtifactReaderFailure("limit", message);
9
+ };
10
+ /** Count bytes through the canonical bounded JSON writer. */
11
+ const jsonBytes = (value, maximum) => {
12
+ let size = 0;
13
+ for (const part of jsonParts(value)) {
14
+ size += Buffer.byteLength(part, "utf8");
15
+ if (size > maximum)
16
+ return size;
17
+ }
18
+ return size;
19
+ };
20
+ const identityKey = (id) => id.kind === "id" ? `id:${String(id.id)}` : `name:${id.utf16le_hex}`;
21
+ /** Decode the conventional type/name/language tree; never infer payload meaning or runtime loading. */
22
+ export const parsePeResources = async (bytes, artifact, input, signal) => {
23
+ signal?.throwIfAborted();
24
+ const layout = readPeResourceLayout(bytes);
25
+ const directories = [];
26
+ const resources = [];
27
+ const occupied = [];
28
+ const names = new Map();
29
+ let examined = 0;
30
+ let metadataBytes = 0;
31
+ const ensureCapacity = (projectedBytes) => {
32
+ if (metadataBytes + projectedBytes > METADATA_BYTES)
33
+ limit("PE resource metadata exceeds the 8 MiB complete-result allocation budget.");
34
+ };
35
+ const accountBytes = (projectedBytes) => {
36
+ ensureCapacity(projectedBytes);
37
+ metadataBytes += projectedBytes;
38
+ };
39
+ const account = (value) => {
40
+ // Rows are retained in arrays; reserve a separator along with each row.
41
+ accountBytes(jsonBytes(value, METADATA_BYTES - metadataBytes - 1) + 1);
42
+ };
43
+ const reserveDecodedName = (utf16Units) => {
44
+ // A JSON string can need six ASCII bytes per UTF-16 code unit (for example,
45
+ // a control character encoded as `\\u0000`). The original spelling and
46
+ // its hex form are both retained in the result.
47
+ const projectedBytes = 10 * utf16Units + 256;
48
+ ensureCapacity(projectedBytes);
49
+ };
50
+ const root = layout.size === 0 ? 0 : layout.map(layout.rva, layout.size);
51
+ const relative = (at, length) => {
52
+ if (at > layout.size - length || at < 0)
53
+ peFailure("Resource directory offset leaves the declared resource interval.");
54
+ requirePeRange(bytes, root + at, length);
55
+ return root + at;
56
+ };
57
+ const recordRange = (offset, size, kind) => {
58
+ const range = { offset, bytes: size };
59
+ if (size > 0)
60
+ occupied.push({ ...range, kind });
61
+ return range;
62
+ };
63
+ const readIdentity = (encoded) => {
64
+ if ((encoded & 0x80000000) === 0)
65
+ return { kind: "id", id: encoded };
66
+ const at = encoded & 0x7fffffff;
67
+ const previous = names.get(at);
68
+ if (previous !== undefined)
69
+ return previous;
70
+ if (at % 2 !== 0)
71
+ peFailure("Unaligned PE resource name.");
72
+ const start = relative(at, 2);
73
+ const utf16Units = bytes.readUInt16LE(start);
74
+ reserveDecodedName(utf16Units);
75
+ const length = utf16Units * 2;
76
+ relative(at, 2 + length);
77
+ const raw = bytes.subarray(start + 2, start + 2 + length);
78
+ const value = {
79
+ kind: "name",
80
+ name: raw.toString("utf16le"),
81
+ utf16le_hex: raw.toString("hex"),
82
+ location: recordRange(start, 2 + length, "name"),
83
+ };
84
+ names.set(at, value);
85
+ return value;
86
+ };
87
+ const visit = async (at, path, entryLocations, ancestors) => {
88
+ if (ancestors.has(at))
89
+ peFailure("Cyclic PE resource directory.");
90
+ if (at % 4 !== 0)
91
+ peFailure("Unaligned PE resource directory.");
92
+ const header = relative(at, 16);
93
+ const named = bytes.readUInt16LE(header + 12);
94
+ const ids = bytes.readUInt16LE(header + 14);
95
+ const count = named + ids;
96
+ if (count > input.max_entries - examined)
97
+ limit("PE resource directory entry budget exceeded; no partial inventory was returned.");
98
+ examined += count;
99
+ relative(at, 16 + 8 * count);
100
+ const directory = {
101
+ location: recordRange(header, 16 + 8 * count, "directory"),
102
+ characteristics: bytes.readUInt32LE(header),
103
+ timestamp: bytes.readUInt32LE(header + 4),
104
+ major_version: bytes.readUInt16LE(header + 8),
105
+ minor_version: bytes.readUInt16LE(header + 10),
106
+ named_entries: named,
107
+ id_entries: ids,
108
+ };
109
+ account(directory);
110
+ directories.push(directory);
111
+ const keys = new Set();
112
+ const nested = new Set([...ancestors, at]);
113
+ for (let index = 0; index < count; index++) {
114
+ if (index % 128 === 0) {
115
+ await setImmediate();
116
+ signal?.throwIfAborted();
117
+ }
118
+ const entry = header + 16 + index * 8;
119
+ const encoded = bytes.readUInt32LE(entry);
120
+ if (((encoded & 0x80000000) !== 0) !== index < named)
121
+ peFailure("Resource name/ID entry counts disagree with encoded identities.");
122
+ const identity = readIdentity(encoded);
123
+ const key = identityKey(identity);
124
+ if (keys.has(key))
125
+ peFailure("Duplicate identity within a resource directory.");
126
+ keys.add(key);
127
+ const next = [...path, identity];
128
+ const locations = [...entryLocations, { offset: entry, bytes: 8 }];
129
+ const target = bytes.readUInt32LE(entry + 4);
130
+ const offset = target & 0x7fffffff;
131
+ if ((target & 0x80000000) !== 0) {
132
+ if (next.length >= 3)
133
+ peFailure("Unsupported resource tree deeper than type/name/language.");
134
+ await visit(offset, next, locations, nested);
135
+ }
136
+ else {
137
+ if (next.length !== 3)
138
+ peFailure("Unsupported resource leaf outside the type/name/language profile.");
139
+ const data = relative(offset, 16);
140
+ if (offset % 4 !== 0)
141
+ peFailure("Unaligned resource data entry.");
142
+ const rva = bytes.readUInt32LE(data);
143
+ const size = bytes.readUInt32LE(data + 4);
144
+ const payloadOffset = layout.map(rva, size);
145
+ const [type, name, language] = next;
146
+ if (type === undefined || name === undefined || language === undefined)
147
+ return peFailure("Incomplete resource identity.");
148
+ const resource = {
149
+ index: resources.length,
150
+ type,
151
+ name,
152
+ language,
153
+ entry_locations: locations,
154
+ data_entry_location: recordRange(data, 16, "data-entry"),
155
+ code_page: bytes.readUInt32LE(data + 8),
156
+ reserved: bytes.readUInt32LE(data + 12),
157
+ payload: {
158
+ rva,
159
+ location: recordRange(payloadOffset, size, "payload"),
160
+ sha256: "0".repeat(64),
161
+ },
162
+ };
163
+ account(resource);
164
+ resources.push(resource);
165
+ }
166
+ }
167
+ };
168
+ if (layout.size > 0)
169
+ await visit(0, [], [], new Set());
170
+ rejectOverlappingRanges(occupied);
171
+ const hashes = new Map();
172
+ for (const resource of resources) {
173
+ const range = resource.payload.location;
174
+ const key = `${String(range.offset)}:${String(range.bytes)}`;
175
+ let digest = hashes.get(key);
176
+ if (digest === undefined) {
177
+ const hash = createHash("sha256");
178
+ for (let offset = 0; offset < range.bytes; offset += 1048576) {
179
+ await setImmediate();
180
+ signal?.throwIfAborted();
181
+ hash.update(bytes.subarray(range.offset + offset, range.offset + Math.min(range.bytes, offset + 1048576)));
182
+ }
183
+ digest = hash.digest("hex");
184
+ hashes.set(key, digest);
185
+ }
186
+ resource.payload.sha256 = digest;
187
+ }
188
+ const iconGroups = readIconGroups(bytes, resources, account, ensureCapacity);
189
+ const report = {
190
+ artifact,
191
+ format: layout.format,
192
+ machine: layout.machine,
193
+ directory: layout.size === 0
194
+ ? null
195
+ : {
196
+ rva: layout.rva,
197
+ location: { offset: root, bytes: layout.size },
198
+ data_directory_location: { offset: layout.directoryAt, bytes: 8 },
199
+ },
200
+ directories,
201
+ resources,
202
+ icon_groups: iconGroups,
203
+ coverage: {
204
+ status: "complete",
205
+ examined_entries: examined,
206
+ resources: resources.length,
207
+ },
208
+ limitations: [
209
+ "Static PE32/PE32+ type/name/language resource inventory; payloads other than RT_GROUP_ICON remain opaque.",
210
+ "Icon candidates are resource-table relationships. Language fallback, image decoding and actual shell/window loading are not observed.",
211
+ "Exact shared byte ranges are retained; non-identical overlapping resource structures or payloads are rejected.",
212
+ ],
213
+ };
214
+ signal?.throwIfAborted();
215
+ if (jsonBytes(report, METADATA_BYTES) > METADATA_BYTES)
216
+ limit("PE resource result exceeds the 8 MiB allocation budget.");
217
+ return report;
218
+ };
219
+ const rejectOverlappingRanges = (ranges) => {
220
+ ranges.sort((left, right) => left.offset - right.offset || right.bytes - left.bytes);
221
+ let previous;
222
+ for (const current of ranges) {
223
+ if (previous !== undefined &&
224
+ current.offset < previous.offset + previous.bytes &&
225
+ (current.offset !== previous.offset ||
226
+ current.bytes !== previous.bytes ||
227
+ current.kind !== previous.kind))
228
+ peFailure("Non-identical resource byte ranges overlap.");
229
+ previous = current;
230
+ }
231
+ };
232
+ const readIconGroups = (bytes, resources, account, ensureCapacity) => {
233
+ const imagesById = new Map();
234
+ for (const resource of resources) {
235
+ if (resource.type.kind !== "id" ||
236
+ resource.type.id !== 3 ||
237
+ resource.name.kind !== "id")
238
+ continue;
239
+ const candidates = imagesById.get(resource.name.id) ?? [];
240
+ candidates.push(resource);
241
+ imagesById.set(resource.name.id, candidates);
242
+ }
243
+ return resources
244
+ .filter((resource) => resource.type.kind === "id" && resource.type.id === 14)
245
+ .map((group) => {
246
+ const { offset, bytes: size } = group.payload.location;
247
+ if (size < 6 ||
248
+ bytes.readUInt16LE(offset) !== 0 ||
249
+ bytes.readUInt16LE(offset + 2) !== 1)
250
+ peFailure("Malformed RT_GROUP_ICON header.");
251
+ const count = bytes.readUInt16LE(offset + 4);
252
+ if (size !== 6 + count * 14)
253
+ peFailure("RT_GROUP_ICON length does not match its image count.");
254
+ const images = [];
255
+ for (let index = 0; index < count; index++) {
256
+ const at = offset + 6 + index * 14;
257
+ const id = bytes.readUInt16LE(at + 12);
258
+ const candidates = imagesById.get(id) ?? [];
259
+ const exact = candidates.find((resource) => identityKey(resource.language) === identityKey(group.language));
260
+ // Indices are uint32 values and each needs at most ten decimal digits
261
+ // plus a comma. Check the expanded candidate list before allocating it.
262
+ ensureCapacity(302 + candidates.length * 11);
263
+ const declaredBytes = bytes.readUInt32LE(at + 8);
264
+ const image = {
265
+ location: { offset: at, bytes: 14 },
266
+ width: bytes[at] ?? 0,
267
+ height: bytes[at + 1] ?? 0,
268
+ color_count: bytes[at + 2] ?? 0,
269
+ reserved: bytes[at + 3] ?? 0,
270
+ planes: bytes.readUInt16LE(at + 4),
271
+ bit_count: bytes.readUInt16LE(at + 6),
272
+ declared_bytes: declaredBytes,
273
+ resource_id: id,
274
+ candidate_resource_indices: candidates.map(({ index }) => index),
275
+ same_language_resource_index: exact?.index ?? null,
276
+ size_matches: exact === undefined
277
+ ? null
278
+ : exact.payload.location.bytes === declaredBytes,
279
+ };
280
+ account(image);
281
+ images.push(image);
282
+ }
283
+ account({ resource_index: group.index, images: [] });
284
+ return { resource_index: group.index, images };
285
+ });
286
+ };
@@ -0,0 +1,63 @@
1
+ import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
2
+ import { readStableArtifact } from "../../artifacts/readStableArtifact.js";
3
+ import { ArtifactOperationError } from "../../domain/artifactOperationError.js";
4
+ import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisInputError, AnalysisResourceConstraintError, } from "../../domain/analysisErrorCore.js";
5
+ import { err, ok } from "../../domain/result.js";
6
+ import { PE_RESOURCES_PROVIDER } from "../../application/InvestigationProviders.js";
7
+ import { parsePeResources } from "./PeResourceParser.js";
8
+ /** Portable parser over one bounded, identity-checked regular file. */
9
+ export class PeResourcesProvider {
10
+ identity = PE_RESOURCES_PROVIDER;
11
+ async inspect(input, options) {
12
+ try {
13
+ const snapshot = await readStableArtifact(input.path, input.max_file_bytes, options?.signal);
14
+ return ok(await parsePeResources(snapshot.bytes, {
15
+ path: input.path,
16
+ sha256: snapshot.sha256,
17
+ bytes: snapshot.bytes.length,
18
+ }, input, options?.signal));
19
+ }
20
+ catch (cause) {
21
+ return err(peResourcesFailure(cause, input, options?.signal));
22
+ }
23
+ }
24
+ }
25
+ const peResourcesFailure = (cause, input, signal) => {
26
+ const operation = "inspect_pe_resources";
27
+ if (signal?.aborted)
28
+ return new AnalysisCancelledError(operation, { cause });
29
+ if (cause instanceof ArtifactReaderFailure) {
30
+ if (cause.reason === "limit")
31
+ return new AnalysisResourceConstraintError(operation, "memory", cause.message, {
32
+ max_file_bytes: input.max_file_bytes,
33
+ max_entries: input.max_entries,
34
+ }, { cause });
35
+ if (cause.reason === "integrity")
36
+ return new AnalysisArtifactChangedError(operation, input.path, cause.message, { cause });
37
+ if (cause.reason === "path" || cause.reason === "format")
38
+ return new AnalysisInputError(operation, { cause }, [
39
+ {
40
+ path: ["path"],
41
+ reason: "invalid_format",
42
+ message: cause.message,
43
+ },
44
+ ]);
45
+ if (cause.reason === "cancelled")
46
+ return new AnalysisCancelledError(operation, { cause });
47
+ }
48
+ if (cause instanceof Error && "code" in cause) {
49
+ if (cause.code === "EACCES" || cause.code === "EPERM")
50
+ return new AnalysisAccessDeniedError(operation, input.path, cause.code, {
51
+ cause,
52
+ });
53
+ if (cause.code === "ENOENT" || cause.code === "ENOTDIR")
54
+ return new AnalysisInputError(operation, { cause }, [
55
+ {
56
+ path: ["path"],
57
+ reason: "invalid_value",
58
+ message: `Selected PE image could not be read (${cause.code}): ${input.path}.`,
59
+ },
60
+ ]);
61
+ }
62
+ return new ArtifactOperationError(operation, cause instanceof ArtifactReaderFailure ? cause.reason : "io", undefined, cause instanceof Error ? cause.message : "PE artifact inspection failed.", { cause });
63
+ };
@@ -1,17 +1,40 @@
1
- /** Read through EOF, returning undefined on overflow; consume at most maxBytes + 1 bytes without closing the handle. */
2
- export const readBoundedFileBytes = async (handle, maxBytes) => {
1
+ /** Read through EOF, returning undefined on overflow; leave the handle open. */
2
+ export const readBoundedFileBytes = async (handle, maxBytes, signal, expectedSize) => {
3
3
  if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
4
4
  throw new RangeError("File byte limit must be a nonnegative safe integer");
5
- const chunks = [];
6
- const buffer = Buffer.allocUnsafe(Math.min(64 * 1_024, maxBytes + 1));
5
+ if (expectedSize !== undefined &&
6
+ (!Number.isSafeInteger(expectedSize) ||
7
+ expectedSize < 0 ||
8
+ expectedSize > maxBytes))
9
+ throw new RangeError("Expected file size must fit the byte limit");
10
+ if (expectedSize === undefined) {
11
+ const chunks = [];
12
+ const buffer = Buffer.allocUnsafe(Math.min(64 * 1_024, maxBytes + 1));
13
+ let total = 0;
14
+ for (;;) {
15
+ signal?.throwIfAborted();
16
+ const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, maxBytes - total + 1), null);
17
+ if (bytesRead === 0)
18
+ return Buffer.concat(chunks, total);
19
+ total += bytesRead;
20
+ if (total > maxBytes)
21
+ return undefined;
22
+ chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
23
+ }
24
+ }
25
+ const buffer = Buffer.allocUnsafe(expectedSize);
26
+ if (expectedSize === 0)
27
+ return buffer;
7
28
  let total = 0;
8
29
  for (;;) {
9
- const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, maxBytes - total + 1), null);
30
+ signal?.throwIfAborted();
31
+ const { bytesRead } = await handle.read(buffer, total, expectedSize - total, null);
10
32
  if (bytesRead === 0)
11
- return Buffer.concat(chunks, total);
33
+ return buffer.subarray(0, total);
12
34
  total += bytesRead;
13
35
  if (total > maxBytes)
14
36
  return undefined;
15
- chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
37
+ if (total === expectedSize)
38
+ return buffer;
16
39
  }
17
40
  };
@@ -223,12 +223,17 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
223
223
  }
224
224
  }
225
225
  };
226
- const read = async (processes) => {
226
+ const read = async (processes, signal) => {
227
+ signal?.throwIfAborted();
227
228
  if (processes.length === 0)
228
229
  return new Map();
229
- const binary = await compile();
230
+ const binary = await compile(signal);
230
231
  const pids = processes.map(({ pid }) => String(pid));
231
- const { stdout } = await execFileOutput(binary, pids, { timeout: 15_000 });
232
+ const { stdout } = await execFileOutput(binary, pids, {
233
+ timeout: 15_000,
234
+ ...(signal === undefined ? {} : { signal }),
235
+ });
236
+ signal?.throwIfAborted();
232
237
  const decoded = safeParseJson(stdout);
233
238
  if (!decoded.ok)
234
239
  throw new Error(`macOS process token helper returned invalid JSON: ${decoded.error}`, { cause: decoded.cause });
@@ -7,12 +7,14 @@ export class OwnedCommandFailure extends Error {
7
7
  snapshot;
8
8
  cleanupFailure;
9
9
  resources;
10
- constructor(reason, message, snapshot = null, cleanupFailure = null, options, resources = []) {
10
+ cleanupOwner;
11
+ constructor(reason, message, snapshot = null, cleanupFailure = null, options, resources = [], cleanupOwner) {
11
12
  super(message, options);
12
13
  this.reason = reason;
13
14
  this.snapshot = snapshot;
14
15
  this.cleanupFailure = cleanupFailure;
15
16
  this.resources = resources;
17
+ this.cleanupOwner = cleanupOwner;
16
18
  }
17
19
  }
18
20
  /** Execute a single owned process with independent cleanup and bounded diagnostic retention. */
@@ -102,14 +104,13 @@ const collectOwnedCommand = async (spawn, limits, launcher, deadline, callerSign
102
104
  }
103
105
  const stopped = await supervisor.stop();
104
106
  const snapshot = supervisor.snapshot();
105
- supervisor.dispose();
106
107
  if (stopped.status === "incomplete")
107
108
  throw new OwnedCommandFailure(failure?.reason ?? "process", failure?.message ?? "Command cleanup failed.", snapshot, stopped.reason, failure === undefined ? undefined : { cause: failure }, [
108
109
  spawn.runId,
109
110
  ...(spawn.cwd === undefined ? [] : [spawn.cwd]),
110
111
  `pid:${launched.ownership.leaderPid}`,
111
112
  `process-group:${launched.ownership.processGroupId}`,
112
- ]);
113
+ ], supervisor);
113
114
  if (failure !== undefined)
114
115
  throw new OwnedCommandFailure(failure.reason, failure.message, snapshot, failure.cleanupFailure, { cause: failure }, failure.resources);
115
116
  if (callerSignal?.aborted)