rea-agents 6.1.0 → 6.3.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 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +7 -7
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- 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 +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- 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 +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- 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/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +105 -36
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +32 -41
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +19 -19
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -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
|
+
};
|
|
@@ -129,7 +129,13 @@ export class SafeOutputTree {
|
|
|
129
129
|
async rollback() {
|
|
130
130
|
if (this.#published)
|
|
131
131
|
return structuredClone(this.#cleanup);
|
|
132
|
-
|
|
132
|
+
let removalFailure;
|
|
133
|
+
try {
|
|
134
|
+
await rm(this.#outputRoot, { recursive: true, force: true });
|
|
135
|
+
}
|
|
136
|
+
catch (cause) {
|
|
137
|
+
removalFailure = cause;
|
|
138
|
+
}
|
|
133
139
|
const absent = await isAbsent(this.#outputRoot);
|
|
134
140
|
this.#cleanup = absent
|
|
135
141
|
? { status: "complete", residualPaths: [] }
|
|
@@ -138,7 +144,15 @@ export class SafeOutputTree {
|
|
|
138
144
|
residualPaths: [basename(this.#outputRoot)],
|
|
139
145
|
};
|
|
140
146
|
if (!absent)
|
|
141
|
-
throw new ArtifactReaderFailure("integrity",
|
|
147
|
+
throw new ArtifactReaderFailure("integrity", `Extraction output cleanup could not be verified${removalFailure === undefined ? "" : `: ${removalFailure instanceof Error ? removalFailure.message : String(removalFailure)}`}`, {
|
|
148
|
+
cause: removalFailure,
|
|
149
|
+
cleanup: {
|
|
150
|
+
reason: removalFailure instanceof Error
|
|
151
|
+
? removalFailure.message
|
|
152
|
+
: "Extraction output root remains after rollback",
|
|
153
|
+
resources: [this.#outputRoot],
|
|
154
|
+
},
|
|
155
|
+
});
|
|
142
156
|
return structuredClone(this.#cleanup);
|
|
143
157
|
}
|
|
144
158
|
async #prepareParent(relativePath) {
|
|
@@ -5,10 +5,12 @@ import { Reader, ZipReader } from "@zip.js/zip.js";
|
|
|
5
5
|
import { ArtifactReaderFailure, } from "./ArtifactReader.js";
|
|
6
6
|
class NodeFileReader extends Reader {
|
|
7
7
|
path;
|
|
8
|
+
maximumReadBytes;
|
|
8
9
|
#handle;
|
|
9
|
-
constructor(path) {
|
|
10
|
+
constructor(path, maximumReadBytes) {
|
|
10
11
|
super(path);
|
|
11
12
|
this.path = path;
|
|
13
|
+
this.maximumReadBytes = maximumReadBytes;
|
|
12
14
|
}
|
|
13
15
|
async init() {
|
|
14
16
|
this.#handle = await open(this.path, "r");
|
|
@@ -18,7 +20,11 @@ class NodeFileReader extends Reader {
|
|
|
18
20
|
const handle = this.#handle;
|
|
19
21
|
if (handle === undefined)
|
|
20
22
|
throw new Error("ZIP reader is not initialized");
|
|
21
|
-
const
|
|
23
|
+
const readBytes = Math.min(length, this.size - index);
|
|
24
|
+
if (this.maximumReadBytes !== undefined &&
|
|
25
|
+
readBytes > this.maximumReadBytes)
|
|
26
|
+
throw new ArtifactReaderFailure("limit", `ZIP metadata read requires ${readBytes} bytes, exceeding the ${this.maximumReadBytes}-byte read budget`);
|
|
27
|
+
const bytes = Buffer.alloc(readBytes);
|
|
22
28
|
const read = await handle.read(bytes, 0, bytes.length, index);
|
|
23
29
|
return bytes.subarray(0, read.bytesRead);
|
|
24
30
|
}
|
|
@@ -33,9 +39,10 @@ export class ZipArtifactReader {
|
|
|
33
39
|
#source;
|
|
34
40
|
#reader;
|
|
35
41
|
#entries = new Map();
|
|
36
|
-
|
|
42
|
+
/** Optionally bound each metadata read before allocating its backing buffer. */
|
|
43
|
+
constructor(path, format, maximumMetadataReadBytes) {
|
|
37
44
|
this.format = format;
|
|
38
|
-
this.#source = new NodeFileReader(path);
|
|
45
|
+
this.#source = new NodeFileReader(path, maximumMetadataReadBytes);
|
|
39
46
|
this.#reader = new ZipReader(this.#source, {
|
|
40
47
|
checkSignature: true,
|
|
41
48
|
checkOverlappingEntry: true,
|
|
@@ -39,7 +39,8 @@ export const analyzeAppleAssetCatalogs = async (input) => {
|
|
|
39
39
|
const inspected = await inspectAssetCatalogEntry({
|
|
40
40
|
reader,
|
|
41
41
|
entry,
|
|
42
|
-
runAssetUtil: input.runAssetUtil ??
|
|
42
|
+
runAssetUtil: input.runAssetUtil ??
|
|
43
|
+
((path, signal) => runAssetUtil(path, input.environment, signal)),
|
|
43
44
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
44
45
|
});
|
|
45
46
|
totalMetadataBytes += inspected.metadataBytes;
|
|
@@ -150,9 +151,10 @@ export const collectInterfaceBuilderResourceKeys = (nodes) => nodes.flatMap((nod
|
|
|
150
151
|
]
|
|
151
152
|
: []);
|
|
152
153
|
});
|
|
153
|
-
const runAssetUtil = async (path, signal) => {
|
|
154
|
+
const runAssetUtil = async (path, environment, signal) => {
|
|
154
155
|
try {
|
|
155
156
|
return (await execFileOutput(ASSETUTIL, ["--info", path], {
|
|
157
|
+
env: environment,
|
|
156
158
|
timeout: 60_000,
|
|
157
159
|
maxBuffer: MAX_CATALOG_BYTES,
|
|
158
160
|
...(signal === undefined ? {} : { signal }),
|
|
@@ -2,11 +2,14 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { lstat, open, readlink, realpath } from "node:fs/promises";
|
|
4
4
|
import { join, relative, sep } from "node:path";
|
|
5
|
+
import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
|
|
5
6
|
import { resolveTreePath } from "../../domain/apple/dyldPaths.js";
|
|
6
7
|
import { dylibResolutionInputSchema, dylibResolutionResultSchema, traceDylibLoading, } from "../../domain/apple/dylibResolution.js";
|
|
8
|
+
import { projectInputIssues } from "../../domain/inputIssueProjection.js";
|
|
7
9
|
import { ArtifactReaderFailure } from "../ArtifactReader.js";
|
|
8
10
|
import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
|
|
9
11
|
import { hasMachoMagic, readMachoImage } from "./MachoLoadCommandReader.js";
|
|
12
|
+
const OPERATION = "trace_dylib_resolution";
|
|
10
13
|
const HASH_CHUNK_BYTES = 1024 * 1024;
|
|
11
14
|
/** Lazily probed, symlink-preserving view of one analyzed directory. */
|
|
12
15
|
class FilesystemTreeView {
|
|
@@ -64,7 +67,7 @@ class FilesystemTreeView {
|
|
|
64
67
|
export const traceDylibResolution = async (options) => {
|
|
65
68
|
const parsed = dylibResolutionInputSchema.safeParse(options.parameters);
|
|
66
69
|
if (!parsed.success)
|
|
67
|
-
throw new
|
|
70
|
+
throw new AnalysisInputError(OPERATION, { cause: parsed.error }, projectInputIssues(parsed.error.issues, options.parameters));
|
|
68
71
|
// Canonicalization is inside the translated region: a revoked permission
|
|
69
72
|
// keeps its reason and path.
|
|
70
73
|
let root = options.rootPath;
|
|
@@ -79,7 +82,7 @@ export const traceDylibResolution = async (options) => {
|
|
|
79
82
|
: options.enumerateRoots
|
|
80
83
|
? await executableRoots(root, view, options.signal)
|
|
81
84
|
: { roots: [target], unclassified: [] };
|
|
82
|
-
const roots = await requireMachoRoots(view, requested);
|
|
85
|
+
const roots = await requireMachoRoots(view, requested, parsed.data.roots !== undefined);
|
|
83
86
|
const trace = await traceDylibLoading(view, {
|
|
84
87
|
roots,
|
|
85
88
|
unclassified,
|
|
@@ -151,17 +154,24 @@ const compare = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
|
151
154
|
/**
|
|
152
155
|
* Resolve each root segment by segment, as dependency candidates are, so a
|
|
153
156
|
* symlink in an intermediate directory cannot lead outside the analyzed root.
|
|
157
|
+
* A root the caller selected that fails is an input error on that root; a
|
|
158
|
+
* root REA derived itself keeps reporting an artifact failure.
|
|
154
159
|
*/
|
|
155
|
-
const requireMachoRoots = async (view, roots) => {
|
|
160
|
+
const requireMachoRoots = async (view, roots, callerSelected) => {
|
|
156
161
|
const resolved = [];
|
|
157
|
-
for (const path of roots) {
|
|
162
|
+
for (const [index, path] of roots.entries()) {
|
|
163
|
+
const reject = (reason, message) => callerSelected
|
|
164
|
+
? new AnalysisInputError(OPERATION, undefined, [
|
|
165
|
+
{ path: ["roots", index], reason: "invalid_value", message },
|
|
166
|
+
])
|
|
167
|
+
: new ArtifactReaderFailure(reason, message);
|
|
158
168
|
const lookup = await resolveTreePath(view, path);
|
|
159
169
|
if (lookup.kind === "escapes")
|
|
160
|
-
throw
|
|
170
|
+
throw reject("path", `Root ${path} resolves outside the analyzed root`);
|
|
161
171
|
if (lookup.kind !== "file")
|
|
162
|
-
throw
|
|
172
|
+
throw reject("path", `Root ${path} is not a regular file in the analyzed root`);
|
|
163
173
|
if ((await view.image(lookup.path)).status === "not-mach-o")
|
|
164
|
-
throw
|
|
174
|
+
throw reject("format", `Root ${path} is not a Mach-O image`);
|
|
165
175
|
if (!resolved.includes(lookup.path))
|
|
166
176
|
resolved.push(lookup.path);
|
|
167
177
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { join } from "node:path";
|
|
2
3
|
import { parseBinary } from "plist";
|
|
3
4
|
import { z } from "zod";
|
|
4
|
-
import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
|
|
5
|
+
import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
|
|
5
6
|
import { projectPlistValue } from "../../domain/apple/plistValue.js";
|
|
6
7
|
import { createPlistNumberProjection } from "../../domain/apple/plistNumbers.js";
|
|
7
8
|
import { binaryPlistNumberLiterals, xmlPlistNumberLiterals, } from "./PlistNumberLiterals.js";
|
|
8
9
|
import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../../domain/propertyListKeys.js";
|
|
9
|
-
import { keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
|
|
10
|
+
import { KeyedArchiveKindError, keyedArchiveInputSchema, keyedArchiveResultSchema, projectKeyedArchive, } from "../../domain/apple/keyedArchive.js";
|
|
10
11
|
import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
|
|
11
12
|
import { ArtifactReaderFailure } from "../ArtifactReader.js";
|
|
12
13
|
import { decodeXmlPlistText } from "../../domain/propertyListXmlText.js";
|
|
@@ -16,13 +17,14 @@ export const decodeKeyedArchiveBytes = (bytes, selection) => {
|
|
|
16
17
|
if (bytes.length > MAX_BYTES)
|
|
17
18
|
throw new RangeError("Keyed archive exceeds 64 MiB");
|
|
18
19
|
if (bytes.subarray(0, 10).toString("ascii") === "NIBArchive")
|
|
19
|
-
throw new
|
|
20
|
+
throw new KeyedArchiveKindError("Selected file is a compiled NIBArchive, not a Foundation plist archive; decode it with decode_interface_builder", "nib-archive");
|
|
20
21
|
const binary = bytes.subarray(0, 8).toString("ascii") === "bplist00";
|
|
21
22
|
const xmlText = binary ? undefined : decodeXmlPlistText(bytes);
|
|
22
23
|
const parsed = binary
|
|
23
24
|
? { value: parseBinary(bytes), omittedPrototypeKeys: 0 }
|
|
24
25
|
: parseXmlPropertyList(xmlText ?? "");
|
|
25
|
-
const
|
|
26
|
+
const { value: plistValue, unknownRealCount } = projectPlistValue(parsed.value);
|
|
27
|
+
const graph = projectKeyedArchive(plistValue, selection);
|
|
26
28
|
const numbers = createPlistNumberProjection(binary
|
|
27
29
|
? binaryPlistNumberLiterals(bytes)
|
|
28
30
|
: xmlPlistNumberLiterals(xmlText ?? ""));
|
|
@@ -47,14 +49,24 @@ export const decodeKeyedArchiveBytes = (bytes, selection) => {
|
|
|
47
49
|
...(parsed.omittedPrototypeKeys === 0
|
|
48
50
|
? []
|
|
49
51
|
: [omittedPrototypeKeysLimitation(parsed.omittedPrototypeKeys)]),
|
|
52
|
+
...(unknownRealCount === 0
|
|
53
|
+
? []
|
|
54
|
+
: [
|
|
55
|
+
`${String(unknownRealCount)} non-finite real value(s) are reported as { "$plist_type": "real", "value": null } because JSON evidence cannot preserve NaN vs infinity.`,
|
|
56
|
+
]),
|
|
50
57
|
],
|
|
51
58
|
};
|
|
52
59
|
};
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Point to the workflow that reads the selected kind of file on this host.
|
|
62
|
+
* decode_interface_builder is portable; inspect_plist requires macOS.
|
|
63
|
+
*/
|
|
64
|
+
const keyedArchiveKindRemediation = (kind, platform) => {
|
|
65
|
+
if (kind === "nib-archive")
|
|
66
|
+
return "Decode compiled NIBArchive files with decode_interface_builder on the app bundle.";
|
|
67
|
+
return platform === "darwin"
|
|
68
|
+
? "Inspect an ordinary property list with inspect_plist; inspect_keyed_archive decodes NSKeyedArchiver archives only."
|
|
69
|
+
: "Select an NSKeyedArchiver archive; inspect_keyed_archive decodes only those. inspect_plist, which reads ordinary property lists, requires a macOS host.";
|
|
58
70
|
};
|
|
59
71
|
/** Read exactly one regular, contained bundle entry without following symlinks. */
|
|
60
72
|
export const inspectBundleKeyedArchive = async (input) => {
|
|
@@ -68,45 +80,59 @@ export const inspectBundleKeyedArchive = async (input) => {
|
|
|
68
80
|
: `Archive path must be a canonical relative bundle path without empty, '.', or '..' segments: ${selected.path}`);
|
|
69
81
|
const reader = new DirectoryArtifactReader(input.bundlePath);
|
|
70
82
|
try {
|
|
83
|
+
// Match inventory spelling while retaining the raw path for I/O and evidence.
|
|
84
|
+
const wanted = selected.path.normalize("NFC");
|
|
85
|
+
const matches = [];
|
|
71
86
|
for await (const entry of reader.entries(input.signal)) {
|
|
72
|
-
if (entry.path !==
|
|
87
|
+
if (entry.path.normalize("NFC") !== wanted)
|
|
73
88
|
continue;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
89
|
+
matches.push(entry);
|
|
90
|
+
}
|
|
91
|
+
if (matches.length > 1)
|
|
92
|
+
throw archivePathError("invalid_value", `Archive path matches ${String(matches.length)} Unicode-equivalent bundle entries; selection is ambiguous: ${selected.path}`);
|
|
93
|
+
const entry = matches[0];
|
|
94
|
+
if (entry === undefined)
|
|
95
|
+
throw archivePathError("invalid_value", `No regular file exists at ${selected.path} in the active app bundle.`);
|
|
96
|
+
if (entry.kind !== "file")
|
|
97
|
+
throw archivePathError("invalid_value", `Archive path selects a ${entry.kind}, not a regular file: ${selected.path}`);
|
|
98
|
+
if ((entry.declaredSize ?? 0) > MAX_BYTES)
|
|
99
|
+
throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
|
|
100
|
+
const stream = await reader.open(entry, input.signal);
|
|
101
|
+
const chunks = [];
|
|
102
|
+
let size = 0;
|
|
103
|
+
for await (const chunk of stream) {
|
|
104
|
+
if (input.signal?.aborted) {
|
|
105
|
+
stream.destroy();
|
|
106
|
+
throw new ArtifactReaderFailure("cancelled", "Archive inspection cancelled");
|
|
107
|
+
}
|
|
108
|
+
const bytes = z.instanceof(Buffer).parse(chunk);
|
|
109
|
+
size += bytes.length;
|
|
110
|
+
if (size > MAX_BYTES) {
|
|
111
|
+
stream.destroy();
|
|
77
112
|
throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
|
|
78
|
-
const stream = await reader.open(entry, input.signal);
|
|
79
|
-
const chunks = [];
|
|
80
|
-
let size = 0;
|
|
81
|
-
for await (const chunk of stream) {
|
|
82
|
-
if (input.signal?.aborted) {
|
|
83
|
-
stream.destroy();
|
|
84
|
-
throw new ArtifactReaderFailure("cancelled", "Archive inspection cancelled");
|
|
85
|
-
}
|
|
86
|
-
const bytes = z.instanceof(Buffer).parse(chunk);
|
|
87
|
-
size += bytes.length;
|
|
88
|
-
if (size > MAX_BYTES) {
|
|
89
|
-
stream.destroy();
|
|
90
|
-
throw new ArtifactReaderFailure("limit", "Keyed archive exceeds 64 MiB");
|
|
91
|
-
}
|
|
92
|
-
chunks.push(bytes);
|
|
93
113
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
114
|
+
chunks.push(bytes);
|
|
115
|
+
}
|
|
116
|
+
const bytes = Buffer.concat(chunks, size);
|
|
117
|
+
try {
|
|
118
|
+
return keyedArchiveResultSchema.parse({
|
|
119
|
+
target_sha256: input.targetSha256,
|
|
120
|
+
archive_path: entry.path,
|
|
121
|
+
archive_sha256: createHash("sha256").update(bytes).digest("hex"),
|
|
122
|
+
...decodeKeyedArchiveBytes(bytes, selected),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (cause) {
|
|
126
|
+
if (cause instanceof AnalysisInputError)
|
|
127
|
+
throw cause;
|
|
128
|
+
// An intact file of another kind is not a damaged archive.
|
|
129
|
+
if (cause instanceof KeyedArchiveKindError)
|
|
130
|
+
throw new AnalysisUnsupportedTargetError("inspect_keyed_archive", join(input.bundlePath, entry.path), cause.message, {
|
|
131
|
+
cause,
|
|
132
|
+
remediationAction: keyedArchiveKindRemediation(cause.kind, input.platform ?? process.platform),
|
|
101
133
|
});
|
|
102
|
-
}
|
|
103
|
-
catch (cause) {
|
|
104
|
-
if (cause instanceof AnalysisInputError)
|
|
105
|
-
throw cause;
|
|
106
|
-
throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", `Cannot decode selected Foundation keyed archive: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
107
|
-
}
|
|
134
|
+
throw new ArtifactReaderFailure(cause instanceof RangeError ? "limit" : "format", `Cannot decode selected Foundation keyed archive: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
108
135
|
}
|
|
109
|
-
throw archivePathError("invalid_value", `No regular file exists at ${selected.path} in the active app bundle.`);
|
|
110
136
|
}
|
|
111
137
|
finally {
|
|
112
138
|
await reader.close();
|
|
@@ -29,6 +29,41 @@ const LC_VERSION_MIN_IPHONEOS = 0x25;
|
|
|
29
29
|
const LC_VERSION_MIN_TVOS = 0x2f;
|
|
30
30
|
const LC_VERSION_MIN_WATCHOS = 0x30;
|
|
31
31
|
const LC_BUILD_VERSION = 0x32;
|
|
32
|
+
// `mach-o/loader.h` `PLATFORM_*` numbers observed via Apple linker output.
|
|
33
|
+
const PLATFORM_MACOS = 1;
|
|
34
|
+
const PLATFORM_IOS = 2;
|
|
35
|
+
const PLATFORM_TVOS = 3;
|
|
36
|
+
const PLATFORM_WATCHOS = 4;
|
|
37
|
+
const PLATFORM_IOSSIMULATOR = 7;
|
|
38
|
+
const PLATFORM_TVOSSIMULATOR = 8;
|
|
39
|
+
const PLATFORM_WATCHOSSIMULATOR = 9;
|
|
40
|
+
const CPU_TYPE_I386 = 7;
|
|
41
|
+
const CPU_TYPE_X86_64 = 0x01000007;
|
|
42
|
+
/**
|
|
43
|
+
* Legacy `LC_VERSION_MIN_*` commands predate explicit simulator platform
|
|
44
|
+
* IDs. Per Apple's dyld rules the image CPU type distinguishes simulator
|
|
45
|
+
* from device: Intel images are simulator, ARM images are device
|
|
46
|
+
* (tvOS simulator applies to x86_64 only). `LC_BUILD_VERSION` platform
|
|
47
|
+
* numbers are preserved verbatim; unknown future numbers stay unknown
|
|
48
|
+
* downstream, never mapped to nearest.
|
|
49
|
+
*/
|
|
50
|
+
const legacyVersionMinPlatform = (command, cpuType) => {
|
|
51
|
+
const isIntel = cpuType === CPU_TYPE_I386 || cpuType === CPU_TYPE_X86_64;
|
|
52
|
+
switch (command) {
|
|
53
|
+
case LC_VERSION_MIN_MACOSX:
|
|
54
|
+
return PLATFORM_MACOS;
|
|
55
|
+
case LC_VERSION_MIN_IPHONEOS:
|
|
56
|
+
return isIntel ? PLATFORM_IOSSIMULATOR : PLATFORM_IOS;
|
|
57
|
+
case LC_VERSION_MIN_TVOS:
|
|
58
|
+
return cpuType === CPU_TYPE_X86_64
|
|
59
|
+
? PLATFORM_TVOSSIMULATOR
|
|
60
|
+
: PLATFORM_TVOS;
|
|
61
|
+
case LC_VERSION_MIN_WATCHOS:
|
|
62
|
+
return isIntel ? PLATFORM_WATCHOSSIMULATOR : PLATFORM_WATCHOS;
|
|
63
|
+
default:
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
32
67
|
/** `mach-o/loader.h` `dylib_use_command`: `nameoff == 28` and this marker. */
|
|
33
68
|
const DYLIB_USE_MARKER = 0x1a741800;
|
|
34
69
|
const DYLIB_USE_WEAK_LINK = 0x1;
|
|
@@ -258,12 +293,7 @@ const decodeCommand = (command, body, index, slice) => {
|
|
|
258
293
|
slice.platforms.push(platform);
|
|
259
294
|
return;
|
|
260
295
|
}
|
|
261
|
-
const legacyPlatform =
|
|
262
|
-
[LC_VERSION_MIN_MACOSX, 1],
|
|
263
|
-
[LC_VERSION_MIN_IPHONEOS, 2],
|
|
264
|
-
[LC_VERSION_MIN_TVOS, 3],
|
|
265
|
-
[LC_VERSION_MIN_WATCHOS, 4],
|
|
266
|
-
]).get(command);
|
|
296
|
+
const legacyPlatform = legacyVersionMinPlatform(command, slice.cpu_type);
|
|
267
297
|
if (legacyPlatform !== undefined) {
|
|
268
298
|
if (body.byteLength < 16)
|
|
269
299
|
throw new MachoFormatIssue("malformed", `load command ${index} is too short for a version-min command`);
|