rea-agents 6.2.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 (636) hide show
  1. package/README.md +24 -23
  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/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -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)
@@ -1,4 +1,3 @@
1
- const opcode = (code) => OPCODES.get(code);
2
1
  const PREFIX_OPCODES = new Set([
3
2
  "unaligned.",
4
3
  "volatile.",
@@ -361,7 +360,7 @@ export const decodeInstructions = (il) => {
361
360
  const first = il.readUInt8(offset);
362
361
  offset += 1;
363
362
  const code = first === 0xfe ? 0xfe00 + il.readUInt8(offset++) : first;
364
- const descriptor = opcode(code);
363
+ const descriptor = OPCODES.get(code);
365
364
  if (descriptor === undefined) {
366
365
  issue = `Unsupported CIL opcode 0x${code.toString(16)} at IL offset ${String(start)}`;
367
366
  break;
@@ -394,7 +393,7 @@ export const decodeInstructions = (il) => {
394
393
  const truncated = offset < il.length && issue === null ? 1 : 0;
395
394
  return { parsed, instructionStarts, count: parsed.length, truncated, issue };
396
395
  };
397
- export const parseExceptionRegions = (bytes, offset, methodEnd) => {
396
+ export const parseExceptionRegions = (bytes, offset, methodEnd, budget) => {
398
397
  const regions = [];
399
398
  let sectionOffset = offset;
400
399
  let hasMoreSections = true;
@@ -424,7 +423,9 @@ export const parseExceptionRegions = (bytes, offset, methodEnd) => {
424
423
  (bytes[sectionOffset + 2] !== 0 || bytes[sectionOffset + 3] !== 0))
425
424
  return malformedExceptionRegions("Small exception section reserved bytes are nonzero", regions);
426
425
  const count = (size - 4) / clauseSize;
427
- 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);
428
429
  hasMoreSections = (kind & 0x80) !== 0;
429
430
  sectionOffset += size;
430
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)));
@@ -1,3 +1,4 @@
1
+ import { admitManagedProjection } from "./ManagedDecodeBudget.js";
1
2
  import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/managedArtifact.js";
2
3
  import { readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
3
4
  import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
@@ -10,7 +11,7 @@ import { buildNativeBoundaryInspection, cliNative, nativeBoundarySummary, native
10
11
  * the header is absent (`not-managed`) or unreadable (`malformed`).
11
12
  */
12
13
  const emptyInspection = (target, bytes, classification, { native = null, issues = [], } = {}) => {
13
- return managedNativeBoundaryInspectionSchema.parse({
14
+ return managedNativeBoundaryInspectionSchema.parse(admitManagedProjection({
14
15
  artifact: {
15
16
  path: target.path,
16
17
  sha256: target.sha256,
@@ -19,7 +20,11 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
19
20
  },
20
21
  module: null,
21
22
  metadata: {
22
- status: classification === "malformed" ? "malformed" : "absent",
23
+ status: issues.some((issue) => issue.code === "resource-limit")
24
+ ? "partial"
25
+ : classification === "malformed"
26
+ ? "malformed"
27
+ : "absent",
23
28
  version: null,
24
29
  table_row_counts: {},
25
30
  },
@@ -42,7 +47,7 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
42
47
  "No CLI metadata was admitted; native boundary declarations are unavailable.",
43
48
  "Static inspection does not load or execute target code, so native export resolution is not performed.",
44
49
  ],
45
- });
50
+ }));
46
51
  };
47
52
  const readBoundaryInventory = (bytes, pe, cli, issues) => {
48
53
  const metadataOffset = pe.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
@@ -79,35 +84,45 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
79
84
  issues: [cause.issue],
80
85
  });
81
86
  }
82
- const heapExtent = Math.max(layout.strings.size, layout.blob.size);
83
- issues.push(...inventory.issues);
84
- const moduleRefs = parseModuleRefs(bytes, layout, heapExtent, issues);
85
- const members = new Map([
86
- ...parseFields(bytes, layout, heapExtent, issues),
87
- ...parseMethods(bytes, layout, heapExtent, issues),
88
- ]);
89
- const imports = parseImplMaps({
90
- bytes,
91
- layout,
92
- heapExtent,
93
- modules: moduleRefs,
94
- members,
95
- issues,
96
- });
97
- const pinvokeTokens = new Set(imports
98
- .map(({ member_token }) => member_token)
99
- .filter((token) => token !== null));
100
- const implementations = nativeImplementations(members.values(), pinvokeTokens);
101
- return buildNativeBoundaryInspection({
102
- target,
103
- bytes,
104
- pe,
105
- layout,
106
- inventory,
107
- moduleRefs,
108
- imports,
109
- implementations,
110
- native: cliNative(pe),
111
- issues,
112
- });
87
+ try {
88
+ const heapExtent = Math.max(layout.strings.size, layout.blob.size);
89
+ issues.push(...inventory.issues);
90
+ const moduleRefs = parseModuleRefs(bytes, layout, heapExtent, issues);
91
+ const members = new Map([
92
+ ...parseFields(bytes, layout, heapExtent, issues),
93
+ ...parseMethods(bytes, layout, heapExtent, issues),
94
+ ]);
95
+ const imports = parseImplMaps({
96
+ bytes,
97
+ layout,
98
+ heapExtent,
99
+ modules: moduleRefs,
100
+ members,
101
+ issues,
102
+ });
103
+ const pinvokeTokens = new Set(imports
104
+ .map(({ member_token }) => member_token)
105
+ .filter((token) => token !== null));
106
+ const implementations = nativeImplementations(members.values(), pinvokeTokens);
107
+ return buildNativeBoundaryInspection({
108
+ target,
109
+ bytes,
110
+ pe,
111
+ layout,
112
+ inventory,
113
+ moduleRefs,
114
+ imports,
115
+ implementations,
116
+ native: cliNative(pe),
117
+ issues,
118
+ });
119
+ }
120
+ catch (cause) {
121
+ if (!(cause instanceof ManagedReaderFailure))
122
+ throw cause;
123
+ return emptyInspection(target, bytes, "malformed", {
124
+ native: cliNative(pe),
125
+ issues: [...issues, cause.issue],
126
+ });
127
+ }
113
128
  };