rea-agents 6.2.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -1,94 +1,103 @@
1
1
  import { mkdtemp, realpath, rm } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { basename, join } from "node:path";
4
- import { parse } from "plist";
5
- import { z } from "zod";
6
4
  import { ArtifactReaderFailure, } from "./ArtifactReader.js";
7
5
  import { DirectoryArtifactReader } from "./DirectoryArtifactReader.js";
8
- import { execFileOutput } from "../process/ExecFileOutput.js";
9
- const DETACH_TIMEOUT_MS = 120_000;
10
- /**
11
- * Waits before rechecking devices whose detach failed. A related device's
12
- * later detach can eject one, `hdiutil info` can still list an ejected device
13
- * briefly, and a volume can report busy just after it was read.
14
- */
6
+ import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
7
+ import { parseNativeDmgAttachOutput, parseNativeDmgInfo, resolveNativeDmgOwnership, } from "./NativeDmgOwnership.js";
8
+ const HDIUTIL_COMMAND_TIMEOUT_MS = 120_000;
9
+ // APFS ejects and busy reporting can lag a detach attempt.
15
10
  const DETACH_SETTLE_DELAYS_MS = [250, 500, 1000];
16
11
  const delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
17
- const attachOutputSchema = z.object({
18
- "system-entities": z.array(z.object({
19
- "dev-entry": z.string().startsWith("/dev/"),
20
- "mount-point": z.string().optional(),
21
- })),
22
- });
23
- const infoOutputSchema = z.object({
24
- images: z.array(z.object({
25
- "system-entities": z.array(z.object({ "dev-entry": z.string() })),
26
- })),
27
- });
12
+ class NativeDmgCommandFailure extends ArtifactReaderFailure {
13
+ stdout;
14
+ processNotStarted;
15
+ constructor(reason, message, stdout, options) {
16
+ super(reason, message, options?.cause === undefined ? undefined : { cause: options.cause });
17
+ this.stdout = stdout;
18
+ this.processNotStarted = options?.processNotStarted ?? false;
19
+ }
20
+ }
28
21
  const createSystemHost = (environment) => ({
29
22
  delay,
30
23
  async run(arguments_, signal, options) {
31
24
  try {
32
25
  const { stdout, stderr } = await execFileOutput("/usr/bin/hdiutil", [...arguments_], {
33
26
  env: environment,
27
+ stopSignal: "SIGTERM",
34
28
  ...(options === undefined ? {} : { timeout: options.timeoutMs }),
35
29
  ...(signal === undefined ? {} : { signal }),
36
30
  });
37
31
  return { stdout, stderr, exitCode: 0 };
38
32
  }
39
33
  catch (cause) {
34
+ const output = execFileOutputFailure(cause);
40
35
  if (cause instanceof Error && cause.name === "AbortError")
41
- throw new ArtifactReaderFailure("cancelled", "DMG operation cancelled");
42
- const exitCode = processExitCode(cause);
36
+ throw new NativeDmgCommandFailure("cancelled", "DMG operation cancelled", output?.stdout ?? "", { cause });
37
+ const exitCode = typeof output?.code === "number" ? output.code : processExitCode(cause);
43
38
  if (exitCode !== undefined)
44
39
  return {
45
- stdout: processOutput(cause, "stdout"),
46
- stderr: processOutput(cause, "stderr"),
40
+ stdout: output?.stdout ?? processOutput(cause, "stdout"),
41
+ stderr: output?.stderr ?? processOutput(cause, "stderr"),
47
42
  exitCode,
48
43
  cause,
49
44
  };
50
- throw new ArtifactReaderFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, { cause });
45
+ throw new NativeDmgCommandFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, output?.stdout ?? "", { cause, processNotStarted: processNotStarted(cause) });
51
46
  }
52
47
  },
53
48
  });
54
49
  /** Read-only macOS DMG adapter that owns attachment and reverse-order detach. */
55
50
  export class NativeDmgArtifactReader {
56
51
  path;
57
- host;
58
52
  format = "file";
53
+ host;
59
54
  #provenance = [];
55
+ #initialization;
60
56
  #directory;
61
57
  #devices = [];
58
+ #inventoryConfirmedDevices = new Set();
62
59
  #mountRoot;
63
- constructor(path, host) {
60
+ #baselineDevices = new Set();
61
+ #attachOutput;
62
+ #attachOutputReturned = false;
63
+ #attachMayHaveMounted = false;
64
+ #ownershipUncertainty;
65
+ #closed = false;
66
+ #closePromise;
67
+ constructor(path, environment, host) {
64
68
  this.path = path;
65
- this.host = host;
66
- }
67
- /** Verify and attach one image beneath an exclusively owned temporary root. */
68
- static async create(path, environment, signal, host) {
69
69
  if (process.platform !== "darwin" && host === undefined)
70
70
  throw new ArtifactReaderFailure("unavailable", "Native DMG traversal is available only on macOS");
71
- const reader = new NativeDmgArtifactReader(path, host ?? createSystemHost(environment));
72
- await reader.attach(signal);
73
- return reader;
71
+ this.host = host ?? createSystemHost(environment);
74
72
  }
75
73
  async *entries(signal) {
74
+ await this.#ensureAttached(signal);
76
75
  if (this.#directory === undefined)
77
76
  throw new ArtifactReaderFailure("unavailable", "DMG is not attached");
78
77
  const prefix = basename(this.path);
79
78
  for await (const entry of this.#directory.entries(signal))
80
79
  yield { ...entry, path: `${prefix}/${entry.path}` };
81
80
  }
82
- open(entry, signal) {
81
+ async open(entry, signal) {
82
+ await this.#ensureAttached(signal);
83
83
  if (this.#directory === undefined)
84
- return Promise.reject(new ArtifactReaderFailure("unavailable", "DMG is not attached"));
84
+ throw new ArtifactReaderFailure("unavailable", "DMG is not attached");
85
85
  return this.#directory.open(entry, signal);
86
86
  }
87
87
  provenance() {
88
88
  return structuredClone(this.#provenance);
89
89
  }
90
- async close() {
91
- let detachFailure;
90
+ close() {
91
+ this.#closed = true;
92
+ this.#closePromise ??= this.#closeOwnedResources().catch((cause) => {
93
+ this.#closePromise = undefined;
94
+ throw cause;
95
+ });
96
+ return this.#closePromise;
97
+ }
98
+ async #closeOwnedResources() {
99
+ await this.#initialization?.catch(() => undefined);
100
+ let detachFailure = await this.#reconcileAttachState();
92
101
  let remainingDevices = [];
93
102
  for (const device of [...this.#devices].reverse()) {
94
103
  const failure = await this.#detach(device);
@@ -97,10 +106,7 @@ export class NativeDmgArtifactReader {
97
106
  detachFailure ??= failure;
98
107
  }
99
108
  }
100
- // Detaching a synthesized APFS container also ejects the image that backs
101
- // it, so a device whose own detach failed may be gone by the end of the
102
- // pass, and hdiutil can list an ejected device or report busy briefly.
103
- // Only a device that stays attached through every recheck is a failure.
109
+ // APFS container detach may briefly leave its backing image listed.
104
110
  for (const delayMs of DETACH_SETTLE_DELAYS_MS) {
105
111
  if (remainingDevices.length === 0)
106
112
  break;
@@ -120,13 +126,19 @@ export class NativeDmgArtifactReader {
120
126
  if (remainingDevices.length === 0)
121
127
  detachFailure = undefined;
122
128
  this.#devices = remainingDevices.reverse();
123
- if (this.#devices.length === 0 && this.#mountRoot !== undefined)
129
+ if (this.#devices.length === 0 &&
130
+ this.#mountRoot !== undefined &&
131
+ !this.#attachMayHaveMounted)
124
132
  await rm(this.#mountRoot, { recursive: true, force: true }).then(() => {
125
133
  this.#mountRoot = undefined;
126
134
  this.#directory = undefined;
127
135
  }, (cause) => {
128
136
  detachFailure ??= cause;
129
137
  });
138
+ if (this.#attachMayHaveMounted) {
139
+ detachFailure ??= new Error(this.#ownershipUncertainty ??
140
+ "hdiutil attachment ownership remains unknown");
141
+ }
130
142
  if (detachFailure !== undefined)
131
143
  throw new ArtifactReaderFailure("unavailable", `DMG detach or mount-root cleanup failed for ${JSON.stringify(this.path)}: ${failureMessage(detachFailure)}`, {
132
144
  cause: detachFailure,
@@ -134,6 +146,11 @@ export class NativeDmgArtifactReader {
134
146
  reason: failureMessage(detachFailure),
135
147
  resources: [
136
148
  ...this.#devices.map((device) => `DMG device ${device}`),
149
+ ...(this.#attachMayHaveMounted
150
+ ? [
151
+ `DMG attachment ownership unknown at mount root ${this.#mountRoot ?? this.path}`,
152
+ ]
153
+ : []),
137
154
  ...(this.#mountRoot === undefined
138
155
  ? []
139
156
  : [`DMG mount root ${this.#mountRoot}`]),
@@ -145,7 +162,7 @@ export class NativeDmgArtifactReader {
145
162
  async #detach(device) {
146
163
  try {
147
164
  await runChecked(this.host, ["detach", device], undefined, {
148
- timeoutMs: DETACH_TIMEOUT_MS,
165
+ timeoutMs: HDIUTIL_COMMAND_TIMEOUT_MS,
149
166
  });
150
167
  this.#provenance.push(command(["detach", device], ["mount"]));
151
168
  return undefined;
@@ -154,78 +171,154 @@ export class NativeDmgArtifactReader {
154
171
  return (await this.#isAttached(device)) ? cause : undefined;
155
172
  }
156
173
  }
157
- /**
158
- * Report whether hdiutil still lists a device; unknown state counts as
159
- * attached. Like detach, this cleanup query runs after the inventory
160
- * snapshot has captured provenance, so it is not recorded there.
161
- */
174
+ async #reconcileAttachState() {
175
+ if (!this.#attachMayHaveMounted)
176
+ return undefined;
177
+ try {
178
+ await this.#resolveAttachOwnership();
179
+ return undefined;
180
+ }
181
+ catch (cause) {
182
+ this.#ownershipUncertainty = failureMessage(cause);
183
+ return cause;
184
+ }
185
+ }
186
+ /** Treat unknown hdiutil state as attached during cleanup. */
162
187
  async #isAttached(device) {
163
188
  try {
164
- const info = await runChecked(this.host, ["info", "-plist"], undefined, {
165
- timeoutMs: DETACH_TIMEOUT_MS,
166
- });
167
- const parsed = infoOutputSchema.parse(parse(info.stdout));
168
- return parsed.images.some((image) => image["system-entities"].some((entity) => entity["dev-entry"] === device));
189
+ const parsed = await this.#readInfo();
190
+ const isListed = parsed.images.some((image) => image["system-entities"].some((entity) => entity["dev-entry"] === device));
191
+ if (isListed) {
192
+ this.#inventoryConfirmedDevices.add(device);
193
+ return true;
194
+ }
195
+ return !this.#inventoryConfirmedDevices.has(device);
169
196
  }
170
197
  catch {
171
198
  return true;
172
199
  }
173
200
  }
174
- async attach(signal) {
201
+ async #ensureAttached(signal) {
202
+ if (this.#closed)
203
+ throw new ArtifactReaderFailure("unavailable", "DMG reader is closed");
204
+ this.#initialization ??= this.#attach(signal);
205
+ await this.#initialization;
206
+ if (this.#closed)
207
+ throw new ArtifactReaderFailure("unavailable", "DMG reader is closed");
208
+ }
209
+ async #attach(signal) {
175
210
  await runChecked(this.host, ["verify", this.path], signal);
176
211
  this.#provenance.push(command(["verify", this.path], ["read"]));
177
- this.#mountRoot = await realpath(await mkdtemp(join(tmpdir(), "rea-dmg-")));
212
+ const baseline = await this.#readInfo();
213
+ this.#baselineDevices = new Set(baseline.images.flatMap((image) => image["system-entities"].map(({ "dev-entry": device }) => device)));
214
+ const mountRoot = await realpath(await mkdtemp(join(tmpdir(), "rea-dmg-")));
215
+ this.#mountRoot = mountRoot;
178
216
  try {
217
+ this.#attachMayHaveMounted = true;
179
218
  const attached = await runChecked(this.host, [
180
219
  "attach",
181
220
  "-readonly",
182
221
  "-nobrowse",
183
222
  "-plist",
184
223
  "-mountroot",
185
- this.#mountRoot,
224
+ mountRoot,
186
225
  this.path,
187
- ], signal);
188
- const parsed = attachOutputSchema.parse(parse(attached.stdout));
189
- const devices = [
190
- ...new Set(parsed["system-entities"].map((entity) => entity["dev-entry"])),
191
- ];
192
- // Detaching an observed whole disk also detaches its partitions. Do not
193
- // subsequently detach the now-unavailable child devices.
194
- this.#devices = devices.filter((device) => !devices.some((parent) => /^\/dev\/disk\d+$/u.test(parent) &&
195
- device.startsWith(`${parent}s`) &&
196
- /^\d+$/u.test(device.slice(parent.length + 1))));
197
- if (this.#devices.length === 0)
226
+ ], signal, { timeoutMs: HDIUTIL_COMMAND_TIMEOUT_MS });
227
+ this.#attachOutputReturned = true;
228
+ let parsed;
229
+ try {
230
+ parsed = parseNativeDmgAttachOutput(attached.stdout);
231
+ }
232
+ catch (cause) {
233
+ throw new ArtifactReaderFailure("format", "hdiutil returned a malformed attachment plist", { cause });
234
+ }
235
+ if (parsed["system-entities"].length === 0)
198
236
  throw new ArtifactReaderFailure("format", "hdiutil returned no attached devices");
199
- for (const entity of parsed["system-entities"])
200
- if (entity["mount-point"] !== undefined &&
201
- !entity["mount-point"].startsWith(`${this.#mountRoot}/`))
202
- throw new ArtifactReaderFailure("path", "hdiutil mounted outside the owned root");
237
+ this.#attachOutput = parsed;
238
+ const ownership = await this.#resolveAttachOwnership();
239
+ if (ownership !== "owned")
240
+ throw new ArtifactReaderFailure(ownership === "unknown" ? "unavailable" : "path", ownership === "unknown"
241
+ ? `DMG attachment ownership is uncertain: ${this.#ownershipUncertainty ?? "no unique mount under the owned root"}`
242
+ : "hdiutil did not mount a new image beneath the owned root");
203
243
  this.#provenance.push(command([
204
244
  "attach",
205
245
  "-readonly",
206
246
  "-nobrowse",
207
247
  "-plist",
208
248
  "-mountroot",
209
- this.#mountRoot,
249
+ mountRoot,
210
250
  this.path,
211
251
  ], ["read", "mount"]));
212
- this.#directory = new DirectoryArtifactReader(this.#mountRoot);
252
+ this.#directory = new DirectoryArtifactReader(mountRoot);
213
253
  }
214
254
  catch (cause) {
215
- let cleanupFailure;
216
- try {
217
- await this.close();
255
+ if (cause instanceof NativeDmgCommandFailure && cause.stdout !== "") {
256
+ try {
257
+ this.#attachOutput = parseNativeDmgAttachOutput(cause.stdout);
258
+ this.#attachOutputReturned = true;
259
+ }
260
+ catch {
261
+ // The original command failure remains primary; fresh info still recovers mounts.
262
+ }
218
263
  }
219
- catch (cleanupCause) {
220
- cleanupFailure = cleanupCause;
264
+ if (cause instanceof NativeDmgCommandFailure && cause.processNotStarted) {
265
+ this.#attachMayHaveMounted = false;
266
+ this.#ownershipUncertainty = undefined;
221
267
  }
222
- if (cleanupFailure !== undefined)
223
- throw ArtifactReaderFailure.withCleanup(cause, ArtifactReaderFailure.cleanupObservation(cleanupFailure, `DMG mount root ${this.#mountRoot ?? this.path}`));
224
268
  throw cause;
225
269
  }
226
270
  }
271
+ async #readInfo() {
272
+ const info = await runChecked(this.host, ["info", "-plist"], undefined, {
273
+ timeoutMs: HDIUTIL_COMMAND_TIMEOUT_MS,
274
+ });
275
+ return parseNativeDmgInfo(info.stdout);
276
+ }
277
+ async #resolveAttachOwnership() {
278
+ const mountRoot = this.#mountRoot;
279
+ if (mountRoot === undefined)
280
+ throw new Error("DMG mount root is unavailable for ownership discovery");
281
+ const ownership = resolveNativeDmgOwnership({
282
+ info: await this.#readInfo(),
283
+ ...(this.#attachOutput === undefined
284
+ ? {}
285
+ : { attachOutput: this.#attachOutput }),
286
+ attachOutputReturned: this.#attachOutputReturned,
287
+ mountRoot,
288
+ baselineDevices: this.#baselineDevices,
289
+ });
290
+ if (ownership.status === "owned") {
291
+ this.#devices = [...ownership.devices];
292
+ if (ownership.source === "info")
293
+ for (const device of ownership.devices)
294
+ this.#inventoryConfirmedDevices.add(device);
295
+ this.#attachMayHaveMounted = false;
296
+ this.#ownershipUncertainty = undefined;
297
+ return "owned";
298
+ }
299
+ if (ownership.status === "unknown") {
300
+ this.#ownershipUncertainty = ownership.reason;
301
+ return "unknown";
302
+ }
303
+ this.#attachMayHaveMounted = false;
304
+ this.#ownershipUncertainty = undefined;
305
+ this.#devices = [];
306
+ return "none";
307
+ }
227
308
  }
228
309
  const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
310
+ const processNotStarted = (cause) => {
311
+ if (!(cause instanceof Error))
312
+ return false;
313
+ const syscall = Reflect.get(cause, "syscall");
314
+ const code = Reflect.get(cause, "code");
315
+ const errno = Reflect.get(cause, "errno");
316
+ return (typeof syscall === "string" &&
317
+ syscall.startsWith("spawn ") &&
318
+ (typeof code === "string" ||
319
+ typeof code === "number" ||
320
+ typeof errno === "number"));
321
+ };
229
322
  const runChecked = async (host, arguments_, signal, options) => {
230
323
  let result;
231
324
  try {
@@ -235,10 +328,9 @@ const runChecked = async (host, arguments_, signal, options) => {
235
328
  if (cause instanceof ArtifactReaderFailure)
236
329
  throw cause;
237
330
  if (cause instanceof Error && cause.name === "AbortError")
238
- throw new ArtifactReaderFailure("cancelled", "DMG operation cancelled", {
239
- cause,
240
- });
241
- throw new ArtifactReaderFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, { cause });
331
+ throw new NativeDmgCommandFailure("cancelled", "DMG operation cancelled", execFileOutputFailure(cause)?.stdout ?? "", { cause });
332
+ const output = execFileOutputFailure(cause);
333
+ throw new NativeDmgCommandFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, output?.stdout ?? "", { cause, processNotStarted: processNotStarted(cause) });
242
334
  }
243
335
  if (result.exitCode !== 0) {
244
336
  const failure = {
@@ -253,9 +345,9 @@ const runChecked = async (host, arguments_, signal, options) => {
253
345
  const reason = commandFailureReason(failure, arguments_[0]);
254
346
  const details = describeCommandFailure(failure, arguments_);
255
347
  const unknownVerifyFailure = arguments_[0] === "verify" && reason === "unavailable";
256
- throw new ArtifactReaderFailure(reason, unknownVerifyFailure
348
+ throw new NativeDmgCommandFailure(reason, unknownVerifyFailure
257
349
  ? `hdiutil verify failed; captured diagnostics do not establish the failure cause: ${details}`
258
- : `hdiutil ${arguments_[0] ?? "operation"} failed: ${details}`, result.cause === undefined ? undefined : { cause: result.cause });
350
+ : `hdiutil ${arguments_[0] ?? "operation"} failed: ${details}`, result.stdout, { cause: result.cause ?? failure });
259
351
  }
260
352
  return { stdout: result.stdout, exitCode: 0 };
261
353
  };
@@ -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
+ };