rea-agents 6.5.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.
- package/README.md +12 -3
- package/THIRD_PARTY_NOTICES.md +1 -0
- package/bridge/android/ReaJadxBridge.java +167 -23
- package/bridge/cutter/rea_bridge.py +19 -10
- package/bridge/ghidra/ReaGhidraBridge.java +98 -66
- package/bridge/hopper_bridge.py +9 -1
- package/bridge/native/rea_lldb_tracer.py +48 -4
- package/bridge/pwndbg/core_context.py +15 -2
- package/dist/adb/AdbCommand.js +148 -0
- package/dist/adb/AdbConfiguration.js +26 -4
- package/dist/adb/AdbInputSnapshot.js +126 -0
- package/dist/adb/AdbProvider.js +765 -248
- package/dist/adb/AdbShellOutput.js +92 -21
- package/dist/android/AndroidTargetSnapshot.js +7 -7
- package/dist/android/JadxAnalysis.js +27 -32
- package/dist/android/JadxConfiguration.js +173 -125
- package/dist/android/JadxDoctor.js +11 -3
- package/dist/android/JadxFailure.js +154 -0
- package/dist/android/JadxInterruption.js +13 -0
- package/dist/android/JadxJavaProbe.js +246 -0
- package/dist/android/JadxMcpTransport.js +48 -15
- package/dist/android/JadxProtocol.js +29 -2
- package/dist/android/JadxProvider.js +171 -96
- package/dist/android/JadxRelease.js +5 -1
- package/dist/android/JadxSession.js +35 -14
- package/dist/apktool/ApktoolCommandCleanup.js +134 -0
- package/dist/apktool/ApktoolCommandOutput.js +22 -0
- package/dist/apktool/ApktoolConfiguration.js +162 -44
- package/dist/apktool/ApktoolDecodeOutput.js +29 -23
- package/dist/apktool/ApktoolDecodedInventory.js +52 -0
- package/dist/apktool/ApktoolProvider.js +254 -335
- package/dist/apktool/ApktoolStringTables.js +178 -0
- package/dist/apktool/ApktoolWorkspace.js +162 -0
- package/dist/application/AnalysisDocument.js +19 -4
- package/dist/application/AnalysisProvider.js +15 -1
- package/dist/application/AppBundleExecutable.js +11 -4
- package/dist/application/BinaryTargetResolver.js +9 -2
- package/dist/application/BrowserObservationService.js +54 -20
- package/dist/application/BrowserScenarioCaptureService.js +26 -6
- package/dist/application/CapabilityInventory.js +14 -8
- package/dist/application/ClaudeDesktopConfigLocation.js +5 -5
- package/dist/application/ClientConfigurationCleanup.js +73 -0
- package/dist/application/ClientConfigurationDocument.js +170 -128
- package/dist/application/ClientConfigurationPublication.js +167 -0
- package/dist/application/ClientRegistrationEnvironment.js +31 -1
- package/dist/application/ClientRegistrationIdentity.js +54 -39
- package/dist/application/ClientRegistrationStatus.js +123 -48
- package/dist/application/DirectAnalysis.js +15 -2
- package/dist/application/DirectAnalysisCleanup.js +5 -1
- package/dist/application/DirectAnalysisStatus.js +1 -1
- package/dist/application/Doctor.js +83 -9
- package/dist/application/DoctorDiagnostics.js +25 -4
- package/dist/application/DoctorProviderIds.js +7 -1
- package/dist/application/DshCordisPatch.js +1 -1
- package/dist/application/EnhancedTools.js +9 -21
- package/dist/application/HermesClientHome.js +20 -0
- package/dist/application/HermesConfigurationYaml.js +43 -3
- package/dist/application/HopperDownload.js +11 -3
- package/dist/application/HopperReleaseFeed.js +71 -0
- package/dist/application/InvestigationProviders.js +4 -3
- package/dist/application/JsonFiles.js +1 -1
- package/dist/application/LinuxHopper.js +96 -71
- package/dist/application/LinuxHopperPublisher.js +656 -0
- package/dist/application/MacHopper.js +182 -66
- package/dist/application/MipsElfMetadata.js +1 -1
- package/dist/application/MsixPackageStorage.js +13 -6
- package/dist/application/ProviderOperationExecution.js +13 -20
- package/dist/application/ReconstructionObligationCandidates.js +17 -2
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +4 -0
- package/dist/application/ReconstructionObligationLedgerService.js +5 -3
- package/dist/application/ReconstructionObligationOriginalCases.js +8 -0
- package/dist/application/ReferenceSourceImportEntries.js +160 -18
- package/dist/application/ReferenceSourceImportPolicy.js +5 -3
- package/dist/application/ReferenceSourceVcsAdapter.js +3 -1
- package/dist/application/RegularFileRead.js +107 -88
- package/dist/application/Setup.js +23 -11
- package/dist/application/SetupClientConfiguration.js +155 -89
- package/dist/application/SetupClients.js +22 -13
- package/dist/application/SetupHost.js +90 -34
- package/dist/application/SetupInstallFailure.js +18 -3
- package/dist/application/SetupPlan.js +15 -5
- package/dist/application/SetupRecoveryBackup.js +40 -13
- package/dist/application/SetupRegistrationEnvironment.js +12 -0
- package/dist/application/SetupSkill.js +10 -30
- package/dist/application/SourceLimitations.js +35 -0
- package/dist/application/SupportedClients.js +4 -4
- package/dist/application/Uninstall.js +91 -36
- package/dist/application/UpdateCommandProgress.js +66 -0
- package/dist/application/UpdateMaintenance.js +7 -2
- package/dist/application/UpdateRuntime.js +60 -30
- package/dist/application/WebModuleTraceService.js +35 -22
- package/dist/application/WebNetworkCaptureService.js +8 -5
- package/dist/application/WebRuntimeService.js +41 -8
- package/dist/application/WebScriptExportService.js +6 -4
- package/dist/application/WebSourceLocationService.js +3 -4
- package/dist/application/WorkflowEvidence.js +11 -4
- package/dist/application/analysisView/AnalysisViewService.js +9 -52
- package/dist/application/android/AndroidAnalysisService.js +5 -4
- package/dist/application/android/AndroidSearchEvidenceSummary.js +6 -8
- package/dist/application/artifacts/ArtifactComparisonEvidence.js +32 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +14 -11
- package/dist/application/binary/AnalysisProviderRegistry.js +340 -50
- package/dist/application/binary/BinarySession.js +73 -34
- package/dist/application/binary/BinarySessionRecords.js +3 -0
- package/dist/application/binary/BinarySessionStatus.js +3 -4
- package/dist/application/binary/CompositeProvider.js +75 -30
- package/dist/application/binary/LazyAnalysisProvider.js +6 -68
- package/dist/application/binary/SessionProviderRouter.js +11 -2
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +3 -4
- package/dist/application/binaryDiagnostics/PeResourcesService.js +22 -5
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +3 -4
- package/dist/application/captures/PacketCaptureService.js +3 -2
- package/dist/application/closeOwnedWebResources.js +32 -2
- package/dist/application/electron/ElectronFuseService.js +8 -43
- package/dist/application/evm/EvmInterfaceEvidence.js +11 -0
- package/dist/application/evm/EvmInterfaceService.js +4 -15
- package/dist/application/firmware/FirmwareAnalysisService.js +4 -3
- package/dist/application/go/GoBinaryService.js +4 -5
- package/dist/application/investigation/EvidenceLedger.js +3 -4
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +14 -2
- package/dist/application/javascript/ElectronEvidence.js +1 -2
- package/dist/application/javascript/ElectronObservationService.js +41 -7
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +6 -0
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +35 -17
- package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +30 -1
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +3 -2
- package/dist/application/javascript/JavaScriptArtifactGraphEvidence.js +3 -3
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +41 -11
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +18 -8
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +84 -24
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +15 -3
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationEvidence.js +1 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +33 -10
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +103 -24
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +13 -4
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +23 -3
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +18 -5
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +4 -6
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +5 -8
- package/dist/application/native/NativeCallRoutes.js +40 -23
- package/dist/application/native/NativeUiActionTrace.js +8 -0
- package/dist/application/native/NativeValueTrace.js +8 -0
- package/dist/application/reverse/ReverseEngineeringService.js +2 -2
- package/dist/application/rust/RustBinaryService.js +6 -4
- package/dist/application/signals/SignalRecordingService.js +3 -2
- package/dist/application/wasm/WasmArtifactService.js +4 -5
- package/dist/artifacts/AnalysisCleanupLease.js +119 -0
- package/dist/artifacts/ArtifactFileOperation.js +150 -0
- package/dist/artifacts/ArtifactHash.js +2 -1
- package/dist/artifacts/ArtifactProvider.js +16 -5
- package/dist/artifacts/ArtifactReader.js +50 -4
- package/dist/artifacts/ArtifactResourceScope.js +80 -6
- package/dist/artifacts/AsarArtifactReader.js +12 -11
- package/dist/artifacts/AsarEntryStream.js +49 -17
- package/dist/artifacts/DirectoryArtifactReader.js +28 -7
- package/dist/artifacts/MachOSliceArtifactReader.js +70 -13
- package/dist/artifacts/NativeDmgArtifactReader.js +112 -13
- package/dist/artifacts/SafeOutputTree.js +5 -3
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +1 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +10 -16
- package/dist/artifacts/ZipArtifactReader.js +34 -14
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +3 -1
- package/dist/artifacts/apple/DylibFileAccess.js +106 -0
- package/dist/artifacts/apple/DylibResolutionReader.js +64 -155
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +52 -9
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +25 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +20 -11
- package/dist/artifacts/apple/MachoLoadCommandReader.js +17 -2
- package/dist/artifacts/apple/PlistNumberLiterals.js +104 -116
- package/dist/artifacts/extraction/ArtifactExtraction.js +15 -12
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +9 -11
- package/dist/artifacts/inventory/ArtifactInventory.js +2 -2
- package/dist/artifacts/inventory/classify.js +4 -2
- package/dist/artifacts/inventory/hashStableRootArtifact.js +14 -7
- package/dist/artifacts/inventory/scanCanonical.js +3 -4
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +3 -1
- package/dist/artifacts/readArtifactFileChunks.js +9 -0
- package/dist/artifacts/readStableArtifact.js +12 -34
- package/dist/browser/BrowserScenarioPartialObservation.js +14 -48
- package/dist/browser/CdpBrowserProvider.js +81 -30
- package/dist/browser/CdpCaptureDocuments.js +99 -131
- package/dist/browser/CdpCaptureDomSvg.js +31 -60
- package/dist/browser/CdpCaptureValues.js +12 -0
- package/dist/browser/CdpConnection.js +133 -27
- package/dist/browser/CdpElectronInspection.js +60 -60
- package/dist/browser/CdpElectronProvider.js +56 -4
- package/dist/browser/CdpElectronScriptEvents.js +4 -1
- package/dist/browser/CdpElectronScripts.js +2 -5
- package/dist/browser/CdpElectronWorkers.js +13 -2
- package/dist/browser/CdpPageCapture.js +2 -1
- package/dist/browser/CdpPageCaptureScripts.js +14 -10
- package/dist/browser/CdpPageCaptureWorkers.js +45 -14
- package/dist/browser/CdpSafeMetadata.js +23 -19
- package/dist/browser/CdpSnapshotNodes.js +103 -0
- package/dist/browser/CdpSnapshotStrings.js +0 -6
- package/dist/browser/CdpTargetSession.js +52 -10
- package/dist/browser/CdpTargetSessionOwner.js +198 -0
- package/dist/browser/ElectronCaptureCleanup.js +82 -0
- package/dist/browser/ElectronProcessCleanup.js +91 -0
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +71 -16
- package/dist/browser/PlaywrightElectronActiveActions.js +53 -5
- package/dist/browser/PlaywrightElectronActiveFuses.js +86 -0
- package/dist/browser/PlaywrightElectronActiveProjection.js +5 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +140 -151
- package/dist/browser/PlaywrightExecutionBoundary.js +4 -2
- package/dist/browser/PlaywrightScenarioBrowser.js +236 -90
- package/dist/browser/PlaywrightScenarioEvents.js +135 -48
- package/dist/browser/PlaywrightScenarioServiceWorkers.js +121 -34
- package/dist/browser/PlaywrightScenarioSession.js +95 -22
- package/dist/browser/PlaywrightScenarioStorage.js +15 -7
- package/dist/browser/StructuredFieldToken.js +53 -0
- package/dist/browser/WebArtifactCleanup.js +53 -0
- package/dist/browser/WebSourceMapFetcher.js +19 -10
- package/dist/browser/assets/WebArtifactReads.js +6 -2
- package/dist/browser/assets/WebSourceLocationArtifacts.js +12 -3
- package/dist/browser/execution/CdpRuntimeSession.js +36 -7
- package/dist/browser/execution/CdpWebRuntimeProvider.js +22 -4
- package/dist/browser/history/CaptureFailures.js +7 -2
- package/dist/browser/history/HarCapture.js +42 -11
- package/dist/browser/history/SazMetadata.js +10 -47
- package/dist/browser/modules/NativeModuleResolver.js +108 -58
- package/dist/browser/modules/WebModuleArtifacts.js +12 -3
- package/dist/browser/network/PlaywrightNetworkContent.js +40 -17
- package/dist/browser/network/PlaywrightScenarioNetwork.js +182 -73
- package/dist/captures/TsharkCaptureProvider.js +13 -6
- package/dist/catalogIdentity.js +19 -14
- package/dist/cli/adbCommands.js +18 -19
- package/dist/cli/androidCommands.js +2 -14
- package/dist/cli/apktoolCommands.js +4 -14
- package/dist/cli/binaryDiagnosticsCommands.js +5 -5
- package/dist/cli/browserAdvancedCommands.js +11 -4
- package/dist/cli/browserCommands.js +21 -12
- package/dist/cli/captureCommands.js +4 -4
- package/dist/cli/cliResultOutput.js +175 -89
- package/dist/cli/coreBinaryCommands.js +4 -3
- package/dist/cli/cutterCommands.js +51 -13
- package/dist/cli/electronCommands.js +34 -13
- package/dist/cli/evmCommands.js +6 -15
- package/dist/cli/finishAnalysisCommand.js +10 -2
- package/dist/cli/firmwareCommands.js +6 -14
- package/dist/cli/flutterCommands.js +2 -18
- package/dist/cli/fridaCommands.js +8 -0
- package/dist/cli/goCommands.js +2 -2
- package/dist/cli/javascriptRecoveryCommands.js +14 -26
- package/dist/cli/jebCommands.js +2 -14
- package/dist/cli/options.js +6 -0
- package/dist/cli/pcapCommands.js +2 -20
- package/dist/cli/rustCommands.js +6 -7
- package/dist/cli/setupCommands.js +4 -3
- package/dist/cli/signalCommands.js +4 -4
- package/dist/cli/sqliteCommands.js +17 -44
- package/dist/cli/wasmCommands.js +7 -18
- package/dist/cli/webModuleCommands.js +19 -34
- package/dist/cli/webNetworkCaptureCommands.js +3 -2
- package/dist/cli/webRuntimeCommands.js +15 -6
- package/dist/cli/webSourceLocationCommands.js +14 -33
- package/dist/cli-runtime/AnalysisCleanupLease-CWfTGYKd.js +103 -0
- package/dist/cli-runtime/{AnalysisProvider-D0Us2OTk.js → AnalysisProvider-BGrYaMVo.js} +14 -3
- package/dist/cli-runtime/{AnalysisSnapshotCache-BXS0wRd2.js → AnalysisSnapshotCache-BjRlXeUS.js} +14 -13
- package/dist/cli-runtime/ArtifactFileOperation-Dg4BcoEM.js +122 -0
- package/dist/cli-runtime/{ArtifactReader-BXkffc1D.js → ArtifactReader-DMwm42bk.js} +29 -6
- package/dist/cli-runtime/ArtifactResourceScope-CokZGcII.js +175 -0
- package/dist/cli-runtime/{AsarHeader-CnzOzYEH.js → AsarHeader-BxwU17DJ.js} +1 -1
- package/dist/cli-runtime/{BinarySessionStatus-DnMxMk-r.js → BinarySessionStatus-DRhjr7Vb.js} +4 -3
- package/dist/cli-runtime/{BinaryTargetResolver-CVIJ_s1A.js → BinaryTargetResolver-tuCTjBlQ.js} +38 -108
- package/dist/cli-runtime/{BoundedFileBytes-BU30odTm.js → BoundedFileBytes-DRtiQNAQ.js} +7 -3
- package/dist/cli-runtime/{CdpTargetSession-DGX5pV9w.js → CdpTargetSession-CQ08KHbh.js} +318 -43
- package/dist/cli-runtime/ClientConfigPath-Dn-V_GUf.js +255 -0
- package/dist/cli-runtime/{ClientConfigurationDocument-ffQ9X0Se.js → ClientConfigurationDocument-C9T8MNGc.js} +206 -142
- package/dist/cli-runtime/{ClientRegistrationStatus-DszCyPEU.js → ClientRegistrationStatus-PnD29RTX.js} +112 -36
- package/dist/cli-runtime/{CurrentEntrypointPath-D5FRNdkq.js → CurrentEntrypointPath-m7QCIVN0.js} +1 -1
- package/dist/cli-runtime/{DirectAnalysis-BgvAtpN3.js → DirectAnalysis-C5NyUryV.js} +76 -23
- package/dist/cli-runtime/DirectoryArtifactReader-CokAJ8vo.js +448 -0
- package/dist/cli-runtime/{Doctor-DIpf_I7N.js → Doctor-DrkWsav4.js} +105 -25
- package/dist/cli-runtime/{ElectronFileScope-dpHm2nrS.js → ElectronFileScope-AP7VoVr7.js} +204 -149
- package/dist/cli-runtime/ElectronFuseFailures-DsjXR7Xp.js +609 -0
- package/dist/cli-runtime/{ExecFileOutput-BEQs-lDD.js → ExecFileOutput-D6KLYTve.js} +11 -9
- package/dist/cli-runtime/{InterfaceBuilderDecodeBudget-D4omRUe4.js → InterfaceBuilderDecodeBudget-CW1IO3dG.js} +40 -21
- package/dist/cli-runtime/{InventoryProjectionEvidence-DIsI4DJ6.js → InventoryProjectionEvidence-DTH5QAqL.js} +3 -3
- package/dist/cli-runtime/{InvestigationProviders-DoQRIHii.js → InvestigationProviders-CFh4a64d.js} +3 -2
- package/dist/cli-runtime/{JavaScriptApplicationEvidenceGraph-D5aI_FSJ.js → JavaScriptApplicationEvidenceGraph-gOmPB2L6.js} +6 -6
- package/dist/cli-runtime/{JavaScriptApplicationWorkflowEvidence-Bz4-V0Ct.js → JavaScriptApplicationWorkflowEvidence-WZgtK_Ok.js} +2 -2
- package/dist/cli-runtime/JebMcpEndpoint-BEalGZh9.js +710 -0
- package/dist/cli-runtime/{JsonFiles-DQa1PRKy.js → JsonFiles-uvd6ZyQi.js} +10 -118
- package/dist/cli-runtime/KunaInstallation-P0j3x851.js +1781 -0
- package/dist/cli-runtime/MacHopperPaths-bGzqjF1Z.js +34 -0
- package/dist/cli-runtime/{MachoLoadCommandReader-C7e074Ze.js → MachoLoadCommandReader-CZm6N5vF.js} +12 -192
- package/dist/cli-runtime/{ManagedSnapshot-rqyBHcdL.js → ManagedSnapshot-CPE9C3OD.js} +406 -110
- package/dist/cli-runtime/OwnedCommandCleanup-BN_V6Erc.js +187 -0
- package/dist/cli-runtime/OwnedRegularFile-D1f5nUCx.js +256 -0
- package/dist/cli-runtime/OwnedStagedOutput-D31dOozz.js +126 -0
- package/dist/cli-runtime/{PrivateRuntimeRoot-DAy0PiBM.js → PrivateRuntimeRoot-Cd23u6jd.js} +39 -6
- package/dist/cli-runtime/ProcessOwnership-CtrNr6ee.js +545 -0
- package/dist/cli-runtime/{ProcessOwnership-DXC5-UWt.js → ProcessOwnershipObservation-C006iCtZ.js} +149 -607
- package/dist/cli-runtime/{ProviderDeadline-8m2pFRDc.js → ProviderDeadline-rSuH4Pm8.js} +27 -1
- package/dist/cli-runtime/ProviderOperationExecution-CmU-XrQr.js +38 -0
- package/dist/cli-runtime/{snapshotEnvironment-D_tWyOub.js → ProviderProcess-D87A7ctp.js} +117 -160
- package/dist/cli-runtime/RegularFileRead-mbgGYtxe.js +125 -0
- package/dist/cli-runtime/{SafeOutputTree-D6U15GXd.js → SafeOutputTree-i904hd_2.js} +21 -20
- package/dist/cli-runtime/{SetupHost-FkYWswsq.js → SetupHost-CMPmPraB.js} +365 -195
- package/dist/cli-runtime/SharedStartupAttempt-BxKyf3Uv.js +1424 -0
- package/dist/cli-runtime/StableFileHash-Ame_h3lY.js +61 -0
- package/dist/cli-runtime/{SupportedClients-DaX6Lt2d.js → SupportedClients-DMafjitv.js} +89 -72
- package/dist/cli-runtime/{Update-CbTC_eg1.js → Update-DAsASWlE.js} +1 -1
- package/dist/cli-runtime/{AbortablePromise-BVBemxbD.js → WindowsBatchCommand-Cx9kaVNf.js} +2 -28
- package/dist/cli-runtime/WindowsNativeLoader-BqyZO0ZD.js +142 -0
- package/dist/cli-runtime/{ZipArtifactReader-B8ZgNe4D.js → ZipArtifactReader-Jed69LEL.js} +20 -16
- package/dist/cli-runtime/{analysisErrorCleanup-Do6YeeoD.js → analysisErrorCleanup-COdAmDsb.js} +4 -3
- package/dist/cli-runtime/{appleArchiveFormat-tVoI2ykA.js → appleArchiveFormat-Bb3G5CCI.js} +13 -7
- package/dist/cli-runtime/{application__DirectAnalysisStatus-DpOejOf0.js → application__DirectAnalysisStatus-F74bu9oy.js} +10 -10
- package/dist/cli-runtime/{application__EnhancedTools-oFE2bOjs.js → application__EnhancedTools-Bg51b0Yp.js} +84 -51
- package/dist/cli-runtime/{application__FunctionAnalysisEvidence-B6osuhvW.js → application__FunctionAnalysisEvidence-DBWIaYCh.js} +3 -3
- package/dist/cli-runtime/{application__ReconstructionCoverageService-DN3wTFQj.js → application__ReconstructionCoverageService-AEPNpZqJ.js} +3 -3
- package/dist/cli-runtime/{application__ReconstructionObligationLedgerService-CKcTppX9.js → application__ReconstructionObligationLedgerService-Cl9cPEZf.js} +22 -9
- package/dist/cli-runtime/{application__Setup-XpMaRNjy.js → application__Setup-DwQzEewK.js} +30 -18
- package/dist/cli-runtime/{application__Uninstall-_23pU2yB.js → application__Uninstall-BOf9oyvQ.js} +78 -37
- package/dist/cli-runtime/{application__UpdateRuntime-DPvY8ohd.js → application__UpdateRuntime-CzWkRJHa.js} +119 -29
- package/dist/cli-runtime/{application__android__AndroidApplicationService-CFgIFPM4.js → application__android__AndroidApplicationService-shW_aKlj.js} +3 -3
- package/dist/cli-runtime/{application__apple__AppleApplicationService-Db6QCsun.js → application__apple__AppleApplicationService-DIv6d3wB.js} +3 -3
- package/dist/cli-runtime/{application__harmony__HarmonyApplicationService-CFjocHoK.js → application__harmony__HarmonyApplicationService-OIUFVQFV.js} +3 -3
- package/dist/cli-runtime/{application__javascript__ElectronActiveObservationService-CmVDUI_Z.js → application__javascript__ElectronActiveObservationService-wvCh72hK.js} +3 -3
- package/dist/cli-runtime/application__javascript__ElectronObservationService-SydXPCwM.js +88 -0
- package/dist/cli-runtime/{application__javascript__JavaScriptApplicationService-CCkp8KBh.js → application__javascript__JavaScriptApplicationService-o0uEsjEc.js} +1120 -316
- package/dist/cli-runtime/{application__javascript__JavaScriptApplicationWorkflowService-lPy0tzr3.js → application__javascript__JavaScriptApplicationWorkflowService-BAheG_71.js} +51 -44
- package/dist/cli-runtime/{application__javascript__JavaScriptRuntimeReconciliationService-DWleA8K9.js → application__javascript__JavaScriptRuntimeReconciliationService-Cnn4GP8q.js} +5 -5
- package/dist/cli-runtime/{application__javascript__JavaScriptSemanticTraceService-DkALH4rL.js → application__javascript__JavaScriptSemanticTraceService-CmvLfV1A.js} +6 -6
- package/dist/cli-runtime/{artifacts__ArtifactProvider-zXI0QjSL.js → artifacts__ArtifactProvider-wx2K0F2I.js} +377 -359
- package/dist/cli-runtime/{binary-BVOr2mgE.js → binary-CWVNJhAC.js} +8561 -3159
- package/dist/cli-runtime/{catalogIdentity-DLoXgfIR.js → catalogIdentity-DAEEsOdX.js} +260 -81
- package/dist/cli-runtime/cli.js +6177 -3556
- package/dist/cli-runtime/{cliOutput-BC1BdAcB.js → cliOutput-CgSuw782.js} +47 -6
- package/dist/cli-runtime/cliOutput.js +2 -2
- package/dist/cli-runtime/cliResultOutput-10sd6xGx.js +1453 -0
- package/dist/cli-runtime/cliResultOutput.js +2 -1
- package/dist/cli-runtime/{composition__browserScenario-DHXC1a8n.js → composition__browserScenario-BtPb1c1y.js} +843 -356
- package/dist/cli-runtime/{composition__electronObservation-GecK2EID.js → composition__electronObservation-Bk8R6DJo.js} +128 -69
- package/dist/cli-runtime/{composition__electronScenario-CEZnVrAL.js → composition__electronScenario-BVF0qStH.js} +398 -135
- package/dist/cli-runtime/{cutterToolContracts-TZH9EHr5.js → cutterToolContracts-BQtG_Nzo.js} +195 -62
- package/dist/cli-runtime/{doctorRuntime-BE5ZX8it.js → doctorRuntime-B__SIpm-.js} +241 -21
- package/dist/cli-runtime/{dotnet__ManagedStaticProvider-C8_yZCDc.js → dotnet__ManagedStaticProvider-DO5Yzcp4.js} +1 -1
- package/dist/cli-runtime/{errorSchemas-CTRmvMl3.js → errorSchemas-Ixz_q7qt.js} +58 -4
- package/dist/cli-runtime/homeDirectory-DC_DeJIg.js +18 -0
- package/dist/cli-runtime/{javascriptApplicationAnalysis-HgMzVMQw.js → javascriptApplicationAnalysis-Dk6yBV8g.js} +688 -668
- package/dist/cli-runtime/{javascriptExportReturnShapeProjection-Dg00g35t.js → javascriptExportReturnShapeProjection-CObOIiQ6.js} +3 -3
- package/dist/cli-runtime/{javascriptExportShapeComparisonSchemas-BYnoIqIk.js → javascriptExportShapeComparisonSchemas-DpwuBenh.js} +5 -3
- package/dist/cli-runtime/{javascriptRuntimeReconciliation-DNjDoL3S.js → javascriptRuntimeReconciliation-C6ZgWMys.js} +61 -59
- package/dist/cli-runtime/{javascriptRuntimeReconciliationSchemas-BWpGWNcI.js → javascriptRuntimeReconciliationSchemas-D6tZKUQs.js} +2 -2
- package/dist/cli-runtime/{javascriptSemanticTraceSchemas-BTCNcvbc.js → javascriptSemanticTraceSchemas-C7m0b6_w.js} +3 -3
- package/dist/cli-runtime/{lipo-DSWP6fv-.js → lipo-DPQ6qurH.js} +9 -11
- package/dist/cli-runtime/{logger-CQQCI4a2.js → logger-BuDJ9xxO.js} +2 -2
- package/dist/cli-runtime/{machoContainer-C8BIkkq3.js → machoContainer-Cy98bkFm.js} +180 -0
- package/dist/cli-runtime/{managedApplicationGraph-B08jb3jq.js → managedApplicationGraph-BazVqpJv.js} +16 -10
- package/dist/cli-runtime/{managedToolContracts-D60QmIYj.js → managedToolContracts-BuFkMBH5.js} +2 -2
- package/dist/cli-runtime/mcpDoctor.js +8 -6
- package/dist/cli-runtime/mcpStartupPolicy-imCbM3qo.js +28 -0
- package/dist/cli-runtime/{native__NativeMacOSProvider-YBTvUeJO.js → native__NativeMacOSProvider-DTcRhuGA.js} +1384 -757
- package/dist/cli-runtime/{officialToolContracts-CCFF0an9.js → officialToolContracts-CzzVLx8I.js} +74 -53
- package/dist/cli-runtime/peMachine-B9ggfSJJ.js +95 -0
- package/dist/cli-runtime/propertyListKeys-D5dSASEy.js +355 -0
- package/dist/cli-runtime/{providerCleanupError-Ceq8f0wK.js → providerCleanupError-BhsJyAhk.js} +3 -5
- package/dist/cli-runtime/readArtifactFileChunks-BbTL_PtB.js +129 -0
- package/dist/cli-runtime/{reconstructionObligationLedgerSchemas-Bao0xMr-.js → reconstructionObligationLedgerSchemas-Bi6sect1.js} +6329 -3651
- package/dist/cli-runtime/{scanCanonical-KP4T9jSl.js → scanCanonical-CcDFUr-w.js} +233 -363
- package/dist/cli-runtime/snapshotEnvironment-Yvx5qwsl.js +196 -0
- package/dist/cli-runtime/{toolContracts-D2FOG_Nb.js → toolContracts-CJzEyZ38.js} +126 -52
- package/dist/cli-runtime/{toolOutputSchemaGroups-DRiYs1je.js → toolOutputSchemaGroups-BqdSzySu.js} +768 -589
- package/dist/cli-runtime/{workflowInputError-n8Oo-bLA.js → workflowInputError-BP8z9Wxl.js} +2 -2
- package/dist/cli.js +10 -0
- package/dist/cliBrowserScenarioCommands.js +2 -3
- package/dist/cliLogging.js +22 -7
- package/dist/cliObservationOptions.js +3 -0
- package/dist/cliOutput.js +68 -3
- package/dist/composition/binary.js +15 -2
- package/dist/composition/directAnalysis.js +8 -0
- package/dist/composition/javascriptAnalysisWorkerProcess.js +4 -5
- package/dist/composition/jeb.js +32 -21
- package/dist/config/environment.js +36 -2
- package/dist/config/mcpInputSchemaProfile.js +1 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/contracts/adb/adbToolContracts.js +2 -2
- package/dist/contracts/analysisViewApiSurfaceExample.js +4 -4
- package/dist/contracts/analysisViewToolContracts.js +42 -1
- package/dist/contracts/android/androidToolContracts.js +1 -1
- package/dist/contracts/apktool/apktoolToolContracts.js +5 -1
- package/dist/contracts/artifactComparisonExample.js +18 -14
- package/dist/contracts/artifactToolContracts.js +2 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +12 -1
- package/dist/contracts/compactInputSchema.js +13 -6
- package/dist/contracts/fridaToolContracts.js +5 -4
- package/dist/contracts/gdbToolContracts.js +2 -3
- package/dist/contracts/inputSchemaPresentation.js +173 -79
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +1 -0
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +1 -0
- package/dist/contracts/jsonSchemaKeywords.js +29 -0
- package/dist/contracts/managed/managedWorkflowExamples.js +3 -0
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +15 -12
- package/dist/contracts/officialToolContracts.js +2 -2
- package/dist/contracts/rizinDebugToolContracts.js +3 -2
- package/dist/contracts/sessionToolContracts.js +3 -3
- package/dist/contracts/toolEffects.js +6 -2
- package/dist/contracts/toolOutputSchemaGroups.js +7 -4
- package/dist/contracts/toolOutputSchemaPrimitives.js +7 -0
- package/dist/contracts/toolSchemaMetadata.js +99 -27
- package/dist/cutter/CutterBridgeClient.js +206 -67
- package/dist/cutter/CutterBridgeService.js +52 -4
- package/dist/doctorRuntime.js +25 -4
- package/dist/domain/adb/adbDeviceAnalysis.js +19 -1
- package/dist/domain/analysisErrorBase.js +59 -2
- package/dist/domain/analysisErrorCleanup.js +3 -1
- package/dist/domain/analysisErrorCore.js +13 -0
- package/dist/domain/analysisErrorPresentation.js +23 -4
- package/dist/domain/analysisErrorProjection.js +44 -28
- package/dist/domain/analysisSearch.js +26 -0
- package/dist/domain/analysisSnapshot.js +11 -11
- package/dist/domain/analysisView/WebNetworkApiSurfaceAccumulator.js +4 -65
- package/dist/domain/analysisView/analysisView.js +25 -0
- package/dist/domain/analysisView/analysisViewDataAdmission.js +86 -0
- package/dist/domain/analysisView/artifactInventoryView.js +4 -18
- package/dist/domain/analysisView/javascriptApplicationCoverage.js +27 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +100 -27
- package/dist/domain/analysisView/javascriptFactsView.js +92 -0
- package/dist/domain/analysisView/javascriptModuleReferences.js +37 -0
- package/dist/domain/analysisView/managedMemberView.js +6 -0
- package/dist/domain/android/androidApplication.js +8 -7
- package/dist/domain/apktool/apktoolResourceAnalysis.js +52 -2
- package/dist/domain/apple/appleApplication.js +41 -60
- package/dist/domain/apple/appleBundleAnatomy.js +56 -68
- package/dist/domain/apple/dylibResolution.js +5 -1
- package/dist/domain/apple/interfaceBuilderGraph.js +29 -8
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +11 -4
- package/dist/domain/apple/jvmClassFile.js +226 -0
- package/dist/domain/apple/keyedArchive.js +39 -17
- package/dist/domain/apple/machoContainer.js +3 -0
- package/dist/domain/apple/plistNumbers.js +67 -5
- package/dist/domain/apple/plistValue.js +89 -18
- package/dist/domain/artifactComparison.js +7 -5
- package/dist/domain/artifactGraph.js +4 -12
- package/dist/domain/artifactInspection.js +6 -17
- package/dist/domain/artifactInventoryEvidence.js +68 -60
- package/dist/domain/binaryTarget.js +11 -26
- package/dist/domain/binaryTargetTypes.js +10 -0
- package/dist/domain/browserNetworkEvidence.js +20 -3
- package/dist/domain/browserObservation.js +5 -28
- package/dist/domain/browserObservationError.js +4 -4
- package/dist/domain/browserScenarioCapture.js +11 -2
- package/dist/domain/browserScenarioCaptureLimits.js +34 -0
- package/dist/domain/browserScenarioCaptureValues.js +50 -0
- package/dist/domain/browserScenarioDiffEvidence.js +1 -3
- package/dist/domain/browserScenarioValues.js +5 -1
- package/dist/domain/captures/packetCapture.js +2 -1
- package/dist/domain/dosMz.js +14 -5
- package/dist/domain/electron/electronFuseEvidence.js +42 -0
- package/dist/domain/elfFixedHeader.js +24 -0
- package/dist/domain/evidence.js +7 -6
- package/dist/domain/evidenceBundle.js +9 -2
- package/dist/domain/explicitSensitiveFailure.js +3 -0
- package/dist/domain/fileSnapshotObservation.js +25 -0
- package/dist/domain/fixedTupleSchema.js +9 -0
- package/dist/domain/functionCallCoverage.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +38 -11
- package/dist/domain/functionComparisonNormalization.js +17 -9
- package/dist/domain/functionDossierEvidence.js +4 -3
- package/dist/domain/harmony/harmonyApplication.js +8 -8
- package/dist/domain/hopperErrors.js +4 -2
- package/dist/domain/hopperValues.js +27 -4
- package/dist/domain/javascript/electronActiveObservation.js +1 -0
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +80 -20
- package/dist/domain/javascript/electronStaticAnalysisValues.js +0 -20
- package/dist/domain/javascript/electronStaticOptionObjects.js +45 -0
- package/dist/domain/javascript/electronWrappedCallPaths.js +70 -17
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +20 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -0
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +3 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +3 -1
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +49 -21
- package/dist/domain/javascript/javascriptAstFingerprint.js +41 -10
- package/dist/domain/javascript/javascriptAstValues.js +83 -5
- package/dist/domain/javascript/javascriptBundledRequireOrigin.js +23 -36
- package/dist/domain/javascript/javascriptCommonJsExportReceivers.js +231 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +14 -4
- package/dist/domain/javascript/javascriptFeatureSeed.js +1 -1
- package/dist/domain/javascript/javascriptGraphqlOperations.js +382 -0
- package/dist/domain/javascript/javascriptModuleDeclaration.js +20 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -11
- package/dist/domain/javascript/javascriptRpcEndpoints.js +7 -171
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +9 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +35 -12
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +50 -45
- package/dist/domain/javascript/javascriptSemanticAmbientWrites.js +284 -24
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +452 -182
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +37 -20
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +55 -27
- package/dist/domain/javascript/javascriptSemanticCalls.js +4 -4
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +134 -50
- package/dist/domain/javascript/javascriptSemanticCoverage.js +5 -1
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -13
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +33 -10
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +1 -1
- package/dist/domain/javascript/javascriptSemanticEvaluationOrder.js +126 -0
- package/dist/domain/javascript/javascriptSemanticExpressionShapes.js +111 -0
- package/dist/domain/javascript/javascriptSemanticGetterQueries.js +147 -0
- package/dist/domain/javascript/javascriptSemanticGetterResults.js +264 -0
- package/dist/domain/javascript/javascriptSemanticGraph.js +18 -1
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +13 -0
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +3 -2
- package/dist/domain/javascript/javascriptSemanticMapOperations.js +51 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +215 -81
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +395 -118
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +241 -328
- package/dist/domain/javascript/javascriptSemanticObjects.js +33 -27
- package/dist/domain/javascript/javascriptSemanticOpaqueEffects.js +163 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +11 -1
- package/dist/domain/javascript/javascriptSemanticProjection.js +44 -67
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +1 -1
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +45 -7
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +3 -19
- package/dist/domain/javascript/javascriptSemanticResources.js +27 -4
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +78 -37
- package/dist/domain/javascript/javascriptSemanticReturns.js +2 -2
- package/dist/domain/javascript/javascriptSemanticState.js +191 -42
- package/dist/domain/javascript/javascriptSemanticValues.js +167 -41
- package/dist/domain/javascript/javascriptSourceParser.js +54 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +24 -13
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +276 -16
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +33 -25
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -0
- package/dist/domain/javascript/javascriptStaticAnalysisTypes.js +1 -1
- package/dist/domain/javascript/javascriptSymbolicBindings.js +424 -142
- package/dist/domain/javascript/javascriptSymbolicControlFlow.js +4 -0
- package/dist/domain/javascript/javascriptSymbolicValues.js +12 -1
- package/dist/domain/javascript/sourceToBundleSignals.js +3 -0
- package/dist/domain/managed/managedApplicationGraphNodes.js +14 -9
- package/dist/domain/managed/managedArtifact.js +26 -0
- package/dist/domain/managed/managedMemberComparison.js +3 -0
- package/dist/domain/managed/managedMemberComparisonCoverage.js +14 -1
- package/dist/domain/managed/managedMemberComparisonItems.js +124 -52
- package/dist/domain/managed/managedMemberComparisonMatch.js +76 -72
- package/dist/domain/managed/managedMemberSignatureIdentity.js +40 -0
- package/dist/domain/managed/managedNativeVerificationMatch.js +5 -5
- package/dist/domain/managed/managedNativeVerificationSchemas.js +2 -2
- package/dist/domain/mobileApplicationGraphProjection.js +33 -18
- package/dist/domain/native/bytePattern.js +21 -0
- package/dist/domain/native/nativeAotPe.js +29 -2
- package/dist/domain/native/nativeAotSnapshotObservation.js +18 -0
- package/dist/domain/native/nativeCallPartialObservation.js +14 -12
- package/dist/domain/native/nativeLoadImage.js +13 -0
- package/dist/domain/native/objcSwiftMetadata.js +15 -8
- package/dist/domain/native/peResources.js +6 -2
- package/dist/domain/peMachine.js +2 -0
- package/dist/domain/process/processComparison.js +3 -3
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +65 -24
- package/dist/domain/propertyListKeys.js +84 -69
- package/dist/domain/propertyListXml.js +149 -0
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +2 -4
- package/dist/domain/rawBinary.js +11 -2
- package/dist/domain/reconstructionCoverage.js +35 -23
- package/dist/domain/reconstructionCoverageEvaluation.js +36 -36
- package/dist/domain/reconstructionCoverageEvidence.js +26 -0
- package/dist/domain/reconstructionVerification.js +40 -26
- package/dist/domain/referenceSourceImportParsing.js +4 -0
- package/dist/domain/referenceSourcePathIdentity.js +2 -0
- package/dist/domain/referenceSourceRequireBindings.js +40 -101
- package/dist/domain/relationshipCoverage.js +4 -5
- package/dist/domain/sqlite/sqliteDatabase.js +2 -1
- package/dist/domain/symbolAnalysis.js +9 -8
- package/dist/domain/webBundleAnalyzerInspection.js +65 -25
- package/dist/domain/webCaptureDiff.js +124 -41
- package/dist/domain/webInventory.js +28 -14
- package/dist/domain/webModuleTrace.js +22 -0
- package/dist/domain/webScriptExportError.js +2 -3
- package/dist/domain/xmlDocument.js +41 -0
- package/dist/domain/zipPackageFormat.js +0 -4
- package/dist/dotnet/ManagedArtifactInspector.js +2 -4
- package/dist/dotnet/ManagedDecodeBudget.js +21 -1
- package/dist/dotnet/ManagedMemberInspector.js +31 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +63 -12
- package/dist/dotnet/ManagedMemberRows.js +8 -8
- package/dist/dotnet/ManagedMetadataHeaps.js +0 -1
- package/dist/dotnet/ManagedMetadataLayout.js +17 -15
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +20 -19
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +7 -8
- package/dist/dotnet/ManagedPeReader.js +5 -0
- package/dist/dotnet/ManagedSnapshot.js +25 -20
- package/dist/dotnet/ManagedTypeNameDigests.js +177 -0
- package/dist/dotnet/ManagedTypeNames.js +6 -46
- package/dist/dotnet/ManagedTypeNesting.js +25 -0
- package/dist/dotnet/ManagedTypeReferences.js +94 -0
- package/dist/electron/ElectronFuseFailures.js +105 -0
- package/dist/electron/ElectronFusePath.js +4 -3
- package/dist/electron/ElectronFuseProvider.js +67 -92
- package/dist/electron/ElectronFuseReader.js +46 -30
- package/dist/evm/EvmoleFailures.js +1 -0
- package/dist/evm/EvmoleInterfaceProvider.js +13 -16
- package/dist/filesystem/OwnedRegularFile.js +116 -0
- package/dist/filesystem/OwnedStagedOutput.js +28 -11
- package/dist/filesystem/RegularFile.js +20 -8
- package/dist/filesystem/StableFileHash.js +56 -38
- package/dist/filesystem/callerPath.js +26 -0
- package/dist/filesystem/readFileHandleChunks.js +55 -5
- package/dist/filesystem/readStableFileBytes.js +85 -0
- package/dist/firmware/FirmwareCommand.js +13 -7
- package/dist/firmware/FirmwareFailures.js +56 -0
- package/dist/firmware/FirmwareFiles.js +128 -98
- package/dist/firmware/FirmwareProvider.js +120 -65
- package/dist/firmware/FirmwarePublication.js +26 -11
- package/dist/flutter/DartElf.js +27 -0
- package/dist/flutter/FlutterBuildProvider.js +44 -4
- package/dist/gdb/GdbSessionManager.js +202 -14
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +24 -10
- package/dist/ghidra/GhidraAnalysisSeeds.js +39 -55
- package/dist/ghidra/GhidraBridgeSources.js +12 -0
- package/dist/ghidra/GhidraClient.js +362 -148
- package/dist/ghidra/GhidraClientStartup.js +5 -3
- package/dist/ghidra/GhidraClientWire.js +5 -2
- package/dist/ghidra/GhidraDiagnostics.js +16 -5
- package/dist/ghidra/GhidraDoctor.js +45 -14
- package/dist/ghidra/GhidraDosSnapshot.js +83 -0
- package/dist/ghidra/GhidraExecutableHeader.js +54 -0
- package/dist/ghidra/GhidraFileArtifacts.js +93 -0
- package/dist/ghidra/GhidraFunctionValues.js +1 -0
- package/dist/ghidra/GhidraInstallation.js +143 -142
- package/dist/ghidra/GhidraInstallationPolicy.js +20 -79
- package/dist/ghidra/GhidraInstallationProperties.js +57 -0
- package/dist/ghidra/GhidraInventoryValues.js +22 -6
- package/dist/ghidra/GhidraJavaLaunch.js +11 -4
- package/dist/ghidra/GhidraJavaProbe.js +267 -0
- package/dist/ghidra/GhidraJavaProperties.js +9 -7
- package/dist/ghidra/GhidraLanguageCatalog.js +12 -7
- package/dist/ghidra/GhidraLauncher.js +128 -65
- package/dist/ghidra/GhidraLoadImageAttest.js +75 -78
- package/dist/ghidra/GhidraLoadImageValues.js +39 -29
- package/dist/ghidra/GhidraMipsProfile.js +13 -5
- package/dist/ghidra/GhidraNativeAotSnapshotOwner.js +221 -0
- package/dist/ghidra/GhidraPeProfile.js +88 -18
- package/dist/ghidra/GhidraProvider.js +219 -32
- package/dist/ghidra/GhidraProviderCapabilities.js +17 -4
- package/dist/ghidra/GhidraProviderClient.js +199 -239
- package/dist/ghidra/GhidraPspExtension.js +104 -34
- package/dist/ghidra/GhidraPspProfile.js +4 -1
- package/dist/ghidra/GhidraRawBinaryLanguage.js +13 -4
- package/dist/ghidra/GhidraReleasePolicy.js +93 -0
- package/dist/ghidra/GhidraRequestQueue.js +64 -40
- package/dist/ghidra/GhidraSessionError.js +152 -19
- package/dist/ghidra/GhidraSessionValues.js +13 -3
- package/dist/ghidra/GhidraSocketConnection.js +25 -11
- package/dist/ghidra/GhidraTargetSnapshot.js +67 -50
- package/dist/ghidra/GhidraTransport.js +86 -63
- package/dist/ghidra/extensions/GhidraExtensions.js +30 -45
- package/dist/go/GoBinaryProvider.js +89 -60
- package/dist/go/GoElfImage.js +3 -3
- package/dist/hopper/BridgeLauncher.js +43 -4
- package/dist/hopper/HopperAnalysisProfile.js +4 -2
- package/dist/hopper/HopperCleanup.js +14 -1
- package/dist/hopper/HopperClient.js +135 -63
- package/dist/hopper/HopperProvider.js +4 -7
- package/dist/hopper/HopperProviderCapabilities.js +2 -1
- package/dist/hopper/HopperRegexSearch.js +21 -60
- package/dist/ida/IdaBusyHealth.js +36 -2
- package/dist/ida/IdaMcpConnection.js +17 -11
- package/dist/ida/IdaNativeProtocol.js +1 -9
- package/dist/ida/IdaOperationRunner.js +8 -26
- package/dist/ida/IdaProtocolValues.js +2 -1
- package/dist/ida/IdaProvider.js +18 -2
- package/dist/ida/IdaSessionClient.js +54 -12
- package/dist/inspector/V8InspectorCaptureProjection.js +7 -0
- package/dist/inspector/V8InspectorProvider.js +2 -0
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +25 -4
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +4 -3
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +3 -2
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +7 -1
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +1 -1
- package/dist/javascript/recovery/RecoveryFiles.js +57 -8
- package/dist/jeb/JebMcpConnection.js +129 -70
- package/dist/jeb/JebMcpConnectionOwner.js +116 -0
- package/dist/jeb/JebMcpDeadline.js +46 -0
- package/dist/jeb/JebProvider.js +77 -51
- package/dist/kuna/KunaAddress.js +11 -0
- package/dist/kuna/KunaCommand.js +217 -0
- package/dist/kuna/KunaConfiguration.js +90 -0
- package/dist/kuna/KunaDoctor.js +198 -0
- package/dist/kuna/KunaInstallation.js +137 -0
- package/dist/kuna/KunaJson.js +23 -0
- package/dist/kuna/KunaJsonStream.js +433 -0
- package/dist/kuna/KunaLimits.js +5 -0
- package/dist/kuna/KunaProjectCache.js +804 -0
- package/dist/kuna/KunaProjectExport.js +202 -0
- package/dist/kuna/KunaProjectFiles.js +191 -0
- package/dist/kuna/KunaProjectReader.js +115 -0
- package/dist/kuna/KunaProvider.js +217 -0
- package/dist/kuna/KunaProviderCapabilities.js +102 -0
- package/dist/kuna/KunaQueryErrors.js +12 -0
- package/dist/kuna/KunaQueryWork.js +113 -0
- package/dist/kuna/KunaReferenceFiles.js +258 -0
- package/dist/kuna/KunaReferenceQueries.js +211 -0
- package/dist/kuna/KunaRelease.js +10 -0
- package/dist/kuna/KunaRunSlots.js +56 -0
- package/dist/kuna/KunaSessionClient.js +1162 -0
- package/dist/kuna/KunaStringInventory.js +145 -0
- package/dist/kuna/KunaStringQueries.js +133 -0
- package/dist/kuna/KunaTargetCommands.js +205 -0
- package/dist/kuna/KunaUnavailable.js +11 -0
- package/dist/main/processShutdown.js +17 -0
- package/dist/main/transport.js +21 -1
- package/dist/main.js +2 -12
- package/dist/mcp/AnalysisProvider-BABWbLoM.js +38 -0
- package/dist/mcp/{AnalysisSnapshotFiles-BAbiJQOc.js → AnalysisSnapshotFiles-BXz0c37-.js} +39 -28
- package/dist/mcp/{ProcessOwnership-Bl_3ejLe.js → ArtifactFileOperation-64cQKI7B.js} +274 -72
- package/dist/mcp/{ArtifactProvider-DViCU_rn.js → ArtifactProvider-Dx6pmil1.js} +371 -354
- package/dist/mcp/ArtifactProviderMetadata-UCJr2oZW.js +167 -0
- package/dist/mcp/{ArtifactReader-OyM03Gjn.js → ArtifactReader-BrnwNaKY.js} +29 -6
- package/dist/mcp/ArtifactResourceScope-zi3Dkqzy.js +175 -0
- package/dist/mcp/{AsarHeader-WsPgoooH.js → AsarHeader-B_IbppTz.js} +1 -1
- package/dist/mcp/{BinarySessionStatus-B4P9gf-S.js → BinarySessionStatus-CZ9nnXMt.js} +5 -4
- package/dist/mcp/{BinaryTargetResolver-BMaE_0H1.js → BinaryTargetResolver-BUncASDP.js} +146 -215
- package/dist/mcp/BoundedFileBytes-DYt5q9G2.js +43 -0
- package/dist/mcp/{CdpCaptureDocuments-HDiF2O7k.js → CdpCaptureDocuments-Y2uFcBpl.js} +194 -145
- package/dist/mcp/{CdpCaptureValues-M-j6CIh1.js → CdpCaptureValues-tNIg-gQK.js} +12 -5
- package/dist/mcp/{CdpConnection-BpDfz4MK.js → CdpEndpoint-BrhMhpSi.js} +352 -281
- package/dist/mcp/{CdpOptionalCommand-BPjRD9Kz.js → CdpOptionalCommand-PZZhlqxv.js} +2 -2
- package/dist/mcp/CdpTargetSession-BmmDC3XO.js +290 -0
- package/dist/mcp/{DirectAnalysis-DrafbXke.js → DirectAnalysis-B9KuCHTG.js} +29 -21
- package/dist/mcp/{DirectAnalysisStatus-CjjeDLzW.js → DirectAnalysisStatus-BgzopkIt.js} +7 -7
- package/dist/mcp/{ElectronFileScope-BPG_YoyU.js → ElectronFileScope-FXtK0d6I.js} +1 -1
- package/dist/mcp/ElectronFuseFailures-uZ_wOV6T.js +610 -0
- package/dist/mcp/MachoLoadCommandReader-C2VGgHA3.js +330 -0
- package/dist/mcp/{ManagedStaticProvider-BthZbKyZ.js → ManagedStaticProvider-CZuoPme2.js} +429 -131
- package/dist/mcp/{NativeMacOSProvider-Bh79k8dI.js → NativeMacOSProvider-CMguKrvN.js} +1376 -748
- package/dist/mcp/{NativeMacOSProviderMetadata-N1lPOaY_.js → NativeMacOSProviderMetadata-B_RH4KXF.js} +97 -7
- package/dist/mcp/{ProviderDeadline-DskQ94YD.js → OwnedCommand-BW1jBSt9.js} +436 -127
- package/dist/mcp/ProcedureAddressResolution-H6Qwpb_Y.js +59 -0
- package/dist/mcp/{WorkflowEvidence-umWrB_wm.js → WorkflowEvidence-CO4C7ALz.js} +16 -9
- package/dist/mcp/analysisErrorCleanup-Q344SnTO.js +34 -0
- package/dist/mcp/analysisErrorCore-BIEP7tvF.js +509 -0
- package/dist/mcp/{analysisErrorProjection-BN0EPM-3.js → analysisErrorProjection-B8teQwwD.js} +80 -30
- package/dist/mcp/{artifactToolContracts-Di4qZlEt.js → artifactToolContracts-C9dRDo-D.js} +6 -4
- package/dist/mcp/{browserObservation-C0s4i8UI.js → browserObservation-DUraZs62.js} +272 -107
- package/dist/mcp/{browserObservationError-CyLugqX4.js → browserObservationError-C5okJ5el.js} +27 -4
- package/dist/mcp/{browserObservationSchemas-tgqjH7aA.js → browserObservationSchemas-DwGGxBpu.js} +3 -3
- package/dist/mcp/{browserScenario-CAQ8Fns9.js → browserScenario-BRUz7yN0.js} +844 -358
- package/dist/mcp/{browserScenarioCapture-CTNFN-FI.js → browserScenarioCapture-CiMAsMx8.js} +127 -11
- package/dist/mcp/{InterfaceBuilderDecodeBudget-5F2AkxJT.js → callerPath-CpPnMZyN.js} +91 -65
- package/dist/mcp/{electronActiveObservation-lDvQTMR0.js → electronActiveObservation-DV0Ffy9X.js} +1 -0
- package/dist/mcp/electronFuses-D5SS7XXw.js +367 -0
- package/dist/mcp/{electronObservation-i7LcILQ-.js → electronObservation-DsN-NqY1.js} +134 -75
- package/dist/mcp/{electronObservation-DFOFEood.js → electronObservation-wOYWwqgF.js} +3 -3
- package/dist/mcp/{electronScenario-nCzE6IfJ.js → electronScenario-CYrt2zBK.js} +395 -135
- package/dist/mcp/{emptyArraySchema-tL6Qymyd.js → emptyArraySchema-C0o2Sxwp.js} +2 -2
- package/dist/mcp/{enhancedInputs-DgdEnzHy.js → enhancedInputs-6CCgB3VB.js} +1 -1
- package/dist/mcp/{javascriptRuntimeObservation-61NhCf7H.js → javascriptRuntimeObservation-BVbhkO2-.js} +12 -9
- package/dist/mcp/{javascriptRuntimeObservation-PIUoLfX6.js → javascriptRuntimeObservation-Cu0Yedqq.js} +2 -2
- package/dist/mcp/{lipo-Bnkoq_6W.js → lipo-DSTgUqL1.js} +11 -118
- package/dist/mcp/{logger-BQY5ulYv.js → logger-BGdGHadX.js} +2 -2
- package/dist/mcp/machoContainer-CMSxUBlK.js +605 -0
- package/dist/mcp/{main-kBXHZ8S5.js → main-Cx-Z7m_n.js} +16788 -5902
- package/dist/mcp/main.js +1 -1
- package/dist/mcp/{managedToolContracts-CK--I_s7.js → managedToolContracts-CSlbKJP-.js} +3 -3
- package/dist/mcp/{nativeValueTrace-DR9UE62L.js → nativeValueTrace-BEZbDieM.js} +2630 -2468
- package/dist/mcp/{officialToolContracts-B67NJ2tC.js → officialToolContracts-CauCcSsc.js} +74 -55
- package/dist/mcp/peMachine-aP1iYnHq.js +95 -0
- package/dist/mcp/propertyListKeys-BfCo0k4w.js +356 -0
- package/dist/mcp/providerCleanupError-DIRHxzWo.js +125 -0
- package/dist/mcp/{providerOperationHealth-CTYa3iLf.js → providerOperationHealth-9DRSGM8N.js} +24 -1
- package/dist/mcp/{scanCanonical-CRXSpule.js → scanCanonical-CF3ATd1V.js} +269 -463
- package/dist/mcp/{serverIdentity-Cio4iFV3.js → serverIdentity-BK0Ejd_Y.js} +262 -83
- package/dist/mcp/{sourceMapEnvelope-C0uJlrOh.js → sourceMapEnvelope-DAaRUIGj.js} +4 -4
- package/dist/mcp/{toolContracts-BW05wpcr.js → toolContracts-BPoHQdlC.js} +541 -327
- package/dist/mcp/{toolOutputSchemaGroups-ColvNZ1r.js → toolOutputSchemaGroups-MJ_f-PMK.js} +2551 -2354
- package/dist/mcp/{webContentArtifact-Dzjc1z-R.js → webContentArtifact-DfGkgDcI.js} +2 -17
- package/dist/mcp/{webRuntime-K__NYzXm.js → webRuntime-ccyhkRru.js} +2 -2
- package/dist/mcp/{webSourceLocation-DbMAT2J9.js → webSourceLocation-DKIum0vJ.js} +6451 -4414
- package/dist/mcpDoctor.js +4 -2
- package/dist/mcpStartupPolicy.js +18 -3
- package/dist/native/AppleDispatchMetadata.js +76 -27
- package/dist/native/AppleMachoFixups.js +20 -10
- package/dist/native/AppleObjcCategories.js +12 -1
- package/dist/native/AppleObjcDispatchFacets.js +21 -12
- package/dist/native/AppleObjcProperties.js +61 -17
- package/dist/native/AppleObjcProtocols.js +25 -7
- package/dist/native/AppleSwiftVtables.js +2 -0
- package/dist/native/CommandRunner.js +13 -9
- package/dist/native/LldbCallTracer.js +232 -178
- package/dist/native/LldbReadbackFiles.js +70 -0
- package/dist/native/LldbRetainedObservations.js +28 -56
- package/dist/native/NativeCallObservation.js +53 -52
- package/dist/native/NativeCallTarget.js +95 -0
- package/dist/native/NativeMacOSProvider.js +240 -171
- package/dist/native/NativeMachoInspection.js +21 -7
- package/dist/native/NativePlistSource.js +179 -0
- package/dist/native/NativeUiCleanupError.js +30 -0
- package/dist/native/NativeUiHelperRuntime.js +48 -35
- package/dist/native/NativeUiObservation.js +67 -45
- package/dist/native/SignatureTargetBinding.js +72 -53
- package/dist/native/parsers/demangle.js +16 -12
- package/dist/native/parsers/machoUuid.js +4 -4
- package/dist/native/parsers/otool.js +57 -17
- package/dist/native/parsers/plist.js +40 -25
- package/dist/native/pe/PeResourceLayout.js +22 -7
- package/dist/native/pe/PeResourceParser.js +10 -9
- package/dist/native/pe/PeResourcesProvider.js +63 -16
- package/dist/native/pwndbg/CoreFileMappingAuthority.js +51 -0
- package/dist/native/pwndbg/PwndbgCoreContext.js +26 -15
- package/dist/native/pwntools/PwntoolsDecoder.js +116 -53
- package/dist/native/pwntools/PwntoolsFailures.js +17 -3
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +11 -1
- package/dist/objdump/ObjdumpCommand.js +5 -2
- package/dist/pcap/PcapOutput.js +38 -2
- package/dist/pcap/PcapProvider.js +45 -15
- package/dist/pcap/PcapSnapshot.js +24 -4
- package/dist/process/ArtifactAnalysisResources.js +145 -52
- package/dist/process/BoundedFileBytes.js +8 -3
- package/dist/process/CurrentEntrypointPath.js +3 -1
- package/dist/process/DarwinProcessRunTokenReader.js +174 -63
- package/dist/process/DetachedPgpSignature.js +57 -0
- package/dist/process/ExecFileOutput.js +14 -11
- package/dist/{hopper/HopperTargetLease.js → process/HopperLease.js} +10 -0
- package/dist/process/LinuxResourceLimits.js +4 -24
- package/dist/process/OwnedCommand.js +109 -14
- package/dist/process/ProviderProcess.js +129 -10
- package/dist/process/RegexMatcher.js +96 -0
- package/dist/process/SharedStartupAttempt.js +59 -0
- package/dist/process/WindowsAuthority.js +1 -1
- package/dist/process/capture/FilesystemSnapshot.js +3 -2
- package/dist/process/capture/ProcessCaptureError.js +55 -17
- package/dist/process/capture/ProcessCaptureLifecycle.js +17 -20
- package/dist/process/capture/ProcessCaptureProgress.js +5 -3
- package/dist/process/capture/ProcessHarness.js +17 -3
- package/dist/process/snapshotEnvironment.js +8 -8
- package/dist/{application/binary → providers}/AnalysisClientCleanup.js +3 -3
- package/dist/providers/AnalysisClientCreation.js +193 -0
- package/dist/providers/AnalysisClientFailure.js +191 -0
- package/dist/providers/DeferredAnalysisClient.js +48 -0
- package/dist/providers/OwnedCommandCleanup.js +65 -0
- package/dist/providers/ProviderInspectionScope.js +10 -0
- package/dist/recordedCatalogDigests.js +2 -0
- package/dist/reference/ReferenceSourceReader.js +64 -0
- package/dist/reference/ReferenceSourceReaderEntries.js +12 -3
- package/dist/reference/ReferenceSourceReaderFile.js +2 -1
- package/dist/rizin/RizinCommand.js +2 -2
- package/dist/rizin/RizinDebugSessionManager.js +249 -210
- package/dist/rust/RustBinaryProvider.js +55 -23
- package/dist/server/EvidenceMcpServer.js +2 -2
- package/dist/server/contractToolHandler.js +17 -11
- package/dist/server/createServer.js +27 -8
- package/dist/server/promptCompletion.js +24 -22
- package/dist/server/registerArtifactComparisonTool.js +13 -2
- package/dist/server/registerBrowserScenarioTool.js +7 -5
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerCutterTools.js +2 -3
- package/dist/server/registerElectronTools.js +2 -13
- package/dist/server/registerFridaTools.js +8 -12
- package/dist/server/registerInvestigationTools.js +20 -20
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/evidence.js +14 -7
- package/dist/server/registerProcessComparisonTool.js +3 -0
- package/dist/server/registerSessionStatusTool.js +13 -6
- package/dist/server/registerSessionTools.js +16 -29
- package/dist/server/runDerivedOperation.js +2 -0
- package/dist/signals/SigrokRecordingProvider.js +13 -6
- package/dist/sqlite/SqliteDatabaseFailures.js +25 -12
- package/dist/sqlite/SqliteDatabaseInspection.js +27 -12
- package/dist/sqlite/SqliteDatabaseSnapshot.js +58 -32
- package/dist/sqlite/SqliteDatabaseWorkerExecution.js +18 -3
- package/dist/wasm/WabtArtifactProvider.js +64 -42
- package/dist/wasm/WabtFailures.js +19 -1
- package/dist/wasm/WabtRuntime.js +58 -0
- package/dist/wasm/WasmGlueAdapter.js +20 -7
- package/dist/windows/WindowsNativeLoader.js +16 -2
- package/dist/windows/WindowsPrivateRuntime.js +44 -1
- package/licenses/npm-dependencies.txt +146 -1
- package/licenses/npm-runtime-notices.txt +175 -1
- package/native/windows/README.md +44 -7
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +11 -3
- package/scripts/electron-active-hook-boundaries.cjs +15 -2
- package/scripts/electron-active-hook.cjs +408 -46
- package/scripts/hopper-demo-x11.py +12 -10
- package/scripts/rea.mjs +62 -15
- package/skills/reverse-engineer-anything/SKILL.md +21 -7
- package/skills/reverse-engineer-anything/references/android-applications.md +3 -1
- package/skills/reverse-engineer-anything/references/javascript-applications.md +44 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +30 -10
- package/dist/cli-runtime/ArtifactResourceScope-DQWTcUwE.js +0 -114
- package/dist/cli-runtime/ClientConfigPath-c6jr6INc.js +0 -36
- package/dist/cli-runtime/IdaConfiguration-CtGP7EKo.js +0 -1094
- package/dist/cli-runtime/JebMcpEndpoint-DUytrn5G.js +0 -428
- package/dist/cli-runtime/MacHopperPaths-CwL5lYPX.js +0 -434
- package/dist/cli-runtime/OwnedCommand-Cj9GhmPR.js +0 -112
- package/dist/cli-runtime/RegularFile-B_6KPCNQ.js +0 -139
- package/dist/cli-runtime/RegularFileRead-DVlC5faM.js +0 -125
- package/dist/cli-runtime/analysisErrorPresentation-DGt7TdsH.js +0 -497
- package/dist/cli-runtime/application__javascript__ElectronObservationService-DEsR8KDN.js +0 -63
- package/dist/cli-runtime/artifactOperationError-B7n03FbD.js +0 -27
- package/dist/cli-runtime/browserObservationError-Dx6xRTjb.js +0 -40
- package/dist/cli-runtime/cliResultOutput-DsRMI8CJ.js +0 -780
- package/dist/cli-runtime/mcpStartupPolicy-CVVSOmRc.js +0 -21
- package/dist/cli-runtime/propertyListKeys-G8e74YWb.js +0 -248
- package/dist/cli-runtime/providerAdapterError-DAjhICdr.js +0 -25
- package/dist/cli-runtime/readFileHandleChunks-dp60iZ6v.js +0 -38
- package/dist/hopper/HopperRegexWorker.js +0 -27
- package/dist/mcp/ArtifactProviderMetadata-b7pOK5_t.js +0 -76
- package/dist/mcp/ArtifactResourceScope-P3tq5z8Z.js +0 -162
- package/dist/mcp/BoundedFileBytes-DuczXiQZ.js +0 -68
- package/dist/mcp/CdpTargetSession-BsPoKhEU.js +0 -86
- package/dist/mcp/ProcedureAddressResolution-CQpuwm1h.js +0 -19
- package/dist/mcp/analysisErrorCore-DXRTvF_m.js +0 -235
- package/dist/mcp/artifactOperationError-CkHMMaf7.js +0 -27
- package/dist/mcp/digests-BFoWUT_-.js +0 -223
- package/dist/mcp/propertyListKeys-DD25WsjI.js +0 -553
- package/dist/mcp/providerAdapterError-sDxToNal.js +0 -25
- package/dist/mcp/unicodeCodePointOrder-BezCbTpg.js +0 -26
package/dist/adb/AdbProvider.js
CHANGED
|
@@ -1,22 +1,33 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { constants as fsConstants } from "node:fs";
|
|
3
|
-
import { access, copyFile, lstat, mkdtemp, mkdir, rmdir, rm, stat, writeFile, } from "node:fs/promises";
|
|
3
|
+
import { access, copyFile, lstat, link, mkdtemp, mkdir, open, rmdir, rm, stat, writeFile, } from "node:fs/promises";
|
|
4
4
|
import { basename, dirname, extname, join, resolve } from "node:path";
|
|
5
5
|
import { providerConfigurationRefusal } from "../domain/providerConfigurationRefusal.js";
|
|
6
6
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
7
|
+
import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
|
|
8
|
+
import { ArtifactResourceRetryFailure, ArtifactResourceScope, } from "../artifacts/ArtifactResourceScope.js";
|
|
9
|
+
import { AnalysisCleanupLease, AnalysisCleanupLeaseGroup, } from "../artifacts/AnalysisCleanupLease.js";
|
|
7
10
|
import { adbResultSchemas } from "../domain/adb/adbDeviceAnalysis.js";
|
|
8
|
-
import { AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, AnalysisProtocolError, AnalysisResourceConstraintError, AnalysisTimeoutError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
|
|
11
|
+
import { AnalysisCapabilityUnavailableError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, AnalysisProtocolError, AnalysisResourceConstraintError, AnalysisTimeoutError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
|
|
9
12
|
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
10
13
|
import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
|
|
11
14
|
import { err, ok } from "../domain/result.js";
|
|
12
|
-
import {
|
|
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";
|
|
13
22
|
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
14
|
-
import {
|
|
23
|
+
import { PrivateRuntimeRootUnavailableError } from "../process/PrivateRuntimeRootUnavailableError.js";
|
|
24
|
+
import { adbArguments, runAdb, runAdbCapture, packageChangeRefusal, probeAdbPathExistence, } from "./AdbCommand.js";
|
|
15
25
|
import { AdbConfigurationFailure, adbConfigurationAvailability, inspectAdbClient, resolveAdbBinary, } from "./AdbConfiguration.js";
|
|
16
26
|
import { displayDevicePath, parseAdbDevicesOutput, parseGetpropOutput, parsePackageListOutput, parsePmPathOutput, } from "./AdbDeviceOutput.js";
|
|
17
27
|
import { adbHostFileName } from "./AdbHostFileName.js";
|
|
28
|
+
import { AdbInputSnapshotFailure, snapshotAdbInput, } from "./AdbInputSnapshot.js";
|
|
18
29
|
import { ADB_DIRECTORY_BATCH_SCRIPT, parseAdbDirectoryListing, } from "./AdbDirectoryListing.js";
|
|
19
|
-
import { parseAmStartOutput, parseBugreportCopiedPath, parseDumpsysPackageOutput, parseFeatureListOutput,
|
|
30
|
+
import { parseAmStartOutput, parseBugreportCopiedPath, parseDumpsysPackageOutput, parseFeatureListOutput, parsePackageChangeOutput, parseProcessListOutput, parsePngDimensions, parseResolveActivityOutput, parseServiceListOutput, parseSettingsGetOutput, parseWindowFocusOutput, parseWmDensityOutput, parseWmSizeOutput, } from "./AdbShellOutput.js";
|
|
20
31
|
/** Stable identity for the ADB device-acquisition provider. */
|
|
21
32
|
export const ADB_PROVIDER_IDENTITY = {
|
|
22
33
|
id: "adb",
|
|
@@ -46,98 +57,163 @@ const SCREEN_TIMEOUT_MS = 60_000;
|
|
|
46
57
|
const SCREEN_MAX_OUTPUT_BYTES = 32 * 1024 * 1024;
|
|
47
58
|
const BUGREPORT_TIMEOUT_MS = 600_000;
|
|
48
59
|
const BUGREPORT_MAX_OUTPUT_BYTES = 1024 * 1024;
|
|
49
|
-
const STDERR_EXCERPT_BYTES = 512;
|
|
50
60
|
const UNPARSED_LINES_REPORTED = 10;
|
|
51
|
-
|
|
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,
|
|
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 (
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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,
|
|
122
197
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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;
|
|
141
217
|
};
|
|
142
218
|
const clientIdentityResult = (selection, identity) => ({
|
|
143
219
|
binary_path: selection.binary,
|
|
@@ -171,6 +247,131 @@ const refuseExistingTarget = async (operation, path) => {
|
|
|
171
247
|
return new AnalysisOutputError(operation, `The output file already exists: ${path}`);
|
|
172
248
|
return undefined;
|
|
173
249
|
};
|
|
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
|
+
});
|
|
174
375
|
/** Publish an ADB-produced archive without replacing an existing caller file. */
|
|
175
376
|
const publishBugreport = async (source, directory) => {
|
|
176
377
|
const fileName = basename(source);
|
|
@@ -189,6 +390,11 @@ const publishBugreport = async (source, directory) => {
|
|
|
189
390
|
}
|
|
190
391
|
}
|
|
191
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
|
+
});
|
|
192
398
|
const removeOwnedOutputDirectory = async (path, identity) => {
|
|
193
399
|
if (identity === undefined)
|
|
194
400
|
throw new Error(`Cannot verify the created output directory identity; refusing to remove ${path}`);
|
|
@@ -293,6 +499,9 @@ const reservePackageDestinations = async (operation, packageName, packageDirecto
|
|
|
293
499
|
*/
|
|
294
500
|
export class AdbProvider {
|
|
295
501
|
environment;
|
|
502
|
+
#createRuntimeRoot;
|
|
503
|
+
#resources = new ArtifactResourceScope();
|
|
504
|
+
#outputDirectoryRetryLeases = new WeakMap();
|
|
296
505
|
#pendingOutputDirectoryCleanup = new Set();
|
|
297
506
|
#activeOperations = new Set();
|
|
298
507
|
#closing = false;
|
|
@@ -300,6 +509,9 @@ export class AdbProvider {
|
|
|
300
509
|
#outputCleanupPromise;
|
|
301
510
|
constructor(options = {}) {
|
|
302
511
|
this.environment = options.environment ?? process.env;
|
|
512
|
+
this.#createRuntimeRoot =
|
|
513
|
+
options.createRuntimeRoot ??
|
|
514
|
+
((rootOptions) => PrivateRuntimeRoot.create(rootOptions));
|
|
303
515
|
}
|
|
304
516
|
selection() {
|
|
305
517
|
return resolveAdbBinary(this.environment);
|
|
@@ -332,7 +544,46 @@ export class AdbProvider {
|
|
|
332
544
|
return this.#closePromise;
|
|
333
545
|
const closing = (async () => {
|
|
334
546
|
await Promise.all(this.#activeOperations);
|
|
335
|
-
|
|
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
|
+
}
|
|
336
587
|
})().finally(() => {
|
|
337
588
|
if (this.#closePromise === closing)
|
|
338
589
|
this.#closePromise = undefined;
|
|
@@ -340,6 +591,137 @@ export class AdbProvider {
|
|
|
340
591
|
this.#closePromise = closing;
|
|
341
592
|
return this.#closePromise;
|
|
342
593
|
}
|
|
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 }),
|
|
621
|
+
});
|
|
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
|
+
}
|
|
343
725
|
#retryOutputDirectoryCleanup() {
|
|
344
726
|
if (this.#outputCleanupPromise !== undefined)
|
|
345
727
|
return this.#outputCleanupPromise;
|
|
@@ -354,30 +736,40 @@ export class AdbProvider {
|
|
|
354
736
|
const failures = [];
|
|
355
737
|
for (const owner of this.#pendingOutputDirectoryCleanup) {
|
|
356
738
|
try {
|
|
357
|
-
await owner.
|
|
739
|
+
await owner.lease.release();
|
|
358
740
|
this.#pendingOutputDirectoryCleanup.delete(owner);
|
|
359
741
|
}
|
|
360
742
|
catch (cause) {
|
|
361
743
|
const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [owner.path], {
|
|
362
744
|
reason: cause instanceof Error ? cause.message : String(cause),
|
|
363
745
|
}, { operation: owner.operation, cause });
|
|
364
|
-
|
|
746
|
+
const error = analysisErrorWithCleanupFailure(owner.primary, cleanup, owner.operation);
|
|
747
|
+
owner.lease.bindCleanupError(error);
|
|
748
|
+
failures.push(error);
|
|
365
749
|
}
|
|
366
750
|
}
|
|
367
|
-
if (failures.length
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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
|
+
}
|
|
381
773
|
}
|
|
382
774
|
async execute(request, options) {
|
|
383
775
|
if (this.#closing)
|
|
@@ -388,6 +780,18 @@ export class AdbProvider {
|
|
|
388
780
|
});
|
|
389
781
|
this.#activeOperations.add(active);
|
|
390
782
|
try {
|
|
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
|
+
}
|
|
391
795
|
if (this.#pendingOutputDirectoryCleanup.size > 0) {
|
|
392
796
|
try {
|
|
393
797
|
await this.#retryOutputDirectoryCleanup();
|
|
@@ -410,7 +814,7 @@ export class AdbProvider {
|
|
|
410
814
|
async #executeOperation(request, options) {
|
|
411
815
|
const signal = options?.signal;
|
|
412
816
|
if (signal?.aborted === true)
|
|
413
|
-
return err(new AnalysisCancelledError(request.operation));
|
|
817
|
+
return err(new AnalysisCancelledError(request.operation, { cause: signal.reason }));
|
|
414
818
|
let selection;
|
|
415
819
|
let identity;
|
|
416
820
|
try {
|
|
@@ -418,7 +822,7 @@ export class AdbProvider {
|
|
|
418
822
|
identity = await inspectAdbClient(selection, signal);
|
|
419
823
|
}
|
|
420
824
|
catch (cause) {
|
|
421
|
-
if (cause instanceof
|
|
825
|
+
if (cause instanceof AnalysisError)
|
|
422
826
|
return err(cause);
|
|
423
827
|
if (cause instanceof AdbConfigurationFailure)
|
|
424
828
|
return err(providerConfigurationRefusal(ADB_PROVIDER_IDENTITY.id, request.operation, cause));
|
|
@@ -569,13 +973,15 @@ export class AdbProvider {
|
|
|
569
973
|
user_id: details.userId,
|
|
570
974
|
pkg_flags: details.pkgFlags,
|
|
571
975
|
requested_permissions_count: details.requestedPermissions,
|
|
572
|
-
coverage: details.
|
|
976
|
+
coverage: details.requestedPermissions === null ||
|
|
977
|
+
(details.versionCode === null && details.versionName === null)
|
|
573
978
|
? "partial"
|
|
574
979
|
: "complete",
|
|
575
980
|
}, provider, {
|
|
576
981
|
limitations: [
|
|
577
982
|
"Fields are a fixed projection of dumpsys package output; version-dependent sections are ignored rather than guessed",
|
|
578
|
-
"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",
|
|
579
985
|
],
|
|
580
986
|
}));
|
|
581
987
|
}
|
|
@@ -700,8 +1106,8 @@ export class AdbProvider {
|
|
|
700
1106
|
});
|
|
701
1107
|
if (!ran.ok)
|
|
702
1108
|
return ran;
|
|
703
|
-
let
|
|
704
|
-
if (
|
|
1109
|
+
let focus = parseWindowFocusOutput(ran.value.stdout);
|
|
1110
|
+
if (focus.focus_summary === "unavailable") {
|
|
705
1111
|
section = "displays";
|
|
706
1112
|
const fallback = await shell(["dumpsys", "window", section], {
|
|
707
1113
|
timeoutMs: SHELL_TIMEOUT_MS,
|
|
@@ -709,24 +1115,25 @@ export class AdbProvider {
|
|
|
709
1115
|
});
|
|
710
1116
|
if (!fallback.ok)
|
|
711
1117
|
return fallback;
|
|
712
|
-
|
|
1118
|
+
focus = parseWindowFocusOutput(fallback.value.stdout);
|
|
713
1119
|
}
|
|
714
|
-
const declared =
|
|
1120
|
+
const declared = focus.focus_summary !== "unavailable";
|
|
715
1121
|
return ok(createAnalysisExecution({
|
|
716
1122
|
client,
|
|
717
1123
|
serial: request.input.serial,
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
observed_lines: [
|
|
721
|
-
...(focusedWindow === null ? [] : [focusedWindow]),
|
|
722
|
-
...(focusedApp === null ? [] : [focusedApp]),
|
|
723
|
-
],
|
|
1124
|
+
source_section: section,
|
|
1125
|
+
...focus,
|
|
724
1126
|
}, provider, {
|
|
725
1127
|
limitations: [
|
|
726
1128
|
"Focus values are the window manager's declarations at read time; no interaction occurred",
|
|
727
1129
|
declared
|
|
728
1130
|
? `Focus declarations were read from \`dumpsys window ${section}\``
|
|
729
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
|
+
: []),
|
|
730
1137
|
],
|
|
731
1138
|
}));
|
|
732
1139
|
}
|
|
@@ -866,21 +1273,18 @@ export class AdbProvider {
|
|
|
866
1273
|
const owner = {
|
|
867
1274
|
operation,
|
|
868
1275
|
path: packageDirectory,
|
|
869
|
-
identity: packageDirectoryIdentity,
|
|
870
1276
|
primary,
|
|
871
1277
|
remove: () => removeOwnedOutputDirectory(packageDirectory, packageDirectoryIdentity),
|
|
872
1278
|
};
|
|
873
|
-
this.#pendingOutputDirectoryCleanup.add(owner);
|
|
874
1279
|
const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [packageDirectory], {
|
|
875
1280
|
reason: "Could not establish an owned package directory identity",
|
|
876
1281
|
}, { operation, cause });
|
|
877
|
-
return err(
|
|
1282
|
+
return err(this.#retainOutputDirectoryCleanup(owner, cleanup));
|
|
878
1283
|
}
|
|
879
1284
|
const failOwnedPackage = async (primary) => {
|
|
880
1285
|
const owner = {
|
|
881
1286
|
operation,
|
|
882
1287
|
path: packageDirectory,
|
|
883
|
-
identity: packageDirectoryIdentity,
|
|
884
1288
|
primary,
|
|
885
1289
|
remove: () => removeOwnedOutputDirectory(packageDirectory, packageDirectoryIdentity),
|
|
886
1290
|
};
|
|
@@ -888,9 +1292,8 @@ export class AdbProvider {
|
|
|
888
1292
|
await owner.remove();
|
|
889
1293
|
}
|
|
890
1294
|
catch (cause) {
|
|
891
|
-
this.#pendingOutputDirectoryCleanup.add(owner);
|
|
892
1295
|
const cleanup = new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [packageDirectory], { reason: cause instanceof Error ? cause.message : String(cause) }, { operation, cause });
|
|
893
|
-
return err(
|
|
1296
|
+
return err(this.#retainOutputDirectoryCleanup(owner, cleanup));
|
|
894
1297
|
}
|
|
895
1298
|
return err(primary);
|
|
896
1299
|
};
|
|
@@ -899,6 +1302,11 @@ export class AdbProvider {
|
|
|
899
1302
|
return failOwnedPackage(destinationError);
|
|
900
1303
|
const artifacts = [];
|
|
901
1304
|
const failures = [];
|
|
1305
|
+
const observedFailures = () => failures.map(({ device_path, stage, message }) => ({
|
|
1306
|
+
device_path,
|
|
1307
|
+
stage,
|
|
1308
|
+
message,
|
|
1309
|
+
}));
|
|
902
1310
|
const cancelledPackagePull = (error, localPath, devicePath, stage) => {
|
|
903
1311
|
error.retainPartialObservation({
|
|
904
1312
|
provider_id: "adb",
|
|
@@ -910,7 +1318,7 @@ export class AdbProvider {
|
|
|
910
1318
|
output_directory: directory.value,
|
|
911
1319
|
artifacts,
|
|
912
1320
|
failures: [
|
|
913
|
-
...
|
|
1321
|
+
...observedFailures(),
|
|
914
1322
|
{
|
|
915
1323
|
device_path: devicePath,
|
|
916
1324
|
stage,
|
|
@@ -934,11 +1342,12 @@ export class AdbProvider {
|
|
|
934
1342
|
device_path: entry.device_path,
|
|
935
1343
|
stage: "pull",
|
|
936
1344
|
message: pulled.error.message,
|
|
1345
|
+
cause: pulled.error,
|
|
937
1346
|
});
|
|
938
1347
|
continue;
|
|
939
1348
|
}
|
|
940
1349
|
try {
|
|
941
|
-
const digest = await hashAdbFile(localPath, operation, signal);
|
|
1350
|
+
const digest = await hashAdbFile(localPath, operation, signal, this.#resources);
|
|
942
1351
|
artifacts.push({
|
|
943
1352
|
device_path: entry.device_path,
|
|
944
1353
|
file_name: entry.file_name,
|
|
@@ -950,17 +1359,65 @@ export class AdbProvider {
|
|
|
950
1359
|
});
|
|
951
1360
|
}
|
|
952
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);
|
|
953
1406
|
if (cause instanceof AnalysisCancelledError)
|
|
954
1407
|
return cancelledPackagePull(cause, localPath, entry.device_path, "digest");
|
|
1408
|
+
const physicalCause = stableFileHashCause(cause);
|
|
955
1409
|
failures.push({
|
|
956
1410
|
device_path: entry.device_path,
|
|
957
1411
|
stage: "digest",
|
|
958
|
-
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,
|
|
959
1414
|
});
|
|
960
1415
|
}
|
|
961
1416
|
}
|
|
962
1417
|
if (artifacts.length === 0 && failures.length > 0) {
|
|
963
|
-
const primary = new AnalysisProtocolError(`Every APK pull failed for ${packageName} on ${serial}: ${failures[0].message}
|
|
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
|
+
});
|
|
964
1421
|
return failOwnedPackage(primary);
|
|
965
1422
|
}
|
|
966
1423
|
return ok(createAnalysisExecution({
|
|
@@ -969,7 +1426,7 @@ export class AdbProvider {
|
|
|
969
1426
|
package_name: packageName,
|
|
970
1427
|
output_directory: directory.value,
|
|
971
1428
|
artifacts,
|
|
972
|
-
failures,
|
|
1429
|
+
failures: observedFailures(),
|
|
973
1430
|
coverage: failures.length === 0 ? "complete" : "partial",
|
|
974
1431
|
}, provider, {
|
|
975
1432
|
limitations: [
|
|
@@ -999,7 +1456,7 @@ export class AdbProvider {
|
|
|
999
1456
|
if (!pulled.ok)
|
|
1000
1457
|
return pulled;
|
|
1001
1458
|
try {
|
|
1002
|
-
const digest = await hashAdbFile(localPath, operation, signal);
|
|
1459
|
+
const digest = await hashAdbFile(localPath, operation, signal, this.#resources);
|
|
1003
1460
|
return ok(createAnalysisExecution({
|
|
1004
1461
|
client,
|
|
1005
1462
|
serial: input.serial,
|
|
@@ -1014,18 +1471,22 @@ export class AdbProvider {
|
|
|
1014
1471
|
}));
|
|
1015
1472
|
}
|
|
1016
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);
|
|
1017
1488
|
if (cause instanceof AnalysisCancelledError) {
|
|
1018
|
-
cause.retainPartialObservation(
|
|
1019
|
-
provider_id: "adb",
|
|
1020
|
-
operation,
|
|
1021
|
-
result: {
|
|
1022
|
-
client,
|
|
1023
|
-
serial: input.serial,
|
|
1024
|
-
local_path: localPath,
|
|
1025
|
-
device_path: input.device_path,
|
|
1026
|
-
digest_status: "unknown",
|
|
1027
|
-
},
|
|
1028
|
-
});
|
|
1489
|
+
cause.retainPartialObservation(partialObservation);
|
|
1029
1490
|
return err(cause);
|
|
1030
1491
|
}
|
|
1031
1492
|
return err(new AnalysisOutputError(operation, `The pulled file could not be read back after pulling: ${localPath}`, { cause }));
|
|
@@ -1038,63 +1499,74 @@ export class AdbProvider {
|
|
|
1038
1499
|
return err(new AnalysisInputError(operation, {
|
|
1039
1500
|
cause: new Error(`The local file does not exist: ${localPath}`),
|
|
1040
1501
|
}));
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
!
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
if (deviceExists && !input.overwrite)
|
|
1059
|
-
return err(new AnalysisOutputError(operation, `The device path already exists and overwrite was not requested: ${input.device_path}`));
|
|
1060
|
-
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);
|
|
1061
|
-
if (!pushed.ok)
|
|
1062
|
-
return pushed;
|
|
1063
|
-
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);
|
|
1064
|
-
if (deviceDigest.ok) {
|
|
1065
|
-
const digestMatch = /^([a-f0-9]{64})\s/u.exec(deviceDigest.value.stdout);
|
|
1066
|
-
if (digestMatch !== null && digestMatch[1] !== digest.sha256)
|
|
1067
|
-
return err(new AnalysisArtifactChangedError(operation, input.device_path, `The device-reported digest does not match the pushed local file: ${localPath}`));
|
|
1068
|
-
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({
|
|
1069
1519
|
client,
|
|
1070
1520
|
serial: input.serial,
|
|
1071
1521
|
local_path: localPath,
|
|
1072
1522
|
device_path: input.device_path,
|
|
1073
1523
|
bytes: digest.bytes,
|
|
1074
1524
|
sha256: digest.sha256,
|
|
1075
|
-
device_sha256:
|
|
1525
|
+
device_sha256: deviceSha256,
|
|
1076
1526
|
overwritten: deviceExists,
|
|
1077
|
-
device_digest_source:
|
|
1527
|
+
device_digest_source: source,
|
|
1078
1528
|
}, provider, {
|
|
1079
|
-
limitations: [
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1529
|
+
limitations: [
|
|
1530
|
+
"Push writes a private snapshot of the caller's file to the device",
|
|
1531
|
+
...extra,
|
|
1532
|
+
],
|
|
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
|
+
});
|
|
1098
1570
|
}
|
|
1099
1571
|
async installPackage(operation, selection, client, provider, input, signal) {
|
|
1100
1572
|
const apkPath = resolve(input.apk_path);
|
|
@@ -1103,43 +1575,48 @@ export class AdbProvider {
|
|
|
1103
1575
|
return err(new AnalysisInputError(operation, {
|
|
1104
1576
|
cause: new Error(`The local APK does not exist: ${apkPath}`),
|
|
1105
1577
|
}));
|
|
1106
|
-
|
|
1107
|
-
try {
|
|
1108
|
-
digest = await hashAdbFile(apkPath, operation, signal);
|
|
1109
|
-
}
|
|
1110
|
-
catch (cause) {
|
|
1111
|
-
if (cause instanceof AnalysisCancelledError)
|
|
1112
|
-
return err(cause);
|
|
1113
|
-
throw cause;
|
|
1114
|
-
}
|
|
1115
|
-
const installed = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, [
|
|
1116
|
-
"install",
|
|
1117
|
-
...(input.replace ? ["-r"] : []),
|
|
1118
|
-
apkPath,
|
|
1119
|
-
]), { timeoutMs: PULL_TIMEOUT_MS, maxOutputBytes: PULL_MAX_OUTPUT_BYTES }, signal);
|
|
1120
|
-
if (!installed.ok)
|
|
1121
|
-
return (packageChangeRefusal(operation, input.serial, installed.error) ??
|
|
1122
|
-
installed);
|
|
1123
|
-
const verdict = parsePackageChangeOutput(installed.value.stdout);
|
|
1124
|
-
if (verdict.status === "failure")
|
|
1125
|
-
return err(new AnalysisUnsupportedTargetError(operation, input.serial, verdict.reason ?? "the device refused the installation"));
|
|
1126
|
-
return ok(createAnalysisExecution({
|
|
1127
|
-
client,
|
|
1578
|
+
return this.#withRuntimeRoot(operation, {
|
|
1128
1579
|
serial: input.serial,
|
|
1129
1580
|
apk_path: apkPath,
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
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
|
+
});
|
|
1140
1610
|
}
|
|
1141
1611
|
async uninstallPackage(operation, selection, client, provider, input, signal) {
|
|
1142
|
-
const uninstalled = await runAdb(operation, input.serial, selection.binary, adbArguments(input.serial, [
|
|
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
|
+
]), {
|
|
1143
1620
|
timeoutMs: PACKAGE_LIST_TIMEOUT_MS,
|
|
1144
1621
|
maxOutputBytes: PULL_MAX_OUTPUT_BYTES,
|
|
1145
1622
|
}, signal);
|
|
@@ -1155,7 +1632,7 @@ export class AdbProvider {
|
|
|
1155
1632
|
package_name: input.package,
|
|
1156
1633
|
}, provider, {
|
|
1157
1634
|
limitations: [
|
|
1158
|
-
"Uninstall
|
|
1635
|
+
"Uninstall explicitly requests user 0 without data retention (-k); device enforcement is not independently verified",
|
|
1159
1636
|
],
|
|
1160
1637
|
}));
|
|
1161
1638
|
}
|
|
@@ -1291,31 +1768,68 @@ export class AdbProvider {
|
|
|
1291
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);
|
|
1292
1769
|
if (!captured.ok)
|
|
1293
1770
|
return captured;
|
|
1771
|
+
if (signal?.aborted === true)
|
|
1772
|
+
return err(new AnalysisCancelledError(operation, { cause: signal.reason }));
|
|
1294
1773
|
const dimensions = parsePngDimensions(captured.value.stdout);
|
|
1295
1774
|
if (dimensions.width === null)
|
|
1296
1775
|
return err(new AnalysisProtocolError("screencap did not return a PNG payload; the device may not expose a display"));
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
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
|
+
});
|
|
1319
1833
|
}
|
|
1320
1834
|
async collectBugreport(operation, selection, client, provider, input, signal) {
|
|
1321
1835
|
const directory = await prepareOutputDirectory(operation, input.output_directory);
|
|
@@ -1377,7 +1891,7 @@ export class AdbProvider {
|
|
|
1377
1891
|
...retainedObservation,
|
|
1378
1892
|
result: { ...retainedObservation.result, local_path: publishedPath },
|
|
1379
1893
|
};
|
|
1380
|
-
const digest = await hashAdbFile(publishedPath, operation, signal);
|
|
1894
|
+
const digest = await hashAdbFile(publishedPath, operation, signal, this.#resources);
|
|
1381
1895
|
const report = {
|
|
1382
1896
|
client,
|
|
1383
1897
|
serial: input.serial,
|
|
@@ -1398,6 +1912,11 @@ export class AdbProvider {
|
|
|
1398
1912
|
}));
|
|
1399
1913
|
}
|
|
1400
1914
|
catch (cause) {
|
|
1915
|
+
const cleanupError = retainedObservation === undefined
|
|
1916
|
+
? undefined
|
|
1917
|
+
: adbDigestError(cause, operation, retainedObservation);
|
|
1918
|
+
if (cleanupError !== undefined)
|
|
1919
|
+
return err(cleanupError);
|
|
1401
1920
|
if (cause instanceof AnalysisCancelledError) {
|
|
1402
1921
|
if (retainedObservation !== undefined)
|
|
1403
1922
|
cause.retainPartialObservation(retainedObservation);
|
|
@@ -1419,14 +1938,12 @@ export class AdbProvider {
|
|
|
1419
1938
|
: collectedResult.error;
|
|
1420
1939
|
if (retainedObservation !== undefined)
|
|
1421
1940
|
primary.retainPartialObservation(retainedObservation);
|
|
1422
|
-
this.#
|
|
1941
|
+
return err(this.#retainOutputDirectoryCleanup({
|
|
1423
1942
|
operation,
|
|
1424
1943
|
path: stagingDirectory,
|
|
1425
|
-
identity: stagingIdentity,
|
|
1426
1944
|
primary,
|
|
1427
1945
|
remove: () => removeOwnedOutputDirectory(stagingDirectory, stagingIdentity),
|
|
1428
|
-
});
|
|
1429
|
-
return err(analysisErrorWithCleanupFailure(primary, new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [stagingDirectory], { reason: cause instanceof Error ? cause.message : String(cause) }, { operation, cause }), operation));
|
|
1946
|
+
}, new ProviderCleanupError(ADB_PROVIDER_IDENTITY.id, [stagingDirectory], { reason: cause instanceof Error ? cause.message : String(cause) }, { operation, cause })));
|
|
1430
1947
|
}
|
|
1431
1948
|
return collectedResult;
|
|
1432
1949
|
}
|