rea-agents 6.0.0 → 6.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 +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- 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 +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -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 +2 -2
- 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 +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- 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 +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -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/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- 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/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -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/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- 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 +3 -5
- 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/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -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 +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- 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 +157 -0
- package/dist/server/createServer.js +61 -41
- 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 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- 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 +1 -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 +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- 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 +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- 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 +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- 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/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -55,6 +55,19 @@ const artifactFormatSchema = z.enum([
|
|
|
55
55
|
"file",
|
|
56
56
|
"unknown",
|
|
57
57
|
]);
|
|
58
|
+
/** Formats established from bytes or a virtual directory tree, independent of path roles. */
|
|
59
|
+
const artifactContentFormatSchema = artifactFormatSchema.extract([
|
|
60
|
+
"zip",
|
|
61
|
+
"mach-o-universal",
|
|
62
|
+
"mach-o",
|
|
63
|
+
"elf",
|
|
64
|
+
"pe",
|
|
65
|
+
"dos-mz",
|
|
66
|
+
"plist",
|
|
67
|
+
"directory",
|
|
68
|
+
"file",
|
|
69
|
+
"unknown",
|
|
70
|
+
]);
|
|
58
71
|
/** File byte interval for an artifact derived without writing it to disk. */
|
|
59
72
|
const artifactByteRangeSchema = z.object({
|
|
60
73
|
offset: z.number().int().min(0),
|
|
@@ -72,13 +85,11 @@ const artifactCommandSchema = z.object({
|
|
|
72
85
|
/** One content-addressed application artifact in deterministic manifest order. */
|
|
73
86
|
const artifactNodeSchema = z.object({
|
|
74
87
|
artifact_id: artifactIdSchema,
|
|
75
|
-
|
|
76
|
-
format: artifactFormatSchema,
|
|
88
|
+
format: artifactContentFormatSchema,
|
|
77
89
|
sha256: sha256Schema,
|
|
78
90
|
size: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
|
|
79
91
|
media_type: z.string().min(1).nullable(),
|
|
80
92
|
architecture: z.string().min(1).nullable(),
|
|
81
|
-
executable: z.boolean(),
|
|
82
93
|
content_state: z.enum(["materialized", "embedded", "virtual"]),
|
|
83
94
|
limitations: z.array(z.string()),
|
|
84
95
|
});
|
|
@@ -89,6 +100,8 @@ const artifactOccurrenceSchema = z.object({
|
|
|
89
100
|
parent_occurrence_id: occurrenceIdSchema.nullable(),
|
|
90
101
|
logical_path: boundedRelativePathSchema,
|
|
91
102
|
entry_kind: z.enum(["file", "directory", "symlink", "slice"]),
|
|
103
|
+
artifact_kind: artifactKindSchema,
|
|
104
|
+
artifact_format: artifactFormatSchema,
|
|
92
105
|
declared_size: z
|
|
93
106
|
.number()
|
|
94
107
|
.int()
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { canonicalDigest } from "./comparisonSemantics.js";
|
|
2
|
+
/** Content-address an artifact independently of where it was observed. */
|
|
3
|
+
export const artifactIdForContent = (sha256) => `art_${canonicalDigest({ sha256 }, "Artifact")}`;
|
|
4
|
+
/** Identify an occurrence by its root and exact logical location. */
|
|
5
|
+
export const occurrenceIdForLocation = (input) => input.logicalPath === "."
|
|
6
|
+
? `occ_${canonicalDigest({ root: input.rootArtifactId }, "Artifact")}`
|
|
7
|
+
: `occ_${canonicalDigest({
|
|
8
|
+
root_artifact_id: input.rootArtifactId,
|
|
9
|
+
logical_path: input.logicalPath,
|
|
10
|
+
entry_kind: input.entryKind,
|
|
11
|
+
}, "Artifact")}`;
|
|
12
|
+
/** Commit to graph members in the ordering established by the inventory owner. */
|
|
13
|
+
export const artifactGraphDigest = (input) => canonicalDigest({
|
|
14
|
+
nodes: input.nodes,
|
|
15
|
+
occurrences: input.occurrences,
|
|
16
|
+
edges: input.edges,
|
|
17
|
+
integrity_contradictions: input.contradictions,
|
|
18
|
+
}, "Artifact");
|
|
19
|
+
/** Bind a root artifact to its graph commitment. */
|
|
20
|
+
export const artifactManifestId = (rootArtifactId, graphSha256) => `agm_${canonicalDigest({ root_artifact_id: rootArtifactId, graph_sha256: graphSha256 }, "Artifact")}`;
|
|
21
|
+
/** Identify one integrity disagreement at its observed logical path. */
|
|
22
|
+
export const artifactContradictionId = (input) => `ic_${canonicalDigest({
|
|
23
|
+
root_artifact_id: input.rootArtifactId,
|
|
24
|
+
logical_path: input.logicalPath,
|
|
25
|
+
declared_sha256: input.declaredSha256,
|
|
26
|
+
observed_sha256: input.observedSha256,
|
|
27
|
+
}, "Artifact")}`;
|
|
28
|
+
/** Identify an edge by its semantic relationship and exact occurrence. */
|
|
29
|
+
export const artifactEdgeId = (semantic) => `edge_${canonicalDigest(semantic, "Artifact")}`;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { artifactInventoryResultSchema, } from "./artifactGraph.js";
|
|
2
|
-
import {
|
|
2
|
+
import { compareCodePoints } from "./canonicalOrdering.js";
|
|
3
|
+
import { canonicalJson } from "./comparisonSemantics.js";
|
|
4
|
+
import { artifactContradictionId, artifactEdgeId, artifactGraphDigest, artifactIdForContent, artifactManifestId, occurrenceIdForLocation, } from "./artifactIdentity.js";
|
|
3
5
|
import { parseEvidence } from "./evidence.js";
|
|
4
6
|
import { artifactInspectionResultSchema } from "./artifactInspection.js";
|
|
5
|
-
import { err, ok } from "./result.js";
|
|
6
7
|
/** Parse, merge, and verify inventory Evidence pages. */
|
|
7
8
|
export const parseArtifactInventoryEvidence = (input) => assembleInventorySet((Array.isArray(input) ? input : [input]).map((value) => {
|
|
8
9
|
const evidence = parseEvidence(value);
|
|
@@ -29,21 +30,9 @@ const validateInventoryPage = (inventory) => {
|
|
|
29
30
|
assertUnique(inventory.occurrences.map(({ logical_path: path }) => path), "logical path");
|
|
30
31
|
assertUnique(inventory.edges.map(({ edge_id: id }) => id), "edge ID");
|
|
31
32
|
for (const node of inventory.nodes)
|
|
32
|
-
if (node.artifact_id !==
|
|
33
|
-
`art_${canonicalDigest({ sha256: node.sha256 }, "Artifact inventory")}`)
|
|
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) => compareCodePoints(left.artifact_id, right.artifact_id));
|
|
72
|
+
const occurrences = [...values.occurrences.values()].sort((left, right) => compareCodePoints(left.logical_path, right.logical_path));
|
|
73
|
+
const edges = [...values.edges.values()].sort((left, right) => compareCodePoints(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(compareCodePoints),
|
|
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)
|
|
@@ -110,27 +103,24 @@ const validateCompleteInventory = (inventory) => {
|
|
|
110
103
|
if (!nodeIds.has(contradiction.parent_artifact_id) ||
|
|
111
104
|
!occurrenceIds.has(contradiction.occurrence_id))
|
|
112
105
|
throw new TypeError("Integrity contradiction references a missing graph member");
|
|
113
|
-
const expectedId =
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
106
|
+
const expectedId = artifactContradictionId({
|
|
107
|
+
rootArtifactId: inventory.manifest.root_artifact_id,
|
|
108
|
+
logicalPath: contradiction.logical_path,
|
|
109
|
+
declaredSha256: contradiction.declared_sha256,
|
|
110
|
+
observedSha256: contradiction.observed_sha256,
|
|
111
|
+
});
|
|
119
112
|
if (contradiction.contradiction_id !== expectedId)
|
|
120
113
|
throw new TypeError("Integrity contradiction ID does not match its identity");
|
|
121
114
|
}
|
|
122
|
-
const graphSha256 =
|
|
115
|
+
const graphSha256 = artifactGraphDigest({
|
|
123
116
|
nodes: inventory.nodes,
|
|
124
117
|
occurrences: inventory.occurrences,
|
|
125
118
|
edges: inventory.edges,
|
|
126
|
-
|
|
127
|
-
}
|
|
119
|
+
contradictions: inventory.integrityContradictions,
|
|
120
|
+
});
|
|
128
121
|
if (graphSha256 !== inventory.manifest.graph_sha256)
|
|
129
122
|
throw new TypeError("Artifact graph commitment does not match its members");
|
|
130
|
-
const manifestId =
|
|
131
|
-
root_artifact_id: inventory.manifest.root_artifact_id,
|
|
132
|
-
graph_sha256: graphSha256,
|
|
133
|
-
}, "Artifact inventory")}`;
|
|
123
|
+
const manifestId = artifactManifestId(inventory.manifest.root_artifact_id, graphSha256);
|
|
134
124
|
if (manifestId !== inventory.manifest.manifest_id)
|
|
135
125
|
throw new TypeError("Artifact manifest ID does not match its commitment");
|
|
136
126
|
};
|
|
@@ -140,13 +130,11 @@ const validateOccurrence = (occurrence, inventory, nodeIds, occurrenceIds) => {
|
|
|
140
130
|
if (occurrence.parent_occurrence_id !== null &&
|
|
141
131
|
!occurrenceIds.has(occurrence.parent_occurrence_id))
|
|
142
132
|
throw new TypeError("Artifact occurrence references a missing parent");
|
|
143
|
-
const expectedId =
|
|
144
|
-
|
|
145
|
-
:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
entry_kind: occurrence.entry_kind,
|
|
149
|
-
}, "Artifact inventory")}`;
|
|
133
|
+
const expectedId = occurrenceIdForLocation({
|
|
134
|
+
rootArtifactId: inventory.manifest.root_artifact_id,
|
|
135
|
+
logicalPath: occurrence.logical_path,
|
|
136
|
+
entryKind: occurrence.entry_kind,
|
|
137
|
+
});
|
|
150
138
|
if (occurrence.occurrence_id !== expectedId)
|
|
151
139
|
throw new TypeError("Artifact occurrence ID does not match its identity");
|
|
152
140
|
};
|
|
@@ -162,7 +150,7 @@ const validateEdge = (edge, nodeIds, occurrenceIds) => {
|
|
|
162
150
|
occurrence_id: edge.occurrence_id,
|
|
163
151
|
logical_path: edge.logical_path,
|
|
164
152
|
};
|
|
165
|
-
if (edge.edge_id !==
|
|
153
|
+
if (edge.edge_id !== artifactEdgeId(semantic))
|
|
166
154
|
throw new TypeError("Artifact edge ID does not match its identity");
|
|
167
155
|
};
|
|
168
156
|
const mergeExact = (output, key, value, label) => {
|
|
@@ -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)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** Coverage metadata for the bounded projection of candidate relationships. */
|
|
3
|
+
export const bridgeCandidateCoverageSchema = z.strictObject({
|
|
4
|
+
status: z.enum(["complete", "partial"]),
|
|
5
|
+
total_candidates: z.number().int().nonnegative(),
|
|
6
|
+
emitted_candidates: z.number().int().nonnegative(),
|
|
7
|
+
omitted_candidates: z.number().int().nonnegative(),
|
|
8
|
+
});
|
|
9
|
+
// The serialized candidate array is the retained representation; accounting
|
|
10
|
+
// its exact UTF-8 JSON size bounds both array objects and repeated path strings.
|
|
11
|
+
/** Maximum UTF-8 JSON size of a retained candidate array. */
|
|
12
|
+
export const MAX_BRIDGE_CANDIDATE_JSON_BYTES = 2 * 1024 * 1024;
|
|
13
|
+
const jsonText = (value) => {
|
|
14
|
+
const serialized = JSON.stringify(value);
|
|
15
|
+
if (serialized === undefined)
|
|
16
|
+
throw new TypeError("Bridge candidate is not JSON serializable");
|
|
17
|
+
return serialized;
|
|
18
|
+
};
|
|
19
|
+
/** Retain a deterministic prefix of grouped Cartesian candidates within a byte budget. */
|
|
20
|
+
export const projectCartesianCandidates = (input) => {
|
|
21
|
+
const total = input.groups.reduce((sum, group) => sum + group.left.length * group.right.length, 0);
|
|
22
|
+
const preparedGroups = input.groups.map((group) => ({
|
|
23
|
+
left: group.left.map((value) => ({
|
|
24
|
+
value,
|
|
25
|
+
pathBytes: Buffer.byteLength(jsonText(value.path)),
|
|
26
|
+
})),
|
|
27
|
+
right: group.right.map((value) => {
|
|
28
|
+
const emptyLeftCandidate = jsonText(input.createCandidate("", value));
|
|
29
|
+
return {
|
|
30
|
+
value,
|
|
31
|
+
rowOverhead: Buffer.byteLength(emptyLeftCandidate) - 2,
|
|
32
|
+
};
|
|
33
|
+
}),
|
|
34
|
+
}));
|
|
35
|
+
let estimatedFullBytes = 2 + Math.max(0, total - 1); // JSON array brackets and commas.
|
|
36
|
+
for (const group of preparedGroups) {
|
|
37
|
+
estimatedFullBytes +=
|
|
38
|
+
group.left.length *
|
|
39
|
+
group.right.reduce((sum, { rowOverhead }) => sum + rowOverhead, 0) +
|
|
40
|
+
group.right.length *
|
|
41
|
+
group.left.reduce((sum, { pathBytes }) => sum + pathBytes, 0);
|
|
42
|
+
}
|
|
43
|
+
const shouldEmitAll = estimatedFullBytes <= MAX_BRIDGE_CANDIDATE_JSON_BYTES;
|
|
44
|
+
const candidates = [];
|
|
45
|
+
let estimatedRetainedBytes = 2;
|
|
46
|
+
candidateLoop: for (const group of preparedGroups) {
|
|
47
|
+
for (const left of group.left) {
|
|
48
|
+
for (const right of group.right) {
|
|
49
|
+
const candidateBytes = right.rowOverhead + left.pathBytes;
|
|
50
|
+
const additionalBytes = candidateBytes + (candidates.length > 0 ? 1 : 0);
|
|
51
|
+
if (!shouldEmitAll &&
|
|
52
|
+
estimatedRetainedBytes + additionalBytes >
|
|
53
|
+
MAX_BRIDGE_CANDIDATE_JSON_BYTES)
|
|
54
|
+
break candidateLoop;
|
|
55
|
+
candidates.push(input.createCandidate(left.value.path, right.value));
|
|
56
|
+
estimatedRetainedBytes += additionalBytes;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
candidates,
|
|
62
|
+
coverage: {
|
|
63
|
+
status: candidates.length === total
|
|
64
|
+
? "complete"
|
|
65
|
+
: "partial",
|
|
66
|
+
total_candidates: total,
|
|
67
|
+
emitted_candidates: candidates.length,
|
|
68
|
+
omitted_candidates: total - candidates.length,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
};
|
|
@@ -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,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,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnalysisError } from "./analysisErrorBase.js";
|
|
1
|
+
import { AnalysisError, } from "./analysisErrorBase.js";
|
|
2
2
|
import { AnalysisCancelledError } from "./analysisErrorCore.js";
|
|
3
3
|
/** A bounded passive browser observation failed at its CDP boundary. */
|
|
4
4
|
export class BrowserObservationError extends AnalysisError {
|
|
@@ -13,13 +13,32 @@ export class BrowserObservationError extends AnalysisError {
|
|
|
13
13
|
super(`Browser observation ${operation} failed: ${reason}`, options);
|
|
14
14
|
this.operation = operation;
|
|
15
15
|
this.reason = reason;
|
|
16
|
-
this.userMessage =
|
|
17
|
-
|
|
16
|
+
this.userMessage =
|
|
17
|
+
options?.detail ?? observationFailureMessage(operation, reason);
|
|
18
|
+
this.cleanupIncomplete =
|
|
19
|
+
this.cleanup !== undefined || reason === "cleanup_failed";
|
|
18
20
|
this.cleanupResources =
|
|
19
|
-
|
|
21
|
+
this.cleanup?.resources ??
|
|
22
|
+
(reason === "cleanup_failed" ? ["browser_transport"] : []);
|
|
20
23
|
this.userCategory =
|
|
21
|
-
reason === "cancelled" ||
|
|
24
|
+
reason === "cancelled" ||
|
|
25
|
+
options?.cause instanceof AnalysisCancelledError ||
|
|
26
|
+
(options?.cause instanceof AnalysisError &&
|
|
27
|
+
options.cause.userCategory === "cancelled")
|
|
22
28
|
? "cancelled"
|
|
23
29
|
: undefined;
|
|
24
30
|
}
|
|
25
31
|
}
|
|
32
|
+
const observationFailureMessage = (operation, reason) => {
|
|
33
|
+
if (reason === "cancelled")
|
|
34
|
+
return `${operation} was cancelled. Collected observations and cleanup status are reported when available.`;
|
|
35
|
+
if (reason === "timeout")
|
|
36
|
+
return `${operation} exceeded its execution deadline. Review the target's responsiveness and retained observations before retrying.`;
|
|
37
|
+
if (reason === "endpoint_unreachable")
|
|
38
|
+
return `${operation} could not reach the selected loopback debugging endpoint. Verify that the target process is running with debugging enabled and that the endpoint's port matches it, then retry.`;
|
|
39
|
+
if (reason === "target_not_found")
|
|
40
|
+
return `${operation} could not find the selected target at the debugging endpoint. Refresh target discovery for that endpoint and retry with a returned target ID.`;
|
|
41
|
+
if (reason === "disconnected")
|
|
42
|
+
return `${operation} lost its debugging connection. Verify that the target process is still running, refresh target discovery, and retry the observation.`;
|
|
43
|
+
return undefined;
|
|
44
|
+
};
|
|
@@ -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."),
|