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
@@ -77,7 +77,7 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
77
77
  evidence,
78
78
  offset,
79
79
  };
80
- const { failures, examined, categoriesExamined } = decodeObjcDispatchFacets({
80
+ const { failures, categoryIssues, examined, categoriesExamined } = decodeObjcDispatchFacets({
81
81
  bytes,
82
82
  sections,
83
83
  segments,
@@ -91,7 +91,7 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
91
91
  budget,
92
92
  result,
93
93
  });
94
- decodeSwiftDispatchFacets({
94
+ const swift = decodeSwiftDispatchFacets({
95
95
  sections,
96
96
  segments,
97
97
  readers,
@@ -108,7 +108,7 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
108
108
  if (section.size / 4 > maxRecords)
109
109
  budget.truncated = true;
110
110
  }
111
- decodeSwiftClassVtables({
111
+ const vtables = decodeSwiftClassVtables({
112
112
  entries: typeEntries,
113
113
  result,
114
114
  readers: {
@@ -126,10 +126,13 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
126
126
  pushDispatchCoverage({
127
127
  result,
128
128
  failures,
129
+ categoryIssues,
129
130
  examined,
130
131
  categoriesExamined,
131
132
  truncated: budget.truncated,
132
133
  fixups,
134
+ vtables,
135
+ swift,
133
136
  });
134
137
  return objcSwiftMetadataSchema.parse(result);
135
138
  };
@@ -1,3 +1,4 @@
1
+ import { issue } from "./AppleDispatchDecodeFacts.js";
1
2
  const POINTER_FORMATS = {
2
3
  1: "DYLD_CHAINED_PTR_ARM64E",
3
4
  2: "DYLD_CHAINED_PTR_64",
@@ -19,39 +20,42 @@ const cString = (bytes, offset, end) => {
19
20
  throw new RangeError("Fixup symbol name is outside the symbol pool");
20
21
  return bytes.toString("utf8", offset, stop);
21
22
  };
22
- const readImports = (data, header) => {
23
+ const readImport = (data, header, index) => {
23
24
  const { bytes, base, end, dylibs } = data;
24
25
  const size = header.format === 3 ? 16 : header.format === 2 ? 8 : 4;
25
26
  if (header.format < 1 || header.format > 3)
26
27
  throw new RangeError(`Unsupported chained import format ${header.format}`);
27
- if (base + header.offset + header.count * size > end)
28
+ if (!Number.isSafeInteger(header.count) ||
29
+ base + header.offset + header.count * size > end)
28
30
  throw new RangeError("Chained import table exceeds the fixup data");
29
- return Array.from({ length: header.count }, (_, index) => {
30
- const at = base + header.offset + index * size;
31
- if (header.format === 3) {
32
- const word = bytes.readBigUInt64LE(at);
33
- const ordinal = Number(signed(bits(word, 0, 16), 16));
34
- return {
35
- symbol: cString(bytes, base + header.symbols + Number(bits(word, 32, 32)), end),
36
- library: libraryName(ordinal, dylibs),
37
- weak: bits(word, 16, 1) === 1n,
38
- addend: bytes.readBigInt64LE(at + 8),
39
- };
40
- }
41
- const word = bytes.readUInt32LE(at);
42
- const ordinal = Number(signed(BigInt(word & 0xff), 8));
31
+ if (index < 0 || index >= header.count)
32
+ throw new RangeError("Chained import index is outside the table");
33
+ const at = base + header.offset + index * size;
34
+ if (header.format === 3) {
35
+ const word = bytes.readBigUInt64LE(at);
36
+ const ordinal = Number(signed(bits(word, 0, 16), 16));
43
37
  return {
44
- symbol: cString(bytes, base + header.symbols + (word >>> 9), end),
38
+ symbol: cString(bytes, base + header.symbols + Number(bits(word, 32, 32)), end),
45
39
  library: libraryName(ordinal, dylibs),
46
- weak: ((word >>> 8) & 1) === 1,
47
- addend: header.format === 2 ? BigInt(bytes.readInt32LE(at + 4)) : 0n,
40
+ weak: bits(word, 16, 1) === 1n,
41
+ addend: bytes.readBigInt64LE(at + 8),
48
42
  };
49
- });
43
+ }
44
+ const word = bytes.readUInt32LE(at);
45
+ const ordinal = Number(signed(BigInt(word & 0xff), 8));
46
+ return {
47
+ symbol: cString(bytes, base + header.symbols + (word >>> 9), end),
48
+ library: libraryName(ordinal, dylibs),
49
+ weak: ((word >>> 8) & 1) === 1,
50
+ addend: header.format === 2 ? BigInt(bytes.readInt32LE(at + 4)) : 0n,
51
+ };
50
52
  };
51
53
  /** Decode one raw chained pointer for its segment's pointer format. */
52
54
  export const decodeChainedPointer = (raw, format, baseAddress, imports) => {
53
55
  const bind = (ordinal, addend) => {
54
- const target = imports[Number(ordinal)];
56
+ const target = typeof imports === "function"
57
+ ? imports(Number(ordinal))
58
+ : imports[Number(ordinal)];
55
59
  if (target === undefined)
56
60
  throw new RangeError(`Chained bind ordinal ${ordinal} has no import`);
57
61
  return { kind: "bind", ...target, addend: target.addend + addend };
@@ -86,12 +90,19 @@ const chainedFixups = (image, range) => {
86
90
  if (range.size < 28 || end > bytes.length)
87
91
  throw new RangeError("Chained fixup header exceeds the target");
88
92
  const startsOffset = bytes.readUInt32LE(base + 4);
89
- const imports = readImports({ bytes, base, end, dylibs }, {
93
+ const importHeader = {
90
94
  offset: bytes.readUInt32LE(base + 8),
91
95
  symbols: bytes.readUInt32LE(base + 12),
92
96
  count: bytes.readUInt32LE(base + 16),
93
97
  format: bytes.readUInt32LE(base + 20),
94
- });
98
+ };
99
+ const importSize = importHeader.format === 3 ? 16 : importHeader.format === 2 ? 8 : 4;
100
+ const importTableEnd = base + importHeader.offset + importHeader.count * importSize;
101
+ if (importHeader.format < 1 || importHeader.format > 3)
102
+ throw new RangeError(`Unsupported chained import format ${importHeader.format}`);
103
+ if (!Number.isSafeInteger(importHeader.count) || importTableEnd > end)
104
+ throw new RangeError("Chained import table exceeds the fixup data");
105
+ const imports = (index) => readImport({ bytes, base, end, dylibs }, importHeader, index);
95
106
  if (bytes.readUInt32LE(base + 24) !== 0)
96
107
  throw new RangeError("Compressed chained-fixup symbol names are not supported");
97
108
  const starts = base + startsOffset;
@@ -113,10 +124,16 @@ const chainedFixups = (image, range) => {
113
124
  const formats = [
114
125
  ...new Set(ranges.map(({ format }) => POINTER_FORMATS[format] ?? `format-${format}`)),
115
126
  ];
127
+ const issues = ranges.flatMap(({ format, from }) => POINTER_FORMATS[format] === undefined
128
+ ? [
129
+ issue("pointer_fixups", "unsupported_pointer_format", `Unsupported chained pointer format ${format}`, `0x${from.toString(16)}`),
130
+ ]
131
+ : []);
116
132
  return {
117
133
  kind: "chained",
118
134
  formats,
119
- failures: [],
135
+ failures: issues.map(({ message }) => message),
136
+ issues,
120
137
  decode(address, raw) {
121
138
  const segment = ranges.find(({ from, to }) => address >= from && address < to);
122
139
  // Pointers outside fixup segments, such as in __TEXT, are stored plainly.
@@ -124,6 +141,11 @@ const chainedFixups = (image, range) => {
124
141
  return { kind: "rebase", target: raw };
125
142
  if (raw === 0n)
126
143
  return { kind: "rebase", target: 0n };
144
+ if (POINTER_FORMATS[segment.format] === undefined)
145
+ return {
146
+ kind: "unsupported",
147
+ reason: `Unsupported chained pointer format ${segment.format}`,
148
+ };
127
149
  return decodeChainedPointer(raw, segment.format, baseAddress, imports);
128
150
  },
129
151
  };
@@ -267,6 +289,7 @@ export const parsePointerFixups = (bytes, commands, segments, baseAddress) => {
267
289
  kind: "none",
268
290
  formats: [],
269
291
  failures: [],
292
+ issues: [],
270
293
  decode: (_address, raw) => ({ kind: "rebase", target: raw }),
271
294
  };
272
295
  const binds = new Map();
@@ -282,6 +305,7 @@ export const parsePointerFixups = (bytes, commands, segments, baseAddress) => {
282
305
  kind: "dyld-info",
283
306
  formats: [],
284
307
  failures,
308
+ issues: failures.map((message) => issue("pointer_fixups", "bind_stream_decode_failed", message)),
285
309
  decode(address, raw) {
286
310
  const bound = binds.get(address);
287
311
  return bound === undefined
@@ -1,3 +1,4 @@
1
+ import { readFatSliceDeclarations, validateFatSlice, } from "../domain/apple/machoContainer.js";
1
2
  const hex = (value) => `0x${value.toString(16)}`;
2
3
  /** Classify a FAT magic word; thin Mach-O returns null. */
3
4
  export const fatHeaderFormat = (magic) => {
@@ -25,9 +26,6 @@ export const selectMachoSlice = (bytes, architecture) => {
25
26
  const readUInt32 = littleEndian
26
27
  ? (offset) => bytes.readUInt32LE(offset)
27
28
  : (offset) => bytes.readUInt32BE(offset);
28
- const readUInt64 = littleEndian
29
- ? (offset) => bytes.readBigUInt64LE(offset)
30
- : (offset) => bytes.readBigUInt64BE(offset);
31
29
  const byteOrder = littleEndian ? "little-endian" : "big-endian";
32
30
  const malformed = (reason) => new RangeError(`${reason} (FAT header byte order: ${byteOrder})`);
33
31
  const invalid = (reason) => new TypeError(`${reason} (FAT header byte order: ${byteOrder})`);
@@ -38,22 +36,30 @@ export const selectMachoSlice = (bytes, architecture) => {
38
36
  if (count > 128 || headerEnd > bytes.length)
39
37
  throw malformed("Malformed FAT architecture table");
40
38
  const cpu = architecture === "arm64" ? 0x0100000c : 0x01000007;
39
+ const declarations = readFatSliceDeclarations(bytes.subarray(8, headerEnd), {
40
+ count,
41
+ wide: fat64,
42
+ littleEndian,
43
+ });
44
+ if (declarations.status !== "parsed")
45
+ throw malformed(declarations.reason);
41
46
  let selected;
42
- for (let index = 0; index < count; index++) {
43
- const offset = 8 + index * stride;
44
- if (readUInt32(offset) !== cpu)
47
+ for (const declaration of declarations.slices) {
48
+ const issue = validateFatSlice(declaration, bytes.length, headerEnd);
49
+ if (issue !== null)
50
+ throw malformed(issue);
51
+ if (declaration.cpuType !== cpu)
45
52
  continue;
46
53
  if (selected !== undefined)
47
54
  throw invalid("Ambiguous FAT architecture slice");
48
- const start = fat64
49
- ? readUInt64(offset + 8)
50
- : BigInt(readUInt32(offset + 8));
51
- const size = fat64
52
- ? readUInt64(offset + 16)
53
- : BigInt(readUInt32(offset + 12));
54
- if (start < BigInt(headerEnd) || start + size > BigInt(bytes.length))
55
- throw malformed("FAT slice exceeds file");
56
- selected = { slice: Number(start), sliceEnd: Number(start + size) };
55
+ selected = {
56
+ slice: declaration.offset,
57
+ sliceEnd: declaration.offset + declaration.size,
58
+ fatDeclaration: {
59
+ ...declaration,
60
+ tableEnd: headerEnd,
61
+ },
62
+ };
57
63
  }
58
64
  if (selected === undefined)
59
65
  throw invalid("Requested FAT architecture is absent");
@@ -63,11 +69,21 @@ export const selectMachoSlice = (bytes, architecture) => {
63
69
  export const parseMachoLayout = (bytes, architecture) => {
64
70
  if (bytes.length < 4)
65
71
  throw new RangeError("Truncated Mach-O header");
66
- const { slice, sliceEnd } = selectMachoSlice(bytes, architecture);
72
+ const selection = selectMachoSlice(bytes, architecture);
73
+ const { slice, sliceEnd } = selection;
67
74
  if (slice === 0 && sliceEnd === bytes.length && bytes.length < 32)
68
75
  throw new RangeError("Truncated Mach-O header");
69
76
  if (slice + 32 > sliceEnd || bytes.readUInt32LE(slice) !== 0xfeedfacf)
70
77
  throw new TypeError("Only little-endian 64-bit Mach-O metadata is supported");
78
+ const fat = selection.fatDeclaration;
79
+ if (fat !== undefined) {
80
+ const issue = validateFatSlice(fat, bytes.length, fat.tableEnd, {
81
+ cpuType: bytes.readUInt32LE(slice + 4),
82
+ cpuSubtype: bytes.readUInt32LE(slice + 8),
83
+ });
84
+ if (issue !== null)
85
+ throw new TypeError(issue);
86
+ }
71
87
  const commands = bytes.readUInt32LE(slice + 16);
72
88
  const commandEnd = slice + 32 + bytes.readUInt32LE(slice + 20);
73
89
  if (commands > 4096 || commandEnd > sliceEnd)
@@ -166,9 +182,14 @@ const collectFixupCommand = (bytes, { cursor, kind, size }, state) => {
166
182
  throw new RangeError("Fixup data exceeds the Mach-O slice");
167
183
  return { offset, size: length };
168
184
  };
169
- if (kind === LC_DYLD_CHAINED_FIXUPS && size >= 16)
185
+ if (kind === LC_DYLD_CHAINED_FIXUPS) {
186
+ if (size < 16)
187
+ throw new RangeError("Truncated chained-fixups command");
170
188
  state.chained = range(cursor + 8);
171
- else if ((kind === LC_DYLD_INFO || kind === LC_DYLD_INFO_ONLY) && size >= 48)
189
+ }
190
+ else if (kind === LC_DYLD_INFO || kind === LC_DYLD_INFO_ONLY) {
191
+ if (size < 48)
192
+ throw new RangeError("Truncated dyld-info command");
172
193
  for (const [at, stream] of [
173
194
  [cursor + 16, "bind"],
174
195
  [cursor + 24, "weak"],
@@ -178,11 +199,16 @@ const collectFixupCommand = (bytes, { cursor, kind, size }, state) => {
178
199
  if (bound.size > 0)
179
200
  state.binds.push({ ...bound, stream });
180
201
  }
181
- else if (DYLIB_COMMANDS.includes(kind) && size >= 24) {
202
+ }
203
+ else if (DYLIB_COMMANDS.includes(kind)) {
204
+ if (size < 24)
205
+ throw new RangeError("Truncated dylib command");
182
206
  const nameOffset = bytes.readUInt32LE(cursor + 8);
207
+ if (nameOffset < 24 || nameOffset >= size)
208
+ throw new RangeError("Dylib install name is outside its load command");
183
209
  const end = bytes.indexOf(0, cursor + nameOffset);
184
- state.dylibs.push(nameOffset >= size || end < 0 || end > cursor + size
185
- ? ""
186
- : bytes.toString("utf8", cursor + nameOffset, end));
210
+ if (end < 0 || end >= cursor + size)
211
+ throw new RangeError("Unterminated dylib install name");
212
+ state.dylibs.push(bytes.toString("utf8", cursor + nameOffset, end));
187
213
  }
188
214
  };
@@ -1,4 +1,5 @@
1
1
  import { readObjcPropertiesOf } from "./AppleObjcProperties.js";
2
+ import { issue } from "./AppleDispatchDecodeFacts.js";
2
3
  const CLASS_SYMBOL = /^_OBJC_(?:META)?CLASS_\$_(.+)$/u;
3
4
  /** External class name from a bound `_OBJC_CLASS_$_Name` symbol. */
4
5
  export const boundClassName = (read, field) => {
@@ -41,7 +42,8 @@ export const decodeObjcCategories = (input) => {
41
42
  properties: readObjcPropertiesOf(read, read.pointer(category + 40n), {
42
43
  owner: `category ${name}`,
43
44
  admit: input.admit,
44
- failures,
45
+ issues: input.issues,
46
+ location: `0x${read.pointer(category + 40n).toString(16)}`,
45
47
  }),
46
48
  location: read.location(category),
47
49
  decode: className === null
@@ -51,7 +53,9 @@ export const decodeObjcCategories = (input) => {
51
53
  });
52
54
  }
53
55
  catch (cause) {
54
- failures.push(`Category at ${`0x${field.toString(16)}`}: ${cause instanceof Error ? cause.message : String(cause)}`);
56
+ const message = cause instanceof Error ? cause.message : String(cause);
57
+ failures.push(`Category at 0x${field.toString(16)}: ${message}`);
58
+ input.issues.push(issue("objc_properties_categories", "category_decode_failed", message, `0x${field.toString(16)}`));
55
59
  }
56
60
  }
57
61
  }
@@ -30,6 +30,7 @@ const resolveSuperclass = (read, address, className, failures) => {
30
30
  export const decodeObjcDispatchFacets = (input) => {
31
31
  const { bytes, sections, segments, readers: read, budget, result } = input;
32
32
  const failures = [];
33
+ const categoryIssues = [];
33
34
  let examined = 0;
34
35
  const methods = (list, className, methodType, category) => {
35
36
  const selectors = [];
@@ -203,7 +204,8 @@ export const decodeObjcDispatchFacets = (input) => {
203
204
  properties: readObjcPropertiesOf(read, read.pointer(ro + 64n), {
204
205
  owner: name,
205
206
  admit: () => budget.admit(),
206
- failures,
207
+ issues: categoryIssues,
208
+ location: hex(read.pointer(ro + 64n)),
207
209
  }),
208
210
  protocols: protocolReader.list(read.pointer(ro + 40n)),
209
211
  ivar_count: ivarCount,
@@ -248,10 +250,11 @@ export const decodeObjcDispatchFacets = (input) => {
248
250
  read,
249
251
  result,
250
252
  failures,
253
+ issues: categoryIssues,
251
254
  admit: () => budget.admit(),
252
255
  methods,
253
256
  protocols: (list) => protocolReader.list(list),
254
257
  localClassName: (address) => localClassName(read, address),
255
258
  });
256
- return { failures, examined, categoriesExamined };
259
+ return { failures, categoryIssues, examined, categoriesExamined };
257
260
  };
@@ -1,3 +1,4 @@
1
+ import { issue } from "./AppleDispatchDecodeFacts.js";
1
2
  /**
2
3
  * Parse an `@property` attribute string such as `T@"NSString",C,N,V_name`.
3
4
  * Each comma-separated token is one attribute; `T` is the type encoding.
@@ -62,7 +63,7 @@ export const readObjcPropertiesOf = (read, list, context) => {
62
63
  return readObjcPropertyList(read, list, context.admit);
63
64
  }
64
65
  catch (cause) {
65
- context.failures.push(`Properties of ${context.owner}: ${cause instanceof Error ? cause.message : String(cause)}`);
66
+ context.issues.push(issue("objc_properties_categories", "property_decode_failed", `${context.owner}: ${cause instanceof Error ? cause.message : String(cause)}`, context.location));
66
67
  return [];
67
68
  }
68
69
  };
@@ -1,3 +1,4 @@
1
+ import { issue } from "./AppleDispatchDecodeFacts.js";
1
2
  const hex = (value) => `0x${value.toString(16)}`;
2
3
  const decoded = { status: "decoded", reason: null };
3
4
  /** Create a Swift ABI signed-relative pointer decoder that records relative_pointers. */
@@ -42,7 +43,9 @@ export const createSwiftRelativeReader = (input) => {
42
43
  export const decodeSwiftDispatchFacets = (input) => {
43
44
  const { sections, segments, readers: read, relative, budget, result } = input;
44
45
  const swiftFailures = [];
46
+ const issues = [];
45
47
  let swiftExamined = 0;
48
+ let decodedRecords = 0;
46
49
  for (const section of sections.filter(({ name }) => name === "__swift5_proto")) {
47
50
  if (section.size % 4 !== 0)
48
51
  throw new RangeError("Misaligned Swift conformance section");
@@ -77,6 +80,9 @@ export const decodeSwiftDispatchFacets = (input) => {
77
80
  if (staticWitness && read.pointer(witness) !== descriptor)
78
81
  witnessReason =
79
82
  "Witness-table conformance header is unresolved or encoded";
83
+ const conformanceDecode = witnessReason === null
84
+ ? { status: "decoded", reason: null }
85
+ : { status: "partial", reason: witnessReason };
80
86
  result.swift_conformances.push({
81
87
  type_name: typeName,
82
88
  protocol_name: protocolName,
@@ -85,16 +91,14 @@ export const decodeSwiftDispatchFacets = (input) => {
85
91
  ? { address: null, file_offset: null }
86
92
  : read.location(witness),
87
93
  location: read.location(descriptor),
88
- decode: witnessReason === null
89
- ? decoded
90
- : {
91
- status: "partial",
92
- reason: witnessReason,
93
- },
94
+ decode: conformanceDecode,
94
95
  evidence: read.evidence(descriptor, "Swift protocol conformance descriptor and directly encoded type/protocol names"),
95
96
  });
97
+ if (conformanceDecode.status === "decoded")
98
+ decodedRecords++;
96
99
  if (witnessReason !== null) {
97
100
  swiftFailures.push(`${typeName}: ${witnessReason}`);
101
+ issues.push(issue("swift_conformances_static_witness_slots", "conformance_decode_partial", witnessReason, hex(descriptor)));
98
102
  continue;
99
103
  }
100
104
  const count = read.u32(protocol + 16n);
@@ -113,6 +117,12 @@ export const decodeSwiftDispatchFacets = (input) => {
113
117
  segments.some((segment) => segment.executable &&
114
118
  implementation >= segment.address &&
115
119
  implementation < segment.address + segment.size);
120
+ const slotDecode = executable
121
+ ? { status: "decoded", reason: null }
122
+ : {
123
+ status: "partial",
124
+ reason: "Witness slot is non-function, async, nil, external, authenticated or encoded; implementation target is unresolved",
125
+ };
116
126
  result.swift_dispatch_slots.push({
117
127
  owner: `${typeName}: ${protocolName}`,
118
128
  table_kind: "witness_table",
@@ -122,29 +132,25 @@ export const decodeSwiftDispatchFacets = (input) => {
122
132
  implementation_address: executable ? hex(implementation) : null,
123
133
  thunk_address: null,
124
134
  location: read.location(entry),
125
- decode: executable
126
- ? decoded
127
- : {
128
- status: "partial",
129
- reason: "Witness slot is non-function, async, nil, external, authenticated or encoded; implementation target is unresolved",
130
- },
135
+ decode: slotDecode,
131
136
  evidence: read.evidence(entry, "Static Swift witness slot, indexed after the conformance-descriptor header"),
132
137
  });
138
+ if (slotDecode.status !== "decoded")
139
+ issues.push(issue("swift_conformances_static_witness_slots", "witness_slot_unresolved", slotDecode.reason, hex(entry)));
133
140
  }
134
141
  }
135
142
  catch (cause) {
136
- swiftFailures.push(`${hex(field)}: ${cause instanceof Error ? cause.message : String(cause)}`);
143
+ const message = cause instanceof Error ? cause.message : String(cause);
144
+ swiftFailures.push(`${hex(field)}: ${message}`);
145
+ issues.push(issue("swift_conformances_static_witness_slots", "conformance_decode_failed", message, hex(field)));
137
146
  }
138
147
  }
139
148
  }
140
- result.coverage.push({
149
+ return {
141
150
  facet: "swift_conformances_static_witness_slots",
142
- status: swiftFailures.length > 0 || budget.truncated ? "partial" : "complete",
143
- reason: [
144
- ...swiftFailures,
145
- ...(budget.truncated ? ["max_records_reached"] : []),
146
- ].join("; ") || null,
147
151
  examined: swiftExamined,
148
- decoded: result.swift_conformances.length,
149
- });
152
+ decoded: decodedRecords,
153
+ exhaustive: !budget.truncated && issues.length === 0,
154
+ issues,
155
+ };
150
156
  };
@@ -1,11 +1,15 @@
1
+ import { issue } from "./AppleDispatchDecodeFacts.js";
1
2
  /** Decode non-generic, non-resilient Swift class vtable descriptors without instantiating metadata. */
2
3
  export const decodeSwiftClassVtables = (input) => {
3
4
  const { readers: read, result } = input;
4
5
  const failures = [];
6
+ const issues = [];
5
7
  let examined = 0;
8
+ let decoded = 0;
6
9
  for (const field of input.entries) {
7
10
  if (!read.admit()) {
8
11
  failures.push("max_records_reached");
12
+ issues.push(issue("swift_class_vtable_descriptors", "record_budget_exhausted", "max_records_reached", `0x${field.toString(16)}`));
9
13
  break;
10
14
  }
11
15
  examined++;
@@ -32,11 +36,12 @@ export const decodeSwiftClassVtables = (input) => {
32
36
  throw new RangeError("Swift vtable count or offset exceeds declared metadata bounds");
33
37
  const owner = read.string(read.relative(descriptor + 8n));
34
38
  for (let index = 0; index < count; index++) {
39
+ const entry = header + 8n + BigInt(index * 8);
35
40
  if (!read.admit()) {
36
41
  failures.push("max_records_reached");
42
+ issues.push(issue("swift_class_vtable_descriptors", "record_budget_exhausted", "max_records_reached", `0x${entry.toString(16)}`));
37
43
  break;
38
44
  }
39
- const entry = header + 8n + BigInt(index * 8);
40
45
  const methodFlags = read.u32(entry);
41
46
  // Async slots reference async descriptors; coroutine and future kinds need separate decoders.
42
47
  const synchronous = (methodFlags & 0x40) === 0 && (methodFlags & 15) <= 3;
@@ -61,26 +66,27 @@ export const decodeSwiftClassVtables = (input) => {
61
66
  },
62
67
  evidence: read.evidence(entry, "Swift class vtable method descriptor; slot index is a metadata word offset, not a source method ordinal"),
63
68
  });
69
+ if (resolved)
70
+ decoded++;
71
+ else
72
+ issues.push(issue("swift_class_vtable_descriptors", "vtable_implementation_unresolved", "Async, coroutine, external or unmapped vtable implementation is unresolved", `0x${entry.toString(16)}`));
64
73
  }
65
- if ((specific & 0x4000) !== 0)
74
+ if ((specific & 0x4000) !== 0) {
66
75
  failures.push(`${owner}: inherited override descriptors are unsupported`);
76
+ issues.push(issue("swift_class_vtable_descriptors", "inherited_override_descriptors_unsupported", "Inherited override descriptors are unsupported", `0x${descriptor.toString(16)}`));
77
+ }
67
78
  }
68
79
  catch (cause) {
69
- failures.push(`0x${field.toString(16)}: ${cause instanceof Error ? cause.message : String(cause)}`);
80
+ const message = cause instanceof Error ? cause.message : String(cause);
81
+ failures.push(`0x${field.toString(16)}: ${message}`);
82
+ issues.push(issue("swift_class_vtable_descriptors", "vtable_decode_failed", message, `0x${field.toString(16)}`));
70
83
  }
71
84
  }
72
- const slots = result.swift_dispatch_slots.filter((slot) => slot.table_kind === "class_vtable");
73
- result.coverage.push({
85
+ return {
74
86
  facet: "swift_class_vtable_descriptors",
75
87
  examined,
76
- decoded: slots.filter((slot) => slot.decode.status === "decoded").length,
77
- status: failures.length > 0 ||
78
- slots.some((slot) => slot.decode.status !== "decoded")
79
- ? "partial"
80
- : "complete",
81
- reason: failures.join("; ") ||
82
- (slots.some((slot) => slot.decode.status !== "decoded")
83
- ? "vtable_implementations_unresolved"
84
- : null),
85
- });
88
+ decoded,
89
+ exhaustive: issues.length === 0,
90
+ issues,
91
+ };
86
92
  };