rea-agents 3.0.0 → 3.2.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,64 +1,14 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { webMcpDiscoverySchema, } from "./webMcpDiscovery.js";
|
|
6
|
-
/** One normalized passive page snapshot accepted by capture comparison. */
|
|
7
|
-
export const captureSnapshotSchema = z.object({
|
|
8
|
-
inspection: webPageInspectionSchema,
|
|
9
|
-
webmcp: webMcpDiscoverySchema.nullable().default(null),
|
|
10
|
-
});
|
|
11
|
-
/** Input for deterministic comparison of two normalized web captures. */
|
|
12
|
-
export const compareWebCapturesInputSchema = z.object({
|
|
13
|
-
before: captureSnapshotSchema,
|
|
14
|
-
after: captureSnapshotSchema,
|
|
15
|
-
max_changes: z.number().int().min(1).max(20_000).default(2_000),
|
|
16
|
-
});
|
|
17
|
-
const changeSchema = z.object({
|
|
18
|
-
identity: z.string(),
|
|
19
|
-
change: z.enum(["added", "removed", "modified"]),
|
|
20
|
-
});
|
|
21
|
-
const dimensionSchema = z.object({
|
|
22
|
-
status: z.enum(["changed", "unchanged", "unknown"]),
|
|
23
|
-
total_changes: z.number().int().min(0),
|
|
24
|
-
changes: z.array(changeSchema),
|
|
25
|
-
omitted_changes: z.number().int().min(0),
|
|
26
|
-
reason: z.string().nullable(),
|
|
27
|
-
});
|
|
28
|
-
const legacyUnknownDimension = {
|
|
29
|
-
status: "unknown",
|
|
30
|
-
total_changes: 0,
|
|
31
|
-
changes: [],
|
|
32
|
-
omitted_changes: 0,
|
|
33
|
-
reason: "Dimension was not recorded by this version 1 capture diff.",
|
|
34
|
-
};
|
|
35
|
-
/** Completeness-aware changes across stable browser evidence dimensions. */
|
|
36
|
-
export const webCaptureDiffSchema = z.object({
|
|
37
|
-
schema_version: z.literal(1),
|
|
38
|
-
overall_status: z.enum(["changed", "unchanged", "unknown"]),
|
|
39
|
-
before_target: z.object({ target_id: z.string(), url: z.string() }),
|
|
40
|
-
after_target: z.object({ target_id: z.string(), url: z.string() }),
|
|
41
|
-
dimensions: z.object({
|
|
42
|
-
dom_structure: dimensionSchema,
|
|
43
|
-
scripts: dimensionSchema,
|
|
44
|
-
resources: dimensionSchema,
|
|
45
|
-
network: dimensionSchema,
|
|
46
|
-
metadata: dimensionSchema,
|
|
47
|
-
webmcp: dimensionSchema,
|
|
48
|
-
accessibility: dimensionSchema.default(legacyUnknownDimension),
|
|
49
|
-
storage: dimensionSchema.default(legacyUnknownDimension),
|
|
50
|
-
}),
|
|
51
|
-
limitations: z.array(z.string()),
|
|
52
|
-
});
|
|
3
|
+
import { webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
4
|
+
export { captureSnapshotSchema, compareWebCapturesInputSchema, webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
53
5
|
/** Compare normalized observations without treating incomplete absence as proof. */
|
|
54
6
|
export const compareWebCaptures = (input) => {
|
|
55
|
-
const remaining = { value: input.max_changes };
|
|
56
7
|
const before = input.before.inspection;
|
|
57
8
|
const after = input.after.inspection;
|
|
58
|
-
const dimensions = compareWebCaptureDimensions(input
|
|
9
|
+
const dimensions = compareWebCaptureDimensions(input);
|
|
59
10
|
const statuses = Object.values(dimensions).map(({ status }) => status);
|
|
60
11
|
return webCaptureDiffSchema.parse({
|
|
61
|
-
schema_version: 1,
|
|
62
12
|
overall_status: statuses.includes("changed")
|
|
63
13
|
? "changed"
|
|
64
14
|
: statuses.includes("unknown")
|
|
@@ -96,38 +46,49 @@ const compareIdentities = (before, after) => {
|
|
|
96
46
|
return changes.sort((left, right) => left.identity.localeCompare(right.identity) ||
|
|
97
47
|
left.change.localeCompare(right.change));
|
|
98
48
|
};
|
|
99
|
-
const compareDimension = (
|
|
49
|
+
const compareDimension = (before, after, complete, reason) => {
|
|
100
50
|
const all = compareIdentities(before, after);
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
51
|
+
if (all.length > 0)
|
|
52
|
+
return {
|
|
53
|
+
status: "changed",
|
|
54
|
+
total_changes: all.length,
|
|
55
|
+
changes: all,
|
|
56
|
+
reason: null,
|
|
57
|
+
};
|
|
58
|
+
return complete
|
|
59
|
+
? {
|
|
60
|
+
status: "unchanged",
|
|
61
|
+
total_changes: 0,
|
|
62
|
+
changes: [],
|
|
63
|
+
reason: null,
|
|
64
|
+
}
|
|
65
|
+
: {
|
|
66
|
+
status: "unknown",
|
|
67
|
+
total_changes: 0,
|
|
68
|
+
changes: [],
|
|
69
|
+
reason,
|
|
70
|
+
};
|
|
110
71
|
};
|
|
111
|
-
const accessibilityDimension = (before, after
|
|
72
|
+
const accessibilityDimension = (before, after) => {
|
|
112
73
|
const beforeAccess = accessibilityComparable(before);
|
|
113
74
|
const afterAccess = accessibilityComparable(after);
|
|
114
75
|
const textComparable = beforeAccess.text && afterAccess.text;
|
|
115
76
|
const nodesComparable = beforeAccess.nodes && afterAccess.nodes;
|
|
116
|
-
return compareDimension(
|
|
77
|
+
return compareDimension(singleton("accessibility_tree", digest(accessibilityProjection(before.accessibility, textComparable, nodesComparable))), singleton("accessibility_tree", digest(accessibilityProjection(after.accessibility, textComparable, nodesComparable))), beforeAccess.complete && afterAccess.complete, "Accessibility tree or text capture was incomplete in at least one observation.");
|
|
117
78
|
};
|
|
118
|
-
const storageDimension = (before, after
|
|
79
|
+
const storageDimension = (before, after) => {
|
|
119
80
|
const keysComplete = storageKeysComparable(before) && storageKeysComparable(after);
|
|
120
81
|
const usageComplete = before.storage.usage_bytes !== null &&
|
|
121
82
|
after.storage.usage_bytes !== null &&
|
|
122
83
|
before.storage.quota_bytes !== null &&
|
|
123
84
|
after.storage.quota_bytes !== null;
|
|
124
85
|
const comparableFingerprints = storageFingerprintIdentities(before.storage, after.storage);
|
|
125
|
-
return compareDimension(
|
|
86
|
+
return compareDimension(storageMap(before.storage, keysComplete, usageComplete, comparableFingerprints), storageMap(after.storage, keysComplete, usageComplete, comparableFingerprints), storageComparable(before, after, keysComplete, usageComplete), "Storage fingerprints, inventories, usage, or quota were unavailable or truncated in at least one observation.");
|
|
126
87
|
};
|
|
127
|
-
const compareWebCaptureDimensions = (input
|
|
88
|
+
const compareWebCaptureDimensions = (input) => {
|
|
128
89
|
const before = input.before.inspection;
|
|
129
90
|
const after = input.after.inspection;
|
|
130
|
-
const dimension = compareDimension
|
|
91
|
+
const dimension = compareDimension;
|
|
131
92
|
return {
|
|
132
93
|
dom_structure: dimension(singleton("document", digest(domProjection(before))), singleton("document", digest(domProjection(after))), sectionsComplete(before, ["frames", "dom"]) &&
|
|
133
94
|
sectionsComplete(after, ["frames", "dom"]), "DOM or frame capture was incomplete in at least one observation."),
|
|
@@ -140,8 +101,8 @@ const compareWebCaptureDimensions = (input, remaining) => {
|
|
|
140
101
|
metadata: dimension(singleton("metadata", digest(metadataProjection(before))), singleton("metadata", digest(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
|
|
141
102
|
sectionsComplete(after, ["metadata"]), "Safe metadata capture was incomplete in at least one observation."),
|
|
142
103
|
webmcp: dimension(webMcpMap(input.before.webmcp), webMcpMap(input.after.webmcp), webMcpComplete(input.before.webmcp) && webMcpComplete(input.after.webmcp), "WebMCP discovery was unavailable or incomplete in at least one capture."),
|
|
143
|
-
accessibility: accessibilityDimension(before, after
|
|
144
|
-
storage: storageDimension(before, after
|
|
104
|
+
accessibility: accessibilityDimension(before, after),
|
|
105
|
+
storage: storageDimension(before, after),
|
|
145
106
|
};
|
|
146
107
|
};
|
|
147
108
|
const keyed = (values, identity) => new Map(values.map((value) => [identity(value), digest(value)]));
|
|
@@ -220,28 +181,30 @@ const digest = (value) => {
|
|
|
220
181
|
};
|
|
221
182
|
const accessibilityComparable = (inspection) => {
|
|
222
183
|
const text = inspection.accessibility.text_capture.status === "included" &&
|
|
223
|
-
inspection.accessibility.text_capture.excluded_fields === 0
|
|
224
|
-
inspection.accessibility.text_capture.truncated_fields === 0;
|
|
184
|
+
inspection.accessibility.text_capture.excluded_fields === 0;
|
|
225
185
|
const nodes = inspection.accessibility.total_nodes ===
|
|
226
186
|
inspection.accessibility.nodes.length;
|
|
227
187
|
const complete = text && nodes && sectionsComplete(inspection, ["accessibility"]);
|
|
228
188
|
return { text, nodes, complete };
|
|
229
189
|
};
|
|
230
190
|
const accessibilityProjection = (accessibility, includeText, includeNodes) => {
|
|
231
|
-
const result = {
|
|
232
|
-
total_nodes: accessibility.total_nodes,
|
|
233
|
-
};
|
|
234
191
|
if (!includeNodes)
|
|
235
|
-
return
|
|
192
|
+
return { total_nodes: accessibility.total_nodes };
|
|
236
193
|
const nodeIndexes = new Map(accessibility.nodes.map((node, index) => [node.node_id, index]));
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
194
|
+
return {
|
|
195
|
+
total_nodes: accessibility.total_nodes,
|
|
196
|
+
nodes: accessibility.nodes.map((node) => ({
|
|
197
|
+
parent_index: node.parent_id === null
|
|
198
|
+
? null
|
|
199
|
+
: (nodeIndexes.get(node.parent_id) ?? -1),
|
|
200
|
+
role: node.role,
|
|
201
|
+
ignored: node.ignored,
|
|
202
|
+
states: node.states,
|
|
203
|
+
...(includeText
|
|
204
|
+
? { name: node.name, description: node.description }
|
|
205
|
+
: {}),
|
|
206
|
+
})),
|
|
207
|
+
};
|
|
245
208
|
};
|
|
246
209
|
const storageKeysComparable = (inspection) => sectionsComplete(inspection, ["storage_keys"]);
|
|
247
210
|
const storageComparable = (before, after, keysComplete, usageComplete) => keysComplete &&
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { webPageInspectionSchema } from "./browserObservation.js";
|
|
3
|
+
import { webMcpDiscoverySchema } from "./webMcpDiscovery.js";
|
|
4
|
+
/** One normalized passive page snapshot accepted by capture comparison. */
|
|
5
|
+
export const captureSnapshotSchema = z.object({
|
|
6
|
+
inspection: webPageInspectionSchema,
|
|
7
|
+
webmcp: webMcpDiscoverySchema.nullable().default(null),
|
|
8
|
+
});
|
|
9
|
+
/** Input for deterministic comparison of two normalized web captures. */
|
|
10
|
+
export const compareWebCapturesInputSchema = z.strictObject({
|
|
11
|
+
before: captureSnapshotSchema,
|
|
12
|
+
after: captureSnapshotSchema,
|
|
13
|
+
});
|
|
14
|
+
const changeSchema = z.object({
|
|
15
|
+
identity: z.string(),
|
|
16
|
+
change: z.enum(["added", "removed", "modified"]),
|
|
17
|
+
});
|
|
18
|
+
const emptyDimensionShape = {
|
|
19
|
+
total_changes: z.literal(0),
|
|
20
|
+
changes: z.tuple([]),
|
|
21
|
+
};
|
|
22
|
+
const dimensionSchema = z.union([
|
|
23
|
+
z
|
|
24
|
+
.object({
|
|
25
|
+
status: z.literal("changed"),
|
|
26
|
+
total_changes: z.number().int().min(1),
|
|
27
|
+
changes: z.array(changeSchema),
|
|
28
|
+
reason: z.null(),
|
|
29
|
+
})
|
|
30
|
+
.superRefine((dimension, context) => {
|
|
31
|
+
if (dimension.changes.length !== dimension.total_changes)
|
|
32
|
+
context.addIssue({
|
|
33
|
+
code: "custom",
|
|
34
|
+
message: "Inline changes must equal total changes",
|
|
35
|
+
path: ["total_changes"],
|
|
36
|
+
});
|
|
37
|
+
}),
|
|
38
|
+
z.object({
|
|
39
|
+
...emptyDimensionShape,
|
|
40
|
+
status: z.literal("unchanged"),
|
|
41
|
+
reason: z.null(),
|
|
42
|
+
}),
|
|
43
|
+
z.object({
|
|
44
|
+
...emptyDimensionShape,
|
|
45
|
+
status: z.literal("unknown"),
|
|
46
|
+
reason: z.string(),
|
|
47
|
+
}),
|
|
48
|
+
]);
|
|
49
|
+
const legacyUnknownDimension = {
|
|
50
|
+
status: "unknown",
|
|
51
|
+
total_changes: 0,
|
|
52
|
+
changes: [],
|
|
53
|
+
reason: "Dimension was not recorded by this version 1 capture diff.",
|
|
54
|
+
};
|
|
55
|
+
/** Completeness-aware changes across stable browser evidence dimensions. */
|
|
56
|
+
export const webCaptureDiffSchema = z
|
|
57
|
+
.object({
|
|
58
|
+
overall_status: z.enum(["changed", "unchanged", "unknown"]),
|
|
59
|
+
before_target: z.object({ target_id: z.string(), url: z.string() }),
|
|
60
|
+
after_target: z.object({ target_id: z.string(), url: z.string() }),
|
|
61
|
+
dimensions: z.object({
|
|
62
|
+
dom_structure: dimensionSchema,
|
|
63
|
+
scripts: dimensionSchema,
|
|
64
|
+
resources: dimensionSchema,
|
|
65
|
+
network: dimensionSchema,
|
|
66
|
+
metadata: dimensionSchema,
|
|
67
|
+
webmcp: dimensionSchema,
|
|
68
|
+
accessibility: dimensionSchema.default(legacyUnknownDimension),
|
|
69
|
+
storage: dimensionSchema.default(legacyUnknownDimension),
|
|
70
|
+
}),
|
|
71
|
+
limitations: z.array(z.string()),
|
|
72
|
+
})
|
|
73
|
+
.superRefine((comparison, context) => {
|
|
74
|
+
const statuses = Object.values(comparison.dimensions).map(({ status }) => status);
|
|
75
|
+
const expected = statuses.includes("changed")
|
|
76
|
+
? "changed"
|
|
77
|
+
: statuses.includes("unknown")
|
|
78
|
+
? "unknown"
|
|
79
|
+
: "unchanged";
|
|
80
|
+
if (comparison.overall_status !== expected)
|
|
81
|
+
context.addIssue({
|
|
82
|
+
code: "custom",
|
|
83
|
+
message: "Overall status must summarize dimension statuses",
|
|
84
|
+
path: ["overall_status"],
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -3,10 +3,9 @@ import { z } from "zod";
|
|
|
3
3
|
/** Self-verifying text artifact used by web-source analysis boundaries. */
|
|
4
4
|
export const webTextArtifactSchema = z
|
|
5
5
|
.object({
|
|
6
|
-
uri: z.string().regex(/^rea:\/\/web-content\/sha256\/[a-f0-9]{64}$/u),
|
|
7
6
|
sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
8
7
|
bytes: z.number().int().min(0),
|
|
9
|
-
media_type: z.string().min(1)
|
|
8
|
+
media_type: z.string().min(1),
|
|
10
9
|
charset: z.literal("utf-8"),
|
|
11
10
|
text: z.string(),
|
|
12
11
|
})
|
|
@@ -25,18 +24,11 @@ export const webTextArtifactSchema = z
|
|
|
25
24
|
path: ["sha256"],
|
|
26
25
|
message: "Digest mismatch",
|
|
27
26
|
});
|
|
28
|
-
if (artifact.uri !== webContentUri(digest))
|
|
29
|
-
context.addIssue({
|
|
30
|
-
code: "custom",
|
|
31
|
-
path: ["uri"],
|
|
32
|
-
message: "Content URI mismatch",
|
|
33
|
-
});
|
|
34
27
|
});
|
|
35
28
|
/** Build an immutable content-addressed UTF-8 text artifact. */
|
|
36
29
|
export const createWebTextArtifact = (text, mediaType) => {
|
|
37
30
|
const sha256 = createHash("sha256").update(text).digest("hex");
|
|
38
31
|
return {
|
|
39
|
-
uri: webContentUri(sha256),
|
|
40
32
|
sha256,
|
|
41
33
|
bytes: Buffer.byteLength(text),
|
|
42
34
|
media_type: mediaType,
|
|
@@ -44,4 +36,3 @@ export const createWebTextArtifact = (text, mediaType) => {
|
|
|
44
36
|
text,
|
|
45
37
|
};
|
|
46
38
|
};
|
|
47
|
-
const webContentUri = (sha256) => `rea://web-content/sha256/${sha256}`;
|
|
@@ -3,21 +3,11 @@ import { browserCompletenessSchema } from "./browserCompleteness.js";
|
|
|
3
3
|
import { browserAllowedOriginsSchema, browserEndpointSchema, } from "./browserObservation.js";
|
|
4
4
|
import { jsonShapeSchema } from "./jsonShape.js";
|
|
5
5
|
/** Input for passive discovery of page-registered WebMCP tools. */
|
|
6
|
-
export const discoverWebMcpToolsInputSchema = z.
|
|
6
|
+
export const discoverWebMcpToolsInputSchema = z.strictObject({
|
|
7
7
|
cdp_endpoint: browserEndpointSchema,
|
|
8
8
|
allowed_origins: browserAllowedOriginsSchema,
|
|
9
|
-
target_id: z.string().trim().min(1)
|
|
10
|
-
|
|
11
|
-
observation_ms: z.number().int().min(0).max(10_000).default(100),
|
|
12
|
-
max_tools: z.number().int().min(1).max(5_000).default(500),
|
|
13
|
-
max_schema_bytes: z
|
|
14
|
-
.number()
|
|
15
|
-
.int()
|
|
16
|
-
.min(1)
|
|
17
|
-
.max(1_024 * 1_024)
|
|
18
|
-
.default(256 * 1_024),
|
|
19
|
-
max_schema_nodes: z.number().int().min(1).max(100_000).default(5_000),
|
|
20
|
-
max_schema_depth: z.number().int().min(1).max(100).default(20),
|
|
9
|
+
target_id: z.string().trim().min(1),
|
|
10
|
+
observation_ms: z.number().int().min(0).default(100),
|
|
21
11
|
});
|
|
22
12
|
const browserVersionSchema = z.object({
|
|
23
13
|
product: z.string(),
|
|
@@ -51,7 +41,6 @@ const webMcpToolSchema = z.object({
|
|
|
51
41
|
});
|
|
52
42
|
/** Passive WebMCP inventory; it intentionally has no invocation surface. */
|
|
53
43
|
export const webMcpDiscoverySchema = z.object({
|
|
54
|
-
schema_version: z.literal(1),
|
|
55
44
|
browser: browserVersionSchema,
|
|
56
45
|
target: z.object({
|
|
57
46
|
target_id: z.string(),
|
|
@@ -2,15 +2,13 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { browserCompletenessSchema } from "./browserCompleteness.js";
|
|
4
4
|
import { browserAllowedOriginsSchema, browserEndpointSchema, } from "./browserObservation.js";
|
|
5
|
-
const MAX_SCREENSHOT_BYTES = 8 * 1_024 * 1_024;
|
|
6
5
|
/** Self-verifying inline PNG artifact for CLI/MCP parity. */
|
|
7
6
|
export const webScreenshotArtifactSchema = z
|
|
8
7
|
.object({
|
|
9
|
-
uri: z.string().regex(/^rea:\/\/web-screenshot\/sha256\/[a-f0-9]{64}$/u),
|
|
10
8
|
sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
11
|
-
bytes: z.number().int().min(1)
|
|
9
|
+
bytes: z.number().int().min(1),
|
|
12
10
|
media_type: z.literal("image/png"),
|
|
13
|
-
data_base64: z.string()
|
|
11
|
+
data_base64: z.string(),
|
|
14
12
|
})
|
|
15
13
|
.superRefine((artifact, context) => {
|
|
16
14
|
const bytes = decodeCanonicalBase64(artifact.data_base64);
|
|
@@ -19,27 +17,17 @@ export const webScreenshotArtifactSchema = z
|
|
|
19
17
|
return;
|
|
20
18
|
}
|
|
21
19
|
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
22
|
-
if (bytes.byteLength !== artifact.bytes ||
|
|
23
|
-
sha256 !== artifact.sha256 ||
|
|
24
|
-
artifact.uri !== `rea://web-screenshot/sha256/${sha256}`)
|
|
20
|
+
if (bytes.byteLength !== artifact.bytes || sha256 !== artifact.sha256)
|
|
25
21
|
context.addIssue({
|
|
26
22
|
code: "custom",
|
|
27
23
|
message: "Screenshot artifact digest or size mismatch",
|
|
28
24
|
});
|
|
29
25
|
});
|
|
30
26
|
/** Input for one read-only visible-viewport screenshot. */
|
|
31
|
-
export const captureWebScreenshotInputSchema = z.
|
|
27
|
+
export const captureWebScreenshotInputSchema = z.strictObject({
|
|
32
28
|
cdp_endpoint: browserEndpointSchema,
|
|
33
29
|
allowed_origins: browserAllowedOriginsSchema,
|
|
34
|
-
target_id: z.string().trim().min(1)
|
|
35
|
-
approved: z.literal(true),
|
|
36
|
-
screenshot_approved: z.literal(true),
|
|
37
|
-
maximum_image_bytes: z
|
|
38
|
-
.number()
|
|
39
|
-
.int()
|
|
40
|
-
.min(1)
|
|
41
|
-
.max(MAX_SCREENSHOT_BYTES)
|
|
42
|
-
.default(4 * 1_024 * 1_024),
|
|
30
|
+
target_id: z.string().trim().min(1),
|
|
43
31
|
});
|
|
44
32
|
const browserVersionSchema = z.object({
|
|
45
33
|
product: z.string(),
|
|
@@ -48,9 +36,8 @@ const browserVersionSchema = z.object({
|
|
|
48
36
|
user_agent: z.string(),
|
|
49
37
|
js_version: z.string(),
|
|
50
38
|
});
|
|
51
|
-
/**
|
|
39
|
+
/** Screenshot observation with embedded immutable artifact bytes. */
|
|
52
40
|
export const webScreenshotSchema = z.object({
|
|
53
|
-
schema_version: z.literal(1),
|
|
54
41
|
browser: browserVersionSchema,
|
|
55
42
|
target: z.object({
|
|
56
43
|
target_id: z.string(),
|
|
@@ -66,17 +53,14 @@ export const webScreenshotSchema = z.object({
|
|
|
66
53
|
completeness: browserCompletenessSchema,
|
|
67
54
|
limitations: z.array(z.string()),
|
|
68
55
|
});
|
|
69
|
-
/** Input for
|
|
70
|
-
export const compareWebScreenshotsInputSchema = z.
|
|
56
|
+
/** Input for local pixel comparison of two screenshot artifacts. */
|
|
57
|
+
export const compareWebScreenshotsInputSchema = z.strictObject({
|
|
71
58
|
before: webScreenshotArtifactSchema,
|
|
72
59
|
after: webScreenshotArtifactSchema,
|
|
73
60
|
channel_threshold: z.number().int().min(0).max(255).default(0),
|
|
74
|
-
maximum_pixels: z.number().int().min(1).max(32_000_000).default(16_000_000),
|
|
75
61
|
});
|
|
76
62
|
/** Value-only visual difference metrics; no OCR or image mutation. */
|
|
77
|
-
|
|
78
|
-
schema_version: z.literal(1),
|
|
79
|
-
status: z.enum(["identical", "different", "dimension_mismatch"]),
|
|
63
|
+
const webScreenshotDiffContextShape = {
|
|
80
64
|
before: z.object({
|
|
81
65
|
width: z.number().int().min(1),
|
|
82
66
|
height: z.number().int().min(1),
|
|
@@ -86,18 +70,59 @@ export const webScreenshotDiffSchema = z.object({
|
|
|
86
70
|
height: z.number().int().min(1),
|
|
87
71
|
}),
|
|
88
72
|
channel_threshold: z.number().int().min(0).max(255),
|
|
89
|
-
compared_pixels: z.number().int().min(0),
|
|
90
|
-
changed_pixels: z.number().int().min(0).nullable(),
|
|
91
|
-
changed_ratio: z.number().min(0).max(1).nullable(),
|
|
92
|
-
maximum_channel_delta: z.number().int().min(0).max(255).nullable(),
|
|
93
|
-
mean_absolute_channel_delta: z.number().min(0).max(255).nullable(),
|
|
94
73
|
limitations: z.array(z.string()),
|
|
74
|
+
};
|
|
75
|
+
export const webScreenshotDiffSchema = z
|
|
76
|
+
.discriminatedUnion("status", [
|
|
77
|
+
z.object({
|
|
78
|
+
...webScreenshotDiffContextShape,
|
|
79
|
+
status: z.literal("identical"),
|
|
80
|
+
compared_pixels: z.number().int().positive(),
|
|
81
|
+
changed_pixels: z.literal(0),
|
|
82
|
+
changed_ratio: z.literal(0),
|
|
83
|
+
maximum_channel_delta: z.number().int().min(0).max(255),
|
|
84
|
+
mean_absolute_channel_delta: z.number().min(0).max(255),
|
|
85
|
+
}),
|
|
86
|
+
z.object({
|
|
87
|
+
...webScreenshotDiffContextShape,
|
|
88
|
+
status: z.literal("different"),
|
|
89
|
+
compared_pixels: z.number().int().positive(),
|
|
90
|
+
changed_pixels: z.number().int().positive(),
|
|
91
|
+
changed_ratio: z.number().positive().max(1),
|
|
92
|
+
maximum_channel_delta: z.number().int().positive().max(255),
|
|
93
|
+
mean_absolute_channel_delta: z.number().positive().max(255),
|
|
94
|
+
}),
|
|
95
|
+
z.object({
|
|
96
|
+
...webScreenshotDiffContextShape,
|
|
97
|
+
status: z.literal("dimension_mismatch"),
|
|
98
|
+
compared_pixels: z.literal(0),
|
|
99
|
+
changed_pixels: z.null(),
|
|
100
|
+
changed_ratio: z.null(),
|
|
101
|
+
maximum_channel_delta: z.null(),
|
|
102
|
+
mean_absolute_channel_delta: z.null(),
|
|
103
|
+
}),
|
|
104
|
+
])
|
|
105
|
+
.superRefine((diff, context) => {
|
|
106
|
+
const sameDimensions = diff.before.width === diff.after.width &&
|
|
107
|
+
diff.before.height === diff.after.height;
|
|
108
|
+
if (sameDimensions !== (diff.status !== "dimension_mismatch"))
|
|
109
|
+
context.addIssue({
|
|
110
|
+
code: "custom",
|
|
111
|
+
path: ["status"],
|
|
112
|
+
message: "Screenshot comparison status must match viewport dimensions",
|
|
113
|
+
});
|
|
114
|
+
if (diff.status !== "dimension_mismatch" &&
|
|
115
|
+
diff.compared_pixels !== diff.before.width * diff.before.height)
|
|
116
|
+
context.addIssue({
|
|
117
|
+
code: "custom",
|
|
118
|
+
path: ["compared_pixels"],
|
|
119
|
+
message: "Compared pixel count must match the shared dimensions",
|
|
120
|
+
});
|
|
95
121
|
});
|
|
96
|
-
/** Create a content-addressed PNG artifact from
|
|
122
|
+
/** Create a content-addressed PNG artifact from captured bytes. */
|
|
97
123
|
export const createWebScreenshotArtifact = (bytes) => {
|
|
98
124
|
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
99
125
|
return webScreenshotArtifactSchema.parse({
|
|
100
|
-
uri: `rea://web-screenshot/sha256/${sha256}`,
|
|
101
126
|
sha256,
|
|
102
127
|
bytes: bytes.byteLength,
|
|
103
128
|
media_type: "image/png",
|
|
@@ -106,9 +131,8 @@ export const createWebScreenshotArtifact = (bytes) => {
|
|
|
106
131
|
};
|
|
107
132
|
/** Strict canonical base64 decoder used before digest validation. */
|
|
108
133
|
export const decodeCanonicalBase64 = (value) => {
|
|
109
|
-
if (value.length === 0 || value.length % 4 !== 0
|
|
134
|
+
if (value.length === 0 || value.length % 4 !== 0)
|
|
110
135
|
return undefined;
|
|
111
136
|
const decoded = Buffer.from(value, "base64");
|
|
112
137
|
return decoded.toString("base64") === value ? decoded : undefined;
|
|
113
138
|
};
|
|
114
|
-
const BASE64 = /^(?:[A-Za-z\d+/]{4})*(?:[A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?$/u;
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/** Recognize local-header, empty-archive, or split-archive ZIP signatures, not archive validity. */
|
|
2
|
+
export const hasZipSignature = (bytes) => bytes.length >= 4 &&
|
|
3
|
+
bytes[0] === 0x50 &&
|
|
4
|
+
bytes[1] === 0x4b &&
|
|
5
|
+
((bytes[2] === 0x03 && bytes[3] === 0x04) ||
|
|
6
|
+
(bytes[2] === 0x05 && bytes[3] === 0x06) ||
|
|
7
|
+
(bytes[2] === 0x07 && bytes[3] === 0x08));
|
|
1
8
|
/**
|
|
2
9
|
* Classify a ZIP-backed package by its complete lower-cased path suffix.
|
|
3
10
|
*
|
|
@@ -3,15 +3,6 @@ import { readManagedPeLayout, } from "./ManagedPeReader.js";
|
|
|
3
3
|
import { managedTableRowCounts, readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
|
|
4
4
|
import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
|
|
5
5
|
import { ManagedReaderFailure } from "./ManagedReaderFailure.js";
|
|
6
|
-
const emptyPage = (offset, limit) => ({
|
|
7
|
-
items: [],
|
|
8
|
-
offset,
|
|
9
|
-
limit,
|
|
10
|
-
total: 0,
|
|
11
|
-
returned: 0,
|
|
12
|
-
dropped: 0,
|
|
13
|
-
complete: offset === 0,
|
|
14
|
-
});
|
|
15
6
|
const flagNames = (flags) => {
|
|
16
7
|
const names = [];
|
|
17
8
|
for (const [mask, name] of [
|
|
@@ -64,7 +55,6 @@ const peProjection = (layout) => ({
|
|
|
64
55
|
cli: layout.cli === null ? null : cliProjection(layout.cli),
|
|
65
56
|
});
|
|
66
57
|
const base = (target, bytes, layout) => ({
|
|
67
|
-
schema_version: 1,
|
|
68
58
|
artifact: {
|
|
69
59
|
path: target.path,
|
|
70
60
|
sha256: target.sha256,
|
|
@@ -73,7 +63,7 @@ const base = (target, bytes, layout) => ({
|
|
|
73
63
|
},
|
|
74
64
|
pe: peProjection(layout),
|
|
75
65
|
});
|
|
76
|
-
const unavailableResult = (target, bytes, layout
|
|
66
|
+
const unavailableResult = (target, bytes, layout) => {
|
|
77
67
|
const malformed = layout.cliDirectoryPresent;
|
|
78
68
|
const issues = layout.cliIssue === null ? [] : [layout.cliIssue];
|
|
79
69
|
const limitations = malformed
|
|
@@ -108,9 +98,9 @@ const unavailableResult = (target, bytes, layout, limits) => {
|
|
|
108
98
|
module: null,
|
|
109
99
|
assembly: null,
|
|
110
100
|
target_frameworks: [],
|
|
111
|
-
references:
|
|
112
|
-
resources:
|
|
113
|
-
attributes:
|
|
101
|
+
references: [],
|
|
102
|
+
resources: [],
|
|
103
|
+
attributes: [],
|
|
114
104
|
coverage: {
|
|
115
105
|
state: malformed ? "partial" : "unavailable",
|
|
116
106
|
issues,
|
|
@@ -205,7 +195,7 @@ const runtimeClassification = ({ layout, metadata, inventory, }) => {
|
|
|
205
195
|
evidence,
|
|
206
196
|
};
|
|
207
197
|
};
|
|
208
|
-
const partialMetadataResult = ({ target, bytes, layout,
|
|
198
|
+
const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
|
|
209
199
|
...base(target, bytes, layout),
|
|
210
200
|
classification: {
|
|
211
201
|
status: "malformed",
|
|
@@ -222,7 +212,7 @@ const partialMetadataResult = ({ target, bytes, layout, limits, issue, }) => ({
|
|
|
222
212
|
],
|
|
223
213
|
},
|
|
224
214
|
metadata: {
|
|
225
|
-
status:
|
|
215
|
+
status: "malformed",
|
|
226
216
|
version: null,
|
|
227
217
|
stream_names: [],
|
|
228
218
|
table_row_counts: {},
|
|
@@ -230,12 +220,12 @@ const partialMetadataResult = ({ target, bytes, layout, limits, issue, }) => ({
|
|
|
230
220
|
module: null,
|
|
231
221
|
assembly: null,
|
|
232
222
|
target_frameworks: [],
|
|
233
|
-
references:
|
|
234
|
-
resources:
|
|
235
|
-
attributes:
|
|
223
|
+
references: [],
|
|
224
|
+
resources: [],
|
|
225
|
+
attributes: [],
|
|
236
226
|
coverage: { state: "partial", issues: [issue] },
|
|
237
227
|
limitations: [
|
|
238
|
-
"CLI metadata
|
|
228
|
+
"CLI metadata could not be read because the PE/CLI structure is malformed or unsupported.",
|
|
239
229
|
],
|
|
240
230
|
});
|
|
241
231
|
const mapResources = (bytes, layout, issues) => {
|
|
@@ -255,32 +245,16 @@ const mapResources = (bytes, layout, issues) => {
|
|
|
255
245
|
return null;
|
|
256
246
|
}
|
|
257
247
|
};
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
inventory.attributes.complete;
|
|
261
|
-
/** Inspect PE/CLI identity directly from bounded bytes without CLR loading. */
|
|
262
|
-
export const inspectManagedArtifactBytes = (bytes, target, limits) => {
|
|
248
|
+
/** Inspect PE/CLI identity directly from local bytes without CLR loading. */
|
|
249
|
+
export const inspectManagedArtifactBytes = (bytes, target) => {
|
|
263
250
|
const layout = readManagedPeLayout(bytes);
|
|
264
251
|
if (layout.cli === null)
|
|
265
|
-
return unavailableResult(target, bytes, layout
|
|
252
|
+
return unavailableResult(target, bytes, layout);
|
|
266
253
|
const cli = layout.cli;
|
|
267
|
-
if (cli.metadata.size > limits.maxMetadataBytes)
|
|
268
|
-
return managedArtifactInspectionSchema.parse(partialMetadataResult({
|
|
269
|
-
target,
|
|
270
|
-
bytes,
|
|
271
|
-
layout,
|
|
272
|
-
limits,
|
|
273
|
-
issue: {
|
|
274
|
-
code: "limit-exceeded",
|
|
275
|
-
scope: "cli.metadata",
|
|
276
|
-
offset: cli.headerOffset + 8,
|
|
277
|
-
detail: `CLI metadata size exceeds max_metadata_bytes ${String(limits.maxMetadataBytes)}`,
|
|
278
|
-
},
|
|
279
|
-
}));
|
|
280
254
|
let metadata;
|
|
281
255
|
try {
|
|
282
256
|
const metadataOffset = layout.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
|
|
283
|
-
metadata = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size
|
|
257
|
+
metadata = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size);
|
|
284
258
|
}
|
|
285
259
|
catch (cause) {
|
|
286
260
|
if (!(cause instanceof ManagedReaderFailure))
|
|
@@ -289,25 +263,18 @@ export const inspectManagedArtifactBytes = (bytes, target, limits) => {
|
|
|
289
263
|
target,
|
|
290
264
|
bytes,
|
|
291
265
|
layout,
|
|
292
|
-
limits,
|
|
293
266
|
issue: cause.issue,
|
|
294
267
|
}));
|
|
295
268
|
}
|
|
296
269
|
const resourceIssues = [];
|
|
297
270
|
const resourceDirectory = mapResources(bytes, layout, resourceIssues);
|
|
298
|
-
const inventory = readManagedMetadataInventory(bytes, metadata,
|
|
271
|
+
const inventory = readManagedMetadataInventory(bytes, metadata, resourceDirectory);
|
|
299
272
|
const issues = [...resourceIssues, ...inventory.issues];
|
|
300
|
-
const pagesComplete = inventoryPagesComplete(inventory);
|
|
301
273
|
const limitations = [
|
|
302
|
-
...(pagesComplete
|
|
303
|
-
? []
|
|
304
|
-
: [
|
|
305
|
-
"At least one caller-selected metadata page omits rows; use its offset and total to continue.",
|
|
306
|
-
]),
|
|
307
274
|
...(issues.length === 0
|
|
308
275
|
? []
|
|
309
276
|
: [
|
|
310
|
-
"At least one
|
|
277
|
+
"At least one metadata or resource item could not be read; coverage is partial.",
|
|
311
278
|
]),
|
|
312
279
|
"Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
|
|
313
280
|
];
|
|
@@ -331,7 +298,7 @@ export const inspectManagedArtifactBytes = (bytes, target, limits) => {
|
|
|
331
298
|
resources: inventory.resources,
|
|
332
299
|
attributes: inventory.attributes,
|
|
333
300
|
coverage: {
|
|
334
|
-
state:
|
|
301
|
+
state: issues.length === 0 ? "complete" : "partial",
|
|
335
302
|
issues,
|
|
336
303
|
},
|
|
337
304
|
limitations,
|