rea-agents 6.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +7 -7
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +105 -36
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +32 -41
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +19 -19
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
2
2
|
/** Content-address an artifact independently of where it was observed. */
|
|
3
|
-
export const artifactIdForContent = (sha256) => `art_${
|
|
3
|
+
export const artifactIdForContent = (sha256) => `art_${digestCanonicalValue({ sha256 }, "Artifact")}`;
|
|
4
4
|
/** Identify an occurrence by its root and exact logical location. */
|
|
5
5
|
export const occurrenceIdForLocation = (input) => input.logicalPath === "."
|
|
6
|
-
? `occ_${
|
|
7
|
-
: `occ_${
|
|
6
|
+
? `occ_${digestCanonicalValue({ root: input.rootArtifactId }, "Artifact")}`
|
|
7
|
+
: `occ_${digestCanonicalValue({
|
|
8
8
|
root_artifact_id: input.rootArtifactId,
|
|
9
9
|
logical_path: input.logicalPath,
|
|
10
10
|
entry_kind: input.entryKind,
|
|
11
11
|
}, "Artifact")}`;
|
|
12
12
|
/** Commit to graph members in the ordering established by the inventory owner. */
|
|
13
|
-
export const artifactGraphDigest = (input) =>
|
|
13
|
+
export const artifactGraphDigest = (input) => digestCanonicalValue({
|
|
14
14
|
nodes: input.nodes,
|
|
15
15
|
occurrences: input.occurrences,
|
|
16
16
|
edges: input.edges,
|
|
17
17
|
integrity_contradictions: input.contradictions,
|
|
18
18
|
}, "Artifact");
|
|
19
19
|
/** Bind a root artifact to its graph commitment. */
|
|
20
|
-
export const artifactManifestId = (rootArtifactId, graphSha256) => `agm_${
|
|
20
|
+
export const artifactManifestId = (rootArtifactId, graphSha256) => `agm_${digestCanonicalValue({ root_artifact_id: rootArtifactId, graph_sha256: graphSha256 }, "Artifact")}`;
|
|
21
21
|
/** Identify one integrity disagreement at its observed logical path. */
|
|
22
|
-
export const artifactContradictionId = (input) => `ic_${
|
|
22
|
+
export const artifactContradictionId = (input) => `ic_${digestCanonicalValue({
|
|
23
23
|
root_artifact_id: input.rootArtifactId,
|
|
24
24
|
logical_path: input.logicalPath,
|
|
25
25
|
declared_sha256: input.declaredSha256,
|
|
26
26
|
observed_sha256: input.observedSha256,
|
|
27
27
|
}, "Artifact")}`;
|
|
28
28
|
/** Identify an edge by its semantic relationship and exact occurrence. */
|
|
29
|
-
export const artifactEdgeId = (semantic) => `edge_${
|
|
29
|
+
export const artifactEdgeId = (semantic) => `edge_${digestCanonicalValue(semantic, "Artifact")}`;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { artifactInventoryResultSchema, } from "./artifactGraph.js";
|
|
3
|
-
import {
|
|
3
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
4
4
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
5
5
|
import { evidenceSchema, parseEvidence } from "./evidence.js";
|
|
6
6
|
import { jsonValueSchema } from "./jsonValue.js";
|
|
@@ -137,7 +137,7 @@ export const createArtifactInspection = (inventoryInput) => {
|
|
|
137
137
|
},
|
|
138
138
|
substeps: [
|
|
139
139
|
{
|
|
140
|
-
substep_id: `ais_${
|
|
140
|
+
substep_id: `ais_${digestCanonicalValue({
|
|
141
141
|
operation: "inventory_artifact",
|
|
142
142
|
evidence_id: inventoryEvidence.evidence_id,
|
|
143
143
|
}, "Artifact inspection")}`,
|
|
@@ -175,7 +175,7 @@ export const createArtifactInspection = (inventoryInput) => {
|
|
|
175
175
|
};
|
|
176
176
|
return artifactInspectionResultSchema.parse({
|
|
177
177
|
...semantic,
|
|
178
|
-
inspection_id: `ai_${
|
|
178
|
+
inspection_id: `ai_${digestCanonicalValue(semantic, "Artifact inspection")}`,
|
|
179
179
|
});
|
|
180
180
|
};
|
|
181
181
|
const parseInventoryEvidence = (input) => {
|
|
@@ -198,7 +198,7 @@ const observation = (kind, subject, value, evidenceId) => {
|
|
|
198
198
|
evidence_id: evidenceId,
|
|
199
199
|
};
|
|
200
200
|
return {
|
|
201
|
-
observation_id: `aio_${
|
|
201
|
+
observation_id: `aio_${digestCanonicalValue(semantic, "Artifact inspection")}`,
|
|
202
202
|
...semantic,
|
|
203
203
|
};
|
|
204
204
|
};
|
|
@@ -212,7 +212,7 @@ const allRelationships = (inventory, evidenceId) => inventory.edges.map((edge) =
|
|
|
212
212
|
evidence_id: evidenceId,
|
|
213
213
|
};
|
|
214
214
|
return {
|
|
215
|
-
relationship_id: `air_${
|
|
215
|
+
relationship_id: `air_${digestCanonicalValue(semantic, "Artifact inspection")}`,
|
|
216
216
|
...semantic,
|
|
217
217
|
};
|
|
218
218
|
});
|
|
@@ -234,7 +234,7 @@ const allHypotheses = (inventory, evidenceId) => {
|
|
|
234
234
|
limitation: "Format classification proposes a bounded follow-up; it is not semantic proof.",
|
|
235
235
|
};
|
|
236
236
|
return {
|
|
237
|
-
hypothesis_id: `aih_${
|
|
237
|
+
hypothesis_id: `aih_${digestCanonicalValue(semantic, "Artifact inspection")}`,
|
|
238
238
|
...semantic,
|
|
239
239
|
};
|
|
240
240
|
});
|
|
@@ -248,7 +248,7 @@ const contradictions = (inventory, evidenceId) => inventory.integrity_contradict
|
|
|
248
248
|
evidence_id: evidenceId,
|
|
249
249
|
};
|
|
250
250
|
return {
|
|
251
|
-
contradiction_id: `aic_${
|
|
251
|
+
contradiction_id: `aic_${digestCanonicalValue(semantic, "Artifact inspection")}`,
|
|
252
252
|
...semantic,
|
|
253
253
|
};
|
|
254
254
|
});
|
|
@@ -308,7 +308,7 @@ const branch = (reason, detail, nextProbe, evidenceId) => {
|
|
|
308
308
|
evidence_id: evidenceId,
|
|
309
309
|
};
|
|
310
310
|
return {
|
|
311
|
-
branch_id: `aib_${
|
|
311
|
+
branch_id: `aib_${digestCanonicalValue(semantic, "Artifact inspection")}`,
|
|
312
312
|
...semantic,
|
|
313
313
|
};
|
|
314
314
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { artifactInventoryResultSchema, } from "./artifactGraph.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
3
|
import { canonicalJson } from "./comparisonSemantics.js";
|
|
3
4
|
import { artifactContradictionId, artifactEdgeId, artifactGraphDigest, artifactIdForContent, artifactManifestId, occurrenceIdForLocation, } from "./artifactIdentity.js";
|
|
4
5
|
import { parseEvidence } from "./evidence.js";
|
|
5
6
|
import { artifactInspectionResultSchema } from "./artifactInspection.js";
|
|
6
|
-
import { err, ok } from "./result.js";
|
|
7
7
|
/** Parse, merge, and verify inventory Evidence pages. */
|
|
8
8
|
export const parseArtifactInventoryEvidence = (input) => assembleInventorySet((Array.isArray(input) ? input : [input]).map((value) => {
|
|
9
9
|
const evidence = parseEvidence(value);
|
|
@@ -33,17 +33,6 @@ const validateInventoryPage = (inventory) => {
|
|
|
33
33
|
if (node.artifact_id !== artifactIdForContent(node.sha256))
|
|
34
34
|
throw new TypeError("Artifact node ID is not content-addressed");
|
|
35
35
|
};
|
|
36
|
-
/**
|
|
37
|
-
* Result-returning seam for the empty-pages leaf. Other assembly failures
|
|
38
|
-
* still throw TypeError (migration in progress); parseArtifactInventoryEvidence
|
|
39
|
-
* keeps its throwing contract until callers switch.
|
|
40
|
-
*/
|
|
41
|
-
export const tryAssembleInventorySet = (pages) => pages.length === 0
|
|
42
|
-
? err({
|
|
43
|
-
code: "empty",
|
|
44
|
-
message: "Artifact inventory requires Evidence pages",
|
|
45
|
-
})
|
|
46
|
-
: ok(assembleInventorySet(pages));
|
|
47
36
|
const assembleInventorySet = (pages) => {
|
|
48
37
|
const first = pages[0];
|
|
49
38
|
if (first === undefined)
|
|
@@ -79,9 +68,9 @@ const assembleInventorySet = (pages) => {
|
|
|
79
68
|
return { evidence: pages.map(({ evidence }) => evidence), inventory };
|
|
80
69
|
};
|
|
81
70
|
const orderedInventory = (first, pages, values) => {
|
|
82
|
-
const nodes = [...values.nodes.values()].sort((left, right) => left.artifact_id
|
|
83
|
-
const occurrences = [...values.occurrences.values()].sort((left, right) => left.logical_path
|
|
84
|
-
const edges = [...values.edges.values()].sort((left, right) => left.edge_id
|
|
71
|
+
const nodes = [...values.nodes.values()].sort((left, right) => compareUnicodeCodePoints(left.artifact_id, right.artifact_id));
|
|
72
|
+
const occurrences = [...values.occurrences.values()].sort((left, right) => compareUnicodeCodePoints(left.logical_path, right.logical_path));
|
|
73
|
+
const edges = [...values.edges.values()].sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id));
|
|
85
74
|
return {
|
|
86
75
|
manifest: first.manifest,
|
|
87
76
|
nodes,
|
|
@@ -90,7 +79,7 @@ const orderedInventory = (first, pages, values) => {
|
|
|
90
79
|
integrityContradictions: first.integrity_contradictions,
|
|
91
80
|
limitations: [
|
|
92
81
|
...new Set(pages.flatMap(({ inventory }) => inventory.limitations)),
|
|
93
|
-
].sort(
|
|
82
|
+
].sort(compareUnicodeCodePoints),
|
|
94
83
|
complete: nodes.length === first.manifest.node_count &&
|
|
95
84
|
occurrences.length === first.manifest.occurrence_count &&
|
|
96
85
|
edges.length === first.manifest.edge_count,
|
|
@@ -102,6 +91,10 @@ const validateCompleteInventory = (inventory) => {
|
|
|
102
91
|
const rootNode = inventory.nodes.find(({ artifact_id: id }) => id === inventory.manifest.root_artifact_id);
|
|
103
92
|
if (rootNode?.sha256 !== inventory.manifest.root_sha256)
|
|
104
93
|
throw new TypeError("Artifact root node does not match its manifest digest");
|
|
94
|
+
const rootOccurrence = inventory.occurrences.find(({ logical_path }) => logical_path === ".");
|
|
95
|
+
if (rootOccurrence?.artifact_id !== inventory.manifest.root_artifact_id ||
|
|
96
|
+
rootOccurrence.artifact_format !== inventory.manifest.root_format)
|
|
97
|
+
throw new TypeError("Artifact root occurrence does not match its manifest representation");
|
|
105
98
|
for (const occurrence of inventory.occurrences)
|
|
106
99
|
validateOccurrence(occurrence, inventory, nodeIds, occurrenceIds);
|
|
107
100
|
for (const edge of inventory.edges)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnalysisError } from "./analysisErrorBase.js";
|
|
1
|
+
import { AnalysisError, } from "./analysisErrorBase.js";
|
|
2
2
|
/** Artifact inventory or extraction failed a typed safety boundary. */
|
|
3
3
|
export class ArtifactOperationError extends AnalysisError {
|
|
4
4
|
operation;
|
|
@@ -8,10 +8,10 @@ export class ArtifactOperationError extends AnalysisError {
|
|
|
8
8
|
_tag = "ArtifactOperationError";
|
|
9
9
|
constructor(operation, reason, artifactDetails,
|
|
10
10
|
/** The specific constraint that failed, such as the colliding path. */
|
|
11
|
-
detail) {
|
|
11
|
+
detail, options) {
|
|
12
12
|
super(artifactDetails === undefined
|
|
13
13
|
? `Artifact ${operation} failed: ${reason}`
|
|
14
|
-
: `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})
|
|
14
|
+
: `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})`, options);
|
|
15
15
|
this.operation = operation;
|
|
16
16
|
this.reason = reason;
|
|
17
17
|
this.artifactDetails = artifactDetails;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -24,3 +24,52 @@ export const stripQueryAndFragment = (value) => value.split("#", 1)[0]?.split("?
|
|
|
24
24
|
export const admitsCanonicalPathSyntax = (value) => !value.includes("\0") &&
|
|
25
25
|
!value.includes("\\") &&
|
|
26
26
|
!/%(?:2e|2f|5c)/iu.test(value);
|
|
27
|
+
/** C0 controls and space, which the URL parser strips around its input. */
|
|
28
|
+
const isUrlTrimmed = (code) => code <= 0x20;
|
|
29
|
+
/**
|
|
30
|
+
* The URL text a browser parses from an HTML URL attribute: HTML strips
|
|
31
|
+
* surrounding ASCII whitespace, and the URL parser strips surrounding C0
|
|
32
|
+
* controls and spaces and removes every tab and newline.
|
|
33
|
+
*/
|
|
34
|
+
export const htmlUrlText = (value) => {
|
|
35
|
+
let start = 0;
|
|
36
|
+
let end = value.length;
|
|
37
|
+
while (start < end && isUrlTrimmed(value.charCodeAt(start)))
|
|
38
|
+
start += 1;
|
|
39
|
+
while (end > start && isUrlTrimmed(value.charCodeAt(end - 1)))
|
|
40
|
+
end -= 1;
|
|
41
|
+
return value.slice(start, end).replace(/[\t\n\r]/gu, "");
|
|
42
|
+
};
|
|
43
|
+
const UTF8 = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
44
|
+
const UTF8_ENCODER = new TextEncoder();
|
|
45
|
+
/**
|
|
46
|
+
* Percent-decode a URL path as the URL standard does: valid `%XX` sequences
|
|
47
|
+
* become bytes and any other `%` stays literal. Returns null when the bytes
|
|
48
|
+
* are not UTF-8 or include NUL, because no canonical artifact path can match
|
|
49
|
+
* them. Callers refuse encoded dot and separator bytes before decoding.
|
|
50
|
+
*/
|
|
51
|
+
export const percentDecodeUrlPath = (value) => {
|
|
52
|
+
if (!/%[0-9a-f]{2}/iu.test(value))
|
|
53
|
+
return value;
|
|
54
|
+
const bytes = [];
|
|
55
|
+
for (let index = 0; index < value.length;) {
|
|
56
|
+
const escape = value.slice(index, index + 3);
|
|
57
|
+
if (/^%[0-9a-f]{2}$/iu.test(escape)) {
|
|
58
|
+
bytes.push(Number.parseInt(escape.slice(1), 16));
|
|
59
|
+
index += 3;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const character = String.fromCodePoint(value.codePointAt(index) ?? 0);
|
|
63
|
+
bytes.push(...UTF8_ENCODER.encode(character));
|
|
64
|
+
index += character.length;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const decoded = UTF8.decode(new Uint8Array(bytes));
|
|
68
|
+
return decoded.includes("\0") ? null : decoded;
|
|
69
|
+
}
|
|
70
|
+
catch (cause) {
|
|
71
|
+
// Invalid UTF-8 cannot name an inventoried path.
|
|
72
|
+
void cause;
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
@@ -7,32 +7,38 @@ import { mzWindowsHeaderOffset, parseDosMzHeader } from "./dosMz.js";
|
|
|
7
7
|
export const parseExecutableHeader = (bytes, hostArchitecture, fileSize = bytes.length) => {
|
|
8
8
|
if (bytes.length >= 4 &&
|
|
9
9
|
bytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46])))
|
|
10
|
-
return parseElf(bytes);
|
|
10
|
+
return parseElf(bytes, fileSize);
|
|
11
11
|
if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a)
|
|
12
12
|
return parseMz(bytes, fileSize);
|
|
13
13
|
if (bytes.length < 8)
|
|
14
14
|
return err("truncated or unsupported binary header");
|
|
15
15
|
const magic = bytes.readUInt32BE(0);
|
|
16
16
|
if ([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe].includes(magic))
|
|
17
|
-
return parseThinMachO(bytes, magic);
|
|
17
|
+
return parseThinMachO(bytes, magic, fileSize);
|
|
18
18
|
if ([0xcafebabe, 0xbebafeca, 0xcafebabf, 0xbfbafeca].includes(magic))
|
|
19
|
-
return parseFatMachO(bytes, magic, hostArchitecture);
|
|
19
|
+
return parseFatMachO(bytes, magic, hostArchitecture, fileSize);
|
|
20
20
|
return err("unsupported binary format");
|
|
21
21
|
};
|
|
22
|
-
const parseThinMachO = (bytes, magic) => {
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
const parseThinMachO = (bytes, magic, fileSize) => {
|
|
23
|
+
const is64 = magic === 0xfeedfacf || magic === 0xcffaedfe;
|
|
24
|
+
const headerSize = is64 ? 32 : 28;
|
|
25
|
+
if (bytes.length < headerSize)
|
|
26
|
+
return err(`truncated Mach-O header: a ${is64 ? 64 : 32}-bit header needs ${headerSize} bytes; the file has ${fileSize}`);
|
|
25
27
|
const little = magic === 0xcefaedfe || magic === 0xcffaedfe;
|
|
26
|
-
const
|
|
28
|
+
const read = (offset) => little ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset);
|
|
29
|
+
const architecture = machArchitecture(read(4));
|
|
27
30
|
if (architecture === undefined)
|
|
28
31
|
return err("unsupported Mach-O architecture");
|
|
32
|
+
const commandBytes = read(20);
|
|
33
|
+
if (headerSize + commandBytes > fileSize)
|
|
34
|
+
return err(`truncated Mach-O load commands: the header declares ${commandBytes} bytes after its ${headerSize}-byte header; the file has ${fileSize}`);
|
|
29
35
|
return ok({
|
|
30
36
|
format: "mach-o",
|
|
31
37
|
architecture,
|
|
32
38
|
availableArchitectures: [architecture],
|
|
33
39
|
});
|
|
34
40
|
};
|
|
35
|
-
const parseFatMachO = (bytes, magic, host) => {
|
|
41
|
+
const parseFatMachO = (bytes, magic, host, fileSize) => {
|
|
36
42
|
const little = magic === 0xbebafeca || magic === 0xbfbafeca;
|
|
37
43
|
const is64 = magic === 0xcafebabf || magic === 0xbfbafeca;
|
|
38
44
|
if (bytes.length < 8)
|
|
@@ -43,10 +49,24 @@ const parseFatMachO = (bytes, magic, host) => {
|
|
|
43
49
|
if (count === 0 || count > 128 || bytes.length < 8 + count * entrySize)
|
|
44
50
|
return err("truncated or invalid FAT architecture table");
|
|
45
51
|
const architectures = [];
|
|
52
|
+
const sliceEnds = new Map();
|
|
46
53
|
for (let index = 0; index < count; index += 1) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
54
|
+
const entry = 8 + index * entrySize;
|
|
55
|
+
const architecture = machArchitecture(read(entry));
|
|
56
|
+
if (architecture === undefined || architectures.includes(architecture))
|
|
57
|
+
continue;
|
|
58
|
+
architectures.push(architecture);
|
|
59
|
+
const offset = is64
|
|
60
|
+
? little
|
|
61
|
+
? bytes.readBigUInt64LE(entry + 8)
|
|
62
|
+
: bytes.readBigUInt64BE(entry + 8)
|
|
63
|
+
: BigInt(read(entry + 8));
|
|
64
|
+
const size = is64
|
|
65
|
+
? little
|
|
66
|
+
? bytes.readBigUInt64LE(entry + 16)
|
|
67
|
+
: bytes.readBigUInt64BE(entry + 16)
|
|
68
|
+
: BigInt(read(entry + 12));
|
|
69
|
+
sliceEnds.set(architecture, offset + size);
|
|
50
70
|
}
|
|
51
71
|
const preferred = host === "arm64"
|
|
52
72
|
? "arm64"
|
|
@@ -59,20 +79,26 @@ const parseFatMachO = (bytes, magic, host) => {
|
|
|
59
79
|
: undefined;
|
|
60
80
|
if (preferred === undefined || !architectures.includes(preferred))
|
|
61
81
|
return err(`FAT binary has no host-compatible ${host} architecture`);
|
|
82
|
+
const sliceEnd = sliceEnds.get(preferred) ?? 0n;
|
|
83
|
+
if (sliceEnd > BigInt(fileSize))
|
|
84
|
+
return err(`truncated FAT slice: the ${preferred} slice ends at byte ${sliceEnd}; the file has ${fileSize}`);
|
|
62
85
|
return ok({
|
|
63
86
|
format: "mach-o",
|
|
64
87
|
architecture: preferred,
|
|
65
88
|
availableArchitectures: architectures,
|
|
66
89
|
});
|
|
67
90
|
};
|
|
68
|
-
const parseElf = (bytes) => {
|
|
69
|
-
if (bytes.length <
|
|
91
|
+
const parseElf = (bytes, fileSize) => {
|
|
92
|
+
if (bytes.length < 6)
|
|
70
93
|
return err("truncated ELF header");
|
|
71
94
|
if (bytes[4] !== 1 && bytes[4] !== 2)
|
|
72
95
|
return err("unsupported ELF class");
|
|
73
96
|
const little = bytes[5] === 1;
|
|
74
97
|
if (!little && bytes[5] !== 2)
|
|
75
98
|
return err("unsupported ELF endianness");
|
|
99
|
+
const headerSize = bytes[4] === 1 ? 52 : 64;
|
|
100
|
+
if (bytes.length < headerSize)
|
|
101
|
+
return err(`truncated ELF header: an ELF${bytes[4] === 1 ? 32 : 64} header needs ${headerSize} bytes; the file has ${fileSize}`);
|
|
76
102
|
const machine = little ? bytes.readUInt16LE(18) : bytes.readUInt16BE(18);
|
|
77
103
|
const architecture = elfArchitecture(machine);
|
|
78
104
|
if (architecture === undefined)
|
|
@@ -1,41 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
import { compareWebCaptures
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
.describe("Later passive web-page capture."),
|
|
13
|
-
before_scenario: compareBrowserScenariosInputSchema.shape.before_scenario
|
|
14
|
-
.optional()
|
|
15
|
-
.describe("Earlier browser scenario capture."),
|
|
16
|
-
after_scenario: compareBrowserScenariosInputSchema.shape.after_scenario
|
|
17
|
-
.optional()
|
|
18
|
-
.describe("Later browser scenario capture."),
|
|
19
|
-
normalization: compareBrowserScenariosInputSchema.shape.normalization
|
|
20
|
-
.unwrap()
|
|
21
|
-
.optional()
|
|
22
|
-
.describe("Exact-literal normalization policy."),
|
|
23
|
-
})
|
|
24
|
-
.superRefine((input, context) => {
|
|
25
|
-
const passive = input.before !== undefined && input.after !== undefined;
|
|
26
|
-
const scenario = input.before_scenario !== undefined && input.after_scenario !== undefined;
|
|
27
|
-
const passiveFieldsPresent = input.before !== undefined || input.after !== undefined;
|
|
28
|
-
const scenarioFieldsPresent = input.before_scenario !== undefined ||
|
|
29
|
-
input.after_scenario !== undefined ||
|
|
30
|
-
input.normalization !== undefined;
|
|
31
|
-
if (passive && !scenarioFieldsPresent)
|
|
32
|
-
return;
|
|
33
|
-
if (scenario && !passiveFieldsPresent)
|
|
34
|
-
return;
|
|
35
|
-
context.addIssue({
|
|
36
|
-
code: "custom",
|
|
37
|
-
message: "Provide before and after passive captures, or before_scenario, after_scenario, and normalization; do not mix comparison types.",
|
|
38
|
-
});
|
|
2
|
+
import { compareBrowserScenarios } from "./browserScenarioDiff.js";
|
|
3
|
+
import { compareWebCaptures } from "./webCaptureDiff.js";
|
|
4
|
+
import { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
|
|
5
|
+
import { compareWebCapturesInputSchema, webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
6
|
+
/** Mutually exclusive passive and scenario capture comparison inputs. */
|
|
7
|
+
export const browserCaptureComparisonInputSchema = z.union([compareWebCapturesInputSchema, compareBrowserScenariosInputSchema], {
|
|
8
|
+
// Standard Schema clients expose the union message, not its branch errors.
|
|
9
|
+
error: (issue) => issue.code === "invalid_union"
|
|
10
|
+
? z.prettifyError(new z.ZodError(issue.errors.flat()))
|
|
11
|
+
: undefined,
|
|
39
12
|
});
|
|
40
13
|
/** Result from passive page or browser scenario comparison. */
|
|
41
14
|
export const browserCaptureComparisonSchema = z.union([
|
|
@@ -43,15 +16,6 @@ export const browserCaptureComparisonSchema = z.union([
|
|
|
43
16
|
webCaptureDiffSchema,
|
|
44
17
|
]);
|
|
45
18
|
/** Dispatch a parsed capture comparison to its pure domain comparator. */
|
|
46
|
-
export const compareBrowserCaptures = (input) =>
|
|
47
|
-
? compareBrowserScenarios(
|
|
48
|
-
|
|
49
|
-
normalization: input.normalization ?? { rules: [] },
|
|
50
|
-
})
|
|
51
|
-
: compareWebCaptures(toPassiveComparison(input));
|
|
52
|
-
const isScenarioComparison = (input) => input.before_scenario !== undefined && input.after_scenario !== undefined;
|
|
53
|
-
const toPassiveComparison = (input) => {
|
|
54
|
-
if (input.before === undefined || input.after === undefined)
|
|
55
|
-
throw new Error("Validated passive comparison is missing a capture");
|
|
56
|
-
return { before: input.before, after: input.after };
|
|
57
|
-
};
|
|
19
|
+
export const compareBrowserCaptures = (input) => "before_scenario" in input
|
|
20
|
+
? compareBrowserScenarios(input)
|
|
21
|
+
: compareWebCaptures(input);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
3
|
/** Stable browser sections used by coverage and omission accounting. */
|
|
3
4
|
const browserSectionSchema = z.enum([
|
|
4
5
|
"frames",
|
|
@@ -98,5 +99,5 @@ export const classifyBrowserCompleteness = (input) => {
|
|
|
98
99
|
});
|
|
99
100
|
};
|
|
100
101
|
const sortedSections = (sections) => [...sections].sort();
|
|
101
|
-
const canonicalExclusions = (exclusions) => [...exclusions].sort((left, right) => left.section
|
|
102
|
-
left.reason
|
|
102
|
+
const canonicalExclusions = (exclusions) => [...exclusions].sort((left, right) => compareUnicodeCodePoints(left.section, right.section) ||
|
|
103
|
+
compareUnicodeCodePoints(left.reason, right.reason));
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
/**
|
|
3
|
+
/** Resolved network content selection recorded by a capture. */
|
|
4
4
|
export const browserNetworkContentSelectionValuesSchema = z.strictObject({
|
|
5
|
+
request_body: z.boolean(),
|
|
6
|
+
response_body: z.boolean(),
|
|
7
|
+
header_values: z.boolean(),
|
|
8
|
+
});
|
|
9
|
+
/** Caller omission selects metadata alone; individual content facets remain optional. */
|
|
10
|
+
export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema
|
|
11
|
+
.extend({
|
|
5
12
|
request_body: z.boolean().default(false),
|
|
6
13
|
response_body: z.boolean().default(false),
|
|
7
14
|
header_values: z.boolean().default(false),
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema.default({
|
|
15
|
+
})
|
|
16
|
+
.default({
|
|
11
17
|
request_body: false,
|
|
12
18
|
response_body: false,
|
|
13
19
|
header_values: false,
|
|
@@ -81,9 +81,20 @@ const browserScriptSchema = z.object({
|
|
|
81
81
|
frame_id: z.string().nullable().default(null),
|
|
82
82
|
url: z.string(),
|
|
83
83
|
origin: z.string().nullable(),
|
|
84
|
-
cdp_hash: z
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
cdp_hash: z
|
|
85
|
+
.string()
|
|
86
|
+
.nullable()
|
|
87
|
+
.describe("Producer-reported script hash; null when unavailable."),
|
|
88
|
+
length: z
|
|
89
|
+
.number()
|
|
90
|
+
.int()
|
|
91
|
+
.min(0)
|
|
92
|
+
.nullable()
|
|
93
|
+
.describe("Producer-reported script length; null when unavailable."),
|
|
94
|
+
is_module: z
|
|
95
|
+
.boolean()
|
|
96
|
+
.nullable()
|
|
97
|
+
.describe("Producer-reported module classification; null when unavailable."),
|
|
87
98
|
language: z.string().nullable(),
|
|
88
99
|
source_map_url: z.string().nullable(),
|
|
89
100
|
resource_reconciliation: browserResourceReconciliationSchema,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { browserScenarioActionSchema, browserScenarioBrowserSchema, browserScenarioCaptureSchema, browserScenarioEnvironmentSchema, browserScenarioSecretSchema, browserScenarioStorageSchema, browserScenarioUrlSchema, } from "./browserScenarioValues.js";
|
|
3
|
-
export {} from "./browserScenarioValues.js";
|
|
4
3
|
export const browserScenarioInputSchema = z.strictObject({
|
|
5
4
|
browser: browserScenarioBrowserSchema.describe("Required launch/connect selection. Launch uses the selected executable and an owned temporary profile; connect uses one loopback CDP endpoint and target."),
|
|
6
5
|
start_url: browserScenarioUrlSchema.describe("Required initial HTTP(S) URL. Query values must be declared separately as public literals or secret references."),
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { browserNetworkContentSelectionValuesSchema } from "./browserNetworkEvidence.js";
|
|
3
3
|
import { browserScenarioCompletenessSchema, browserScenarioEventSchema, browserScenarioStepSchema, } from "./browserScenarioCaptureValues.js";
|
|
4
|
-
export { classifyBrowserScenarioCompleteness, browserScenarioEventSchema, browserScenarioStepSchema, browserStepArtifactsSchema, } from "./browserScenarioCaptureValues.js";
|
|
5
4
|
/** Step-indexed browser scenario observation. */
|
|
6
5
|
export const browserScenarioCaptureSchema = z
|
|
7
6
|
.strictObject({
|
|
@@ -16,7 +15,7 @@ export const browserScenarioCaptureSchema = z
|
|
|
16
15
|
start_origin: z.string().min(1),
|
|
17
16
|
action_count: z.number().int().min(1),
|
|
18
17
|
secret_references: z.array(z.string().min(1)),
|
|
19
|
-
network_content: browserNetworkContentSelectionValuesSchema
|
|
18
|
+
network_content: browserNetworkContentSelectionValuesSchema,
|
|
20
19
|
}),
|
|
21
20
|
duration_ms: z.number().int().min(0),
|
|
22
21
|
steps: z.array(browserScenarioStepSchema).min(1),
|
|
@@ -103,8 +103,8 @@ const eventBase = {
|
|
|
103
103
|
const eventUrl = sanitizedBrowserUrlSchema.nullable();
|
|
104
104
|
const networkEventShape = {
|
|
105
105
|
...eventBase,
|
|
106
|
-
transaction_id: z.string().min(1)
|
|
107
|
-
redirected_from_transaction_id: z.string().min(1).nullable()
|
|
106
|
+
transaction_id: z.string().min(1),
|
|
107
|
+
redirected_from_transaction_id: z.string().min(1).nullable(),
|
|
108
108
|
method: z.string().min(1),
|
|
109
109
|
url: sanitizedBrowserUrlSchema,
|
|
110
110
|
resource_type: z.string().min(1),
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {} from "./browserScenarioCapture.js";
|
|
2
1
|
import { actionState, artifactEvidenceState, captured, eventEvidenceState, eventsFor, networkContentCoverageReason, screenshotProjection, } from "./browserScenarioDiffEvidence.js";
|
|
3
2
|
import { browserScenarioDiffSchema, } from "./browserScenarioDiffValues.js";
|
|
4
3
|
import { commitBrowserScenarioNormalization, digestNormalizedScenarioValue, } from "./browserScenarioNormalization.js";
|
|
5
|
-
export { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
|
|
6
4
|
/** Compare scenario steps by stable step ID and apply only committed literal rules. */
|
|
7
5
|
export const compareBrowserScenarios = (input) => {
|
|
8
6
|
const normalization = commitBrowserScenarioNormalization(input.normalization);
|
|
@@ -54,18 +54,6 @@ export const eventsFor = (capture, stepIndex) => {
|
|
|
54
54
|
export const networkContentCoverageReason = (before, after) => {
|
|
55
55
|
const left = before.scenario.network_content;
|
|
56
56
|
const right = after.scenario.network_content;
|
|
57
|
-
if (left === undefined || right === undefined) {
|
|
58
|
-
const events = [...before.events.items, ...after.events.items];
|
|
59
|
-
if (events.some((event) => event.kind === "network-content") ||
|
|
60
|
-
((left === undefined) !== (right === undefined) &&
|
|
61
|
-
events.some((event) => event.kind === "request" ||
|
|
62
|
-
event.kind === "response" ||
|
|
63
|
-
event.kind === "request-failed" ||
|
|
64
|
-
event.kind === "request-finished" ||
|
|
65
|
-
event.kind === "request-unfinished")))
|
|
66
|
-
return "Network content selection is unknown in a legacy capture; capture both sides with matching content selection.";
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
57
|
return left.request_body !== right.request_body ||
|
|
70
58
|
left.response_body !== right.response_body ||
|
|
71
59
|
left.header_values !== right.header_values
|
|
@@ -62,8 +62,8 @@ const normalizationInputSchema = z
|
|
|
62
62
|
});
|
|
63
63
|
/** Input for step-aligned comparison of two browser scenario captures. */
|
|
64
64
|
export const compareBrowserScenariosInputSchema = z.strictObject({
|
|
65
|
-
before_scenario: browserScenarioCaptureSchema.describe("Earlier complete capture_browser_scenario
|
|
66
|
-
after_scenario: browserScenarioCaptureSchema.describe("Later complete capture_browser_scenario
|
|
65
|
+
before_scenario: browserScenarioCaptureSchema.describe("Earlier complete normalized_result from capture_browser_scenario."),
|
|
66
|
+
after_scenario: browserScenarioCaptureSchema.describe("Later complete normalized_result from capture_browser_scenario."),
|
|
67
67
|
normalization: normalizationInputSchema
|
|
68
68
|
.default({ rules: [] })
|
|
69
69
|
.describe("Exact-literal rules committed in the comparison result."),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
2
2
|
const BUILT_IN_RULES = [
|
|
3
3
|
"ignore_step_elapsed_ms",
|
|
4
4
|
"ignore_event_sequence",
|
|
@@ -17,11 +17,11 @@ export const commitBrowserScenarioNormalization = (input) => {
|
|
|
17
17
|
const commitment = { built_in_rules: [...BUILT_IN_RULES], rules };
|
|
18
18
|
return {
|
|
19
19
|
...commitment,
|
|
20
|
-
sha256:
|
|
20
|
+
sha256: digestCanonicalValue(commitment, "Browser scenario"),
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
23
|
/** Digest one artifact after applying committed exact-literal rules. */
|
|
24
|
-
export const digestNormalizedScenarioValue = (value, artifact, rules) =>
|
|
24
|
+
export const digestNormalizedScenarioValue = (value, artifact, rules) => digestCanonicalValue(normalize(value, artifact, rules), "Browser scenario");
|
|
25
25
|
const normalize = (value, artifact, rules) => {
|
|
26
26
|
if (artifact === "screenshot")
|
|
27
27
|
return value;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
4
|
+
import { localPathStringSchema } from "./localPath.js";
|
|
3
5
|
import { browserNetworkContentSelectionSchema } from "./browserNetworkEvidence.js";
|
|
4
6
|
import { browserEndpointSchema, browserOriginSchema, } from "./browserObservation.js";
|
|
5
|
-
export const scenarioIdentifierSchema = z
|
|
6
|
-
|
|
7
|
-
.regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
|
|
8
|
-
const browserExecutablePathSchema = localPathStringSchema.refine(isAbsoluteLocalPath, {
|
|
7
|
+
export const scenarioIdentifierSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
|
+
const browserExecutablePathSchema = localPathStringSchema.refine(isAbsolute, {
|
|
9
9
|
message: "executable_path must be an absolute local filesystem path (for example /opt/chromium/chrome or C:\\chromium\\chrome.exe)",
|
|
10
10
|
});
|
|
11
11
|
const browserScenarioBaseUrlSchema = z
|
|
@@ -84,7 +84,7 @@ export const browserScenarioEnvironmentSchema = z
|
|
|
84
84
|
timezone: z
|
|
85
85
|
.string()
|
|
86
86
|
.min(1)
|
|
87
|
-
.regex(/^[A-Za-z0-9_
|
|
87
|
+
.regex(/^[A-Za-z0-9_+\x2d]+(?:\x2f[A-Za-z0-9_+\x2d]+)*$/u)
|
|
88
88
|
.default("UTC"),
|
|
89
89
|
color_scheme: z.enum(["light", "dark", "no-preference"]).default("light"),
|
|
90
90
|
reduced_motion: z.enum(["reduce", "no-preference"]).default("reduce"),
|