rea-agents 6.4.0 → 6.7.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 (1420) hide show
  1. package/DISCLAIMER.md +136 -0
  2. package/README.md +76 -16
  3. package/THIRD_PARTY_NOTICES.md +135 -0
  4. package/bridge/android/ReaJadxBridge.java +281 -25
  5. package/bridge/cutter/rea_bridge.py +825 -0
  6. package/bridge/ghidra/ReaGhidraAnalysisOptions.java +38 -0
  7. package/bridge/ghidra/ReaGhidraBridge.java +1232 -142
  8. package/bridge/ghidra/ReaGhidraBundleActivator.java +14 -0
  9. package/bridge/ghidra/ReaGhidraMipsSoftFloat.java +176 -0
  10. package/bridge/ghidra/ReaGhidraPrepareRaw.java +49 -0
  11. package/bridge/hopper_bridge.py +111 -69
  12. package/bridge/mitmproxy/capture.py +189 -13
  13. package/bridge/native/rea_lldb_tracer.py +88 -10
  14. package/bridge/process/ProcessRunTokenReader.swift +76 -34
  15. package/bridge/pwndbg/core_context.py +15 -2
  16. package/bridge/pwntools/layout_impl.py +5 -0
  17. package/bridge/pwntools/recorded_crash_impl.py +31 -10
  18. package/dist/adb/AdbCommand.js +148 -0
  19. package/dist/adb/AdbConfiguration.js +41 -7
  20. package/dist/adb/AdbDeviceOutput.js +59 -37
  21. package/dist/adb/AdbDirectoryListing.js +80 -0
  22. package/dist/adb/AdbHostFileName.js +34 -0
  23. package/dist/adb/AdbInputSnapshot.js +126 -0
  24. package/dist/adb/AdbProvider.js +1106 -346
  25. package/dist/adb/AdbShellOutput.js +146 -77
  26. package/dist/android/AndroidTargetSnapshot.js +7 -7
  27. package/dist/android/JadxAnalysis.js +53 -33
  28. package/dist/android/JadxConfiguration.js +283 -145
  29. package/dist/android/JadxDoctor.js +123 -0
  30. package/dist/android/JadxFailure.js +154 -0
  31. package/dist/android/JadxInterruption.js +13 -0
  32. package/dist/android/JadxJavaProbe.js +246 -0
  33. package/dist/android/JadxMcpTransport.js +53 -18
  34. package/dist/android/JadxProtocol.js +43 -2
  35. package/dist/android/JadxProvider.js +183 -102
  36. package/dist/android/JadxRelease.js +17 -2
  37. package/dist/android/JadxSession.js +35 -14
  38. package/dist/android/JadxWorkspaceRoot.js +157 -0
  39. package/dist/apktool/ApktoolCommandCleanup.js +134 -0
  40. package/dist/apktool/ApktoolCommandOutput.js +22 -0
  41. package/dist/apktool/ApktoolConfiguration.js +306 -45
  42. package/dist/apktool/ApktoolDecodeOutput.js +131 -42
  43. package/dist/apktool/ApktoolDecodedInventory.js +52 -0
  44. package/dist/apktool/ApktoolProvider.js +296 -340
  45. package/dist/apktool/ApktoolStringTables.js +178 -0
  46. package/dist/apktool/ApktoolWorkspace.js +162 -0
  47. package/dist/application/AnalysisContextQueries.js +5 -8
  48. package/dist/application/AnalysisDocument.js +19 -4
  49. package/dist/application/AnalysisProvider.js +36 -18
  50. package/dist/application/AppBundleExecutable.js +16 -9
  51. package/dist/application/BinaryTargetResolver.js +204 -40
  52. package/dist/application/BrowserEvidence.js +1 -1
  53. package/dist/application/BrowserObservationService.js +54 -9
  54. package/dist/application/BrowserScenarioCaptureService.js +26 -7
  55. package/dist/application/CallPathTracing.js +52 -13
  56. package/dist/application/CapabilityInventory.js +182 -36
  57. package/dist/application/ClaudeDesktopConfigLocation.js +152 -0
  58. package/dist/application/ClientConfigurationCleanup.js +73 -0
  59. package/dist/application/ClientConfigurationDocument.js +270 -151
  60. package/dist/application/ClientConfigurationFiles.js +51 -14
  61. package/dist/application/ClientConfigurationPublication.js +167 -0
  62. package/dist/application/ClientRegistrationEnvironment.js +40 -4
  63. package/dist/application/ClientRegistrationIdentity.js +112 -32
  64. package/dist/application/ClientRegistrationStatus.js +280 -84
  65. package/dist/application/DirectAnalysis.js +98 -30
  66. package/dist/application/DirectAnalysisCleanup.js +5 -1
  67. package/dist/application/DirectAnalysisStatus.js +13 -1
  68. package/dist/application/Doctor.js +192 -37
  69. package/dist/application/DoctorDiagnostics.js +59 -16
  70. package/dist/application/DoctorProviderIds.js +8 -0
  71. package/dist/application/DoctorScope.js +11 -2
  72. package/dist/application/DshCordisPatch.js +355 -0
  73. package/dist/application/DshCordisYaml.js +155 -0
  74. package/dist/application/EnhancedLiteralTracing.js +30 -16
  75. package/dist/application/EnhancedToolTypes.js +0 -1
  76. package/dist/application/EnhancedTools.js +154 -56
  77. package/dist/application/EvidenceBundleCommands.js +30 -7
  78. package/dist/application/EvidenceBundleFiles.js +29 -7
  79. package/dist/application/FunctionAnalysisEvidence.js +3 -0
  80. package/dist/application/GeminiClientSettings.js +25 -13
  81. package/dist/application/HermesClientHome.js +20 -0
  82. package/dist/application/HermesConfigurationYaml.js +312 -0
  83. package/dist/application/HopperDownload.js +11 -3
  84. package/dist/application/HopperReleaseFeed.js +71 -0
  85. package/dist/application/InventoryProjectionEvidence.js +0 -1
  86. package/dist/application/InvestigationProviders.js +14 -3
  87. package/dist/application/JsonFiles.js +110 -20
  88. package/dist/application/JsonInputFile.js +220 -62
  89. package/dist/application/LinuxHopper.js +218 -115
  90. package/dist/application/LinuxHopperPublisher.js +656 -0
  91. package/dist/application/MacHopper.js +203 -83
  92. package/dist/application/MacHopperPaths.js +40 -0
  93. package/dist/application/{MipsElfAbiFlags.js → MipsElfMetadata.js} +71 -10
  94. package/dist/application/MipsElfSharedLoad.js +164 -0
  95. package/dist/application/MipsGnuAttributes.js +90 -0
  96. package/dist/application/MsixPackageStorage.js +140 -0
  97. package/dist/application/ProgressReporter.js +1 -1
  98. package/dist/application/ProviderOperationExecution.js +15 -14
  99. package/dist/application/ReconstructionCoverageService.js +0 -1
  100. package/dist/application/ReconstructionObligationCandidates.js +20 -4
  101. package/dist/application/ReconstructionObligationLedgerDiagnostics.js +2 -2
  102. package/dist/application/ReconstructionObligationLedgerEvaluation.js +19 -33
  103. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -72
  104. package/dist/application/ReconstructionObligationLedgerService.js +6 -2
  105. package/dist/application/ReconstructionObligationOriginalCases.js +10 -1
  106. package/dist/application/ReferenceSourceImport.js +24 -8
  107. package/dist/application/ReferenceSourceImportEntries.js +180 -37
  108. package/dist/application/ReferenceSourceImportPolicy.js +5 -3
  109. package/dist/application/ReferenceSourceImportTypes.js +0 -1
  110. package/dist/application/ReferenceSourceVcsAdapter.js +36 -17
  111. package/dist/application/RegularFileRead.js +117 -70
  112. package/dist/application/Setup.js +59 -21
  113. package/dist/application/SetupClientConfiguration.js +301 -66
  114. package/dist/application/SetupClients.js +25 -10
  115. package/dist/application/SetupHost.js +149 -51
  116. package/dist/application/SetupInstallFailure.js +58 -3
  117. package/dist/application/SetupPlan.js +94 -55
  118. package/dist/application/SetupRecoveryBackup.js +93 -0
  119. package/dist/application/SetupRegistrationEnvironment.js +14 -1
  120. package/dist/application/SetupSkill.js +303 -76
  121. package/dist/application/SourceLimitations.js +35 -0
  122. package/dist/application/SupportedClients.js +166 -32
  123. package/dist/application/TypeScriptEmittedSourceCandidates.js +26 -0
  124. package/dist/application/Uninstall.js +356 -110
  125. package/dist/application/UninstallFailure.js +14 -0
  126. package/dist/application/Update.js +54 -25
  127. package/dist/application/UpdateCommandProgress.js +66 -0
  128. package/dist/application/UpdateFailure.js +17 -0
  129. package/dist/application/UpdateMaintenance.js +18 -31
  130. package/dist/application/UpdateRuntime.js +198 -54
  131. package/dist/application/WebModuleTraceService.js +42 -22
  132. package/dist/application/WebNetworkCaptureService.js +24 -12
  133. package/dist/application/WebRuntimeService.js +41 -8
  134. package/dist/application/WebScriptExportService.js +6 -4
  135. package/dist/application/WebSourceLocationService.js +23 -8
  136. package/dist/application/WindowsCapabilities.js +18 -15
  137. package/dist/application/WorkflowEvidence.js +31 -1
  138. package/dist/application/analysisView/AnalysisViewService.js +46 -11
  139. package/dist/application/android/AndroidAnalysisService.js +5 -4
  140. package/dist/application/android/AndroidPackageInspection.js +25 -0
  141. package/dist/application/android/AndroidSearchEvidenceSummary.js +98 -0
  142. package/dist/application/artifacts/ArtifactComparisonEvidence.js +32 -0
  143. package/dist/application/binary/AnalysisProviderEvaluation.js +14 -11
  144. package/dist/application/binary/AnalysisProviderRegistry.js +365 -60
  145. package/dist/application/binary/AnalysisSnapshotCache.js +41 -20
  146. package/dist/application/binary/AnalysisSnapshotFiles.js +75 -9
  147. package/dist/application/binary/BinarySession.js +308 -117
  148. package/dist/application/binary/BinarySessionExecution.js +5 -4
  149. package/dist/application/binary/BinarySessionOpen.js +13 -6
  150. package/dist/application/binary/BinarySessionRecords.js +36 -7
  151. package/dist/application/binary/BinarySessionStatus.js +96 -27
  152. package/dist/application/binary/BinaryTargetSummary.js +9 -0
  153. package/dist/application/binary/CompositeProvider.js +116 -28
  154. package/dist/application/binary/LazyAnalysisProvider.js +6 -66
  155. package/dist/application/binary/SessionProviderRouter.js +16 -4
  156. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +14 -5
  157. package/dist/application/binaryDiagnostics/PeResourcesService.js +25 -5
  158. package/dist/application/binaryDiagnostics/RecordedCrashService.js +17 -7
  159. package/dist/application/captures/PacketCaptureService.js +84 -0
  160. package/dist/application/closeOwnedWebResources.js +37 -0
  161. package/dist/application/electron/ElectronFusePort.js +1 -0
  162. package/dist/application/electron/ElectronFuseService.js +45 -0
  163. package/dist/application/evm/EvmInterfaceEvidence.js +11 -0
  164. package/dist/application/evm/EvmInterfaceService.js +5 -15
  165. package/dist/application/firmware/FirmwareAnalysisService.js +4 -3
  166. package/dist/application/flutter/DartAotInspection.js +26 -0
  167. package/dist/application/flutter/FlutterBuildAnalysisPort.js +1 -0
  168. package/dist/application/flutter/FlutterBuildAnalysisService.js +13 -0
  169. package/dist/application/frida/FridaInstrumentationPort.js +8 -0
  170. package/dist/application/frida/FridaInstrumentationService.js +310 -0
  171. package/dist/application/frida/fridaInputErrors.js +17 -0
  172. package/dist/application/go/GoBinaryPort.js +1 -0
  173. package/dist/application/go/GoBinaryService.js +79 -0
  174. package/dist/application/harmony/HarmonyApplicationService.js +17 -0
  175. package/dist/application/investigation/EvidenceLedger.js +43 -18
  176. package/dist/application/investigation/InvestigationRecords.js +12 -21
  177. package/dist/application/investigation/UnknownEvidence.js +22 -18
  178. package/dist/application/javascript/ElectronActiveObservationService.js +55 -25
  179. package/dist/application/javascript/ElectronBoundaryAnalysis.js +17 -3
  180. package/dist/application/javascript/ElectronBoundaryGraph.js +2 -0
  181. package/dist/application/javascript/ElectronBoundaryGraphCallPaths.js +144 -0
  182. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +26 -7
  183. package/dist/application/javascript/ElectronBoundaryGraphNative.js +1 -1
  184. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +61 -11
  185. package/dist/application/javascript/ElectronEvidence.js +1 -2
  186. package/dist/application/javascript/ElectronObservationService.js +41 -8
  187. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -0
  188. package/dist/application/javascript/JavaScriptApplicationService.js +29 -14
  189. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +0 -1
  190. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +119 -49
  191. package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +30 -1
  192. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +51 -21
  193. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +31 -7
  194. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +28 -6
  195. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +25 -14
  196. package/dist/application/javascript/JavaScriptArtifactGraphEvidence.js +3 -3
  197. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +186 -50
  198. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +173 -14
  199. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +959 -188
  200. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +57 -32
  201. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +2 -0
  202. package/dist/application/javascript/JavaScriptModuleRelationships.js +34 -12
  203. package/dist/application/javascript/JavaScriptRecoveryService.js +29 -9
  204. package/dist/application/javascript/JavaScriptRuntimeObservationEvidence.js +1 -2
  205. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +33 -9
  206. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +0 -1
  207. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  208. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +138 -43
  209. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +13 -4
  210. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +23 -3
  211. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +18 -5
  212. package/dist/application/javascript/JavaScriptSemanticGraphElectronProjection.js +67 -0
  213. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +4 -6
  214. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +2 -3
  215. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  216. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +5 -8
  217. package/dist/application/javascript/JavaScriptSemanticTraceService.js +0 -1
  218. package/dist/application/managed/ManagedApplicationGraphService.js +0 -1
  219. package/dist/application/managed/ManagedMemberComparisonService.js +72 -54
  220. package/dist/application/managed/ManagedNativeVerificationService.js +0 -1
  221. package/dist/application/managed/ManagedReconstructionService.js +0 -1
  222. package/dist/application/native/NativeCallRoutes.js +78 -41
  223. package/dist/application/native/NativeDispatchMetadataInspection.js +6 -2
  224. package/dist/application/native/NativeUiActionTrace.js +43 -22
  225. package/dist/application/native/NativeValueTrace.js +65 -23
  226. package/dist/application/pcap/PcapAnalysisPort.js +1 -0
  227. package/dist/application/pcap/PcapAnalysisService.js +24 -0
  228. package/dist/application/process/ProcessCli.js +33 -13
  229. package/dist/application/reverse/ReverseEngineeringCommandPort.js +1 -0
  230. package/dist/application/reverse/ReverseEngineeringService.js +688 -0
  231. package/dist/application/rust/RustBinaryPort.js +1 -0
  232. package/dist/application/rust/RustBinaryService.js +82 -0
  233. package/dist/application/signals/SignalRecordingService.js +84 -0
  234. package/dist/application/sqlite/SqliteDatabaseCapability.js +30 -0
  235. package/dist/application/sqlite/SqliteDatabasePort.js +1 -0
  236. package/dist/application/sqlite/SqliteDatabaseService.js +76 -0
  237. package/dist/application/wasm/WasmArtifactPort.js +1 -0
  238. package/dist/application/wasm/WasmArtifactService.js +76 -0
  239. package/dist/application/wasm/WasmInterfaceComparisonService.js +188 -0
  240. package/dist/artifacts/AnalysisCleanupLease.js +119 -0
  241. package/dist/artifacts/ArtifactFileOperation.js +150 -0
  242. package/dist/artifacts/ArtifactHash.js +15 -3
  243. package/dist/artifacts/ArtifactPaths.js +4 -7
  244. package/dist/artifacts/ArtifactProvider.js +24 -9
  245. package/dist/artifacts/ArtifactReader.js +63 -5
  246. package/dist/artifacts/ArtifactResourceScope.js +92 -9
  247. package/dist/artifacts/AsarArtifactReader.js +186 -120
  248. package/dist/artifacts/AsarEntryStream.js +49 -17
  249. package/dist/artifacts/AsarListing.js +78 -0
  250. package/dist/artifacts/DirectoryArtifactReader.js +119 -28
  251. package/dist/artifacts/MachOSliceArtifactReader.js +153 -23
  252. package/dist/artifacts/NativeDmgArtifactReader.js +264 -62
  253. package/dist/artifacts/OrderedReads.js +57 -0
  254. package/dist/artifacts/SafeOutputTree.js +24 -7
  255. package/dist/artifacts/SafeOutputTreeCreationFailure.js +1 -0
  256. package/dist/artifacts/SafeOutputTreeReadback.js +10 -16
  257. package/dist/artifacts/ZipArtifactReader.js +150 -25
  258. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +79 -68
  259. package/dist/artifacts/apple/DylibFileAccess.js +106 -0
  260. package/dist/artifacts/apple/DylibResolutionReader.js +72 -157
  261. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +108 -29
  262. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +81 -28
  263. package/dist/artifacts/apple/KeyedArchiveReader.js +23 -13
  264. package/dist/artifacts/apple/MachoLoadCommandReader.js +77 -61
  265. package/dist/artifacts/apple/NibArchive.js +11 -4
  266. package/dist/artifacts/apple/PlistNumberLiterals.js +106 -118
  267. package/dist/artifacts/extraction/ArtifactExtraction.js +21 -19
  268. package/dist/artifacts/hostExecutableMarking.js +16 -0
  269. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +139 -41
  270. package/dist/artifacts/inventory/classify.js +36 -17
  271. package/dist/artifacts/inventory/hashStableRootArtifact.js +14 -7
  272. package/dist/artifacts/inventory/reader.js +36 -21
  273. package/dist/artifacts/inventory/scanCanonical.js +27 -21
  274. package/dist/artifacts/inventory/scanReader.js +36 -10
  275. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +166 -8
  276. package/dist/artifacts/readArtifactFileChunks.js +9 -0
  277. package/dist/artifacts/readStableArtifact.js +13 -11
  278. package/dist/browser/BrowserProcessStartup.js +20 -9
  279. package/dist/browser/BrowserScenarioPartialObservation.js +74 -92
  280. package/dist/browser/BrowserScenarioSecrets.js +176 -46
  281. package/dist/browser/CdpBrowserProvider.js +124 -102
  282. package/dist/browser/CdpCaptureDocuments.js +232 -102
  283. package/dist/browser/CdpCaptureDomSvg.js +80 -76
  284. package/dist/browser/CdpCaptureEventBodyShapes.js +9 -5
  285. package/dist/browser/CdpCaptureEventHandlers.js +23 -12
  286. package/dist/browser/CdpCaptureEvents.js +49 -10
  287. package/dist/browser/CdpCaptureStorage.js +22 -5
  288. package/dist/browser/CdpCaptureStorageFingerprints.js +54 -11
  289. package/dist/browser/CdpCaptureValues.js +12 -1
  290. package/dist/browser/CdpConnection.js +135 -30
  291. package/dist/browser/CdpElectronInspection.js +74 -64
  292. package/dist/browser/CdpElectronProvider.js +63 -6
  293. package/dist/browser/CdpElectronScriptEvents.js +4 -1
  294. package/dist/browser/CdpElectronScripts.js +4 -6
  295. package/dist/browser/CdpElectronWorkers.js +20 -4
  296. package/dist/browser/CdpEndpoint.js +143 -17
  297. package/dist/browser/CdpObservationSession.js +24 -8
  298. package/dist/browser/CdpPageCapture.js +68 -17
  299. package/dist/browser/CdpPageCaptureScripts.js +18 -13
  300. package/dist/browser/CdpPageCaptureWorkers.js +46 -11
  301. package/dist/browser/CdpSafeMetadata.js +32 -24
  302. package/dist/browser/CdpScreenshot.js +5 -14
  303. package/dist/browser/CdpSnapshotNodes.js +103 -0
  304. package/dist/browser/CdpSnapshotStrings.js +15 -0
  305. package/dist/browser/CdpTargetSession.js +76 -7
  306. package/dist/browser/CdpTargetSessionOwner.js +198 -0
  307. package/dist/browser/CdpWebMcpDiscovery.js +23 -6
  308. package/dist/browser/ElectronCaptureCleanup.js +82 -0
  309. package/dist/browser/ElectronProcessCleanup.js +91 -0
  310. package/dist/browser/PlaywrightBrowserScenarioProvider.js +75 -20
  311. package/dist/browser/PlaywrightElectronActiveActions.js +57 -9
  312. package/dist/browser/PlaywrightElectronActiveFuses.js +86 -0
  313. package/dist/browser/PlaywrightElectronActiveProjection.js +21 -4
  314. package/dist/browser/PlaywrightElectronActiveProvider.js +237 -175
  315. package/dist/browser/PlaywrightExecutionBoundary.js +6 -4
  316. package/dist/browser/PlaywrightScenarioBrowser.js +240 -91
  317. package/dist/browser/PlaywrightScenarioEvents.js +287 -38
  318. package/dist/browser/PlaywrightScenarioServiceWorkers.js +336 -0
  319. package/dist/browser/PlaywrightScenarioSession.js +151 -46
  320. package/dist/browser/PlaywrightScenarioStorage.js +15 -7
  321. package/dist/browser/StructuredFieldToken.js +53 -0
  322. package/dist/browser/WebArtifactCleanup.js +53 -0
  323. package/dist/browser/WebSourceMapFetcher.js +181 -89
  324. package/dist/browser/assets/LocalWebScriptArtifacts.js +24 -3
  325. package/dist/browser/assets/PublishWebScripts.js +13 -2
  326. package/dist/browser/assets/ScenarioScriptCapture.js +2 -1
  327. package/dist/browser/assets/WebArtifactReads.js +15 -3
  328. package/dist/browser/assets/WebSourceLocationArtifacts.js +47 -3
  329. package/dist/browser/execution/CdpRuntimeSession.js +36 -7
  330. package/dist/browser/execution/CdpWebRuntimeProvider.js +22 -4
  331. package/dist/browser/history/CaptureFailures.js +29 -10
  332. package/dist/browser/history/CaptureFormatError.js +2 -2
  333. package/dist/browser/history/{HarJson.js → CaptureJson.js} +14 -4
  334. package/dist/browser/history/CaptureRedaction.js +16 -3
  335. package/dist/browser/history/CaptureRelease.js +20 -2
  336. package/dist/browser/history/HarCapture.js +54 -30
  337. package/dist/browser/history/HarSchema.js +36 -36
  338. package/dist/browser/history/HistoricalCaptureDecoder.js +93 -25
  339. package/dist/browser/history/NodeCaptureAdapter.js +48 -0
  340. package/dist/browser/history/{HarCaptureProcess.js → NodeCaptureProcess.js} +18 -9
  341. package/dist/browser/history/QlogCapture.js +385 -0
  342. package/dist/browser/history/SazCapture.js +130 -0
  343. package/dist/browser/history/SazHttp.js +61 -0
  344. package/dist/browser/history/SazMetadata.js +55 -0
  345. package/dist/browser/history/SazProjection.js +90 -0
  346. package/dist/browser/modules/NativeModuleResolver.js +248 -131
  347. package/dist/browser/modules/WebModuleArtifacts.js +49 -3
  348. package/dist/browser/network/PlaywrightNetworkContent.js +67 -9
  349. package/dist/browser/network/PlaywrightScenarioNetwork.js +249 -26
  350. package/dist/captures/TsharkCaptureProvider.js +377 -0
  351. package/dist/captures/parseFieldDiscovery.js +66 -0
  352. package/dist/captures/parsePacketOutput.js +21 -0
  353. package/dist/catalogIdentity.js +58 -42
  354. package/dist/cli/adbCommands.js +20 -21
  355. package/dist/cli/analysisViewCommands.js +1 -1
  356. package/dist/cli/androidCommands.js +13 -16
  357. package/dist/cli/apktoolCommands.js +14 -25
  358. package/dist/cli/applicationCommands.js +44 -17
  359. package/dist/cli/artifactCommands.js +1 -1
  360. package/dist/cli/binaryDiagnosticsCommands.js +17 -13
  361. package/dist/cli/browserAdvancedCommands.js +46 -26
  362. package/dist/cli/browserCommands.js +59 -33
  363. package/dist/cli/captureCommands.js +72 -0
  364. package/dist/cli/cliResultOutput.js +274 -0
  365. package/dist/cli/coreBinaryCommands.js +77 -30
  366. package/dist/cli/coreNativeCommands.js +53 -31
  367. package/dist/cli/cutterCommands.js +88 -0
  368. package/dist/cli/electronCommands.js +76 -13
  369. package/dist/cli/evmCommands.js +9 -19
  370. package/dist/cli/finishAnalysisCommand.js +52 -0
  371. package/dist/cli/firmwareCommands.js +20 -50
  372. package/dist/cli/flutterCommands.js +53 -0
  373. package/dist/cli/fridaCommands.js +219 -0
  374. package/dist/cli/goCommands.js +20 -0
  375. package/dist/cli/interactiveSetup.js +11 -1
  376. package/dist/cli/javascriptApplicationAnalysis.js +1 -1
  377. package/dist/cli/javascriptRecoveryCommands.js +18 -23
  378. package/dist/cli/jebCommands.js +2 -14
  379. package/dist/cli/jsonOutput.js +2 -2
  380. package/dist/cli/managedCommands.js +31 -3
  381. package/dist/cli/options.js +26 -2
  382. package/dist/cli/pcapCommands.js +29 -0
  383. package/dist/cli/processCommands.js +1 -1
  384. package/dist/cli/reverseEngineeringCommands.js +268 -0
  385. package/dist/cli/rustCommands.js +20 -0
  386. package/dist/cli/setupCommands.js +41 -12
  387. package/dist/cli/signalCommands.js +72 -0
  388. package/dist/cli/sqliteCommands.js +52 -0
  389. package/dist/cli/utilityCommands.js +116 -74
  390. package/dist/cli/wasmCommands.js +50 -0
  391. package/dist/cli/webModuleCommands.js +27 -38
  392. package/dist/cli/webNetworkCaptureCommands.js +10 -9
  393. package/dist/cli/webRuntimeCommands.js +15 -6
  394. package/dist/cli/webSourceLocationCommands.js +14 -33
  395. package/dist/cli-runtime/AnalysisCleanupLease-CWfTGYKd.js +103 -0
  396. package/dist/cli-runtime/AnalysisProvider-BGrYaMVo.js +38 -0
  397. package/dist/cli-runtime/AnalysisSnapshotCache-BjRlXeUS.js +711 -0
  398. package/dist/cli-runtime/ArtifactFileOperation-Dg4BcoEM.js +122 -0
  399. package/dist/cli-runtime/ArtifactReader-DMwm42bk.js +78 -0
  400. package/dist/cli-runtime/ArtifactResourceScope-CokZGcII.js +175 -0
  401. package/dist/cli-runtime/AsarHeader-BxwU17DJ.js +31 -0
  402. package/dist/cli-runtime/BinarySessionStatus-DRhjr7Vb.js +212 -0
  403. package/dist/cli-runtime/BinaryTargetResolver-tuCTjBlQ.js +1238 -0
  404. package/dist/cli-runtime/BoundedFileBytes-DRtiQNAQ.js +43 -0
  405. package/dist/cli-runtime/CdpTargetSession-CQ08KHbh.js +925 -0
  406. package/dist/cli-runtime/ClientConfigPath-Dn-V_GUf.js +255 -0
  407. package/dist/cli-runtime/ClientConfigurationDocument-C9T8MNGc.js +2021 -0
  408. package/dist/cli-runtime/ClientRegistrationStatus-PnD29RTX.js +585 -0
  409. package/dist/cli-runtime/CurrentEntrypointPath-m7QCIVN0.js +14 -0
  410. package/dist/cli-runtime/DirectAnalysis-C5NyUryV.js +581 -0
  411. package/dist/cli-runtime/DirectoryArtifactReader-CokAJ8vo.js +448 -0
  412. package/dist/cli-runtime/Doctor-DrkWsav4.js +668 -0
  413. package/dist/cli-runtime/ElectronFileScope-AP7VoVr7.js +1109 -0
  414. package/dist/cli-runtime/ElectronFuseFailures-DsjXR7Xp.js +609 -0
  415. package/dist/cli-runtime/ExecFileOutput-D6KLYTve.js +119 -0
  416. package/dist/cli-runtime/InterfaceBuilderDecodeBudget-CW1IO3dG.js +298 -0
  417. package/dist/cli-runtime/InventoryProjectionEvidence-DTH5QAqL.js +49 -0
  418. package/dist/cli-runtime/InvestigationProviders-CFh4a64d.js +118 -0
  419. package/dist/cli-runtime/JavaScriptApplicationEvidenceGraph-gOmPB2L6.js +160 -0
  420. package/dist/cli-runtime/JavaScriptApplicationWorkflowEvidence-WZgtK_Ok.js +75 -0
  421. package/dist/cli-runtime/JavaScriptWorkerMemoryLimit-B1bwMM1a.js +86 -0
  422. package/dist/cli-runtime/JebMcpEndpoint-BEalGZh9.js +710 -0
  423. package/dist/cli-runtime/JsonFiles-uvd6ZyQi.js +600 -0
  424. package/dist/cli-runtime/KunaInstallation-P0j3x851.js +1781 -0
  425. package/dist/cli-runtime/MacCodeSignature-MgYbRK_H.js +24 -0
  426. package/dist/cli-runtime/MacHopperPaths-bGzqjF1Z.js +34 -0
  427. package/dist/cli-runtime/MachoLoadCommandReader-CZm6N5vF.js +330 -0
  428. package/dist/cli-runtime/ManagedSnapshot-CPE9C3OD.js +4481 -0
  429. package/dist/cli-runtime/OwnedCommandCleanup-BN_V6Erc.js +187 -0
  430. package/dist/cli-runtime/OwnedRegularFile-D1f5nUCx.js +256 -0
  431. package/dist/cli-runtime/OwnedStagedOutput-D31dOozz.js +126 -0
  432. package/dist/cli-runtime/PrivateRuntimeRoot-Cd23u6jd.js +296 -0
  433. package/dist/cli-runtime/ProcessOwnership-CtrNr6ee.js +545 -0
  434. package/dist/cli-runtime/ProcessOwnershipObservation-C006iCtZ.js +920 -0
  435. package/dist/cli-runtime/ProviderDeadline-rSuH4Pm8.js +148 -0
  436. package/dist/cli-runtime/ProviderOperationExecution-CmU-XrQr.js +38 -0
  437. package/dist/cli-runtime/ProviderProcess-D87A7ctp.js +770 -0
  438. package/dist/cli-runtime/RegularFileRead-mbgGYtxe.js +125 -0
  439. package/dist/cli-runtime/SafeOutputTree-i904hd_2.js +525 -0
  440. package/dist/cli-runtime/SetupHost-CMPmPraB.js +1268 -0
  441. package/dist/cli-runtime/SharedStartupAttempt-BxKyf3Uv.js +1424 -0
  442. package/dist/cli-runtime/StableFileHash-Ame_h3lY.js +61 -0
  443. package/dist/cli-runtime/SupportedClients-DMafjitv.js +1066 -0
  444. package/dist/cli-runtime/UninstallFailure-1blyKXHE.js +22 -0
  445. package/dist/cli-runtime/Update-DAsASWlE.js +143 -0
  446. package/dist/cli-runtime/UpdateFailure-BcFNxEZZ.js +24 -0
  447. package/dist/cli-runtime/WindowsBatchCommand-Cx9kaVNf.js +97 -0
  448. package/dist/cli-runtime/WindowsNativeLoader-BqyZO0ZD.js +142 -0
  449. package/dist/cli-runtime/ZipArtifactReader-Jed69LEL.js +252 -0
  450. package/dist/cli-runtime/analysisErrorCleanup-COdAmDsb.js +33 -0
  451. package/dist/cli-runtime/appleArchiveFormat-Bb3G5CCI.js +269 -0
  452. package/dist/cli-runtime/application__DirectAnalysisStatus-F74bu9oy.js +150 -0
  453. package/dist/cli-runtime/application__EnhancedTools-Bg51b0Yp.js +1820 -0
  454. package/dist/cli-runtime/application__FunctionAnalysisEvidence-DBWIaYCh.js +41 -0
  455. package/dist/cli-runtime/application__ReconstructionCoverageService-AEPNpZqJ.js +32 -0
  456. package/dist/cli-runtime/application__ReconstructionObligationLedgerService-Cl9cPEZf.js +828 -0
  457. package/dist/cli-runtime/application__Setup-DwQzEewK.js +526 -0
  458. package/dist/cli-runtime/application__Uninstall-BOf9oyvQ.js +468 -0
  459. package/dist/cli-runtime/application__UpdateRuntime-CzWkRJHa.js +435 -0
  460. package/dist/cli-runtime/application__android__AndroidApplicationService-shW_aKlj.js +31 -0
  461. package/dist/cli-runtime/application__apple__AppleApplicationService-DIv6d3wB.js +31 -0
  462. package/dist/cli-runtime/application__harmony__HarmonyApplicationService-OIUFVQFV.js +31 -0
  463. package/dist/cli-runtime/application__javascript__ElectronActiveObservationService-wvCh72hK.js +118 -0
  464. package/dist/cli-runtime/application__javascript__ElectronObservationService-SydXPCwM.js +88 -0
  465. package/dist/cli-runtime/application__javascript__JavaScriptApplicationService-o0uEsjEc.js +12254 -0
  466. package/dist/cli-runtime/application__javascript__JavaScriptApplicationWorkflowService-BAheG_71.js +2336 -0
  467. package/dist/cli-runtime/application__javascript__JavaScriptRuntimeReconciliationService-Cnn4GP8q.js +88 -0
  468. package/dist/cli-runtime/application__javascript__JavaScriptSemanticTraceService-CmvLfV1A.js +299 -0
  469. package/dist/cli-runtime/artifacts__ArtifactProvider-wx2K0F2I.js +2205 -0
  470. package/dist/cli-runtime/binary-CWVNJhAC.js +19608 -0
  471. package/dist/cli-runtime/catalogIdentity-DAEEsOdX.js +1112 -0
  472. package/dist/cli-runtime/cli.js +44469 -0
  473. package/dist/cli-runtime/cliOutput-CgSuw782.js +163 -0
  474. package/dist/cli-runtime/cliOutput.js +5 -0
  475. package/dist/cli-runtime/cliResultOutput-10sd6xGx.js +1453 -0
  476. package/dist/cli-runtime/cliResultOutput.js +6 -0
  477. package/dist/cli-runtime/composition__browserScenario-BtPb1c1y.js +3414 -0
  478. package/dist/cli-runtime/composition__electronObservation-Bk8R6DJo.js +614 -0
  479. package/dist/cli-runtime/composition__electronScenario-BVF0qStH.js +916 -0
  480. package/dist/cli-runtime/cutterToolContracts-BQtG_Nzo.js +5267 -0
  481. package/dist/cli-runtime/doctorRuntime-B__SIpm-.js +478 -0
  482. package/dist/cli-runtime/dotnet__ManagedStaticProvider-DO5Yzcp4.js +5 -0
  483. package/dist/cli-runtime/errorSchemas-Ixz_q7qt.js +655 -0
  484. package/dist/cli-runtime/homeDirectory-DC_DeJIg.js +18 -0
  485. package/dist/cli-runtime/javascriptApplicationAnalysis-Dk6yBV8g.js +2088 -0
  486. package/dist/cli-runtime/javascriptExportReturnShapeProjection-CObOIiQ6.js +78 -0
  487. package/dist/cli-runtime/javascriptExportShapeComparisonSchemas-DpwuBenh.js +1244 -0
  488. package/dist/cli-runtime/javascriptRuntimeReconciliation-C6ZgWMys.js +1509 -0
  489. package/dist/cli-runtime/javascriptRuntimeReconciliationSchemas-D6tZKUQs.js +247 -0
  490. package/dist/cli-runtime/javascriptSemanticTraceSchemas-C7m0b6_w.js +126 -0
  491. package/dist/cli-runtime/lipo-DPQ6qurH.js +394 -0
  492. package/dist/cli-runtime/logger-BuDJ9xxO.js +48 -0
  493. package/dist/cli-runtime/machoContainer-Cy98bkFm.js +352 -0
  494. package/dist/cli-runtime/managedApplicationGraph-BazVqpJv.js +1136 -0
  495. package/dist/cli-runtime/managedToolContracts-BuFkMBH5.js +99 -0
  496. package/dist/cli-runtime/mcpDoctor.js +361 -0
  497. package/dist/cli-runtime/mcpStartupPolicy-imCbM3qo.js +28 -0
  498. package/dist/cli-runtime/native__NativeMacOSProvider-DTcRhuGA.js +5502 -0
  499. package/dist/cli-runtime/officialToolContracts-CzzVLx8I.js +1522 -0
  500. package/dist/cli-runtime/peMachine-B9ggfSJJ.js +95 -0
  501. package/dist/cli-runtime/propertyListKeys-D5dSASEy.js +355 -0
  502. package/dist/cli-runtime/providerCleanupError-BhsJyAhk.js +25 -0
  503. package/dist/cli-runtime/providerIdentities-Ao1XTvwx.js +31 -0
  504. package/dist/cli-runtime/providerStartupTimeout-B2tF2LtZ.js +17 -0
  505. package/dist/cli-runtime/readArtifactFileChunks-BbTL_PtB.js +129 -0
  506. package/dist/cli-runtime/reconstructionObligationLedgerSchemas-Bi6sect1.js +22156 -0
  507. package/dist/cli-runtime/rolldown-runtime-DXoylpqc.js +121 -0
  508. package/dist/cli-runtime/runtimeVersion-CMGd0bDu.js +23 -0
  509. package/dist/cli-runtime/safeJson-DKKACtdy.js +25 -0
  510. package/dist/cli-runtime/scanCanonical-CcDFUr-w.js +2594 -0
  511. package/dist/cli-runtime/snapshotEnvironment-Yvx5qwsl.js +196 -0
  512. package/dist/cli-runtime/toolContracts-CJzEyZ38.js +3795 -0
  513. package/dist/cli-runtime/toolOutputSchemaGroups-BqdSzySu.js +12249 -0
  514. package/dist/cli-runtime/workflowInputError-BP8z9Wxl.js +26 -0
  515. package/dist/cli.js +48 -5
  516. package/dist/cliBrowserScenarioCommands.js +41 -7
  517. package/dist/cliCommandNames.js +48 -0
  518. package/dist/cliEvidenceCommands.js +0 -1
  519. package/dist/cliJavaScriptRuntimeCommands.js +16 -14
  520. package/dist/cliJsonInput.js +12 -4
  521. package/dist/cliLogging.js +66 -15
  522. package/dist/cliObservationOptions.js +9 -0
  523. package/dist/cliOutput.js +105 -7
  524. package/dist/composition/binary.js +19 -2
  525. package/dist/composition/captures.js +3 -0
  526. package/dist/composition/directAnalysis.js +36 -11
  527. package/dist/composition/electronFuses.js +4 -0
  528. package/dist/composition/evm.js +12 -0
  529. package/dist/composition/flutter.js +3 -0
  530. package/dist/composition/go.js +4 -0
  531. package/dist/composition/javascriptAnalysisWorkerProcess.js +8 -8
  532. package/dist/composition/jeb.js +45 -5
  533. package/dist/composition/pcap.js +3 -0
  534. package/dist/composition/resolveWindowsProviderExecutable.js +61 -0
  535. package/dist/composition/reverseEngineering.js +29 -0
  536. package/dist/composition/rust.js +4 -0
  537. package/dist/composition/signals.js +3 -0
  538. package/dist/composition/sqlite.js +4 -0
  539. package/dist/composition/wasm.js +22 -0
  540. package/dist/composition/webNetworkCaptures.js +7 -2
  541. package/dist/config/environment.js +79 -4
  542. package/dist/config/ghidraDisabledAnalyzers.js +25 -0
  543. package/dist/config/homeDirectory.js +9 -6
  544. package/dist/config/mcpInputSchemaProfile.js +5 -1
  545. package/dist/config/mcpOutputSchemaProfile.js +22 -0
  546. package/dist/config/parseConfig.js +28 -34
  547. package/dist/config/parsers.js +4 -3
  548. package/dist/config/{ghidraStartupTimeout.js → providerStartupTimeout.js} +7 -3
  549. package/dist/contracts/adb/adbToolContracts.js +8 -8
  550. package/dist/contracts/analysisDetail.js +6 -3
  551. package/dist/contracts/analysisViewApiSurfaceExample.js +68 -0
  552. package/dist/contracts/analysisViewToolContracts.js +65 -3
  553. package/dist/contracts/android/androidToolContracts.js +17 -8
  554. package/dist/contracts/apktool/apktoolToolContracts.js +5 -1
  555. package/dist/contracts/applicationToolContracts.js +17 -2
  556. package/dist/contracts/artifactComparisonExample.js +18 -14
  557. package/dist/contracts/artifactToolContracts.js +16 -3
  558. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  559. package/dist/contracts/browserToolContracts.js +13 -1
  560. package/dist/contracts/captures/captureToolContracts.js +42 -0
  561. package/dist/contracts/compactInputSchema.js +39 -12
  562. package/dist/contracts/cutterToolContracts.js +84 -0
  563. package/dist/contracts/enhancedToolContracts.js +2 -2
  564. package/dist/contracts/evm/evmToolContracts.js +30 -15
  565. package/dist/contracts/firmware/firmwareToolContracts.js +1 -1
  566. package/dist/contracts/flutter/flutterToolContracts.js +47 -0
  567. package/dist/contracts/fridaRemoteAddress.js +23 -0
  568. package/dist/contracts/fridaToolContracts.js +274 -0
  569. package/dist/contracts/functionComparisonExample.js +12 -1
  570. package/dist/contracts/gdbToolContracts.js +102 -0
  571. package/dist/contracts/go/goToolContracts.js +20 -0
  572. package/dist/contracts/hopperMemoryContracts.js +15 -0
  573. package/dist/contracts/inputSchemaPresentation.js +199 -38
  574. package/dist/contracts/investigationExamples.js +1 -0
  575. package/dist/contracts/javascript/electronToolContracts.js +27 -2
  576. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +1 -0
  577. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +13 -1
  578. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +1 -0
  579. package/dist/contracts/jsonSchemaKeywords.js +29 -0
  580. package/dist/contracts/managed/managedToolContracts.js +43 -4
  581. package/dist/contracts/managed/managedWorkflowExamples.js +10 -1
  582. package/dist/contracts/managed/managedWorkflowToolContracts.js +4 -30
  583. package/dist/contracts/mobileApplicationGraphExamples.js +27 -12
  584. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +3 -2
  585. package/dist/contracts/native/nativeToolContracts.js +10 -6
  586. package/dist/contracts/officialToolContracts.js +7 -7
  587. package/dist/contracts/pcap/pcapToolContracts.js +33 -0
  588. package/dist/contracts/providerSelection.js +1 -0
  589. package/dist/contracts/reconstructionReadinessExample.js +126 -119
  590. package/dist/contracts/reverseEngineeringToolContracts.js +52 -0
  591. package/dist/contracts/rizinDebugToolContracts.js +97 -0
  592. package/dist/contracts/rust/rustToolContracts.js +20 -0
  593. package/dist/contracts/sessionLifecycleInputs.js +34 -2
  594. package/dist/contracts/sessionToolContracts.js +4 -4
  595. package/dist/contracts/sessionToolSchemas.js +14 -0
  596. package/dist/contracts/signals/signalToolContracts.js +40 -0
  597. package/dist/contracts/sqlite/sqliteToolContracts.js +36 -0
  598. package/dist/contracts/toolContractExamples.js +29 -0
  599. package/dist/contracts/toolContractTypes.js +2 -0
  600. package/dist/contracts/toolContracts.js +26 -0
  601. package/dist/contracts/toolEffects.js +252 -9
  602. package/dist/contracts/toolOutputSchemaGroups.js +78 -32
  603. package/dist/contracts/toolOutputSchemaPrimitives.js +118 -10
  604. package/dist/contracts/toolSchemaMetadata.js +102 -16
  605. package/dist/contracts/unknownContractExamples.js +1 -1
  606. package/dist/contracts/wasm/wasmComparisonContracts.js +52 -0
  607. package/dist/contracts/wasm/wasmToolContracts.js +33 -0
  608. package/dist/contracts/webNetworkCaptureToolContracts.js +15 -4
  609. package/dist/cutter/CutterBridgeClient.js +760 -0
  610. package/dist/cutter/CutterBridgeService.js +187 -0
  611. package/dist/doctorRuntime.js +41 -8
  612. package/dist/domain/adb/adbDeviceAnalysis.js +45 -5
  613. package/dist/domain/analysisErrorBase.js +79 -2
  614. package/dist/domain/analysisErrorCleanup.js +4 -2
  615. package/dist/domain/analysisErrorCore.js +32 -0
  616. package/dist/domain/analysisErrorPresentation.js +80 -20
  617. package/dist/domain/analysisErrorProjection.js +72 -37
  618. package/dist/domain/analysisProfile.js +7 -3
  619. package/dist/domain/analysisSearch.js +26 -0
  620. package/dist/domain/analysisSnapshot.js +312 -185
  621. package/dist/domain/analysisView/WebNetworkApiSurfaceAccumulator.js +353 -0
  622. package/dist/domain/analysisView/analysisView.js +391 -44
  623. package/dist/domain/analysisView/analysisViewCoverage.js +32 -0
  624. package/dist/domain/analysisView/analysisViewDataAdmission.js +86 -0
  625. package/dist/domain/analysisView/analysisViewErrors.js +4 -0
  626. package/dist/domain/analysisView/analysisViewParent.js +12 -0
  627. package/dist/domain/analysisView/analysisViewText.js +29 -0
  628. package/dist/domain/analysisView/androidPackageView.js +102 -0
  629. package/dist/domain/analysisView/artifactInventoryView.js +126 -0
  630. package/dist/domain/analysisView/binaryLayoutView.js +11 -4
  631. package/dist/domain/analysisView/dartAotView.js +93 -0
  632. package/dist/domain/analysisView/evmInterfaceView.js +105 -0
  633. package/dist/domain/analysisView/interfaceBuilderView.js +182 -0
  634. package/dist/domain/analysisView/javascriptApplicationCoverage.js +27 -0
  635. package/dist/domain/analysisView/javascriptApplicationView.js +123 -49
  636. package/dist/domain/analysisView/javascriptFactsView.js +92 -0
  637. package/dist/domain/analysisView/javascriptModuleReferences.js +37 -0
  638. package/dist/domain/analysisView/machoView.js +186 -0
  639. package/dist/domain/analysisView/managedArtifactView.js +108 -0
  640. package/dist/domain/analysisView/managedMemberView.js +215 -0
  641. package/dist/domain/analysisView/nativeFunctionView.js +20 -25
  642. package/dist/domain/analysisView/pcapCaptureView.js +264 -0
  643. package/dist/domain/analysisView/qlogCaptureView.js +198 -0
  644. package/dist/domain/analysisView/wasmArtifactView.js +162 -0
  645. package/dist/domain/analysisView/webNetworkApiSurfaceView.js +123 -0
  646. package/dist/domain/analysisView/webNetworkCaptureView.js +388 -0
  647. package/dist/domain/android/androidAnalysis.js +36 -2
  648. package/dist/domain/android/androidApplication.js +37 -64
  649. package/dist/domain/apktool/apktoolResourceAnalysis.js +70 -8
  650. package/dist/domain/apple/appleApplication.js +70 -87
  651. package/dist/domain/apple/appleArchiveFormat.js +184 -0
  652. package/dist/domain/apple/appleAssetCatalog.js +15 -0
  653. package/dist/domain/apple/appleBundleAnatomy.js +57 -69
  654. package/dist/domain/apple/dyldPaths.js +9 -2
  655. package/dist/domain/apple/dylibResolution.js +24 -10
  656. package/dist/domain/apple/dylibResolutionFindings.js +8 -9
  657. package/dist/domain/apple/interfaceBuilderGraph.js +78 -33
  658. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +39 -12
  659. package/dist/domain/apple/jvmClassFile.js +226 -0
  660. package/dist/domain/apple/keyedArchive.js +39 -17
  661. package/dist/domain/apple/machoContainer.js +123 -8
  662. package/dist/domain/apple/machoCpuIdentity.js +4 -0
  663. package/dist/domain/apple/plistNumbers.js +67 -5
  664. package/dist/domain/apple/plistValue.js +95 -19
  665. package/dist/domain/artifactComparison.js +116 -37
  666. package/dist/domain/artifactDecompressionBudget.js +26 -0
  667. package/dist/domain/artifactGraph.js +18 -9
  668. package/dist/domain/artifactIdentity.js +4 -1
  669. package/dist/domain/artifactInspection.js +34 -3
  670. package/dist/domain/artifactInventoryEvidence.js +146 -40
  671. package/dist/domain/binaryTarget.js +251 -109
  672. package/dist/domain/binaryTargetTypes.js +24 -1
  673. package/dist/domain/browserNetworkEvidence.js +24 -3
  674. package/dist/domain/browserObservation.js +92 -56
  675. package/dist/domain/browserObservationError.js +4 -4
  676. package/dist/domain/browserObservationSchemas.js +4 -1
  677. package/dist/domain/browserScenarioCapture.js +11 -1
  678. package/dist/domain/browserScenarioCaptureLimits.js +34 -0
  679. package/dist/domain/browserScenarioCaptureValues.js +76 -2
  680. package/dist/domain/browserScenarioDiff.js +120 -11
  681. package/dist/domain/browserScenarioDiffEvidence.js +44 -13
  682. package/dist/domain/browserScenarioDiffValues.js +10 -3
  683. package/dist/domain/browserScenarioNetworkComparison.js +158 -0
  684. package/dist/domain/browserScenarioNormalization.js +10 -13
  685. package/dist/domain/browserScenarioValues.js +7 -13
  686. package/dist/domain/browserSession.js +2 -2
  687. package/dist/domain/bundleComparison.js +1 -5
  688. package/dist/domain/callPath.js +40 -3
  689. package/dist/domain/captures/packetCapture.js +139 -0
  690. package/dist/domain/captures/packetFields.js +81 -0
  691. package/dist/domain/changedBehavior.js +43 -41
  692. package/dist/domain/comparisonSourceEvidence.js +6 -0
  693. package/dist/domain/dosCom.js +2 -2
  694. package/dist/domain/dosMz.js +66 -19
  695. package/dist/domain/electron/electronFuseEvidence.js +42 -0
  696. package/dist/domain/electron/electronFuses.js +360 -0
  697. package/dist/domain/elfFixedHeader.js +66 -0
  698. package/dist/domain/evidence.js +105 -39
  699. package/dist/domain/evidenceBundle.js +67 -22
  700. package/dist/domain/evidenceErrors.js +5 -0
  701. package/dist/domain/evm/evmInterface.js +18 -4
  702. package/dist/domain/evm/solidityMetadata.js +70 -0
  703. package/dist/domain/explicitSensitiveFailure.js +44 -23
  704. package/dist/domain/fileSnapshotObservation.js +25 -0
  705. package/dist/domain/firmware/firmwareAnalysis.js +29 -0
  706. package/dist/domain/fixedTupleSchema.js +9 -0
  707. package/dist/domain/flutter/flutterBuildAnalysis.js +141 -0
  708. package/dist/domain/functionCallCoverage.js +60 -0
  709. package/dist/domain/functionComparisonDimensions.js +136 -18
  710. package/dist/domain/functionComparisonNormalization.js +83 -19
  711. package/dist/domain/functionComparisonResults.js +7 -6
  712. package/dist/domain/functionComparisonSchemas.js +14 -3
  713. package/dist/domain/functionDossierEvidence.js +4 -0
  714. package/dist/domain/go/goBinary.js +96 -0
  715. package/dist/domain/harmony/harmonyApplication.js +156 -0
  716. package/dist/domain/hopperErrors.js +19 -18
  717. package/dist/domain/hopperPublisher.js +12 -0
  718. package/dist/domain/hopperValues.js +135 -34
  719. package/dist/domain/javascript/electronActiveObservation.js +1 -0
  720. package/dist/domain/javascript/electronObservation.js +4 -1
  721. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +94 -33
  722. package/dist/domain/javascript/electronStaticAnalysisIpc.js +3 -1
  723. package/dist/domain/javascript/electronStaticAnalysisNative.js +19 -5
  724. package/dist/domain/javascript/electronStaticAnalysisValues.js +14 -28
  725. package/dist/domain/javascript/electronStaticOptionObjects.js +45 -0
  726. package/dist/domain/javascript/electronWrappedCallPaths.js +551 -0
  727. package/dist/domain/javascript/htmlArtifactReferences.js +94 -4
  728. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +37 -1
  729. package/dist/domain/javascript/javascriptApplicationAnalysis.js +7 -0
  730. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +10 -2
  731. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +1 -1
  732. package/dist/domain/javascript/javascriptApplicationGraph.js +17 -1
  733. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +1 -0
  734. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +8 -0
  735. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +3 -1
  736. package/dist/domain/javascript/javascriptApplicationVersionItems.js +49 -21
  737. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +31 -18
  738. package/dist/domain/javascript/javascriptArtifactFiles.js +2 -1
  739. package/dist/domain/javascript/javascriptAstFingerprint.js +89 -24
  740. package/dist/domain/javascript/javascriptAstValues.js +132 -5
  741. package/dist/domain/javascript/javascriptBootstrap.js +94 -0
  742. package/dist/domain/javascript/javascriptBootstrapIntegrity.js +372 -0
  743. package/dist/domain/javascript/javascriptBuiltinResourceMethods.js +8 -0
  744. package/dist/domain/javascript/javascriptBundledRequireOrigin.js +278 -0
  745. package/dist/domain/javascript/javascriptCommonJsExportReceivers.js +231 -0
  746. package/dist/domain/javascript/javascriptContextBridgeExposure.js +23 -0
  747. package/dist/domain/javascript/javascriptElectronMemberWrites.js +96 -22
  748. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +6 -5
  749. package/dist/domain/javascript/javascriptExportShapeVariants.js +1 -1
  750. package/dist/domain/javascript/javascriptFeatureSeed.js +34 -17
  751. package/dist/domain/javascript/javascriptFeatureTrace.js +9 -3
  752. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +42 -11
  753. package/dist/domain/javascript/javascriptGraphqlOperations.js +382 -0
  754. package/dist/domain/javascript/javascriptIntrinsicInvocation.js +132 -0
  755. package/dist/domain/javascript/javascriptModuleDeclaration.js +48 -0
  756. package/dist/domain/javascript/javascriptModuleInterop.js +618 -0
  757. package/dist/domain/javascript/javascriptModuleResolutionMode.js +18 -0
  758. package/dist/domain/javascript/javascriptModuleSpecifier.js +5 -0
  759. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -12
  760. package/dist/domain/javascript/javascriptPackageImportAliases.js +58 -0
  761. package/dist/domain/javascript/javascriptRecovery.js +12 -5
  762. package/dist/domain/javascript/javascriptRpcEndpoints.js +7 -93
  763. package/dist/domain/javascript/javascriptRuntimeLoadState.js +16 -0
  764. package/dist/domain/javascript/javascriptRuntimeObservation.js +4 -1
  765. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +45 -16
  766. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +65 -47
  767. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +0 -1
  768. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +5 -4
  769. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +113 -11
  770. package/dist/domain/javascript/javascriptSemanticAmbientWrites.js +511 -0
  771. package/dist/domain/javascript/javascriptSemanticAnalysis.js +706 -204
  772. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +54 -54
  773. package/dist/domain/javascript/javascriptSemanticCallResolution.js +59 -30
  774. package/dist/domain/javascript/javascriptSemanticCallableStack.js +52 -0
  775. package/dist/domain/javascript/javascriptSemanticCalls.js +10 -15
  776. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +163 -92
  777. package/dist/domain/javascript/javascriptSemanticCoverage.js +5 -1
  778. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +435 -45
  779. package/dist/domain/javascript/javascriptSemanticDataEffects.js +46 -29
  780. package/dist/domain/javascript/javascriptSemanticDependencies.js +69 -0
  781. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +1 -1
  782. package/dist/domain/javascript/javascriptSemanticEvaluationOrder.js +126 -0
  783. package/dist/domain/javascript/javascriptSemanticExpressionShapes.js +111 -0
  784. package/dist/domain/javascript/javascriptSemanticFingerprints.js +11 -14
  785. package/dist/domain/javascript/javascriptSemanticGetterQueries.js +147 -0
  786. package/dist/domain/javascript/javascriptSemanticGetterResults.js +264 -0
  787. package/dist/domain/javascript/javascriptSemanticGraph.js +22 -1
  788. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +13 -1
  789. package/dist/domain/javascript/javascriptSemanticIterationSources.js +5 -4
  790. package/dist/domain/javascript/javascriptSemanticMapOperations.js +51 -0
  791. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +421 -154
  792. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +500 -27
  793. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +377 -174
  794. package/dist/domain/javascript/javascriptSemanticObjects.js +53 -43
  795. package/dist/domain/javascript/javascriptSemanticOpaqueEffects.js +163 -0
  796. package/dist/domain/javascript/javascriptSemanticPrimitives.js +11 -1
  797. package/dist/domain/javascript/javascriptSemanticProjection.js +180 -95
  798. package/dist/domain/javascript/javascriptSemanticPromises.js +6 -9
  799. package/dist/domain/javascript/javascriptSemanticProvenance.js +5 -1
  800. package/dist/domain/javascript/javascriptSemanticQuery.js +7 -2
  801. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +2 -1
  802. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +1 -1
  803. package/dist/domain/javascript/javascriptSemanticReferenceSources.js +25 -0
  804. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +369 -8
  805. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +3 -19
  806. package/dist/domain/javascript/javascriptSemanticResources.js +33 -44
  807. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +81 -26
  808. package/dist/domain/javascript/javascriptSemanticReturns.js +37 -30
  809. package/dist/domain/javascript/javascriptSemanticState.js +225 -39
  810. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -4
  811. package/dist/domain/javascript/javascriptSemanticValues.js +379 -56
  812. package/dist/domain/javascript/javascriptSourceMapPaths.js +44 -17
  813. package/dist/domain/javascript/javascriptSourceParser.js +121 -7
  814. package/dist/domain/javascript/javascriptSourceSelection.js +11 -0
  815. package/dist/domain/javascript/javascriptStaticAnalysis.js +69 -24
  816. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +97 -23
  817. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +488 -48
  818. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +196 -78
  819. package/dist/domain/javascript/javascriptStaticAnalysisState.js +4 -0
  820. package/dist/domain/javascript/javascriptStaticAnalysisTypes.js +2 -1
  821. package/dist/domain/javascript/javascriptSymbolicBindings.js +1118 -0
  822. package/dist/domain/javascript/javascriptSymbolicControlFlow.js +44 -0
  823. package/dist/domain/javascript/javascriptSymbolicValues.js +45 -0
  824. package/dist/domain/javascript/sourceToBundleComparison.js +3 -1
  825. package/dist/domain/javascript/sourceToBundleComparisonSchemas.js +2 -0
  826. package/dist/domain/javascript/sourceToBundleSignals.js +50 -13
  827. package/dist/domain/jsonValue.js +37 -12
  828. package/dist/domain/localPath.js +6 -3
  829. package/dist/domain/managed/managedApplicationGraph.js +5 -0
  830. package/dist/domain/managed/managedApplicationGraphCoverage.js +6 -2
  831. package/dist/domain/managed/managedApplicationGraphNodes.js +14 -10
  832. package/dist/domain/managed/managedArtifact.js +77 -1
  833. package/dist/domain/managed/managedInspectionEvidence.js +5 -6
  834. package/dist/domain/managed/managedMemberComparison.js +6 -0
  835. package/dist/domain/managed/managedMemberComparisonCoverage.js +36 -3
  836. package/dist/domain/managed/managedMemberComparisonItems.js +135 -59
  837. package/dist/domain/managed/managedMemberComparisonMatch.js +237 -42
  838. package/dist/domain/managed/managedMemberSignatureIdentity.js +40 -0
  839. package/dist/domain/managed/managedNativeVerificationMatch.js +54 -31
  840. package/dist/domain/managed/managedNativeVerificationSchemas.js +15 -4
  841. package/dist/domain/managed/managedReconstruction.js +5 -8
  842. package/dist/domain/mobileApplicationGraphProjection.js +95 -0
  843. package/dist/domain/native/addressCoordinate.js +11 -0
  844. package/dist/domain/native/binaryLayout.js +2 -4
  845. package/dist/domain/native/bytePattern.js +121 -0
  846. package/dist/domain/native/nativeAotPe.js +31 -4
  847. package/dist/domain/native/nativeAotSnapshotObservation.js +18 -0
  848. package/dist/domain/native/nativeCallPartialObservation.js +14 -12
  849. package/dist/domain/native/nativeInspection.js +38 -4
  850. package/dist/domain/native/nativeInstruction.js +17 -2
  851. package/dist/domain/native/nativeInvestigationGraph.js +9 -5
  852. package/dist/domain/native/nativeLoadImage.js +32 -1
  853. package/dist/domain/native/nativeUiObservation.js +5 -6
  854. package/dist/domain/native/objcSwiftMetadata.js +19 -9
  855. package/dist/domain/native/peResources.js +14 -4
  856. package/dist/domain/native/recordedCrash.js +79 -10
  857. package/dist/domain/offsetDateTime.js +60 -0
  858. package/dist/domain/pcap/pcapAnalysis.js +91 -0
  859. package/dist/domain/pcap/pcapEvidence.js +15 -0
  860. package/dist/domain/peMachine.js +38 -0
  861. package/dist/domain/pngHeader.js +18 -0
  862. package/dist/domain/process/processCaptureCoverage.js +26 -3
  863. package/dist/domain/process/processCaptureExample.js +2 -0
  864. package/dist/domain/process/processCaptureValidation.js +33 -8
  865. package/dist/domain/process/processComparison.js +41 -13
  866. package/dist/domain/process/processScenario.js +7 -0
  867. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  868. package/dist/domain/process/processTraceEvaluation.js +119 -74
  869. package/dist/domain/process/processTraceSpecification.js +243 -89
  870. package/dist/domain/propertyListKeys.js +238 -23
  871. package/dist/domain/propertyListXml.js +149 -0
  872. package/dist/domain/propertyListXmlText.js +20 -4
  873. package/dist/domain/providerAdapterError.js +2 -5
  874. package/dist/domain/providerCleanupError.js +2 -4
  875. package/dist/domain/providerConfigurationRefusal.js +12 -0
  876. package/dist/domain/providerSelectionError.js +2 -1
  877. package/dist/domain/qlogCapture.js +62 -0
  878. package/dist/domain/rawBinary.js +105 -0
  879. package/dist/domain/reconstructionCoverage.js +40 -24
  880. package/dist/domain/reconstructionCoverageEvaluation.js +50 -47
  881. package/dist/domain/reconstructionCoverageEvidence.js +26 -0
  882. package/dist/domain/reconstructionCoverageVerifierResults.js +35 -0
  883. package/dist/domain/reconstructionObligationLedgerIntegrity.js +114 -0
  884. package/dist/domain/reconstructionObligationLedgerSchemas.js +104 -1
  885. package/dist/domain/reconstructionReadiness.js +4 -8
  886. package/dist/domain/reconstructionReadinessJourneyFindings.js +4 -1
  887. package/dist/domain/reconstructionUnknowns.js +9 -1
  888. package/dist/domain/reconstructionVerification.js +86 -43
  889. package/dist/domain/recordedTransportUrl.js +59 -0
  890. package/dist/domain/referenceSourceClassification.js +27 -23
  891. package/dist/domain/referenceSourceGraph.js +51 -13
  892. package/dist/domain/referenceSourceImportParsing.js +27 -13
  893. package/dist/domain/referenceSourcePathIdentity.js +13 -1
  894. package/dist/domain/referenceSourceRequireBindings.js +40 -108
  895. package/dist/domain/referenceSourceSummary.js +92 -0
  896. package/dist/domain/relationshipCoverage.js +43 -0
  897. package/dist/domain/residualUnknown.js +93 -26
  898. package/dist/domain/reverseEngineering.js +31 -0
  899. package/dist/domain/runtimeVersion.js +8 -0
  900. package/dist/domain/rust/rustBinary.js +200 -0
  901. package/dist/domain/signals/annotationTextWindow.js +31 -0
  902. package/dist/domain/signals/signalDecoders.js +69 -0
  903. package/dist/domain/signals/signalRecording.js +115 -0
  904. package/dist/domain/sourceMapContents.js +10 -3
  905. package/dist/domain/sourceMapEnvelope.js +17 -11
  906. package/dist/domain/sqlite/sqliteDatabase.js +189 -0
  907. package/dist/domain/staticRuntimeCorrelation.js +7 -9
  908. package/dist/domain/swiftSymbolClassification.js +17 -0
  909. package/dist/domain/symbolAnalysis.js +20 -7
  910. package/dist/domain/urlComponents.js +6 -0
  911. package/dist/domain/wasm/wasmArtifact.js +119 -0
  912. package/dist/domain/wasm/wasmInterface.js +89 -0
  913. package/dist/domain/webBundleAnalysis.js +14 -3
  914. package/dist/domain/webBundleAnalyzerAst.js +7 -2
  915. package/dist/domain/webBundleAnalyzerInspection.js +113 -57
  916. package/dist/domain/webBundleAnalyzerResult.js +18 -6
  917. package/dist/domain/webCaptureDiff.js +235 -51
  918. package/dist/domain/webCaptureFrameComparison.js +49 -0
  919. package/dist/domain/webInventory.js +28 -14
  920. package/dist/domain/webMcpDiscovery.js +5 -2
  921. package/dist/domain/webModuleImports.js +22 -27
  922. package/dist/domain/webModuleTrace.js +25 -8
  923. package/dist/domain/webNetworkCapture.js +101 -39
  924. package/dist/domain/webNetworkCaptureCoordinates.js +21 -0
  925. package/dist/domain/webRuntime.js +0 -1
  926. package/dist/domain/webScreenshot.js +2 -2
  927. package/dist/domain/webScriptArtifacts.js +2 -4
  928. package/dist/domain/webScriptExport.js +6 -8
  929. package/dist/domain/webScriptExportError.js +2 -3
  930. package/dist/domain/webScriptExportPlan.js +2 -2
  931. package/dist/domain/webSourceLocation.js +20 -9
  932. package/dist/domain/xmlDocument.js +41 -0
  933. package/dist/domain/zipPackageFormat.js +25 -3
  934. package/dist/dotnet/ManagedArtifactInspector.js +25 -12
  935. package/dist/dotnet/ManagedDecodeBudget.js +87 -9
  936. package/dist/dotnet/ManagedMemberInspector.js +127 -22
  937. package/dist/dotnet/ManagedMemberInspectorCore.js +408 -141
  938. package/dist/dotnet/ManagedMemberInstructionDecoder.js +109 -37
  939. package/dist/dotnet/ManagedMemberOwnership.js +65 -0
  940. package/dist/dotnet/ManagedMemberPointers.js +69 -0
  941. package/dist/dotnet/ManagedMemberRows.js +181 -48
  942. package/dist/dotnet/ManagedMetadataHeaps.js +110 -25
  943. package/dist/dotnet/ManagedMetadataInventory.js +5 -5
  944. package/dist/dotnet/ManagedMetadataInventoryRows.js +36 -52
  945. package/dist/dotnet/ManagedMetadataLayout.js +26 -16
  946. package/dist/dotnet/ManagedMetadataRowSizes.js +1 -1
  947. package/dist/dotnet/ManagedMethodBodyReader.js +29 -11
  948. package/dist/dotnet/ManagedMethodSpecs.js +78 -0
  949. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +20 -19
  950. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -21
  951. package/dist/dotnet/ManagedPeReader.js +60 -27
  952. package/dist/dotnet/ManagedReaderFailure.js +9 -0
  953. package/dist/dotnet/ManagedSnapshot.js +93 -0
  954. package/dist/dotnet/ManagedStaticProvider.js +55 -64
  955. package/dist/dotnet/ManagedTypeMemberLists.js +105 -0
  956. package/dist/dotnet/ManagedTypeNameDigests.js +177 -0
  957. package/dist/dotnet/ManagedTypeNames.js +58 -0
  958. package/dist/dotnet/ManagedTypeNesting.js +25 -0
  959. package/dist/dotnet/ManagedTypeReferences.js +94 -0
  960. package/dist/dotnet/ManagedUserStrings.js +75 -0
  961. package/dist/electron/ElectronFuseFailures.js +105 -0
  962. package/dist/electron/ElectronFusePath.js +248 -0
  963. package/dist/electron/ElectronFuseProvider.js +88 -0
  964. package/dist/electron/ElectronFuseReader.js +333 -0
  965. package/dist/evaluation/AgentEvaluationFixtures.js +194 -11
  966. package/dist/evaluation/CodexAgentEval.js +19 -40
  967. package/dist/evaluation/KnownAnswerEvaluation.js +126 -57
  968. package/dist/evm/EvmoleFailures.js +20 -14
  969. package/dist/evm/EvmoleInterfaceAdapter.js +5 -1
  970. package/dist/evm/EvmoleInterfaceProvider.js +142 -35
  971. package/dist/evm/EvmoleInterfaceWorker.js +2 -0
  972. package/dist/evm/SolidityMetadata.js +139 -0
  973. package/dist/filesystem/OwnedRegularFile.js +116 -0
  974. package/dist/filesystem/OwnedStagedOutput.js +155 -0
  975. package/dist/filesystem/RegularFile.js +65 -9
  976. package/dist/filesystem/StableFileHash.js +56 -38
  977. package/dist/filesystem/callerPath.js +26 -0
  978. package/dist/filesystem/readFileHandleChunks.js +72 -13
  979. package/dist/filesystem/readStableFileBytes.js +85 -0
  980. package/dist/firmware/FirmwareCommand.js +15 -9
  981. package/dist/firmware/FirmwareFailures.js +56 -0
  982. package/dist/firmware/FirmwareFiles.js +136 -110
  983. package/dist/firmware/FirmwareProvider.js +122 -65
  984. package/dist/firmware/FirmwarePublication.js +244 -12
  985. package/dist/firmware/FirmwareReports.js +202 -12
  986. package/dist/flutter/DartElf.js +445 -0
  987. package/dist/flutter/ElfBuildId.js +137 -0
  988. package/dist/flutter/ElfLoadMap.js +91 -0
  989. package/dist/flutter/FlutterBuildProvider.js +866 -0
  990. package/dist/flutter/FlutterPayloadScan.js +180 -0
  991. package/dist/frida/FridaInstrumentationManager.js +1104 -0
  992. package/dist/gdb/GdbSessionManager.js +1639 -0
  993. package/dist/generatedPackageMetadata.js +2 -2
  994. package/dist/ghidra/GhidraAnalysisProfile.js +146 -14
  995. package/dist/ghidra/GhidraAnalysisSeeds.js +39 -55
  996. package/dist/ghidra/GhidraBridgeSources.js +12 -0
  997. package/dist/ghidra/GhidraClient.js +501 -180
  998. package/dist/ghidra/GhidraClientStartup.js +5 -3
  999. package/dist/ghidra/GhidraClientWire.js +5 -2
  1000. package/dist/ghidra/GhidraDiagnostics.js +23 -5
  1001. package/dist/ghidra/GhidraDoctor.js +60 -26
  1002. package/dist/ghidra/GhidraDosSnapshot.js +83 -0
  1003. package/dist/ghidra/GhidraExecutableHeader.js +54 -0
  1004. package/dist/ghidra/GhidraFileArtifacts.js +93 -0
  1005. package/dist/ghidra/GhidraFunctionValues.js +50 -2
  1006. package/dist/ghidra/GhidraInstallation.js +305 -108
  1007. package/dist/ghidra/GhidraInstallationPolicy.js +94 -103
  1008. package/dist/ghidra/GhidraInstallationProperties.js +57 -0
  1009. package/dist/ghidra/GhidraInventoryValues.js +52 -6
  1010. package/dist/ghidra/GhidraJavaLaunch.js +99 -11
  1011. package/dist/ghidra/GhidraJavaProbe.js +267 -0
  1012. package/dist/ghidra/GhidraJavaProperties.js +119 -0
  1013. package/dist/ghidra/GhidraLanguageCatalog.js +83 -8
  1014. package/dist/ghidra/GhidraLauncher.js +325 -85
  1015. package/dist/ghidra/GhidraLoadImageAttest.js +82 -65
  1016. package/dist/ghidra/GhidraLoadImageValues.js +109 -27
  1017. package/dist/ghidra/GhidraMipsProfile.js +258 -14
  1018. package/dist/ghidra/GhidraNativeAotSnapshotOwner.js +221 -0
  1019. package/dist/ghidra/GhidraPeProfile.js +91 -0
  1020. package/dist/ghidra/GhidraPowerPcProfile.js +51 -0
  1021. package/dist/ghidra/GhidraProvider.js +267 -42
  1022. package/dist/ghidra/GhidraProviderCapabilities.js +29 -15
  1023. package/dist/ghidra/GhidraProviderClient.js +439 -276
  1024. package/dist/ghidra/GhidraPspExtension.js +210 -0
  1025. package/dist/ghidra/GhidraPspProfile.js +62 -0
  1026. package/dist/ghidra/GhidraRawBinaryLanguage.js +49 -0
  1027. package/dist/ghidra/GhidraReleasePolicy.js +93 -0
  1028. package/dist/ghidra/GhidraRequestQueue.js +64 -40
  1029. package/dist/ghidra/GhidraRiscvProfile.js +100 -0
  1030. package/dist/ghidra/GhidraSessionError.js +301 -24
  1031. package/dist/ghidra/GhidraSessionValues.js +76 -0
  1032. package/dist/ghidra/GhidraSocketConnection.js +25 -11
  1033. package/dist/ghidra/GhidraTargetSnapshot.js +67 -50
  1034. package/dist/ghidra/GhidraTransport.js +86 -62
  1035. package/dist/ghidra/extensions/GhidraExtensions.js +30 -45
  1036. package/dist/go/GoBinaryContainer.js +140 -0
  1037. package/dist/go/GoBinaryImage.js +210 -0
  1038. package/dist/go/GoBinaryProvider.js +180 -0
  1039. package/dist/go/GoElfImage.js +211 -0
  1040. package/dist/go/GoMachoImage.js +164 -0
  1041. package/dist/go/GoModuleText.js +217 -0
  1042. package/dist/go/GoPeImage.js +124 -0
  1043. package/dist/hopper/BridgeLauncher.js +78 -6
  1044. package/dist/hopper/HopperAnalysisProfile.js +23 -11
  1045. package/dist/hopper/HopperCleanup.js +29 -4
  1046. package/dist/hopper/HopperClient.js +317 -93
  1047. package/dist/hopper/HopperMacPublisher.js +29 -0
  1048. package/dist/hopper/HopperMachOImage.js +61 -29
  1049. package/dist/hopper/HopperProcessDiagnostic.js +27 -0
  1050. package/dist/hopper/HopperProvider.js +57 -29
  1051. package/dist/hopper/HopperProviderCapabilities.js +9 -4
  1052. package/dist/hopper/HopperRegexSearch.js +21 -60
  1053. package/dist/hopper/HopperRequestQueue.js +17 -5
  1054. package/dist/hopper/HopperSessionValues.js +10 -1
  1055. package/dist/ida/IdaBusyHealth.js +78 -0
  1056. package/dist/ida/IdaCallGraph.js +134 -0
  1057. package/dist/ida/IdaConfiguration.js +7 -2
  1058. package/dist/ida/IdaDiagnosticRedactor.js +199 -0
  1059. package/dist/ida/IdaDiagnosticWriter.js +62 -0
  1060. package/dist/ida/IdaDoctor.js +7 -5
  1061. package/dist/ida/IdaJsonDiagnostic.js +138 -0
  1062. package/dist/ida/IdaMcpConnection.js +308 -32
  1063. package/dist/ida/IdaNativeProtocol.js +85 -0
  1064. package/dist/ida/IdaOperationRunner.js +246 -61
  1065. package/dist/ida/IdaProtocolValues.js +88 -5
  1066. package/dist/ida/IdaProvider.js +45 -10
  1067. package/dist/ida/IdaProviderCapabilities.js +37 -8
  1068. package/dist/ida/IdaSessionClient.js +379 -60
  1069. package/dist/ida/IdaWorkspace.js +54 -6
  1070. package/dist/inspector/V8InspectorCaptureProjection.js +14 -2
  1071. package/dist/inspector/V8InspectorEndpoint.js +15 -13
  1072. package/dist/inspector/V8InspectorProvider.js +43 -7
  1073. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +44 -12
  1074. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +107 -32
  1075. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +7 -4
  1076. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +85 -10
  1077. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +16 -6
  1078. package/dist/javascript/recovery/RecoveryFiles.js +107 -13
  1079. package/dist/javascript/recovery/WakaruExecution.js +19 -11
  1080. package/dist/javascript/recovery/WakaruProvider.js +12 -9
  1081. package/dist/javascript/recovery/WakaruPublication.js +24 -10
  1082. package/dist/javascript/recovery/WakaruRelease.js +1 -1
  1083. package/dist/javascript/recovery/WakaruReport.js +3 -2
  1084. package/dist/javascript/sourceMaps/DecodedSourceMap.js +2 -16
  1085. package/dist/javascript/sourceMaps/SourceMapCommand.js +22 -4
  1086. package/dist/javascript/sourceMaps/SourceMapDecoder.js +22 -4
  1087. package/dist/javascript/sourceMaps/SourceMapFormat.js +25 -38
  1088. package/dist/javascript/sourceMaps/TraceSourceMap.js +34 -6
  1089. package/dist/jeb/JebMcpConnection.js +148 -82
  1090. package/dist/jeb/JebMcpConnectionOwner.js +116 -0
  1091. package/dist/jeb/JebMcpDeadline.js +46 -0
  1092. package/dist/jeb/JebMcpEndpoint.js +6 -1
  1093. package/dist/jeb/JebProvider.js +82 -58
  1094. package/dist/kuna/KunaAddress.js +11 -0
  1095. package/dist/kuna/KunaCommand.js +217 -0
  1096. package/dist/kuna/KunaConfiguration.js +90 -0
  1097. package/dist/kuna/KunaDoctor.js +198 -0
  1098. package/dist/kuna/KunaInstallation.js +137 -0
  1099. package/dist/kuna/KunaJson.js +23 -0
  1100. package/dist/kuna/KunaJsonStream.js +433 -0
  1101. package/dist/kuna/KunaLimits.js +5 -0
  1102. package/dist/kuna/KunaProjectCache.js +804 -0
  1103. package/dist/kuna/KunaProjectExport.js +202 -0
  1104. package/dist/kuna/KunaProjectFiles.js +191 -0
  1105. package/dist/kuna/KunaProjectReader.js +115 -0
  1106. package/dist/kuna/KunaProvider.js +217 -0
  1107. package/dist/kuna/KunaProviderCapabilities.js +102 -0
  1108. package/dist/kuna/KunaQueryErrors.js +12 -0
  1109. package/dist/kuna/KunaQueryWork.js +113 -0
  1110. package/dist/kuna/KunaReferenceFiles.js +258 -0
  1111. package/dist/kuna/KunaReferenceQueries.js +211 -0
  1112. package/dist/kuna/KunaRelease.js +10 -0
  1113. package/dist/kuna/KunaRunSlots.js +56 -0
  1114. package/dist/kuna/KunaSessionClient.js +1162 -0
  1115. package/dist/kuna/KunaStringInventory.js +145 -0
  1116. package/dist/kuna/KunaStringQueries.js +133 -0
  1117. package/dist/kuna/KunaTargetCommands.js +205 -0
  1118. package/dist/kuna/KunaUnavailable.js +11 -0
  1119. package/dist/logger.js +14 -1
  1120. package/dist/main/processShutdown.js +17 -0
  1121. package/dist/main/shutdown.js +3 -0
  1122. package/dist/main/transport.js +68 -4
  1123. package/dist/main.js +16 -15
  1124. package/dist/mcp/AnalysisProvider-BABWbLoM.js +38 -0
  1125. package/dist/mcp/AnalysisSnapshotFiles-BXz0c37-.js +1423 -0
  1126. package/dist/mcp/ArtifactFileOperation-64cQKI7B.js +1704 -0
  1127. package/dist/mcp/ArtifactProvider-Dx6pmil1.js +2200 -0
  1128. package/dist/mcp/ArtifactProviderMetadata-UCJr2oZW.js +167 -0
  1129. package/dist/mcp/ArtifactReader-BrnwNaKY.js +78 -0
  1130. package/dist/mcp/ArtifactResourceScope-zi3Dkqzy.js +175 -0
  1131. package/dist/mcp/AsarHeader-B_IbppTz.js +31 -0
  1132. package/dist/mcp/BinarySessionStatus-CZ9nnXMt.js +213 -0
  1133. package/dist/mcp/BinaryTargetResolver-BUncASDP.js +1358 -0
  1134. package/dist/mcp/BoundedFileBytes-DYt5q9G2.js +43 -0
  1135. package/dist/mcp/CdpCaptureDocuments-Y2uFcBpl.js +795 -0
  1136. package/dist/mcp/CdpCaptureValues-tNIg-gQK.js +97 -0
  1137. package/dist/mcp/CdpEndpoint-BrhMhpSi.js +641 -0
  1138. package/dist/mcp/CdpOptionalCommand-PZZhlqxv.js +120 -0
  1139. package/dist/mcp/CdpTargetSession-BmmDC3XO.js +290 -0
  1140. package/dist/mcp/DirectAnalysis-B9KuCHTG.js +417 -0
  1141. package/dist/mcp/DirectAnalysisStatus-BgzopkIt.js +44 -0
  1142. package/dist/mcp/ElectronFileScope-FXtK0d6I.js +110 -0
  1143. package/dist/mcp/ElectronFuseFailures-uZ_wOV6T.js +610 -0
  1144. package/dist/mcp/MachoLoadCommandReader-C2VGgHA3.js +330 -0
  1145. package/dist/mcp/ManagedStaticProvider-CZuoPme2.js +5326 -0
  1146. package/dist/mcp/NativeMacOSProvider-CMguKrvN.js +5495 -0
  1147. package/dist/mcp/NativeMacOSProviderMetadata-B_RH4KXF.js +397 -0
  1148. package/dist/mcp/OwnedCommand-BW1jBSt9.js +1241 -0
  1149. package/dist/mcp/ProcedureAddressResolution-H6Qwpb_Y.js +59 -0
  1150. package/dist/mcp/WorkflowEvidence-CO4C7ALz.js +118 -0
  1151. package/dist/mcp/analysisErrorCleanup-Q344SnTO.js +34 -0
  1152. package/dist/mcp/analysisErrorCore-BIEP7tvF.js +509 -0
  1153. package/dist/mcp/analysisErrorProjection-B8teQwwD.js +942 -0
  1154. package/dist/mcp/artifactToolContracts-C9dRDo-D.js +74 -0
  1155. package/dist/mcp/browserObservation-DUraZs62.js +4633 -0
  1156. package/dist/mcp/browserObservationError-C5okJ5el.js +63 -0
  1157. package/dist/mcp/browserObservationSchemas-DwGGxBpu.js +573 -0
  1158. package/dist/mcp/browserScenario-BRUz7yN0.js +3415 -0
  1159. package/dist/mcp/browserScenarioCapture-CiMAsMx8.js +595 -0
  1160. package/dist/mcp/callerPath-CpPnMZyN.js +678 -0
  1161. package/dist/mcp/canonicalDigest-Bi_0_zGi.js +71 -0
  1162. package/dist/mcp/electronActiveObservation-DV0Ffy9X.js +227 -0
  1163. package/dist/mcp/electronFuses-D5SS7XXw.js +367 -0
  1164. package/dist/mcp/electronObservation-DsN-NqY1.js +621 -0
  1165. package/dist/mcp/electronObservation-wOYWwqgF.js +112 -0
  1166. package/dist/mcp/electronScenario-CYrt2zBK.js +913 -0
  1167. package/dist/mcp/emptyArraySchema-C0o2Sxwp.js +140 -0
  1168. package/dist/mcp/enhancedInputs-6CCgB3VB.js +56 -0
  1169. package/dist/mcp/javascriptRuntimeObservation-BVbhkO2-.js +693 -0
  1170. package/dist/mcp/javascriptRuntimeObservation-Cu0Yedqq.js +121 -0
  1171. package/dist/mcp/jsonSerialization-V-wWiFRE.js +152 -0
  1172. package/dist/mcp/lipo-DSTgUqL1.js +395 -0
  1173. package/dist/mcp/localPath-AxvW9aPe.js +19 -0
  1174. package/dist/mcp/logger-BGdGHadX.js +48 -0
  1175. package/dist/mcp/machoContainer-CMSxUBlK.js +605 -0
  1176. package/dist/mcp/main-Cx-Z7m_n.js +80276 -0
  1177. package/dist/mcp/main.js +6 -0
  1178. package/dist/mcp/managedToolContracts-CSlbKJP-.js +101 -0
  1179. package/dist/mcp/nativeValueTrace-BEZbDieM.js +3601 -0
  1180. package/dist/mcp/officialToolContracts-CauCcSsc.js +1432 -0
  1181. package/dist/mcp/peMachine-aP1iYnHq.js +95 -0
  1182. package/dist/mcp/pngHeader-DQ-ObyY2.js +147 -0
  1183. package/dist/mcp/propertyListKeys-BfCo0k4w.js +356 -0
  1184. package/dist/mcp/providerCleanupError-DIRHxzWo.js +125 -0
  1185. package/dist/mcp/providerIdentities--ptAh481.js +31 -0
  1186. package/dist/mcp/providerIdentity-BCQ5n5tw.js +16 -0
  1187. package/dist/mcp/providerOperationHealth-9DRSGM8N.js +71 -0
  1188. package/dist/mcp/rolldown-runtime-BjeaiXFo.js +121 -0
  1189. package/dist/mcp/safeJson-NeGfpkrI.js +25 -0
  1190. package/dist/mcp/scanCanonical-CF3ATd1V.js +3788 -0
  1191. package/dist/mcp/serverIdentity-BK0Ejd_Y.js +1507 -0
  1192. package/dist/mcp/sourceMapEnvelope-DAaRUIGj.js +94 -0
  1193. package/dist/mcp/toolContracts-BPoHQdlC.js +12414 -0
  1194. package/dist/mcp/toolOutputSchemaGroups-MJ_f-PMK.js +17730 -0
  1195. package/dist/mcp/webContentArtifact-DfGkgDcI.js +269 -0
  1196. package/dist/mcp/webRuntime-ccyhkRru.js +74 -0
  1197. package/dist/mcp/webSourceLocation-DKIum0vJ.js +13167 -0
  1198. package/dist/mcpDoctor.js +95 -70
  1199. package/dist/mcpStartupPolicy.js +20 -2
  1200. package/dist/native/AppleDispatchCoverage.js +57 -17
  1201. package/dist/native/AppleDispatchMetadata.js +82 -29
  1202. package/dist/native/AppleMachoFixups.js +208 -35
  1203. package/dist/native/AppleMachoSelection.js +30 -23
  1204. package/dist/native/AppleObjcCategories.js +13 -3
  1205. package/dist/native/AppleObjcDispatchFacets.js +95 -17
  1206. package/dist/native/AppleObjcProperties.js +61 -17
  1207. package/dist/native/AppleObjcProtocols.js +25 -7
  1208. package/dist/native/AppleSwiftVtables.js +2 -0
  1209. package/dist/native/CommandRunner.js +146 -32
  1210. package/dist/native/LldbCallTracer.js +235 -179
  1211. package/dist/native/LldbReadbackFiles.js +70 -0
  1212. package/dist/native/LldbRetainedObservations.js +28 -56
  1213. package/dist/native/MachoArchitectureSelection.js +50 -0
  1214. package/dist/native/NativeCallObservation.js +55 -53
  1215. package/dist/native/NativeCallTarget.js +95 -0
  1216. package/dist/native/NativeMacOSProvider.js +318 -188
  1217. package/dist/native/NativeMachoInspection.js +155 -81
  1218. package/dist/native/NativePlistSource.js +179 -0
  1219. package/dist/native/NativeUiCleanupError.js +30 -0
  1220. package/dist/native/NativeUiHelperRuntime.js +48 -35
  1221. package/dist/native/NativeUiObservation.js +69 -47
  1222. package/dist/native/SignatureTargetBinding.js +147 -65
  1223. package/dist/native/parsers/codesign.js +27 -10
  1224. package/dist/native/parsers/demangle.js +22 -12
  1225. package/dist/native/parsers/dyldInfo.js +73 -4
  1226. package/dist/native/parsers/lipo.js +53 -19
  1227. package/dist/native/parsers/machoUuid.js +150 -0
  1228. package/dist/native/parsers/otool.js +275 -32
  1229. package/dist/native/parsers/plist.js +40 -25
  1230. package/dist/native/pe/PeResourceLayout.js +22 -7
  1231. package/dist/native/pe/PeResourceParser.js +10 -9
  1232. package/dist/native/pe/PeResourcesProvider.js +76 -15
  1233. package/dist/native/pwndbg/CoreFileMappingAuthority.js +51 -0
  1234. package/dist/native/pwndbg/PwndbgCoreContext.js +39 -28
  1235. package/dist/native/pwntools/PwntoolsDecoder.js +339 -52
  1236. package/dist/native/pwntools/PwntoolsFailures.js +19 -4
  1237. package/dist/native/pwntools/PwntoolsInputLimit.js +27 -0
  1238. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +38 -16
  1239. package/dist/native/pwntools/PwntoolsResourceLimits.js +3 -3
  1240. package/dist/native/pwntools/RecordedCrashSourceBindings.js +12 -8
  1241. package/dist/native/pwntools/RecordedCrashStructureBindings.js +3 -1
  1242. package/dist/objdump/ObjdumpCommand.js +24 -0
  1243. package/dist/pcap/PcapCommand.js +146 -0
  1244. package/dist/pcap/PcapConfiguration.js +93 -0
  1245. package/dist/pcap/PcapNativeBound.js +58 -0
  1246. package/dist/pcap/PcapOutput.js +276 -0
  1247. package/dist/pcap/PcapProvider.js +454 -0
  1248. package/dist/pcap/PcapSnapshot.js +191 -0
  1249. package/dist/process/ArtifactAnalysisResources.js +306 -0
  1250. package/dist/process/BoundedFileBytes.js +8 -3
  1251. package/dist/process/CurrentEntrypointPath.js +8 -0
  1252. package/dist/process/DarwinProcessRunTokenReader.js +276 -61
  1253. package/dist/process/DetachedPgpSignature.js +57 -0
  1254. package/dist/process/ExecFileBoundedOutput.js +44 -0
  1255. package/dist/process/ExecFileOutput.js +44 -17
  1256. package/dist/{hopper/HopperTargetLease.js → process/HopperLease.js} +76 -19
  1257. package/dist/process/JavaScriptWorkerMemoryLimit.js +25 -0
  1258. package/dist/process/LinuxResourceLimits.js +60 -0
  1259. package/dist/process/MacCodeSignature.js +3 -0
  1260. package/dist/process/OwnedCommand.js +144 -25
  1261. package/dist/process/PrivateRuntimeRoot.js +9 -19
  1262. package/dist/process/PrivateRuntimeRootUnavailableError.js +10 -0
  1263. package/dist/process/ProcessOwnership.js +70 -17
  1264. package/dist/process/ProcessOwnershipObservation.js +35 -4
  1265. package/dist/process/ProviderDeadline.js +58 -12
  1266. package/dist/process/ProviderProcess.js +233 -17
  1267. package/dist/process/RegexMatcher.js +96 -0
  1268. package/dist/process/SharedStartupAttempt.js +59 -0
  1269. package/dist/process/WindowsAuthority.js +48 -39
  1270. package/dist/process/WindowsBatchCommand.js +46 -0
  1271. package/dist/process/boundedUtf8Text.js +13 -0
  1272. package/dist/process/capture/FilesystemSnapshot.js +63 -11
  1273. package/dist/process/capture/ProcessCaptureClock.js +2 -0
  1274. package/dist/process/capture/ProcessCaptureError.js +64 -7
  1275. package/dist/process/capture/ProcessCaptureJournal.js +2 -1
  1276. package/dist/process/capture/ProcessCaptureLifecycle.js +104 -56
  1277. package/dist/process/capture/ProcessCaptureProgress.js +7 -4
  1278. package/dist/process/capture/ProcessHarness.js +34 -17
  1279. package/dist/process/capture/ProcessNormalization.js +278 -36
  1280. package/dist/process/capture/ProcessSampling.js +3 -2
  1281. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +13 -13
  1282. package/dist/process/capture/TerminalRenderer.js +31 -10
  1283. package/dist/process/ownedDebuggerSession.js +203 -0
  1284. package/dist/process/snapshotEnvironment.js +8 -8
  1285. package/dist/{application/binary → providers}/AnalysisClientCleanup.js +3 -3
  1286. package/dist/providers/AnalysisClientCreation.js +193 -0
  1287. package/dist/providers/AnalysisClientFailure.js +191 -0
  1288. package/dist/providers/DeferredAnalysisClient.js +48 -0
  1289. package/dist/providers/OwnedCommandCleanup.js +65 -0
  1290. package/dist/providers/ProviderInspectionScope.js +10 -0
  1291. package/dist/recordedCatalogDigests.js +2 -0
  1292. package/dist/reference/ReferenceSourceReader.js +64 -1
  1293. package/dist/reference/ReferenceSourceReaderEntries.js +79 -56
  1294. package/dist/reference/ReferenceSourceReaderErrors.js +5 -1
  1295. package/dist/reference/ReferenceSourceReaderFile.js +2 -2
  1296. package/dist/reference/ReferenceSourceReaderTypes.js +1 -2
  1297. package/dist/reference/ReferenceSourceReaderValidate.js +0 -1
  1298. package/dist/rizin/RizinCommand.js +14 -0
  1299. package/dist/rizin/RizinDebugSessionManager.js +1111 -0
  1300. package/dist/rust/RustAuditableReader.js +309 -0
  1301. package/dist/rust/RustBinaryImage.js +116 -0
  1302. package/dist/rust/RustBinaryProvider.js +194 -0
  1303. package/dist/server/EvidenceMcpServer.js +160 -37
  1304. package/dist/server/admittedToolOperation.js +7 -2
  1305. package/dist/server/contractToolHandler.js +17 -4
  1306. package/dist/server/createServer.js +179 -30
  1307. package/dist/server/externalMutationAdmission.js +50 -0
  1308. package/dist/server/mcpProgress.js +4 -2
  1309. package/dist/server/promptCompletion.js +43 -28
  1310. package/dist/server/providerEnvironment.js +3 -0
  1311. package/dist/server/registerAnalysisViewTool.js +6 -2
  1312. package/dist/server/registerAndroidTools.js +22 -4
  1313. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +8 -1
  1314. package/dist/server/registerArtifactComparisonTool.js +13 -2
  1315. package/dist/server/registerArtifactTools.js +21 -1
  1316. package/dist/server/registerBrowserScenarioTool.js +7 -5
  1317. package/dist/server/registerBrowserTools.js +4 -8
  1318. package/dist/server/registerBundleComparisonTool.js +4 -4
  1319. package/dist/server/registerCaptureTools.js +12 -0
  1320. package/dist/server/registerCutterTools.js +32 -0
  1321. package/dist/server/registerElectronTools.js +13 -21
  1322. package/dist/server/registerEnhancedTools.js +7 -6
  1323. package/dist/server/registerEvidenceTools.js +14 -10
  1324. package/dist/server/registerEvmTools.js +22 -4
  1325. package/dist/server/registerFlutterTools.js +17 -0
  1326. package/dist/server/registerFridaTools.js +201 -0
  1327. package/dist/server/registerFunctionComparisonTool.js +29 -9
  1328. package/dist/server/registerGdbTools.js +64 -0
  1329. package/dist/server/registerGoTools.js +9 -0
  1330. package/dist/server/registerInvestigationTools/helpers.js +2 -2
  1331. package/dist/server/registerInvestigationTools.js +31 -27
  1332. package/dist/server/registerJavaScriptRuntimeObservationTools.js +3 -9
  1333. package/dist/server/registerManagedTools.js +11 -1
  1334. package/dist/server/registerManagedWorkflowTools/evidence.js +14 -7
  1335. package/dist/server/registerNativeTools.js +14 -0
  1336. package/dist/server/registerOfficialTools.js +5 -0
  1337. package/dist/server/registerPcapTools.js +35 -0
  1338. package/dist/server/registerProcessComparisonTool.js +12 -2
  1339. package/dist/server/registerReverseEngineeringTools.js +86 -0
  1340. package/dist/server/registerRizinDebugTools.js +53 -0
  1341. package/dist/server/registerRustTools.js +9 -0
  1342. package/dist/server/registerSessionRecordTools.js +19 -13
  1343. package/dist/server/registerSessionStatusTool.js +33 -8
  1344. package/dist/server/registerSessionTools.js +31 -31
  1345. package/dist/server/registerSignalTools.js +12 -0
  1346. package/dist/server/registerSqliteTools.js +9 -0
  1347. package/dist/server/registerWasmTools.js +46 -0
  1348. package/dist/server/registerWebNetworkCaptureTool.js +24 -10
  1349. package/dist/server/retainedSummaryDelivery.js +28 -0
  1350. package/dist/server/runDerivedOperation.js +2 -0
  1351. package/dist/server/sessionAvailabilityPolicy.js +3 -0
  1352. package/dist/server/toolRegistrationOptions.js +8 -0
  1353. package/dist/server/toolResult.js +52 -19
  1354. package/dist/server/toolResultEncoding.js +36 -3
  1355. package/dist/serverIdentity.js +17 -8
  1356. package/dist/signals/SigrokRecordingProvider.js +346 -0
  1357. package/dist/signals/parseDecoderDiscovery.js +65 -0
  1358. package/dist/sqlite/SqliteDatabaseFailures.js +147 -0
  1359. package/dist/sqlite/SqliteDatabaseInspection.js +436 -0
  1360. package/dist/sqlite/SqliteDatabaseLimits.js +16 -0
  1361. package/dist/sqlite/SqliteDatabaseProvider.js +295 -0
  1362. package/dist/sqlite/SqliteDatabaseSnapshot.js +182 -0
  1363. package/dist/sqlite/SqliteDatabaseWorker.js +46 -0
  1364. package/dist/sqlite/SqliteDatabaseWorkerExecution.js +127 -0
  1365. package/dist/wasm/WabtArtifactProvider.js +358 -0
  1366. package/dist/wasm/WabtFailures.js +119 -0
  1367. package/dist/wasm/WabtInterface.js +309 -0
  1368. package/dist/wasm/WabtOutput.js +60 -0
  1369. package/dist/wasm/WabtRelease.js +12 -0
  1370. package/dist/wasm/WabtRuntime.js +58 -0
  1371. package/dist/wasm/WabtString.js +48 -0
  1372. package/dist/wasm/WabtWat.js +147 -0
  1373. package/dist/wasm/WasmGlueAdapter.js +66 -0
  1374. package/dist/wasm/WasmInterfaceBudget.js +11 -0
  1375. package/dist/windows/WindowsNativeLoader.js +53 -9
  1376. package/dist/windows/WindowsOwnedProcess.js +150 -17
  1377. package/dist/windows/WindowsPrivateRuntime.js +66 -2
  1378. package/install.sh +157 -98
  1379. package/licenses/Apache-2.0.txt +202 -0
  1380. package/licenses/GCC-Runtime-Library-Exception-3.1.txt +73 -0
  1381. package/licenses/GPL-3.0.txt +674 -0
  1382. package/licenses/LGPL-2.0.txt +480 -0
  1383. package/licenses/MIT-template.txt +18 -0
  1384. package/licenses/MinGW-w64-runtime.txt +240 -0
  1385. package/licenses/Node-22.19.0-LICENSE.txt +2666 -0
  1386. package/licenses/README.md +68 -0
  1387. package/licenses/cfworker-MIT.txt +21 -0
  1388. package/licenses/dotnet-runtime-MIT.txt +23 -0
  1389. package/licenses/frida-17.23.2-COPYING.txt +50 -0
  1390. package/licenses/ghidra-12.1.4-DISCLAIMER.txt +13 -0
  1391. package/licenses/ghidra-12.1.4-LICENSE.txt +201 -0
  1392. package/licenses/ghidra-12.1.4-NOTICE.txt +49 -0
  1393. package/licenses/npm-dependencies.txt +3757 -0
  1394. package/licenses/npm-runtime-notices.txt +8722 -0
  1395. package/licenses/upstream-sources.json +72 -0
  1396. package/licenses/xterm-MIT.txt +21 -0
  1397. package/native/windows/README.md +130 -12
  1398. package/native/windows/build/manifest.json +2 -2
  1399. package/native/windows/build/rea-windows-x64.node +0 -0
  1400. package/package.json +97 -22
  1401. package/scripts/electron-active-hook-boundaries.cjs +15 -2
  1402. package/scripts/electron-active-hook.cjs +412 -47
  1403. package/scripts/hopper-demo-x11.py +65 -13
  1404. package/scripts/prepack.mjs +5 -0
  1405. package/scripts/rea-android-workspace-guardian.mjs +46 -0
  1406. package/scripts/rea.mjs +89 -26
  1407. package/scripts/verify-windows-native-artifact.mjs +2 -2
  1408. package/skills/reverse-engineer-anything/SKILL.md +146 -11
  1409. package/skills/reverse-engineer-anything/references/android-applications.md +3 -1
  1410. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +10 -10
  1411. package/skills/reverse-engineer-anything/references/evidence-workflows.md +23 -0
  1412. package/skills/reverse-engineer-anything/references/javascript-applications.md +72 -3
  1413. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +149 -19
  1414. package/skills/reverse-engineer-anything/references/runtime-observation.md +57 -7
  1415. package/third_party/README.md +1 -1
  1416. package/third_party/wabt/README.md +24 -0
  1417. package/dist/browser/history/HarCaptureAdapter.js +0 -20
  1418. package/dist/cli/streamedJsonOutput.js +0 -135
  1419. package/dist/hopper/HopperRegexWorker.js +0 -27
  1420. /package/dist/{application/binary → process}/AbortablePromise.js +0 -0
@@ -1,27 +1,39 @@
1
- import { execFile } from "node:child_process";
2
1
  import { createHash } from "node:crypto";
3
2
  import { constants as fsConstants } from "node:fs";
4
- import { access, lstat, mkdir, rm, stat, writeFile } from "node:fs/promises";
5
- import { basename, join, resolve } from "node:path";
3
+ import { access, copyFile, lstat, link, mkdtemp, mkdir, open, rmdir, rm, stat, writeFile, } from "node:fs/promises";
4
+ import { basename, dirname, extname, join, resolve } from "node:path";
5
+ import { providerConfigurationRefusal } from "../domain/providerConfigurationRefusal.js";
6
6
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
7
- import { AnalysisArtifactChangedError, AnalysisCapabilityUnavailableError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, AnalysisProtocolError, AnalysisResourceConstraintError, AnalysisTimeoutError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
7
+ import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
8
+ import { ArtifactResourceRetryFailure, ArtifactResourceScope, } from "../artifacts/ArtifactResourceScope.js";
9
+ import { AnalysisCleanupLease, AnalysisCleanupLeaseGroup, } from "../artifacts/AnalysisCleanupLease.js";
10
+ import { adbResultSchemas } from "../domain/adb/adbDeviceAnalysis.js";
11
+ import { AnalysisCapabilityUnavailableError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, AnalysisProtocolError, AnalysisResourceConstraintError, AnalysisTimeoutError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
8
12
  import { AnalysisError } from "../domain/analysisErrorBase.js";
9
13
  import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
10
14
  import { err, ok } from "../domain/result.js";
11
- import { hashStableFile } from "../filesystem/StableFileHash.js";
15
+ import { jsonObjectSchema } from "../domain/jsonValue.js";
16
+ import { hashStableFile, stableFileHashCause, } from "../filesystem/StableFileHash.js";
17
+ import { regularFileCancellation, RegularFileCancelled, RegularFileCleanupFailure, } from "../filesystem/OwnedRegularFile.js";
18
+ import { RegularFileOperationCancelled } from "../filesystem/RegularFile.js";
19
+ import { OwnedFileHandle } from "../filesystem/OwnedFileHandle.js";
20
+ import { createEvidence } from "../domain/evidence.js";
21
+ import { PrivateRuntimeRoot, } from "../process/PrivateRuntimeRoot.js";
12
22
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
13
- import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
23
+ import { PrivateRuntimeRootUnavailableError } from "../process/PrivateRuntimeRootUnavailableError.js";
24
+ import { adbArguments, runAdb, runAdbCapture, packageChangeRefusal, probeAdbPathExistence, } from "./AdbCommand.js";
14
25
  import { AdbConfigurationFailure, adbConfigurationAvailability, inspectAdbClient, resolveAdbBinary, } from "./AdbConfiguration.js";
15
- import { parseAdbDevicesOutput, parseGetpropOutput, parsePackageListOutput, parsePmPathOutput, } from "./AdbDeviceOutput.js";
16
- import { parseAmStartOutput, parseBugreportCopiedPath, parseDumpsysPackageOutput, parseFeatureListOutput, parseLsOutput, parsePackageChangeOutput, parseProcessListOutput, parsePngDimensions, parseResolveActivityOutput, parseServiceListOutput, parseSettingsGetOutput, parseWindowFocusOutput, parseWmDensityOutput, parseWmSizeOutput, } from "./AdbShellOutput.js";
26
+ import { displayDevicePath, parseAdbDevicesOutput, parseGetpropOutput, parsePackageListOutput, parsePmPathOutput, } from "./AdbDeviceOutput.js";
27
+ import { adbHostFileName } from "./AdbHostFileName.js";
28
+ import { AdbInputSnapshotFailure, snapshotAdbInput, } from "./AdbInputSnapshot.js";
29
+ import { ADB_DIRECTORY_BATCH_SCRIPT, parseAdbDirectoryListing, } from "./AdbDirectoryListing.js";
30
+ import { parseAmStartOutput, parseBugreportCopiedPath, parseDumpsysPackageOutput, parseFeatureListOutput, parsePackageChangeOutput, parseProcessListOutput, parsePngDimensions, parseResolveActivityOutput, parseServiceListOutput, parseSettingsGetOutput, parseWindowFocusOutput, parseWmDensityOutput, parseWmSizeOutput, } from "./AdbShellOutput.js";
17
31
  /** Stable identity for the ADB device-acquisition provider. */
18
32
  export const ADB_PROVIDER_IDENTITY = {
19
33
  id: "adb",
20
34
  name: "Android Debug Bridge",
21
35
  version: null,
22
36
  };
23
- const VERSION_TIMEOUT_MS = 10_000;
24
- const VERSION_MAX_OUTPUT_BYTES = 64 * 1024;
25
37
  const DEVICES_TIMEOUT_MS = 20_000;
26
38
  const DEVICES_MAX_OUTPUT_BYTES = 1024 * 1024;
27
39
  const SHELL_TIMEOUT_MS = 30_000;
@@ -45,104 +57,164 @@ const SCREEN_TIMEOUT_MS = 60_000;
45
57
  const SCREEN_MAX_OUTPUT_BYTES = 32 * 1024 * 1024;
46
58
  const BUGREPORT_TIMEOUT_MS = 600_000;
47
59
  const BUGREPORT_MAX_OUTPUT_BYTES = 1024 * 1024;
48
- const STDERR_EXCERPT_BYTES = 512;
49
60
  const UNPARSED_LINES_REPORTED = 10;
50
- const STOP_GRACE_MS = 5_000;
51
- const hashAdbFile = async (path, operation, signal) => {
61
+ /** Carry the exact digest owner through caller-specific partial-result mapping. */
62
+ class AdbDigestFailure extends Error {
63
+ fileFailure;
64
+ bindCleanupError;
65
+ constructor(fileFailure, bindCleanupError) {
66
+ super(fileFailure.message, { cause: fileFailure });
67
+ this.fileFailure = fileFailure;
68
+ this.bindCleanupError = bindCleanupError;
69
+ }
70
+ }
71
+ const hashAdbFile = async (path, operation, signal, resources) => {
72
+ let closeLease;
52
73
  try {
53
- return await hashStableFile(path, signal);
74
+ return await hashStableFile(path, {
75
+ ...(signal === undefined ? {} : { signal }),
76
+ retainFailedClose: (handle) => {
77
+ closeLease = new AnalysisCleanupLease(() => handle.close(), [path]);
78
+ resources.retain({
79
+ kind: "lease",
80
+ resource: `${path} (ADB digest handle)`,
81
+ lease: closeLease,
82
+ });
83
+ },
84
+ });
54
85
  }
55
86
  catch (cause) {
56
- if (signal?.aborted === true)
57
- throw new AnalysisCancelledError(operation, { cause });
87
+ if (cause instanceof RegularFileCleanupFailure ||
88
+ cause instanceof RegularFileCancelled)
89
+ throw new AdbDigestFailure(cause, (error) => {
90
+ closeLease?.bindCleanupError(error);
91
+ });
92
+ if (cause instanceof RegularFileOperationCancelled)
93
+ throw new AnalysisCancelledError(operation, { cause: cause.reason });
58
94
  throw cause;
59
95
  }
60
96
  };
61
- /** adb joins shell operands into a remote POSIX command; quote at that boundary. */
62
- const quoteShellOperand = (value) => /^[A-Za-z0-9_./:=@+,-]+$/u.test(value)
63
- ? value
64
- : "'" + value.replaceAll("'", "'\\''") + "'";
65
- const adbArguments = (serial, arguments_) => {
66
- const operands = arguments_[0] === "shell"
67
- ? ["shell", ...arguments_.slice(1).map(quoteShellOperand)]
68
- : [...arguments_];
69
- return serial === undefined ? operands : ["-s", serial, ...operands];
97
+ const adbDigestError = (cause, operation, partialObservation) => {
98
+ if (!(cause instanceof AdbDigestFailure))
99
+ return undefined;
100
+ const digestFailure = cause.fileFailure;
101
+ const digestOutcome = digestFailure.outcome;
102
+ if (digestOutcome.kind === "completed")
103
+ partialObservation = partialObservationWithDigest(partialObservation, digestOutcome.value);
104
+ if (digestFailure instanceof RegularFileCancelled)
105
+ return new AnalysisCancelledError(operation, {
106
+ cause: digestFailure.reason,
107
+ partialObservation,
108
+ });
109
+ const resource = `${digestFailure.path} (ADB digest handle)`;
110
+ const reason = digestFailure.cleanupCause instanceof Error
111
+ ? digestFailure.cleanupCause.message
112
+ : String(digestFailure.cleanupCause);
113
+ const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [resource], { reason }, {
114
+ operation,
115
+ cause: digestFailure,
116
+ partialObservation,
117
+ });
118
+ const primaryCause = digestOutcome.kind === "failed" ? digestOutcome.cause : undefined;
119
+ const cancellation = regularFileCancellation(digestFailure);
120
+ if (cancellation !== undefined) {
121
+ const error = new AnalysisCancelledError(operation, {
122
+ cause: cancellation.reason,
123
+ cleanup: { reason, resources: [resource] },
124
+ partialObservation,
125
+ });
126
+ cause.bindCleanupError(error);
127
+ return error;
128
+ }
129
+ const primary = primaryCause instanceof AnalysisError
130
+ ? primaryCause
131
+ : new AnalysisOutputError(operation, `The pulled file could not be fully digested or its handle could not be closed: ${digestFailure.path}`, {
132
+ cause: digestOutcome.kind === "failed" ? primaryCause : digestFailure,
133
+ partialObservation,
134
+ });
135
+ primary.retainPartialObservation(partialObservation);
136
+ const error = analysisErrorWithCleanupFailure(primary, cleanup, operation);
137
+ cause.bindCleanupError(error);
138
+ return error;
70
139
  };
71
- /** Run one bounded adb invocation and keep its exact failure shape. */
72
- const runAdb = async (operation, targetPath, binary, arguments_, limits, signal) => {
73
- if (signal?.aborted === true)
74
- return err(new AnalysisCancelledError(operation));
140
+ const partialObservationWithDigest = (observation, digest) => {
141
+ if (observation.operation === "pull_adb_file") {
142
+ const { result } = observation;
143
+ if (!("digest_status" in result))
144
+ return observation;
145
+ return {
146
+ ...observation,
147
+ result: {
148
+ client: result.client,
149
+ serial: result.serial,
150
+ local_path: result.local_path,
151
+ device_path: result.device_path,
152
+ bytes: digest.bytes,
153
+ sha256: digest.sha256,
154
+ },
155
+ };
156
+ }
157
+ if (observation.operation === "collect_adb_bugreport") {
158
+ const { result } = observation;
159
+ if (!("digest_status" in result))
160
+ return observation;
161
+ return {
162
+ ...observation,
163
+ result: {
164
+ client: result.client,
165
+ serial: result.serial,
166
+ local_path: result.local_path,
167
+ adb_reported_path: result.adb_reported_path,
168
+ bytes: digest.bytes,
169
+ sha256: digest.sha256,
170
+ },
171
+ };
172
+ }
173
+ return observation;
174
+ };
175
+ const syncStagedAdbFile = async (path, resources, operation) => {
176
+ let owner;
177
+ let primary;
75
178
  try {
76
- return ok(await execFileOutput(binary, arguments_, {
77
- timeout: limits.timeoutMs,
78
- maxBuffer: limits.maxOutputBytes,
79
- stopSignal: "SIGTERM",
80
- ...(signal === undefined ? {} : { signal }),
81
- }));
179
+ owner = new OwnedFileHandle(await open(path, "r+"));
180
+ await owner.handle.sync();
82
181
  }
83
182
  catch (cause) {
84
- if (signal?.aborted || execFileOutputFailure(cause)?.code === "ABORT_ERR")
85
- return err(new AnalysisCancelledError(operation, { cause }));
86
- const failure = execFileOutputFailure(cause);
87
- if (failure === undefined)
88
- return err(new AnalysisProtocolError(`adb failed for ${operation}`, { cause }));
89
- if (failure.outputTruncated)
90
- return err(new AnalysisResourceConstraintError(operation, "memory", `adb output exceeded the ${String(limits.maxOutputBytes)}-byte capture budget`, { max_output_bytes: limits.maxOutputBytes }, { cause }));
91
- const excerpt = failure.stderr.trim().slice(0, STDERR_EXCERPT_BYTES);
92
- if (/unauthorized/iu.test(excerpt))
93
- return err(new AnalysisUnsupportedTargetError(operation, targetPath, excerpt, {
94
- cause,
95
- }));
96
- if (/device[^\n]*not found|device offline|still authorizing|more than one device/iu.test(excerpt))
97
- return err(new AnalysisUnsupportedTargetError(operation, targetPath, excerpt, {
98
- cause,
99
- }));
100
- if (/No such file or directory|Permission denied|read: Permission denied/iu.test(excerpt))
101
- return err(new AnalysisUnsupportedTargetError(operation, targetPath, excerpt, {
102
- cause,
103
- }));
104
- if (failure.killed)
105
- return err(new AnalysisTimeoutError(operation, limits.timeoutMs, { cause }));
106
- return err(new AnalysisProtocolError(excerpt === ""
107
- ? `adb exited with code ${String(failure.code)} for ${operation}`
108
- : excerpt, { cause }));
183
+ primary = cause;
109
184
  }
110
- };
111
- /** Capture one adb invocation's raw binary stdout (screencap PNG). */
112
- const runAdbBinary = (operation, binary, arguments_, limits, signal) => new Promise((settle) => {
113
- if (signal?.aborted === true)
114
- return settle(err(new AnalysisCancelledError(operation)));
115
- let stopped;
116
- let deadline;
117
- let grace;
118
- const child = execFile(binary, [...arguments_], {
119
- encoding: "buffer",
120
- maxBuffer: limits.maxOutputBytes,
121
- killSignal: "SIGTERM",
122
- timeout: 0,
123
- }, (error, stdout) => {
124
- signal?.removeEventListener("abort", onAbort);
125
- clearTimeout(deadline);
126
- clearTimeout(grace);
127
- if (stopped === "abort")
128
- return settle(err(new AnalysisCancelledError(operation)));
129
- if (stopped === "timeout")
130
- return settle(err(new AnalysisTimeoutError(operation, limits.timeoutMs)));
131
- if (error !== null)
132
- return settle(err(new AnalysisProtocolError(`adb failed for ${operation}: ${error.message}`, { cause: error })));
133
- settle(ok(stdout));
185
+ if (owner === undefined) {
186
+ if (primary !== undefined)
187
+ throw primary;
188
+ return;
189
+ }
190
+ const resource = `${path} (ADB staged-output handle)`;
191
+ const stagedOwner = owner;
192
+ const closeLease = new AnalysisCleanupLease(() => stagedOwner.close(), [resource]);
193
+ const released = await resources.release({
194
+ kind: "lease",
195
+ resource,
196
+ lease: closeLease,
134
197
  });
135
- const stop = (reason) => {
136
- if (stopped !== undefined)
137
- return;
138
- stopped = reason;
139
- child.kill("SIGTERM");
140
- grace = setTimeout(() => child.kill("SIGKILL"), STOP_GRACE_MS);
141
- };
142
- const onAbort = () => stop("abort");
143
- signal?.addEventListener("abort", onAbort, { once: true });
144
- deadline = setTimeout(() => stop("timeout"), limits.timeoutMs);
145
- });
198
+ if (released.kind === "failed") {
199
+ const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [resource], {
200
+ reason: released.cause instanceof Error
201
+ ? released.cause.message
202
+ : String(released.cause),
203
+ }, { operation, cause: released.cause });
204
+ let reported;
205
+ if (primary !== undefined) {
206
+ const failure = new AnalysisOutputError(operation, `The staged ADB output could not be synchronized: ${path}`, { cause: primary });
207
+ reported = analysisErrorWithCleanupFailure(failure, cleanup, operation);
208
+ }
209
+ else {
210
+ reported = cleanup;
211
+ }
212
+ closeLease.bindCleanupError(reported);
213
+ throw reported;
214
+ }
215
+ if (primary !== undefined)
216
+ throw primary;
217
+ };
146
218
  const clientIdentityResult = (selection, identity) => ({
147
219
  binary_path: selection.binary,
148
220
  path_source: selection.pathSource,
@@ -175,9 +247,157 @@ const refuseExistingTarget = async (operation, path) => {
175
247
  return new AnalysisOutputError(operation, `The output file already exists: ${path}`);
176
248
  return undefined;
177
249
  };
178
- const removeOwnedPackageDirectory = async (path, identity) => {
250
+ const hardLinksUnsupported = (cause) => cause instanceof Error &&
251
+ "code" in cause &&
252
+ ["EPERM", "EOPNOTSUPP", "ENOTSUP", "ENOSYS", "EXDEV"].includes(String(cause.code));
253
+ const describeAdbFailure = (cause) => cause instanceof Error ? cause.message : String(cause);
254
+ /** Exclusive-create fallback for filesystems that cannot hard-link staged files. */
255
+ const publishScreenExclusively = async (outputPath, bytes, resources, operation, signal) => {
256
+ if (signal?.aborted === true)
257
+ throw new AnalysisCancelledError(operation, { cause: signal.reason });
258
+ const output = await open(outputPath, "wx", 0o600);
259
+ // Successful exclusive creation is this fallback's cutoff. Finish and sync
260
+ // the visible file despite later cancellation so its receipt remains known.
261
+ const ownedOutput = new OwnedFileHandle(output);
262
+ const handleResource = `${outputPath} (ADB publication handle)`;
263
+ const closeOnly = new AnalysisCleanupLease(() => ownedOutput.close(), [handleResource]);
264
+ const removeOutput = async (expected) => {
265
+ let current;
266
+ try {
267
+ current = await lstat(outputPath);
268
+ }
269
+ catch (cause) {
270
+ if (cause instanceof Error && Reflect.get(cause, "code") === "ENOENT")
271
+ return;
272
+ throw cause;
273
+ }
274
+ if (current.dev !== expected.dev ||
275
+ current.ino !== expected.ino ||
276
+ current.mode !== expected.mode)
277
+ throw new Error(`The screen output changed before cleanup: ${outputPath}`);
278
+ await rm(outputPath);
279
+ };
280
+ let rollbackIdentity;
281
+ const inspectCloseAndRollback = new AnalysisCleanupLease(async () => {
282
+ rollbackIdentity ??= await output.stat();
283
+ await ownedOutput.close();
284
+ await removeOutput(rollbackIdentity);
285
+ });
286
+ let identity;
287
+ try {
288
+ identity = await output.stat();
289
+ }
290
+ catch (cause) {
291
+ resources.retain({
292
+ kind: "lease",
293
+ resource: `${outputPath} (screen output and descriptor)`,
294
+ lease: inspectCloseAndRollback,
295
+ });
296
+ const error = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [handleResource, outputPath], {
297
+ reason: "The newly created screen output identity could not be established; its descriptor remains owned for cleanup retry",
298
+ }, { operation, cause });
299
+ inspectCloseAndRollback.bindCleanupError(error);
300
+ throw error;
301
+ }
302
+ let writeFailure;
303
+ try {
304
+ await output.writeFile(bytes);
305
+ await output.sync();
306
+ }
307
+ catch (cause) {
308
+ writeFailure = { cause };
309
+ }
310
+ if (writeFailure === undefined) {
311
+ try {
312
+ await ownedOutput.close();
313
+ return undefined;
314
+ }
315
+ catch (cause) {
316
+ resources.retain({
317
+ kind: "lease",
318
+ resource: handleResource,
319
+ lease: closeOnly,
320
+ });
321
+ return {
322
+ cause,
323
+ resource: handleResource,
324
+ bindCleanupError(error) {
325
+ closeOnly.bindCleanupError(error);
326
+ },
327
+ };
328
+ }
329
+ }
330
+ const rollback = new AnalysisCleanupLease(async () => {
331
+ await ownedOutput.close();
332
+ await removeOutput(identity);
333
+ });
334
+ try {
335
+ await ownedOutput.close();
336
+ }
337
+ catch (closeCause) {
338
+ resources.retain({ kind: "lease", resource: outputPath, lease: rollback });
339
+ const error = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [outputPath], { reason: describeAdbFailure(closeCause) }, {
340
+ operation,
341
+ cause: new AggregateError([writeFailure.cause, closeCause], "Screen output write and descriptor cleanup failed", { cause: writeFailure.cause }),
342
+ });
343
+ rollback.bindCleanupError(error);
344
+ throw error;
345
+ }
346
+ const removed = await resources.release({
347
+ kind: "lease",
348
+ resource: outputPath,
349
+ lease: rollback,
350
+ });
351
+ if (removed.kind === "failed") {
352
+ const error = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [outputPath], { reason: describeAdbFailure(removed.cause) }, {
353
+ operation,
354
+ cause: new AggregateError([writeFailure.cause, removed.cause], "Screen output write and rollback failed", { cause: writeFailure.cause }),
355
+ });
356
+ rollback.bindCleanupError(error);
357
+ throw error;
358
+ }
359
+ throw writeFailure.cause;
360
+ };
361
+ const cancellationWithCleanupFailure = (primary, cleanup, resources) => new AnalysisCancelledError(primary.operation, {
362
+ cause: new AggregateError([primary, cleanup], "ADB cancellation cleanup failed", { cause: primary }),
363
+ diagnostics: primary.diagnostics,
364
+ ...(primary.capturedOutput === undefined
365
+ ? {}
366
+ : { capturedOutput: primary.capturedOutput }),
367
+ cleanup: {
368
+ reason: [primary.cleanup?.reason, cleanup.message]
369
+ .filter((reason) => reason !== undefined)
370
+ .join("; "),
371
+ resources: [...new Set([...primary.cleanupResources, ...resources])],
372
+ },
373
+ partialObservation: primary.partialObservation,
374
+ });
375
+ /** Publish an ADB-produced archive without replacing an existing caller file. */
376
+ const publishBugreport = async (source, directory) => {
377
+ const fileName = basename(source);
378
+ const extension = extname(fileName);
379
+ const stem = extension === "" ? fileName : fileName.slice(0, -extension.length);
380
+ for (let suffix = 0;; suffix += 1) {
381
+ const destination = join(directory, suffix === 0 ? fileName : `${stem} (${String(suffix)})${extension}`);
382
+ try {
383
+ await copyFile(source, destination, fsConstants.COPYFILE_EXCL);
384
+ return destination;
385
+ }
386
+ catch (cause) {
387
+ if (cause instanceof Error && "code" in cause && cause.code === "EEXIST")
388
+ continue;
389
+ throw cause;
390
+ }
391
+ }
392
+ };
393
+ /** A root lease releases its children before removing their containing root. */
394
+ const runtimeRootLease = (root, children) => new AnalysisCleanupLease(async () => {
395
+ await children.close();
396
+ await root.close();
397
+ });
398
+ const removeOwnedOutputDirectory = async (path, identity) => {
179
399
  if (identity === undefined)
180
- throw new Error(`Cannot verify the created package directory identity; refusing to remove ${path}`);
400
+ throw new Error(`Cannot verify the created output directory identity; refusing to remove ${path}`);
181
401
  let current;
182
402
  try {
183
403
  current = await lstat(path);
@@ -192,9 +412,82 @@ const removeOwnedPackageDirectory = async (path, identity) => {
192
412
  current.dev !== identity.dev ||
193
413
  current.ino !== identity.ino ||
194
414
  current.mode !== identity.mode)
195
- throw new Error(`The created package directory was replaced or changed; refusing to remove ${path}`);
415
+ throw new Error(`The created output directory was replaced or changed; refusing to remove ${path}`);
196
416
  await rm(path, { recursive: true, force: true });
197
417
  };
418
+ const reservePackageDestinations = async (operation, packageName, packageDirectory, entries, capturedOutput) => {
419
+ const reservations = [];
420
+ for (const entry of entries) {
421
+ const path = join(packageDirectory, entry.file_name);
422
+ try {
423
+ await mkdir(path);
424
+ const created = await lstat(path);
425
+ if (!created.isDirectory() || created.isSymbolicLink())
426
+ throw new Error(`Could not reserve local filename ${entry.file_name}`);
427
+ reservations.push({
428
+ path,
429
+ file_name: entry.file_name,
430
+ device_path: entry.device_path,
431
+ identity: {
432
+ dev: created.dev,
433
+ ino: created.ino,
434
+ mode: created.mode,
435
+ },
436
+ });
437
+ }
438
+ catch (cause) {
439
+ const errorCode = cause instanceof Error &&
440
+ "code" in cause &&
441
+ typeof cause.code === "string"
442
+ ? cause.code
443
+ : null;
444
+ return new AnalysisOutputError(operation, "local_destination_unavailable", {
445
+ cause,
446
+ capturedOutput,
447
+ userMessage: `pm path for ${packageName} reported ${displayDevicePath(entry.device_path)}, whose file name ${displayDevicePath(entry.file_name)} cannot be written to a unique local destination (${errorCode ?? "unknown error"}). No APK was pulled.`,
448
+ remediationAction: "Review details.diagnostics and details.captured_output for the refused destination. Correct the output filesystem conflict before retrying; REA does not rename APKs.",
449
+ diagnostics: {
450
+ package_name: packageName,
451
+ device_path: entry.device_path,
452
+ file_name: entry.file_name,
453
+ error_code: errorCode,
454
+ },
455
+ });
456
+ }
457
+ }
458
+ for (const reservation of reservations) {
459
+ try {
460
+ const current = await lstat(reservation.path);
461
+ if (!current.isDirectory() ||
462
+ current.isSymbolicLink() ||
463
+ current.dev !== reservation.identity.dev ||
464
+ current.ino !== reservation.identity.ino ||
465
+ current.mode !== reservation.identity.mode)
466
+ throw new Error(`The local filename reservation changed before release: ${reservation.path}`);
467
+ await rmdir(reservation.path);
468
+ }
469
+ catch (cause) {
470
+ const errorCode = cause instanceof Error &&
471
+ "code" in cause &&
472
+ typeof cause.code === "string"
473
+ ? cause.code
474
+ : null;
475
+ return new AnalysisOutputError(operation, "local_destination_unavailable", {
476
+ cause,
477
+ capturedOutput,
478
+ userMessage: `Could not release the local filename reservation for ${displayDevicePath(reservation.device_path)} (${errorCode ?? "unknown error"}); no APK was pulled.`,
479
+ remediationAction: "Review details.diagnostics and details.captured_output for the refused destination. Correct the output filesystem conflict before retrying; REA does not rename APKs.",
480
+ diagnostics: {
481
+ package_name: packageName,
482
+ device_path: reservation.device_path,
483
+ file_name: reservation.file_name,
484
+ error_code: errorCode,
485
+ },
486
+ });
487
+ }
488
+ }
489
+ return undefined;
490
+ };
198
491
  /**
199
492
  * ADB device inspection and acquisition over a caller-selected adb binary.
200
493
  *
@@ -206,21 +499,27 @@ const removeOwnedPackageDirectory = async (path, identity) => {
206
499
  */
207
500
  export class AdbProvider {
208
501
  environment;
209
- #pendingPackageDirectoryCleanup = new Set();
502
+ #createRuntimeRoot;
503
+ #resources = new ArtifactResourceScope();
504
+ #outputDirectoryRetryLeases = new WeakMap();
505
+ #pendingOutputDirectoryCleanup = new Set();
210
506
  #activeOperations = new Set();
211
507
  #closing = false;
212
508
  #closePromise;
213
- #packageCleanupPromise;
509
+ #outputCleanupPromise;
214
510
  constructor(options = {}) {
215
511
  this.environment = options.environment ?? process.env;
512
+ this.#createRuntimeRoot =
513
+ options.createRuntimeRoot ??
514
+ ((rootOptions) => PrivateRuntimeRoot.create(rootOptions));
216
515
  }
217
516
  selection() {
218
517
  return resolveAdbBinary(this.environment);
219
518
  }
220
519
  /** Probe the selected adb binary; never contacts devices or the server. */
221
520
  async inspectAvailability(signal) {
222
- const selection = this.selection();
223
521
  try {
522
+ const selection = this.selection();
224
523
  await inspectAdbClient(selection, signal);
225
524
  return {
226
525
  status: "available",
@@ -238,14 +537,53 @@ export class AdbProvider {
238
537
  throw cause;
239
538
  }
240
539
  }
241
- /** Retry removal of package directories retained after failed rollback. */
540
+ /** Retry removal of owned output directories retained after failed cleanup. */
242
541
  close() {
243
542
  this.#closing = true;
244
543
  if (this.#closePromise !== undefined)
245
544
  return this.#closePromise;
246
545
  const closing = (async () => {
247
546
  await Promise.all(this.#activeOperations);
248
- await this.#retryPackageDirectoryCleanup();
547
+ const failures = [];
548
+ const failedLeases = new Set();
549
+ let allFailuresHaveExactLeaseOwners = true;
550
+ // Directory errors may also depend on a retained digest descriptor.
551
+ // Settle those owners before deciding whether the directory error resolved.
552
+ for (const cleanup of [
553
+ () => this.#resources.close(),
554
+ () => this.#retryOutputDirectoryCleanup(),
555
+ ]) {
556
+ try {
557
+ await cleanup();
558
+ }
559
+ catch (cause) {
560
+ failures.push(cause);
561
+ const leases = (cause instanceof AnalysisError
562
+ ? this.#outputDirectoryRetryLeases.get(cause)
563
+ : undefined) ??
564
+ (cause instanceof ArtifactResourceRetryFailure
565
+ ? cause.cleanupLeases
566
+ : undefined);
567
+ if (leases === undefined)
568
+ allFailuresHaveExactLeaseOwners = false;
569
+ for (const lease of leases ?? [])
570
+ failedLeases.add(lease);
571
+ }
572
+ }
573
+ if (failures.length > 0) {
574
+ const resources = failures.flatMap((cause) => this.#cleanupResources(cause, "ADB provider-owned resource"));
575
+ const error = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [...new Set(resources)], {
576
+ reason: failures
577
+ .map((cause) => cause instanceof Error ? cause.message : String(cause))
578
+ .join("; "),
579
+ }, {
580
+ operation: "close_binary",
581
+ cause: new AggregateError(failures, "ADB cleanup remains incomplete"),
582
+ });
583
+ if (allFailuresHaveExactLeaseOwners && failedLeases.size > 0)
584
+ new AnalysisCleanupLeaseGroup(error, [...failedLeases]);
585
+ throw error;
586
+ }
249
587
  })().finally(() => {
250
588
  if (this.#closePromise === closing)
251
589
  this.#closePromise = undefined;
@@ -253,43 +591,185 @@ export class AdbProvider {
253
591
  this.#closePromise = closing;
254
592
  return this.#closePromise;
255
593
  }
256
- #retryPackageDirectoryCleanup() {
257
- if (this.#packageCleanupPromise !== undefined)
258
- return this.#packageCleanupPromise;
259
- const cleanup = this.#performPackageDirectoryCleanup().finally(() => {
260
- if (this.#packageCleanupPromise === cleanup)
261
- this.#packageCleanupPromise = undefined;
594
+ #cleanupResources(cause, resource) {
595
+ if (cause instanceof ArtifactReaderFailure && cause.cleanup !== undefined)
596
+ return cause.cleanup.resources;
597
+ if (cause instanceof AnalysisError && cause.cleanupResources.length > 0)
598
+ return cause.cleanupResources;
599
+ return [resource];
600
+ }
601
+ #cleanupError(operation, parameters, causes, resources, execution) {
602
+ const partialObservation = execution === undefined
603
+ ? undefined
604
+ : createEvidence(execution.subject ?? undefined, execution.provider, {
605
+ operation,
606
+ parameters,
607
+ result: execution.result,
608
+ rawResult: execution.rawResult,
609
+ limitations: execution.limitations,
610
+ locations: execution.locations,
611
+ confidence: "observed",
612
+ });
613
+ return new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, resources, {
614
+ reason: causes
615
+ .map((cause) => cause instanceof Error ? cause.message : String(cause))
616
+ .join("; "),
617
+ }, {
618
+ operation,
619
+ cause: new AggregateError(causes, "ADB operation cleanup failed"),
620
+ ...(partialObservation === undefined ? {} : { partialObservation }),
262
621
  });
263
- this.#packageCleanupPromise = cleanup;
622
+ }
623
+ async #withRuntimeRoot(operation, parameters, options, signal, work) {
624
+ let root;
625
+ try {
626
+ root = await this.#createRuntimeRoot(options);
627
+ }
628
+ catch (cause) {
629
+ return err(cause instanceof AnalysisError
630
+ ? cause
631
+ : cause instanceof PrivateRuntimeRootUnavailableError
632
+ ? new AnalysisCapabilityUnavailableError(ADB_PROVIDER_IDENTITY.id, operation, cause.message, { cause, retryable: cause.retryable })
633
+ : new AnalysisOutputError(operation, "Could not create an ADB private workspace", {
634
+ cause,
635
+ }));
636
+ }
637
+ let result;
638
+ let primary;
639
+ const children = new ArtifactResourceScope();
640
+ try {
641
+ result = await work(root, children);
642
+ }
643
+ catch (cause) {
644
+ if (cause instanceof AdbInputSnapshotFailure) {
645
+ primary =
646
+ cause.primaryCause instanceof AnalysisError
647
+ ? cause.primaryCause
648
+ : new AnalysisOutputError(operation, `The caller input could not be staged for adb: ${cause.sourcePath}`, { cause: cause.primaryCause ?? cause });
649
+ // Snapshot handle cleanup may recover when the runtime-root lease is
650
+ // drained below. Keep that historical failure linked to the typed
651
+ // primary error while the lease owns and clears live cleanup state.
652
+ primary.retainSecondaryFailure(new AnalysisOutputError(operation, `ADB input snapshot cleanup previously failed for ${cause.sourcePath}`, { cause }), {});
653
+ }
654
+ else {
655
+ primary =
656
+ cause instanceof AnalysisError
657
+ ? cause
658
+ : new AnalysisProtocolError(`ADB ${operation} failed`, { cause });
659
+ }
660
+ }
661
+ const rootLease = runtimeRootLease(root, children);
662
+ const released = await this.#resources.release({
663
+ kind: "lease",
664
+ resource: root.path,
665
+ lease: rootLease,
666
+ });
667
+ if (primary === undefined && result?.ok && signal?.aborted === true) {
668
+ const completed = result.value;
669
+ primary = new AnalysisCancelledError(operation, {
670
+ cause: signal.reason,
671
+ partialObservation: createEvidence(completed.subject ?? undefined, completed.provider, {
672
+ operation,
673
+ parameters,
674
+ result: completed.result,
675
+ rawResult: completed.rawResult,
676
+ limitations: completed.limitations,
677
+ locations: completed.locations,
678
+ confidence: "observed",
679
+ }),
680
+ });
681
+ }
682
+ if (released.kind === "failed") {
683
+ const cleanupResources = [
684
+ root.path,
685
+ ...(released.cause instanceof ArtifactReaderFailure &&
686
+ released.cause.cleanup !== undefined
687
+ ? released.cause.cleanup.resources
688
+ : []),
689
+ ];
690
+ const cleanup = this.#cleanupError(operation, parameters, [released.cause], cleanupResources, result?.ok ? result.value : undefined);
691
+ const returnCleanupError = (error) => {
692
+ rootLease.bindCleanupError(error);
693
+ return err(error);
694
+ };
695
+ if (primary instanceof AnalysisCancelledError) {
696
+ return returnCleanupError(cancellationWithCleanupFailure(primary, cleanup, cleanupResources));
697
+ }
698
+ if (primary !== undefined)
699
+ return returnCleanupError(analysisErrorWithCleanupFailure(primary, cleanup, operation));
700
+ if (result !== undefined && !result.ok) {
701
+ if (result.error instanceof AnalysisCancelledError) {
702
+ return returnCleanupError(cancellationWithCleanupFailure(result.error, cleanup, cleanupResources));
703
+ }
704
+ return returnCleanupError(analysisErrorWithCleanupFailure(result.error, cleanup, operation));
705
+ }
706
+ return returnCleanupError(cleanup);
707
+ }
708
+ if (primary !== undefined)
709
+ return err(primary);
710
+ if (result === undefined)
711
+ return err(new AnalysisProtocolError(`ADB ${operation} returned no result`));
712
+ return result;
713
+ }
714
+ #retainOutputDirectoryCleanup(owner, cleanup) {
715
+ const lease = new AnalysisCleanupLease(async () => {
716
+ await owner.remove();
717
+ if (owner.primary.cleanupIncomplete)
718
+ throw new Error("ADB output directory primary cleanup remains incomplete");
719
+ });
720
+ const error = analysisErrorWithCleanupFailure(owner.primary, cleanup, owner.operation);
721
+ lease.bindCleanupError(error);
722
+ this.#pendingOutputDirectoryCleanup.add({ ...owner, lease });
723
+ return error;
724
+ }
725
+ #retryOutputDirectoryCleanup() {
726
+ if (this.#outputCleanupPromise !== undefined)
727
+ return this.#outputCleanupPromise;
728
+ const cleanup = this.#performOutputDirectoryCleanup().finally(() => {
729
+ if (this.#outputCleanupPromise === cleanup)
730
+ this.#outputCleanupPromise = undefined;
731
+ });
732
+ this.#outputCleanupPromise = cleanup;
264
733
  return cleanup;
265
734
  }
266
- async #performPackageDirectoryCleanup() {
735
+ async #performOutputDirectoryCleanup() {
267
736
  const failures = [];
268
- for (const owner of this.#pendingPackageDirectoryCleanup) {
737
+ for (const owner of this.#pendingOutputDirectoryCleanup) {
269
738
  try {
270
- await owner.remove();
271
- this.#pendingPackageDirectoryCleanup.delete(owner);
739
+ await owner.lease.release();
740
+ this.#pendingOutputDirectoryCleanup.delete(owner);
272
741
  }
273
742
  catch (cause) {
274
743
  const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [owner.path], {
275
744
  reason: cause instanceof Error ? cause.message : String(cause),
276
- }, { operation: "pull_adb_package", cause });
277
- failures.push(analysisErrorWithCleanupFailure(owner.primary, cleanup, "pull_adb_package"));
745
+ }, { operation: owner.operation, cause });
746
+ const error = analysisErrorWithCleanupFailure(owner.primary, cleanup, owner.operation);
747
+ owner.lease.bindCleanupError(error);
748
+ failures.push(error);
278
749
  }
279
750
  }
280
- if (failures.length === 1)
281
- throw failures[0];
282
- if (failures.length > 1)
283
- throw new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [...this.#pendingPackageDirectoryCleanup].map(({ path }) => path), {
284
- reason: "Failed package output directories remain after cleanup retry",
285
- failures: failures.map(({ message, cleanupResources }) => ({
286
- message,
287
- resources: [...cleanupResources],
288
- })),
289
- }, {
290
- operation: "pull_adb_package",
291
- cause: new AggregateError(failures, "Multiple ADB package rollback cleanups failed"),
292
- });
751
+ if (failures.length > 0) {
752
+ const error = failures.length === 1
753
+ ? failures[0]
754
+ : new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [
755
+ ...new Set(failures.flatMap((failure) => failure.cleanupResources)),
756
+ ], {
757
+ reason: "Failed ADB output directories remain after cleanup retry",
758
+ operations: [...this.#pendingOutputDirectoryCleanup].map(({ operation }) => operation),
759
+ failures: failures.map(({ message, cleanupResources }) => ({
760
+ message,
761
+ resources: [...cleanupResources],
762
+ })),
763
+ }, {
764
+ operation: "close_binary",
765
+ cause: new AggregateError(failures, "Multiple ADB output directory cleanups failed"),
766
+ });
767
+ const leases = [...this.#pendingOutputDirectoryCleanup].map(({ lease }) => lease);
768
+ this.#outputDirectoryRetryLeases.set(error, leases);
769
+ if (failures.length > 1)
770
+ new AnalysisCleanupLeaseGroup(error, leases);
771
+ throw error;
772
+ }
293
773
  }
294
774
  async execute(request, options) {
295
775
  if (this.#closing)
@@ -300,14 +780,26 @@ export class AdbProvider {
300
780
  });
301
781
  this.#activeOperations.add(active);
302
782
  try {
303
- if (this.#pendingPackageDirectoryCleanup.size > 0) {
783
+ try {
784
+ await this.#resources.retryCleanup();
785
+ }
786
+ catch (cause) {
787
+ const error = this.#cleanupError(request.operation, jsonObjectSchema.parse(request.input), [cause], this.#cleanupResources(cause, "ADB provider-owned resource"));
788
+ const leases = cause instanceof ArtifactResourceRetryFailure
789
+ ? cause.cleanupLeases
790
+ : undefined;
791
+ if (leases !== undefined)
792
+ new AnalysisCleanupLeaseGroup(error, leases);
793
+ return err(error);
794
+ }
795
+ if (this.#pendingOutputDirectoryCleanup.size > 0) {
304
796
  try {
305
- await this.#retryPackageDirectoryCleanup();
797
+ await this.#retryOutputDirectoryCleanup();
306
798
  }
307
799
  catch (cause) {
308
800
  return err(cause instanceof AnalysisError
309
801
  ? cause
310
- : new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [...this.#pendingPackageDirectoryCleanup].map(({ path }) => path), {
802
+ : new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [...this.#pendingOutputDirectoryCleanup].map(({ path }) => path), {
311
803
  reason: cause instanceof Error ? cause.message : String(cause),
312
804
  }, { operation: request.operation, cause }));
313
805
  }
@@ -322,19 +814,18 @@ export class AdbProvider {
322
814
  async #executeOperation(request, options) {
323
815
  const signal = options?.signal;
324
816
  if (signal?.aborted === true)
325
- return err(new AnalysisCancelledError(request.operation));
326
- const selection = this.selection();
817
+ return err(new AnalysisCancelledError(request.operation, { cause: signal.reason }));
818
+ let selection;
327
819
  let identity;
328
820
  try {
821
+ selection = this.selection();
329
822
  identity = await inspectAdbClient(selection, signal);
330
823
  }
331
824
  catch (cause) {
332
- if (cause instanceof AnalysisCancelledError)
825
+ if (cause instanceof AnalysisError)
333
826
  return err(cause);
334
827
  if (cause instanceof AdbConfigurationFailure)
335
- return err(new AnalysisCapabilityUnavailableError(ADB_PROVIDER_IDENTITY.id, request.operation, typeof cause.diagnostics.remediation === "string"
336
- ? `${cause.message} ${cause.diagnostics.remediation}`
337
- : cause.message, { cause }));
828
+ return err(providerConfigurationRefusal(ADB_PROVIDER_IDENTITY.id, request.operation, cause));
338
829
  return err(new AnalysisProtocolError(`adb version probe failed for ${request.operation}`, { cause }));
339
830
  }
340
831
  const client = clientIdentityResult(selection, identity);
@@ -354,7 +845,7 @@ export class AdbProvider {
354
845
  }, signal);
355
846
  if (!ran.ok)
356
847
  return ran;
357
- const { devices, unparsedLines, daemonStarted } = parseAdbDevicesOutput(ran.value.stdout);
848
+ const { devices, unparsedLines, daemonStarted } = parseAdbDevicesOutput(ran.value.stdout, ran.value.stderr);
358
849
  if (unparsedLines.length > 0)
359
850
  return err(new AnalysisProtocolError(`adb devices reported an unrecognized line: ${unparsedLines[0]}`));
360
851
  return ok(createAnalysisExecution({ client, devices, may_have_started_adb_server: daemonStarted }, provider, {
@@ -447,7 +938,7 @@ export class AdbProvider {
447
938
  buffer: request.input.buffer,
448
939
  pid: request.input.pid ?? null,
449
940
  lines: bounded,
450
- total_bytes: ran.value.stdout.length,
941
+ total_bytes: ran.value.stdoutBytes,
451
942
  coverage: bounded.length !== lines.length ||
452
943
  bounded.length === request.input.count
453
944
  ? "partial"
@@ -482,13 +973,15 @@ export class AdbProvider {
482
973
  user_id: details.userId,
483
974
  pkg_flags: details.pkgFlags,
484
975
  requested_permissions_count: details.requestedPermissions,
485
- coverage: details.versionCode === null && details.versionName === null
976
+ coverage: details.requestedPermissions === null ||
977
+ (details.versionCode === null && details.versionName === null)
486
978
  ? "partial"
487
979
  : "complete",
488
980
  }, provider, {
489
981
  limitations: [
490
982
  "Fields are a fixed projection of dumpsys package output; version-dependent sections are ignored rather than guessed",
491
- "requested_permissions_count counts the listed requested permissions section only",
983
+ "requested_permissions_count counts the listed requested permissions section; an absent section is zero only when dumpsys confirms a loaded parsed package",
984
+ "A null requested_permissions_count means dumpsys reported pkg=null or did not establish that an omitted permission section is an empty inventory",
492
985
  ],
493
986
  }));
494
987
  }
@@ -517,13 +1010,21 @@ export class AdbProvider {
517
1010
  }, provider, { limitations: unparsedOverflowLimitation(unparsedLines) }));
518
1011
  }
519
1012
  case "list_adb_directory": {
520
- const ran = await shell(["ls", "-la", request.input.device_path], {
1013
+ const ran = await runAdbCapture(operation, request.input.serial, selection.binary, adbArguments(request.input.serial, [
1014
+ "shell",
1015
+ "sh",
1016
+ "-c",
1017
+ 'cd "$1" || exit\nexec find . -mindepth 1 -maxdepth 1 -exec sh -c "$2" rea-list-directory {} +',
1018
+ "rea-list-directory",
1019
+ request.input.device_path,
1020
+ ADB_DIRECTORY_BATCH_SCRIPT,
1021
+ ]), {
521
1022
  timeoutMs: LISTING_TIMEOUT_MS,
522
1023
  maxOutputBytes: LISTING_MAX_OUTPUT_BYTES,
523
- });
1024
+ }, signal);
524
1025
  if (!ran.ok)
525
1026
  return ran;
526
- const { entries, unparsedLines } = parseLsOutput(ran.value.stdout);
1027
+ const { entries, unparsedLines } = parseAdbDirectoryListing(ran.value.stdout);
527
1028
  return ok(createAnalysisExecution({
528
1029
  client,
529
1030
  serial: request.input.serial,
@@ -532,7 +1033,7 @@ export class AdbProvider {
532
1033
  ...reported(unparsedLines, "complete"),
533
1034
  }, provider, {
534
1035
  limitations: [
535
- "Entry kinds derive from the permission string's type character",
1036
+ "Entry kinds derive from stat permission mode; directory contents and link targets may change during capture",
536
1037
  ...unparsedOverflowLimitation(unparsedLines),
537
1038
  ],
538
1039
  }));
@@ -598,25 +1099,41 @@ export class AdbProvider {
598
1099
  }));
599
1100
  }
600
1101
  case "inspect_adb_window": {
601
- const ran = await shell(["dumpsys", "window", "windows"], {
1102
+ let section = "windows";
1103
+ const ran = await shell(["dumpsys", "window", section], {
602
1104
  timeoutMs: SHELL_TIMEOUT_MS,
603
1105
  maxOutputBytes: DUMPSYS_WINDOW_MAX_OUTPUT_BYTES,
604
1106
  });
605
1107
  if (!ran.ok)
606
1108
  return ran;
607
- const { focusedWindow, focusedApp } = parseWindowFocusOutput(ran.value.stdout);
1109
+ let focus = parseWindowFocusOutput(ran.value.stdout);
1110
+ if (focus.focus_summary === "unavailable") {
1111
+ section = "displays";
1112
+ const fallback = await shell(["dumpsys", "window", section], {
1113
+ timeoutMs: SHELL_TIMEOUT_MS,
1114
+ maxOutputBytes: DUMPSYS_WINDOW_MAX_OUTPUT_BYTES,
1115
+ });
1116
+ if (!fallback.ok)
1117
+ return fallback;
1118
+ focus = parseWindowFocusOutput(fallback.value.stdout);
1119
+ }
1120
+ const declared = focus.focus_summary !== "unavailable";
608
1121
  return ok(createAnalysisExecution({
609
1122
  client,
610
1123
  serial: request.input.serial,
611
- focused_window: focusedWindow,
612
- focused_app: focusedApp,
613
- observed_lines: [
614
- ...(focusedWindow === null ? [] : [focusedWindow]),
615
- ...(focusedApp === null ? [] : [focusedApp]),
616
- ],
1124
+ source_section: section,
1125
+ ...focus,
617
1126
  }, provider, {
618
1127
  limitations: [
619
1128
  "Focus values are the window manager's declarations at read time; no interaction occurred",
1129
+ declared
1130
+ ? `Focus declarations were read from \`dumpsys window ${section}\``
1131
+ : "Neither `dumpsys window windows` nor `dumpsys window displays` declared mCurrentFocus or mFocusedApp; focus is unknown, not absent",
1132
+ ...(focus.focus_summary === "ambiguous"
1133
+ ? [
1134
+ "Multiple focus contexts or repeated declarations prevent a singular focus summary; inspect focus_contexts for every declaration",
1135
+ ]
1136
+ : []),
620
1137
  ],
621
1138
  }));
622
1139
  }
@@ -687,10 +1204,48 @@ export class AdbProvider {
687
1204
  if (!paths.ok)
688
1205
  return paths;
689
1206
  const parsed = parsePmPathOutput(paths.value.stdout);
1207
+ const capturedOutput = {
1208
+ stdout: paths.value.stdout,
1209
+ stderr: paths.value.stderr,
1210
+ truncated: false,
1211
+ };
1212
+ if (parsed.rejectedPaths.length > 0) {
1213
+ const first = parsed.rejectedPaths[0];
1214
+ const otherCount = parsed.rejectedPaths.length - 1;
1215
+ return err(new AnalysisOutputError(operation, "unsafe_device_path", {
1216
+ capturedOutput,
1217
+ userMessage: `pm path for ${packageName} reported an APK path that cannot be written as a file on this host: ${displayDevicePath(first.device_path)} (${first.reason})${otherCount > 0 ? ` and ${String(otherCount)} other path(s)` : ""}. No APK was pulled.`,
1218
+ remediationAction: "Review details.diagnostics for the refused device paths and details.captured_output for the retained pm path output. REA does not rename device-reported APK paths; correct the device path policy before retrying.",
1219
+ diagnostics: {
1220
+ package_name: packageName,
1221
+ rejected_paths: parsed.rejectedPaths.map(({ device_path, reason }) => ({
1222
+ device_path,
1223
+ reason,
1224
+ })),
1225
+ },
1226
+ }));
1227
+ }
690
1228
  if (parsed.paths.length === 0 && parsed.unparsedLines.length === 0)
691
1229
  return err(new AnalysisUnsupportedTargetError(operation, serial, `Package Manager reported no APK paths for ${packageName}; it may not be installed for user 0`));
692
1230
  if (parsed.unparsedLines.length > 0)
693
- return err(new AnalysisProtocolError(`pm path reported an unrecognized line: ${parsed.unparsedLines[0]}`));
1231
+ return err(new AnalysisProtocolError(`pm path reported an unrecognized line: ${parsed.unparsedLines[0]}`, { capturedOutput }));
1232
+ const destinationNames = new Set();
1233
+ for (const entry of parsed.paths) {
1234
+ if (destinationNames.has(entry.file_name))
1235
+ return err(new AnalysisOutputError(operation, "duplicate_local_destination", {
1236
+ capturedOutput,
1237
+ userMessage: `pm path for ${packageName} reported multiple APK paths with the same local file name ${displayDevicePath(entry.file_name)}; no APK was pulled.`,
1238
+ remediationAction: "Review details.diagnostics and details.captured_output for the conflicting device paths. REA does not rename device-reported paths; correct Package Manager's path response before retrying.",
1239
+ diagnostics: {
1240
+ package_name: packageName,
1241
+ file_name: entry.file_name,
1242
+ device_paths: parsed.paths
1243
+ .filter((candidate) => candidate.file_name === entry.file_name)
1244
+ .map((candidate) => candidate.device_path),
1245
+ },
1246
+ }));
1247
+ destinationNames.add(entry.file_name);
1248
+ }
694
1249
  const directory = await prepareOutputDirectory(operation, input.output_directory);
695
1250
  if (!directory.ok)
696
1251
  return directory;
@@ -716,19 +1271,42 @@ export class AdbProvider {
716
1271
  if (!packageDirectoryCreated)
717
1272
  return err(primary);
718
1273
  const owner = {
1274
+ operation,
719
1275
  path: packageDirectory,
720
- identity: packageDirectoryIdentity,
721
1276
  primary,
722
- remove: () => removeOwnedPackageDirectory(packageDirectory, packageDirectoryIdentity),
1277
+ remove: () => removeOwnedOutputDirectory(packageDirectory, packageDirectoryIdentity),
723
1278
  };
724
- this.#pendingPackageDirectoryCleanup.add(owner);
725
1279
  const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [packageDirectory], {
726
1280
  reason: "Could not establish an owned package directory identity",
727
1281
  }, { operation, cause });
728
- return err(analysisErrorWithCleanupFailure(primary, cleanup, operation));
1282
+ return err(this.#retainOutputDirectoryCleanup(owner, cleanup));
729
1283
  }
1284
+ const failOwnedPackage = async (primary) => {
1285
+ const owner = {
1286
+ operation,
1287
+ path: packageDirectory,
1288
+ primary,
1289
+ remove: () => removeOwnedOutputDirectory(packageDirectory, packageDirectoryIdentity),
1290
+ };
1291
+ try {
1292
+ await owner.remove();
1293
+ }
1294
+ catch (cause) {
1295
+ const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [packageDirectory], { reason: cause instanceof Error ? cause.message : String(cause) }, { operation, cause });
1296
+ return err(this.#retainOutputDirectoryCleanup(owner, cleanup));
1297
+ }
1298
+ return err(primary);
1299
+ };
1300
+ const destinationError = await reservePackageDestinations(operation, packageName, packageDirectory, parsed.paths, capturedOutput);
1301
+ if (destinationError !== undefined)
1302
+ return failOwnedPackage(destinationError);
730
1303
  const artifacts = [];
731
1304
  const failures = [];
1305
+ const observedFailures = () => failures.map(({ device_path, stage, message }) => ({
1306
+ device_path,
1307
+ stage,
1308
+ message,
1309
+ }));
732
1310
  const cancelledPackagePull = (error, localPath, devicePath, stage) => {
733
1311
  error.retainPartialObservation({
734
1312
  provider_id: "adb",
@@ -740,7 +1318,7 @@ export class AdbProvider {
740
1318
  output_directory: directory.value,
741
1319
  artifacts,
742
1320
  failures: [
743
- ...failures,
1321
+ ...observedFailures(),
744
1322
  {
745
1323
  device_path: devicePath,
746
1324
  stage,
@@ -754,17 +1332,7 @@ export class AdbProvider {
754
1332
  });
755
1333
  return err(error);
756
1334
  };
757
- const seenFileNames = new Set();
758
1335
  for (const entry of parsed.paths) {
759
- if (seenFileNames.has(entry.file_name)) {
760
- failures.push({
761
- device_path: entry.device_path,
762
- stage: "pull",
763
- message: `Duplicate file name ${entry.file_name} in the APK set; refusing to overwrite`,
764
- });
765
- continue;
766
- }
767
- seenFileNames.add(entry.file_name);
768
1336
  const localPath = join(packageDirectory, entry.file_name);
769
1337
  const pulled = await runAdb(operation, serial, selection.binary, adbArguments(serial, ["pull", entry.device_path, localPath]), { timeoutMs: PULL_TIMEOUT_MS, maxOutputBytes: PULL_MAX_OUTPUT_BYTES }, signal);
770
1338
  if (!pulled.ok) {
@@ -774,11 +1342,12 @@ export class AdbProvider {
774
1342
  device_path: entry.device_path,
775
1343
  stage: "pull",
776
1344
  message: pulled.error.message,
1345
+ cause: pulled.error,
777
1346
  });
778
1347
  continue;
779
1348
  }
780
1349
  try {
781
- const digest = await hashAdbFile(localPath, operation, signal);
1350
+ const digest = await hashAdbFile(localPath, operation, signal, this.#resources);
782
1351
  artifacts.push({
783
1352
  device_path: entry.device_path,
784
1353
  file_name: entry.file_name,
@@ -790,34 +1359,66 @@ export class AdbProvider {
790
1359
  });
791
1360
  }
792
1361
  catch (cause) {
1362
+ const digestFailure = cause instanceof AdbDigestFailure ? cause.fileFailure : undefined;
1363
+ const completedDigest = digestFailure?.outcome.kind === "completed"
1364
+ ? digestFailure.outcome.value
1365
+ : undefined;
1366
+ const partialObservation = {
1367
+ provider_id: "adb",
1368
+ operation,
1369
+ result: {
1370
+ client,
1371
+ serial,
1372
+ package_name: packageName,
1373
+ output_directory: directory.value,
1374
+ artifacts: completedDigest === undefined
1375
+ ? artifacts
1376
+ : [
1377
+ ...artifacts,
1378
+ {
1379
+ device_path: entry.device_path,
1380
+ file_name: entry.file_name,
1381
+ local_path: localPath,
1382
+ bytes: completedDigest.bytes,
1383
+ sha256: completedDigest.sha256,
1384
+ role: entry.role,
1385
+ role_basis: "file_name",
1386
+ },
1387
+ ],
1388
+ failures: [
1389
+ ...observedFailures(),
1390
+ {
1391
+ device_path: entry.device_path,
1392
+ stage: "digest",
1393
+ message: completedDigest === undefined
1394
+ ? `The pulled file remains at ${localPath}, but its digest and descriptor cleanup are unconfirmed.`
1395
+ : digestFailure instanceof RegularFileCancelled
1396
+ ? `The pulled file digest and descriptor cleanup are confirmed; the request was cancelled: ${localPath}`
1397
+ : `The pulled file digest is known, but its descriptor cleanup is unconfirmed: ${localPath}`,
1398
+ },
1399
+ ],
1400
+ coverage: "partial",
1401
+ },
1402
+ };
1403
+ const cleanupError = adbDigestError(cause, operation, partialObservation);
1404
+ if (cleanupError !== undefined)
1405
+ return err(cleanupError);
793
1406
  if (cause instanceof AnalysisCancelledError)
794
1407
  return cancelledPackagePull(cause, localPath, entry.device_path, "digest");
1408
+ const physicalCause = stableFileHashCause(cause);
795
1409
  failures.push({
796
1410
  device_path: entry.device_path,
797
1411
  stage: "digest",
798
- message: `The pulled file could not be read back after pulling: ${localPath}`,
1412
+ message: `The pulled file could not be read back after pulling: ${localPath}: ${physicalCause instanceof Error ? physicalCause.message : String(physicalCause)}`,
1413
+ cause,
799
1414
  });
800
1415
  }
801
1416
  }
802
1417
  if (artifacts.length === 0 && failures.length > 0) {
803
- const primary = new AnalysisProtocolError(`Every APK pull failed for ${packageName} on ${serial}: ${failures[0].message}`);
804
- const owner = {
805
- path: packageDirectory,
806
- identity: packageDirectoryIdentity,
807
- primary,
808
- remove: () => removeOwnedPackageDirectory(packageDirectory, packageDirectoryIdentity),
809
- };
810
- try {
811
- await owner.remove();
812
- }
813
- catch (cause) {
814
- this.#pendingPackageDirectoryCleanup.add(owner);
815
- const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [packageDirectory], {
816
- reason: cause instanceof Error ? cause.message : String(cause),
817
- }, { operation: operation, cause });
818
- return err(analysisErrorWithCleanupFailure(primary, cleanup, operation));
819
- }
820
- return err(primary);
1418
+ const primary = new AnalysisProtocolError(`Every APK pull failed for ${packageName} on ${serial}: ${failures[0].message}`, {
1419
+ cause: new AggregateError(failures.map(({ cause }) => cause), "APK pulls failed"),
1420
+ });
1421
+ return failOwnedPackage(primary);
821
1422
  }
822
1423
  return ok(createAnalysisExecution({
823
1424
  client,
@@ -825,7 +1426,7 @@ export class AdbProvider {
825
1426
  package_name: packageName,
826
1427
  output_directory: directory.value,
827
1428
  artifacts,
828
- failures,
1429
+ failures: observedFailures(),
829
1430
  coverage: failures.length === 0 ? "complete" : "partial",
830
1431
  }, provider, {
831
1432
  limitations: [
@@ -835,11 +1436,19 @@ export class AdbProvider {
835
1436
  }));
836
1437
  }
837
1438
  async pullFile(operation, selection, client, provider, input, signal) {
1439
+ const derived = adbHostFileName(input.device_path);
1440
+ if (!derived.ok)
1441
+ return err(new AnalysisInputError(operation, undefined, [
1442
+ {
1443
+ path: ["device_path"],
1444
+ reason: "invalid_value",
1445
+ message: `The device path ${JSON.stringify(input.device_path)} does not name a file that can be written on this host (${derived.reason}); REA never renames a device-reported file.`,
1446
+ },
1447
+ ]));
838
1448
  const directory = await prepareOutputDirectory(operation, input.output_directory);
839
1449
  if (!directory.ok)
840
1450
  return directory;
841
- const fileName = basename(input.device_path) || "pulled";
842
- const localPath = join(directory.value, fileName);
1451
+ const localPath = join(directory.value, derived.fileName);
843
1452
  const existing = await refuseExistingTarget(operation, localPath);
844
1453
  if (existing !== undefined)
845
1454
  return err(existing);
@@ -847,7 +1456,7 @@ export class AdbProvider {
847
1456
  if (!pulled.ok)
848
1457
  return pulled;
849
1458
  try {
850
- const digest = await hashAdbFile(localPath, operation, signal);
1459
+ const digest = await hashAdbFile(localPath, operation, signal, this.#resources);
851
1460
  return ok(createAnalysisExecution({
852
1461
  client,
853
1462
  serial: input.serial,
@@ -862,18 +1471,22 @@ export class AdbProvider {
862
1471
  }));
863
1472
  }
864
1473
  catch (cause) {
1474
+ const partialObservation = {
1475
+ provider_id: "adb",
1476
+ operation,
1477
+ result: {
1478
+ client,
1479
+ serial: input.serial,
1480
+ local_path: localPath,
1481
+ device_path: input.device_path,
1482
+ digest_status: "unknown",
1483
+ },
1484
+ };
1485
+ const cleanupError = adbDigestError(cause, operation, partialObservation);
1486
+ if (cleanupError !== undefined)
1487
+ return err(cleanupError);
865
1488
  if (cause instanceof AnalysisCancelledError) {
866
- cause.retainPartialObservation({
867
- provider_id: "adb",
868
- operation,
869
- result: {
870
- client,
871
- serial: input.serial,
872
- local_path: localPath,
873
- device_path: input.device_path,
874
- digest_status: "unknown",
875
- },
876
- });
1489
+ cause.retainPartialObservation(partialObservation);
877
1490
  return err(cause);
878
1491
  }
879
1492
  return err(new AnalysisOutputError(operation, `The pulled file could not be read back after pulling: ${localPath}`, { cause }));
@@ -886,71 +1499,74 @@ export class AdbProvider {
886
1499
  return err(new AnalysisInputError(operation, {
887
1500
  cause: new Error(`The local file does not exist: ${localPath}`),
888
1501
  }));
889
- let digest;
890
- try {
891
- digest = await hashAdbFile(localPath, operation, signal);
892
- }
893
- catch (cause) {
894
- if (cause instanceof AnalysisCancelledError)
895
- return err(cause);
896
- throw cause;
897
- }
898
- const existsProbe = await runAdb(operation, input.device_path, selection.binary, adbArguments(input.serial, ["shell", "test", "-e", input.device_path]), { timeoutMs: SETTINGS_TIMEOUT_MS, maxOutputBytes: 1024 }, signal);
899
- let deviceExists;
900
- if (existsProbe.ok)
901
- deviceExists = true;
902
- else if (existsProbe.error instanceof AnalysisProtocolError)
903
- deviceExists = false;
904
- else if (existsProbe.error instanceof AnalysisTimeoutError)
905
- return existsProbe;
906
- else if (existsProbe.error instanceof AnalysisCancelledError)
907
- return existsProbe;
908
- else if (existsProbe.error instanceof AnalysisResourceConstraintError)
909
- return existsProbe;
910
- else
911
- deviceExists = true; // authorization/refusal states surface on push instead
912
- if (deviceExists && !input.overwrite)
913
- return err(new AnalysisOutputError(operation, `The device path already exists and overwrite was not requested: ${input.device_path}`));
914
- const pushed = await runAdb(operation, input.device_path, selection.binary, adbArguments(input.serial, ["push", localPath, input.device_path]), { timeoutMs: PULL_TIMEOUT_MS, maxOutputBytes: PULL_MAX_OUTPUT_BYTES }, signal);
915
- if (!pushed.ok)
916
- return pushed;
917
- const deviceDigest = await runAdb(operation, input.device_path, selection.binary, adbArguments(input.serial, ["shell", "sha256sum", input.device_path]), { timeoutMs: SHELL_TIMEOUT_MS, maxOutputBytes: 1024 }, signal);
918
- if (deviceDigest.ok) {
919
- const digestMatch = /^([a-f0-9]{64})\s/u.exec(deviceDigest.value.stdout);
920
- if (digestMatch !== null && digestMatch[1] !== digest.sha256)
921
- return err(new AnalysisArtifactChangedError(operation, input.device_path, `The device-reported digest does not match the pushed local file: ${localPath}`));
922
- return ok(createAnalysisExecution({
1502
+ return this.#withRuntimeRoot(operation, {
1503
+ serial: input.serial,
1504
+ local_path: localPath,
1505
+ device_path: input.device_path,
1506
+ overwrite: input.overwrite,
1507
+ }, { prefix: "rea-adb-input-" }, signal, async (root, resources) => {
1508
+ const digest = await snapshotAdbInput(localPath, root, resources, operation, signal);
1509
+ const existsProbe = await probeAdbPathExistence(operation, input.serial, input.device_path, selection.binary, { timeoutMs: SETTINGS_TIMEOUT_MS, maxOutputBytes: 1024 }, signal);
1510
+ if (!existsProbe.ok)
1511
+ return existsProbe;
1512
+ const deviceExists = existsProbe.value;
1513
+ if (deviceExists && !input.overwrite)
1514
+ return err(new AnalysisOutputError(operation, `The device path already exists and overwrite was not requested: ${input.device_path}`));
1515
+ const pushed = await runAdb(operation, input.device_path, selection.binary, adbArguments(input.serial, ["push", digest.path, input.device_path]), { timeoutMs: PULL_TIMEOUT_MS, maxOutputBytes: PULL_MAX_OUTPUT_BYTES }, signal);
1516
+ if (!pushed.ok)
1517
+ return pushed;
1518
+ const receipt = (deviceSha256, source, extra = []) => createAnalysisExecution({
923
1519
  client,
924
1520
  serial: input.serial,
925
1521
  local_path: localPath,
926
1522
  device_path: input.device_path,
927
1523
  bytes: digest.bytes,
928
1524
  sha256: digest.sha256,
929
- device_sha256: digestMatch?.[1] ?? null,
1525
+ device_sha256: deviceSha256,
930
1526
  overwritten: deviceExists,
931
- device_digest_source: "device_sha256sum",
1527
+ device_digest_source: source,
932
1528
  }, provider, {
933
1529
  limitations: [
934
- "Push writes the caller's file to the device; this is the only device-mutating ADB tool",
1530
+ "Push writes a private snapshot of the caller's file to the device",
1531
+ ...extra,
935
1532
  ],
936
- }));
937
- }
938
- return ok(createAnalysisExecution({
939
- client,
940
- serial: input.serial,
941
- local_path: localPath,
942
- device_path: input.device_path,
943
- bytes: digest.bytes,
944
- sha256: digest.sha256,
945
- device_sha256: null,
946
- overwritten: deviceExists,
947
- device_digest_source: "unavailable",
948
- }, provider, {
949
- limitations: [
950
- "The device did not answer sha256sum, so the transfer is not device-side verified",
951
- "Push writes the caller's file to the device; this is the only device-mutating ADB tool",
952
- ],
953
- }));
1533
+ });
1534
+ const deviceDigest = await runAdb(operation, input.device_path, selection.binary, adbArguments(input.serial, ["shell", "sha256sum", input.device_path]), { timeoutMs: SHELL_TIMEOUT_MS, maxOutputBytes: 1024 }, signal);
1535
+ if (!deviceDigest.ok) {
1536
+ const cancelled = deviceDigest.error instanceof AnalysisCancelledError;
1537
+ const completed = receipt(null, "unavailable", [
1538
+ cancelled
1539
+ ? "The device-side digest check was cancelled after push completed"
1540
+ : "The device did not answer sha256sum, so the transfer is not device-side verified",
1541
+ ]);
1542
+ if (cancelled)
1543
+ deviceDigest.error.retainPartialObservation(createEvidence(completed.subject ?? undefined, completed.provider, {
1544
+ operation,
1545
+ parameters: input,
1546
+ result: completed.result,
1547
+ rawResult: completed.rawResult,
1548
+ limitations: completed.limitations,
1549
+ locations: completed.locations,
1550
+ confidence: "observed",
1551
+ }));
1552
+ return cancelled ? err(deviceDigest.error) : ok(completed);
1553
+ }
1554
+ const digestMatch = /^([a-f0-9]{64})\s/u.exec(deviceDigest.value.stdout);
1555
+ const completed = receipt(digestMatch?.[1] ?? null, "device_sha256sum");
1556
+ if (digestMatch !== null && digestMatch[1] !== digest.sha256)
1557
+ return err(new AnalysisArtifactChangedError(operation, input.device_path, `The device-reported digest does not match the staged local file: ${localPath}`, {
1558
+ partialObservation: createEvidence(completed.subject ?? undefined, completed.provider, {
1559
+ operation,
1560
+ parameters: input,
1561
+ result: completed.result,
1562
+ rawResult: completed.rawResult,
1563
+ limitations: completed.limitations,
1564
+ locations: completed.locations,
1565
+ confidence: "observed",
1566
+ }),
1567
+ }));
1568
+ return ok(completed);
1569
+ });
954
1570
  }
955
1571
  async installPackage(operation, selection, client, provider, input, signal) {
956
1572
  const apkPath = resolve(input.apk_path);
@@ -959,45 +1575,54 @@ export class AdbProvider {
959
1575
  return err(new AnalysisInputError(operation, {
960
1576
  cause: new Error(`The local APK does not exist: ${apkPath}`),
961
1577
  }));
962
- let digest;
963
- try {
964
- digest = await hashAdbFile(apkPath, operation, signal);
965
- }
966
- catch (cause) {
967
- if (cause instanceof AnalysisCancelledError)
968
- return err(cause);
969
- throw cause;
970
- }
971
- const installed = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, [
972
- "install",
973
- ...(input.replace ? ["-r"] : []),
974
- apkPath,
975
- ]), { timeoutMs: PULL_TIMEOUT_MS, maxOutputBytes: PULL_MAX_OUTPUT_BYTES }, signal);
976
- if (!installed.ok)
977
- return installed;
978
- const verdict = parsePackageChangeOutput(installed.value.stdout);
979
- if (verdict.status === "failure")
980
- return err(new AnalysisUnsupportedTargetError(operation, input.serial, verdict.reason ?? "the device refused the installation"));
981
- return ok(createAnalysisExecution({
982
- client,
1578
+ return this.#withRuntimeRoot(operation, {
983
1579
  serial: input.serial,
984
1580
  apk_path: apkPath,
985
- bytes: digest.bytes,
986
- sha256: digest.sha256,
987
- replaced: input.replace,
988
- }, provider, {
989
- limitations: [
990
- "Install changes device state; the installed APK's digest is the host file's digest",
991
- ],
992
- }));
1581
+ replace: input.replace,
1582
+ }, { prefix: "rea-adb-apk-" }, signal, async (root, resources) => {
1583
+ const digest = await snapshotAdbInput(apkPath, root, resources, operation, signal);
1584
+ const installed = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, [
1585
+ "install",
1586
+ ...(input.replace ? ["-r"] : []),
1587
+ digest.path,
1588
+ ]), { timeoutMs: PULL_TIMEOUT_MS, maxOutputBytes: PULL_MAX_OUTPUT_BYTES }, signal);
1589
+ if (!installed.ok)
1590
+ return (packageChangeRefusal(operation, input.serial, installed.error) ??
1591
+ installed);
1592
+ const verdict = parsePackageChangeOutput(installed.value.stdout);
1593
+ if (verdict.status === "failure")
1594
+ return err(new AnalysisUnsupportedTargetError(operation, input.serial, verdict.reason ?? "the device refused the installation"));
1595
+ return ok(createAnalysisExecution({
1596
+ client,
1597
+ serial: input.serial,
1598
+ apk_path: apkPath,
1599
+ bytes: digest.bytes,
1600
+ sha256: digest.sha256,
1601
+ replace_requested: input.replace,
1602
+ replaced: null,
1603
+ }, provider, {
1604
+ limitations: [
1605
+ "Install changes device state; the installed APK's digest identifies the private host snapshot",
1606
+ "Whether an existing package was replaced is unknown; replace_requested records only the adb install mode",
1607
+ ],
1608
+ }));
1609
+ });
993
1610
  }
994
1611
  async uninstallPackage(operation, selection, client, provider, input, signal) {
995
- const uninstalled = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, ["uninstall", input.package]), {
1612
+ const uninstalled = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, [
1613
+ "shell",
1614
+ "pm",
1615
+ "uninstall",
1616
+ "--user",
1617
+ "0",
1618
+ input.package,
1619
+ ]), {
996
1620
  timeoutMs: PACKAGE_LIST_TIMEOUT_MS,
997
1621
  maxOutputBytes: PULL_MAX_OUTPUT_BYTES,
998
1622
  }, signal);
999
1623
  if (!uninstalled.ok)
1000
- return uninstalled;
1624
+ return (packageChangeRefusal(operation, input.serial, uninstalled.error) ??
1625
+ uninstalled);
1001
1626
  const verdict = parsePackageChangeOutput(uninstalled.value.stdout);
1002
1627
  if (verdict.status === "failure")
1003
1628
  return err(new AnalysisUnsupportedTargetError(operation, input.serial, verdict.reason ?? "the device refused the removal"));
@@ -1007,7 +1632,7 @@ export class AdbProvider {
1007
1632
  package_name: input.package,
1008
1633
  }, provider, {
1009
1634
  limitations: [
1010
- "Uninstall removes the package and its data for user 0; keeping data (-k) is not exposed",
1635
+ "Uninstall explicitly requests user 0 without data retention (-k); device enforcement is not independently verified",
1011
1636
  ],
1012
1637
  }));
1013
1638
  }
@@ -1080,13 +1705,39 @@ export class AdbProvider {
1080
1705
  const started = await runAdb(operation, serial, selection.binary, adbArguments(serial, ["shell", "am", "start", "-W", ...arguments_]), { timeoutMs: SHELL_TIMEOUT_MS, maxOutputBytes: PM_PATH_MAX_OUTPUT_BYTES }, signal);
1081
1706
  if (!started.ok)
1082
1707
  return started;
1083
- const verdict = parseAmStartOutput(started.value.stdout);
1084
- if (verdict.status === "refused")
1085
- return err(new AnalysisUnsupportedTargetError(operation, serial, verdict.reason ?? "am start refused the intent"));
1086
- return ok(createAnalysisExecution({
1708
+ const verdict = parseAmStartOutput(started.value.stdout, started.value.stderr);
1709
+ const result = {
1087
1710
  ...resultFields,
1088
1711
  started_activity: verdict.startedActivity,
1089
- }, provider, {
1712
+ reported_activity: verdict.activity,
1713
+ reported_status: verdict.reportedStatus,
1714
+ };
1715
+ if (verdict.status === "refused") {
1716
+ const partialObservation = operation === "start_adb_app"
1717
+ ? {
1718
+ provider_id: "adb",
1719
+ operation,
1720
+ result: adbResultSchemas.start_adb_app.parse(result),
1721
+ }
1722
+ : {
1723
+ provider_id: "adb",
1724
+ operation,
1725
+ result: adbResultSchemas.start_adb_activity.parse(result),
1726
+ };
1727
+ return err(new AnalysisUnsupportedTargetError(operation, serial, verdict.reason ?? "am start refused the intent", {
1728
+ capturedOutput: {
1729
+ stdout: started.value.stdout,
1730
+ stderr: started.value.stderr,
1731
+ truncated: false,
1732
+ },
1733
+ partialObservation,
1734
+ }));
1735
+ }
1736
+ return ok(createAnalysisExecution(result, provider, {
1737
+ rawResult: {
1738
+ stdout: started.value.stdout,
1739
+ stderr: started.value.stderr,
1740
+ },
1090
1741
  limitations: [
1091
1742
  "Starting an activity changes device state; am start -W waits for launch completion but no lifecycle observation is captured",
1092
1743
  ],
@@ -1114,64 +1765,112 @@ export class AdbProvider {
1114
1765
  const existing = await refuseExistingTarget(operation, localPath);
1115
1766
  if (existing !== undefined)
1116
1767
  return err(existing);
1117
- const captured = await runAdbBinary(operation, selection.binary, adbArguments(input.serial, ["exec-out", "screencap", "-p"]), { timeoutMs: SCREEN_TIMEOUT_MS, maxOutputBytes: SCREEN_MAX_OUTPUT_BYTES }, signal);
1768
+ const captured = await runAdbCapture(operation, input.serial, selection.binary, adbArguments(input.serial, ["exec-out", "screencap", "-p"]), { timeoutMs: SCREEN_TIMEOUT_MS, maxOutputBytes: SCREEN_MAX_OUTPUT_BYTES }, signal);
1118
1769
  if (!captured.ok)
1119
1770
  return captured;
1120
- const dimensions = parsePngDimensions(captured.value);
1771
+ if (signal?.aborted === true)
1772
+ return err(new AnalysisCancelledError(operation, { cause: signal.reason }));
1773
+ const dimensions = parsePngDimensions(captured.value.stdout);
1121
1774
  if (dimensions.width === null)
1122
1775
  return err(new AnalysisProtocolError("screencap did not return a PNG payload; the device may not expose a display"));
1123
- try {
1124
- await writeFile(localPath, captured.value, { flag: "wx" });
1125
- }
1126
- catch (cause) {
1127
- return err(new AnalysisOutputError(operation, `The screen output could not be created exclusively: ${localPath}`, { cause }));
1128
- }
1129
- const sha256 = createHash("sha256").update(captured.value).digest("hex");
1130
- return ok(createAnalysisExecution({
1131
- client,
1132
- serial: input.serial,
1133
- local_path: localPath,
1134
- bytes: captured.value.byteLength,
1135
- sha256,
1136
- width: dimensions.width,
1137
- height: dimensions.height,
1138
- }, provider, {
1139
- limitations: [
1140
- "The capture is one frame at read time; no recording or interaction occurred",
1141
- ],
1142
- }));
1776
+ return this.#withRuntimeRoot(operation, { serial: input.serial, output_directory: directory.value }, { parent: directory.value, prefix: ".rea-screen-" }, signal, async (stage, resources) => {
1777
+ let publicationCloseFailure;
1778
+ let usedExclusiveFallback = false;
1779
+ try {
1780
+ const stagedPath = join(stage.path, "screen.png");
1781
+ await writeFile(stagedPath, captured.value.stdout, { flag: "wx" });
1782
+ await syncStagedAdbFile(stagedPath, resources, operation);
1783
+ if (signal?.aborted === true)
1784
+ return err(new AnalysisCancelledError(operation, { cause: signal.reason }));
1785
+ try {
1786
+ // A same-filesystem hard link atomically publishes without replacing
1787
+ // caller output. Its success is the publication cutoff.
1788
+ await link(stagedPath, localPath);
1789
+ }
1790
+ catch (cause) {
1791
+ if (!hardLinksUnsupported(cause))
1792
+ throw cause;
1793
+ // Exclusive creation prevents replacement, but makes the path
1794
+ // visible while the fallback writes the complete file.
1795
+ usedExclusiveFallback = true;
1796
+ publicationCloseFailure =
1797
+ (await publishScreenExclusively(localPath, captured.value.stdout, resources, operation, signal)) ?? undefined;
1798
+ }
1799
+ }
1800
+ catch (cause) {
1801
+ if (cause instanceof AnalysisError)
1802
+ return err(cause);
1803
+ return err(new AnalysisOutputError(operation, `The screen output could not be published exclusively: ${localPath}`, { cause }));
1804
+ }
1805
+ const sha256 = createHash("sha256")
1806
+ .update(captured.value.stdout)
1807
+ .digest("hex");
1808
+ const completed = createAnalysisExecution({
1809
+ client,
1810
+ serial: input.serial,
1811
+ local_path: localPath,
1812
+ bytes: captured.value.stdout.byteLength,
1813
+ sha256,
1814
+ width: dimensions.width,
1815
+ height: dimensions.height,
1816
+ }, provider, {
1817
+ limitations: [
1818
+ "The capture is one frame at read time; no recording or interaction occurred",
1819
+ ...(usedExclusiveFallback
1820
+ ? [
1821
+ "The exclusive-create fallback makes the output path visible while its bytes are being written",
1822
+ ]
1823
+ : []),
1824
+ ],
1825
+ });
1826
+ if (publicationCloseFailure !== undefined) {
1827
+ const cleanupError = this.#cleanupError(operation, { serial: input.serial, output_directory: directory.value }, [publicationCloseFailure.cause], [publicationCloseFailure.resource], completed);
1828
+ publicationCloseFailure.bindCleanupError(cleanupError);
1829
+ return err(cleanupError);
1830
+ }
1831
+ return ok(completed);
1832
+ });
1143
1833
  }
1144
1834
  async collectBugreport(operation, selection, client, provider, input, signal) {
1145
1835
  const directory = await prepareOutputDirectory(operation, input.output_directory);
1146
1836
  if (!directory.ok)
1147
1837
  return directory;
1148
- const collected = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, ["bugreport", directory.value]), {
1149
- timeoutMs: BUGREPORT_TIMEOUT_MS,
1150
- maxOutputBytes: BUGREPORT_MAX_OUTPUT_BYTES,
1151
- }, signal);
1152
- if (!collected.ok)
1153
- return collected;
1154
- const reportedPath = parseBugreportCopiedPath(collected.value.stdout);
1155
- if (reportedPath === null)
1156
- return err(new AnalysisProtocolError("adb bugreport did not report an archive path; the build may use an unsupported format"));
1838
+ let stagingDirectory;
1839
+ let stagingIdentity;
1840
+ let retainedObservation;
1841
+ let publishedPath;
1157
1842
  try {
1158
- const digest = await hashAdbFile(reportedPath, operation, signal);
1159
- return ok(createAnalysisExecution({
1160
- client,
1161
- serial: input.serial,
1162
- local_path: reportedPath,
1163
- bytes: digest.bytes,
1164
- sha256: digest.sha256,
1165
- adb_reported_path: reportedPath,
1166
- }, provider, {
1167
- limitations: [
1168
- "The archive is device-generated: dumpstate, dumpsys, and logcat content is the device's own report",
1169
- ],
1170
- }));
1843
+ stagingDirectory = await mkdtemp(join(directory.value, ".rea-bugreport-"));
1171
1844
  }
1172
1845
  catch (cause) {
1173
- if (cause instanceof AnalysisCancelledError) {
1174
- cause.retainPartialObservation({
1846
+ return err(new AnalysisOutputError(operation, "The bugreport staging directory could not be created", { cause }));
1847
+ }
1848
+ const collectedResult = await (async () => {
1849
+ let reportedPath = null;
1850
+ try {
1851
+ const created = await lstat(stagingDirectory);
1852
+ if (!created.isDirectory() || created.isSymbolicLink())
1853
+ throw new Error(`The created bugreport staging output is not a regular directory: ${stagingDirectory}`);
1854
+ stagingIdentity = {
1855
+ dev: created.dev,
1856
+ ino: created.ino,
1857
+ mode: created.mode,
1858
+ };
1859
+ const collected = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, ["bugreport", stagingDirectory]), {
1860
+ timeoutMs: BUGREPORT_TIMEOUT_MS,
1861
+ maxOutputBytes: BUGREPORT_MAX_OUTPUT_BYTES,
1862
+ }, signal);
1863
+ if (!collected.ok)
1864
+ return collected;
1865
+ reportedPath = parseBugreportCopiedPath(collected.value.stdout);
1866
+ if (reportedPath === null)
1867
+ return err(new AnalysisProtocolError("adb bugreport did not report an archive path; the build may use an unsupported format"));
1868
+ if (dirname(resolve(reportedPath)) !== stagingDirectory)
1869
+ return err(new AnalysisProtocolError(`adb bugreport reported an archive outside its staging directory: ${reportedPath}`));
1870
+ const archive = await lstat(reportedPath);
1871
+ if (!archive.isFile() || archive.isSymbolicLink())
1872
+ return err(new AnalysisProtocolError(`adb bugreport did not report a regular archive file: ${reportedPath}`));
1873
+ retainedObservation = {
1175
1874
  provider_id: "adb",
1176
1875
  operation,
1177
1876
  result: {
@@ -1181,10 +1880,71 @@ export class AdbProvider {
1181
1880
  adb_reported_path: reportedPath,
1182
1881
  digest_status: "unknown",
1183
1882
  },
1184
- });
1185
- return err(cause);
1883
+ };
1884
+ try {
1885
+ publishedPath = await publishBugreport(reportedPath, directory.value);
1886
+ }
1887
+ catch (cause) {
1888
+ return err(new AnalysisOutputError(operation, `The reported bugreport archive could not be published: ${reportedPath}`, { cause, partialObservation: retainedObservation }));
1889
+ }
1890
+ retainedObservation = {
1891
+ ...retainedObservation,
1892
+ result: { ...retainedObservation.result, local_path: publishedPath },
1893
+ };
1894
+ const digest = await hashAdbFile(publishedPath, operation, signal, this.#resources);
1895
+ const report = {
1896
+ client,
1897
+ serial: input.serial,
1898
+ local_path: publishedPath,
1899
+ bytes: digest.bytes,
1900
+ sha256: digest.sha256,
1901
+ adb_reported_path: reportedPath,
1902
+ };
1903
+ retainedObservation = {
1904
+ provider_id: "adb",
1905
+ operation,
1906
+ result: report,
1907
+ };
1908
+ return ok(createAnalysisExecution(report, provider, {
1909
+ limitations: [
1910
+ "The archive is device-generated: dumpstate, dumpsys, and logcat content is the device's own report",
1911
+ ],
1912
+ }));
1913
+ }
1914
+ catch (cause) {
1915
+ const cleanupError = retainedObservation === undefined
1916
+ ? undefined
1917
+ : adbDigestError(cause, operation, retainedObservation);
1918
+ if (cleanupError !== undefined)
1919
+ return err(cleanupError);
1920
+ if (cause instanceof AnalysisCancelledError) {
1921
+ if (retainedObservation !== undefined)
1922
+ cause.retainPartialObservation(retainedObservation);
1923
+ return err(cause);
1924
+ }
1925
+ return err(new AnalysisOutputError(operation, `The reported bugreport archive could not be read back: ${reportedPath ?? stagingDirectory}`, { cause, partialObservation: retainedObservation }));
1186
1926
  }
1187
- return err(new AnalysisOutputError(operation, `The reported bugreport archive could not be read back: ${reportedPath}`, { cause }));
1927
+ })();
1928
+ // A completed acquisition becomes caller evidence even if publication fails.
1929
+ // Its staging directory must not enter automatic cleanup or cleanup retries.
1930
+ if (retainedObservation !== undefined && publishedPath === undefined)
1931
+ return collectedResult;
1932
+ try {
1933
+ await removeOwnedOutputDirectory(stagingDirectory, stagingIdentity);
1934
+ }
1935
+ catch (cause) {
1936
+ const primary = collectedResult.ok
1937
+ ? new AnalysisOutputError(operation, "The archive was published, but its staging directory could not be removed")
1938
+ : collectedResult.error;
1939
+ if (retainedObservation !== undefined)
1940
+ primary.retainPartialObservation(retainedObservation);
1941
+ return err(this.#retainOutputDirectoryCleanup({
1942
+ operation,
1943
+ path: stagingDirectory,
1944
+ primary,
1945
+ remove: () => removeOwnedOutputDirectory(stagingDirectory, stagingIdentity),
1946
+ }, new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [stagingDirectory], { reason: cause instanceof Error ? cause.message : String(cause) }, { operation, cause })));
1188
1947
  }
1948
+ return collectedResult;
1189
1949
  }
1190
1950
  }