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
@@ -26,15 +26,21 @@ export const analyzeAppleAssetCatalogs = async (input) => {
26
26
  const page = appleAssetCatalogInputSchema.parse(input.page ?? {});
27
27
  const reader = new DirectoryArtifactReader(input.bundlePath);
28
28
  const catalogs = [];
29
+ const uninspected = [];
29
30
  let totalMetadataBytes = 0;
30
31
  try {
31
32
  for await (const entry of reader.entries(input.signal)) {
32
- if (entry.kind !== "file" || !entry.path.endsWith("Assets.car"))
33
+ if (!entry.path.endsWith("Assets.car"))
33
34
  continue;
35
+ if (entry.kind !== "file") {
36
+ uninspected.push(`${entry.path} (${entry.kind})`);
37
+ continue;
38
+ }
34
39
  const inspected = await inspectAssetCatalogEntry({
35
40
  reader,
36
41
  entry,
37
- runAssetUtil: input.runAssetUtil ?? runAssetUtil,
42
+ runAssetUtil: input.runAssetUtil ??
43
+ ((path, signal) => runAssetUtil(path, input.environment, signal)),
38
44
  ...(input.signal === undefined ? {} : { signal: input.signal }),
39
45
  });
40
46
  totalMetadataBytes += inspected.metadataBytes;
@@ -46,8 +52,10 @@ export const analyzeAppleAssetCatalogs = async (input) => {
46
52
  finally {
47
53
  await reader.close();
48
54
  }
49
- if (catalogs.length === 0)
50
- throw new ArtifactReaderFailure("unavailable", "No compiled Assets.car catalogs were found in the app bundle");
55
+ // Without any readable catalog, unmatched resource keys would overstate an
56
+ // absence that a skipped catalog entry may contradict.
57
+ if (catalogs.length === 0 && uninspected.length > 0)
58
+ throw new ArtifactReaderFailure("path", `Asset catalog entries are not regular files and were not inspected: ${uninspected.join(", ")}`);
51
59
  const interfaceBuilder = await analyzeInterfaceBuilderBundle({
52
60
  bundlePath: input.bundlePath,
53
61
  targetSha256: input.targetSha256,
@@ -65,6 +73,18 @@ export const analyzeAppleAssetCatalogs = async (input) => {
65
73
  ...result,
66
74
  limitations: [
67
75
  ...result.limitations,
76
+ // An app without a compiled catalog is an observed empty inventory, not
77
+ // a missing host tool.
78
+ ...(catalogs.length === 0
79
+ ? [
80
+ "No compiled Assets.car catalog was found among the app bundle's regular files (symlinks are not followed); any resource keys are reported as unmatched.",
81
+ ]
82
+ : []),
83
+ ...(uninspected.length === 0
84
+ ? []
85
+ : [
86
+ `Asset catalog entries that are not regular files were not inspected, so resource keys reported as unmatched may resolve there: ${uninspected.join(", ")}`,
87
+ ]),
68
88
  "Exact resource-key joins use only recognized image or asset key fields on decoded Interface Builder resource objects; other archive resource references are not inferred.",
69
89
  ...(interfaceBuilder.graph.truncated
70
90
  ? [
@@ -131,9 +151,10 @@ export const collectInterfaceBuilderResourceKeys = (nodes) => nodes.flatMap((nod
131
151
  ]
132
152
  : []);
133
153
  });
134
- const runAssetUtil = async (path, signal) => {
154
+ const runAssetUtil = async (path, environment, signal) => {
135
155
  try {
136
156
  return (await execFileOutput(ASSETUTIL, ["--info", path], {
157
+ env: environment,
137
158
  timeout: 60_000,
138
159
  maxBuffer: MAX_CATALOG_BYTES,
139
160
  ...(signal === undefined ? {} : { signal }),
@@ -2,11 +2,14 @@ import { createHash } from "node:crypto";
2
2
  import { constants } from "node:fs";
3
3
  import { lstat, open, readlink, realpath } from "node:fs/promises";
4
4
  import { join, relative, sep } from "node:path";
5
+ import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
5
6
  import { resolveTreePath } from "../../domain/apple/dyldPaths.js";
6
7
  import { dylibResolutionInputSchema, dylibResolutionResultSchema, traceDylibLoading, } from "../../domain/apple/dylibResolution.js";
8
+ import { projectInputIssues } from "../../domain/inputIssueProjection.js";
7
9
  import { ArtifactReaderFailure } from "../ArtifactReader.js";
8
10
  import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
9
11
  import { hasMachoMagic, readMachoImage } from "./MachoLoadCommandReader.js";
12
+ const OPERATION = "trace_dylib_resolution";
10
13
  const HASH_CHUNK_BYTES = 1024 * 1024;
11
14
  /** Lazily probed, symlink-preserving view of one analyzed directory. */
12
15
  class FilesystemTreeView {
@@ -64,7 +67,7 @@ class FilesystemTreeView {
64
67
  export const traceDylibResolution = async (options) => {
65
68
  const parsed = dylibResolutionInputSchema.safeParse(options.parameters);
66
69
  if (!parsed.success)
67
- throw new ArtifactReaderFailure("path", "roots must be normalized paths relative to the analyzed root");
70
+ throw new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, options.parameters));
68
71
  // Canonicalization is inside the translated region: a revoked permission
69
72
  // keeps its reason and path.
70
73
  let root = options.rootPath;
@@ -79,7 +82,7 @@ export const traceDylibResolution = async (options) => {
79
82
  : options.enumerateRoots
80
83
  ? await executableRoots(root, view, options.signal)
81
84
  : { roots: [target], unclassified: [] };
82
- const roots = await requireMachoRoots(view, requested);
85
+ const roots = await requireMachoRoots(view, requested, parsed.data.roots !== undefined);
83
86
  const trace = await traceDylibLoading(view, {
84
87
  roots,
85
88
  unclassified,
@@ -151,17 +154,24 @@ const compare = (left, right) => left < right ? -1 : left > right ? 1 : 0;
151
154
  /**
152
155
  * Resolve each root segment by segment, as dependency candidates are, so a
153
156
  * symlink in an intermediate directory cannot lead outside the analyzed root.
157
+ * A root the caller selected that fails is an input error on that root; a
158
+ * root REA derived itself keeps reporting an artifact failure.
154
159
  */
155
- const requireMachoRoots = async (view, roots) => {
160
+ const requireMachoRoots = async (view, roots, callerSelected) => {
156
161
  const resolved = [];
157
- for (const path of roots) {
162
+ for (const [index, path] of roots.entries()) {
163
+ const reject = (reason, message) => callerSelected
164
+ ? new AnalysisInputError(OPERATION, undefined, [
165
+ { path: ["roots", index], reason: "invalid_value", message },
166
+ ])
167
+ : new ArtifactReaderFailure(reason, message);
158
168
  const lookup = await resolveTreePath(view, path);
159
169
  if (lookup.kind === "escapes")
160
- throw new ArtifactReaderFailure("path", `Root ${path} resolves outside the analyzed root`);
170
+ throw reject("path", `Root ${path} resolves outside the analyzed root`);
161
171
  if (lookup.kind !== "file")
162
- throw new ArtifactReaderFailure("path", `Root ${path} is not a regular file in the analyzed root`);
172
+ throw reject("path", `Root ${path} is not a regular file in the analyzed root`);
163
173
  if ((await view.image(lookup.path)).status === "not-mach-o")
164
- throw new ArtifactReaderFailure("format", `Root ${path} is not a Mach-O image`);
174
+ throw reject("format", `Root ${path} is not a Mach-O image`);
165
175
  if (!resolved.includes(lookup.path))
166
176
  resolved.push(lookup.path);
167
177
  }
@@ -4,36 +4,72 @@ import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
4
4
  import { projectPlistValue } from "../../domain/apple/plistValue.js";
5
5
  import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../../domain/propertyListKeys.js";
6
6
  import { decodeNibArchive } from "./NibArchive.js";
7
+ import { estimatePropertyListDecodeBytes, InterfaceBuilderDecodeBudget, InterfaceBuilderDecodeBudgetExceeded, } from "./InterfaceBuilderDecodeBudget.js";
7
8
  import { buildInterfaceBuilderAnalysis, interfaceBuilderLimitsSchema, } from "../../domain/apple/interfaceBuilderGraph.js";
8
9
  import { mergeNibHierarchies, projectNibViewHierarchy, } from "./NibViewHierarchy.js";
9
10
  import { jsonValueSchema } from "../../domain/jsonValue.js";
10
- const MAX_DOCUMENT_BYTES = 64 * 1024 * 1024;
11
+ import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
12
+ const MAX_AGGREGATE_INPUT_BYTES = 32 * 1024 * 1024;
13
+ const MAX_AGGREGATE_DECODE_BYTES = 256 * 1024 * 1024;
14
+ const MAX_REPORTED_OMITTED_ARCHIVES = 64;
11
15
  /** Decode compiled Interface Builder archives from a local app bundle. */
12
16
  export const analyzeInterfaceBuilderBundle = async (input) => {
13
17
  const limits = interfaceBuilderLimitsSchema.parse(input.limits ?? {});
14
18
  const reader = new DirectoryArtifactReader(input.bundlePath);
15
19
  const documents = [];
16
20
  const invalid = [];
21
+ const omittedArchives = [];
22
+ let unreportedOmittedArchives = 0;
17
23
  const incompleteHierarchies = new Map();
18
24
  const prototypeKeyOmissions = new Map();
19
25
  let omitted = 0;
20
26
  let attempted = 0;
27
+ let candidates = 0;
28
+ let aggregateInputBytes = 0;
29
+ const decodeBudget = new InterfaceBuilderDecodeBudget(MAX_AGGREGATE_DECODE_BYTES);
30
+ const recordOmittedArchive = (path, reason) => {
31
+ if (omittedArchives.length < MAX_REPORTED_OMITTED_ARCHIVES)
32
+ omittedArchives.push({ path, reason });
33
+ else
34
+ unreportedOmittedArchives += 1;
35
+ };
21
36
  try {
22
37
  for await (const entry of reader.entries(input.signal)) {
23
38
  if (entry.kind !== "file" || !isInterfaceBuilderArchive(entry.path))
24
39
  continue;
25
- if (attempted >= limits.max_documents) {
40
+ candidates += 1;
41
+ if (candidates > limits.max_documents) {
26
42
  omitted += 1;
43
+ recordOmittedArchive(entry.path, "max_documents");
27
44
  continue;
28
45
  }
29
- attempted += 1;
30
46
  try {
31
- const bytes = await readEntry(reader, entry, input.signal);
32
- const nib = bytes.subarray(0, 10).toString("ascii") === "NIBArchive"
33
- ? projectNibArchive(decodeNibArchive(bytes))
34
- : null;
47
+ const remainingInputBytes = MAX_AGGREGATE_INPUT_BYTES - aggregateInputBytes;
48
+ if (entry.declaredSize !== null &&
49
+ entry.declaredSize > remainingInputBytes) {
50
+ omitted += 1;
51
+ recordOmittedArchive(entry.path, "aggregate_decode_budget_exhausted");
52
+ continue;
53
+ }
54
+ attempted += 1;
55
+ const bytes = await readEntry(reader, entry, input.signal, remainingInputBytes);
56
+ aggregateInputBytes += bytes.length;
57
+ const isNibArchive = bytes.subarray(0, 10).toString("ascii") === "NIBArchive";
58
+ let nib = null;
59
+ let xmlText;
60
+ if (isNibArchive) {
61
+ const documentBudget = new InterfaceBuilderDecodeBudget(decodeBudget.remainingBytes);
62
+ nib = projectNibArchive(decodeNibArchive(bytes, documentBudget), documentBudget, limits.max_objects);
63
+ decodeBudget.reserve(documentBudget.usedBytes, "NIBArchive representation exceeds the aggregate Interface Builder decode budget");
64
+ }
65
+ else {
66
+ if (bytes.subarray(0, 8).toString("ascii") !== "bplist00")
67
+ xmlText = decodeXmlPlistText(bytes);
68
+ const decodedReservation = estimatePropertyListDecodeBytes(bytes, decodeBudget.remainingBytes, xmlText);
69
+ decodeBudget.reserve(decodedReservation, "plist representation exceeds the aggregate Interface Builder decode budget");
70
+ }
35
71
  const { value: raw, omittedPrototypeKeys } = nib === null
36
- ? decodePlist(bytes)
72
+ ? decodePlist(bytes, xmlText)
37
73
  : { value: nib.raw, omittedPrototypeKeys: 0 };
38
74
  if (nib !== null && nib.omitted > 0)
39
75
  incompleteHierarchies.set(entry.path, nib.omitted);
@@ -52,6 +88,11 @@ export const analyzeInterfaceBuilderBundle = async (input) => {
52
88
  catch (cause) {
53
89
  if (input.signal?.aborted === true)
54
90
  throw cause;
91
+ if (cause instanceof InterfaceBuilderDecodeBudgetExceeded) {
92
+ omitted += 1;
93
+ recordOmittedArchive(entry.path, cause.reason);
94
+ continue;
95
+ }
55
96
  invalid.push(`${entry.path}: ${cause instanceof Error ? cause.message : "archive decode failed"}`);
56
97
  }
57
98
  }
@@ -69,13 +110,17 @@ export const analyzeInterfaceBuilderBundle = async (input) => {
69
110
  incompleteHierarchies,
70
111
  prototypeKeyOmissions,
71
112
  invalid,
113
+ omittedArchives,
114
+ unreportedOmittedArchives,
72
115
  attempted,
73
116
  omitted,
74
117
  });
75
118
  };
76
119
  const finalizeHierarchyCoverage = (result, counts) => {
77
- const { incompleteHierarchies, prototypeKeyOmissions, invalid } = counts;
78
- const archiveDecodePartial = invalid.length > 0 || prototypeKeyOmissions.size > 0;
120
+ const { incompleteHierarchies, prototypeKeyOmissions, invalid, omittedArchives, unreportedOmittedArchives, } = counts;
121
+ const archiveDecodePartial = invalid.length > 0 ||
122
+ prototypeKeyOmissions.size > 0 ||
123
+ omittedArchives.length > 0;
79
124
  return {
80
125
  ...result,
81
126
  documents: result.documents.map((document) => ({
@@ -102,11 +147,17 @@ const finalizeHierarchyCoverage = (result, counts) => {
102
147
  status: archiveDecodePartial
103
148
  ? "partial"
104
149
  : "complete",
105
- reason: invalid.length > 0
106
- ? "one_or_more_archives_invalid"
107
- : prototypeKeyOmissions.size > 0
108
- ? "dictionary_entries_omitted"
109
- : null,
150
+ reason: omittedArchives.some(({ reason }) => reason === "aggregate_decode_budget_exhausted")
151
+ ? "aggregate_decode_budget_exhausted"
152
+ : omittedArchives.some(({ reason }) => reason === "max_documents")
153
+ ? "document_limit_reached"
154
+ : omittedArchives.length > 0
155
+ ? "archive_decode_budget_exhausted"
156
+ : invalid.length > 0
157
+ ? "one_or_more_archives_invalid"
158
+ : prototypeKeyOmissions.size > 0
159
+ ? "dictionary_entries_omitted"
160
+ : null,
110
161
  examined: counts.attempted,
111
162
  omitted: counts.omitted,
112
163
  },
@@ -130,27 +181,70 @@ const finalizeHierarchyCoverage = (result, counts) => {
130
181
  `Some Interface Builder archives could not be decoded: ${invalid.slice(0, 16).join("; ")}`,
131
182
  ]),
132
183
  ...[...prototypeKeyOmissions].map(([path, count]) => `${path}: ${omittedPrototypeKeysLimitation(count)}`),
184
+ ...omittedArchives.map(({ path, reason }) => `${path}: omitted because ${reason.replaceAll("_", " ")}.`),
185
+ ...(unreportedOmittedArchives === 0
186
+ ? []
187
+ : [
188
+ `${unreportedOmittedArchives} additional omitted archive path(s) and their reasons were not retained; reporting is bounded to ${MAX_REPORTED_OMITTED_ARCHIVES} paths.`,
189
+ ]),
133
190
  ],
134
191
  };
135
192
  };
136
193
  /** Project decoded NIB records into the same bounded graph input as ibtool. */
137
- const projectNibArchive = (archive) => {
194
+ const projectNibArchive = (archive, budget, maxHierarchyNodes) => {
138
195
  const byId = new Map(archive.objects.map((object) => [object.id, object]));
196
+ const normalizedClassNames = new Map();
197
+ const normalizeClassName = (value) => {
198
+ const known = normalizedClassNames.get(value);
199
+ if (known !== undefined)
200
+ return known;
201
+ const normalized = value.replace(/\0+$/u, "");
202
+ normalizedClassNames.set(value, normalized);
203
+ return normalized;
204
+ };
205
+ const decodedStrings = new Map();
206
+ const decodedString = (objectId, object) => {
207
+ if (decodedStrings.has(objectId))
208
+ return decodedStrings.get(objectId) ?? null;
209
+ const data = object.values["NS.bytes"];
210
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
211
+ decodedStrings.set(objectId, null);
212
+ return null;
213
+ }
214
+ const encoded = data.$nib_data_base64;
215
+ if (typeof encoded !== "string") {
216
+ decodedStrings.set(objectId, null);
217
+ return null;
218
+ }
219
+ budget.reserve(64 + encoded.length * 2, "NIBArchive string projection exceeds the aggregate Interface Builder decode budget");
220
+ const value = Buffer.from(encoded, "base64").toString("utf8");
221
+ decodedStrings.set(objectId, value);
222
+ return value;
223
+ };
224
+ let projectedFields = 0;
225
+ for (const object of archive.objects)
226
+ projectedFields += Object.keys(object.values).length;
227
+ budget.reserve(archive.objects.length * 128 + projectedFields * 128, "NIBArchive graph projection exceeds the aggregate Interface Builder decode budget");
228
+ budget.reserve(archive.classes.length * 96, "NIBArchive class projection exceeds the aggregate Interface Builder decode budget");
139
229
  const dereference = (value) => {
140
230
  if (typeof value !== "object" || value === null || Array.isArray(value))
141
231
  return value;
232
+ const encodedData = value.$nib_data_base64;
233
+ if (typeof encodedData === "string") {
234
+ budget.reserveBase64JsonStringOccurrence(encodedData);
235
+ return value;
236
+ }
142
237
  const ref = value.$nib_object_ref;
143
238
  if (typeof ref !== "number")
144
239
  return value;
145
240
  const target = byId.get(ref);
146
241
  if (target === undefined)
147
242
  return undefined;
148
- if (target.class_name.replace(/\0+$/u, "") === "NSString") {
149
- const data = target.values["NS.bytes"];
150
- if (typeof data === "object" && data !== null && !Array.isArray(data)) {
151
- const encoded = data.$nib_data_base64;
152
- if (typeof encoded === "string")
153
- return Buffer.from(encoded, "base64").toString("utf8");
243
+ if (normalizeClassName(target.class_name) === "NSString") {
244
+ const string = decodedString(ref, target);
245
+ if (string !== null) {
246
+ budget.reserveJsonStringOccurrence(string);
247
+ return string;
154
248
  }
155
249
  }
156
250
  return { objectID: String(ref) };
@@ -162,26 +256,30 @@ const projectNibArchive = (archive) => {
162
256
  if (typeof ref !== "number")
163
257
  return null;
164
258
  const target = byId.get(ref);
165
- const data = target?.values["NS.bytes"];
166
- if (target?.class_name.replace(/\0+$/u, "") !== "NSString")
259
+ if (target === undefined ||
260
+ normalizeClassName(target.class_name) !== "NSString")
167
261
  return null;
168
- if (typeof data !== "object" || data === null || Array.isArray(data))
262
+ const string = decodedString(ref, target);
263
+ if (string === null)
169
264
  return null;
170
- const encoded = data.$nib_data_base64;
171
- return typeof encoded === "string"
172
- ? Buffer.from(encoded, "base64").toString("utf8")
173
- : null;
265
+ budget.reserveJsonStringOccurrence(string);
266
+ return string;
174
267
  };
268
+ const runtimeClasses = new Map();
175
269
  const runtimeClass = (objectId) => {
270
+ if (runtimeClasses.has(objectId))
271
+ return runtimeClasses.get(objectId) ?? null;
176
272
  const object = byId.get(objectId);
177
273
  if (object === undefined)
178
274
  return null;
179
- const storedClass = object.class_name.replace(/\0+$/u, "");
180
- if (storedClass === "NSClassSwapper")
181
- return referencedString(object.values.NSClassName) ?? storedClass;
182
- return storedClass === "UIClassSwapper"
183
- ? (referencedString(object.values.UIClassName) ?? storedClass)
184
- : storedClass;
275
+ const storedClass = normalizeClassName(object.class_name);
276
+ const resolvedClass = storedClass === "NSClassSwapper"
277
+ ? (referencedString(object.values.NSClassName) ?? storedClass)
278
+ : storedClass === "UIClassSwapper"
279
+ ? (referencedString(object.values.UIClassName) ?? storedClass)
280
+ : storedClass;
281
+ runtimeClasses.set(objectId, resolvedClass);
282
+ return resolvedClass;
185
283
  };
186
284
  const objects = Object.fromEntries(archive.objects
187
285
  .filter((object) => {
@@ -189,22 +287,29 @@ const projectNibArchive = (archive) => {
189
287
  return !/^(?:NSObject|NSIBObjectData|NSString|NSMutableString|NSNumber|NSArray|NSMutableArray|NSSet|NSMutableSet|NSDictionary|NSMutableDictionary|NSApplication|NSNib.*Connector|UIRuntime\w*Connection)$/u.test(name);
190
288
  })
191
289
  .map((object) => {
192
- const className = runtimeClass(object.id) ?? object.class_name.replace(/\0+$/u, "");
193
- const strings = Object.entries(object.values).flatMap(([key, value]) => {
290
+ const className = runtimeClass(object.id) ?? normalizeClassName(object.class_name);
291
+ budget.reserveJsonStringOccurrence(className);
292
+ let name = className;
293
+ for (const [key, value] of Object.entries(object.values)) {
294
+ if (!/(?:title|label|identifier|accessibility|name|contents)/iu.test(key))
295
+ continue;
194
296
  const resolved = dereference(value);
195
- return typeof resolved === "string" ? [[key, resolved]] : [];
196
- });
197
- const name = strings.find(([key]) => /(?:title|label|identifier|accessibility|name|contents)/iu.test(key ?? ""))?.[1] ?? className;
297
+ if (typeof resolved !== "string")
298
+ continue;
299
+ name = resolved;
300
+ break;
301
+ }
302
+ budget.reserveJsonStringOccurrence(name);
198
303
  return [
199
304
  String(object.id),
200
305
  {
201
306
  customClass: className,
202
307
  label: name,
203
308
  objectID: String(object.id),
204
- nibValues: Object.fromEntries(Object.entries(object.values).map(([key, value]) => [
205
- key,
206
- dereference(value) ?? null,
207
- ])),
309
+ nibValues: Object.fromEntries(Object.entries(object.values).map(([key, value]) => {
310
+ budget.reserveJsonPropertyNameOccurrence(key);
311
+ return [key, dereference(value) ?? null];
312
+ })),
208
313
  },
209
314
  ];
210
315
  }));
@@ -218,7 +323,7 @@ const projectNibArchive = (archive) => {
218
323
  : null;
219
324
  };
220
325
  for (const object of archive.objects) {
221
- const className = object.class_name.replace(/\0+$/u, "");
326
+ const className = normalizeClassName(object.class_name);
222
327
  // AppKit connectors use NS-prefixed keys; UIKit's runtime outlet and
223
328
  // event connections use UI-prefixed keys with the same roles.
224
329
  const uiKit = /^UIRuntime\w*Connection$/u.test(className);
@@ -235,6 +340,7 @@ const projectNibArchive = (archive) => {
235
340
  : className.includes("Control") || className.includes("Event")
236
341
  ? "action"
237
342
  : className;
343
+ budget.reserveJsonStringOccurrence(type);
238
344
  const eventMask = values.UIEventMask;
239
345
  // The source is the outlet owner or the sending control; the destination
240
346
  // is the outlet value or the action target, and a nil target is the
@@ -249,16 +355,26 @@ const projectNibArchive = (archive) => {
249
355
  });
250
356
  }
251
357
  let hierarchyOmitted = 0;
358
+ let hierarchyNodeCount = 0;
252
359
  const hierarchyFor = (objectId, seen, depth) => {
253
360
  if (depth > 32 || seen.has(objectId)) {
254
361
  hierarchyOmitted += 1;
255
362
  return null;
256
363
  }
364
+ if (hierarchyNodeCount >= maxHierarchyNodes) {
365
+ hierarchyOmitted += 1;
366
+ return null;
367
+ }
368
+ if (!budget.tryReserve(128)) {
369
+ hierarchyOmitted += 1;
370
+ return null;
371
+ }
257
372
  const object = byId.get(objectId);
258
373
  if (object === undefined) {
259
374
  hierarchyOmitted += 1;
260
375
  return null;
261
376
  }
377
+ hierarchyNodeCount += 1;
262
378
  const nextSeen = new Set(seen).add(objectId);
263
379
  const children = [];
264
380
  for (const [key, value] of Object.entries(object.values)) {
@@ -288,7 +404,7 @@ const projectNibArchive = (archive) => {
288
404
  }
289
405
  return { objectID: String(objectId), children };
290
406
  };
291
- const ibData = archive.objects.find(({ class_name }) => class_name.replace(/\0+$/u, "") === "NSIBObjectData");
407
+ const ibData = archive.objects.find(({ class_name }) => normalizeClassName(class_name) === "NSIBObjectData");
292
408
  const rootId = reference(ibData?.values.NSRoot);
293
409
  const hierarchyRoots = rootId === null ? [] : [rootId];
294
410
  for (const hierarchyRoot of hierarchyRoots) {
@@ -296,15 +412,19 @@ const projectNibArchive = (archive) => {
296
412
  if (root !== null)
297
413
  hierarchy.push(root);
298
414
  }
299
- const viewHierarchy = projectNibViewHierarchy(archive.objects, new Set(Object.keys(objects).map(Number)));
300
- const merged = mergeNibHierarchies(hierarchy, viewHierarchy.hierarchy ?? []);
415
+ const viewHierarchy = projectNibViewHierarchy(archive.objects, new Set(Object.keys(objects).map(Number)), () => budget.tryReserve(128), maxHierarchyNodes);
416
+ const merged = mergeNibHierarchies(hierarchy, viewHierarchy.hierarchy ?? [], () => budget.tryReserve(96), maxHierarchyNodes);
301
417
  return {
302
418
  omitted: viewHierarchy.omitted + hierarchyOmitted + merged.omitted,
303
419
  raw: jsonValueSchema.parse({
304
420
  "com.apple.ibtool.document.objects": objects,
305
421
  "com.apple.ibtool.document.connections": connections,
306
422
  "com.apple.ibtool.document.hierarchy": merged.hierarchy,
307
- "com.apple.ibtool.document.classes": Object.fromEntries(archive.classes.map((name) => [name.replace(/\0+$/u, ""), {}])),
423
+ "com.apple.ibtool.document.classes": Object.fromEntries(archive.classes.map((name) => {
424
+ const className = normalizeClassName(name);
425
+ budget.reserveJsonPropertyNameOccurrence(className);
426
+ return [className, {}];
427
+ })),
308
428
  }),
309
429
  };
310
430
  };
@@ -312,9 +432,9 @@ const isInterfaceBuilderArchive = (path) => {
312
432
  const lower = path.toLowerCase();
313
433
  return lower.endsWith(".nib") || lower.endsWith("/objects.nib");
314
434
  };
315
- const readEntry = async (reader, entry, signal) => {
316
- if (entry.declaredSize !== null && entry.declaredSize > MAX_DOCUMENT_BYTES)
317
- throw new RangeError("archive exceeds the 64 MiB per-document decode limit");
435
+ const readEntry = async (reader, entry, signal, maxInputBytes = MAX_AGGREGATE_INPUT_BYTES) => {
436
+ if (entry.declaredSize !== null && entry.declaredSize > maxInputBytes)
437
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "archive exceeds the aggregate Interface Builder decode budget");
318
438
  const stream = await reader.open(entry, signal);
319
439
  const chunks = [];
320
440
  let length = 0;
@@ -323,18 +443,18 @@ const readEntry = async (reader, entry, signal) => {
323
443
  ? chunk
324
444
  : Buffer.from(chunk);
325
445
  length += bytes.length;
326
- if (length > MAX_DOCUMENT_BYTES) {
446
+ if (length > maxInputBytes) {
327
447
  stream.destroy();
328
- throw new RangeError("archive exceeded the 64 MiB per-document decode limit");
448
+ throw new InterfaceBuilderDecodeBudgetExceeded("aggregate_decode_budget_exhausted", "archive exceeded the aggregate Interface Builder decode budget");
329
449
  }
330
450
  chunks.push(bytes);
331
451
  }
332
452
  return Buffer.concat(chunks, length);
333
453
  };
334
454
  /** Project decoded plist data and dates while retaining omitted-key coverage. */
335
- const decodePlist = (bytes) => {
455
+ const decodePlist = (bytes, xmlText) => {
336
456
  const { value, omittedPrototypeKeys } = bytes.subarray(0, 8).toString("ascii") === "bplist00"
337
457
  ? { value: parseBinary(bytes), omittedPrototypeKeys: 0 }
338
- : parseXmlPropertyList(bytes.toString("utf8"));
458
+ : parseXmlPropertyList(xmlText ?? decodeXmlPlistText(bytes));
339
459
  return { value: projectPlistValue(value).value, omittedPrototypeKeys };
340
460
  };