rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -0,0 +1,109 @@
1
+ import { relative, resolve, sep } from "node:path";
2
+ import { parse } from "plist";
3
+ import { z } from "zod";
4
+ const systemEntitySchema = z.object({
5
+ "dev-entry": z.string().startsWith("/dev/"),
6
+ "mount-point": z.string().optional(),
7
+ });
8
+ const attachOutputSchema = z.object({
9
+ "system-entities": z.array(systemEntitySchema),
10
+ });
11
+ const infoOutputSchema = z.object({
12
+ images: z.array(z.object({
13
+ "system-entities": z.array(systemEntitySchema),
14
+ })),
15
+ });
16
+ /** Parse hdiutil's current image inventory. */
17
+ export const parseNativeDmgInfo = (stdout) => infoOutputSchema.parse(parse(stdout));
18
+ /** Parse hdiutil's attach response while preserving device and mount facts. */
19
+ export const parseNativeDmgAttachOutput = (stdout) => attachOutputSchema.parse(parse(stdout));
20
+ /** Classify only fresh image groups tied to the exclusively owned mount root. */
21
+ export const resolveNativeDmgOwnership = (input) => {
22
+ const rootedImages = input.info.images.filter((image) => image["system-entities"].some(({ "mount-point": mountPoint }) => mountPoint !== undefined && isBelowRoot(input.mountRoot, mountPoint)));
23
+ if (rootedImages.length > 1)
24
+ return {
25
+ status: "unknown",
26
+ reason: "multiple hdiutil image groups report mounts beneath the owned root",
27
+ };
28
+ const rootedImage = rootedImages[0];
29
+ if (rootedImage !== undefined) {
30
+ const hasOutsideMount = rootedImage["system-entities"].some(({ "mount-point": mountPoint }) => mountPoint !== undefined && !isBelowRoot(input.mountRoot, mountPoint));
31
+ const groupDevices = rootedImage["system-entities"].map(({ "dev-entry": device }) => device);
32
+ const devices = topLevelDevices(groupDevices);
33
+ const overlapsBaseline = groupDevices.some((device) => input.baselineDevices.has(device));
34
+ if (hasOutsideMount || overlapsBaseline || devices.length === 0)
35
+ return {
36
+ status: "unknown",
37
+ reason: hasOutsideMount
38
+ ? "the image group contains a mount outside the owned root"
39
+ : overlapsBaseline
40
+ ? "the image group includes a device present before attachment"
41
+ : "the owned mount group contains no detachable device",
42
+ };
43
+ return { status: "owned", devices, source: "info" };
44
+ }
45
+ if (input.attachOutputReturned) {
46
+ const attachOwnership = ownershipFromAttachOutput(input.attachOutput, input.mountRoot, input.baselineDevices);
47
+ if (attachOwnership.status === "owned") {
48
+ return attachOwnership;
49
+ }
50
+ if (attachOwnership.status === "unknown")
51
+ return attachOwnership;
52
+ }
53
+ const newlyListedDevice = input.info.images.some((image) => image["system-entities"].some(({ "dev-entry": device }) => !input.baselineDevices.has(device)));
54
+ if (newlyListedDevice)
55
+ return {
56
+ status: "unknown",
57
+ reason: "hdiutil lists devices absent from the pre-attach baseline, but none is tied uniquely to the owned root; ownership is unknown",
58
+ };
59
+ return { status: "none" };
60
+ };
61
+ const ownershipFromAttachOutput = (output, mountRoot, baselineDevices) => {
62
+ if (output === undefined)
63
+ return {
64
+ status: "unknown",
65
+ reason: "hdiutil attach succeeded but its ownership facts were malformed",
66
+ };
67
+ const entities = output["system-entities"];
68
+ const hasRootMount = entities.some(({ "mount-point": mountPoint }) => mountPoint !== undefined && isBelowRoot(mountRoot, mountPoint));
69
+ const hasOutsideMount = entities.some(({ "mount-point": mountPoint }) => mountPoint !== undefined && !isBelowRoot(mountRoot, mountPoint));
70
+ const devices = entities.map(({ "dev-entry": device }) => device);
71
+ const uniqueDevices = topLevelDevices(devices);
72
+ const overlapsBaseline = devices.some((device) => baselineDevices.has(device));
73
+ if (hasRootMount) {
74
+ if (hasOutsideMount || overlapsBaseline || uniqueDevices.length === 0)
75
+ return {
76
+ status: "unknown",
77
+ reason: hasOutsideMount
78
+ ? "the attach result includes a mount outside the owned root"
79
+ : overlapsBaseline
80
+ ? "the attach result includes a device present before attachment"
81
+ : "the attach result's owned mount has no detachable device",
82
+ };
83
+ return { status: "owned", devices: uniqueDevices, source: "attach" };
84
+ }
85
+ if (devices.length === 0)
86
+ return {
87
+ status: "unknown",
88
+ reason: "hdiutil attach succeeded without reporting device ownership facts",
89
+ };
90
+ if (devices.some((device) => !baselineDevices.has(device)))
91
+ return {
92
+ status: "unknown",
93
+ reason: "the attach result reports new devices without a mount beneath the owned root",
94
+ };
95
+ return { status: "none" };
96
+ };
97
+ const topLevelDevices = (devices) => {
98
+ const unique = [...new Set(devices)];
99
+ return unique.filter((device) => !unique.some((parent) => /^\/dev\/disk\d+$/u.test(parent) &&
100
+ device.startsWith(`${parent}s`) &&
101
+ /^\d+$/u.test(device.slice(parent.length + 1))));
102
+ };
103
+ const isBelowRoot = (root, path) => {
104
+ const child = relative(root, resolve(path));
105
+ return (child !== "" &&
106
+ child !== "." &&
107
+ child !== ".." &&
108
+ !child.startsWith(`..${sep}`));
109
+ };
@@ -129,7 +129,13 @@ export class SafeOutputTree {
129
129
  async rollback() {
130
130
  if (this.#published)
131
131
  return structuredClone(this.#cleanup);
132
- await rm(this.#outputRoot, { recursive: true, force: true });
132
+ let removalFailure;
133
+ try {
134
+ await rm(this.#outputRoot, { recursive: true, force: true });
135
+ }
136
+ catch (cause) {
137
+ removalFailure = cause;
138
+ }
133
139
  const absent = await isAbsent(this.#outputRoot);
134
140
  this.#cleanup = absent
135
141
  ? { status: "complete", residualPaths: [] }
@@ -138,7 +144,15 @@ export class SafeOutputTree {
138
144
  residualPaths: [basename(this.#outputRoot)],
139
145
  };
140
146
  if (!absent)
141
- throw new ArtifactReaderFailure("integrity", "Extraction output cleanup could not be verified");
147
+ throw new ArtifactReaderFailure("integrity", `Extraction output cleanup could not be verified${removalFailure === undefined ? "" : `: ${removalFailure instanceof Error ? removalFailure.message : String(removalFailure)}`}`, {
148
+ cause: removalFailure,
149
+ cleanup: {
150
+ reason: removalFailure instanceof Error
151
+ ? removalFailure.message
152
+ : "Extraction output root remains after rollback",
153
+ resources: [this.#outputRoot],
154
+ },
155
+ });
142
156
  return structuredClone(this.#cleanup);
143
157
  }
144
158
  async #prepareParent(relativePath) {
@@ -5,10 +5,12 @@ import { Reader, ZipReader } from "@zip.js/zip.js";
5
5
  import { ArtifactReaderFailure, } from "./ArtifactReader.js";
6
6
  class NodeFileReader extends Reader {
7
7
  path;
8
+ maximumReadBytes;
8
9
  #handle;
9
- constructor(path) {
10
+ constructor(path, maximumReadBytes) {
10
11
  super(path);
11
12
  this.path = path;
13
+ this.maximumReadBytes = maximumReadBytes;
12
14
  }
13
15
  async init() {
14
16
  this.#handle = await open(this.path, "r");
@@ -18,7 +20,11 @@ class NodeFileReader extends Reader {
18
20
  const handle = this.#handle;
19
21
  if (handle === undefined)
20
22
  throw new Error("ZIP reader is not initialized");
21
- const bytes = Buffer.alloc(Math.min(length, this.size - index));
23
+ const readBytes = Math.min(length, this.size - index);
24
+ if (this.maximumReadBytes !== undefined &&
25
+ readBytes > this.maximumReadBytes)
26
+ throw new ArtifactReaderFailure("limit", `ZIP metadata read requires ${readBytes} bytes, exceeding the ${this.maximumReadBytes}-byte read budget`);
27
+ const bytes = Buffer.alloc(readBytes);
22
28
  const read = await handle.read(bytes, 0, bytes.length, index);
23
29
  return bytes.subarray(0, read.bytesRead);
24
30
  }
@@ -33,9 +39,10 @@ export class ZipArtifactReader {
33
39
  #source;
34
40
  #reader;
35
41
  #entries = new Map();
36
- constructor(path, format) {
42
+ /** Optionally bound each metadata read before allocating its backing buffer. */
43
+ constructor(path, format, maximumMetadataReadBytes) {
37
44
  this.format = format;
38
- this.#source = new NodeFileReader(path);
45
+ this.#source = new NodeFileReader(path, maximumMetadataReadBytes);
39
46
  this.#reader = new ZipReader(this.#source, {
40
47
  checkSignature: true,
41
48
  checkOverlappingEntry: true,
@@ -39,7 +39,8 @@ export const analyzeAppleAssetCatalogs = async (input) => {
39
39
  const inspected = await inspectAssetCatalogEntry({
40
40
  reader,
41
41
  entry,
42
- runAssetUtil: input.runAssetUtil ?? runAssetUtil,
42
+ runAssetUtil: input.runAssetUtil ??
43
+ ((path, signal) => runAssetUtil(path, input.environment, signal)),
43
44
  ...(input.signal === undefined ? {} : { signal: input.signal }),
44
45
  });
45
46
  totalMetadataBytes += inspected.metadataBytes;
@@ -150,9 +151,10 @@ export const collectInterfaceBuilderResourceKeys = (nodes) => nodes.flatMap((nod
150
151
  ]
151
152
  : []);
152
153
  });
153
- const runAssetUtil = async (path, signal) => {
154
+ const runAssetUtil = async (path, environment, signal) => {
154
155
  try {
155
156
  return (await execFileOutput(ASSETUTIL, ["--info", path], {
157
+ env: environment,
156
158
  timeout: 60_000,
157
159
  maxBuffer: MAX_CATALOG_BYTES,
158
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
  }
@@ -1,12 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { join } from "node:path";
2
3
  import { parseBinary } from "plist";
3
4
  import { z } from "zod";
4
- import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
5
+ import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
5
6
  import { projectPlistValue } from "../../domain/apple/plistValue.js";
6
7
  import { createPlistNumberProjection } from "../../domain/apple/plistNumbers.js";
7
8
  import { binaryPlistNumberLiterals, xmlPlistNumberLiterals, } from "./PlistNumberLiterals.js";
8
9
  import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../../domain/propertyListKeys.js";
9
- import { keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
10
+ import { KeyedArchiveKindError, keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
10
11
  import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
11
12
  import { ArtifactReaderFailure } from "../ArtifactReader.js";
12
13
  import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
@@ -16,13 +17,14 @@ export const decodeKeyedArchiveBytes = (bytes, selection) => {
16
17
  if (bytes.length > MAX_BYTES)
17
18
  throw new RangeError("Keyed archive exceeds 64 MiB");
18
19
  if (bytes.subarray(0, 10).toString("ascii") === "NIBArchive")
19
- throw new TypeError("Selected file is a compiled NIBArchive, not a Foundation plist archive; decode it with decode_interface_builder");
20
+ throw new KeyedArchiveKindError("Selected file is a compiled NIBArchive, not a Foundation plist archive; decode it with decode_interface_builder", "nib-archive");
20
21
  const binary = bytes.subarray(0, 8).toString("ascii") === "bplist00";
21
22
  const xmlText = binary ? undefined : decodeXmlPlistText(bytes);
22
23
  const parsed = binary
23
24
  ? { value: parseBinary(bytes), omittedPrototypeKeys: 0 }
24
25
  : parseXmlPropertyList(xmlText ?? "");
25
- const graph = projectKeyedArchive(normalizePlist(parsed.value), selection);
26
+ const { value: plistValue, unknownRealCount } = projectPlistValue(parsed.value);
27
+ const graph = projectKeyedArchive(plistValue, selection);
26
28
  const numbers = createPlistNumberProjection(binary
27
29
  ? binaryPlistNumberLiterals(bytes)
28
30
  : xmlPlistNumberLiterals(xmlText ?? ""));
@@ -47,14 +49,24 @@ export const decodeKeyedArchiveBytes = (bytes, selection) => {
47
49
  ...(parsed.omittedPrototypeKeys === 0
48
50
  ? []
49
51
  : [omittedPrototypeKeysLimitation(parsed.omittedPrototypeKeys)]),
52
+ ...(unknownRealCount === 0
53
+ ? []
54
+ : [
55
+ `${String(unknownRealCount)} non-finite real value(s) are reported as { "$plist_type": "real", "value": null } because JSON evidence cannot preserve NaN vs infinity.`,
56
+ ]),
50
57
  ],
51
58
  };
52
59
  };
53
- const normalizePlist = (value) => {
54
- const projected = projectPlistValue(value);
55
- if (projected.unknownRealCount > 0)
56
- throw new RangeError("Keyed archive contains a non-finite real");
57
- return projected.value;
60
+ /**
61
+ * Point to the workflow that reads the selected kind of file on this host.
62
+ * decode_interface_builder is portable; inspect_plist requires macOS.
63
+ */
64
+ const keyedArchiveKindRemediation = (kind, platform) => {
65
+ if (kind === "nib-archive")
66
+ return "Decode compiled NIBArchive files with decode_interface_builder on the app bundle.";
67
+ return platform === "darwin"
68
+ ? "Inspect an ordinary property list with inspect_plist; inspect_keyed_archive decodes NSKeyedArchiver archives only."
69
+ : "Select an NSKeyedArchiver archive; inspect_keyed_archive decodes only those. inspect_plist, which reads ordinary property lists, requires a macOS host.";
58
70
  };
59
71
  /** Read exactly one regular, contained bundle entry without following symlinks. */
60
72
  export const inspectBundleKeyedArchive = async (input) => {
@@ -68,45 +80,59 @@ export const inspectBundleKeyedArchive = async (input) => {
68
80
  : `Archive path must be a canonical relative bundle path without empty, '.', or '..' segments: ${selected.path}`);
69
81
  const reader = new DirectoryArtifactReader(input.bundlePath);
70
82
  try {
83
+ // Match inventory spelling while retaining the raw path for I/O and evidence.
84
+ const wanted = selected.path.normalize("NFC");
85
+ const matches = [];
71
86
  for await (const entry of reader.entries(input.signal)) {
72
- if (entry.path !== selected.path)
87
+ if (entry.path.normalize("NFC") !== wanted)
73
88
  continue;
74
- if (entry.kind !== "file")
75
- throw archivePathError("invalid_value", `Archive path selects a ${entry.kind}, not a regular file: ${selected.path}`);
76
- if ((entry.declaredSize ?? 0) > MAX_BYTES)
89
+ matches.push(entry);
90
+ }
91
+ if (matches.length > 1)
92
+ throw archivePathError("invalid_value", `Archive path matches ${String(matches.length)} Unicode-equivalent bundle entries; selection is ambiguous: ${selected.path}`);
93
+ const entry = matches[0];
94
+ if (entry === undefined)
95
+ throw archivePathError("invalid_value", `No regular file exists at ${selected.path} in the active app bundle.`);
96
+ if (entry.kind !== "file")
97
+ throw archivePathError("invalid_value", `Archive path selects a ${entry.kind}, not a regular file: ${selected.path}`);
98
+ if ((entry.declaredSize ?? 0) > MAX_BYTES)
99
+ throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
100
+ const stream = await reader.open(entry, input.signal);
101
+ const chunks = [];
102
+ let size = 0;
103
+ for await (const chunk of stream) {
104
+ if (input.signal?.aborted) {
105
+ stream.destroy();
106
+ throw new ArtifactReaderFailure("cancelled", "Archive inspection cancelled");
107
+ }
108
+ const bytes = z.instanceof(Buffer).parse(chunk);
109
+ size += bytes.length;
110
+ if (size > MAX_BYTES) {
111
+ stream.destroy();
77
112
  throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
78
- const stream = await reader.open(entry, input.signal);
79
- const chunks = [];
80
- let size = 0;
81
- for await (const chunk of stream) {
82
- if (input.signal?.aborted) {
83
- stream.destroy();
84
- throw new ArtifactReaderFailure("cancelled", "Archive inspection cancelled");
85
- }
86
- const bytes = z.instanceof(Buffer).parse(chunk);
87
- size += bytes.length;
88
- if (size > MAX_BYTES) {
89
- stream.destroy();
90
- throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
91
- }
92
- chunks.push(bytes);
93
113
  }
94
- const bytes = Buffer.concat(chunks, size);
95
- try {
96
- return keyedArchiveResultSchema.parse({
97
- target_sha256: input.targetSha256,
98
- archive_path: entry.path,
99
- archive_sha256: createHash("sha256").update(bytes).digest("hex"),
100
- ...decodeKeyedArchiveBytes(bytes, selected),
114
+ chunks.push(bytes);
115
+ }
116
+ const bytes = Buffer.concat(chunks, size);
117
+ try {
118
+ return keyedArchiveResultSchema.parse({
119
+ target_sha256: input.targetSha256,
120
+ archive_path: entry.path,
121
+ archive_sha256: createHash("sha256").update(bytes).digest("hex"),
122
+ ...decodeKeyedArchiveBytes(bytes, selected),
123
+ });
124
+ }
125
+ catch (cause) {
126
+ if (cause instanceof AnalysisInputError)
127
+ throw cause;
128
+ // An intact file of another kind is not a damaged archive.
129
+ if (cause instanceof KeyedArchiveKindError)
130
+ throw new AnalysisUnsupportedTargetError("inspect_keyed_archive", join(input.bundlePath, entry.path), cause.message, {
131
+ cause,
132
+ remediationAction: keyedArchiveKindRemediation(cause.kind, input.platform ?? process.platform),
101
133
  });
102
- }
103
- catch (cause) {
104
- if (cause instanceof AnalysisInputError)
105
- throw cause;
106
- throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", `Cannot decode selected Foundation keyed archive: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
107
- }
134
+ throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", `Cannot decode selected Foundation keyed archive: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
108
135
  }
109
- throw archivePathError("invalid_value", `No regular file exists at ${selected.path} in the active app bundle.`);
110
136
  }
111
137
  finally {
112
138
  await reader.close();
@@ -29,6 +29,41 @@ const LC_VERSION_MIN_IPHONEOS = 0x25;
29
29
  const LC_VERSION_MIN_TVOS = 0x2f;
30
30
  const LC_VERSION_MIN_WATCHOS = 0x30;
31
31
  const LC_BUILD_VERSION = 0x32;
32
+ // `mach-o/loader.h` `PLATFORM_*` numbers observed via Apple linker output.
33
+ const PLATFORM_MACOS = 1;
34
+ const PLATFORM_IOS = 2;
35
+ const PLATFORM_TVOS = 3;
36
+ const PLATFORM_WATCHOS = 4;
37
+ const PLATFORM_IOSSIMULATOR = 7;
38
+ const PLATFORM_TVOSSIMULATOR = 8;
39
+ const PLATFORM_WATCHOSSIMULATOR = 9;
40
+ const CPU_TYPE_I386 = 7;
41
+ const CPU_TYPE_X86_64 = 0x01000007;
42
+ /**
43
+ * Legacy `LC_VERSION_MIN_*` commands predate explicit simulator platform
44
+ * IDs. Per Apple's dyld rules the image CPU type distinguishes simulator
45
+ * from device: Intel images are simulator, ARM images are device
46
+ * (tvOS simulator applies to x86_64 only). `LC_BUILD_VERSION` platform
47
+ * numbers are preserved verbatim; unknown future numbers stay unknown
48
+ * downstream, never mapped to nearest.
49
+ */
50
+ const legacyVersionMinPlatform = (command, cpuType) => {
51
+ const isIntel = cpuType === CPU_TYPE_I386 || cpuType === CPU_TYPE_X86_64;
52
+ switch (command) {
53
+ case LC_VERSION_MIN_MACOSX:
54
+ return PLATFORM_MACOS;
55
+ case LC_VERSION_MIN_IPHONEOS:
56
+ return isIntel ? PLATFORM_IOSSIMULATOR : PLATFORM_IOS;
57
+ case LC_VERSION_MIN_TVOS:
58
+ return cpuType === CPU_TYPE_X86_64
59
+ ? PLATFORM_TVOSSIMULATOR
60
+ : PLATFORM_TVOS;
61
+ case LC_VERSION_MIN_WATCHOS:
62
+ return isIntel ? PLATFORM_WATCHOSSIMULATOR : PLATFORM_WATCHOS;
63
+ default:
64
+ return undefined;
65
+ }
66
+ };
32
67
  /** `mach-o/loader.h` `dylib_use_command`: `nameoff == 28` and this marker. */
33
68
  const DYLIB_USE_MARKER = 0x1a741800;
34
69
  const DYLIB_USE_WEAK_LINK = 0x1;
@@ -258,12 +293,7 @@ const decodeCommand = (command, body, index, slice) => {
258
293
  slice.platforms.push(platform);
259
294
  return;
260
295
  }
261
- const legacyPlatform = new Map([
262
- [LC_VERSION_MIN_MACOSX, 1],
263
- [LC_VERSION_MIN_IPHONEOS, 2],
264
- [LC_VERSION_MIN_TVOS, 3],
265
- [LC_VERSION_MIN_WATCHOS, 4],
266
- ]).get(command);
296
+ const legacyPlatform = legacyVersionMinPlatform(command, slice.cpu_type);
267
297
  if (legacyPlatform !== undefined) {
268
298
  if (body.byteLength < 16)
269
299
  throw new MachoFormatIssue("malformed", `load command ${index} is too short for a version-min command`);