rea-agents 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/README.md +72 -95
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -1,15 +1,15 @@
1
- import { codedToken, declaringType, rowCursor, signature, } from "./ManagedMemberInspectorCore.js";
2
- import { metadataToken, readMetadataBlob, readMetadataString, } from "./ManagedMetadataHeaps.js";
1
+ import { declaringType, signature, } from "./ManagedMemberInspectorCore.js";
2
+ import { metadataToken, metadataRowCursor, metadataCodedToken, readMetadataBlob, readMetadataString, } from "./ManagedMetadataHeaps.js";
3
3
  import { methodBody } from "./ManagedMethodBodyReader.js";
4
- export const parseFields = (bytes, layout, ranges, maxBytes) => {
4
+ export const parseFields = (bytes, layout, ranges) => {
5
5
  const fields = [];
6
6
  const core = new Map();
7
7
  const table = layout.table(4);
8
8
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
9
- const cursor = rowCursor(bytes, layout, 4, row);
9
+ const cursor = metadataRowCursor(bytes, layout, 4, row);
10
10
  const flags = cursor.readUInt16();
11
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
12
- const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
11
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), layout.strings.size);
12
+ const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), layout.blob.size);
13
13
  const declared = declaringType(ranges, "field", row);
14
14
  const token = metadataToken(4, row);
15
15
  fields.push({
@@ -25,20 +25,20 @@ export const parseFields = (bytes, layout, ranges, maxBytes) => {
25
25
  }
26
26
  return { fields, core };
27
27
  };
28
- export const parseMemberRefs = (bytes, layout, maxBytes) => {
28
+ export const parseMemberRefs = (bytes, layout) => {
29
29
  const refs = [];
30
30
  const core = new Map();
31
31
  const table = layout.table(10);
32
32
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
33
- const cursor = rowCursor(bytes, layout, 10, row);
33
+ const cursor = metadataRowCursor(bytes, layout, 10, row);
34
34
  const parentRaw = cursor.readIndex(layout.codedIndexSize("MemberRefParent"));
35
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
36
- const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
35
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), layout.strings.size);
36
+ const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), layout.blob.size);
37
37
  const token = metadataToken(10, row);
38
38
  refs.push({
39
39
  token,
40
40
  row_offset: cursor.start,
41
- parent_token: codedToken(parentRaw, 3, [2, 1, 26, 6, 27]),
41
+ parent_token: metadataCodedToken(parentRaw, 3, [2, 1, 26, 6, 27]),
42
42
  name,
43
43
  signature: signature(sig),
44
44
  });
@@ -46,17 +46,17 @@ export const parseMemberRefs = (bytes, layout, maxBytes) => {
46
46
  }
47
47
  return { refs, core };
48
48
  };
49
- export const parseMethods = ({ bytes, layout, pe, ranges, maxBytes, limits, }) => {
49
+ export const parseMethods = ({ bytes, layout, pe, ranges, }) => {
50
50
  const methods = [];
51
51
  const core = new Map();
52
52
  const table = layout.table(6);
53
53
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
54
- const cursor = rowCursor(bytes, layout, 6, row);
54
+ const cursor = metadataRowCursor(bytes, layout, 6, row);
55
55
  const rva = cursor.readUInt32();
56
56
  const implFlags = cursor.readUInt16();
57
57
  const flags = cursor.readUInt16();
58
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
59
- const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
58
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), layout.strings.size);
59
+ const sig = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), layout.blob.size);
60
60
  cursor.readIndex(layout.tableIndexSize(8));
61
61
  const declared = declaringType(ranges, "method", row);
62
62
  const token = metadataToken(6, row);
@@ -70,7 +70,7 @@ export const parseMethods = ({ bytes, layout, pe, ranges, maxBytes, limits, }) =
70
70
  impl_flags: implFlags,
71
71
  flags,
72
72
  signature: signature(sig),
73
- body: methodBody(bytes, pe, rva, limits),
73
+ body: methodBody(bytes, pe, rva),
74
74
  });
75
75
  core.set(token, { token, name, declaringType: declared?.fullName ?? null });
76
76
  }
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
2
3
  import { managedFailure } from "./ManagedReaderFailure.js";
3
4
  const requireRange = (bytes, offset, length, scope) => {
4
5
  if (offset < 0 || length < 0 || offset > bytes.length - length)
@@ -65,19 +66,19 @@ const compressedLength = (bytes, offset, scope) => {
65
66
  }
66
67
  throw managedFailure("invalid-blob", scope, "Metadata blob uses a reserved compressed-length prefix", offset);
67
68
  };
68
- /** Read one bounded UTF-8 value from #Strings. */
69
- export const readMetadataString = (bytes, layout, index, maxBytes) => {
69
+ /** Read one UTF-8 value from #Strings within its PE/CLI stream extent. */
70
+ export const readMetadataString = (bytes, layout, index, heapExtent) => {
70
71
  if (index === 0)
71
72
  return "";
72
73
  if (index < 0 || index >= layout.strings.size)
73
74
  throw managedFailure("invalid-heap-index", "metadata.#Strings", "String heap index is outside #Strings", layout.strings.offset + Math.max(index, 0));
74
75
  const start = layout.strings.offset + index;
75
- const maximum = Math.min(layout.strings.offset + layout.strings.size, start + maxBytes + 1);
76
+ const maximum = Math.min(layout.strings.offset + layout.strings.size, start + heapExtent + 1);
76
77
  let end = start;
77
78
  while (end < maximum && bytes[end] !== 0)
78
79
  end += 1;
79
80
  if (end === maximum)
80
- throw managedFailure("limit-exceeded", "metadata.#Strings", `String heap item exceeds max_heap_item_bytes ${String(maxBytes)}`, start);
81
+ throw managedFailure("invalid-string", "metadata.#Strings", "String heap item has no terminator within #Strings", start);
81
82
  try {
82
83
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes.subarray(start, end));
83
84
  }
@@ -85,16 +86,16 @@ export const readMetadataString = (bytes, layout, index, maxBytes) => {
85
86
  throw managedFailure("invalid-string", "metadata.#Strings", "String heap item is not valid UTF-8", start);
86
87
  }
87
88
  };
88
- /** Read one bounded item from #Blob without interpreting its contents. */
89
- export const readMetadataBlob = (bytes, layout, index, maxBytes) => {
89
+ /** Read one #Blob item while validating its encoded extent against the heap. */
90
+ export const readMetadataBlob = (bytes, layout, index, heapExtent) => {
90
91
  if (index === 0)
91
92
  return Buffer.alloc(0);
92
93
  if (index < 0 || index >= layout.blob.size)
93
94
  throw managedFailure("invalid-heap-index", "metadata.#Blob", "Blob heap index is outside #Blob", layout.blob.offset + Math.max(index, 0));
94
95
  const start = layout.blob.offset + index;
95
96
  const decoded = compressedLength(bytes, start, "metadata.#Blob");
96
- if (decoded.length > maxBytes)
97
- throw managedFailure("limit-exceeded", "metadata.#Blob", `Blob heap item exceeds max_heap_item_bytes ${String(maxBytes)}`, start);
97
+ if (decoded.length > heapExtent)
98
+ throw managedFailure("invalid-blob", "metadata.#Blob", "Blob length exceeds the admitted heap extent", start);
98
99
  const content = start + decoded.prefix;
99
100
  if (content > layout.blob.offset + layout.blob.size - decoded.length)
100
101
  throw managedFailure("invalid-blob", "metadata.#Blob", "Blob heap item leaves #Blob", start);
@@ -129,3 +130,20 @@ export const sha256Bytes = (bytes) => createHash("sha256").update(bytes).digest(
129
130
  export const strongNameToken = (publicKey) => Buffer.from(createHash("sha1").update(publicKey).digest().subarray(-8))
130
131
  .reverse()
131
132
  .toString("hex");
133
+ /** Create a cursor bounded to one admitted metadata table row. */
134
+ export const metadataRowCursor = (bytes, layout, table, row) => {
135
+ const descriptor = layout.table(table);
136
+ const start = metadataRowOffset(layout, table, row);
137
+ if (descriptor === undefined)
138
+ throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
139
+ return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
140
+ };
141
+ /** Decode a metadata coded index without signed 32-bit coercion. */
142
+ export const metadataCodedToken = (raw, bits, tables) => {
143
+ if (raw === 0)
144
+ return null;
145
+ const tag = raw & (2 ** bits - 1);
146
+ const row = Math.floor(raw / 2 ** bits);
147
+ const table = tables[tag];
148
+ return table === undefined || row === 0 ? null : metadataToken(table, row);
149
+ };
@@ -13,53 +13,44 @@ const safeRead = (operation, issues) => {
13
13
  return undefined;
14
14
  }
15
15
  };
16
- const pageRows = (descriptor, offset, limit, read) => {
16
+ const readRows = (descriptor, read) => {
17
17
  const total = descriptor?.rowCount ?? 0;
18
18
  const items = [];
19
- const end = Math.min(total, offset + limit);
20
- for (let index = offset; index < end; index += 1) {
19
+ for (let index = 0; index < total; index += 1) {
21
20
  const item = read(index + 1);
22
21
  if (item !== undefined)
23
22
  items.push(item);
24
23
  }
25
- return {
26
- items,
27
- offset,
28
- limit,
29
- total,
30
- returned: items.length,
31
- dropped: total - items.length,
32
- complete: offset === 0 && end === total && items.length === total,
33
- };
24
+ return items;
34
25
  };
35
26
  const uniqueIssues = (issues) => [
36
27
  ...new Map(issues.map((issue) => [JSON.stringify(issue), issue])).values(),
37
28
  ];
38
- const readPagedReferences = (bytes, layout, input, issues) => pageRows(layout.table(35), input.referenceOffset, input.referenceLimit, (row) => safeRead(() => readAssemblyReference(bytes, layout, row, input.maxHeapItemBytes), issues));
39
- const readPagedResources = ({ bytes, layout, input, resourceDirectory, issues, }) => pageRows(layout.table(40), input.resourceOffset, input.resourceLimit, (row) => safeRead(() => readResource({
29
+ const heapExtent = (layout) => Math.max(layout.strings.size, layout.blob.size);
30
+ const readReferences = (bytes, layout, issues) => readRows(layout.table(35), (row) => safeRead(() => readAssemblyReference(bytes, layout, row, heapExtent(layout)), issues));
31
+ const readResources = ({ bytes, layout, resourceDirectory, issues, }) => readRows(layout.table(40), (row) => safeRead(() => readResource({
40
32
  bytes,
41
33
  layout,
42
34
  row,
43
- maxBytes: input.maxHeapItemBytes,
44
35
  directory: resourceDirectory,
45
36
  issues,
46
37
  }), issues));
47
- const readPagedAttributes = (bytes, layout, input, issues) => pageRows(layout.table(12), input.attributeOffset, input.attributeLimit, (row) => safeRead(() => readCustomAttribute(bytes, layout, row, input.maxHeapItemBytes), issues));
48
- const collectReferenceNames = (bytes, layout, maxBytes, issues) => {
38
+ const readAttributes = (bytes, layout, issues) => readRows(layout.table(12), (row) => safeRead(() => readCustomAttribute(bytes, layout, row, heapExtent(layout)), issues));
39
+ const collectReferenceNames = (bytes, layout, issues) => {
49
40
  const names = [];
50
41
  const referenceTable = layout.table(35);
51
42
  for (let row = 1; row <= (referenceTable?.rowCount ?? 0); row += 1) {
52
- const reference = safeRead(() => readAssemblyReference(bytes, layout, row, maxBytes), issues);
43
+ const reference = safeRead(() => readAssemblyReference(bytes, layout, row, heapExtent(layout)), issues);
53
44
  if (reference !== undefined)
54
45
  names.push(reference.name);
55
46
  }
56
47
  return names;
57
48
  };
58
- const collectTargetFrameworks = (bytes, layout, maxBytes, issues) => {
49
+ const collectTargetFrameworks = (bytes, layout, issues) => {
59
50
  const targetFrameworks = [];
60
51
  const attributeTable = layout.table(12);
61
52
  for (let row = 1; row <= (attributeTable?.rowCount ?? 0); row += 1) {
62
- const attribute = safeRead(() => readCustomAttribute(bytes, layout, row, maxBytes), issues);
53
+ const attribute = safeRead(() => readCustomAttribute(bytes, layout, row, heapExtent(layout)), issues);
63
54
  if (attribute?.parent_token === metadataToken(32, 1) &&
64
55
  attribute.type_name ===
65
56
  "System.Runtime.Versioning.TargetFrameworkAttribute" &&
@@ -69,23 +60,23 @@ const collectTargetFrameworks = (bytes, layout, maxBytes, issues) => {
69
60
  }
70
61
  return targetFrameworks;
71
62
  };
72
- /** Inventory bounded identity tables without CLR reflection or execution. */
73
- export const readManagedMetadataInventory = (bytes, layout, input, resourceDirectory) => {
63
+ /** Inventory identity tables without CLR reflection or execution. */
64
+ export const readManagedMetadataInventory = (bytes, layout, resourceDirectory) => {
74
65
  const issues = [];
75
- const module = safeRead(() => readModule(bytes, layout, input.maxHeapItemBytes), issues) ??
66
+ const module = safeRead(() => readModule(bytes, layout, heapExtent(layout)), issues) ??
67
+ null;
68
+ const assembly = safeRead(() => readAssembly(bytes, layout, heapExtent(layout)), issues) ??
76
69
  null;
77
- const assembly = safeRead(() => readAssembly(bytes, layout, input.maxHeapItemBytes), issues) ?? null;
78
- const references = readPagedReferences(bytes, layout, input, issues);
79
- const resources = readPagedResources({
70
+ const references = readReferences(bytes, layout, issues);
71
+ const resources = readResources({
80
72
  bytes,
81
73
  layout,
82
- input,
83
74
  resourceDirectory,
84
75
  issues,
85
76
  });
86
- const attributes = readPagedAttributes(bytes, layout, input, issues);
87
- const referenceNames = collectReferenceNames(bytes, layout, input.maxHeapItemBytes, issues);
88
- const targetFrameworks = collectTargetFrameworks(bytes, layout, input.maxHeapItemBytes, issues);
77
+ const attributes = readAttributes(bytes, layout, issues);
78
+ const referenceNames = collectReferenceNames(bytes, layout, issues);
79
+ const targetFrameworks = collectTargetFrameworks(bytes, layout, issues);
89
80
  return {
90
81
  module,
91
82
  assembly,
@@ -1,13 +1,6 @@
1
1
  import { metadataRowOffset, } from "./ManagedMetadataLayout.js";
2
- import { MetadataRowCursor, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString, sha256Bytes, strongNameToken, } from "./ManagedMetadataHeaps.js";
2
+ import { metadataRowCursor, metadataCodedToken, metadataToken, readMetadataBlob, readMetadataGuid, readMetadataString, sha256Bytes, strongNameToken, } from "./ManagedMetadataHeaps.js";
3
3
  import { managedFailure } from "./ManagedReaderFailure.js";
4
- const rowCursor = ({ bytes, layout, table, row, }) => {
5
- const descriptor = layout.table(table);
6
- const start = metadataRowOffset(layout, table, row);
7
- if (descriptor === undefined)
8
- throw managedFailure("invalid-row", `metadata.${String(table)}`, "Metadata table is absent", start);
9
- return new MetadataRowCursor(bytes, start, start + descriptor.rowSize, `metadata.${descriptor.name}`);
10
- };
11
4
  const publicKeyIdentity = (bytes, kind) => ({
12
5
  kind: bytes.length === 0 ? "none" : kind,
13
6
  byte_length: bytes.length,
@@ -20,13 +13,13 @@ const publicKeyIdentity = (bytes, kind) => ({
20
13
  ? bytes.toString("hex")
21
14
  : null,
22
15
  });
23
- export const readModule = (bytes, layout, maxBytes) => {
16
+ export const readModule = (bytes, layout, heapExtent) => {
24
17
  const table = layout.table(0);
25
18
  if (table === undefined || table.rowCount === 0)
26
19
  return null;
27
- const cursor = rowCursor({ bytes, layout, table: 0, row: 1 });
20
+ const cursor = metadataRowCursor(bytes, layout, 0, 1);
28
21
  const generation = cursor.readUInt16();
29
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
22
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
30
23
  const mvid = readMetadataGuid(bytes, layout, cursor.readIndex(layout.guidIndexSize));
31
24
  const encId = readMetadataGuid(bytes, layout, cursor.readIndex(layout.guidIndexSize));
32
25
  const encBaseId = readMetadataGuid(bytes, layout, cursor.readIndex(layout.guidIndexSize));
@@ -40,11 +33,11 @@ export const readModule = (bytes, layout, maxBytes) => {
40
33
  row_offset: table.offset,
41
34
  };
42
35
  };
43
- export const readAssembly = (bytes, layout, maxBytes) => {
36
+ export const readAssembly = (bytes, layout, heapExtent) => {
44
37
  const table = layout.table(32);
45
38
  if (table === undefined || table.rowCount === 0)
46
39
  return null;
47
- const cursor = rowCursor({ bytes, layout, table: 32, row: 1 });
40
+ const cursor = metadataRowCursor(bytes, layout, 32, 1);
48
41
  const hashAlgorithm = cursor.readUInt32();
49
42
  const version = [
50
43
  cursor.readUInt16(),
@@ -53,9 +46,9 @@ export const readAssembly = (bytes, layout, maxBytes) => {
53
46
  cursor.readUInt16(),
54
47
  ].join(".");
55
48
  const flags = cursor.readUInt32();
56
- const key = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
57
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
58
- const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
49
+ const key = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
50
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
51
+ const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
59
52
  return {
60
53
  name,
61
54
  version,
@@ -67,8 +60,8 @@ export const readAssembly = (bytes, layout, maxBytes) => {
67
60
  row_offset: table.offset,
68
61
  };
69
62
  };
70
- export const readAssemblyReference = (bytes, layout, row, maxBytes) => {
71
- const cursor = rowCursor({ bytes, layout, table: 35, row });
63
+ export const readAssemblyReference = (bytes, layout, row, heapExtent) => {
64
+ const cursor = metadataRowCursor(bytes, layout, 35, row);
72
65
  const version = [
73
66
  cursor.readUInt16(),
74
67
  cursor.readUInt16(),
@@ -76,10 +69,10 @@ export const readAssemblyReference = (bytes, layout, row, maxBytes) => {
76
69
  cursor.readUInt16(),
77
70
  ].join(".");
78
71
  const flags = cursor.readUInt32();
79
- const keyOrToken = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
80
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
81
- const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
82
- const hashValue = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
72
+ const keyOrToken = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
73
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
74
+ const culture = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
75
+ const hashValue = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
83
76
  return {
84
77
  name,
85
78
  version,
@@ -92,34 +85,26 @@ export const readAssemblyReference = (bytes, layout, row, maxBytes) => {
92
85
  row_offset: metadataRowOffset(layout, 35, row),
93
86
  };
94
87
  };
95
- const codedToken = (raw, bits, tables) => {
96
- if (raw === 0)
97
- return null;
98
- const tag = raw & (2 ** bits - 1);
99
- const row = Math.floor(raw / 2 ** bits);
100
- const table = tables[tag];
101
- return table === undefined || row === 0 ? null : metadataToken(table, row);
102
- };
103
- const readTypeName = ({ bytes, layout, table, row, maxBytes, }) => {
88
+ const readTypeName = ({ bytes, layout, table, row, heapExtent, }) => {
104
89
  const descriptor = layout.table(table);
105
90
  if (descriptor === undefined || row < 1 || row > descriptor.rowCount)
106
91
  return null;
107
- const cursor = rowCursor({ bytes, layout, table, row });
92
+ const cursor = metadataRowCursor(bytes, layout, table, row);
108
93
  if (table === 1)
109
94
  cursor.readIndex(layout.codedIndexSize("ResolutionScope"));
110
95
  else
111
96
  cursor.readUInt32();
112
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
113
- const namespace = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
97
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
98
+ const namespace = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
114
99
  return namespace.length === 0 ? name : `${namespace}.${name}`;
115
100
  };
116
- const declaringTypeForMethod = (bytes, layout, methodRow, maxBytes) => {
101
+ const declaringTypeForMethod = (bytes, layout, methodRow, heapExtent) => {
117
102
  const types = layout.table(2);
118
103
  const methods = layout.table(6);
119
104
  if (types === undefined || methods === undefined)
120
105
  return null;
121
106
  for (let row = 1; row <= types.rowCount; row += 1) {
122
- const cursor = rowCursor({ bytes, layout, table: 2, row });
107
+ const cursor = metadataRowCursor(bytes, layout, 2, row);
123
108
  cursor.readUInt32();
124
109
  const nameIndex = cursor.readIndex(layout.stringIndexSize);
125
110
  const namespaceIndex = cursor.readIndex(layout.stringIndexSize);
@@ -131,14 +116,14 @@ const declaringTypeForMethod = (bytes, layout, methodRow, maxBytes) => {
131
116
  : methodListForType(bytes, layout, row + 1);
132
117
  if (methodRow < methodStart || methodRow >= methodEnd)
133
118
  continue;
134
- const name = readMetadataString(bytes, layout, nameIndex, maxBytes);
135
- const namespace = readMetadataString(bytes, layout, namespaceIndex, maxBytes);
119
+ const name = readMetadataString(bytes, layout, nameIndex, heapExtent);
120
+ const namespace = readMetadataString(bytes, layout, namespaceIndex, heapExtent);
136
121
  return namespace.length === 0 ? name : `${namespace}.${name}`;
137
122
  }
138
123
  return null;
139
124
  };
140
125
  const methodListForType = (bytes, layout, row) => {
141
- const cursor = rowCursor({ bytes, layout, table: 2, row });
126
+ const cursor = metadataRowCursor(bytes, layout, 2, row);
142
127
  cursor.readUInt32();
143
128
  cursor.readIndex(layout.stringIndexSize);
144
129
  cursor.readIndex(layout.stringIndexSize);
@@ -146,28 +131,40 @@ const methodListForType = (bytes, layout, row) => {
146
131
  cursor.readIndex(layout.tableIndexSize(4));
147
132
  return cursor.readIndex(layout.tableIndexSize(6));
148
133
  };
149
- const attributeTypeName = (bytes, layout, rawType, maxBytes) => {
134
+ const attributeTypeName = (bytes, layout, rawType, heapExtent) => {
150
135
  const tag = rawType & 7;
151
136
  const row = Math.floor(rawType / 8);
152
137
  if (row === 0)
153
138
  return null;
154
139
  if (tag === 2)
155
- return declaringTypeForMethod(bytes, layout, row, maxBytes);
140
+ return declaringTypeForMethod(bytes, layout, row, heapExtent);
156
141
  if (tag !== 3)
157
142
  return null;
158
143
  const memberRefs = layout.table(10);
159
144
  if (memberRefs === undefined || row > memberRefs.rowCount)
160
145
  return null;
161
- const cursor = rowCursor({ bytes, layout, table: 10, row });
146
+ const cursor = metadataRowCursor(bytes, layout, 10, row);
162
147
  const parent = cursor.readIndex(layout.codedIndexSize("MemberRefParent"));
163
148
  const parentTag = parent & 7;
164
149
  const parentRow = Math.floor(parent / 8);
165
150
  if (parentTag === 0)
166
- return readTypeName({ bytes, layout, table: 2, row: parentRow, maxBytes });
151
+ return readTypeName({
152
+ bytes,
153
+ layout,
154
+ table: 2,
155
+ row: parentRow,
156
+ heapExtent,
157
+ });
167
158
  if (parentTag === 1)
168
- return readTypeName({ bytes, layout, table: 1, row: parentRow, maxBytes });
159
+ return readTypeName({
160
+ bytes,
161
+ layout,
162
+ table: 1,
163
+ row: parentRow,
164
+ heapExtent,
165
+ });
169
166
  if (parentTag === 3)
170
- return declaringTypeForMethod(bytes, layout, parentRow, maxBytes);
167
+ return declaringTypeForMethod(bytes, layout, parentRow, heapExtent);
171
168
  return null;
172
169
  };
173
170
  const decodeCompressedLength = (blob, offset) => {
@@ -210,21 +207,26 @@ const decodeFixedString = (blob) => {
210
207
  return null;
211
208
  }
212
209
  };
213
- export const readCustomAttribute = (bytes, layout, row, maxBytes) => {
214
- const cursor = rowCursor({ bytes, layout, table: 12, row });
210
+ export const readCustomAttribute = (bytes, layout, row, heapExtent) => {
211
+ const cursor = metadataRowCursor(bytes, layout, 12, row);
215
212
  const parentRaw = cursor.readIndex(layout.codedIndexSize("HasCustomAttribute"));
216
213
  const typeRaw = cursor.readIndex(layout.codedIndexSize("CustomAttributeType"));
217
- const value = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), maxBytes);
218
- const parent = codedToken(parentRaw, 5, [
214
+ const value = readMetadataBlob(bytes, layout, cursor.readIndex(layout.blobIndexSize), heapExtent);
215
+ const parent = metadataCodedToken(parentRaw, 5, [
219
216
  6, 4, 1, 2, 8, 9, 10, 0, 14, 23, 20, 17, 26, 27, 32, 35, 38, 39, 40, 42,
220
217
  44, 43,
221
218
  ]);
222
219
  if (parent === null)
223
220
  throw managedFailure("invalid-row", "metadata.CustomAttribute", "CustomAttribute parent coded index is invalid", cursor.start);
224
- const typeName = attributeTypeName(bytes, layout, typeRaw, maxBytes);
221
+ const typeName = attributeTypeName(bytes, layout, typeRaw, heapExtent);
225
222
  return {
226
223
  parent_token: parent,
227
- constructor_token: codedToken(typeRaw, 3, [undefined, undefined, 6, 10]),
224
+ constructor_token: metadataCodedToken(typeRaw, 3, [
225
+ undefined,
226
+ undefined,
227
+ 6,
228
+ 10,
229
+ ]),
228
230
  type_name: typeName,
229
231
  value_length: value.length,
230
232
  value_sha256: sha256Bytes(value),
@@ -235,13 +237,13 @@ export const readCustomAttribute = (bytes, layout, row, maxBytes) => {
235
237
  row_offset: cursor.start,
236
238
  };
237
239
  };
238
- export const readResource = ({ bytes, layout, row, maxBytes, directory, issues, }) => {
239
- const cursor = rowCursor({ bytes, layout, table: 40, row });
240
+ export const readResource = ({ bytes, layout, row, directory, issues, }) => {
241
+ const cursor = metadataRowCursor(bytes, layout, 40, row);
240
242
  const declaredOffset = cursor.readUInt32();
241
243
  const flags = cursor.readUInt32();
242
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), maxBytes);
244
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), Math.max(layout.strings.size, layout.blob.size));
243
245
  const implementationRaw = cursor.readIndex(layout.codedIndexSize("Implementation"));
244
- const implementationToken = codedToken(implementationRaw, 2, [38, 35, 39]);
246
+ const implementationToken = metadataCodedToken(implementationRaw, 2, [38, 35, 39]);
245
247
  let dataLength = null;
246
248
  let dataSha256 = null;
247
249
  if (implementationRaw === 0) {
@@ -264,14 +266,6 @@ export const readResource = ({ bytes, layout, row, maxBytes, directory, issues,
264
266
  detail: "Embedded resource length leaves the CLI resources directory",
265
267
  });
266
268
  }
267
- else if (dataLength > maxBytes) {
268
- issues.push({
269
- code: "limit-exceeded",
270
- scope: `metadata.ManifestResource:${metadataToken(40, row)}`,
271
- offset: start + 4,
272
- detail: `Embedded resource exceeds max_heap_item_bytes ${String(maxBytes)}; digest omitted`,
273
- });
274
- }
275
269
  else {
276
270
  dataSha256 = sha256Bytes(bytes.subarray(start + 4, start + 4 + dataLength));
277
271
  }
@@ -166,7 +166,7 @@ const readTablesHeader = (bytes, streams) => {
166
166
  throw managedFailure("invalid-tables", "metadata.valid-mask", "Metadata valid mask names unsupported tables outside the admitted ECMA-335 range", tablesStream.offset + 8);
167
167
  return { tableBytes, tablesOffset: tablesStream.offset, heaps, valid };
168
168
  };
169
- const readRowCounts = (tableBytes, valid, maxTableRows, tablesOffset) => {
169
+ const readRowCounts = (tableBytes, valid) => {
170
170
  const rowCounts = Array(METADATA_TABLE_NAMES.length).fill(0);
171
171
  let tableCursor = 24;
172
172
  for (let index = 0; index < METADATA_TABLE_NAMES.length; index += 1) {
@@ -174,8 +174,6 @@ const readRowCounts = (tableBytes, valid, maxTableRows, tablesOffset) => {
174
174
  continue;
175
175
  requireRange(tableBytes, tableCursor, 4, "metadata.table-row-count");
176
176
  const count = tableBytes.readUInt32LE(tableCursor);
177
- if (count > maxTableRows)
178
- throw managedFailure("limit-exceeded", `metadata.${METADATA_TABLE_NAMES[index] ?? String(index)}`, `Metadata table row count ${String(count)} exceeds max_table_rows ${String(maxTableRows)}`, tablesOffset + tableCursor);
179
177
  rowCounts[index] = count;
180
178
  tableCursor += 4;
181
179
  }
@@ -218,13 +216,13 @@ const buildMetadataTables = ({ tableBytes, rowCounts, heaps, valid, tablesOffset
218
216
  return tables;
219
217
  };
220
218
  /** Parse ECMA-335 stream and table layout with checked byte extents. */
221
- export const readManagedMetadataLayout = (artifact, rootOffset, size, maxTableRows) => {
219
+ export const readManagedMetadataLayout = (artifact, rootOffset, size) => {
222
220
  if (size < 20 || rootOffset < 0 || rootOffset > artifact.length - size)
223
221
  throw managedFailure("invalid-metadata-root", "metadata.root", "CLI metadata directory leaves the artifact byte range", rootOffset);
224
222
  const bytes = artifact.subarray(rootOffset, rootOffset + size);
225
223
  const { streams, version } = readMetadataStreams(bytes, rootOffset);
226
224
  const { tableBytes, tablesOffset, heaps, valid } = readTablesHeader(artifact, streams);
227
- const rowCounts = readRowCounts(tableBytes, valid, maxTableRows, tablesOffset);
225
+ const rowCounts = readRowCounts(tableBytes, valid);
228
226
  const tables = buildMetadataTables({
229
227
  tableBytes,
230
228
  rowCounts,
@@ -31,28 +31,24 @@ const readMethodBodyHeader = (bytes, offset) => {
31
31
  localSig: bytes.readUInt32LE(offset + 8),
32
32
  };
33
33
  };
34
- export const methodBody = (bytes, pe, rva, limits) => {
34
+ export const methodBody = (bytes, pe, rva) => {
35
35
  if (rva === 0)
36
36
  return emptyMethodBody(rva, "absent", null);
37
37
  try {
38
38
  const offset = pe.rvaToOffset(rva, 1, "method.body");
39
39
  const header = readMethodBodyHeader(bytes, offset);
40
- if (header.ilSize > limits.maxMethodBodyBytes)
41
- return oversizedMethodBody(header, rva, offset, limits);
42
40
  const ilOffset = offset + header.size;
43
41
  if (ilOffset > bytes.length - header.ilSize)
44
42
  throw new RangeError("Method IL bytes leave artifact");
45
43
  const il = bytes.subarray(ilOffset, ilOffset + header.ilSize);
46
- const decoded = decodeInstructions(il, limits.maxMethodInstructions);
44
+ const decoded = decodeInstructions(il);
47
45
  const opcodeCounts = {};
48
46
  for (const instruction of decoded.parsed)
49
47
  opcodeCounts[instruction.opcode] =
50
48
  (opcodeCounts[instruction.opcode] ?? 0) + 1;
51
49
  const anchors = decoded.parsed
52
- .map((instruction, index) => ({ instruction, index }))
53
- .filter(({ instruction }) => instruction.operandKind !== "none")
54
- .slice(0, limits.instructionAnchorLimit)
55
- .map(({ instruction }) => ({
50
+ .filter((instruction) => instruction.operandKind !== "none")
51
+ .map((instruction) => ({
56
52
  il_offset: instruction.offset,
57
53
  opcode: instruction.opcode,
58
54
  operand_kind: instruction.operandKind,
@@ -93,7 +89,7 @@ export const methodBody = (bytes, pe, rva, limits) => {
93
89
  : [],
94
90
  issue: decoded.issue ??
95
91
  (decoded.truncated > 0
96
- ? `Instruction decode reached max_method_instructions ${String(limits.maxMethodInstructions)} before the end of the method body`
92
+ ? "Instruction decoding stopped before the end of the method body"
97
93
  : null),
98
94
  };
99
95
  }
@@ -120,24 +116,3 @@ const emptyMethodBody = (rva, status, issue) => ({
120
116
  exception_regions: [],
121
117
  issue,
122
118
  });
123
- const oversizedMethodBody = (header, rva, offset, limits) => ({
124
- status: "too-large",
125
- header_format: header.format,
126
- rva,
127
- file_offset: offset,
128
- max_stack: header.maxStack,
129
- init_locals: (header.flags & 0x10) !== 0,
130
- local_var_sig_token: header.localSig === 0
131
- ? null
132
- : `0x${header.localSig.toString(16).padStart(8, "0")}`,
133
- il_size: header.ilSize,
134
- il_sha256: null,
135
- normalized_il_sha256: null,
136
- instruction_count: 0,
137
- decoded_instruction_count: 0,
138
- truncated_instructions: 0,
139
- opcode_counts: {},
140
- anchors: [],
141
- exception_regions: [],
142
- issue: `Method body exceeds max_method_body_bytes ${String(limits.maxMethodBodyBytes)}`,
143
- });