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
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { semanticContainer, semanticPropertyPointer, } from "../../domain/javascript/javascriptSemanticSlots.js";
|
|
1
2
|
import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
2
3
|
import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
|
|
3
|
-
import { observedSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
|
|
4
|
+
import { observedSemanticEvidence, unknownSemanticEvidence, } from "./JavaScriptSemanticGraphEvidence.js";
|
|
4
5
|
/** Project bounded literal values and object slots for exact query seeds. */
|
|
5
6
|
export const projectSemanticValues = (context) => {
|
|
6
7
|
for (const binding of context.ir.bindings) {
|
|
@@ -12,12 +13,13 @@ export const projectSemanticValues = (context) => {
|
|
|
12
13
|
binding,
|
|
13
14
|
value: binding.value,
|
|
14
15
|
target: bindingNode,
|
|
15
|
-
|
|
16
|
+
path: [],
|
|
16
17
|
});
|
|
17
18
|
}
|
|
18
19
|
};
|
|
19
20
|
const projectValue = (input) => {
|
|
20
|
-
const { context, binding, value, target,
|
|
21
|
+
const { context, binding, value, target, path } = input;
|
|
22
|
+
const role = path.length === 0 ? "binding" : `property:${semanticPropertyPointer(path)}`;
|
|
21
23
|
if (target === null)
|
|
22
24
|
return;
|
|
23
25
|
if (value.status === "literal") {
|
|
@@ -39,32 +41,51 @@ const projectValue = (input) => {
|
|
|
39
41
|
resolution: "candidate",
|
|
40
42
|
});
|
|
41
43
|
}
|
|
42
|
-
else if (value.status === "object")
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
else if (value.status === "object" || value.status === "array") {
|
|
45
|
+
const container = semanticContainer(value);
|
|
46
|
+
for (const property of container.slots) {
|
|
47
|
+
const propertyPath = [...path, property.name];
|
|
48
|
+
const slot = semanticPropertySlot(context, binding.bindingId, propertyPath, property);
|
|
49
|
+
if (property.presence === "absent")
|
|
50
|
+
continue;
|
|
45
51
|
addSemanticGraphRelation(context.state, {
|
|
46
52
|
source: target,
|
|
47
53
|
target: slot,
|
|
48
54
|
relation: "writes-property",
|
|
49
|
-
resolution:
|
|
50
|
-
});
|
|
51
|
-
projectValue({
|
|
52
|
-
context,
|
|
53
|
-
binding,
|
|
54
|
-
value: property.value,
|
|
55
|
-
target: slot,
|
|
56
|
-
role: `property:${property.name}`,
|
|
55
|
+
resolution: property.presence === "present" ? "resolved" : "candidate",
|
|
57
56
|
});
|
|
57
|
+
if (property.presence === "present")
|
|
58
|
+
projectValue({
|
|
59
|
+
context,
|
|
60
|
+
binding,
|
|
61
|
+
value: property.value,
|
|
62
|
+
target: slot,
|
|
63
|
+
path: propertyPath,
|
|
64
|
+
});
|
|
58
65
|
}
|
|
59
|
-
|
|
66
|
+
if (container.coverage.status === "partial")
|
|
67
|
+
addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
|
|
68
|
+
node_id: target.node_id,
|
|
69
|
+
family: "object-flow",
|
|
70
|
+
relation_kinds: ["writes-property"],
|
|
71
|
+
reason: "ambiguous-target",
|
|
72
|
+
detail: `Initializer container has unknown ${value.status === "object" ? "properties" : "items"}${container.coverage.omitted === null ? " with an unknown omitted count" : `; ${container.coverage.omitted} omitted`}.`,
|
|
73
|
+
candidate_node_ids: [target.node_id],
|
|
74
|
+
evidence: unknownSemanticEvidence(context.file, binding.definitions[0]?.location ?? null),
|
|
75
|
+
}, context.state.evidenceContexts));
|
|
76
|
+
}
|
|
77
|
+
else if (value.status === "unknown" ||
|
|
78
|
+
value.status === "ambiguous" ||
|
|
79
|
+
value.status === "cycle") {
|
|
60
80
|
const location = binding.definitions[0]?.location ?? null;
|
|
61
81
|
const evidence = observedSemanticEvidence(context.file, location);
|
|
62
|
-
const isPropertyValue = role.startsWith("property:");
|
|
63
82
|
addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
|
|
64
83
|
node_id: target.node_id,
|
|
65
|
-
family:
|
|
66
|
-
relation_kinds: [
|
|
67
|
-
reason:
|
|
84
|
+
family: "data-flow",
|
|
85
|
+
relation_kinds: ["defines"],
|
|
86
|
+
reason: value.resourceLimit === undefined
|
|
87
|
+
? "unknown-value"
|
|
88
|
+
: "resource-limit",
|
|
68
89
|
detail: `${value.reason} Unknown value at ${role}.`,
|
|
69
90
|
candidate_node_ids: [target.node_id],
|
|
70
91
|
evidence: {
|
|
@@ -74,7 +95,7 @@ const projectValue = (input) => {
|
|
|
74
95
|
confidence: "unknown",
|
|
75
96
|
limitations: [value.reason],
|
|
76
97
|
},
|
|
77
|
-
}));
|
|
98
|
+
}, context.state.evidenceContexts));
|
|
78
99
|
}
|
|
79
100
|
};
|
|
80
101
|
const addLiteralNode = (context, binding, value, role) => retainSemanticGraphNode(context.state, context.file, {
|
|
@@ -85,15 +106,20 @@ const addLiteralNode = (context, binding, value, role) => retainSemanticGraphNod
|
|
|
85
106
|
functionNodeId: context.bindingNodes.get(binding.bindingId)?.function_node_id ?? null,
|
|
86
107
|
properties: { value },
|
|
87
108
|
});
|
|
88
|
-
/** Create one canonical
|
|
89
|
-
export const semanticPropertySlot = (context, objectBindingId,
|
|
109
|
+
/** Create one canonical slot for a root binding and exact static property path. */
|
|
110
|
+
export const semanticPropertySlot = (context, objectBindingId, path, fact) => retainSemanticGraphNode(context.state, context.file, {
|
|
90
111
|
kind: "property-slot",
|
|
91
|
-
roleKey: `property:${objectBindingId}
|
|
112
|
+
roleKey: `property:${JSON.stringify([objectBindingId, path])}`,
|
|
92
113
|
location: null,
|
|
93
|
-
label: name,
|
|
114
|
+
label: fact.name,
|
|
94
115
|
functionNodeId: context.bindingNodes.get(objectBindingId)?.function_node_id ?? null,
|
|
95
116
|
properties: {
|
|
96
|
-
name,
|
|
117
|
+
name: fact.name,
|
|
118
|
+
property_path: [...path],
|
|
119
|
+
property_pointer: semanticPropertyPointer(path),
|
|
97
120
|
object_binding_id: objectBindingId,
|
|
121
|
+
presence: fact.presence,
|
|
122
|
+
value_status: fact.value.status,
|
|
123
|
+
value_coverage: semanticContainer(fact.value)?.coverage ?? null,
|
|
98
124
|
},
|
|
99
125
|
});
|
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
|
+
import { applicationGraphEvidenceInputError, parseApplicationGraphEvidence, } from "./JavaScriptApplicationEvidenceGraph.js";
|
|
4
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
5
6
|
import { queryJavaScriptSemanticGraph } from "../../domain/javascript/javascriptSemanticQuery.js";
|
|
6
7
|
import { javaScriptSemanticTraceResultSchema, traceJavaScriptSemanticsInputSchema, } from "../../domain/javascript/javascriptSemanticTraceSchemas.js";
|
|
7
8
|
import { err, ok } from "../../domain/result.js";
|
|
8
|
-
import { parseApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
|
|
9
9
|
import { createJavaScriptSemanticTraceEvidence } from "./JavaScriptApplicationWorkflowEvidence.js";
|
|
10
10
|
const OPERATION = "trace_javascript_semantics";
|
|
11
11
|
/** Trace semantic relations from input already parsed by a trusted adapter. */
|
|
12
12
|
export const traceJavaScriptSemanticsEvidenceValidated = (input) => {
|
|
13
|
+
const sourceResult = parseApplicationGraphEvidence(input.application, [
|
|
14
|
+
"application",
|
|
15
|
+
]);
|
|
16
|
+
if (!sourceResult.ok)
|
|
17
|
+
return err(applicationGraphEvidenceInputError(OPERATION, sourceResult.error));
|
|
18
|
+
const source = sourceResult.value;
|
|
19
|
+
if (source.semanticGraph === null)
|
|
20
|
+
return err(new AnalysisInputError(OPERATION, undefined, [
|
|
21
|
+
{
|
|
22
|
+
path: ["application"],
|
|
23
|
+
reason: "invalid_value",
|
|
24
|
+
expected: "inline Evidence from analyze_javascript_application with a semantic graph",
|
|
25
|
+
},
|
|
26
|
+
]));
|
|
13
27
|
try {
|
|
14
|
-
const source = parseApplicationGraphEvidence(input.application);
|
|
15
|
-
if (source.semanticGraph === null)
|
|
16
|
-
return err(new AnalysisInputError(OPERATION, undefined, [
|
|
17
|
-
{
|
|
18
|
-
path: ["application"],
|
|
19
|
-
reason: "invalid_value",
|
|
20
|
-
expected: "inline Evidence from analyze_javascript_application with a semantic graph",
|
|
21
|
-
},
|
|
22
|
-
]));
|
|
23
28
|
const query = queryJavaScriptSemanticGraph(source.semanticGraph, input.query);
|
|
24
29
|
const result = javaScriptSemanticTraceResultSchema.parse({
|
|
25
30
|
...query,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { compareManagedMembers, managedMemberComparisonResultSchema,
|
|
4
|
+
import { compareManagedMembers, managedMemberComparisonResultSchema, } from "../../domain/managed/managedMemberComparison.js";
|
|
5
|
+
import { parseManagedMemberEvidence } from "../../domain/managed/managedMemberComparisonMatch.js";
|
|
5
6
|
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
6
7
|
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
|
|
7
8
|
import {} from "../../domain/analysisErrorBase.js";
|
|
@@ -3,10 +3,11 @@ import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
4
|
import { createEvidence } from "../../domain/evidence.js";
|
|
5
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
6
|
-
import { managedNativeVerificationInputSchema,
|
|
6
|
+
import { managedNativeVerificationInputSchema, } from "../../domain/managed/managedNativeVerificationSchemas.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
8
8
|
import { MANAGED_WORKFLOW_PROVIDER } from "../InvestigationProviders.js";
|
|
9
9
|
import { requestInputError, workflowInputError, } from "../workflowInputError.js";
|
|
10
|
+
import { verifyManagedNativeBoundaries } from "../../domain/managed/managedNativeVerification.js";
|
|
10
11
|
const OPERATION = "verify_managed_native_boundaries";
|
|
11
12
|
/** Verify managed/native boundary declarations against native Evidence. */
|
|
12
13
|
export const verifyManagedNativeBoundariesEvidence = (rawInput) => {
|
|
@@ -3,16 +3,14 @@ import { parseRelatedAddresses, referenceKindSchema, } from "../../domain/hopper
|
|
|
3
3
|
import { err, ok } from "../../domain/result.js";
|
|
4
4
|
import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
|
|
5
5
|
const referencesSchema = z.object({
|
|
6
|
-
reference_kinds_available: z.boolean()
|
|
6
|
+
reference_kinds_available: z.boolean(),
|
|
7
7
|
references: z.array(z.object({
|
|
8
8
|
source_address: z.string(),
|
|
9
9
|
target_address: z.string(),
|
|
10
10
|
target_procedure: z.object({ address: z.string() }).nullable(),
|
|
11
11
|
kind: referenceKindSchema,
|
|
12
12
|
})),
|
|
13
|
-
unresolved_calls: z
|
|
14
|
-
.array(z.object({ address: z.string(), reason: z.string() }))
|
|
15
|
-
.default([]),
|
|
13
|
+
unresolved_calls: z.array(z.object({ address: z.string(), reason: z.string() })),
|
|
16
14
|
});
|
|
17
15
|
/** Prefer typed static call references, preserving computed targets and targetless sites. */
|
|
18
16
|
export const readNativeCallRoutes = async (analysis, procedure, signal) => {
|
|
@@ -7,11 +7,13 @@ import { createEvidence, parseEvidence } from "../../domain/evidence.js";
|
|
|
7
7
|
import { describeValidationFailure } from "../../domain/evidenceBundle.js";
|
|
8
8
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
9
9
|
import { analysisInputErrorFromIssues, projectInputIssues, } from "../../domain/inputIssueProjection.js";
|
|
10
|
-
import { processTraceSpecificationSchema } from "../../domain/process/
|
|
10
|
+
import { processTraceSpecificationSchema } from "../../domain/process/processTraceSpecification.js";
|
|
11
11
|
import { processScenarioSchema } from "../../domain/process/processScenario.js";
|
|
12
|
-
import { compareProcessCaptures
|
|
12
|
+
import { compareProcessCaptures } from "../../domain/process/processComparison.js";
|
|
13
|
+
import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
|
|
13
14
|
import { captureProcessScenario } from "../../process/capture/ProcessHarness.js";
|
|
14
|
-
import { PROCESS_PROVIDER
|
|
15
|
+
import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
16
|
+
import { createProcessCaptureEvidence } from "./ProcessEvidence.js";
|
|
15
17
|
/** Identify the process workflow's typed diagnostic result for CLI exit status. */
|
|
16
18
|
export const isProcessCliFailure = (value) => typeof value === "object" &&
|
|
17
19
|
value !== null &&
|
|
@@ -22,13 +24,13 @@ export const isProcessCliFailure = (value) => typeof value === "object" &&
|
|
|
22
24
|
"message" in value &&
|
|
23
25
|
typeof value.message === "string";
|
|
24
26
|
/** Capture one JSON scenario through the shared process harness and Evidence contract. */
|
|
25
|
-
export const captureProcessScenarioFile = async (path, environment = process.env) => {
|
|
27
|
+
export const captureProcessScenarioFile = async (path, environment = process.env, signal) => {
|
|
26
28
|
try {
|
|
27
29
|
const input = await readJson(path);
|
|
28
30
|
const parsed = processScenarioSchema.safeParse(input);
|
|
29
31
|
if (!parsed.success)
|
|
30
32
|
throw analysisInputErrorFromIssues("capture_process_scenario", parsed.error.issues, input, { cause: parsed.error });
|
|
31
|
-
const captured = await captureProcessScenario(parsed.data,
|
|
33
|
+
const captured = await captureProcessScenario(parsed.data, signal, process.platform, environment);
|
|
32
34
|
if (!captured.ok)
|
|
33
35
|
return cliAnalysisError(captured.error);
|
|
34
36
|
return createProcessCaptureEvidence(parsed.data, captured.value);
|
|
@@ -118,8 +120,7 @@ const readJson = async (path) => {
|
|
|
118
120
|
bytes = await readFile(path);
|
|
119
121
|
}
|
|
120
122
|
catch (cause) {
|
|
121
|
-
|
|
122
|
-
throw new ProcessCliFailure("invalid_input", "Process input file could not be read. Check that the path exists and is readable.");
|
|
123
|
+
throw new ProcessCliFailure("invalid_input", `Process input file could not be read: ${path} (${describeValidationFailure(cause)}). Check the reported filesystem constraint and retry.`);
|
|
123
124
|
}
|
|
124
125
|
try {
|
|
125
126
|
const text = new TextDecoder("utf-8", {
|
|
@@ -130,8 +131,7 @@ const readJson = async (path) => {
|
|
|
130
131
|
return parsed;
|
|
131
132
|
}
|
|
132
133
|
catch (cause) {
|
|
133
|
-
|
|
134
|
-
throw new ProcessCliFailure("invalid_input", "Process input file is not valid JSON. Repair the file, then try again.");
|
|
134
|
+
throw new ProcessCliFailure("invalid_input", `Process input file is not valid UTF-8 JSON: ${path} (${describeValidationFailure(cause)}). Repair the file, then try again.`);
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
class ProcessCliFailure extends Error {
|
|
@@ -147,7 +147,7 @@ const cliAnalysisError = (error) => ({
|
|
|
147
147
|
error: "Process command failed",
|
|
148
148
|
...projectAnalysisError(error),
|
|
149
149
|
});
|
|
150
|
-
/**
|
|
150
|
+
/** Preserve typed failures and local diagnostics at the process CLI boundary. */
|
|
151
151
|
export const projectProcessCliError = (cause) => {
|
|
152
152
|
if (cause instanceof ProcessCliFailure)
|
|
153
153
|
return {
|
|
@@ -160,6 +160,6 @@ export const projectProcessCliError = (cause) => {
|
|
|
160
160
|
return {
|
|
161
161
|
error: "Process command failed",
|
|
162
162
|
category: "execution_failure",
|
|
163
|
-
message:
|
|
163
|
+
message: `Process command could not complete: ${describeValidationFailure(cause)}`,
|
|
164
164
|
};
|
|
165
165
|
};
|
|
@@ -2,7 +2,6 @@ import { posix, win32 } from "node:path";
|
|
|
2
2
|
import { createEvidence } from "../../domain/evidence.js";
|
|
3
3
|
import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
4
4
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
5
|
-
export { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
6
5
|
/** Project one process scenario into secret-free Evidence parameters. */
|
|
7
6
|
const processEvidenceParameters = (scenario, platform) => ({
|
|
8
7
|
executable_name: (platform === "win32" ? win32 : posix).basename(scenario.executable),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
2
3
|
import { inspectBundleKeyedArchive } from "./apple/KeyedArchiveReader.js";
|
|
3
4
|
import { traceDylibResolution } from "./apple/DylibResolutionReader.js";
|
|
@@ -7,42 +8,50 @@ import { extractArtifact } from "./extraction/ArtifactExtraction.js";
|
|
|
7
8
|
import { analyzeInterfaceBuilderBundle } from "./apple/InterfaceBuilderAnalysis.js";
|
|
8
9
|
import { analyzeAppleAssetCatalogs } from "./apple/AppleAssetCatalogAnalysis.js";
|
|
9
10
|
import { ARTIFACT_ANALYSIS_OPERATIONS, artifactInventoryInputSchema, artifactExtractionExecutionSchema, } from "../contracts/artifactToolContracts.js";
|
|
10
|
-
import { AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
|
|
11
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
|
|
11
12
|
import { ArtifactOperationError } from "../domain/artifactOperationError.js";
|
|
12
13
|
import {} from "../domain/analysisErrorBase.js";
|
|
13
14
|
import { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js";
|
|
14
15
|
import { err, ok } from "../domain/result.js";
|
|
15
16
|
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
16
|
-
import {
|
|
17
|
+
import { artifactCapabilities } from "./ArtifactProviderMetadata.js";
|
|
18
|
+
import { ARTIFACT_GRAPH_PROVIDER } from "../application/InvestigationProviders.js";
|
|
17
19
|
import { createEvidence } from "../domain/evidence.js";
|
|
18
20
|
import { createArtifactInspection } from "../domain/artifactInspection.js";
|
|
19
|
-
import { resolveArtifactIntegrityPolicy } from "./inventory/policy.js";
|
|
20
21
|
/** Read-only inventory and exclusively owned extraction provider. */
|
|
21
22
|
export class ArtifactProvider {
|
|
22
23
|
#capabilities;
|
|
23
|
-
|
|
24
|
+
#platform;
|
|
25
|
+
environment;
|
|
26
|
+
constructor(environment, platform = process.platform) {
|
|
27
|
+
this.environment = snapshotEnvironment(environment, platform);
|
|
24
28
|
this.#capabilities = artifactCapabilities(platform);
|
|
29
|
+
this.#platform = platform;
|
|
25
30
|
}
|
|
26
31
|
identity() {
|
|
27
|
-
return
|
|
32
|
+
return ARTIFACT_GRAPH_PROVIDER;
|
|
28
33
|
}
|
|
29
34
|
capabilities() {
|
|
30
35
|
return this.#capabilities;
|
|
31
36
|
}
|
|
32
37
|
createClient(target) {
|
|
33
|
-
return new ArtifactClient(target);
|
|
38
|
+
return new ArtifactClient(target, this.environment, this.#platform);
|
|
34
39
|
}
|
|
35
40
|
}
|
|
36
41
|
class ArtifactClient {
|
|
37
42
|
target;
|
|
38
|
-
|
|
43
|
+
environment;
|
|
44
|
+
platform;
|
|
45
|
+
constructor(target, environment, platform) {
|
|
39
46
|
this.target = target;
|
|
47
|
+
this.environment = environment;
|
|
48
|
+
this.platform = platform;
|
|
40
49
|
}
|
|
41
50
|
async execute(operation, parameters, options) {
|
|
42
51
|
if (operation === "health")
|
|
43
|
-
return ok(createAnalysisExecution(null,
|
|
52
|
+
return ok(createAnalysisExecution(null, ARTIFACT_GRAPH_PROVIDER));
|
|
44
53
|
if (!isArtifactOperation(operation))
|
|
45
|
-
return err(new AnalysisCapabilityUnavailableError(
|
|
54
|
+
return err(new AnalysisCapabilityUnavailableError(ARTIFACT_GRAPH_PROVIDER.id, operation, "Operation is not implemented by artifact graph provider."));
|
|
46
55
|
try {
|
|
47
56
|
if (operation === "inspect_artifact") {
|
|
48
57
|
const inspected = await this.inspectArtifact(parameters, options);
|
|
@@ -52,7 +61,7 @@ class ArtifactClient {
|
|
|
52
61
|
if (this.target.kind !== "executable" ||
|
|
53
62
|
this.target.sourcePath === undefined ||
|
|
54
63
|
!this.target.sourcePath.toLowerCase().endsWith(".app"))
|
|
55
|
-
throw
|
|
64
|
+
throw this.unsupportedTarget(operation, "decode_interface_builder requires an active .app bundle target");
|
|
56
65
|
const limits = interfaceBuilderLimitsSchema.parse(parameters);
|
|
57
66
|
const result = await analyzeInterfaceBuilderBundle({
|
|
58
67
|
bundlePath: this.target.sourcePath,
|
|
@@ -60,7 +69,7 @@ class ArtifactClient {
|
|
|
60
69
|
limits,
|
|
61
70
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
62
71
|
});
|
|
63
|
-
return ok(createAnalysisExecution(result,
|
|
72
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
64
73
|
limitations: result.limitations,
|
|
65
74
|
locations: result.documents.map(({ relative_path: path }) => ({
|
|
66
75
|
kind: "artifact-path",
|
|
@@ -87,18 +96,19 @@ class ArtifactClient {
|
|
|
87
96
|
: this.target.sourcePath;
|
|
88
97
|
if (bundlePath === undefined ||
|
|
89
98
|
(!standalone && !bundlePath.toLowerCase().endsWith(".app")))
|
|
90
|
-
throw
|
|
99
|
+
throw this.unsupportedTarget(operation, "inspect_keyed_archive requires an active plist or .app bundle");
|
|
91
100
|
const result = await inspectBundleKeyedArchive({
|
|
92
101
|
bundlePath,
|
|
93
102
|
targetSha256: this.target.sha256,
|
|
94
103
|
parameters: standalone
|
|
95
104
|
? { ...parameters, path: basename(this.target.path) }
|
|
96
105
|
: parameters,
|
|
106
|
+
platform: this.platform,
|
|
97
107
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
98
108
|
});
|
|
99
109
|
if (standalone && result.archive_sha256 !== this.target.sha256)
|
|
100
110
|
throw new ArtifactReaderFailure("integrity", `Active archive digest changed: expected ${this.target.sha256}, observed ${result.archive_sha256}`);
|
|
101
|
-
return ok(createAnalysisExecution(result,
|
|
111
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
102
112
|
limitations: result.limitations,
|
|
103
113
|
locations: [{ kind: "artifact-path", path: result.archive_path }],
|
|
104
114
|
}));
|
|
@@ -114,8 +124,9 @@ class ArtifactClient {
|
|
|
114
124
|
inputPath: this.target.sourcePath ?? this.target.path,
|
|
115
125
|
inputFormat: this.target.format,
|
|
116
126
|
outputRoot: parsed.output_root,
|
|
127
|
+
environment: this.environment,
|
|
117
128
|
}, options?.signal);
|
|
118
|
-
return ok(createAnalysisExecution(result,
|
|
129
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
119
130
|
rawResult: null,
|
|
120
131
|
limitations: result.limitations,
|
|
121
132
|
subject: subjectFor(this.target.sourcePath ?? this.target.path, result.manifest),
|
|
@@ -127,7 +138,7 @@ class ArtifactClient {
|
|
|
127
138
|
}
|
|
128
139
|
const parsed = artifactInventoryInputSchema.parse(parameters);
|
|
129
140
|
const result = await this.inventory(parsed, options);
|
|
130
|
-
return ok(createAnalysisExecution(result,
|
|
141
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
131
142
|
rawResult: null,
|
|
132
143
|
limitations: result.limitations,
|
|
133
144
|
subject: subjectFor(this.target.sourcePath ?? this.target.path, result.manifest),
|
|
@@ -138,25 +149,30 @@ class ArtifactClient {
|
|
|
138
149
|
}));
|
|
139
150
|
}
|
|
140
151
|
catch (cause) {
|
|
141
|
-
return err(
|
|
152
|
+
return err(translateArtifactFailure(operation, cause));
|
|
142
153
|
}
|
|
143
154
|
}
|
|
144
155
|
close() {
|
|
145
|
-
return Promise.resolve();
|
|
156
|
+
return Promise.resolve(ok(null));
|
|
157
|
+
}
|
|
158
|
+
/** The active target's kind is outside this operation's supported targets. */
|
|
159
|
+
unsupportedTarget(operation, reason) {
|
|
160
|
+
return new AnalysisUnsupportedTargetError(operation, this.target.sourcePath ?? this.target.path, reason);
|
|
146
161
|
}
|
|
147
162
|
async inspectAssetCatalog(parameters, options) {
|
|
148
163
|
const bundlePath = this.target.sourcePath;
|
|
149
164
|
if (this.target.kind !== "executable" ||
|
|
150
165
|
bundlePath === undefined ||
|
|
151
166
|
!bundlePath.toLowerCase().endsWith(".app"))
|
|
152
|
-
throw
|
|
167
|
+
throw this.unsupportedTarget("inspect_asset_catalog", "inspect_asset_catalog requires an active .app bundle target");
|
|
153
168
|
const result = await analyzeAppleAssetCatalogs({
|
|
169
|
+
environment: this.environment,
|
|
154
170
|
bundlePath,
|
|
155
171
|
targetSha256: this.target.sha256,
|
|
156
172
|
page: parameters,
|
|
157
173
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
158
174
|
});
|
|
159
|
-
return ok(createAnalysisExecution(result,
|
|
175
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
160
176
|
limitations: result.limitations,
|
|
161
177
|
locations: result.catalogs.map(({ path }) => ({
|
|
162
178
|
kind: "artifact-path",
|
|
@@ -166,7 +182,7 @@ class ArtifactClient {
|
|
|
166
182
|
}
|
|
167
183
|
async traceDylibResolution(parameters, options) {
|
|
168
184
|
if (this.target.kind !== "executable" || this.target.format !== "mach-o")
|
|
169
|
-
throw
|
|
185
|
+
throw this.unsupportedTarget("trace_dylib_resolution", "trace_dylib_resolution requires an active Mach-O or .app bundle target");
|
|
170
186
|
// Only a target opened from an app bundle directory carries its Info.plist;
|
|
171
187
|
// a regular file whose name ends in .app is a standalone image.
|
|
172
188
|
const bundle = this.target.bundleInfoPlist === undefined
|
|
@@ -180,7 +196,7 @@ class ArtifactClient {
|
|
|
180
196
|
parameters,
|
|
181
197
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
182
198
|
});
|
|
183
|
-
return ok(createAnalysisExecution(result,
|
|
199
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
184
200
|
limitations: result.limitations,
|
|
185
201
|
locations: result.images.map(({ path }) => ({
|
|
186
202
|
kind: "artifact-path",
|
|
@@ -205,7 +221,7 @@ class ArtifactClient {
|
|
|
205
221
|
kind: "artifact-path",
|
|
206
222
|
path,
|
|
207
223
|
}));
|
|
208
|
-
const inventoryEvidence = createEvidence(subject,
|
|
224
|
+
const inventoryEvidence = createEvidence(subject, ARTIFACT_GRAPH_PROVIDER, {
|
|
209
225
|
operation: "inventory_artifact",
|
|
210
226
|
parameters: inventoryParameters,
|
|
211
227
|
result: inventory,
|
|
@@ -220,7 +236,7 @@ class ArtifactClient {
|
|
|
220
236
|
total: 1,
|
|
221
237
|
message: "inventory substep completed",
|
|
222
238
|
});
|
|
223
|
-
return ok(createAnalysisExecution(result,
|
|
239
|
+
return ok(createAnalysisExecution(result, ARTIFACT_GRAPH_PROVIDER, {
|
|
224
240
|
rawResult: null,
|
|
225
241
|
limitations: result.limitations,
|
|
226
242
|
subject,
|
|
@@ -229,19 +245,26 @@ class ArtifactClient {
|
|
|
229
245
|
}
|
|
230
246
|
inventory(parsed, options) {
|
|
231
247
|
return inventoryArtifact(this.target.sourcePath ?? this.target.path, {
|
|
248
|
+
environment: this.environment,
|
|
232
249
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
233
|
-
integrity:
|
|
234
|
-
mode: parsed.integrity_policy,
|
|
235
|
-
}),
|
|
250
|
+
integrity: { mode: parsed.integrity_policy },
|
|
236
251
|
});
|
|
237
252
|
}
|
|
238
253
|
}
|
|
239
254
|
const isArtifactOperation = (operation) => ARTIFACT_ANALYSIS_OPERATIONS.includes(operation);
|
|
240
|
-
|
|
255
|
+
/** Translate one artifact boundary failure while retaining cleanup evidence. */
|
|
256
|
+
export const translateArtifactFailure = (operation, cause) => {
|
|
241
257
|
if (cause instanceof ArtifactReaderFailure)
|
|
242
|
-
return new ArtifactOperationError(operation, cause.reason, cause.details, cause.message
|
|
243
|
-
|
|
244
|
-
|
|
258
|
+
return new ArtifactOperationError(operation, cause.reason, cause.details, cause.message, {
|
|
259
|
+
...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
|
|
260
|
+
...(cause.partialObservation === undefined
|
|
261
|
+
? {}
|
|
262
|
+
: { partialObservation: cause.partialObservation }),
|
|
263
|
+
});
|
|
264
|
+
// Caller-selection and unsupported-target failures are already typed; keep
|
|
265
|
+
// their correction details instead of reducing them to an I/O failure.
|
|
266
|
+
if (cause instanceof AnalysisInputError ||
|
|
267
|
+
cause instanceof AnalysisUnsupportedTargetError)
|
|
245
268
|
return cause;
|
|
246
269
|
return new ArtifactOperationError(operation, "io");
|
|
247
270
|
};
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { ARTIFACT_GRAPH_PROVIDER } from "../application/InvestigationProviders.js";
|
|
2
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
3
|
/** Declare artifact coverage without constructing readers or acquiring resources. */
|
|
7
4
|
export const artifactCapabilities = (platform = process.platform) => Object.freeze(ARTIFACT_ANALYSIS_OPERATIONS.map((operation) => {
|
|
8
5
|
const common = {
|
|
9
|
-
provider:
|
|
6
|
+
provider: ARTIFACT_GRAPH_PROVIDER,
|
|
10
7
|
operation,
|
|
11
8
|
effects: Object.freeze({
|
|
12
9
|
mutatesArtifact: false,
|
|
@@ -2,10 +2,41 @@
|
|
|
2
2
|
export class ArtifactReaderFailure extends Error {
|
|
3
3
|
reason;
|
|
4
4
|
details;
|
|
5
|
+
cleanup;
|
|
6
|
+
partialObservation;
|
|
5
7
|
constructor(reason, message, options, details) {
|
|
6
8
|
super(message, options);
|
|
7
9
|
this.reason = reason;
|
|
8
10
|
this.details = details;
|
|
9
11
|
this.name = "ArtifactReaderFailure";
|
|
12
|
+
this.cleanup = options?.cleanup;
|
|
13
|
+
this.partialObservation = options?.partialObservation;
|
|
14
|
+
}
|
|
15
|
+
/** Preserve the primary failure while attaching cleanup and any complete observation. */
|
|
16
|
+
static withCleanup(cause, cleanup, partialObservation) {
|
|
17
|
+
const primary = cause instanceof ArtifactReaderFailure
|
|
18
|
+
? cause
|
|
19
|
+
: new ArtifactReaderFailure("io", errorMessage(cause), { cause });
|
|
20
|
+
const mergedObservation = partialObservation ?? primary.partialObservation;
|
|
21
|
+
return new ArtifactReaderFailure(primary.reason, primary.message, {
|
|
22
|
+
cause: primary,
|
|
23
|
+
cleanup: combineCleanup(primary.cleanup, cleanup),
|
|
24
|
+
...(mergedObservation === undefined
|
|
25
|
+
? {}
|
|
26
|
+
: { partialObservation: mergedObservation }),
|
|
27
|
+
}, primary.details);
|
|
28
|
+
}
|
|
29
|
+
/** Give otherwise opaque cleanup failures a concrete owned resource. */
|
|
30
|
+
static cleanupObservation(cause, resource) {
|
|
31
|
+
if (cause instanceof ArtifactReaderFailure && cause.cleanup !== undefined)
|
|
32
|
+
return cause.cleanup;
|
|
33
|
+
return { reason: errorMessage(cause), resources: [resource] };
|
|
10
34
|
}
|
|
11
35
|
}
|
|
36
|
+
const combineCleanup = (primary, cleanup) => primary === undefined || primary === cleanup
|
|
37
|
+
? cleanup
|
|
38
|
+
: {
|
|
39
|
+
reason: `${primary.reason}; ${cleanup.reason}`,
|
|
40
|
+
resources: [...new Set([...primary.resources, ...cleanup.resources])],
|
|
41
|
+
};
|
|
42
|
+
const errorMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
|