rea-agents 6.2.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -1,94 +1,103 @@
|
|
|
1
1
|
import { mkdtemp, realpath, rm } from "node:fs/promises";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { basename, join } from "node:path";
|
|
4
|
-
import { parse } from "plist";
|
|
5
|
-
import { z } from "zod";
|
|
6
4
|
import { ArtifactReaderFailure, } from "./ArtifactReader.js";
|
|
7
5
|
import { DirectoryArtifactReader } from "./DirectoryArtifactReader.js";
|
|
8
|
-
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* later detach can eject one, `hdiutil info` can still list an ejected device
|
|
13
|
-
* briefly, and a volume can report busy just after it was read.
|
|
14
|
-
*/
|
|
6
|
+
import { execFileOutput, execFileOutputFailure, } from "../process/ExecFileOutput.js";
|
|
7
|
+
import { parseNativeDmgAttachOutput, parseNativeDmgInfo, resolveNativeDmgOwnership, } from "./NativeDmgOwnership.js";
|
|
8
|
+
const HDIUTIL_COMMAND_TIMEOUT_MS = 120_000;
|
|
9
|
+
// APFS ejects and busy reporting can lag a detach attempt.
|
|
15
10
|
const DETACH_SETTLE_DELAYS_MS = [250, 500, 1000];
|
|
16
11
|
const delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
})),
|
|
27
|
-
});
|
|
12
|
+
class NativeDmgCommandFailure extends ArtifactReaderFailure {
|
|
13
|
+
stdout;
|
|
14
|
+
processNotStarted;
|
|
15
|
+
constructor(reason, message, stdout, options) {
|
|
16
|
+
super(reason, message, options?.cause === undefined ? undefined : { cause: options.cause });
|
|
17
|
+
this.stdout = stdout;
|
|
18
|
+
this.processNotStarted = options?.processNotStarted ?? false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
28
21
|
const createSystemHost = (environment) => ({
|
|
29
22
|
delay,
|
|
30
23
|
async run(arguments_, signal, options) {
|
|
31
24
|
try {
|
|
32
25
|
const { stdout, stderr } = await execFileOutput("/usr/bin/hdiutil", [...arguments_], {
|
|
33
26
|
env: environment,
|
|
27
|
+
stopSignal: "SIGTERM",
|
|
34
28
|
...(options === undefined ? {} : { timeout: options.timeoutMs }),
|
|
35
29
|
...(signal === undefined ? {} : { signal }),
|
|
36
30
|
});
|
|
37
31
|
return { stdout, stderr, exitCode: 0 };
|
|
38
32
|
}
|
|
39
33
|
catch (cause) {
|
|
34
|
+
const output = execFileOutputFailure(cause);
|
|
40
35
|
if (cause instanceof Error && cause.name === "AbortError")
|
|
41
|
-
throw new
|
|
42
|
-
const exitCode = processExitCode(cause);
|
|
36
|
+
throw new NativeDmgCommandFailure("cancelled", "DMG operation cancelled", output?.stdout ?? "", { cause });
|
|
37
|
+
const exitCode = typeof output?.code === "number" ? output.code : processExitCode(cause);
|
|
43
38
|
if (exitCode !== undefined)
|
|
44
39
|
return {
|
|
45
|
-
stdout: processOutput(cause, "stdout"),
|
|
46
|
-
stderr: processOutput(cause, "stderr"),
|
|
40
|
+
stdout: output?.stdout ?? processOutput(cause, "stdout"),
|
|
41
|
+
stderr: output?.stderr ?? processOutput(cause, "stderr"),
|
|
47
42
|
exitCode,
|
|
48
43
|
cause,
|
|
49
44
|
};
|
|
50
|
-
throw new
|
|
45
|
+
throw new NativeDmgCommandFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, output?.stdout ?? "", { cause, processNotStarted: processNotStarted(cause) });
|
|
51
46
|
}
|
|
52
47
|
},
|
|
53
48
|
});
|
|
54
49
|
/** Read-only macOS DMG adapter that owns attachment and reverse-order detach. */
|
|
55
50
|
export class NativeDmgArtifactReader {
|
|
56
51
|
path;
|
|
57
|
-
host;
|
|
58
52
|
format = "file";
|
|
53
|
+
host;
|
|
59
54
|
#provenance = [];
|
|
55
|
+
#initialization;
|
|
60
56
|
#directory;
|
|
61
57
|
#devices = [];
|
|
58
|
+
#inventoryConfirmedDevices = new Set();
|
|
62
59
|
#mountRoot;
|
|
63
|
-
|
|
60
|
+
#baselineDevices = new Set();
|
|
61
|
+
#attachOutput;
|
|
62
|
+
#attachOutputReturned = false;
|
|
63
|
+
#attachMayHaveMounted = false;
|
|
64
|
+
#ownershipUncertainty;
|
|
65
|
+
#closed = false;
|
|
66
|
+
#closePromise;
|
|
67
|
+
constructor(path, environment, host) {
|
|
64
68
|
this.path = path;
|
|
65
|
-
this.host = host;
|
|
66
|
-
}
|
|
67
|
-
/** Verify and attach one image beneath an exclusively owned temporary root. */
|
|
68
|
-
static async create(path, environment, signal, host) {
|
|
69
69
|
if (process.platform !== "darwin" && host === undefined)
|
|
70
70
|
throw new ArtifactReaderFailure("unavailable", "Native DMG traversal is available only on macOS");
|
|
71
|
-
|
|
72
|
-
await reader.attach(signal);
|
|
73
|
-
return reader;
|
|
71
|
+
this.host = host ?? createSystemHost(environment);
|
|
74
72
|
}
|
|
75
73
|
async *entries(signal) {
|
|
74
|
+
await this.#ensureAttached(signal);
|
|
76
75
|
if (this.#directory === undefined)
|
|
77
76
|
throw new ArtifactReaderFailure("unavailable", "DMG is not attached");
|
|
78
77
|
const prefix = basename(this.path);
|
|
79
78
|
for await (const entry of this.#directory.entries(signal))
|
|
80
79
|
yield { ...entry, path: `${prefix}/${entry.path}` };
|
|
81
80
|
}
|
|
82
|
-
open(entry, signal) {
|
|
81
|
+
async open(entry, signal) {
|
|
82
|
+
await this.#ensureAttached(signal);
|
|
83
83
|
if (this.#directory === undefined)
|
|
84
|
-
|
|
84
|
+
throw new ArtifactReaderFailure("unavailable", "DMG is not attached");
|
|
85
85
|
return this.#directory.open(entry, signal);
|
|
86
86
|
}
|
|
87
87
|
provenance() {
|
|
88
88
|
return structuredClone(this.#provenance);
|
|
89
89
|
}
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
close() {
|
|
91
|
+
this.#closed = true;
|
|
92
|
+
this.#closePromise ??= this.#closeOwnedResources().catch((cause) => {
|
|
93
|
+
this.#closePromise = undefined;
|
|
94
|
+
throw cause;
|
|
95
|
+
});
|
|
96
|
+
return this.#closePromise;
|
|
97
|
+
}
|
|
98
|
+
async #closeOwnedResources() {
|
|
99
|
+
await this.#initialization?.catch(() => undefined);
|
|
100
|
+
let detachFailure = await this.#reconcileAttachState();
|
|
92
101
|
let remainingDevices = [];
|
|
93
102
|
for (const device of [...this.#devices].reverse()) {
|
|
94
103
|
const failure = await this.#detach(device);
|
|
@@ -97,10 +106,7 @@ export class NativeDmgArtifactReader {
|
|
|
97
106
|
detachFailure ??= failure;
|
|
98
107
|
}
|
|
99
108
|
}
|
|
100
|
-
//
|
|
101
|
-
// it, so a device whose own detach failed may be gone by the end of the
|
|
102
|
-
// pass, and hdiutil can list an ejected device or report busy briefly.
|
|
103
|
-
// Only a device that stays attached through every recheck is a failure.
|
|
109
|
+
// APFS container detach may briefly leave its backing image listed.
|
|
104
110
|
for (const delayMs of DETACH_SETTLE_DELAYS_MS) {
|
|
105
111
|
if (remainingDevices.length === 0)
|
|
106
112
|
break;
|
|
@@ -120,13 +126,19 @@ export class NativeDmgArtifactReader {
|
|
|
120
126
|
if (remainingDevices.length === 0)
|
|
121
127
|
detachFailure = undefined;
|
|
122
128
|
this.#devices = remainingDevices.reverse();
|
|
123
|
-
if (this.#devices.length === 0 &&
|
|
129
|
+
if (this.#devices.length === 0 &&
|
|
130
|
+
this.#mountRoot !== undefined &&
|
|
131
|
+
!this.#attachMayHaveMounted)
|
|
124
132
|
await rm(this.#mountRoot, { recursive: true, force: true }).then(() => {
|
|
125
133
|
this.#mountRoot = undefined;
|
|
126
134
|
this.#directory = undefined;
|
|
127
135
|
}, (cause) => {
|
|
128
136
|
detachFailure ??= cause;
|
|
129
137
|
});
|
|
138
|
+
if (this.#attachMayHaveMounted) {
|
|
139
|
+
detachFailure ??= new Error(this.#ownershipUncertainty ??
|
|
140
|
+
"hdiutil attachment ownership remains unknown");
|
|
141
|
+
}
|
|
130
142
|
if (detachFailure !== undefined)
|
|
131
143
|
throw new ArtifactReaderFailure("unavailable", `DMG detach or mount-root cleanup failed for ${JSON.stringify(this.path)}: ${failureMessage(detachFailure)}`, {
|
|
132
144
|
cause: detachFailure,
|
|
@@ -134,6 +146,11 @@ export class NativeDmgArtifactReader {
|
|
|
134
146
|
reason: failureMessage(detachFailure),
|
|
135
147
|
resources: [
|
|
136
148
|
...this.#devices.map((device) => `DMG device ${device}`),
|
|
149
|
+
...(this.#attachMayHaveMounted
|
|
150
|
+
? [
|
|
151
|
+
`DMG attachment ownership unknown at mount root ${this.#mountRoot ?? this.path}`,
|
|
152
|
+
]
|
|
153
|
+
: []),
|
|
137
154
|
...(this.#mountRoot === undefined
|
|
138
155
|
? []
|
|
139
156
|
: [`DMG mount root ${this.#mountRoot}`]),
|
|
@@ -145,7 +162,7 @@ export class NativeDmgArtifactReader {
|
|
|
145
162
|
async #detach(device) {
|
|
146
163
|
try {
|
|
147
164
|
await runChecked(this.host, ["detach", device], undefined, {
|
|
148
|
-
timeoutMs:
|
|
165
|
+
timeoutMs: HDIUTIL_COMMAND_TIMEOUT_MS,
|
|
149
166
|
});
|
|
150
167
|
this.#provenance.push(command(["detach", device], ["mount"]));
|
|
151
168
|
return undefined;
|
|
@@ -154,78 +171,154 @@ export class NativeDmgArtifactReader {
|
|
|
154
171
|
return (await this.#isAttached(device)) ? cause : undefined;
|
|
155
172
|
}
|
|
156
173
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
174
|
+
async #reconcileAttachState() {
|
|
175
|
+
if (!this.#attachMayHaveMounted)
|
|
176
|
+
return undefined;
|
|
177
|
+
try {
|
|
178
|
+
await this.#resolveAttachOwnership();
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
catch (cause) {
|
|
182
|
+
this.#ownershipUncertainty = failureMessage(cause);
|
|
183
|
+
return cause;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** Treat unknown hdiutil state as attached during cleanup. */
|
|
162
187
|
async #isAttached(device) {
|
|
163
188
|
try {
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
189
|
+
const parsed = await this.#readInfo();
|
|
190
|
+
const isListed = parsed.images.some((image) => image["system-entities"].some((entity) => entity["dev-entry"] === device));
|
|
191
|
+
if (isListed) {
|
|
192
|
+
this.#inventoryConfirmedDevices.add(device);
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
return !this.#inventoryConfirmedDevices.has(device);
|
|
169
196
|
}
|
|
170
197
|
catch {
|
|
171
198
|
return true;
|
|
172
199
|
}
|
|
173
200
|
}
|
|
174
|
-
async
|
|
201
|
+
async #ensureAttached(signal) {
|
|
202
|
+
if (this.#closed)
|
|
203
|
+
throw new ArtifactReaderFailure("unavailable", "DMG reader is closed");
|
|
204
|
+
this.#initialization ??= this.#attach(signal);
|
|
205
|
+
await this.#initialization;
|
|
206
|
+
if (this.#closed)
|
|
207
|
+
throw new ArtifactReaderFailure("unavailable", "DMG reader is closed");
|
|
208
|
+
}
|
|
209
|
+
async #attach(signal) {
|
|
175
210
|
await runChecked(this.host, ["verify", this.path], signal);
|
|
176
211
|
this.#provenance.push(command(["verify", this.path], ["read"]));
|
|
177
|
-
|
|
212
|
+
const baseline = await this.#readInfo();
|
|
213
|
+
this.#baselineDevices = new Set(baseline.images.flatMap((image) => image["system-entities"].map(({ "dev-entry": device }) => device)));
|
|
214
|
+
const mountRoot = await realpath(await mkdtemp(join(tmpdir(), "rea-dmg-")));
|
|
215
|
+
this.#mountRoot = mountRoot;
|
|
178
216
|
try {
|
|
217
|
+
this.#attachMayHaveMounted = true;
|
|
179
218
|
const attached = await runChecked(this.host, [
|
|
180
219
|
"attach",
|
|
181
220
|
"-readonly",
|
|
182
221
|
"-nobrowse",
|
|
183
222
|
"-plist",
|
|
184
223
|
"-mountroot",
|
|
185
|
-
|
|
224
|
+
mountRoot,
|
|
186
225
|
this.path,
|
|
187
|
-
], signal);
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (this.#devices.length === 0)
|
|
226
|
+
], signal, { timeoutMs: HDIUTIL_COMMAND_TIMEOUT_MS });
|
|
227
|
+
this.#attachOutputReturned = true;
|
|
228
|
+
let parsed;
|
|
229
|
+
try {
|
|
230
|
+
parsed = parseNativeDmgAttachOutput(attached.stdout);
|
|
231
|
+
}
|
|
232
|
+
catch (cause) {
|
|
233
|
+
throw new ArtifactReaderFailure("format", "hdiutil returned a malformed attachment plist", { cause });
|
|
234
|
+
}
|
|
235
|
+
if (parsed["system-entities"].length === 0)
|
|
198
236
|
throw new ArtifactReaderFailure("format", "hdiutil returned no attached devices");
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
237
|
+
this.#attachOutput = parsed;
|
|
238
|
+
const ownership = await this.#resolveAttachOwnership();
|
|
239
|
+
if (ownership !== "owned")
|
|
240
|
+
throw new ArtifactReaderFailure(ownership === "unknown" ? "unavailable" : "path", ownership === "unknown"
|
|
241
|
+
? `DMG attachment ownership is uncertain: ${this.#ownershipUncertainty ?? "no unique mount under the owned root"}`
|
|
242
|
+
: "hdiutil did not mount a new image beneath the owned root");
|
|
203
243
|
this.#provenance.push(command([
|
|
204
244
|
"attach",
|
|
205
245
|
"-readonly",
|
|
206
246
|
"-nobrowse",
|
|
207
247
|
"-plist",
|
|
208
248
|
"-mountroot",
|
|
209
|
-
|
|
249
|
+
mountRoot,
|
|
210
250
|
this.path,
|
|
211
251
|
], ["read", "mount"]));
|
|
212
|
-
this.#directory = new DirectoryArtifactReader(
|
|
252
|
+
this.#directory = new DirectoryArtifactReader(mountRoot);
|
|
213
253
|
}
|
|
214
254
|
catch (cause) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
255
|
+
if (cause instanceof NativeDmgCommandFailure && cause.stdout !== "") {
|
|
256
|
+
try {
|
|
257
|
+
this.#attachOutput = parseNativeDmgAttachOutput(cause.stdout);
|
|
258
|
+
this.#attachOutputReturned = true;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// The original command failure remains primary; fresh info still recovers mounts.
|
|
262
|
+
}
|
|
218
263
|
}
|
|
219
|
-
|
|
220
|
-
|
|
264
|
+
if (cause instanceof NativeDmgCommandFailure && cause.processNotStarted) {
|
|
265
|
+
this.#attachMayHaveMounted = false;
|
|
266
|
+
this.#ownershipUncertainty = undefined;
|
|
221
267
|
}
|
|
222
|
-
if (cleanupFailure !== undefined)
|
|
223
|
-
throw ArtifactReaderFailure.withCleanup(cause, ArtifactReaderFailure.cleanupObservation(cleanupFailure, `DMG mount root ${this.#mountRoot ?? this.path}`));
|
|
224
268
|
throw cause;
|
|
225
269
|
}
|
|
226
270
|
}
|
|
271
|
+
async #readInfo() {
|
|
272
|
+
const info = await runChecked(this.host, ["info", "-plist"], undefined, {
|
|
273
|
+
timeoutMs: HDIUTIL_COMMAND_TIMEOUT_MS,
|
|
274
|
+
});
|
|
275
|
+
return parseNativeDmgInfo(info.stdout);
|
|
276
|
+
}
|
|
277
|
+
async #resolveAttachOwnership() {
|
|
278
|
+
const mountRoot = this.#mountRoot;
|
|
279
|
+
if (mountRoot === undefined)
|
|
280
|
+
throw new Error("DMG mount root is unavailable for ownership discovery");
|
|
281
|
+
const ownership = resolveNativeDmgOwnership({
|
|
282
|
+
info: await this.#readInfo(),
|
|
283
|
+
...(this.#attachOutput === undefined
|
|
284
|
+
? {}
|
|
285
|
+
: { attachOutput: this.#attachOutput }),
|
|
286
|
+
attachOutputReturned: this.#attachOutputReturned,
|
|
287
|
+
mountRoot,
|
|
288
|
+
baselineDevices: this.#baselineDevices,
|
|
289
|
+
});
|
|
290
|
+
if (ownership.status === "owned") {
|
|
291
|
+
this.#devices = [...ownership.devices];
|
|
292
|
+
if (ownership.source === "info")
|
|
293
|
+
for (const device of ownership.devices)
|
|
294
|
+
this.#inventoryConfirmedDevices.add(device);
|
|
295
|
+
this.#attachMayHaveMounted = false;
|
|
296
|
+
this.#ownershipUncertainty = undefined;
|
|
297
|
+
return "owned";
|
|
298
|
+
}
|
|
299
|
+
if (ownership.status === "unknown") {
|
|
300
|
+
this.#ownershipUncertainty = ownership.reason;
|
|
301
|
+
return "unknown";
|
|
302
|
+
}
|
|
303
|
+
this.#attachMayHaveMounted = false;
|
|
304
|
+
this.#ownershipUncertainty = undefined;
|
|
305
|
+
this.#devices = [];
|
|
306
|
+
return "none";
|
|
307
|
+
}
|
|
227
308
|
}
|
|
228
309
|
const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
310
|
+
const processNotStarted = (cause) => {
|
|
311
|
+
if (!(cause instanceof Error))
|
|
312
|
+
return false;
|
|
313
|
+
const syscall = Reflect.get(cause, "syscall");
|
|
314
|
+
const code = Reflect.get(cause, "code");
|
|
315
|
+
const errno = Reflect.get(cause, "errno");
|
|
316
|
+
return (typeof syscall === "string" &&
|
|
317
|
+
syscall.startsWith("spawn ") &&
|
|
318
|
+
(typeof code === "string" ||
|
|
319
|
+
typeof code === "number" ||
|
|
320
|
+
typeof errno === "number"));
|
|
321
|
+
};
|
|
229
322
|
const runChecked = async (host, arguments_, signal, options) => {
|
|
230
323
|
let result;
|
|
231
324
|
try {
|
|
@@ -235,10 +328,9 @@ const runChecked = async (host, arguments_, signal, options) => {
|
|
|
235
328
|
if (cause instanceof ArtifactReaderFailure)
|
|
236
329
|
throw cause;
|
|
237
330
|
if (cause instanceof Error && cause.name === "AbortError")
|
|
238
|
-
throw new
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
throw new ArtifactReaderFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, { cause });
|
|
331
|
+
throw new NativeDmgCommandFailure("cancelled", "DMG operation cancelled", execFileOutputFailure(cause)?.stdout ?? "", { cause });
|
|
332
|
+
const output = execFileOutputFailure(cause);
|
|
333
|
+
throw new NativeDmgCommandFailure(commandFailureReason(cause, arguments_[0]), `hdiutil ${arguments_[0] ?? "operation"} failed: ${describeCommandFailure(cause, arguments_)}`, output?.stdout ?? "", { cause, processNotStarted: processNotStarted(cause) });
|
|
242
334
|
}
|
|
243
335
|
if (result.exitCode !== 0) {
|
|
244
336
|
const failure = {
|
|
@@ -253,9 +345,9 @@ const runChecked = async (host, arguments_, signal, options) => {
|
|
|
253
345
|
const reason = commandFailureReason(failure, arguments_[0]);
|
|
254
346
|
const details = describeCommandFailure(failure, arguments_);
|
|
255
347
|
const unknownVerifyFailure = arguments_[0] === "verify" && reason === "unavailable";
|
|
256
|
-
throw new
|
|
348
|
+
throw new NativeDmgCommandFailure(reason, unknownVerifyFailure
|
|
257
349
|
? `hdiutil verify failed; captured diagnostics do not establish the failure cause: ${details}`
|
|
258
|
-
: `hdiutil ${arguments_[0] ?? "operation"} failed: ${details}`, result.
|
|
350
|
+
: `hdiutil ${arguments_[0] ?? "operation"} failed: ${details}`, result.stdout, { cause: result.cause ?? failure });
|
|
259
351
|
}
|
|
260
352
|
return { stdout: result.stdout, exitCode: 0 };
|
|
261
353
|
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { relative, resolve, sep } from "node:path";
|
|
2
|
+
import { parse } from "plist";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const systemEntitySchema = z.object({
|
|
5
|
+
"dev-entry": z.string().startsWith("/dev/"),
|
|
6
|
+
"mount-point": z.string().optional(),
|
|
7
|
+
});
|
|
8
|
+
const attachOutputSchema = z.object({
|
|
9
|
+
"system-entities": z.array(systemEntitySchema),
|
|
10
|
+
});
|
|
11
|
+
const infoOutputSchema = z.object({
|
|
12
|
+
images: z.array(z.object({
|
|
13
|
+
"system-entities": z.array(systemEntitySchema),
|
|
14
|
+
})),
|
|
15
|
+
});
|
|
16
|
+
/** Parse hdiutil's current image inventory. */
|
|
17
|
+
export const parseNativeDmgInfo = (stdout) => infoOutputSchema.parse(parse(stdout));
|
|
18
|
+
/** Parse hdiutil's attach response while preserving device and mount facts. */
|
|
19
|
+
export const parseNativeDmgAttachOutput = (stdout) => attachOutputSchema.parse(parse(stdout));
|
|
20
|
+
/** Classify only fresh image groups tied to the exclusively owned mount root. */
|
|
21
|
+
export const resolveNativeDmgOwnership = (input) => {
|
|
22
|
+
const rootedImages = input.info.images.filter((image) => image["system-entities"].some(({ "mount-point": mountPoint }) => mountPoint !== undefined && isBelowRoot(input.mountRoot, mountPoint)));
|
|
23
|
+
if (rootedImages.length > 1)
|
|
24
|
+
return {
|
|
25
|
+
status: "unknown",
|
|
26
|
+
reason: "multiple hdiutil image groups report mounts beneath the owned root",
|
|
27
|
+
};
|
|
28
|
+
const rootedImage = rootedImages[0];
|
|
29
|
+
if (rootedImage !== undefined) {
|
|
30
|
+
const hasOutsideMount = rootedImage["system-entities"].some(({ "mount-point": mountPoint }) => mountPoint !== undefined && !isBelowRoot(input.mountRoot, mountPoint));
|
|
31
|
+
const groupDevices = rootedImage["system-entities"].map(({ "dev-entry": device }) => device);
|
|
32
|
+
const devices = topLevelDevices(groupDevices);
|
|
33
|
+
const overlapsBaseline = groupDevices.some((device) => input.baselineDevices.has(device));
|
|
34
|
+
if (hasOutsideMount || overlapsBaseline || devices.length === 0)
|
|
35
|
+
return {
|
|
36
|
+
status: "unknown",
|
|
37
|
+
reason: hasOutsideMount
|
|
38
|
+
? "the image group contains a mount outside the owned root"
|
|
39
|
+
: overlapsBaseline
|
|
40
|
+
? "the image group includes a device present before attachment"
|
|
41
|
+
: "the owned mount group contains no detachable device",
|
|
42
|
+
};
|
|
43
|
+
return { status: "owned", devices, source: "info" };
|
|
44
|
+
}
|
|
45
|
+
if (input.attachOutputReturned) {
|
|
46
|
+
const attachOwnership = ownershipFromAttachOutput(input.attachOutput, input.mountRoot, input.baselineDevices);
|
|
47
|
+
if (attachOwnership.status === "owned") {
|
|
48
|
+
return attachOwnership;
|
|
49
|
+
}
|
|
50
|
+
if (attachOwnership.status === "unknown")
|
|
51
|
+
return attachOwnership;
|
|
52
|
+
}
|
|
53
|
+
const newlyListedDevice = input.info.images.some((image) => image["system-entities"].some(({ "dev-entry": device }) => !input.baselineDevices.has(device)));
|
|
54
|
+
if (newlyListedDevice)
|
|
55
|
+
return {
|
|
56
|
+
status: "unknown",
|
|
57
|
+
reason: "hdiutil lists devices absent from the pre-attach baseline, but none is tied uniquely to the owned root; ownership is unknown",
|
|
58
|
+
};
|
|
59
|
+
return { status: "none" };
|
|
60
|
+
};
|
|
61
|
+
const ownershipFromAttachOutput = (output, mountRoot, baselineDevices) => {
|
|
62
|
+
if (output === undefined)
|
|
63
|
+
return {
|
|
64
|
+
status: "unknown",
|
|
65
|
+
reason: "hdiutil attach succeeded but its ownership facts were malformed",
|
|
66
|
+
};
|
|
67
|
+
const entities = output["system-entities"];
|
|
68
|
+
const hasRootMount = entities.some(({ "mount-point": mountPoint }) => mountPoint !== undefined && isBelowRoot(mountRoot, mountPoint));
|
|
69
|
+
const hasOutsideMount = entities.some(({ "mount-point": mountPoint }) => mountPoint !== undefined && !isBelowRoot(mountRoot, mountPoint));
|
|
70
|
+
const devices = entities.map(({ "dev-entry": device }) => device);
|
|
71
|
+
const uniqueDevices = topLevelDevices(devices);
|
|
72
|
+
const overlapsBaseline = devices.some((device) => baselineDevices.has(device));
|
|
73
|
+
if (hasRootMount) {
|
|
74
|
+
if (hasOutsideMount || overlapsBaseline || uniqueDevices.length === 0)
|
|
75
|
+
return {
|
|
76
|
+
status: "unknown",
|
|
77
|
+
reason: hasOutsideMount
|
|
78
|
+
? "the attach result includes a mount outside the owned root"
|
|
79
|
+
: overlapsBaseline
|
|
80
|
+
? "the attach result includes a device present before attachment"
|
|
81
|
+
: "the attach result's owned mount has no detachable device",
|
|
82
|
+
};
|
|
83
|
+
return { status: "owned", devices: uniqueDevices, source: "attach" };
|
|
84
|
+
}
|
|
85
|
+
if (devices.length === 0)
|
|
86
|
+
return {
|
|
87
|
+
status: "unknown",
|
|
88
|
+
reason: "hdiutil attach succeeded without reporting device ownership facts",
|
|
89
|
+
};
|
|
90
|
+
if (devices.some((device) => !baselineDevices.has(device)))
|
|
91
|
+
return {
|
|
92
|
+
status: "unknown",
|
|
93
|
+
reason: "the attach result reports new devices without a mount beneath the owned root",
|
|
94
|
+
};
|
|
95
|
+
return { status: "none" };
|
|
96
|
+
};
|
|
97
|
+
const topLevelDevices = (devices) => {
|
|
98
|
+
const unique = [...new Set(devices)];
|
|
99
|
+
return unique.filter((device) => !unique.some((parent) => /^\/dev\/disk\d+$/u.test(parent) &&
|
|
100
|
+
device.startsWith(`${parent}s`) &&
|
|
101
|
+
/^\d+$/u.test(device.slice(parent.length + 1))));
|
|
102
|
+
};
|
|
103
|
+
const isBelowRoot = (root, path) => {
|
|
104
|
+
const child = relative(root, resolve(path));
|
|
105
|
+
return (child !== "" &&
|
|
106
|
+
child !== "." &&
|
|
107
|
+
child !== ".." &&
|
|
108
|
+
!child.startsWith(`..${sep}`));
|
|
109
|
+
};
|