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
|
@@ -13,7 +13,8 @@ export const analysisErrorRemediationAction = (error) => {
|
|
|
13
13
|
if (error instanceof AnalysisSnapshotMismatchError)
|
|
14
14
|
return "Run analysis without this snapshot, then save a fresh snapshot using the intended artifact, provider, and analysis profile.";
|
|
15
15
|
if (error instanceof AnalysisUnsupportedTargetError)
|
|
16
|
-
return
|
|
16
|
+
return (error.remediationAction ??
|
|
17
|
+
"Select a target supported by this operation or choose an operation supporting the reported target format.");
|
|
17
18
|
if (error instanceof AnalysisResourceConstraintError)
|
|
18
19
|
return (error.remediationAction ??
|
|
19
20
|
(error.resource === "transport"
|
|
@@ -44,10 +45,13 @@ export const analysisErrorRemediationAction = (error) => {
|
|
|
44
45
|
if (error instanceof BinaryTargetError &&
|
|
45
46
|
error.constraint === "directory_requires_file")
|
|
46
47
|
return "For a JavaScript/Electron application directory, call analyze_javascript_application with input_path or run `rea analyze <directory>`. For binary analysis, select its executable file.";
|
|
47
|
-
if (error instanceof AnalysisAccessDeniedError
|
|
48
|
+
if (error instanceof AnalysisAccessDeniedError ||
|
|
49
|
+
(error instanceof BinaryTargetError && error.systemCode !== undefined))
|
|
48
50
|
return "Check the current process's read access to the selected path. Retry with a readable local file.";
|
|
49
51
|
if (error instanceof AnalysisArtifactChangedError)
|
|
50
52
|
return "Wait until the selected file is stable. For an active binary session, reopen the target with open_binary before retrying so REA acquires its current identity; for a CLI command or target-free tool, rerun the operation.";
|
|
53
|
+
if (error instanceof ConfigurationError && error.settings.length > 0)
|
|
54
|
+
return `Correct ${[...new Set(error.settings.map(({ setting }) => setting))].join(", ")} in the environment that starts REA (your shell or the MCP client's registration), then rerun.`;
|
|
51
55
|
if (error instanceof AnalysisInputError)
|
|
52
56
|
return "Correct the listed arguments and retry.";
|
|
53
57
|
if (error instanceof UnknownRegistryError && error.reason === "not-found")
|
|
@@ -72,6 +76,11 @@ export const analysisErrorCategory = (error) => {
|
|
|
72
76
|
return "unavailable";
|
|
73
77
|
if (error instanceof ArtifactOperationError)
|
|
74
78
|
return artifactErrorCategory(error.reason);
|
|
79
|
+
if (error instanceof EvidenceFileError &&
|
|
80
|
+
(error.reason === "missing" ||
|
|
81
|
+
error.reason === "not-file" ||
|
|
82
|
+
error.reason === "exists"))
|
|
83
|
+
return "invalid_input";
|
|
75
84
|
return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure";
|
|
76
85
|
};
|
|
77
86
|
const browserErrorCategory = (reason) => {
|
|
@@ -138,7 +147,7 @@ export const analysisErrorUserMessage = (error) => {
|
|
|
138
147
|
if (standardMessage !== undefined)
|
|
139
148
|
return standardMessage;
|
|
140
149
|
if (error instanceof ArtifactOperationError)
|
|
141
|
-
return artifactMessage(error.reason);
|
|
150
|
+
return artifactMessage(error.operation, error.reason);
|
|
142
151
|
if (error instanceof EvidenceReferenceError)
|
|
143
152
|
return error.reason === "missing"
|
|
144
153
|
? `Evidence ${error.evidenceId} is not retained in this session. Supply complete inline Evidence, re-run its producer, or import its bundle before using this reference.`
|
|
@@ -152,7 +161,13 @@ export const analysisErrorUserMessage = (error) => {
|
|
|
152
161
|
if (error instanceof UnknownRegistryError)
|
|
153
162
|
return "Evidence state changed before the update completed. Refresh the current state and try again.";
|
|
154
163
|
if (error instanceof ConfigurationError)
|
|
155
|
-
return
|
|
164
|
+
return error.settings.length === 0
|
|
165
|
+
? "REA configuration is invalid. Run `rea doctor` and fix the reported setting."
|
|
166
|
+
: `REA configuration is invalid: ${error.settings
|
|
167
|
+
.map(({ setting, constraint }) => constraint.includes(setting)
|
|
168
|
+
? constraint.replace(/\.$/u, "")
|
|
169
|
+
: `${setting}: ${constraint}`)
|
|
170
|
+
.join("; ")}.`;
|
|
156
171
|
if (error instanceof NoBinaryOpenError)
|
|
157
172
|
return error.message;
|
|
158
173
|
if (error instanceof BinaryTargetError)
|
|
@@ -252,7 +267,7 @@ const START_FAILURE_TAGS = new Set([
|
|
|
252
267
|
"HopperProcessError",
|
|
253
268
|
"HopperStartError",
|
|
254
269
|
]);
|
|
255
|
-
const artifactMessage = (reason) => {
|
|
270
|
+
const artifactMessage = (operation, reason) => {
|
|
256
271
|
if (reason === "cancelled")
|
|
257
272
|
return "Artifact operation was cancelled. Start it again when ready.";
|
|
258
273
|
if (reason === "limit")
|
|
@@ -261,6 +276,8 @@ const artifactMessage = (reason) => {
|
|
|
261
276
|
return "Artifact contains an unsafe or conflicting internal path. Inspect the reported path and correct the artifact before retrying.";
|
|
262
277
|
if (reason === "unavailable")
|
|
263
278
|
return "Artifact processing is unavailable for the current target or host. Check artifact support and required tools.";
|
|
279
|
+
if (reason === "integrity" && operation === "analyze_javascript_application")
|
|
280
|
+
return "Artifact bytes contradict declared integrity. If expected, rerun analyze_javascript_application with integrity_policy=record-and-continue (CLI: --integrity-policy record-and-continue) to retain observed bytes as untrusted; otherwise get a fresh copy.";
|
|
264
281
|
if (reason === "format" || reason === "integrity")
|
|
265
282
|
return "Artifact is invalid or has changed. Get a fresh copy and try again.";
|
|
266
283
|
return "Artifact could not be read or written. Check file access and try again.";
|
|
@@ -2,7 +2,7 @@ import { jsonValueSchema } from "./jsonValue.js";
|
|
|
2
2
|
import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
|
|
3
3
|
import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisUnsupportedTargetError, AnalysisInputError, AnalysisOutputError, AnalysisTimeoutError, AnalysisResourceConstraintError, } from "./analysisErrorCore.js";
|
|
4
4
|
import { ArtifactOperationError } from "./artifactOperationError.js";
|
|
5
|
-
import { BinaryTargetError } from "./configurationErrors.js";
|
|
5
|
+
import { BinaryTargetError, ConfigurationError, } from "./configurationErrors.js";
|
|
6
6
|
import { BrowserObservationError } from "./browserObservationError.js";
|
|
7
7
|
import { EvidenceFileError, EvidenceIntegrityError, EvidenceReferenceError, } from "./evidenceErrors.js";
|
|
8
8
|
import { HopperCancelledError, HopperProcessError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "./hopperErrors.js";
|
|
@@ -63,6 +63,10 @@ const underlyingErrorCode = (error) => {
|
|
|
63
63
|
: browserErrorCode(error.reason);
|
|
64
64
|
if (error instanceof ArtifactOperationError)
|
|
65
65
|
return artifactOperationCode(error);
|
|
66
|
+
if (error instanceof BinaryTargetError)
|
|
67
|
+
return error.systemCode === undefined
|
|
68
|
+
? "target_unavailable"
|
|
69
|
+
: "access_denied";
|
|
66
70
|
if (error instanceof EvidenceFileError)
|
|
67
71
|
return evidenceFileCode(error.reason);
|
|
68
72
|
if (error instanceof UnknownRegistryError)
|
|
@@ -95,9 +99,14 @@ const artifactOperationCode = (error) => {
|
|
|
95
99
|
return "cancelled";
|
|
96
100
|
return "artifact_operation_failed";
|
|
97
101
|
};
|
|
98
|
-
const evidenceFileCode = (reason) =>
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
const evidenceFileCode = (reason) => {
|
|
103
|
+
if (reason === "invalid-json")
|
|
104
|
+
return "evidence_integrity_mismatch";
|
|
105
|
+
// A missing, non-file or already-existing path is the caller's selection.
|
|
106
|
+
if (reason === "io")
|
|
107
|
+
return "execution_failure";
|
|
108
|
+
return "invalid_request";
|
|
109
|
+
};
|
|
101
110
|
const unknownRegistryCode = (reason) => {
|
|
102
111
|
if (reason === "revision-conflict" || reason === "already-exists")
|
|
103
112
|
return "revision_conflict";
|
|
@@ -132,7 +141,6 @@ const STATIC_ERROR_CODES = {
|
|
|
132
141
|
HopperStartError: "provider_unavailable",
|
|
133
142
|
ConfigurationError: "configuration_invalid",
|
|
134
143
|
NoBinaryOpenError: "target_unavailable",
|
|
135
|
-
BinaryTargetError: "target_unavailable",
|
|
136
144
|
EvidenceIntegrityError: "evidence_integrity_mismatch",
|
|
137
145
|
ProviderAdapterError: "execution_failure",
|
|
138
146
|
HopperRemoteError: "execution_failure",
|
|
@@ -140,6 +148,7 @@ const STATIC_ERROR_CODES = {
|
|
|
140
148
|
const staticErrorCode = (tag) => {
|
|
141
149
|
switch (tag) {
|
|
142
150
|
case "ArtifactOperationError":
|
|
151
|
+
case "BinaryTargetError":
|
|
143
152
|
case "BrowserObservationError":
|
|
144
153
|
case "EvidenceFileError":
|
|
145
154
|
case "ProcessCaptureError":
|
|
@@ -404,6 +413,13 @@ const lifecycleErrorDetails = (error) => {
|
|
|
404
413
|
};
|
|
405
414
|
return Object.keys(details).length === 0 ? undefined : details;
|
|
406
415
|
}
|
|
416
|
+
if (error instanceof ConfigurationError && error.settings.length > 0)
|
|
417
|
+
return {
|
|
418
|
+
settings: error.settings.map(({ setting, constraint }) => ({
|
|
419
|
+
setting,
|
|
420
|
+
constraint,
|
|
421
|
+
})),
|
|
422
|
+
};
|
|
407
423
|
if (error instanceof BinaryTargetError)
|
|
408
424
|
return {
|
|
409
425
|
path: error.path,
|
|
@@ -411,6 +427,9 @@ const lifecycleErrorDetails = (error) => {
|
|
|
411
427
|
...(error.constraint === undefined
|
|
412
428
|
? {}
|
|
413
429
|
: { constraint: error.constraint }),
|
|
430
|
+
...(error.systemCode === undefined
|
|
431
|
+
? {}
|
|
432
|
+
: { system_code: error.systemCode, boundary: "filesystem-read" }),
|
|
414
433
|
};
|
|
415
434
|
return undefined;
|
|
416
435
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
4
5
|
import { analysisProfileSchema, analysisProfilesEqual, committedProviderSchema, } from "./analysisProfile.js";
|
|
5
6
|
import { evidenceBundleForTarget, evidenceBundleSchema, parseEvidenceBundle, } from "./evidenceBundle.js";
|
|
6
7
|
import { evidenceLocationSchema, } from "./evidence.js";
|
|
@@ -96,7 +97,7 @@ export const analysisSnapshotSchema = z.object({
|
|
|
96
97
|
target: targetSchema,
|
|
97
98
|
binding: bindingSchema,
|
|
98
99
|
entries: z.array(entrySchema),
|
|
99
|
-
workflow_entries: z.array(workflowEntrySchema)
|
|
100
|
+
workflow_entries: z.array(workflowEntrySchema),
|
|
100
101
|
evidence_bundle: evidenceBundleSchema,
|
|
101
102
|
});
|
|
102
103
|
const canonicalJson = (value) => {
|
|
@@ -139,7 +140,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
|
|
|
139
140
|
const encodedParameters = canonicalJson(parameters);
|
|
140
141
|
const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
|
|
141
142
|
const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
|
|
142
|
-
const workflowEntry = snapshot.workflow_entries
|
|
143
|
+
const workflowEntry = snapshot.workflow_entries.find((candidate) => candidate.query_id === queryId);
|
|
143
144
|
if (entry === undefined && workflowEntry === undefined)
|
|
144
145
|
return undefined;
|
|
145
146
|
return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
|
|
@@ -147,7 +148,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
|
|
|
147
148
|
record.provider.id === provider.id &&
|
|
148
149
|
record.provider.name === provider.name &&
|
|
149
150
|
record.provider.version === provider.version &&
|
|
150
|
-
|
|
151
|
+
record.analysis_profile !== null &&
|
|
151
152
|
analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
|
|
152
153
|
canonicalJson(record.parameters) === encodedParameters &&
|
|
153
154
|
((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
|
|
@@ -233,11 +234,17 @@ export const createAnalysisSnapshotEntry = (input) => {
|
|
|
233
234
|
export const parseAnalysisSnapshot = (input) => {
|
|
234
235
|
const parsed = analysisSnapshotSchema.parse(input);
|
|
235
236
|
parseEvidenceBundle(parsed.evidence_bundle);
|
|
236
|
-
|
|
237
|
+
const scopedEvidence = evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256);
|
|
238
|
+
// The validated canonical bundle is filtered, never extended. Equal counts
|
|
239
|
+
// establish that no record or unknown was removed without serializing results.
|
|
240
|
+
if (scopedEvidence.records.length !== parsed.evidence_bundle.records.length ||
|
|
241
|
+
scopedEvidence.unknowns.length !== parsed.evidence_bundle.unknowns.length)
|
|
237
242
|
throw new TypeError("Analysis snapshot evidence contains records for another target");
|
|
243
|
+
if (!hasCanonicalQueryOrder(parsed.entries))
|
|
244
|
+
throw new TypeError("Analysis snapshot entries are not canonical");
|
|
245
|
+
if (!hasCanonicalQueryOrder(parsed.workflow_entries))
|
|
246
|
+
throw new TypeError("Analysis snapshot workflow entries are not canonical");
|
|
238
247
|
const ids = new Set();
|
|
239
|
-
const boundEntries = [];
|
|
240
|
-
const boundWorkflowEntries = [];
|
|
241
248
|
const index = createEvidenceIndex(parsed);
|
|
242
249
|
const workflowIndex = createWorkflowEvidenceIndex(parsed);
|
|
243
250
|
for (const entry of parsed.entries) {
|
|
@@ -254,13 +261,10 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
254
261
|
if (!entryHasMatchingEvidence(entry, parsed, index)) {
|
|
255
262
|
if (entryHasCorrespondingEvidence(entry, parsed, index))
|
|
256
263
|
throw new TypeError(`Analysis snapshot entry ${entry.operation} differs from its Evidence record`);
|
|
257
|
-
|
|
258
|
-
// Keep their Evidence bundle, but never replay those unbound values.
|
|
259
|
-
continue;
|
|
264
|
+
throw new TypeError(`Analysis snapshot entry ${entry.operation} has no profile-bound Evidence record`);
|
|
260
265
|
}
|
|
261
|
-
boundEntries.push(entry);
|
|
262
266
|
}
|
|
263
|
-
for (const entry of parsed.workflow_entries
|
|
267
|
+
for (const entry of parsed.workflow_entries) {
|
|
264
268
|
if (entry.execution.provider.id !==
|
|
265
269
|
entry.execution.analysis_profile.provider.id ||
|
|
266
270
|
entry.execution.provider.name !==
|
|
@@ -277,24 +281,20 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
277
281
|
if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
|
|
278
282
|
if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
|
|
279
283
|
throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
|
|
280
|
-
|
|
284
|
+
throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} has no profile-bound Evidence record`);
|
|
281
285
|
}
|
|
282
|
-
boundWorkflowEntries.push(entry);
|
|
283
286
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
? {}
|
|
296
|
-
: { workflow_entries: boundWorkflowEntries }),
|
|
297
|
-
};
|
|
287
|
+
return parsed;
|
|
288
|
+
};
|
|
289
|
+
const hasCanonicalQueryOrder = (entries) => {
|
|
290
|
+
let previous;
|
|
291
|
+
for (const { query_id: queryId } of entries) {
|
|
292
|
+
if (previous !== undefined &&
|
|
293
|
+
compareUnicodeCodePoints(previous, queryId) > 0)
|
|
294
|
+
return false;
|
|
295
|
+
previous = queryId;
|
|
296
|
+
}
|
|
297
|
+
return true;
|
|
298
298
|
};
|
|
299
299
|
const createEvidenceIndex = (snapshot) => {
|
|
300
300
|
const matching = new Set();
|
|
@@ -329,13 +329,13 @@ const isCorrespondingEvidence = (evidence, snapshot) => evidence.predicate_type
|
|
|
329
329
|
evidence.confidence === "observed" &&
|
|
330
330
|
evidence.authority === "shipped-artifact" &&
|
|
331
331
|
evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
|
|
332
|
-
|
|
332
|
+
evidence.analysis_profile !== null &&
|
|
333
333
|
analysisProfilesEqual(evidence.analysis_profile, snapshot.binding.analysis_profile);
|
|
334
334
|
const evidenceQueryKey = (evidence) => canonicalJson({
|
|
335
335
|
operation: evidence.operation,
|
|
336
336
|
parameters: evidence.parameters,
|
|
337
337
|
provider: evidence.provider,
|
|
338
|
-
analysis_profile:
|
|
338
|
+
analysis_profile: evidence.analysis_profile,
|
|
339
339
|
});
|
|
340
340
|
const entryQueryKey = (entry, binding) => canonicalJson({
|
|
341
341
|
operation: entry.operation,
|
|
@@ -383,7 +383,7 @@ const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_typ
|
|
|
383
383
|
evidence.confidence === "derived" &&
|
|
384
384
|
evidence.authority === "shipped-artifact" &&
|
|
385
385
|
evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
|
|
386
|
-
|
|
386
|
+
evidence.analysis_profile !== null &&
|
|
387
387
|
analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
|
|
388
388
|
evidence.provider.id === entry.execution.provider.id &&
|
|
389
389
|
evidence.provider.name === entry.execution.provider.name &&
|
|
@@ -396,7 +396,7 @@ const createWorkflowEvidenceIndex = (snapshot) => {
|
|
|
396
396
|
evidence.confidence !== "derived" ||
|
|
397
397
|
evidence.authority !== "shipped-artifact" ||
|
|
398
398
|
evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
|
|
399
|
-
|
|
399
|
+
evidence.analysis_profile === null)
|
|
400
400
|
continue;
|
|
401
401
|
corresponding.add(evidenceQueryKey(evidence));
|
|
402
402
|
matching.add(canonicalJson(evidenceContentProjection(evidence)));
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../analysisErrorCore.js";
|
|
3
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
4
|
+
import { digestSchema, prefixedDigestSchema } from "../digests.js";
|
|
5
|
+
import { evidenceSchema } from "../evidence.js";
|
|
6
|
+
import { jsonObjectSchema, jsonValueSchema } from "../jsonValue.js";
|
|
7
|
+
import { err, ok } from "../result.js";
|
|
8
|
+
import { binaryLayoutSchema } from "../native/binaryLayout.js";
|
|
9
|
+
import { parseOwnedJavaScriptApplicationAnalysisSteps, } from "../javascript/javascriptApplicationAnalysis.js";
|
|
10
|
+
import { analysisInputErrorFromIssues } from "../inputIssueProjection.js";
|
|
11
|
+
import { projectBinaryLayoutView } from "./binaryLayoutView.js";
|
|
12
|
+
import { projectJavaScriptApplicationView } from "./javascriptApplicationView.js";
|
|
13
|
+
/** Public name of the selected-view workflow. */
|
|
14
|
+
export const INSPECT_ANALYSIS_VIEW_OPERATION = "inspect_analysis_view";
|
|
15
|
+
const summaryViewSchema = z.strictObject({ kind: z.literal("summary") });
|
|
16
|
+
const facetViewSchema = z.strictObject({
|
|
17
|
+
kind: z.literal("facet"),
|
|
18
|
+
facet: z.enum(["mitigations", "linkage"]),
|
|
19
|
+
});
|
|
20
|
+
const itemSelectorSchema = z.union([
|
|
21
|
+
z.strictObject({ index: z.number().int().nonnegative() }),
|
|
22
|
+
z.strictObject({ name: z.string() }),
|
|
23
|
+
z.strictObject({
|
|
24
|
+
path: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe("Exact observed module path or original source-map reference from a module page; an empty reference is valid."),
|
|
27
|
+
}),
|
|
28
|
+
z.strictObject({ node_id: prefixedDigestSchema("jag_node") }),
|
|
29
|
+
]);
|
|
30
|
+
const itemViewSchema = z
|
|
31
|
+
.strictObject({
|
|
32
|
+
kind: z.literal("item"),
|
|
33
|
+
collection: z.enum(["sections", "symbols", "modules"]),
|
|
34
|
+
selector: itemSelectorSchema,
|
|
35
|
+
})
|
|
36
|
+
.superRefine((value, context) => {
|
|
37
|
+
const selector = value.selector;
|
|
38
|
+
if (value.collection === "modules") {
|
|
39
|
+
if (!("path" in selector) && !("node_id" in selector))
|
|
40
|
+
context.addIssue({
|
|
41
|
+
code: "custom",
|
|
42
|
+
path: ["selector"],
|
|
43
|
+
message: "Module items are selected by exact path or node_id, not index or name.",
|
|
44
|
+
});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!("index" in selector) && !("name" in selector))
|
|
48
|
+
context.addIssue({
|
|
49
|
+
code: "custom",
|
|
50
|
+
path: ["selector"],
|
|
51
|
+
message: "Section and symbol items are selected by index or exact name, not path or node_id.",
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
const pageViewSchema = z.strictObject({
|
|
55
|
+
kind: z.literal("page"),
|
|
56
|
+
collection: z.enum(["sections", "symbols", "modules"]),
|
|
57
|
+
offset: z.number().int().nonnegative(),
|
|
58
|
+
limit: z.number().int().positive(),
|
|
59
|
+
});
|
|
60
|
+
/** Caller-selected projection of already completed analysis Evidence. */
|
|
61
|
+
export const analysisViewRequestSchema = z.discriminatedUnion("kind", [
|
|
62
|
+
summaryViewSchema,
|
|
63
|
+
facetViewSchema,
|
|
64
|
+
itemViewSchema,
|
|
65
|
+
pageViewSchema,
|
|
66
|
+
]);
|
|
67
|
+
/** Inline Evidence or an exact same-session retained reference. */
|
|
68
|
+
export const analysisViewSourceSchema = z.discriminatedUnion("kind", [
|
|
69
|
+
z.strictObject({
|
|
70
|
+
kind: z.literal("retained-evidence"),
|
|
71
|
+
evidence_id: prefixedDigestSchema("ev"),
|
|
72
|
+
}),
|
|
73
|
+
z.strictObject({
|
|
74
|
+
kind: z.literal("inline"),
|
|
75
|
+
evidence: evidenceSchema,
|
|
76
|
+
}),
|
|
77
|
+
]);
|
|
78
|
+
/** Public inspect_analysis_view input. */
|
|
79
|
+
export const inspectAnalysisViewInputSchema = z.strictObject({
|
|
80
|
+
source: analysisViewSourceSchema,
|
|
81
|
+
view: analysisViewRequestSchema,
|
|
82
|
+
});
|
|
83
|
+
const coverageSchema = z.strictObject({
|
|
84
|
+
status: z.enum(["complete-within-view", "page", "empty"]),
|
|
85
|
+
examined: z.number().int().nonnegative(),
|
|
86
|
+
total: z.number().int().nonnegative(),
|
|
87
|
+
next_offset: z.number().int().nonnegative().nullable(),
|
|
88
|
+
exhausted: z.boolean(),
|
|
89
|
+
});
|
|
90
|
+
const artifactSchema = z.strictObject({
|
|
91
|
+
path: z.string().min(1),
|
|
92
|
+
sha256: digestSchema,
|
|
93
|
+
});
|
|
94
|
+
const layoutSummarySchema = z.strictObject({
|
|
95
|
+
bytes: z.number().int().nonnegative(),
|
|
96
|
+
format: z.literal("elf"),
|
|
97
|
+
architecture: z.strictObject({
|
|
98
|
+
machine: z.literal("EM_X86_64"),
|
|
99
|
+
bits: z.literal(64),
|
|
100
|
+
byte_order: z.literal("little"),
|
|
101
|
+
}),
|
|
102
|
+
image_type: z.enum(["ET_EXEC", "ET_DYN", "ET_REL"]),
|
|
103
|
+
entry: z.strictObject({
|
|
104
|
+
reported_value: z.string().min(1),
|
|
105
|
+
meaning: z.enum(["linked-virtual-address", "not-applicable", "absent"]),
|
|
106
|
+
execution_status: z.literal("unknown"),
|
|
107
|
+
}),
|
|
108
|
+
counts: z.strictObject({
|
|
109
|
+
sections: z.number().int().nonnegative(),
|
|
110
|
+
segments: z.number().int().nonnegative(),
|
|
111
|
+
symbols: z.number().int().nonnegative(),
|
|
112
|
+
relocations: z.number().int().nonnegative(),
|
|
113
|
+
}),
|
|
114
|
+
limitation_count: z.number().int().nonnegative(),
|
|
115
|
+
});
|
|
116
|
+
const javascriptSummarySchema = z.strictObject({
|
|
117
|
+
input_path: z.string().min(1),
|
|
118
|
+
format: z.enum(["asar", "directory"]),
|
|
119
|
+
root_artifact_sha256: digestSchema,
|
|
120
|
+
statistics: jsonObjectSchema,
|
|
121
|
+
electron: jsonObjectSchema,
|
|
122
|
+
coverage: jsonObjectSchema,
|
|
123
|
+
limitation_count: z.number().int().nonnegative(),
|
|
124
|
+
});
|
|
125
|
+
const viewResultBase = {
|
|
126
|
+
parent_evidence_id: prefixedDigestSchema("ev"),
|
|
127
|
+
parent_operation: z.enum([
|
|
128
|
+
"inspect_binary_layout",
|
|
129
|
+
"analyze_javascript_application",
|
|
130
|
+
]),
|
|
131
|
+
parent_digest: digestSchema,
|
|
132
|
+
view_digest: digestSchema,
|
|
133
|
+
artifact: artifactSchema,
|
|
134
|
+
coverage: coverageSchema,
|
|
135
|
+
limitations: z.array(z.string()),
|
|
136
|
+
unknowns: z.array(z.string()),
|
|
137
|
+
};
|
|
138
|
+
/** Projected facts for one selected view of retained analysis Evidence. */
|
|
139
|
+
export const analysisViewResultSchema = z.discriminatedUnion("kind", [
|
|
140
|
+
z.strictObject({
|
|
141
|
+
kind: z.literal("summary"),
|
|
142
|
+
view: summaryViewSchema,
|
|
143
|
+
summary: z.union([layoutSummarySchema, javascriptSummarySchema]),
|
|
144
|
+
...viewResultBase,
|
|
145
|
+
}),
|
|
146
|
+
z.strictObject({
|
|
147
|
+
kind: z.literal("facet"),
|
|
148
|
+
view: facetViewSchema,
|
|
149
|
+
facet: jsonValueSchema,
|
|
150
|
+
...viewResultBase,
|
|
151
|
+
}),
|
|
152
|
+
z.strictObject({
|
|
153
|
+
kind: z.literal("item"),
|
|
154
|
+
view: itemViewSchema,
|
|
155
|
+
item: jsonValueSchema,
|
|
156
|
+
...viewResultBase,
|
|
157
|
+
}),
|
|
158
|
+
z.strictObject({
|
|
159
|
+
kind: z.literal("page"),
|
|
160
|
+
view: pageViewSchema,
|
|
161
|
+
items: z.array(jsonValueSchema),
|
|
162
|
+
...viewResultBase,
|
|
163
|
+
}),
|
|
164
|
+
]);
|
|
165
|
+
/** Construct a typed input failure for one selected-view constraint. */
|
|
166
|
+
export const analysisViewInputError = (issues) => new AnalysisInputError(INSPECT_ANALYSIS_VIEW_OPERATION, undefined, issues);
|
|
167
|
+
/** Attach the content digest that must change when projected bytes change. */
|
|
168
|
+
export const sealAnalysisView = (projection) => analysisViewResultSchema.parse({
|
|
169
|
+
...projection,
|
|
170
|
+
view_digest: digestCanonicalValue(projection, "Analysis view"),
|
|
171
|
+
});
|
|
172
|
+
const parentDigest = (evidenceId) => evidenceId.slice(3);
|
|
173
|
+
const parseJavaScriptParent = (input) => {
|
|
174
|
+
try {
|
|
175
|
+
// Only the existing realm-private graph proofs permit reuse. Imported or
|
|
176
|
+
// merely frozen graphs still receive full canonical validation.
|
|
177
|
+
const steps = parseOwnedJavaScriptApplicationAnalysisSteps(input);
|
|
178
|
+
let step = steps.next();
|
|
179
|
+
while (!step.done)
|
|
180
|
+
step = steps.next();
|
|
181
|
+
return ok(step.value);
|
|
182
|
+
}
|
|
183
|
+
catch (cause) {
|
|
184
|
+
if (!(cause instanceof z.ZodError))
|
|
185
|
+
throw cause;
|
|
186
|
+
return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues.map((issue) => ({
|
|
187
|
+
...issue,
|
|
188
|
+
path: ["source", "normalized_result", ...issue.path],
|
|
189
|
+
})), { source: { normalized_result: input } }, { cause }));
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const unsupportedParent = (parent) => new AnalysisUnsupportedTargetError(INSPECT_ANALYSIS_VIEW_OPERATION, parentArtifactPath(parent), `Parent Evidence operation ${JSON.stringify(parent.operation)} is not inspect_binary_layout or analyze_javascript_application.`);
|
|
193
|
+
const parentArtifactPath = (parent) => {
|
|
194
|
+
if (typeof parent.normalizedResult === "object" &&
|
|
195
|
+
parent.normalizedResult !== null &&
|
|
196
|
+
"artifact" in parent.normalizedResult &&
|
|
197
|
+
typeof parent.normalizedResult.artifact === "object" &&
|
|
198
|
+
parent.normalizedResult.artifact !== null &&
|
|
199
|
+
"path" in parent.normalizedResult.artifact &&
|
|
200
|
+
typeof parent.normalizedResult.artifact.path === "string")
|
|
201
|
+
return parent.normalizedResult.artifact.path;
|
|
202
|
+
if (typeof parent.normalizedResult === "object" &&
|
|
203
|
+
parent.normalizedResult !== null &&
|
|
204
|
+
"input_path" in parent.normalizedResult &&
|
|
205
|
+
typeof parent.normalizedResult.input_path === "string")
|
|
206
|
+
return parent.normalizedResult.input_path;
|
|
207
|
+
return parent.evidenceId;
|
|
208
|
+
};
|
|
209
|
+
/** Project one selected view from authenticated parent analysis Evidence. */
|
|
210
|
+
export const projectAnalysisView = (parent, view) => {
|
|
211
|
+
const digest = parentDigest(parent.evidenceId);
|
|
212
|
+
if (!digestSchema.safeParse(digest).success)
|
|
213
|
+
return err(analysisViewInputError([
|
|
214
|
+
{
|
|
215
|
+
path: ["source"],
|
|
216
|
+
reason: "invalid_format",
|
|
217
|
+
message: "Parent Evidence ID is not a digest-backed identifier.",
|
|
218
|
+
},
|
|
219
|
+
]));
|
|
220
|
+
if (parent.operation === "inspect_binary_layout") {
|
|
221
|
+
const layout = binaryLayoutSchema.safeParse(parent.normalizedResult);
|
|
222
|
+
if (!layout.success)
|
|
223
|
+
return err(analysisViewInputError([
|
|
224
|
+
{
|
|
225
|
+
path: ["source"],
|
|
226
|
+
reason: "invalid_value",
|
|
227
|
+
message: "Parent Evidence result does not match inspect_binary_layout.",
|
|
228
|
+
},
|
|
229
|
+
]));
|
|
230
|
+
const projected = projectBinaryLayoutView(parent, layout.data, view);
|
|
231
|
+
return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
|
|
232
|
+
}
|
|
233
|
+
if (parent.operation === "analyze_javascript_application") {
|
|
234
|
+
const analysis = parseJavaScriptParent(parent.normalizedResult);
|
|
235
|
+
if (!analysis.ok)
|
|
236
|
+
return analysis;
|
|
237
|
+
const projected = projectJavaScriptApplicationView(parent, analysis.value, view);
|
|
238
|
+
return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
|
|
239
|
+
}
|
|
240
|
+
return err(unsupportedParent(parent));
|
|
241
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Coverage for a summary, facet, or single selected object. */
|
|
2
|
+
export const completeWithinViewCoverage = (examined, total) => ({
|
|
3
|
+
status: "complete-within-view",
|
|
4
|
+
examined,
|
|
5
|
+
total,
|
|
6
|
+
next_offset: null,
|
|
7
|
+
exhausted: true,
|
|
8
|
+
});
|
|
9
|
+
/** Coverage for a stable page, including an offset past the collection. */
|
|
10
|
+
export const pageViewCoverage = (offset, examined, total) => {
|
|
11
|
+
const exhausted = offset >= total || offset + examined >= total;
|
|
12
|
+
return {
|
|
13
|
+
status: examined === 0 ? "empty" : "page",
|
|
14
|
+
examined,
|
|
15
|
+
total,
|
|
16
|
+
next_offset: exhausted ? null : offset + examined,
|
|
17
|
+
exhausted,
|
|
18
|
+
};
|
|
19
|
+
};
|