rea-agents 6.0.0 → 6.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 (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -0,0 +1,195 @@
1
+ import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
2
+ /** A named resource-limit failure that keeps budget exhaustion out of decode errors. */
3
+ export class InterfaceBuilderDecodeBudgetExceeded extends Error {
4
+ reason;
5
+ constructor(reason, message) {
6
+ super(message);
7
+ this.reason = reason;
8
+ this.name = "InterfaceBuilderDecodeBudgetExceeded";
9
+ }
10
+ }
11
+ /** Shared byte budget for decoder records and projected archive data. */
12
+ export class InterfaceBuilderDecodeBudget {
13
+ #initialBytes;
14
+ #remainingBytes;
15
+ constructor(maxBytes) {
16
+ this.#initialBytes = maxBytes;
17
+ this.#remainingBytes = maxBytes;
18
+ }
19
+ /** Representation bytes still available for the current inspection. */
20
+ get remainingBytes() {
21
+ return this.#remainingBytes;
22
+ }
23
+ /** Representation bytes reserved so far. */
24
+ get usedBytes() {
25
+ return this.#initialBytes - this.#remainingBytes;
26
+ }
27
+ /** Reserve representation bytes before allocation, or report exhaustion. */
28
+ reserve(bytes, message) {
29
+ if (!Number.isSafeInteger(bytes) ||
30
+ bytes < 0 ||
31
+ bytes > this.#remainingBytes)
32
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", message);
33
+ this.#remainingBytes -= bytes;
34
+ }
35
+ /** Reserve an upper bound for one JSON-serialized string occurrence. */
36
+ reserveJsonStringOccurrence(value) {
37
+ // JSON escaping uses at most six ASCII bytes per UTF-16 code unit, plus
38
+ // quotes. Count occurrences even when the source string is shared.
39
+ this.reserve(value.length * 6 + 2, "projected JSON strings exceed the aggregate Interface Builder decode budget");
40
+ }
41
+ /** Reserve the exact JSON string length for a base64 value from Buffer. */
42
+ reserveBase64JsonStringOccurrence(value) {
43
+ // Buffer's base64 alphabet contains no JSON-escaped characters.
44
+ this.reserve(value.length + 2, "projected NIB base64 values exceed the aggregate Interface Builder decode budget");
45
+ }
46
+ /** Reserve an upper bound for one JSON object property name occurrence. */
47
+ reserveJsonPropertyNameOccurrence(value) {
48
+ this.reserve(value.length * 6 + 3, "projected JSON property names exceed the aggregate Interface Builder decode budget");
49
+ }
50
+ /** Reserve bytes for an optional projection without throwing on exhaustion. */
51
+ tryReserve(bytes) {
52
+ if (!Number.isSafeInteger(bytes) ||
53
+ bytes < 0 ||
54
+ bytes > this.#remainingBytes)
55
+ return false;
56
+ this.#remainingBytes -= bytes;
57
+ return true;
58
+ }
59
+ }
60
+ /** Preflight the representation created by the pinned plist decoder. */
61
+ export const estimatePropertyListDecodeBytes = (bytes, maxBytes, xmlText) => {
62
+ const estimate = bytes.subarray(0, 8).toString("ascii") === "bplist00"
63
+ ? estimateBinaryPlistExpansion(bytes, maxBytes)
64
+ : estimateXmlPlistExpansion(bytes, maxBytes, xmlText);
65
+ if (estimate > maxBytes)
66
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "plist representation exceeds the aggregate Interface Builder decode budget");
67
+ return estimate;
68
+ };
69
+ const estimateXmlPlistExpansion = (bytes, maxBytes, xmlText) => {
70
+ const xml = xmlText ?? decodeXmlPlistText(bytes);
71
+ if (/<!DOCTYPE\b[^>]*\[/iu.test(xml))
72
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "XML plist internal entity expansion exceeds the aggregate Interface Builder decode budget");
73
+ const elementPattern = /<!--[^]*?-->|<!\[CDATA\[[^]*?\]\]>|<!DOCTYPE[^>]*>|<\?[^]*?\?>|<\/?[A-Za-z][^>]*>/giu;
74
+ const decodedSourceBytes = xml.length * 2;
75
+ let elementCount = 0;
76
+ let xmlDepth = 0;
77
+ for (const match of xml.matchAll(elementPattern)) {
78
+ const token = match[0] ?? "";
79
+ if (token.startsWith("<!--") ||
80
+ token.startsWith("<![CDATA[") ||
81
+ token.startsWith("<!DOCTYPE") ||
82
+ token.startsWith("<?"))
83
+ continue;
84
+ elementCount += 1;
85
+ if (token.startsWith("</"))
86
+ xmlDepth -= 1;
87
+ else if (!token.endsWith("/>")) {
88
+ xmlDepth += 1;
89
+ if (xmlDepth > 128)
90
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "XML plist nesting exceeds the aggregate Interface Builder decode budget");
91
+ }
92
+ if (decodedSourceBytes * 2 + elementCount * 128 > maxBytes)
93
+ return maxBytes + 1;
94
+ }
95
+ return decodedSourceBytes * 2 + elementCount * 128;
96
+ };
97
+ /** Count every expanded binary-plist reference before calling plist.parseBinary. */
98
+ const estimateBinaryPlistExpansion = (bytes, maxBytes) => {
99
+ if (bytes.length < 40)
100
+ throw new TypeError("binary plist trailer is truncated");
101
+ const trailer = bytes.length - 32;
102
+ const offsetSize = bytes[trailer + 6] ?? 0;
103
+ const referenceSize = bytes[trailer + 7] ?? 0;
104
+ if (![1, 2, 4, 8].includes(offsetSize) ||
105
+ ![1, 2, 4, 8].includes(referenceSize))
106
+ throw new TypeError("binary plist trailer integer sizes are invalid");
107
+ const readInteger = (offset, size) => {
108
+ if (offset < 0 || size < 1 || offset + size > bytes.length)
109
+ return -1;
110
+ let value = 0;
111
+ for (let index = 0; index < size; index += 1)
112
+ value = value * 256 + (bytes[offset + index] ?? 0);
113
+ return Number.isSafeInteger(value) ? value : -1;
114
+ };
115
+ const objectCount = readInteger(trailer + 8, 8);
116
+ const topObject = readInteger(trailer + 16, 8);
117
+ const offsetTable = readInteger(trailer + 24, 8);
118
+ if (objectCount < 1 ||
119
+ topObject < 0 ||
120
+ topObject >= objectCount ||
121
+ offsetTable < 8 ||
122
+ offsetTable + objectCount * offsetSize > trailer)
123
+ throw new TypeError("binary plist trailer or object table is invalid");
124
+ let estimate = bytes.length * 2 + objectCount * 16;
125
+ if (estimate > maxBytes)
126
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist object table exceeds the aggregate Interface Builder decode budget");
127
+ const active = new Set();
128
+ const pending = [
129
+ { object: topObject, depth: 0, exit: false },
130
+ ];
131
+ let pendingObjectCount = 1;
132
+ while (pending.length > 0) {
133
+ const entry = pending.pop();
134
+ if (entry === undefined)
135
+ break;
136
+ if (entry.exit) {
137
+ active.delete(entry.object);
138
+ continue;
139
+ }
140
+ pendingObjectCount -= 1;
141
+ if (entry.depth > 128)
142
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist nesting exceeds the aggregate Interface Builder decode budget");
143
+ if (active.has(entry.object))
144
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist reference cycle exceeds the aggregate Interface Builder decode budget");
145
+ estimate += 96;
146
+ if (estimate > maxBytes)
147
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist reference expansion exceeds the aggregate Interface Builder decode budget");
148
+ const offset = readInteger(offsetTable + entry.object * offsetSize, offsetSize);
149
+ if (offset < 8 || offset >= offsetTable)
150
+ throw new TypeError("binary plist object offset is invalid");
151
+ const marker = bytes[offset] ?? 0;
152
+ const type = marker >> 4;
153
+ let size = marker & 0x0f;
154
+ let cursor = offset + 1;
155
+ if (size === 0x0f && type !== 0 && type !== 8) {
156
+ const extMarker = bytes[cursor] ?? 0;
157
+ if (extMarker >> 4 !== 1 || (extMarker & 0x0f) > 3)
158
+ throw new TypeError("binary plist extended object size is invalid");
159
+ cursor += 1;
160
+ const integerSize = 1 << (extMarker & 0x0f);
161
+ size = readInteger(cursor, integerSize);
162
+ cursor += integerSize;
163
+ if (size < 0 || cursor > offsetTable)
164
+ throw new TypeError("binary plist extended object size is invalid");
165
+ }
166
+ if (type === 4 || type === 5 || type === 6) {
167
+ const byteLength = type === 6 ? size * 2 : size;
168
+ if (cursor + byteLength > offsetTable)
169
+ throw new TypeError("binary plist scalar object is truncated");
170
+ estimate += type === 4 ? size + 4 * Math.ceil(size / 3) : byteLength * 2;
171
+ if (estimate > maxBytes)
172
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist scalar expansion exceeds the aggregate Interface Builder decode budget");
173
+ continue;
174
+ }
175
+ if (type !== 10 && type !== 13)
176
+ continue;
177
+ const childCount = type === 13 ? size * 2 : size;
178
+ const refsEnd = cursor + childCount * referenceSize;
179
+ if (!Number.isSafeInteger(refsEnd) || refsEnd > offsetTable)
180
+ throw new TypeError("binary plist reference table is truncated");
181
+ const availableNodes = Math.floor((maxBytes - estimate) / 96);
182
+ if (childCount > availableNodes - pendingObjectCount)
183
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "binary plist reference expansion exceeds the aggregate Interface Builder decode budget");
184
+ active.add(entry.object);
185
+ pending.push({ object: entry.object, depth: entry.depth, exit: true });
186
+ for (let index = childCount - 1; index >= 0; index -= 1) {
187
+ const reference = readInteger(cursor + index * referenceSize, referenceSize);
188
+ if (reference < 0 || reference >= objectCount)
189
+ throw new TypeError("binary plist reference is invalid");
190
+ pending.push({ object: reference, depth: entry.depth + 1, exit: false });
191
+ }
192
+ pendingObjectCount += childCount;
193
+ }
194
+ return estimate;
195
+ };
@@ -1,55 +1,73 @@
1
1
  import { createHash } from "node:crypto";
2
- import { TextDecoder } from "node:util";
2
+ import { join } from "node:path";
3
3
  import { parseBinary } from "plist";
4
4
  import { z } from "zod";
5
+ import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
5
6
  import { projectPlistValue } from "../../domain/apple/plistValue.js";
7
+ import { createPlistNumberProjection } from "../../domain/apple/plistNumbers.js";
8
+ import { binaryPlistNumberLiterals, xmlPlistNumberLiterals, } from "./PlistNumberLiterals.js";
6
9
  import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../../domain/propertyListKeys.js";
7
- import { keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
10
+ import { KeyedArchiveKindError, keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
8
11
  import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
9
12
  import { ArtifactReaderFailure } from "../ArtifactReader.js";
13
+ import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
10
14
  const MAX_BYTES = 64 * 1024 * 1024;
11
15
  /** Parse inert plist bytes, preserving data and dates with explicit typed values. */
12
16
  export const decodeKeyedArchiveBytes = (bytes, selection) => {
13
17
  if (bytes.length > MAX_BYTES)
14
18
  throw new RangeError("Keyed archive exceeds 64 MiB");
19
+ if (bytes.subarray(0, 10).toString("ascii") === "NIBArchive")
20
+ throw new KeyedArchiveKindError("Selected file is a compiled NIBArchive, not a Foundation plist archive; decode it with decode_interface_builder", "nib-archive");
15
21
  const binary = bytes.subarray(0, 8).toString("ascii") === "bplist00";
22
+ const xmlText = binary ? undefined : decodeXmlPlistText(bytes);
16
23
  const parsed = binary
17
24
  ? { value: parseBinary(bytes), omittedPrototypeKeys: 0 }
18
- : parseXmlPropertyList(decodeXmlPlistText(bytes));
25
+ : parseXmlPropertyList(xmlText ?? "");
19
26
  const graph = projectKeyedArchive(normalizePlist(parsed.value), selection);
27
+ const numbers = createPlistNumberProjection(binary
28
+ ? binaryPlistNumberLiterals(bytes)
29
+ : xmlPlistNumberLiterals(xmlText ?? ""));
30
+ // Classify the serialized graph before projecting values to typed decimals.
31
+ // Numeric IDs, node kinds, references and pagination retain their original meaning.
32
+ const roots = Object.fromEntries(Object.entries(graph.roots).map(([name, value]) => [
33
+ name,
34
+ numbers.project(value),
35
+ ]));
36
+ const objects = graph.objects.map((object) => ({
37
+ ...object,
38
+ value: numbers.project(object.value),
39
+ }));
20
40
  return {
21
41
  archive_format: binary ? "binary-plist" : "xml-plist",
22
42
  ...graph,
43
+ roots,
44
+ objects,
23
45
  limitations: [
24
46
  ...graph.limitations,
47
+ ...numbers.limitations(),
25
48
  ...(parsed.omittedPrototypeKeys === 0
26
49
  ? []
27
50
  : [omittedPrototypeKeysLimitation(parsed.omittedPrototypeKeys)]),
28
51
  ],
29
52
  };
30
53
  };
31
- const decodeXmlPlistText = (bytes) => {
32
- const encoding = bytes[0] === 0xff && bytes[1] === 0xfe
33
- ? "utf-16le"
34
- : bytes[0] === 0xfe && bytes[1] === 0xff
35
- ? "utf-16be"
36
- : "utf-8";
37
- const text = new TextDecoder(encoding, { fatal: true }).decode(bytes);
38
- const declared = /^<\?xml\s[^?]*\bencoding\s*=\s*["']([^"']+)["']/u
39
- .exec(text)?.[1]
40
- ?.toLowerCase();
41
- if (declared !== undefined &&
42
- ((encoding !== "utf-8" && declared !== encoding && declared !== "utf-16") ||
43
- (encoding === "utf-8" && declared.startsWith("utf-16"))))
44
- throw new TypeError("XML encoding declaration disagrees with its bytes");
45
- return text;
46
- };
47
54
  const normalizePlist = (value) => {
48
55
  const projected = projectPlistValue(value);
49
56
  if (projected.unknownRealCount > 0)
50
57
  throw new RangeError("Keyed archive contains a non-finite real");
51
58
  return projected.value;
52
59
  };
60
+ /**
61
+ * Point to the workflow that reads the selected kind of file on this host.
62
+ * decode_interface_builder is portable; inspect_plist requires macOS.
63
+ */
64
+ const keyedArchiveKindRemediation = (kind, platform) => {
65
+ if (kind === "nib-archive")
66
+ return "Decode compiled NIBArchive files with decode_interface_builder on the app bundle.";
67
+ return platform === "darwin"
68
+ ? "Inspect an ordinary property list with inspect_plist; inspect_keyed_archive decodes NSKeyedArchiver archives only."
69
+ : "Select an NSKeyedArchiver archive; inspect_keyed_archive decodes only those. inspect_plist, which reads ordinary property lists, requires a macOS host.";
70
+ };
53
71
  /** Read exactly one regular, contained bundle entry without following symlinks. */
54
72
  export const inspectBundleKeyedArchive = async (input) => {
55
73
  const selected = keyedArchiveInputSchema.parse(input.parameters);
@@ -57,14 +75,16 @@ export const inspectBundleKeyedArchive = async (input) => {
57
75
  selected.path
58
76
  .split("/")
59
77
  .some((part) => part === ".." || part === "." || part.length === 0))
60
- throw new ArtifactReaderFailure("path", "Archive path must be a canonical relative bundle path");
78
+ throw archivePathError("invalid_format", selected.path === "."
79
+ ? "Select a keyed archive path relative to the active app bundle."
80
+ : `Archive path must be a canonical relative bundle path without empty, '.', or '..' segments: ${selected.path}`);
61
81
  const reader = new DirectoryArtifactReader(input.bundlePath);
62
82
  try {
63
83
  for await (const entry of reader.entries(input.signal)) {
64
84
  if (entry.path !== selected.path)
65
85
  continue;
66
86
  if (entry.kind !== "file")
67
- throw new ArtifactReaderFailure("path", "Archive must be a regular file, not a symlink or directory");
87
+ throw archivePathError("invalid_value", `Archive path selects a ${entry.kind}, not a regular file: ${selected.path}`);
68
88
  if ((entry.declaredSize ?? 0) > MAX_BYTES)
69
89
  throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
70
90
  const stream = await reader.open(entry, input.signal);
@@ -93,12 +113,24 @@ export const inspectBundleKeyedArchive = async (input) => {
93
113
  });
94
114
  }
95
115
  catch (cause) {
96
- throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", "Cannot decode selected Foundation keyed archive", { cause });
116
+ if (cause instanceof AnalysisInputError)
117
+ throw cause;
118
+ // An intact file of another kind is not a damaged archive.
119
+ if (cause instanceof KeyedArchiveKindError)
120
+ throw new AnalysisUnsupportedTargetError("inspect_keyed_archive", join(input.bundlePath, entry.path), cause.message, {
121
+ cause,
122
+ remediationAction: keyedArchiveKindRemediation(cause.kind, input.platform ?? process.platform),
123
+ });
124
+ throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", `Cannot decode selected Foundation keyed archive: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
97
125
  }
98
126
  }
99
- throw new ArtifactReaderFailure("path", `Archive not found in bundle: ${selected.path}`);
127
+ throw archivePathError("invalid_value", `No regular file exists at ${selected.path} in the active app bundle.`);
100
128
  }
101
129
  finally {
102
130
  await reader.close();
103
131
  }
104
132
  };
133
+ /** A caller-selected archive path, not the artifact, failed its constraint. */
134
+ const archivePathError = (reason, message) => new AnalysisInputError("inspect_keyed_archive", undefined, [
135
+ { path: ["path"], reason, message },
136
+ ]);
@@ -1,3 +1,4 @@
1
+ import { readFatSliceDeclarations, validateFatSlice, } from "../../domain/apple/machoContainer.js";
1
2
  /** Load commands larger than this are refused instead of buffered. */
2
3
  export const MAX_LOAD_COMMAND_BYTES = 16 * 1024 * 1024;
3
4
  /** Target opening accepts up to 128 FAT records; Java class files share the FAT magic. */
@@ -23,6 +24,11 @@ const LC_LOAD_UPWARD_DYLIB = 0x80000023;
23
24
  const LC_RPATH = 0x8000001c;
24
25
  const LC_DYLD_ENVIRONMENT = 0x27;
25
26
  const LC_CODE_SIGNATURE = 0x1d;
27
+ const LC_VERSION_MIN_MACOSX = 0x24;
28
+ const LC_VERSION_MIN_IPHONEOS = 0x25;
29
+ const LC_VERSION_MIN_TVOS = 0x2f;
30
+ const LC_VERSION_MIN_WATCHOS = 0x30;
31
+ const LC_BUILD_VERSION = 0x32;
26
32
  /** `mach-o/loader.h` `dylib_use_command`: `nameoff == 28` and this marker. */
27
33
  const DYLIB_USE_MARKER = 0x1a741800;
28
34
  const DYLIB_USE_WEAK_LINK = 0x1;
@@ -85,18 +91,35 @@ export const readMachoImage = async (readAt, size) => {
85
91
  };
86
92
  if (count > MAX_FAT_ARCHITECTURES || 8 + count * (wide ? 32 : 20) > size)
87
93
  return { status: "not-mach-o" };
88
- const table = viewOf(await readExact(readAt, 8, count * (wide ? 32 : 20), "FAT table"));
94
+ const tableBytes = await readExact(readAt, 8, count * (wide ? 32 : 20), "FAT table");
95
+ const declarations = readFatSliceDeclarations(tableBytes, {
96
+ count,
97
+ wide,
98
+ littleEndian,
99
+ });
100
+ if (declarations.status !== "parsed")
101
+ throw new MachoFormatIssue("malformed", declarations.reason);
89
102
  // A Java class file's version fields read as a FAT count; its "table" names no CPU.
90
- const cpuTypes = Array.from({ length: count }, (_, index) => table.getUint32(index * (wide ? 32 : 20), littleEndian));
91
- if (!cpuTypes.some((type) => KNOWN_CPU_TYPES.includes(type)))
92
- return { status: "not-mach-o" };
103
+ if (!declarations.slices.some(({ cpuType }) => KNOWN_CPU_TYPES.includes(cpuType))) {
104
+ let hasMachOSliceHeader = false;
105
+ for (const declaration of declarations.slices) {
106
+ if (validateFatSlice(declaration, size, 8 + count * (wide ? 32 : 20)) !== null)
107
+ continue;
108
+ const bytes = await readAt(declaration.offset, 4);
109
+ if (bytes.byteLength < 4)
110
+ continue;
111
+ const sliceMagic = viewOf(bytes).getUint32(0, false);
112
+ if ([MH_MAGIC, MH_MAGIC_64, MH_CIGAM, MH_CIGAM_64].includes(sliceMagic)) {
113
+ hasMachOSliceHeader = true;
114
+ break;
115
+ }
116
+ }
117
+ if (!hasMachOSliceHeader)
118
+ return { status: "not-mach-o" };
119
+ }
93
120
  return {
94
121
  status: "parsed",
95
- slices: await readFatSlices(readAt, size, {
96
- wide,
97
- littleEndian,
98
- count,
99
- }),
122
+ slices: await readFatSlices(readAt, size, 8 + count * (wide ? 32 : 20), declarations.slices),
100
123
  };
101
124
  }
102
125
  if (magic === MH_CIGAM || magic === MH_CIGAM_64)
@@ -111,26 +134,29 @@ export const readMachoImage = async (readAt, size) => {
111
134
  throw cause;
112
135
  }
113
136
  };
114
- const readFatSlices = async (readAt, size, table) => {
115
- const { wide, littleEndian, count } = table;
116
- const entrySize = wide ? 32 : 20;
117
- const view = viewOf(await readExact(readAt, 8, count * entrySize, "FAT table"));
137
+ const readFatSlices = async (readAt, size, tableEnd, declarations) => {
118
138
  const slices = [];
119
- for (let index = 0; index < count; index++) {
120
- const base = index * entrySize;
121
- const offset = wide
122
- ? safeNumber(view.getBigUint64(base + 8, littleEndian))
123
- : view.getUint32(base + 8, littleEndian);
124
- const length = wide
125
- ? safeNumber(view.getBigUint64(base + 16, littleEndian))
126
- : view.getUint32(base + 12, littleEndian);
127
- if (offset + length > size)
128
- throw new MachoFormatIssue("malformed", `FAT architecture ${index} extends beyond the file`);
129
- slices.push(await readSlice(readAt, offset, length));
139
+ for (const declaration of declarations) {
140
+ const { index, offset, size: length, cpuType, cpuSubtype } = declaration;
141
+ const rangeIssue = validateFatSlice(declaration, size, tableEnd);
142
+ if (rangeIssue !== null)
143
+ throw new MachoFormatIssue(rangeIssue.includes("unsupported") ? "unsupported" : "malformed", rangeIssue);
144
+ const slice = await readSlice(readAt, offset, length, {
145
+ fatCpuType: cpuType,
146
+ fatCpuSubtype: cpuSubtype,
147
+ alignmentExponent: declaration.alignmentExponent,
148
+ });
149
+ const identityIssue = validateFatSlice(declaration, size, tableEnd, {
150
+ cpuType: slice.cpu_type,
151
+ cpuSubtype: slice.cpu_subtype,
152
+ });
153
+ if (identityIssue !== null)
154
+ throw new MachoFormatIssue("malformed", identityIssue);
155
+ slices.push(slice);
130
156
  }
131
157
  return slices;
132
158
  };
133
- const readSlice = async (readAt, base, length) => {
159
+ const readSlice = async (readAt, base, length, fat = null) => {
134
160
  const header = viewOf(await readExact(readAt, base, 28, "Mach-O header"));
135
161
  const magic = header.getUint32(0, true);
136
162
  if (magic === MH_MAGIC_64 || magic === MH_MAGIC) {
@@ -143,13 +169,22 @@ const readSlice = async (readAt, base, length) => {
143
169
  if (headerSize + commandBytes > length)
144
170
  throw new MachoFormatIssue("malformed", "load commands extend beyond the Mach-O slice");
145
171
  const commands = await readExact(readAt, base + headerSize, commandBytes, "load commands");
146
- return decodeCommands(commands, {
172
+ const slice = decodeCommands(commands, {
147
173
  wide,
148
174
  cpuType: header.getUint32(4, true),
149
175
  cpuSubtype: header.getUint32(8, true),
150
176
  fileType: header.getUint32(12, true),
151
177
  commandCount,
178
+ sliceOffset: base,
179
+ sliceSize: length,
180
+ fatCpuType: fat?.fatCpuType ?? null,
181
+ fatCpuSubtype: fat?.fatCpuSubtype ?? null,
182
+ fatAlignmentExponent: fat?.alignmentExponent ?? null,
152
183
  });
184
+ const distinctPlatforms = [...new Set(slice.platforms)];
185
+ slice.platform =
186
+ distinctPlatforms.length === 1 ? (distinctPlatforms[0] ?? null) : null;
187
+ return slice;
153
188
  }
154
189
  throw new MachoFormatIssue(magic === swap(MH_MAGIC) || magic === swap(MH_MAGIC_64)
155
190
  ? "unsupported"
@@ -163,7 +198,17 @@ const decodeCommands = (bytes, header) => {
163
198
  const view = viewOf(bytes);
164
199
  const slice = {
165
200
  architecture: architectureName(header.cpuType, header.cpuSubtype),
201
+ slice_offset: header.sliceOffset,
202
+ slice_size: header.sliceSize,
203
+ cpu_type: header.cpuType,
204
+ cpu_subtype: header.cpuSubtype,
205
+ fat_cpu_type: header.fatCpuType,
206
+ fat_cpu_subtype: header.fatCpuSubtype,
207
+ fat_alignment_exponent: header.fatAlignmentExponent,
166
208
  file_type: fileTypeName(header.fileType),
209
+ file_type_code: header.fileType,
210
+ platform: null,
211
+ platforms: [],
167
212
  install_name: null,
168
213
  dependencies: [],
169
214
  rpaths: [],
@@ -182,6 +227,8 @@ const decodeCommands = (bytes, header) => {
182
227
  decodeCommand(command, body, index, slice);
183
228
  offset += size;
184
229
  }
230
+ if (offset !== bytes.byteLength)
231
+ throw new MachoFormatIssue("malformed", `load commands declare ${header.commandCount} commands but sizeofcmds holds ${bytes.byteLength} bytes`);
185
232
  return slice;
186
233
  };
187
234
  const decodeCommand = (command, body, index, slice) => {
@@ -204,6 +251,25 @@ const decodeCommand = (command, body, index, slice) => {
204
251
  slice.code_signature_present = true;
205
252
  return;
206
253
  }
254
+ if (command === LC_BUILD_VERSION) {
255
+ if (body.byteLength < 24)
256
+ throw new MachoFormatIssue("malformed", `load command ${index} is too short for LC_BUILD_VERSION`);
257
+ const platform = viewOf(body).getUint32(8, true);
258
+ slice.platforms.push(platform);
259
+ return;
260
+ }
261
+ const legacyPlatform = new Map([
262
+ [LC_VERSION_MIN_MACOSX, 1],
263
+ [LC_VERSION_MIN_IPHONEOS, 2],
264
+ [LC_VERSION_MIN_TVOS, 3],
265
+ [LC_VERSION_MIN_WATCHOS, 4],
266
+ ]).get(command);
267
+ if (legacyPlatform !== undefined) {
268
+ if (body.byteLength < 16)
269
+ throw new MachoFormatIssue("malformed", `load command ${index} is too short for a version-min command`);
270
+ slice.platforms.push(legacyPlatform);
271
+ return;
272
+ }
207
273
  const name = DEPENDENCY_COMMANDS.get(command);
208
274
  if (name !== undefined)
209
275
  slice.dependencies.push(decodeDependency(name, body, index));
@@ -286,9 +352,4 @@ const swap = (value) => (((value & 0xff) << 24) |
286
352
  ((value >>> 8) & 0xff00) |
287
353
  (value >>> 24)) >>>
288
354
  0;
289
- const safeNumber = (value) => {
290
- if (value > BigInt(Number.MAX_SAFE_INTEGER))
291
- throw new MachoFormatIssue("malformed", "FAT offset exceeds safe range");
292
- return Number(value);
293
- };
294
355
  const viewOf = (bytes) => new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);