rea-agents 4.1.0 → 5.0.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 +184 -86
- package/bridge/android/ReaJadxBridge.java +247 -0
- package/bridge/native/NativeUIChildren.swift +27 -0
- package/bridge/native/ReaNativeUI.swift +30 -16
- package/dist/android/AndroidTargetSnapshot.js +5 -3
- package/dist/android/JadxAnalysis.js +8 -6
- package/dist/android/JadxConfiguration.js +19 -3
- package/dist/android/JadxMcpTransport.js +43 -16
- package/dist/android/JadxProtocol.js +8 -0
- package/dist/android/JadxProvider.js +117 -28
- package/dist/android/JadxRelease.js +8 -0
- package/dist/android/JadxSession.js +32 -18
- package/dist/application/AppBundleExecutable.js +141 -0
- package/dist/application/ArtifactInventory/classify.js +1 -1
- package/dist/application/ArtifactInventory/scanCanonical.js +1 -1
- package/dist/application/ArtifactInventory/scanReader.js +1 -1
- package/dist/application/ArtifactInventory.js +1 -1
- package/dist/application/BinaryTargetResolver.js +9 -64
- package/dist/application/CapabilityInventory.js +61 -3
- package/dist/application/ClientConfigurationDocument.js +72 -12
- package/dist/application/ClientRegistrationStatus.js +7 -8
- package/dist/application/DirectAnalysis.js +12 -14
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/DoctorDiagnostics.js +3 -3
- package/dist/application/EnhancedTools.js +4 -4
- package/dist/application/EvidenceBundleCommands.js +1 -1
- package/dist/application/FilesystemSnapshot.js +20 -5
- package/dist/application/InvestigationProviders.js +6 -0
- package/dist/application/LinuxHopper.js +8 -2
- package/dist/application/OptionalObservationProviders.js +3 -0
- package/dist/application/ProcessCaptureCapability.js +1 -1
- package/dist/application/ProcessCaptureLifecycle.js +2 -2
- package/dist/application/ProcessCli.js +5 -1
- package/dist/application/ProcessHarness.js +20 -9
- package/dist/application/ReconstructionCoverageService.js +2 -6
- package/dist/application/ReconstructionObligationCandidates.js +5 -2
- package/dist/application/ReferenceSourceImport.js +2 -0
- package/dist/application/ReferenceSourceImportEntries.js +20 -3
- package/dist/application/ReferenceSourceImportTypes.js +5 -0
- package/dist/application/Setup.js +10 -2
- package/dist/application/SetupClientConfiguration.js +19 -16
- package/dist/application/SetupHost.js +18 -3
- package/dist/application/SetupPlan.js +1 -1
- package/dist/application/Uninstall.js +23 -17
- package/dist/application/UpdateMaintenance.js +3 -3
- package/dist/application/ValidateSelectedWebScript.js +27 -0
- package/dist/application/WebModuleTraceService.js +209 -0
- package/dist/application/WebRuntimeService.js +73 -0
- package/dist/application/WebScriptExportService.js +115 -0
- package/dist/application/WebSourceLocationService.js +160 -0
- package/dist/application/{AndroidAnalysisService.js → android/AndroidAnalysisService.js} +6 -6
- package/dist/application/{AndroidApplicationService.js → android/AndroidApplicationService.js} +3 -3
- package/dist/application/{AppleApplicationService.js → apple/AppleApplicationService.js} +5 -5
- package/dist/application/{AnalysisClientCleanup.js → binary/AnalysisClientCleanup.js} +2 -2
- package/dist/application/{AnalysisProviderEvaluation.js → binary/AnalysisProviderEvaluation.js} +4 -4
- package/dist/application/{AnalysisProviderRegistry.js → binary/AnalysisProviderRegistry.js} +5 -5
- package/dist/application/{AnalysisSnapshotCache.js → binary/AnalysisSnapshotCache.js} +7 -9
- package/dist/application/{AnalysisSnapshotFiles.js → binary/AnalysisSnapshotFiles.js} +4 -4
- package/dist/application/{BinarySession.js → binary/BinarySession.js} +12 -10
- package/dist/application/{BinarySessionComposition.js → binary/BinarySessionComposition.js} +2 -1
- package/dist/application/{BinarySessionExecution.js → binary/BinarySessionExecution.js} +9 -7
- package/dist/application/{BinarySessionOpen.js → binary/BinarySessionOpen.js} +6 -6
- package/dist/application/{BinarySessionRecords.js → binary/BinarySessionRecords.js} +28 -40
- package/dist/application/{CompositeProvider.js → binary/CompositeProvider.js} +2 -2
- package/dist/application/{LazyAnalysisProvider.js → binary/LazyAnalysisProvider.js} +6 -6
- package/dist/application/{SessionProviderRouter.js → binary/SessionProviderRouter.js} +7 -7
- package/dist/application/{FirmwareAnalysisService.js → firmware/FirmwareAnalysisService.js} +5 -5
- package/dist/application/{EvidenceLedger.js → investigation/EvidenceLedger.js} +44 -7
- package/dist/application/investigation/InvestigationRecords.js +69 -0
- package/dist/application/{UnknownEvidence.js → investigation/UnknownEvidence.js} +1 -1
- package/dist/application/{ElectronActiveEvidence.js → javascript/ElectronActiveEvidence.js} +3 -3
- package/dist/application/javascript/ElectronActiveObservationPort.js +1 -0
- package/dist/application/{ElectronActiveObservationService.js → javascript/ElectronActiveObservationService.js} +3 -3
- package/dist/application/{ElectronBoundaryAnalysis.js → javascript/ElectronBoundaryAnalysis.js} +1 -1
- package/dist/application/{ElectronBoundaryGraphContext.js → javascript/ElectronBoundaryGraphContext.js} +1 -1
- package/dist/application/{ElectronEvidence.js → javascript/ElectronEvidence.js} +2 -2
- package/dist/application/javascript/ElectronObservationPort.js +1 -0
- package/dist/application/{ElectronObservationService.js → javascript/ElectronObservationService.js} +3 -3
- package/dist/application/{JavaScriptApplicationEvidence.js → javascript/JavaScriptApplicationEvidence.js} +3 -3
- package/dist/application/{JavaScriptApplicationEvidenceGraph.js → javascript/JavaScriptApplicationEvidenceGraph.js} +5 -5
- package/dist/application/{JavaScriptApplicationService.js → javascript/JavaScriptApplicationService.js} +10 -10
- package/dist/application/{JavaScriptApplicationWorkflowEvidence.js → javascript/JavaScriptApplicationWorkflowEvidence.js} +3 -3
- package/dist/application/{JavaScriptApplicationWorkflowService.js → javascript/JavaScriptApplicationWorkflowService.js} +12 -12
- package/dist/application/{JavaScriptArtifactAnalysis.js → javascript/JavaScriptArtifactAnalysis.js} +8 -24
- package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +1 -0
- package/dist/application/{JavaScriptArtifactGraphAccumulator.js → javascript/JavaScriptArtifactGraphAccumulator.js} +16 -2
- package/dist/application/{JavaScriptArtifactGraphBuilder.js → javascript/JavaScriptArtifactGraphBuilder.js} +2 -2
- package/dist/application/{JavaScriptArtifactGraphContext.js → javascript/JavaScriptArtifactGraphContext.js} +1 -1
- package/dist/application/{JavaScriptArtifactGraphDocuments.js → javascript/JavaScriptArtifactGraphDocuments.js} +1 -1
- package/dist/application/{JavaScriptArtifactGraphFindings.js → javascript/JavaScriptArtifactGraphFindings.js} +20 -7
- package/dist/application/{JavaScriptArtifactGraphStructure.js → javascript/JavaScriptArtifactGraphStructure.js} +1 -1
- package/dist/application/{JavaScriptArtifactPathResolution.js → javascript/JavaScriptArtifactPathResolution.js} +6 -12
- package/dist/application/{JavaScriptArtifactReconstruction.js → javascript/JavaScriptArtifactReconstruction.js} +4 -8
- package/dist/application/{JavaScriptJsonModules.js → javascript/JavaScriptJsonModules.js} +1 -1
- package/dist/application/{JavaScriptModuleRelationships.js → javascript/JavaScriptModuleRelationships.js} +2 -2
- package/dist/application/javascript/JavaScriptRecoveryPort.js +1 -0
- package/dist/application/javascript/JavaScriptRecoveryService.js +52 -0
- package/dist/application/{JavaScriptReturnShapeProjection.js → javascript/JavaScriptReturnShapeProjection.js} +3 -3
- package/dist/application/{JavaScriptRuntimeObservationEvidence.js → javascript/JavaScriptRuntimeObservationEvidence.js} +2 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationPort.js +1 -0
- package/dist/application/{JavaScriptRuntimeObservationService.js → javascript/JavaScriptRuntimeObservationService.js} +3 -3
- package/dist/application/{JavaScriptRuntimeReconciliationEvidence.js → javascript/JavaScriptRuntimeReconciliationEvidence.js} +3 -3
- package/dist/application/{JavaScriptRuntimeReconciliationService.js → javascript/JavaScriptRuntimeReconciliationService.js} +6 -6
- package/dist/application/{JavaScriptSemanticGraphAsyncProjection.js → javascript/JavaScriptSemanticGraphAsyncProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticGraphBuilder.js → javascript/JavaScriptSemanticGraphBuilder.js} +5 -3
- package/dist/application/{JavaScriptSemanticGraphChildProcessProjection.js → javascript/JavaScriptSemanticGraphChildProcessProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticGraphConstruction.js → javascript/JavaScriptSemanticGraphConstruction.js} +3 -2
- package/dist/application/{JavaScriptSemanticGraphDataProjection.js → javascript/JavaScriptSemanticGraphDataProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticGraphFingerprintProjection.js → javascript/JavaScriptSemanticGraphFingerprintProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticGraphFlowProjection.js → javascript/JavaScriptSemanticGraphFlowProjection.js} +2 -2
- package/dist/application/{JavaScriptSemanticGraphObjectProjection.js → javascript/JavaScriptSemanticGraphObjectProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticGraphProjection.js → javascript/JavaScriptSemanticGraphProjection.js} +2 -2
- package/dist/application/{JavaScriptSemanticGraphResourceProjection.js → javascript/JavaScriptSemanticGraphResourceProjection.js} +1 -1
- package/dist/application/{JavaScriptSemanticTraceService.js → javascript/JavaScriptSemanticTraceService.js} +6 -6
- package/dist/application/{ManagedApplicationGraphService.js → managed/ManagedApplicationGraphService.js} +7 -7
- package/dist/application/{ManagedMemberComparisonService.js → managed/ManagedMemberComparisonService.js} +10 -10
- package/dist/application/{ManagedNativeVerificationService.js → managed/ManagedNativeVerificationService.js} +7 -7
- package/dist/application/{ManagedReconstructionService.js → managed/ManagedReconstructionService.js} +7 -7
- package/dist/application/{NativeApiInspection.js → native/NativeApiInspection.js} +1 -1
- package/dist/application/{NativeCallRoutes.js → native/NativeCallRoutes.js} +3 -3
- package/dist/application/{NativeDispatchMetadataInspection.js → native/NativeDispatchMetadataInspection.js} +4 -4
- package/dist/application/{NativeUiActionTrace.js → native/NativeUiActionTrace.js} +7 -7
- package/dist/application/{NativeValueTrace.js → native/NativeValueTrace.js} +6 -6
- package/dist/{application/ArtifactInventory/hash.js → artifacts/ArtifactHash.js} +4 -2
- package/dist/artifacts/ArtifactPaths.js +3 -3
- package/dist/artifacts/ArtifactProvider.js +7 -37
- package/dist/artifacts/ArtifactProviderMetadata.js +36 -0
- package/dist/artifacts/AsarArtifactReader.js +195 -23
- package/dist/artifacts/AsarEntryStream.js +76 -0
- package/dist/artifacts/DirectoryArtifactReader.js +41 -7
- package/dist/artifacts/NativeDmgArtifactReader.js +161 -9
- package/dist/{application → artifacts/apple}/AppleAssetCatalogAnalysis.js +4 -4
- package/dist/{application → artifacts/apple}/InterfaceBuilderAnalysis.js +125 -51
- package/dist/artifacts/{KeyedArchiveReader.js → apple/KeyedArchiveReader.js} +21 -27
- package/dist/artifacts/apple/NibViewHierarchy.js +150 -0
- package/dist/{application → artifacts/javascript}/JavaScriptArtifactFiles.js +27 -6
- package/dist/artifacts/javascript/JavaScriptArtifactReader.js +6 -0
- package/dist/artifacts/readStableArtifact.js +52 -0
- package/dist/browser/BrowserScenarioSecrets.js +50 -8
- package/dist/browser/CdpAuthorizedMainFrame.js +4 -4
- package/dist/browser/CdpAuthorizedTarget.js +22 -0
- package/dist/browser/CdpBrowserProvider.js +4 -15
- package/dist/browser/CdpCaptureDocuments.js +33 -21
- package/dist/browser/CdpCaptureEventBodyShapes.js +3 -3
- package/dist/browser/CdpCaptureEventHandlers.js +26 -26
- package/dist/browser/CdpCaptureEventHelpers.js +6 -6
- package/dist/browser/CdpCaptureStorage.js +10 -8
- package/dist/browser/CdpCaptureStorageFingerprints.js +24 -22
- package/dist/browser/CdpCaptureValues.js +2 -2
- package/dist/browser/CdpCommandRejection.js +17 -0
- package/dist/browser/CdpConnection.js +51 -11
- package/dist/browser/CdpElectronInspection.js +10 -10
- package/dist/browser/CdpElectronProvider.js +3 -6
- package/dist/browser/CdpElectronScriptEvents.js +6 -6
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpElectronWorkers.js +4 -4
- package/dist/browser/CdpObservationSession.js +18 -23
- package/dist/browser/CdpPageCapture.js +4 -4
- package/dist/browser/CdpPageCaptureScripts.js +2 -2
- package/dist/browser/CdpPageCaptureWorkers.js +9 -9
- package/dist/browser/CdpSafeMetadata.js +48 -10
- package/dist/browser/CdpScreenshot.js +5 -5
- package/dist/browser/CdpTargetEvents.js +8 -0
- package/dist/browser/CdpTargetSession.js +2 -2
- package/dist/browser/CdpWebMcpDiscovery.js +22 -16
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +7 -6
- package/dist/browser/PlaywrightElectronActiveProvider.js +3 -6
- package/dist/browser/PlaywrightScenarioEvents.js +59 -51
- package/dist/browser/PlaywrightScenarioSession.js +8 -1
- package/dist/browser/WebSourceMapFetcher.js +37 -53
- package/dist/browser/assets/LocalWebScriptArtifacts.js +87 -0
- package/dist/browser/assets/PageScriptCapture.js +32 -0
- package/dist/browser/assets/PublishWebScripts.js +74 -0
- package/dist/browser/assets/ScenarioScriptCapture.js +76 -0
- package/dist/browser/assets/ScriptCaptureAdapters.js +57 -0
- package/dist/browser/assets/WebArtifactReads.js +56 -0
- package/dist/browser/assets/WebSourceLocationArtifacts.js +40 -0
- package/dist/browser/execution/CdpEventListeners.js +79 -0
- package/dist/browser/execution/CdpExecutionCapture.js +135 -0
- package/dist/browser/execution/CdpExecutionCollection.js +57 -0
- package/dist/browser/execution/CdpExecutionWindow.js +100 -0
- package/dist/browser/execution/CdpListenerSelector.js +22 -0
- package/dist/browser/execution/CdpPreciseCoverage.js +48 -0
- package/dist/browser/execution/CdpRuntimeInitiator.js +18 -0
- package/dist/browser/execution/CdpRuntimeProtocol.js +106 -0
- package/dist/browser/execution/CdpRuntimeRequests.js +81 -0
- package/dist/browser/execution/CdpRuntimeSession.js +163 -0
- package/dist/browser/execution/CdpRuntimeSources.js +223 -0
- package/dist/browser/execution/CdpWebRuntimeProvider.js +51 -0
- package/dist/browser/modules/NativeModuleResolver.js +210 -0
- package/dist/browser/modules/WebModuleArtifacts.js +40 -0
- package/dist/browser/network/PlaywrightNetworkContent.js +71 -0
- package/dist/browser/network/PlaywrightScenarioNetwork.js +180 -0
- package/dist/browser/providerIdentities.js +24 -0
- package/dist/catalogIdentity.js +23 -15
- package/dist/cli/androidCommands.js +13 -3
- package/dist/cli/applicationCommands.js +39 -8
- package/dist/cli/artifactCommands.js +1 -1
- package/dist/cli/browserAdvancedCommands.js +27 -9
- package/dist/cli/coreAnalysisCommands.js +5 -493
- package/dist/cli/coreBinaryCommands.js +211 -0
- package/dist/cli/coreNativeCommands.js +293 -0
- package/dist/cli/electronCommands.js +13 -18
- package/dist/cli/firmwareCommands.js +3 -3
- package/dist/cli/javascriptApplicationAnalysis.js +1 -1
- package/dist/cli/javascriptRecoveryCommands.js +45 -0
- package/dist/cli/managedCommands.js +4 -4
- package/dist/cli/managedProjectGraphCommand.js +1 -1
- package/dist/cli/referenceSourceImportStatus.js +6 -1
- package/dist/cli/utilityCommands.js +47 -23
- package/dist/cli/webModuleCommands.js +56 -0
- package/dist/cli/webRuntimeCommands.js +60 -0
- package/dist/cli/webScriptCommands.js +31 -0
- package/dist/cli/webSourceLocationCommands.js +42 -0
- package/dist/cli.js +10 -0
- package/dist/cliBrowserContext.js +4 -2
- package/dist/cliBrowserScenarioCommands.js +4 -3
- package/dist/cliCommandNames.js +8 -0
- package/dist/cliJavaScriptRuntimeCommands.js +6 -4
- package/dist/cliJsonInput.js +9 -2
- package/dist/cliOutput.js +37 -11
- package/dist/composition/android.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -0
- package/dist/composition/binary.js +25 -0
- package/dist/composition/browserObservation.js +3 -0
- package/dist/composition/browserScenario.js +3 -0
- package/dist/composition/directAnalysis.js +17 -0
- package/dist/composition/electronObservation.js +3 -0
- package/dist/composition/electronScenario.js +3 -0
- package/dist/composition/firmware.js +3 -0
- package/dist/composition/javascriptRecovery.js +3 -0
- package/dist/composition/javascriptRuntimeObservation.js +3 -0
- package/dist/composition/optionalObservationProviders.js +49 -0
- package/dist/composition/webModules.js +5 -0
- package/dist/composition/webRuntime.js +4 -0
- package/dist/composition/webSourceLocations.js +5 -0
- package/dist/config/parseConfig.js +22 -3
- package/dist/contracts/{androidToolContracts.js → android/androidToolContracts.js} +5 -5
- package/dist/contracts/applicationToolContracts.js +43 -8
- package/dist/contracts/artifactToolContracts.js +2 -2
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/enhancedInputs.js +1 -1
- package/dist/contracts/{firmwareToolContracts.js → firmware/firmwareToolContracts.js} +5 -5
- package/dist/contracts/{applicationWorkflowInputContracts.js → javascript/applicationWorkflowInputContracts.js} +6 -6
- package/dist/contracts/{electronToolContracts.js → javascript/electronToolContracts.js} +6 -6
- package/dist/contracts/{javascriptApplicationWorkflowExamples.js → javascript/javascriptApplicationWorkflowExamples.js} +3 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +23 -0
- package/dist/contracts/{javascriptRuntimeObservationToolContracts.js → javascript/javascriptRuntimeObservationToolContracts.js} +3 -3
- package/dist/contracts/{javascriptRuntimeReconciliationExample.js → javascript/javascriptRuntimeReconciliationExample.js} +5 -5
- package/dist/contracts/{managedToolContracts.js → managed/managedToolContracts.js} +3 -3
- package/dist/contracts/{managedWorkflowExamples.js → managed/managedWorkflowExamples.js} +1 -1
- package/dist/contracts/{managedWorkflowToolContracts.js → managed/managedWorkflowToolContracts.js} +6 -6
- package/dist/contracts/mobileApplicationGraphExamples.js +105 -0
- package/dist/contracts/{nativeToolContracts.js → native/nativeToolContracts.js} +14 -7
- package/dist/contracts/officialToolContracts.js +3 -3
- package/dist/contracts/sessionToolContracts.js +1 -1
- package/dist/contracts/toolContracts.js +13 -7
- package/dist/contracts/toolEffects.js +32 -0
- package/dist/contracts/toolOutputSchemaGroups.js +18 -18
- package/dist/contracts/webRuntimeToolContracts.js +43 -0
- package/dist/contracts/webScriptToolContracts.js +68 -0
- package/dist/domain/analysisErrorCore.js +4 -2
- package/dist/domain/analysisErrorProjection.js +1 -0
- package/dist/domain/{androidApplication.js → android/androidApplication.js} +7 -6
- package/dist/domain/apple/appleApplication.js +277 -0
- package/dist/domain/{appleAssetCatalog.js → apple/appleAssetCatalog.js} +2 -2
- package/dist/domain/apple/appleBundleAnatomy.js +236 -0
- package/dist/domain/{interfaceBuilderGraph.js → apple/interfaceBuilderGraph.js} +47 -314
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +411 -0
- package/dist/domain/{keyedArchive.js → apple/keyedArchive.js} +10 -9
- package/dist/domain/apple/plistValue.js +35 -0
- package/dist/domain/artifactInventoryEvidence.js +12 -2
- package/dist/domain/artifactInventorySnapshot.js +1 -0
- package/dist/domain/artifactOperationError.js +5 -1
- package/dist/domain/artifactPathSyntax.js +26 -0
- package/dist/domain/browserNetworkEvidence.js +82 -0
- package/dist/domain/browserObservationError.js +2 -0
- package/dist/domain/browserObservationSchemas.js +2 -1
- package/dist/domain/browserScenarioCapture.js +22 -0
- package/dist/domain/browserScenarioCaptureValues.js +25 -0
- package/dist/domain/browserScenarioDiff.js +6 -3
- package/dist/domain/browserScenarioDiffEvidence.js +35 -1
- package/dist/domain/browserScenarioValues.js +12 -1
- package/dist/domain/browserSession.js +2 -7
- package/dist/domain/bundleComparison.js +2 -1
- package/dist/domain/callPath.js +52 -44
- package/dist/domain/comparisonStatus.js +39 -0
- package/dist/domain/evidenceBundle.js +98 -35
- package/dist/domain/{firmwareAnalysis.js → firmware/firmwareAnalysis.js} +2 -2
- package/dist/domain/functionComparisonNormalization.js +11 -13
- package/dist/domain/hopperValues.js +2 -2
- package/dist/domain/inputIssueProjection.js +17 -2
- package/dist/domain/{electronObservation.js → javascript/electronObservation.js} +5 -11
- package/dist/domain/{electronStaticAnalysisBrowser.js → javascript/electronStaticAnalysisBrowser.js} +4 -3
- package/dist/domain/{electronStaticAnalysisIpc.js → javascript/electronStaticAnalysisIpc.js} +2 -2
- package/dist/domain/{electronStaticAnalysisNative.js → javascript/electronStaticAnalysisNative.js} +12 -13
- package/dist/domain/javascript/electronStaticAnalysisTypes.js +1 -0
- package/dist/domain/{electronStaticAnalysisValues.js → javascript/electronStaticAnalysisValues.js} +3 -3
- package/dist/domain/{javascriptApplicationAnalysis.js → javascript/javascriptApplicationAnalysis.js} +2 -2
- package/dist/domain/{javascriptApplicationChangeGraph.js → javascript/javascriptApplicationChangeGraph.js} +1 -1
- package/dist/domain/{javascriptApplicationEvidenceSchemas.js → javascript/javascriptApplicationEvidenceSchemas.js} +6 -4
- package/dist/domain/{javascriptApplicationGraph.js → javascript/javascriptApplicationGraph.js} +2 -2
- package/dist/domain/{javascriptApplicationGraphSchemas.js → javascript/javascriptApplicationGraphSchemas.js} +2 -2
- package/dist/domain/{javascriptApplicationVersionComparison.js → javascript/javascriptApplicationVersionComparison.js} +2 -2
- package/dist/domain/{javascriptApplicationVersionComparisonSchemas.js → javascript/javascriptApplicationVersionComparisonSchemas.js} +3 -3
- package/dist/domain/{javascriptApplicationVersionItems.js → javascript/javascriptApplicationVersionItems.js} +2 -2
- package/dist/domain/{javascriptApplicationVersionKeys.js → javascript/javascriptApplicationVersionKeys.js} +16 -9
- package/dist/domain/javascript/javascriptArtifactFiles.js +1 -0
- package/dist/domain/{javascriptAstFingerprint.js → javascript/javascriptAstFingerprint.js} +38 -22
- package/dist/domain/javascript/javascriptAstValues.js +23 -0
- package/dist/domain/{javascriptExportShapeComparison.js → javascript/javascriptExportShapeComparison.js} +1 -1
- package/dist/domain/{javascriptExportShapeComparisonSchemas.js → javascript/javascriptExportShapeComparisonSchemas.js} +2 -2
- package/dist/domain/{javascriptExportShapeSelection.js → javascript/javascriptExportShapeSelection.js} +1 -1
- package/dist/domain/{javascriptExportShapeVariants.js → javascript/javascriptExportShapeVariants.js} +1 -1
- package/dist/domain/{javascriptFeatureSeed.js → javascript/javascriptFeatureSeed.js} +4 -3
- package/dist/domain/{javascriptFeatureTrace.js → javascript/javascriptFeatureTrace.js} +2 -2
- package/dist/domain/{javascriptFeatureTraceSchemas.js → javascript/javascriptFeatureTraceSchemas.js} +32 -18
- package/dist/domain/{javascriptFeatureTraversal.js → javascript/javascriptFeatureTraversal.js} +6 -2
- package/dist/domain/{javascriptNativeHandoff.js → javascript/javascriptNativeHandoff.js} +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +88 -0
- package/dist/domain/{javascriptRuntimeLoadState.js → javascript/javascriptRuntimeLoadState.js} +1 -1
- package/dist/domain/{javascriptRuntimeObservation.js → javascript/javascriptRuntimeObservation.js} +2 -2
- package/dist/domain/{javascriptRuntimeReconciliationActive.js → javascript/javascriptRuntimeReconciliationActive.js} +3 -3
- package/dist/domain/{javascriptRuntimeReconciliationGraph.js → javascript/javascriptRuntimeReconciliationGraph.js} +1 -1
- package/dist/domain/{javascriptRuntimeReconciliationMatching.js → javascript/javascriptRuntimeReconciliationMatching.js} +2 -2
- package/dist/domain/{javascriptRuntimeReconciliationParsing.js → javascript/javascriptRuntimeReconciliationParsing.js} +5 -5
- package/dist/domain/{javascriptRuntimeReconciliationResult.js → javascript/javascriptRuntimeReconciliationResult.js} +2 -2
- package/dist/domain/{javascriptRuntimeReconciliationSchemas.js → javascript/javascriptRuntimeReconciliationSchemas.js} +4 -4
- package/dist/domain/{javascriptRuntimeStaticCandidates.js → javascript/javascriptRuntimeStaticCandidates.js} +1 -1
- package/dist/domain/{javascriptSemanticAnalysis.js → javascript/javascriptSemanticAnalysis.js} +40 -14
- package/dist/domain/{javascriptSemanticAsyncEffects.js → javascript/javascriptSemanticAsyncEffects.js} +2 -1
- package/dist/domain/{javascriptSemanticCallResolution.js → javascript/javascriptSemanticCallResolution.js} +10 -5
- package/dist/domain/{javascriptSemanticCalls.js → javascript/javascriptSemanticCalls.js} +7 -4
- package/dist/domain/{javascriptSemanticChildProcesses.js → javascript/javascriptSemanticChildProcesses.js} +4 -2
- package/dist/domain/{javascriptSemanticDataEffectHelpers.js → javascript/javascriptSemanticDataEffectHelpers.js} +7 -6
- package/dist/domain/{javascriptSemanticDataEffects.js → javascript/javascriptSemanticDataEffects.js} +8 -6
- package/dist/domain/{javascriptSemanticFingerprints.js → javascript/javascriptSemanticFingerprints.js} +40 -16
- package/dist/domain/{javascriptSemanticGraph.js → javascript/javascriptSemanticGraph.js} +2 -2
- package/dist/domain/{javascriptSemanticGraphSchemas.js → javascript/javascriptSemanticGraphSchemas.js} +3 -3
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +116 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +53 -0
- package/dist/domain/{javascriptSemanticObjects.js → javascript/javascriptSemanticObjects.js} +5 -5
- package/dist/domain/{javascriptSemanticPrimitives.js → javascript/javascriptSemanticPrimitives.js} +1 -1
- package/dist/domain/{javascriptSemanticProjection.js → javascript/javascriptSemanticProjection.js} +31 -44
- package/dist/domain/{javascriptSemanticPromises.js → javascript/javascriptSemanticPromises.js} +77 -22
- package/dist/domain/{javascriptSemanticProvenance.js → javascript/javascriptSemanticProvenance.js} +4 -1
- package/dist/domain/{javascriptSemanticQuery.js → javascript/javascriptSemanticQuery.js} +1 -1
- package/dist/domain/{javascriptSemanticQueryAssessment.js → javascript/javascriptSemanticQueryAssessment.js} +1 -1
- package/dist/domain/{javascriptSemanticQueryIdentity.js → javascript/javascriptSemanticQueryIdentity.js} +1 -1
- package/dist/domain/{javascriptSemanticQuerySchemas.js → javascript/javascriptSemanticQuerySchemas.js} +3 -3
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +25 -0
- package/dist/domain/{javascriptSemanticResources.js → javascript/javascriptSemanticResources.js} +2 -1
- package/dist/domain/{javascriptSemanticReturns.js → javascript/javascriptSemanticReturns.js} +1 -1
- package/dist/domain/{javascriptSemanticTraceSchemas.js → javascript/javascriptSemanticTraceSchemas.js} +2 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +55 -0
- package/dist/domain/javascript/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/{javascriptSemanticValues.js → javascript/javascriptSemanticValues.js} +72 -48
- package/dist/domain/{javascriptStaticAnalysis.js → javascript/javascriptStaticAnalysis.js} +7 -4
- package/dist/domain/{javascriptStaticAnalysisBundler.js → javascript/javascriptStaticAnalysisBundler.js} +14 -11
- package/dist/domain/{javascriptStaticAnalysisCalls.js → javascript/javascriptStaticAnalysisCalls.js} +2 -2
- package/dist/domain/{javascriptStaticAnalysisHelpers.js → javascript/javascriptStaticAnalysisHelpers.js} +231 -40
- package/dist/domain/{sourceToBundleComparison.js → javascript/sourceToBundleComparison.js} +2 -2
- package/dist/domain/{sourceToBundleComparisonSchemas.js → javascript/sourceToBundleComparisonSchemas.js} +4 -4
- package/dist/domain/{sourceToBundleSignals.js → javascript/sourceToBundleSignals.js} +2 -2
- package/dist/domain/{managedApplicationGraph.js → managed/managedApplicationGraph.js} +4 -4
- package/dist/domain/{managedApplicationGraphNodes.js → managed/managedApplicationGraphNodes.js} +1 -1
- package/dist/domain/{managedArtifact.js → managed/managedArtifact.js} +1 -1
- package/dist/domain/{managedMemberComparison.js → managed/managedMemberComparison.js} +4 -4
- package/dist/domain/{managedMemberComparisonCoverage.js → managed/managedMemberComparisonCoverage.js} +2 -1
- package/dist/domain/{managedMemberComparisonItems.js → managed/managedMemberComparisonItems.js} +97 -40
- package/dist/domain/{managedMemberComparisonMatch.js → managed/managedMemberComparisonMatch.js} +22 -11
- package/dist/domain/{managedNativeVerification.js → managed/managedNativeVerification.js} +1 -1
- package/dist/domain/{managedNativeVerificationMatch.js → managed/managedNativeVerificationMatch.js} +3 -3
- package/dist/domain/{managedNativeVerificationSchemas.js → managed/managedNativeVerificationSchemas.js} +6 -5
- package/dist/domain/{managedReconstruction.js → managed/managedReconstruction.js} +3 -3
- package/dist/domain/{nativeFunctionAnnotations.js → native/nativeFunctionAnnotations.js} +1 -1
- package/dist/domain/{nativeInspection.js → native/nativeInspection.js} +1 -1
- package/dist/domain/{nativeInvestigationGraph.js → native/nativeInvestigationGraph.js} +13 -4
- package/dist/domain/{nativeLoadImage.js → native/nativeLoadImage.js} +1 -1
- package/dist/domain/{nativeUiObservation.js → native/nativeUiObservation.js} +20 -6
- package/dist/domain/{objcSwiftMetadata.js → native/objcSwiftMetadata.js} +17 -0
- package/dist/domain/processCapture.js +4 -2
- package/dist/domain/processScenario.js +17 -17
- package/dist/domain/propertyListKeys.js +69 -0
- package/dist/domain/providerCleanupError.js +5 -2
- package/dist/domain/reconstructionCoverageEvaluation.js +46 -24
- package/dist/domain/reconstructionCoverageInput.js +7 -0
- package/dist/domain/runtimeVersion.js +2 -0
- package/dist/domain/sourceMapEnvelope.js +38 -0
- package/dist/domain/unicodeCodePointOrder.js +11 -6
- package/dist/domain/webBundleAnalyzerAst.js +2 -34
- package/dist/domain/webBundleAnalyzerInspection.js +12 -9
- package/dist/domain/webEventListeners.js +28 -0
- package/dist/domain/webExecution.js +74 -0
- package/dist/domain/webMcpDiscovery.js +1 -7
- package/dist/domain/webModuleImports.js +104 -0
- package/dist/domain/webModuleTrace.js +106 -0
- package/dist/domain/webRuntime.js +69 -0
- package/dist/domain/webScreenshot.js +1 -7
- package/dist/domain/webScriptArtifacts.js +39 -0
- package/dist/domain/webScriptExport.js +86 -0
- package/dist/domain/webScriptExportError.js +13 -0
- package/dist/domain/webScriptExportPlan.js +108 -0
- package/dist/domain/webSourceLocation.js +106 -0
- package/dist/domain/webSourcePosition.js +21 -0
- package/dist/dotnet/ManagedArtifactInspector.js +1 -1
- package/dist/dotnet/ManagedMemberInspector.js +1 -1
- package/dist/dotnet/ManagedMemberInspectorCore.js +34 -0
- package/dist/dotnet/ManagedMemberRows.js +5 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +22 -16
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +56 -50
- package/dist/dotnet/ManagedStaticProvider.js +3 -33
- package/dist/dotnet/ManagedStaticProviderMetadata.js +36 -0
- package/dist/evaluation/CodexAgentEval.js +2 -1
- package/dist/firmware/FirmwareProvider.js +18 -12
- package/dist/firmware/FirmwarePublication.js +1 -1
- package/dist/firmware/FirmwareRelease.js +1 -1
- package/dist/firmware/FirmwareReports.js +12 -0
- package/dist/firmware/FirmwareVersion.js +80 -0
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraFunctionValues.js +5 -5
- package/dist/ghidra/GhidraInstallation.js +38 -34
- package/dist/ghidra/GhidraInstallationPolicy.js +140 -0
- package/dist/ghidra/GhidraInventoryValues.js +1 -1
- package/dist/ghidra/GhidraLauncher.js +12 -4
- package/dist/ghidra/GhidraLoadImageAttest.js +36 -0
- package/dist/ghidra/GhidraLoadImageValues.js +1 -1
- package/dist/ghidra/GhidraProvider.js +15 -233
- package/dist/ghidra/GhidraProviderCapabilities.js +7 -14
- package/dist/ghidra/GhidraProviderClient.js +209 -0
- package/dist/ghidra/GhidraResponseBuffer.js +7 -1
- package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +17 -1
- package/dist/hopper/HopperProvider.js +2 -48
- package/dist/hopper/HopperProviderCapabilities.js +73 -0
- package/dist/hopper/HopperResponseStream.js +7 -1
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -4
- package/dist/ida/IdaProviderCapabilities.js +3 -11
- package/dist/ida/IdaSessionClient.js +12 -0
- package/dist/{browser → inspector}/JavaScriptRuntimeScope.js +16 -5
- package/dist/{browser → inspector}/V8InspectorCaptureProjection.js +46 -8
- package/dist/{browser → inspector}/V8InspectorEndpoint.js +1 -1
- package/dist/{browser → inspector}/V8InspectorProvider.js +10 -13
- package/dist/inspector/providerIdentity.js +6 -0
- package/dist/javascript/recovery/RecoveryFiles.js +122 -0
- package/dist/javascript/recovery/WakaruCommand.js +116 -0
- package/dist/javascript/recovery/WakaruExecution.js +100 -0
- package/dist/javascript/recovery/WakaruProvider.js +96 -0
- package/dist/javascript/recovery/WakaruPublication.js +102 -0
- package/dist/javascript/recovery/WakaruRelease.js +29 -0
- package/dist/javascript/recovery/WakaruReport.js +134 -0
- package/dist/javascript/sourceMaps/SourceMapCodecProcess.js +37 -0
- package/dist/javascript/sourceMaps/SourceMapCodecProtocol.js +20 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +176 -0
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +61 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +185 -0
- package/dist/javascript/sourceMaps/TraceSourceMap.js +138 -0
- package/dist/main/shutdown.js +8 -2
- package/dist/main/transport.js +24 -7
- package/dist/main.js +4 -18
- package/dist/native/AppleDispatchCoverage.js +58 -0
- package/dist/native/AppleDispatchMetadata.js +71 -509
- package/dist/native/AppleMachoFixups.js +292 -0
- package/dist/native/AppleMachoSelection.js +188 -0
- package/dist/native/AppleObjcCategories.js +59 -0
- package/dist/native/AppleObjcDispatchFacets.js +257 -0
- package/dist/native/AppleObjcProperties.js +68 -0
- package/dist/native/AppleObjcProtocols.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +150 -0
- package/dist/native/NativeMacOSProvider.js +132 -72
- package/dist/native/NativeMacOSProviderMetadata.js +42 -0
- package/dist/native/NativeMachoInspection.js +45 -14
- package/dist/native/NativeUiHelperRuntime.js +7 -3
- package/dist/native/NativeUiObservation.js +8 -4
- package/dist/native/NativeUiOutputBudget.js +8 -0
- package/dist/native/parsers/codesign.js +40 -5
- package/dist/native/parsers/demangle.js +6 -2
- package/dist/native/parsers/dyldInfo.js +13 -4
- package/dist/native/parsers/echoedPath.js +14 -0
- package/dist/native/parsers/lipo.js +14 -0
- package/dist/native/parsers/otool.js +1 -1
- package/dist/native/parsers/plist.js +174 -19
- package/dist/process/ExecFileOutput.js +2 -0
- package/dist/process/ProviderProcess.js +38 -17
- package/dist/reference/ReferenceSourceReaderEntries.js +6 -1
- package/dist/server/createServer.js +48 -6
- package/dist/server/mcpClientMetadata.js +6 -3
- package/dist/server/registerAndroidTools.js +1 -1
- package/dist/server/registerApplicationTools/compareExportShapes.js +2 -2
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -2
- package/dist/server/registerApplicationTools/compareVersions.js +2 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +43 -0
- package/dist/server/registerApplicationTools/traceFeature.js +1 -1
- package/dist/server/registerApplicationTools/traceSemantics.js +1 -1
- package/dist/server/registerApplicationTools.js +2 -0
- package/dist/server/registerBrowserScenarioTool.js +6 -2
- package/dist/server/registerBrowserTools.js +13 -2
- package/dist/server/registerCloseLifecycleTool.js +1 -1
- package/dist/server/registerElectronTools.js +21 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +17 -0
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -4
- package/dist/server/registerManagedTools.js +3 -3
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -2
- package/dist/server/registerManagedWorkflowTools/contract.js +1 -1
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +1 -1
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +1 -1
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -2
- package/dist/server/registerNativeTools.js +1 -1
- package/dist/server/registerPrompts.js +5 -1
- package/dist/server/registerSessionTools.js +1 -1
- package/dist/server/registerWebModuleTool.js +17 -0
- package/dist/server/registerWebRuntimeTools.js +31 -0
- package/dist/server/registerWebScriptTool.js +18 -0
- package/dist/server/registerWebSourceLocationTool.js +17 -0
- package/dist/server/sessionAvailabilityPolicy.js +24 -12
- package/dist/windows/WindowsOwnedProcess.js +3 -1
- package/install.sh +12 -2
- package/native/windows/README.md +5 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +40 -19
- package/scripts/hopper-demo-x11.py +67 -8
- package/scripts/rea.mjs +9 -1
- package/skills/reverse-engineer-anything/SKILL.md +3 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +2 -2
- package/skills/reverse-engineer-anything/references/javascript-applications.md +1 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +32 -23
- package/dist/application/runtime.js +0 -53
- package/dist/domain/appleApplication.js +0 -181
- package/dist/domain/javascriptAstValues.js +0 -13
- package/dist/domain/javascriptSemanticTraversal.js +0 -30
- package/dist/native/NativeHostCapabilities.js +0 -23
- /package/dist/application/{AndroidAnalysisPort.js → DirectAnalysisDependencies.js} +0 -0
- /package/dist/application/{BinarySessionPort.js → WebModulePorts.js} +0 -0
- /package/dist/application/{ElectronActiveObservationPort.js → WebRuntimePort.js} +0 -0
- /package/dist/application/{ElectronObservationPort.js → WebScriptArtifactPort.js} +0 -0
- /package/dist/application/{FirmwareAnalysisPort.js → WebSourceLocationPorts.js} +0 -0
- /package/dist/application/{JavaScriptArtifactAnalysisTypes.js → android/AndroidAnalysisPort.js} +0 -0
- /package/dist/application/{AbortablePromise.js → binary/AbortablePromise.js} +0 -0
- /package/dist/application/{JavaScriptRuntimeObservationPort.js → binary/BinarySessionPort.js} +0 -0
- /package/dist/application/{BinarySessionStatus.js → binary/BinarySessionStatus.js} +0 -0
- /package/dist/{domain/electronStaticAnalysisTypes.js → application/firmware/FirmwareAnalysisPort.js} +0 -0
- /package/dist/{domain/javascriptSemanticValueTypes.js → application/investigation/InvestigationRecordPort.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraph.js → javascript/ElectronBoundaryGraph.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraphIpc.js → javascript/ElectronBoundaryGraphIpc.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraphNative.js → javascript/ElectronBoundaryGraphNative.js} +0 -0
- /package/dist/application/{ElectronBoundaryGraphWindows.js → javascript/ElectronBoundaryGraphWindows.js} +0 -0
- /package/dist/application/{JavaScriptArtifactGraphBundlers.js → javascript/JavaScriptArtifactGraphBundlers.js} +0 -0
- /package/dist/application/{JavaScriptArtifactGraphEvidence.js → javascript/JavaScriptArtifactGraphEvidence.js} +0 -0
- /package/dist/application/{JavaScriptArtifactReconstructionInput.js → javascript/JavaScriptArtifactReconstructionInput.js} +0 -0
- /package/dist/application/{JavaScriptSemanticGraphEvidence.js → javascript/JavaScriptSemanticGraphEvidence.js} +0 -0
- /package/dist/application/{JavaScriptSemanticGraphValueProjection.js → javascript/JavaScriptSemanticGraphValueProjection.js} +0 -0
- /package/dist/artifacts/{NibArchive.js → apple/NibArchive.js} +0 -0
- /package/dist/domain/{androidAnalysis.js → android/androidAnalysis.js} +0 -0
- /package/dist/domain/{electronActiveObservation.js → javascript/electronActiveObservation.js} +0 -0
- /package/dist/domain/{electronStaticAnalysis.js → javascript/electronStaticAnalysis.js} +0 -0
- /package/dist/domain/{javascriptExportShapeComparisonIdentity.js → javascript/javascriptExportShapeComparisonIdentity.js} +0 -0
- /package/dist/domain/{javascriptRuntimeReconciliation.js → javascript/javascriptRuntimeReconciliation.js} +0 -0
- /package/dist/domain/{javascriptRuntimeReconciliationRuntime.js → javascript/javascriptRuntimeReconciliationRuntime.js} +0 -0
- /package/dist/domain/{javascriptSemanticCoverage.js → javascript/javascriptSemanticCoverage.js} +0 -0
- /package/dist/domain/{javascriptSemanticDerivedAnalysis.js → javascript/javascriptSemanticDerivedAnalysis.js} +0 -0
- /package/dist/domain/{javascriptSemanticGraphSerialization.js → javascript/javascriptSemanticGraphSerialization.js} +0 -0
- /package/dist/domain/{javascriptSemanticIr.js → javascript/javascriptSemanticIr.js} +0 -0
- /package/dist/domain/{javascriptSemanticQueryRelations.js → javascript/javascriptSemanticQueryRelations.js} +0 -0
- /package/dist/domain/{javascriptSemanticState.js → javascript/javascriptSemanticState.js} +0 -0
- /package/dist/domain/{javascriptSourceParser.js → javascript/javascriptSourceParser.js} +0 -0
- /package/dist/domain/{javascriptStaticAnalysisFindings.js → javascript/javascriptStaticAnalysisFindings.js} +0 -0
- /package/dist/domain/{javascriptStaticAnalysisState.js → javascript/javascriptStaticAnalysisState.js} +0 -0
- /package/dist/domain/{javascriptStaticAnalysisTypes.js → javascript/javascriptStaticAnalysisTypes.js} +0 -0
- /package/dist/domain/{managedApplicationGraphCoverage.js → managed/managedApplicationGraphCoverage.js} +0 -0
- /package/dist/domain/{managedApplicationGraphNodeCoverage.js → managed/managedApplicationGraphNodeCoverage.js} +0 -0
- /package/dist/domain/{nativeApiBoundary.js → native/nativeApiBoundary.js} +0 -0
- /package/dist/domain/{nativeDataType.js → native/nativeDataType.js} +0 -0
- /package/dist/domain/{nativeInstruction.js → native/nativeInstruction.js} +0 -0
- /package/dist/domain/{nativeMetadataRecovery.js → native/nativeMetadataRecovery.js} +0 -0
- /package/dist/domain/{nativeValueFlow.js → native/nativeValueFlow.js} +0 -0
- /package/dist/domain/{nativeValueTrace.js → native/nativeValueTrace.js} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { functionDossierSchema } from "
|
|
2
|
-
import { nativeCallTargetsSchema } from "
|
|
3
|
-
import { nativeValueTraceInputSchema, nativeValueTraceSchema, } from "
|
|
4
|
-
import { createEvidence } from "
|
|
5
|
-
import { AnalysisCancelledError, AnalysisOutputError, } from "
|
|
6
|
-
import { err, ok } from "
|
|
1
|
+
import { functionDossierSchema } from "../../domain/hopperValues.js";
|
|
2
|
+
import { nativeCallTargetsSchema } from "../../domain/native/nativeInstruction.js";
|
|
3
|
+
import { nativeValueTraceInputSchema, nativeValueTraceSchema, } from "../../domain/native/nativeValueTrace.js";
|
|
4
|
+
import { createEvidence } from "../../domain/evidence.js";
|
|
5
|
+
import { AnalysisCancelledError, AnalysisOutputError, } from "../../domain/analysisErrorCore.js";
|
|
6
|
+
import { err, ok } from "../../domain/result.js";
|
|
7
7
|
/** Compose bounded high-p-code def-use graphs across exactly referenced call destinations. */
|
|
8
8
|
export const traceNativeValues = async (analysis, parameters, signal) => {
|
|
9
9
|
const input = nativeValueTraceInputSchema.parse(parameters);
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { ArtifactReaderFailure } from "
|
|
3
|
-
import { streamChunkToBuffer } from "
|
|
2
|
+
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
3
|
+
import { streamChunkToBuffer } from "./StreamBytes.js";
|
|
4
4
|
/** Bounded classification evidence; this is not an executable format size limit. */
|
|
5
5
|
export const ARTIFACT_CLASSIFICATION_PREFIX_BYTES = 8_192;
|
|
6
|
+
/** Preserve the inventory cancellation reason at a stream boundary. */
|
|
6
7
|
export const abortIfNeeded = (signal) => {
|
|
7
8
|
if (signal?.aborted === true)
|
|
8
9
|
throw new ArtifactReaderFailure("cancelled", "Artifact inventory cancelled");
|
|
9
10
|
};
|
|
11
|
+
/** Hash every stream byte and retain its bounded classification prefix. */
|
|
10
12
|
export const hashReadable = async (stream, signal) => {
|
|
11
13
|
const hash = createHash("sha256");
|
|
12
14
|
const prefixes = [];
|
|
@@ -7,13 +7,13 @@ export const normalizeArtifactPath = (input) => {
|
|
|
7
7
|
input.includes("\\") ||
|
|
8
8
|
input.startsWith("/") ||
|
|
9
9
|
DRIVE_OR_UNC.test(input))
|
|
10
|
-
throw new ArtifactReaderFailure("path",
|
|
10
|
+
throw new ArtifactReaderFailure("path", `Artifact path is absolute or unsafe: ${JSON.stringify(input)}`);
|
|
11
11
|
const normalized = input.normalize("NFC").replace(/\/+$/u, "");
|
|
12
12
|
const parts = normalized.split("/");
|
|
13
13
|
if (normalized.length === 0 ||
|
|
14
14
|
parts.some((part) => part === "" || part === "." || part === "..") ||
|
|
15
15
|
posix.normalize(normalized) !== normalized)
|
|
16
|
-
throw new ArtifactReaderFailure("path",
|
|
16
|
+
throw new ArtifactReaderFailure("path", `Artifact path is not normalized: ${JSON.stringify(input)}`);
|
|
17
17
|
return normalized;
|
|
18
18
|
};
|
|
19
19
|
/** Reject exact, Unicode-normalized, case-folded, and prefix collisions. */
|
|
@@ -28,7 +28,7 @@ export class ArtifactPathRegistry {
|
|
|
28
28
|
const foldedPart = part.toLocaleLowerCase("en-US");
|
|
29
29
|
let child = node.children.get(foldedPart);
|
|
30
30
|
if (child !== undefined && child.spelling !== part)
|
|
31
|
-
throw new ArtifactReaderFailure("path", `Artifact path collision: ${path}`);
|
|
31
|
+
throw new ArtifactReaderFailure("path", `Artifact path collision: ${path} differs only in case from ${[...parts.slice(0, index), child.spelling].join("/")}`);
|
|
32
32
|
if (child === undefined) {
|
|
33
33
|
child = { spelling: part, kind: undefined, children: new Map() };
|
|
34
34
|
node.children.set(foldedPart, child);
|
|
@@ -1,56 +1,26 @@
|
|
|
1
1
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
2
|
-
import { inspectBundleKeyedArchive } from "./KeyedArchiveReader.js";
|
|
2
|
+
import { inspectBundleKeyedArchive } from "./apple/KeyedArchiveReader.js";
|
|
3
3
|
import { basename, dirname } from "node:path";
|
|
4
4
|
import { inventoryArtifact } from "../application/ArtifactInventory.js";
|
|
5
5
|
import { extractArtifact } from "../application/ArtifactExtraction.js";
|
|
6
|
-
import { analyzeInterfaceBuilderBundle } from "
|
|
7
|
-
import { analyzeAppleAssetCatalogs } from "
|
|
6
|
+
import { analyzeInterfaceBuilderBundle } from "./apple/InterfaceBuilderAnalysis.js";
|
|
7
|
+
import { analyzeAppleAssetCatalogs } from "./apple/AppleAssetCatalogAnalysis.js";
|
|
8
8
|
import { ARTIFACT_ANALYSIS_OPERATIONS, artifactInventoryInputSchema, artifactExtractionExecutionSchema, } from "../contracts/artifactToolContracts.js";
|
|
9
9
|
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
|
|
10
10
|
import { ArtifactOperationError } from "../domain/artifactOperationError.js";
|
|
11
11
|
import {} from "../domain/analysisErrorBase.js";
|
|
12
|
-
import { interfaceBuilderLimitsSchema } from "../domain/interfaceBuilderGraph.js";
|
|
12
|
+
import { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js";
|
|
13
13
|
import { err, ok } from "../domain/result.js";
|
|
14
14
|
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
15
|
-
import {
|
|
15
|
+
import { ARTIFACT_PROVIDER_IDENTITY as IDENTITY, artifactCapabilities, } from "./ArtifactProviderMetadata.js";
|
|
16
16
|
import { createEvidence } from "../domain/evidence.js";
|
|
17
17
|
import { createArtifactInspection } from "../domain/artifactInspection.js";
|
|
18
18
|
import { resolveArtifactIntegrityPolicy } from "../application/ArtifactInventory/policy.js";
|
|
19
|
-
const IDENTITY = Object.freeze(ARTIFACT_GRAPH_PROVIDER);
|
|
20
19
|
/** Read-only inventory and exclusively owned extraction provider. */
|
|
21
20
|
export class ArtifactProvider {
|
|
22
21
|
#capabilities;
|
|
23
22
|
constructor(platform = process.platform) {
|
|
24
|
-
this.#capabilities =
|
|
25
|
-
const common = {
|
|
26
|
-
provider: IDENTITY,
|
|
27
|
-
operation,
|
|
28
|
-
effects: Object.freeze({
|
|
29
|
-
mutatesArtifact: false,
|
|
30
|
-
launchesProcess: operation !== "decode_interface_builder" &&
|
|
31
|
-
operation !== "inspect_keyed_archive",
|
|
32
|
-
mayShowUi: false,
|
|
33
|
-
mayAccessNetwork: false,
|
|
34
|
-
mayWriteFilesystem: operation === "extract_artifact" ||
|
|
35
|
-
operation === "inspect_artifact" ||
|
|
36
|
-
operation === "inventory_artifact",
|
|
37
|
-
changesPermissions: false,
|
|
38
|
-
requiresRoot: false,
|
|
39
|
-
}),
|
|
40
|
-
limitations: Object.freeze([
|
|
41
|
-
"DMG child inventory automatically uses a read-only native macOS mount; PKG remains root-hash-only.",
|
|
42
|
-
"ASAR files discovered in filesystem-backed inventories are expanded without bulk extraction; other nested containers remain recorded only.",
|
|
43
|
-
]),
|
|
44
|
-
};
|
|
45
|
-
return Object.freeze(operation === "inspect_asset_catalog" && platform !== "darwin"
|
|
46
|
-
? {
|
|
47
|
-
...common,
|
|
48
|
-
available: false,
|
|
49
|
-
availabilityCode: "unsupported_host",
|
|
50
|
-
reason: "Apple asset catalogs require macOS assetutil.",
|
|
51
|
-
}
|
|
52
|
-
: { ...common, available: true, reason: null });
|
|
53
|
-
}));
|
|
23
|
+
this.#capabilities = artifactCapabilities(platform);
|
|
54
24
|
}
|
|
55
25
|
identity() {
|
|
56
26
|
return IDENTITY;
|
|
@@ -235,7 +205,7 @@ class ArtifactClient {
|
|
|
235
205
|
const isArtifactOperation = (operation) => ARTIFACT_ANALYSIS_OPERATIONS.includes(operation);
|
|
236
206
|
const translateFailure = (operation, cause) => {
|
|
237
207
|
if (cause instanceof ArtifactReaderFailure)
|
|
238
|
-
return new ArtifactOperationError(operation, cause.reason, cause.details);
|
|
208
|
+
return new ArtifactOperationError(operation, cause.reason, cause.details, cause.message);
|
|
239
209
|
return new ArtifactOperationError(operation, "io");
|
|
240
210
|
};
|
|
241
211
|
const subjectFor = (path, manifest) => ({
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ARTIFACT_GRAPH_PROVIDER } from "../application/InvestigationProviders.js";
|
|
2
|
+
import { ARTIFACT_ANALYSIS_OPERATIONS } from "../contracts/artifactToolContracts.js";
|
|
3
|
+
/** Identity of artifact inventory and owned extraction observations. */
|
|
4
|
+
export const ARTIFACT_PROVIDER_IDENTITY = Object.freeze(ARTIFACT_GRAPH_PROVIDER);
|
|
5
|
+
const IDENTITY = ARTIFACT_PROVIDER_IDENTITY;
|
|
6
|
+
/** Declare artifact coverage without constructing readers or acquiring resources. */
|
|
7
|
+
export const artifactCapabilities = (platform = process.platform) => Object.freeze(ARTIFACT_ANALYSIS_OPERATIONS.map((operation) => {
|
|
8
|
+
const common = {
|
|
9
|
+
provider: IDENTITY,
|
|
10
|
+
operation,
|
|
11
|
+
effects: Object.freeze({
|
|
12
|
+
mutatesArtifact: false,
|
|
13
|
+
launchesProcess: operation !== "decode_interface_builder" &&
|
|
14
|
+
operation !== "inspect_keyed_archive",
|
|
15
|
+
mayShowUi: false,
|
|
16
|
+
mayAccessNetwork: false,
|
|
17
|
+
mayWriteFilesystem: operation === "extract_artifact" ||
|
|
18
|
+
operation === "inspect_artifact" ||
|
|
19
|
+
operation === "inventory_artifact",
|
|
20
|
+
changesPermissions: false,
|
|
21
|
+
requiresRoot: false,
|
|
22
|
+
}),
|
|
23
|
+
limitations: Object.freeze([
|
|
24
|
+
"DMG child inventory automatically uses a read-only native macOS mount; PKG remains root-hash-only.",
|
|
25
|
+
"ASAR files discovered in filesystem-backed inventories are expanded without bulk extraction; other nested containers remain recorded only.",
|
|
26
|
+
]),
|
|
27
|
+
};
|
|
28
|
+
return Object.freeze(operation === "inspect_asset_catalog" && platform !== "darwin"
|
|
29
|
+
? {
|
|
30
|
+
...common,
|
|
31
|
+
available: false,
|
|
32
|
+
availabilityCode: "unsupported_host",
|
|
33
|
+
reason: "Apple asset catalogs require macOS assetutil.",
|
|
34
|
+
}
|
|
35
|
+
: { ...common, available: true, reason: null });
|
|
36
|
+
}));
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { constants, createReadStream } from "node:fs";
|
|
2
|
+
import { lstat, open, realpath } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join, relative, sep } from "node:path";
|
|
2
4
|
import { Readable } from "node:stream";
|
|
3
|
-
import {
|
|
5
|
+
import { getRawHeader, listPackage, statFile, uncache } from "@electron/asar";
|
|
4
6
|
import { ArtifactReaderFailure, } from "./ArtifactReader.js";
|
|
7
|
+
import { closeAsarHandle, readValidatedAsarEntry } from "./AsarEntryStream.js";
|
|
5
8
|
/**
|
|
6
|
-
* Official Electron ASAR adapter
|
|
9
|
+
* Official Electron ASAR adapter with range-streamed member reads.
|
|
7
10
|
*
|
|
8
11
|
* An entry marked `unpacked` is metadata, not an integrity exemption: Electron
|
|
9
12
|
* stores its bytes beside the archive in `<archive>.unpacked`, and callers must
|
|
@@ -11,16 +14,28 @@ import { ArtifactReaderFailure, } from "./ArtifactReader.js";
|
|
|
11
14
|
*/
|
|
12
15
|
export class AsarArtifactReader {
|
|
13
16
|
path;
|
|
17
|
+
openUnpackedFile;
|
|
14
18
|
format = "asar";
|
|
15
|
-
|
|
19
|
+
#archiveSize;
|
|
20
|
+
#headerSize;
|
|
21
|
+
#entries = new Map();
|
|
22
|
+
constructor(path, openUnpackedFile = open) {
|
|
16
23
|
this.path = path;
|
|
24
|
+
this.openUnpackedFile = openUnpackedFile;
|
|
17
25
|
}
|
|
18
26
|
async *entries(signal) {
|
|
19
27
|
let paths;
|
|
20
28
|
try {
|
|
21
29
|
// ASAR caches headers by path even after the archive has been replaced.
|
|
30
|
+
this.#resetArchiveState();
|
|
31
|
+
this.#entries.clear();
|
|
22
32
|
uncache(this.path);
|
|
23
33
|
paths = listPackage(this.path, { isPack: false }).sort((left, right) => left.localeCompare(right, "en"));
|
|
34
|
+
this.#headerSize = getRawHeader(this.path).headerSize;
|
|
35
|
+
const archiveMetadata = await lstat(this.path);
|
|
36
|
+
if (!archiveMetadata.isFile() || archiveMetadata.isSymbolicLink())
|
|
37
|
+
throw new ArtifactReaderFailure("format", "ASAR container is not a regular file");
|
|
38
|
+
this.#archiveSize = archiveMetadata.size;
|
|
24
39
|
}
|
|
25
40
|
catch (cause) {
|
|
26
41
|
throw asarFailure(this.path, "inventory", cause);
|
|
@@ -49,7 +64,7 @@ export class AsarArtifactReader {
|
|
|
49
64
|
: "link" in metadata
|
|
50
65
|
? "symlink"
|
|
51
66
|
: "file";
|
|
52
|
-
|
|
67
|
+
const entry = {
|
|
53
68
|
path,
|
|
54
69
|
kind,
|
|
55
70
|
declaredSize: "size" in metadata ? metadata.size : null,
|
|
@@ -65,39 +80,187 @@ export class AsarArtifactReader {
|
|
|
65
80
|
unpacked: "unpacked" in metadata && metadata.unpacked === true,
|
|
66
81
|
limitations: kind === "symlink"
|
|
67
82
|
? ["ASAR symlink target was not followed or disclosed."]
|
|
68
|
-
: [
|
|
69
|
-
"Official ASAR extraction buffers each individually bounded file.",
|
|
70
|
-
],
|
|
83
|
+
: [],
|
|
71
84
|
adapterKey: providerPath,
|
|
72
85
|
};
|
|
86
|
+
if (kind === "file" && isAsarFileMetadata(metadata))
|
|
87
|
+
this.#entries.set(providerPath, {
|
|
88
|
+
metadata,
|
|
89
|
+
entry: copyArtifactEntry(entry),
|
|
90
|
+
});
|
|
91
|
+
yield entry;
|
|
73
92
|
}
|
|
74
93
|
}
|
|
75
|
-
open(entry, signal) {
|
|
94
|
+
async open(entry, signal) {
|
|
76
95
|
abortIfNeeded(signal);
|
|
77
|
-
|
|
78
|
-
|
|
96
|
+
const state = this.#entries.get(entry.adapterKey);
|
|
97
|
+
if (state === undefined && entry.kind !== "file")
|
|
98
|
+
throw new ArtifactReaderFailure("format", "ASAR entry is not a regular file");
|
|
99
|
+
if (state === undefined)
|
|
100
|
+
throw new ArtifactReaderFailure("integrity", `ASAR entry was not produced by this reader: ${entry.path}`);
|
|
101
|
+
if (!sameArtifactEntry(entry, state.entry))
|
|
102
|
+
throw new ArtifactReaderFailure("integrity", `ASAR entry metadata changed since inventory: ${state.entry.path}`);
|
|
103
|
+
const { metadata } = state;
|
|
104
|
+
const producedEntry = state.entry;
|
|
105
|
+
if (producedEntry.unpacked) {
|
|
106
|
+
const handle = await this.#openUnpackedEntry(producedEntry);
|
|
107
|
+
try {
|
|
108
|
+
const observed = await handle.stat();
|
|
109
|
+
abortIfNeeded(signal);
|
|
110
|
+
if (!observed.isFile())
|
|
111
|
+
throw new ArtifactReaderFailure("path", `ASAR unpacked entry is not a regular file: ${producedEntry.path}`);
|
|
112
|
+
}
|
|
113
|
+
catch (cause) {
|
|
114
|
+
await handle.close().catch(() => undefined);
|
|
115
|
+
throw asarFailure(this.path, `read ${producedEntry.path}`, cause);
|
|
116
|
+
}
|
|
117
|
+
const source = handle.createReadStream({
|
|
118
|
+
start: 0,
|
|
119
|
+
autoClose: true,
|
|
120
|
+
});
|
|
121
|
+
return readValidatedAsarEntry(source, undefined, producedEntry.path, this.path, signal);
|
|
122
|
+
}
|
|
123
|
+
const archiveSize = this.#archiveSize;
|
|
124
|
+
const headerSize = this.#headerSize;
|
|
125
|
+
const offset = metadata.offset === undefined
|
|
126
|
+
? undefined
|
|
127
|
+
: parseArchiveOffset(metadata.offset);
|
|
128
|
+
const start = offset === undefined || headerSize === undefined
|
|
129
|
+
? undefined
|
|
130
|
+
: 8 + headerSize + offset;
|
|
131
|
+
if (archiveSize === undefined ||
|
|
132
|
+
start === undefined ||
|
|
133
|
+
!Number.isSafeInteger(start) ||
|
|
134
|
+
metadata.size < 0 ||
|
|
135
|
+
!Number.isSafeInteger(metadata.size) ||
|
|
136
|
+
start > archiveSize ||
|
|
137
|
+
metadata.size > archiveSize - start)
|
|
138
|
+
throw new ArtifactReaderFailure("format", `ASAR entry range is outside its container: ${producedEntry.path}`);
|
|
139
|
+
let handle;
|
|
79
140
|
try {
|
|
80
|
-
|
|
141
|
+
const openedHandle = await open(this.path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
142
|
+
handle = openedHandle;
|
|
143
|
+
const observed = await openedHandle.stat();
|
|
144
|
+
abortIfNeeded(signal);
|
|
145
|
+
if (!observed.isFile() || observed.size !== archiveSize)
|
|
146
|
+
throw new ArtifactReaderFailure("integrity", `ASAR container changed before read: ${producedEntry.path}`);
|
|
147
|
+
if (metadata.size === 0) {
|
|
148
|
+
await closeAsarHandle(() => openedHandle.close(), signal);
|
|
149
|
+
handle = undefined;
|
|
150
|
+
return Readable.from([]);
|
|
151
|
+
}
|
|
152
|
+
const source = openedHandle.createReadStream({
|
|
153
|
+
start,
|
|
154
|
+
end: start + metadata.size - 1,
|
|
155
|
+
autoClose: true,
|
|
156
|
+
});
|
|
157
|
+
return readValidatedAsarEntry(source, metadata.size, producedEntry.path, this.path, signal);
|
|
81
158
|
}
|
|
82
159
|
catch (cause) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
logicalPath: entry.path,
|
|
86
|
-
declaredSha256: entry.declaredSha256,
|
|
87
|
-
calculatedSha256: null,
|
|
88
|
-
unpacked: true,
|
|
89
|
-
}));
|
|
90
|
-
return Promise.reject(asarFailure(this.path, `read ${entry.path}`, cause));
|
|
160
|
+
await handle?.close().catch(() => undefined);
|
|
161
|
+
throw asarFailure(this.path, `read ${producedEntry.path}`, cause);
|
|
91
162
|
}
|
|
92
163
|
}
|
|
164
|
+
/** Open raw container bytes to verify the inventory identity before analysis. */
|
|
165
|
+
openContainer(signal) {
|
|
166
|
+
abortIfNeeded(signal);
|
|
167
|
+
return createReadStream(this.path, signal === undefined ? {} : { signal });
|
|
168
|
+
}
|
|
93
169
|
close() {
|
|
94
170
|
uncache(this.path);
|
|
171
|
+
this.#resetArchiveState();
|
|
172
|
+
this.#entries.clear();
|
|
95
173
|
return Promise.resolve();
|
|
96
174
|
}
|
|
97
175
|
provenance() {
|
|
98
176
|
return [];
|
|
99
177
|
}
|
|
178
|
+
async #openUnpackedEntry(entry) {
|
|
179
|
+
const unpackedRoot = `${this.path}.unpacked`;
|
|
180
|
+
try {
|
|
181
|
+
const rootMetadata = await lstat(unpackedRoot);
|
|
182
|
+
if (!rootMetadata.isDirectory() || rootMetadata.isSymbolicLink())
|
|
183
|
+
throw new ArtifactReaderFailure("path", "ASAR unpacked companion is not a regular directory");
|
|
184
|
+
const canonicalRoot = await realpath(unpackedRoot);
|
|
185
|
+
const candidate = join(unpackedRoot, entry.adapterKey);
|
|
186
|
+
const canonical = await realpath(candidate);
|
|
187
|
+
const relativePath = relative(canonicalRoot, canonical);
|
|
188
|
+
if (relativePath === ".." ||
|
|
189
|
+
relativePath.startsWith(`..${sep}`) ||
|
|
190
|
+
isAbsolute(relativePath))
|
|
191
|
+
throw new ArtifactReaderFailure("path", `ASAR unpacked entry escaped its companion directory: ${entry.path}`);
|
|
192
|
+
const pathMetadata = await lstat(candidate);
|
|
193
|
+
if (!pathMetadata.isFile() || pathMetadata.isSymbolicLink())
|
|
194
|
+
throw new ArtifactReaderFailure("path", `ASAR unpacked entry is not a regular file: ${entry.path}`);
|
|
195
|
+
const handle = await this.openUnpackedFile(canonical, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
196
|
+
const openedMetadata = await handle
|
|
197
|
+
.stat()
|
|
198
|
+
.catch(async (cause) => {
|
|
199
|
+
await handle.close().catch(() => undefined);
|
|
200
|
+
throw cause;
|
|
201
|
+
});
|
|
202
|
+
if (!openedMetadata.isFile() ||
|
|
203
|
+
openedMetadata.dev !== pathMetadata.dev ||
|
|
204
|
+
openedMetadata.ino !== pathMetadata.ino) {
|
|
205
|
+
await handle.close();
|
|
206
|
+
throw new ArtifactReaderFailure("integrity", `ASAR unpacked entry changed before read: ${entry.path}`, {}, {
|
|
207
|
+
logicalPath: entry.path,
|
|
208
|
+
declaredSha256: entry.declaredSha256,
|
|
209
|
+
calculatedSha256: null,
|
|
210
|
+
unpacked: true,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return handle;
|
|
214
|
+
}
|
|
215
|
+
catch (cause) {
|
|
216
|
+
if (cause instanceof ArtifactReaderFailure)
|
|
217
|
+
throw cause;
|
|
218
|
+
if (entry.unpacked && isMissingFile(cause))
|
|
219
|
+
throw new ArtifactReaderFailure("unavailable", `ASAR unpacked entry bytes are unavailable: ${entry.path}`, { cause }, {
|
|
220
|
+
logicalPath: entry.path,
|
|
221
|
+
declaredSha256: entry.declaredSha256,
|
|
222
|
+
calculatedSha256: null,
|
|
223
|
+
unpacked: true,
|
|
224
|
+
});
|
|
225
|
+
throw asarFailure(this.path, `read ${entry.path}`, cause);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
#resetArchiveState() {
|
|
229
|
+
this.#archiveSize = undefined;
|
|
230
|
+
this.#headerSize = undefined;
|
|
231
|
+
}
|
|
100
232
|
}
|
|
233
|
+
const copyArtifactEntry = (entry) => ({
|
|
234
|
+
...entry,
|
|
235
|
+
limitations: [...entry.limitations],
|
|
236
|
+
...(entry.sourceIdentity === undefined
|
|
237
|
+
? {}
|
|
238
|
+
: { sourceIdentity: { ...entry.sourceIdentity } }),
|
|
239
|
+
});
|
|
240
|
+
const sameArtifactEntry = (entry, produced) => entry.path === produced.path &&
|
|
241
|
+
entry.kind === produced.kind &&
|
|
242
|
+
entry.declaredSize === produced.declaredSize &&
|
|
243
|
+
entry.compressedSize === produced.compressedSize &&
|
|
244
|
+
entry.executable === produced.executable &&
|
|
245
|
+
entry.encrypted === produced.encrypted &&
|
|
246
|
+
entry.byteOffset === produced.byteOffset &&
|
|
247
|
+
entry.declaredSha256 === produced.declaredSha256 &&
|
|
248
|
+
entry.unpacked === produced.unpacked &&
|
|
249
|
+
entry.adapterKey === produced.adapterKey &&
|
|
250
|
+
entry.limitations.length === produced.limitations.length &&
|
|
251
|
+
entry.limitations.every((limitation, index) => limitation === produced.limitations[index]) &&
|
|
252
|
+
entry.sourceIdentity?.device === produced.sourceIdentity?.device &&
|
|
253
|
+
entry.sourceIdentity?.inode === produced.sourceIdentity?.inode;
|
|
254
|
+
const isAsarFileMetadata = (metadata) => "size" in metadata &&
|
|
255
|
+
typeof metadata.size === "number" &&
|
|
256
|
+
!("files" in metadata) &&
|
|
257
|
+
!("link" in metadata);
|
|
258
|
+
const parseArchiveOffset = (value) => {
|
|
259
|
+
if (!/^(?:0|[1-9][0-9]*)$/u.test(value))
|
|
260
|
+
return undefined;
|
|
261
|
+
const offset = Number(value);
|
|
262
|
+
return Number.isSafeInteger(offset) ? offset : undefined;
|
|
263
|
+
};
|
|
101
264
|
const abortIfNeeded = (signal) => {
|
|
102
265
|
if (signal?.aborted === true)
|
|
103
266
|
throw new ArtifactReaderFailure("cancelled", "ASAR operation cancelled");
|
|
@@ -106,9 +269,18 @@ const toArtifactPath = (listed) => {
|
|
|
106
269
|
const portable = sep === "\\" ? listed.replaceAll("\\", "/") : listed;
|
|
107
270
|
return portable.replace(/^\/+|\/+$/gu, "");
|
|
108
271
|
};
|
|
109
|
-
const asarFailure = (path, operation, cause) =>
|
|
110
|
-
|
|
111
|
-
|
|
272
|
+
const asarFailure = (path, operation, cause) => {
|
|
273
|
+
if (cause instanceof ArtifactReaderFailure)
|
|
274
|
+
return cause;
|
|
275
|
+
if (isFilesystemFailure(cause))
|
|
276
|
+
return new ArtifactReaderFailure("io", `Could not ${operation} ASAR at ${path}: ${cause.message}`, { cause });
|
|
277
|
+
return new ArtifactReaderFailure("format", `Malformed ASAR during ${operation}: ${path}`, { cause });
|
|
278
|
+
};
|
|
279
|
+
const isFilesystemFailure = (cause) => cause instanceof Error &&
|
|
280
|
+
"errno" in cause &&
|
|
281
|
+
typeof cause.errno === "number" &&
|
|
282
|
+
"syscall" in cause &&
|
|
283
|
+
typeof cause.syscall === "string";
|
|
112
284
|
const isMissingFile = (cause) => typeof cause === "object" &&
|
|
113
285
|
cause !== null &&
|
|
114
286
|
"code" in cause &&
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
3
|
+
/** Close an ASAR file handle before honoring cancellation of an empty member. */
|
|
4
|
+
export const closeAsarHandle = async (close, signal) => {
|
|
5
|
+
await close();
|
|
6
|
+
abortIfNeeded(signal);
|
|
7
|
+
};
|
|
8
|
+
/** Validate and contextualize bytes read from one ASAR member source. */
|
|
9
|
+
export const readValidatedAsarEntry = (source, expectedBytes, entryPath, archivePath, signal) => {
|
|
10
|
+
const output = Readable.from((async function* () {
|
|
11
|
+
let observedBytes = 0;
|
|
12
|
+
const iterator = source[Symbol.asyncIterator]();
|
|
13
|
+
try {
|
|
14
|
+
while (true) {
|
|
15
|
+
abortIfNeeded(signal);
|
|
16
|
+
const next = await iterator.next();
|
|
17
|
+
if (next.done)
|
|
18
|
+
break;
|
|
19
|
+
const chunk = next.value;
|
|
20
|
+
if (!Buffer.isBuffer(chunk) && !(chunk instanceof Uint8Array))
|
|
21
|
+
throw new ArtifactReaderFailure("format", `ASAR entry did not return bytes: ${entryPath}`);
|
|
22
|
+
observedBytes += Buffer.isBuffer(chunk)
|
|
23
|
+
? chunk.length
|
|
24
|
+
: chunk.byteLength;
|
|
25
|
+
if (expectedBytes !== undefined && observedBytes > expectedBytes)
|
|
26
|
+
throw new ArtifactReaderFailure("integrity", `ASAR entry exceeded its declared size: ${entryPath}`);
|
|
27
|
+
yield chunk;
|
|
28
|
+
}
|
|
29
|
+
if (expectedBytes !== undefined && observedBytes !== expectedBytes)
|
|
30
|
+
throw new ArtifactReaderFailure("integrity", `ASAR entry size disagrees with its header: ${entryPath}`);
|
|
31
|
+
}
|
|
32
|
+
catch (cause) {
|
|
33
|
+
throw asarFailure(archivePath, `read ${entryPath}`, cause);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
try {
|
|
37
|
+
await iterator.return?.();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Preserve the read failure; source destruction below owns cleanup.
|
|
41
|
+
}
|
|
42
|
+
if (!source.destroyed)
|
|
43
|
+
source.destroy();
|
|
44
|
+
}
|
|
45
|
+
})());
|
|
46
|
+
const closeSource = () => {
|
|
47
|
+
signal?.removeEventListener("abort", onAbort);
|
|
48
|
+
if (!source.destroyed)
|
|
49
|
+
source.destroy();
|
|
50
|
+
};
|
|
51
|
+
const onAbort = () => {
|
|
52
|
+
closeSource();
|
|
53
|
+
output.destroy(new ArtifactReaderFailure("cancelled", "ASAR operation cancelled"));
|
|
54
|
+
};
|
|
55
|
+
output.once("close", closeSource);
|
|
56
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
57
|
+
if (signal?.aborted === true)
|
|
58
|
+
onAbort();
|
|
59
|
+
return output;
|
|
60
|
+
};
|
|
61
|
+
const abortIfNeeded = (signal) => {
|
|
62
|
+
if (signal?.aborted === true)
|
|
63
|
+
throw new ArtifactReaderFailure("cancelled", "ASAR operation cancelled");
|
|
64
|
+
};
|
|
65
|
+
const asarFailure = (path, operation, cause) => {
|
|
66
|
+
if (cause instanceof ArtifactReaderFailure)
|
|
67
|
+
return cause;
|
|
68
|
+
if (isFilesystemFailure(cause))
|
|
69
|
+
return new ArtifactReaderFailure("io", `Could not ${operation} ASAR at ${path}: ${cause.message}`, { cause });
|
|
70
|
+
return new ArtifactReaderFailure("format", `Malformed ASAR during ${operation}: ${path}`, { cause });
|
|
71
|
+
};
|
|
72
|
+
const isFilesystemFailure = (cause) => cause instanceof Error &&
|
|
73
|
+
"errno" in cause &&
|
|
74
|
+
typeof cause.errno === "number" &&
|
|
75
|
+
"syscall" in cause &&
|
|
76
|
+
typeof cause.syscall === "string";
|
|
@@ -6,35 +6,46 @@ import { ArtifactReaderFailure, } from "./ArtifactReader.js";
|
|
|
6
6
|
export class DirectoryArtifactReader {
|
|
7
7
|
format = "directory";
|
|
8
8
|
#rootPromise;
|
|
9
|
+
#rootPath;
|
|
9
10
|
constructor(root) {
|
|
11
|
+
this.#rootPath = root;
|
|
10
12
|
this.#rootPromise = realpath(root);
|
|
11
13
|
}
|
|
12
14
|
async *entries(signal) {
|
|
13
|
-
const root = await this.#rootPromise
|
|
15
|
+
const root = await this.#rootPromise.catch((cause) => {
|
|
16
|
+
throw directoryIoFailure("resolve artifact root", this.#rootPath, cause);
|
|
17
|
+
});
|
|
14
18
|
const pending = [root];
|
|
15
19
|
while (pending.length > 0) {
|
|
16
20
|
abortIfNeeded(signal);
|
|
17
21
|
const directory = pending.pop();
|
|
18
22
|
if (directory === undefined)
|
|
19
23
|
break;
|
|
20
|
-
await assertContainedDirectory(root, directory);
|
|
24
|
+
await withDirectoryIoContext("inspect directory", directory, () => assertContainedDirectory(root, directory));
|
|
21
25
|
const children = [];
|
|
22
|
-
const handle = await opendir(directory)
|
|
26
|
+
const handle = await opendir(directory).catch((cause) => {
|
|
27
|
+
throw directoryIoFailure("open directory", directory, cause);
|
|
28
|
+
});
|
|
23
29
|
try {
|
|
24
30
|
for await (const child of handle)
|
|
25
31
|
children.push(child.name);
|
|
26
32
|
}
|
|
33
|
+
catch (cause) {
|
|
34
|
+
throw directoryIoFailure("read directory", directory, cause);
|
|
35
|
+
}
|
|
27
36
|
finally {
|
|
28
37
|
// best-effort cleanup: directory-handle close must not mask traversal.
|
|
29
38
|
await handle.close().catch(() => undefined);
|
|
30
39
|
}
|
|
31
|
-
await assertContainedDirectory(root, directory);
|
|
40
|
+
await withDirectoryIoContext("inspect directory", directory, () => assertContainedDirectory(root, directory));
|
|
32
41
|
children.sort((left, right) => left.localeCompare(right, "en"));
|
|
33
42
|
const directories = [];
|
|
34
43
|
for (const name of children) {
|
|
35
44
|
abortIfNeeded(signal);
|
|
36
45
|
const absolute = join(directory, name);
|
|
37
|
-
const metadata = await lstat(absolute)
|
|
46
|
+
const metadata = await lstat(absolute).catch((cause) => {
|
|
47
|
+
throw directoryIoFailure("inspect entry", absolute, cause);
|
|
48
|
+
});
|
|
38
49
|
const path = relative(root, absolute).split(sep).join("/");
|
|
39
50
|
const kind = metadata.isSymbolicLink()
|
|
40
51
|
? "symlink"
|
|
@@ -74,9 +85,13 @@ export class DirectoryArtifactReader {
|
|
|
74
85
|
abortIfNeeded(signal);
|
|
75
86
|
if (entry.kind !== "file")
|
|
76
87
|
throw new ArtifactReaderFailure("format", "Only regular files can be opened");
|
|
77
|
-
const handle = await open(entry.adapterKey, constants.O_RDONLY | constants.O_NOFOLLOW)
|
|
88
|
+
const handle = await open(entry.adapterKey, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK).catch((cause) => {
|
|
89
|
+
throw directoryIoFailure("open entry", entry.adapterKey, cause);
|
|
90
|
+
});
|
|
78
91
|
try {
|
|
79
|
-
const observed = await handle.stat()
|
|
92
|
+
const observed = await handle.stat().catch((cause) => {
|
|
93
|
+
throw directoryIoFailure("inspect opened entry", entry.adapterKey, cause);
|
|
94
|
+
});
|
|
80
95
|
if (!observed.isFile() ||
|
|
81
96
|
entry.sourceIdentity === undefined ||
|
|
82
97
|
observed.dev !== entry.sourceIdentity.device ||
|
|
@@ -98,6 +113,25 @@ export class DirectoryArtifactReader {
|
|
|
98
113
|
return [];
|
|
99
114
|
}
|
|
100
115
|
}
|
|
116
|
+
const directoryIoFailure = (operation, path, cause) => {
|
|
117
|
+
if (cause instanceof ArtifactReaderFailure)
|
|
118
|
+
return cause;
|
|
119
|
+
const code = typeof cause === "object" &&
|
|
120
|
+
cause !== null &&
|
|
121
|
+
"code" in cause &&
|
|
122
|
+
typeof cause.code === "string"
|
|
123
|
+
? ` (${cause.code})`
|
|
124
|
+
: "";
|
|
125
|
+
return new ArtifactReaderFailure("io", `Could not ${operation} at ${path}${code}`, { cause });
|
|
126
|
+
};
|
|
127
|
+
const withDirectoryIoContext = async (operation, path, action) => {
|
|
128
|
+
try {
|
|
129
|
+
return await action();
|
|
130
|
+
}
|
|
131
|
+
catch (cause) {
|
|
132
|
+
throw directoryIoFailure(operation, path, cause);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
101
135
|
const abortIfNeeded = (signal) => {
|
|
102
136
|
if (signal?.aborted === true)
|
|
103
137
|
throw new ArtifactReaderFailure("cancelled", "Artifact traversal cancelled");
|