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
@@ -1,3 +1,4 @@
1
+ import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
1
2
  import { managedArtifactInspectionSchema, } from "../domain/managed/managedArtifact.js";
2
3
  import { readManagedPeLayout, } from "./ManagedPeReader.js";
3
4
  import { managedTableRowCounts, readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
@@ -73,7 +74,7 @@ const unavailableResult = (target, bytes, layout) => {
73
74
  : [
74
75
  "The PE has no CLI data directory; managed metadata and CIL are unavailable.",
75
76
  ];
76
- return managedArtifactInspectionSchema.parse({
77
+ return managedArtifactInspectionSchema.parse(admitManagedProjection({
77
78
  ...base(target, bytes, layout),
78
79
  classification: {
79
80
  status: malformed ? "malformed" : "not-managed",
@@ -83,7 +84,9 @@ const unavailableResult = (target, bytes, layout) => {
83
84
  managed_architecture: "unknown",
84
85
  evidence: [
85
86
  {
86
- code: malformed ? "cli-directory-malformed" : "cli-directory-absent",
87
+ code: malformed
88
+ ? "cli-directory-malformed"
89
+ : "cli-directory-absent",
87
90
  detail: limitations[0],
88
91
  file_offset: layout.cliIssue?.offset ?? null,
89
92
  },
@@ -106,7 +109,7 @@ const unavailableResult = (target, bytes, layout) => {
106
109
  issues,
107
110
  },
108
111
  limitations,
109
- });
112
+ }));
110
113
  };
111
114
  const runtimeFamilyFor = (cli, inventory, metadata, layout) => {
112
115
  const evidence = [
@@ -198,7 +201,7 @@ const runtimeClassification = ({ layout, metadata, inventory, }) => {
198
201
  const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
199
202
  ...base(target, bytes, layout),
200
203
  classification: {
201
- status: "malformed",
204
+ status: issue.code === "resource-limit" ? "managed" : "malformed",
202
205
  container: "pe",
203
206
  runtime_family: (layout.cli?.flags ?? 1) & 1 ? "unknown" : "mixed-clr-native",
204
207
  implementation: "unknown",
@@ -212,7 +215,7 @@ const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
212
215
  ],
213
216
  },
214
217
  metadata: {
215
- status: "malformed",
218
+ status: issue.code === "resource-limit" ? "partial" : "malformed",
216
219
  version: null,
217
220
  stream_names: [],
218
221
  table_row_counts: {},
@@ -225,7 +228,9 @@ const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
225
228
  attributes: [],
226
229
  coverage: { state: "partial", issues: [issue] },
227
230
  limitations: [
228
- "CLI metadata could not be read because the PE/CLI structure is malformed or unsupported.",
231
+ issue.code === "resource-limit"
232
+ ? "CLI metadata inspection stopped at its representation budget; omitted facts are unknown."
233
+ : "CLI metadata could not be read because the PE/CLI structure is malformed or unsupported.",
229
234
  ],
230
235
  });
231
236
  /** Inspect PE/CLI identity directly from local bytes without CLR loading. */
@@ -242,48 +247,55 @@ export const inspectManagedArtifactBytes = (bytes, target) => {
242
247
  catch (cause) {
243
248
  if (!(cause instanceof ManagedReaderFailure))
244
249
  throw cause;
245
- return managedArtifactInspectionSchema.parse(partialMetadataResult({
250
+ return managedArtifactInspectionSchema.parse(admitManagedProjection(partialMetadataResult({
246
251
  target,
247
252
  bytes,
248
253
  layout,
249
254
  issue: cause.issue,
250
- }));
255
+ })));
251
256
  }
252
257
  const resourceIssues = [];
253
258
  const resourceDirectory = readManagedResourceDirectory(layout, resourceIssues);
254
- const inventory = readManagedMetadataInventory(bytes, metadata, resourceDirectory);
255
- const issues = [...resourceIssues, ...inventory.issues];
256
- const limitations = [
257
- ...(issues.length === 0
258
- ? []
259
- : [
260
- "At least one metadata or resource item could not be read; coverage is partial.",
261
- ]),
262
- "Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
263
- ];
264
- return managedArtifactInspectionSchema.parse({
265
- ...base(target, bytes, layout),
266
- classification: {
267
- status: "managed",
268
- container: "pe",
269
- ...runtimeClassification({ layout, metadata, inventory }),
270
- },
271
- metadata: {
272
- status: issues.length === 0 ? "complete" : "partial",
273
- version: metadata.version,
274
- stream_names: metadata.streamNames,
275
- table_row_counts: managedTableRowCounts(metadata),
276
- },
277
- module: inventory.module,
278
- assembly: inventory.assembly,
279
- target_frameworks: inventory.targetFrameworks,
280
- references: inventory.references,
281
- resources: inventory.resources,
282
- attributes: inventory.attributes,
283
- coverage: {
284
- state: issues.length === 0 ? "complete" : "partial",
285
- issues,
286
- },
287
- limitations,
288
- });
259
+ try {
260
+ const inventory = readManagedMetadataInventory(bytes, metadata, resourceDirectory);
261
+ const issues = [...resourceIssues, ...inventory.issues];
262
+ const limitations = [
263
+ ...(issues.length === 0
264
+ ? []
265
+ : [
266
+ "At least one metadata or resource item could not be read; coverage is partial.",
267
+ ]),
268
+ "Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
269
+ ];
270
+ return managedArtifactInspectionSchema.parse(admitManagedProjection({
271
+ ...base(target, bytes, layout),
272
+ classification: {
273
+ status: "managed",
274
+ container: "pe",
275
+ ...runtimeClassification({ layout, metadata, inventory }),
276
+ },
277
+ metadata: {
278
+ status: issues.length === 0 ? "complete" : "partial",
279
+ version: metadata.version,
280
+ stream_names: metadata.streamNames,
281
+ table_row_counts: managedTableRowCounts(metadata),
282
+ },
283
+ module: inventory.module,
284
+ assembly: inventory.assembly,
285
+ target_frameworks: inventory.targetFrameworks,
286
+ references: inventory.references,
287
+ resources: inventory.resources,
288
+ attributes: inventory.attributes,
289
+ coverage: {
290
+ state: issues.length === 0 ? "complete" : "partial",
291
+ issues,
292
+ },
293
+ limitations,
294
+ }, managedDecodeBudget(metadata)));
295
+ }
296
+ catch (cause) {
297
+ if (!(cause instanceof ManagedReaderFailure))
298
+ throw cause;
299
+ return managedArtifactInspectionSchema.parse(admitManagedProjection(partialMetadataResult({ target, bytes, layout, issue: cause.issue })));
300
+ }
289
301
  };
@@ -0,0 +1,80 @@
1
+ import { createHash } from "node:crypto";
2
+ import { managedFailure } from "./ManagedReaderFailure.js";
3
+ /** Per-inspection capacity for eagerly retained metadata and its JSON projection. */
4
+ const MAX_METADATA_REPRESENTATION_BYTES = 64 * 1024 * 1024;
5
+ /** The layout owns decoding capacity and heap identity for all of its consumers. */
6
+ export class ManagedDecodeBudget {
7
+ #remaining = MAX_METADATA_REPRESENTATION_BYTES;
8
+ #strings = new Map();
9
+ #digests = new WeakMap();
10
+ reserve(bytes, offset) {
11
+ if (!Number.isSafeInteger(bytes) || bytes < 0 || bytes > this.#remaining)
12
+ throw managedFailure("resource-limit", "metadata.representation", `Managed metadata exceeds the ${String(MAX_METADATA_REPRESENTATION_BYTES)} byte representation budget`, offset);
13
+ this.#remaining -= bytes;
14
+ }
15
+ /** UTF-8 cannot decode to more UTF-16 units than bytes; JSON uses at most six bytes per unit. */
16
+ reserveString(encodedBytes, offset) {
17
+ this.reserve(encodedBytes * 6 + 2, offset);
18
+ }
19
+ /** Snapshot buffers are immutable within a layout; cache exact backing-buffer ranges. */
20
+ digest(bytes, algorithm) {
21
+ let ranges = this.#digests.get(bytes.buffer);
22
+ if (ranges === undefined) {
23
+ ranges = new Map();
24
+ this.#digests.set(bytes.buffer, ranges);
25
+ }
26
+ const key = `${algorithm}:${String(bytes.byteOffset)}:${String(bytes.byteLength)}`;
27
+ const cached = ranges.get(key);
28
+ if (cached !== undefined)
29
+ return cached;
30
+ this.reserve(256, null);
31
+ const digest = createHash(algorithm).update(bytes).digest("hex");
32
+ ranges.set(key, digest);
33
+ return digest;
34
+ }
35
+ cachedString(index) {
36
+ return this.#strings.get(index);
37
+ }
38
+ cacheString(index, value, encodedBytes) {
39
+ this.#strings.set(index, { value, encodedBytes });
40
+ }
41
+ }
42
+ const budgets = new WeakMap();
43
+ /** Transfer metadata-root admission capacity to its completed immutable layout. */
44
+ export const attachManagedDecodeBudget = (layout, budget) => {
45
+ budgets.set(layout, budget);
46
+ };
47
+ /** Share one owner for the lifetime of the admitted layout, including all inspection facets. */
48
+ export const managedDecodeBudget = (layout) => {
49
+ let budget = budgets.get(layout);
50
+ if (budget === undefined) {
51
+ budget = new ManagedDecodeBudget();
52
+ budgets.set(layout, budget);
53
+ }
54
+ return budget;
55
+ };
56
+ /** Admit repeated values too: shared heap strings still expand at the JSON boundary. */
57
+ export const admitManagedProjection = (value, budget = new ManagedDecodeBudget()) => {
58
+ const visit = (item) => {
59
+ if (typeof item === "string") {
60
+ budget.reserveString(item.length, null);
61
+ }
62
+ else if (Array.isArray(item)) {
63
+ budget.reserve(item.length + 2, null);
64
+ for (const child of item)
65
+ visit(child);
66
+ }
67
+ else if (item !== null && typeof item === "object") {
68
+ budget.reserve(2, null);
69
+ for (const key of Object.keys(item)) {
70
+ budget.reserve(key.length * 6 + 4, null);
71
+ visit(Reflect.get(item, key));
72
+ }
73
+ }
74
+ else {
75
+ budget.reserve(32, null);
76
+ }
77
+ };
78
+ visit(value);
79
+ return value;
80
+ };
@@ -1,3 +1,4 @@
1
+ import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
1
2
  import { managedMemberInspectionSchema, } from "../domain/managed/managedArtifact.js";
2
3
  import { readManagedPeLayout, } from "./ManagedPeReader.js";
3
4
  import { readManagedResourceDirectory, managedTableRowCounts, readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
@@ -5,7 +6,7 @@ import { readManagedMetadataLayout } from "./ManagedMetadataLayout.js";
5
6
  import { ManagedReaderFailure, uniqueManagedParseIssues, } from "./ManagedReaderFailure.js";
6
7
  import { parseTypes, typeRanges } from "./ManagedMemberInspectorCore.js";
7
8
  import { edges, parseFields, parseMemberRefs, parseMethods, } from "./ManagedMemberRows.js";
8
- const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.parse({
9
+ const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.parse(admitManagedProjection({
9
10
  artifact: {
10
11
  path: target.path,
11
12
  sha256: target.sha256,
@@ -14,7 +15,11 @@ const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.pars
14
15
  },
15
16
  module: null,
16
17
  metadata: {
17
- status: issue === null ? "absent" : "malformed",
18
+ status: issue === null
19
+ ? "absent"
20
+ : issue.code === "resource-limit"
21
+ ? "partial"
22
+ : "malformed",
18
23
  version: null,
19
24
  table_row_counts: {},
20
25
  },
@@ -38,7 +43,7 @@ const unavailable = (target, bytes, issue) => managedMemberInspectionSchema.pars
38
43
  ? "The PE has no admitted CLI metadata; managed member inspection is unavailable."
39
44
  : "The CLI metadata could not be admitted; managed member inspection is unavailable.",
40
45
  ],
41
- });
46
+ }));
42
47
  const readMemberInventory = (bytes, pe, issues) => {
43
48
  const cli = pe.cli;
44
49
  if (cli === null)
@@ -75,7 +80,7 @@ export const inspectManagedMembersBytes = (bytes, target) => {
75
80
  methods.methods.some((method) => method.body.status === "partial" ||
76
81
  method.body.status === "malformed");
77
82
  const related = edges(methods.methods, methods.core, fields.core, memberRefs.core);
78
- return managedMemberInspectionSchema.parse({
83
+ return managedMemberInspectionSchema.parse(admitManagedProjection({
79
84
  artifact: {
80
85
  path: target.path,
81
86
  sha256: target.sha256,
@@ -100,7 +105,9 @@ export const inspectManagedMembersBytes = (bytes, target) => {
100
105
  call_edges: related.callEdges,
101
106
  field_accesses: related.fieldAccesses,
102
107
  coverage: {
103
- state: issues.length === 0 && !incompleteMembers ? "complete" : "partial",
108
+ state: issues.length === 0 && !incompleteMembers
109
+ ? "complete"
110
+ : "partial",
104
111
  issues: coverageIssues,
105
112
  },
106
113
  limitations: [
@@ -108,7 +115,7 @@ export const inspectManagedMembersBytes = (bytes, target) => {
108
115
  "CIL instruction anchors are decoded from file-backed method bodies only; no target assembly is loaded or executed.",
109
116
  "Signatures are decoded for common ECMA-335 primitive, class, valuetype, pointer, byref, array, and generic variable forms; unsupported forms retain raw signature hashes.",
110
117
  ],
111
- });
118
+ }, managedDecodeBudget(layout)));
112
119
  }
113
120
  catch (cause) {
114
121
  if (cause instanceof ManagedReaderFailure)
@@ -233,10 +233,10 @@ const callingConvention = (value) => {
233
233
  : `unknown:${String(base)}`;
234
234
  return flags.length === 0 ? name : `${name} ${flags.join(" ")}`;
235
235
  };
236
- export const signature = (blob) => {
236
+ export const signature = (blob, rawSha256) => {
237
237
  const raw = {
238
238
  raw_length: blob.length,
239
- raw_sha256: sha256Bytes(blob),
239
+ raw_sha256: rawSha256 ?? sha256Bytes(blob),
240
240
  };
241
241
  try {
242
242
  if (blob.length === 0)
@@ -393,7 +393,7 @@ export const decodeInstructions = (il) => {
393
393
  const truncated = offset < il.length && issue === null ? 1 : 0;
394
394
  return { parsed, instructionStarts, count: parsed.length, truncated, issue };
395
395
  };
396
- export const parseExceptionRegions = (bytes, offset, methodEnd) => {
396
+ export const parseExceptionRegions = (bytes, offset, methodEnd, budget) => {
397
397
  const regions = [];
398
398
  let sectionOffset = offset;
399
399
  let hasMoreSections = true;
@@ -423,7 +423,9 @@ export const parseExceptionRegions = (bytes, offset, methodEnd) => {
423
423
  (bytes[sectionOffset + 2] !== 0 || bytes[sectionOffset + 3] !== 0))
424
424
  return malformedExceptionRegions("Small exception section reserved bytes are nonzero", regions);
425
425
  const count = (size - 4) / clauseSize;
426
- regions.push(...readExceptionClauses(bytes, sectionOffset + 4, count, fat));
426
+ budget?.reserve(count * 256, sectionOffset);
427
+ for (const region of readExceptionClauses(bytes, sectionOffset + 4, count, fat))
428
+ regions.push(region);
427
429
  hasMoreSections = (kind & 0x80) !== 0;
428
430
  sectionOffset += size;
429
431
  }
@@ -1,3 +1,4 @@
1
+ import { managedDecodeBudget } from "./ManagedDecodeBudget.js";
1
2
  import { createDeclaringTypeLookup, signature, } from "./ManagedMemberInspectorCore.js";
2
3
  import { metadataToken, metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, readMetadataBlob, readMetadataString, } from "./ManagedMetadataHeaps.js";
3
4
  import { readManagedValue } from "./ManagedReaderFailure.js";
@@ -23,7 +24,7 @@ export const parseFields = (bytes, layout, ranges) => {
23
24
  declaring_type: declared?.fullName ?? null,
24
25
  name,
25
26
  flags,
26
- signature: signature(sig),
27
+ signature: budgetedSignature(sig, layout),
27
28
  });
28
29
  core.set(token, { token, name });
29
30
  }, issues);
@@ -57,7 +58,7 @@ export const parseMemberRefs = (bytes, layout) => {
57
58
  row_offset: cursor.start,
58
59
  parent_token: metadataCodedToken(parentRaw, 3, [2, 1, 26, 6, 27], layout.rowCounts),
59
60
  name,
60
- signature: signature(sig),
61
+ signature: budgetedSignature(sig, layout),
61
62
  });
62
63
  core.set(token, { token, name });
63
64
  }, issues);
@@ -90,8 +91,8 @@ export const parseMethods = ({ bytes, layout, pe, ranges, }) => {
90
91
  rva,
91
92
  impl_flags: implFlags,
92
93
  flags,
93
- signature: signature(sig),
94
- body: methodBody(bytes, pe, rva, { implFlags, flags }),
94
+ signature: budgetedSignature(sig, layout),
95
+ body: methodBody(bytes, pe, rva, { implFlags, flags }, managedDecodeBudget(layout)),
95
96
  });
96
97
  core.set(token, {
97
98
  token,
@@ -146,3 +147,7 @@ export const edges = (methods, methodCore, fieldCore, refCore) => {
146
147
  }
147
148
  return { callEdges, fieldAccesses };
148
149
  };
150
+ const budgetedSignature = (bytes, layout) => {
151
+ managedDecodeBudget(layout).reserve(bytes.length * 256, layout.blob.offset);
152
+ return signature(bytes, managedDecodeBudget(layout).digest(bytes, "sha256"));
153
+ };
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { managedDecodeBudget } from "./ManagedDecodeBudget.js";
2
3
  import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
3
4
  import { managedFailure } from "./ManagedReaderFailure.js";
4
5
  const requireRange = (bytes, offset, length, scope) => {
@@ -73,14 +74,25 @@ export const readMetadataString = (bytes, layout, index, heapExtent) => {
73
74
  if (index < 0 || index >= layout.strings.size)
74
75
  throw managedFailure("invalid-heap-index", "metadata.#Strings", "String heap index is outside #Strings", layout.strings.offset + Math.max(index, 0));
75
76
  const start = layout.strings.offset + index;
77
+ const cached = managedDecodeBudget(layout).cachedString(index);
78
+ if (cached !== undefined && cached.encodedBytes <= heapExtent) {
79
+ managedDecodeBudget(layout).reserveString(cached.encodedBytes, start);
80
+ return cached.value;
81
+ }
76
82
  const maximum = Math.min(layout.strings.offset + layout.strings.size, start + heapExtent + 1);
77
83
  let end = start;
78
84
  while (end < maximum && bytes[end] !== 0)
79
85
  end += 1;
80
86
  if (end === maximum)
81
87
  throw managedFailure("invalid-string", "metadata.#Strings", "String heap item has no terminator within #Strings", start);
88
+ managedDecodeBudget(layout).reserveString(end - start, start);
82
89
  try {
83
- return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes.subarray(start, end));
90
+ const value = new TextDecoder("utf-8", {
91
+ fatal: true,
92
+ ignoreBOM: true,
93
+ }).decode(bytes.subarray(start, end));
94
+ managedDecodeBudget(layout).cacheString(index, value, end - start);
95
+ return value;
84
96
  }
85
97
  catch (cause) {
86
98
  void cause;
@@ -127,16 +139,14 @@ export const readMetadataGuid = (bytes, layout, index) => {
127
139
  export const metadataToken = (table, row) => `0x${(table * 0x01_00_00_00 + row).toString(16).padStart(8, "0")}`;
128
140
  /** Hash bytes without exposing their contents. */
129
141
  export const sha256Bytes = (bytes) => createHash("sha256").update(bytes).digest("hex");
130
- /** Derive the conventional strong-name token from a full public key. */
131
- export const strongNameToken = (publicKey) => Buffer.from(createHash("sha1").update(publicKey).digest().subarray(-8))
132
- .reverse()
133
- .toString("hex");
134
142
  /** Create a cursor bounded to one admitted metadata table row. */
135
143
  export const metadataRowCursor = (bytes, layout, table, row) => {
136
144
  const descriptor = layout.table(table);
137
145
  const start = metadataRowOffset(layout, table, row);
138
146
  if (descriptor === undefined)
139
147
  throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
148
+ // Reserve per-row object/index bookkeeping before readers retain decoded facts.
149
+ managedDecodeBudget(layout).reserve(256, start);
140
150
  return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
141
151
  };
142
152
  /** Decode a metadata coded index without signed 32-bit coercion. */
@@ -1,14 +1,20 @@
1
+ import { managedDecodeBudget } from "./ManagedDecodeBudget.js";
1
2
  import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
2
- import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString, sha256Bytes, strongNameToken, } from "./ManagedMetadataHeaps.js";
3
+ import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString, } from "./ManagedMetadataHeaps.js";
3
4
  import { managedFailure } from "./ManagedReaderFailure.js";
4
- const publicKeyIdentity = (bytes, kind) => ({
5
+ const publicKeyIdentity = (bytes, kind, layout) => ({
5
6
  kind: bytes.length === 0 ? "none" : kind,
6
7
  byte_length: bytes.length,
7
- sha256: bytes.length === 0 ? null : sha256Bytes(bytes),
8
+ sha256: bytes.length === 0
9
+ ? null
10
+ : managedDecodeBudget(layout).digest(bytes, "sha256"),
8
11
  token: bytes.length === 0
9
12
  ? null
10
13
  : kind === "public-key"
11
- ? strongNameToken(bytes)
14
+ ? Buffer.from(managedDecodeBudget(layout).digest(bytes, "sha1"), "hex")
15
+ .subarray(-8)
16
+ .reverse()
17
+ .toString("hex")
12
18
  : bytes.length === 8
13
19
  ? bytes.toString("hex")
14
20
  : null,
@@ -55,7 +61,7 @@ export const readAssembly = (bytes, layout, heapExtent) => {
55
61
  culture: culture.length === 0 ? null : culture,
56
62
  flags,
57
63
  hash_algorithm: hashAlgorithm,
58
- public_key: publicKeyIdentity(key, (flags & 1) === 0 ? "public-key-token" : "public-key"),
64
+ public_key: publicKeyIdentity(key, (flags & 1) === 0 ? "public-key-token" : "public-key", layout),
59
65
  token: metadataToken(32, 1),
60
66
  row_offset: table.offset,
61
67
  };
@@ -78,8 +84,10 @@ export const readAssemblyReference = (bytes, layout, row, heapExtent) => {
78
84
  version,
79
85
  culture: culture.length === 0 ? null : culture,
80
86
  flags,
81
- public_key_or_token: publicKeyIdentity(keyOrToken, (flags & 1) === 0 ? "public-key-token" : "public-key"),
82
- hash_value_sha256: hashValue.length === 0 ? null : sha256Bytes(hashValue),
87
+ public_key_or_token: publicKeyIdentity(keyOrToken, (flags & 1) === 0 ? "public-key-token" : "public-key", layout),
88
+ hash_value_sha256: hashValue.length === 0
89
+ ? null
90
+ : managedDecodeBudget(layout).digest(hashValue, "sha256"),
83
91
  hash_value_length: hashValue.length,
84
92
  token: metadataToken(35, row),
85
93
  row_offset: metadataRowOffset(layout, 35, row),
@@ -191,7 +199,7 @@ const decodeCompressedLength = (blob, offset) => {
191
199
  };
192
200
  return undefined;
193
201
  };
194
- const decodeFixedString = (blob) => {
202
+ const decodeFixedString = (blob, layout) => {
195
203
  if (blob.length < 3 || blob.readUInt16LE(0) !== 1 || blob[2] === 0xff)
196
204
  return null;
197
205
  const length = decodeCompressedLength(blob, 2);
@@ -200,6 +208,7 @@ const decodeFixedString = (blob) => {
200
208
  const start = 2 + length.prefix;
201
209
  if (start > blob.length - length.length)
202
210
  return null;
211
+ managedDecodeBudget(layout).reserveString(length.length, layout.blob.offset);
203
212
  try {
204
213
  return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(blob.subarray(start, start + length.length));
205
214
  }
@@ -236,9 +245,9 @@ export const readCustomAttribute = (bytes, layout, row, heapExtent) => {
236
245
  constructor_token: metadataCodedToken(typeRaw, 3, [undefined, undefined, 6, 10], layout.rowCounts),
237
246
  type_name: typeName,
238
247
  value_length: value.length,
239
- value_sha256: sha256Bytes(value),
248
+ value_sha256: managedDecodeBudget(layout).digest(value, "sha256"),
240
249
  decoded_fixed_string: typeName === "System.Runtime.Versioning.TargetFrameworkAttribute"
241
- ? decodeFixedString(value)
250
+ ? decodeFixedString(value, layout)
242
251
  : null,
243
252
  token: metadataToken(12, row),
244
253
  row_offset: cursor.start,
@@ -283,7 +292,7 @@ export const readResource = ({ bytes, layout, row, directory, issues, }) => {
283
292
  });
284
293
  }
285
294
  else {
286
- dataSha256 = sha256Bytes(bytes.subarray(start + 4, start + 4 + dataLength));
295
+ dataSha256 = managedDecodeBudget(layout).digest(bytes.subarray(start + 4, start + 4 + dataLength), "sha256");
287
296
  }
288
297
  }
289
298
  }
@@ -1,3 +1,4 @@
1
+ import { attachManagedDecodeBudget, ManagedDecodeBudget, } from "./ManagedDecodeBudget.js";
1
2
  import { managedFailure } from "./ManagedReaderFailure.js";
2
3
  import { computeRowSize, } from "./ManagedMetadataRowSizes.js";
3
4
  export const METADATA_TABLE_NAMES = [
@@ -115,15 +116,17 @@ const codedSize = (name, rowCounts) => {
115
116
  return maximum < 2 ** (16 - descriptor.bits) ? 2 : 4;
116
117
  };
117
118
  const tableSize = (index, rows) => (rows[index] ?? 0) < 0x1_0000 ? 2 : 4;
118
- const readMetadataStreams = (bytes, rootOffset) => {
119
+ const readMetadataStreams = (bytes, rootOffset, budget) => {
119
120
  if (bytes.readUInt32LE(0) !== 0x424a_5342)
120
121
  throw managedFailure("invalid-metadata-root", "metadata.signature", "CLI metadata signature is not BSJB", rootOffset);
121
122
  const versionLength = bytes.readUInt32LE(12);
122
123
  requireRange(bytes, 16, versionLength, "metadata.version");
123
124
  const versionBytes = bytes.subarray(16, 16 + versionLength);
124
125
  const zero = versionBytes.indexOf(0);
126
+ const decodedVersionLength = zero < 0 ? versionBytes.length : zero;
127
+ budget.reserveString(decodedVersionLength, rootOffset + 16);
125
128
  const version = versionBytes
126
- .subarray(0, zero < 0 ? versionBytes.length : zero)
129
+ .subarray(0, decodedVersionLength)
127
130
  .toString("utf8");
128
131
  let cursor = align4(16 + versionLength);
129
132
  requireRange(bytes, cursor, 4, "metadata.stream-count");
@@ -220,7 +223,8 @@ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
220
223
  if (size < 20 || rootOffset < 0 || rootOffset > artifact.length - size)
221
224
  throw managedFailure("invalid-metadata-root", "metadata.root", "CLI metadata directory leaves the artifact byte range", rootOffset);
222
225
  const bytes = artifact.subarray(rootOffset, rootOffset + size);
223
- const { streams, version } = readMetadataStreams(bytes, rootOffset);
226
+ const budget = new ManagedDecodeBudget();
227
+ const { streams, version } = readMetadataStreams(bytes, rootOffset, budget);
224
228
  const { tableBytes, tablesOffset, heaps, valid } = readTablesHeader(artifact, streams);
225
229
  const rowCounts = readRowCounts(tableBytes, valid);
226
230
  const tables = buildMetadataTables({
@@ -230,7 +234,7 @@ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
230
234
  valid,
231
235
  tablesOffset,
232
236
  });
233
- return {
237
+ const layout = {
234
238
  rootOffset,
235
239
  size,
236
240
  version,
@@ -247,6 +251,8 @@ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
247
251
  tableIndexSize: (index) => tableSize(index, rowCounts),
248
252
  codedIndexSize: (name) => codedSize(name, rowCounts),
249
253
  };
254
+ attachManagedDecodeBudget(layout, budget);
255
+ return layout;
250
256
  };
251
257
  /** Resolve a one-based metadata row to its exact file offset. */
252
258
  export const metadataRowOffset = (layout, table, row) => {
@@ -40,12 +40,11 @@ const readMethodBodyHeader = (bytes, offset) => {
40
40
  localSig: bytes.readUInt32LE(offset + 8),
41
41
  };
42
42
  };
43
- const readExceptionRegions = (bytes, sectionOffset, methodEnd, ilSize, instructionOffsets) => validateExceptionRegionRanges(parseExceptionRegions(bytes, sectionOffset, methodEnd), ilSize, instructionOffsets);
44
43
  /** Decode admitted managed CIL, retaining unavailable implementation metadata as partial. */
45
44
  export const methodBody = (bytes, pe, rva, implementation = {
46
45
  implFlags: 0,
47
46
  flags: 0,
48
- }) => {
47
+ }, budget) => {
49
48
  if (rva === 0)
50
49
  return emptyMethodBody(rva, "absent", null);
51
50
  if ((implementation.implFlags & 7) !== 0 ||
@@ -62,6 +61,9 @@ export const methodBody = (bytes, pe, rva, implementation = {
62
61
  if (ilOffset > bytes.length - header.ilSize)
63
62
  throw new RangeError("Method IL bytes leave artifact");
64
63
  const il = bytes.subarray(ilOffset, ilOffset + header.ilSize);
64
+ // One byte can produce an instruction record, start index, normalized tuple,
65
+ // and anchor. Reserve conservative bookkeeping capacity before decoding.
66
+ budget?.reserve(il.length * 256, ilOffset);
65
67
  const decoded = decodeInstructions(il);
66
68
  const opcodeCounts = {};
67
69
  for (const instruction of decoded.parsed)
@@ -83,7 +85,7 @@ export const methodBody = (bytes, pe, rva, implementation = {
83
85
  const methodEnd = ilOffset + header.ilSize;
84
86
  const sectionOffset = (methodEnd + 3) & ~3;
85
87
  const exceptionRegions = header.format === "fat" && (header.flags & 8) !== 0
86
- ? readExceptionRegions(bytes, sectionOffset, offset + methodExtent, header.ilSize, decoded.instructionStarts)
88
+ ? validateExceptionRegionRanges(parseExceptionRegions(bytes, sectionOffset, offset + methodExtent, budget), header.ilSize, decoded.instructionStarts)
87
89
  : null;
88
90
  const status = bodyStatus(decoded.issue, decoded.truncated, exceptionRegions);
89
91
  return {
@@ -115,6 +117,9 @@ export const methodBody = (bytes, pe, rva, implementation = {
115
117
  };
116
118
  }
117
119
  catch (cause) {
120
+ if (cause instanceof ManagedReaderFailure &&
121
+ cause.issue.code === "resource-limit")
122
+ throw cause;
118
123
  if (!(cause instanceof ManagedReaderFailure) &&
119
124
  !(cause instanceof RangeError))
120
125
  throw cause;
@@ -1,3 +1,4 @@
1
+ import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
1
2
  import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/managedArtifact.js";
2
3
  import {} from "./ManagedMetadataLayout.js";
3
4
  import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataString, } from "./ManagedMetadataHeaps.js";
@@ -275,7 +276,7 @@ export const nativeBoundarySummary = (native, counts) => ({
275
276
  native.managed_native_header_size !== 0 ||
276
277
  native.native_entry_point,
277
278
  });
278
- export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse({
279
+ export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse(admitManagedProjection({
279
280
  artifact: {
280
281
  path: target.path,
281
282
  sha256: target.sha256,
@@ -311,4 +312,4 @@ export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory
311
312
  "Managed metadata tokens are build-local coordinates and are only meaningful with the reported artifact SHA-256 and MVID.",
312
313
  "ReadyToRun, NativeAOT, C++/CLI, and IL2CPP native semantics require separately selected native-provider evidence; this tool does not translate managed tokens into native addresses.",
313
314
  ],
314
- });
315
+ }, managedDecodeBudget(layout)));