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