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,53 +1,79 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
|
|
2
|
+
import { AsarArtifactReader } from "../AsarArtifactReader.js";
|
|
2
3
|
import { lstat } from "node:fs/promises";
|
|
3
4
|
import { ArtifactReaderFailure, } from "../ArtifactReader.js";
|
|
4
5
|
import { artifactInventoryResultSchema, } from "../../domain/artifactGraph.js";
|
|
5
6
|
import { createArtifactEdges, createRootNode, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor, } from "./ArtifactGraphConstruction.js";
|
|
6
7
|
import { artifactContradictionId, artifactGraphDigest, artifactManifestId, } from "../../domain/artifactIdentity.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
8
|
+
import { classifyAndHashRoot } from "./classify.js";
|
|
9
|
+
import {} from "../ArtifactHash.js";
|
|
10
|
+
import { hashStableRootArtifact } from "./hashStableRootArtifact.js";
|
|
9
11
|
import { createReader, inventoryLimitations } from "./reader.js";
|
|
10
12
|
import { scanReader, } from "./scanReader.js";
|
|
11
13
|
import { STRICT_INTEGRITY_POLICY, } from "./types.js";
|
|
12
|
-
export const scanCanonicalArtifactInventory = async (path, options = {}) => {
|
|
14
|
+
export const scanCanonicalArtifactInventory = async (path, options = {}, readerFactory = createReader) => {
|
|
13
15
|
const integrity = options.integrity ?? STRICT_INTEGRITY_POLICY;
|
|
14
16
|
const metadata = await lstat(path);
|
|
15
|
-
const rootFormat = await
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const reader = await createReader(path, rootFormat, options.signal);
|
|
17
|
+
const { format: rootFormat, digest: rootDigest } = await classifyAndHashRoot(path, metadata.isDirectory(), metadata, options.signal);
|
|
18
|
+
const reader = await readerFactory(path, rootFormat, options.environment ?? {}, options.signal);
|
|
19
|
+
const ownedReaders = reader === undefined ? [] : [reader];
|
|
20
|
+
let outcome;
|
|
20
21
|
try {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
if (reader instanceof AsarArtifactReader)
|
|
23
|
+
await reader.prepareContainer(rootDigest?.sha256, options.signal);
|
|
24
|
+
const { nodes, occurrences, pendingContradictions } = await scanReader(reader, ownedReaders, options.signal, integrity);
|
|
25
|
+
outcome = {
|
|
26
|
+
kind: "completed",
|
|
27
|
+
snapshot: await buildInventorySnapshot({
|
|
28
|
+
path,
|
|
29
|
+
metadata,
|
|
30
|
+
rootFormat,
|
|
31
|
+
rootDigest,
|
|
32
|
+
reader,
|
|
33
|
+
signal: options.signal,
|
|
34
|
+
nodes,
|
|
35
|
+
occurrences,
|
|
36
|
+
pendingContradictions,
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
33
39
|
}
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
catch (cause) {
|
|
41
|
+
outcome = { kind: "failed", cause };
|
|
36
42
|
}
|
|
43
|
+
let cleanupFailure;
|
|
44
|
+
for (const owned of ownedReaders.reverse()) {
|
|
45
|
+
try {
|
|
46
|
+
await owned.close();
|
|
47
|
+
}
|
|
48
|
+
catch (cleanupCause) {
|
|
49
|
+
const cleanup = ArtifactReaderFailure.cleanupObservation(cleanupCause, `artifact reader for ${path}`);
|
|
50
|
+
cleanupFailure = ArtifactReaderFailure.withCleanup(cleanupFailure ??
|
|
51
|
+
(outcome.kind === "failed" ? outcome.cause : cleanupCause), cleanup, outcome.kind === "completed"
|
|
52
|
+
? { kind: "artifact-inventory", inventory: outcome.snapshot }
|
|
53
|
+
: undefined);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (cleanupFailure !== undefined)
|
|
57
|
+
throw cleanupFailure;
|
|
58
|
+
if (outcome.kind === "failed")
|
|
59
|
+
throw outcome.cause;
|
|
60
|
+
return outcome.snapshot;
|
|
37
61
|
};
|
|
38
62
|
const buildInventorySnapshot = async (input) => {
|
|
39
63
|
const { path, metadata, rootFormat, rootDigest, reader, signal } = input;
|
|
40
64
|
materializeDirectoryNodes(input.occurrences, input.nodes);
|
|
41
65
|
const rootNode = createRootNode({
|
|
42
|
-
path,
|
|
43
|
-
format: rootFormat,
|
|
44
|
-
directory: metadata.isDirectory(),
|
|
45
66
|
digest: rootDigest,
|
|
46
67
|
occurrences: input.occurrences,
|
|
47
68
|
});
|
|
48
69
|
input.nodes.set(rootNode.artifact_id, rootNode);
|
|
49
70
|
rekeyOccurrences(rootNode.artifact_id, input.occurrences);
|
|
50
|
-
const rootOccurrence = rootOccurrenceFor(rootNode,
|
|
71
|
+
const rootOccurrence = rootOccurrenceFor(rootNode, {
|
|
72
|
+
size: metadata.size,
|
|
73
|
+
executable: (metadata.mode & 0o111) !== 0,
|
|
74
|
+
format: rootFormat,
|
|
75
|
+
path,
|
|
76
|
+
});
|
|
51
77
|
for (const occurrence of input.occurrences)
|
|
52
78
|
if (occurrence.parent_occurrence_id === null)
|
|
53
79
|
occurrence.parent_occurrence_id = rootOccurrence.occurrence_id;
|
|
@@ -61,7 +87,10 @@ const buildInventorySnapshot = async (input) => {
|
|
|
61
87
|
const edges = createArtifactEdges(rootNode.artifact_id, input.occurrences, reader?.provenance()[0]);
|
|
62
88
|
const orderedNodes = sortNodes([...input.nodes.values()]);
|
|
63
89
|
const orderedOccurrences = sortOccurrences(input.occurrences);
|
|
64
|
-
const orderedEdges = sortEdges(edges)
|
|
90
|
+
const orderedEdges = sortEdges(edges).map((edge, ordinal) => ({
|
|
91
|
+
...edge,
|
|
92
|
+
ordinal,
|
|
93
|
+
}));
|
|
65
94
|
await verifyRootDigest(path, rootDigest, signal);
|
|
66
95
|
const graphSha256 = artifactGraphDigest({
|
|
67
96
|
nodes: orderedNodes,
|
|
@@ -71,6 +100,7 @@ const buildInventorySnapshot = async (input) => {
|
|
|
71
100
|
});
|
|
72
101
|
const manifest = buildManifest({
|
|
73
102
|
rootNode,
|
|
103
|
+
rootFormat,
|
|
74
104
|
graphSha256,
|
|
75
105
|
orderedNodes,
|
|
76
106
|
orderedOccurrences,
|
|
@@ -118,19 +148,19 @@ const buildIntegrityContradictions = (pending, occurrenceByPath, occurrenceById,
|
|
|
118
148
|
const verifyRootDigest = async (path, rootDigest, signal) => {
|
|
119
149
|
if (rootDigest === null)
|
|
120
150
|
return;
|
|
121
|
-
const verified = await
|
|
151
|
+
const verified = await hashStableRootArtifact(path, signal);
|
|
122
152
|
if (verified.sha256 !== rootDigest.sha256 ||
|
|
123
153
|
verified.bytes !== rootDigest.bytes)
|
|
124
154
|
throw new ArtifactReaderFailure("integrity", "Root artifact changed during inventory");
|
|
125
155
|
};
|
|
126
|
-
const sortNodes = (nodes) => nodes.sort((left, right) => left.artifact_id
|
|
127
|
-
const sortOccurrences = (occurrences) => occurrences.sort((left, right) => left.logical_path
|
|
128
|
-
const sortEdges = (edges) => edges.sort((left, right) => left.edge_id
|
|
129
|
-
const buildManifest = ({ rootNode, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
|
|
156
|
+
const sortNodes = (nodes) => nodes.sort((left, right) => compareUnicodeCodePoints(left.artifact_id, right.artifact_id));
|
|
157
|
+
const sortOccurrences = (occurrences) => occurrences.sort((left, right) => compareUnicodeCodePoints(left.logical_path, right.logical_path));
|
|
158
|
+
const sortEdges = (edges) => edges.sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id));
|
|
159
|
+
const buildManifest = ({ rootNode, rootFormat, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
|
|
130
160
|
manifest_id: artifactManifestId(rootNode.artifact_id, graphSha256),
|
|
131
161
|
root_artifact_id: rootNode.artifact_id,
|
|
132
162
|
root_sha256: rootNode.sha256,
|
|
133
|
-
root_format:
|
|
163
|
+
root_format: rootFormat,
|
|
134
164
|
graph_sha256: graphSha256,
|
|
135
165
|
node_count: orderedNodes.length,
|
|
136
166
|
occurrence_count: orderedOccurrences.length,
|
|
@@ -2,12 +2,12 @@ import { isAbsolute } from "node:path";
|
|
|
2
2
|
import { ArtifactPathRegistry, normalizeArtifactPath, } from "../ArtifactPaths.js";
|
|
3
3
|
import { ArtifactReaderFailure, } from "../ArtifactReader.js";
|
|
4
4
|
import { AsarArtifactReader } from "../AsarArtifactReader.js";
|
|
5
|
-
import { classifyArtifactContent, createArtifactNode, createOccurrence, nearestParent, } from "./ArtifactGraphConstruction.js";
|
|
5
|
+
import { classifyArtifactContent, classifyArtifactBytes, createArtifactNode, createOccurrence, nearestParent, } from "./ArtifactGraphConstruction.js";
|
|
6
6
|
import { STRICT_INTEGRITY_POLICY, } from "./types.js";
|
|
7
7
|
import { hashReadable } from "../ArtifactHash.js";
|
|
8
8
|
const UNAVAILABLE_UNPACKED_LIMITATION = "ASAR unpacked companion bytes were unavailable; no content hash or child artifact was produced.";
|
|
9
9
|
const emptyScan = () => ({ nodes: new Map(), occurrences: [], pendingContradictions: [] });
|
|
10
|
-
export const scanReader = async (reader, signal, integrity = STRICT_INTEGRITY_POLICY) => {
|
|
10
|
+
export const scanReader = async (reader, ownedReaders, signal, integrity = STRICT_INTEGRITY_POLICY) => {
|
|
11
11
|
const { nodes, occurrences, pendingContradictions } = emptyScan();
|
|
12
12
|
if (reader === undefined)
|
|
13
13
|
return { nodes, occurrences, pendingContradictions };
|
|
@@ -21,6 +21,7 @@ export const scanReader = async (reader, signal, integrity = STRICT_INTEGRITY_PO
|
|
|
21
21
|
occurrenceByPath: new Map(),
|
|
22
22
|
registry: new ArtifactPathRegistry(),
|
|
23
23
|
expandedContainerIds: new Set(),
|
|
24
|
+
ownedReaders,
|
|
24
25
|
};
|
|
25
26
|
await visitArtifactEntries(context, reader, "");
|
|
26
27
|
// Archive directories may appear after their children. Resolve containment
|
|
@@ -36,7 +37,6 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
|
|
|
36
37
|
reader: currentReader,
|
|
37
38
|
prefix,
|
|
38
39
|
iterator: currentReader.entries(context.signal)[Symbol.asyncIterator](),
|
|
39
|
-
owned: false,
|
|
40
40
|
},
|
|
41
41
|
];
|
|
42
42
|
try {
|
|
@@ -47,8 +47,6 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
|
|
|
47
47
|
const next = await frame.iterator.next();
|
|
48
48
|
if (next.done) {
|
|
49
49
|
stack.pop();
|
|
50
|
-
if (frame.owned)
|
|
51
|
-
await frame.reader.close();
|
|
52
50
|
continue;
|
|
53
51
|
}
|
|
54
52
|
const entry = next.value;
|
|
@@ -71,6 +69,8 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
|
|
|
71
69
|
if (digested !== undefined) {
|
|
72
70
|
context.nodes.set(digested.node.artifact_id, digested.node);
|
|
73
71
|
occurrence.artifact_id = digested.node.artifact_id;
|
|
72
|
+
occurrence.artifact_kind = digested.classification.kind;
|
|
73
|
+
occurrence.artifact_format = digested.classification.format;
|
|
74
74
|
occurrence.hash_status = digested.mismatched
|
|
75
75
|
? "mismatched"
|
|
76
76
|
: "verified";
|
|
@@ -79,26 +79,24 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
|
|
|
79
79
|
}
|
|
80
80
|
context.occurrences.push(occurrence);
|
|
81
81
|
context.occurrenceByPath.set(logicalPath, occurrence);
|
|
82
|
-
if (expandableAsar && digested
|
|
82
|
+
if (expandableAsar && digested !== undefined && !digested.mismatched) {
|
|
83
83
|
const nested = new AsarArtifactReader(entry.adapterKey);
|
|
84
|
+
context.ownedReaders.push(nested);
|
|
85
|
+
await nested.prepareContainer(digested.node.sha256, context.signal);
|
|
84
86
|
// Only traversed containers can own members, not opaque ASAR-named files.
|
|
85
87
|
context.expandedContainerIds.add(occurrence.occurrence_id);
|
|
86
88
|
stack.push({
|
|
87
89
|
reader: nested,
|
|
88
90
|
prefix: logicalPath,
|
|
89
91
|
iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
|
|
90
|
-
owned: true,
|
|
91
92
|
});
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
}
|
|
95
96
|
finally {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
.map(async ({ reader, iterator }) => {
|
|
97
|
+
// Readers remain owned by the inventory until its complete observation is built.
|
|
98
|
+
for (const { iterator } of stack)
|
|
99
99
|
await iterator.return?.();
|
|
100
|
-
await reader.close();
|
|
101
|
-
}));
|
|
102
100
|
}
|
|
103
101
|
};
|
|
104
102
|
const digestArtifactEntry = async (context, currentReader, entry, logicalPath) => {
|
|
@@ -129,17 +127,11 @@ const digestArtifactEntry = async (context, currentReader, entry, logicalPath) =
|
|
|
129
127
|
node: createArtifactNode({
|
|
130
128
|
sha256: digest.sha256,
|
|
131
129
|
size: digest.bytes,
|
|
132
|
-
|
|
133
|
-
format: classified.format,
|
|
134
|
-
executable: entry.executable,
|
|
130
|
+
format: classifyArtifactBytes(digest.prefix, digest.bytes),
|
|
135
131
|
contentState: "embedded",
|
|
136
|
-
limitations: mismatched
|
|
137
|
-
? [
|
|
138
|
-
"Observed content contradicts declared integrity metadata and is untrusted.",
|
|
139
|
-
]
|
|
140
|
-
: [],
|
|
141
132
|
}),
|
|
142
133
|
mismatched,
|
|
134
|
+
classification: classified,
|
|
143
135
|
};
|
|
144
136
|
};
|
|
145
137
|
const isExpandableAsar = (entry, logicalPath) => entry.kind === "file" &&
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { isAbsolute } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
|
|
4
4
|
import { AsarArtifactReader } from "../AsarArtifactReader.js";
|
|
5
5
|
import { ArtifactPathRegistry, normalizeArtifactPath, } from "../ArtifactPaths.js";
|
|
6
6
|
import { ArtifactReaderFailure, } from "../ArtifactReader.js";
|
|
@@ -12,7 +12,7 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
|
|
|
12
12
|
const root = snapshot.nodes.find(({ artifact_id }) => artifact_id === snapshot.manifest.root_artifact_id);
|
|
13
13
|
if (root === undefined)
|
|
14
14
|
throw new ArtifactReaderFailure("integrity", "Root artifact node is missing");
|
|
15
|
-
await verifyEntryBytes(reader.openContainer(signal), { path: ".", sha256: root.sha256, bytes: root.size }, signal);
|
|
15
|
+
await verifyEntryBytes(await reader.openContainer(signal), { path: ".", sha256: root.sha256, bytes: root.size }, signal);
|
|
16
16
|
}
|
|
17
17
|
const inventory = expectedInventory(snapshot);
|
|
18
18
|
const expected = inventory.files;
|
|
@@ -27,11 +27,11 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
|
|
|
27
27
|
invalidUtf8: 0,
|
|
28
28
|
};
|
|
29
29
|
await visitReader(reader, "", snapshot.manifest.root_sha256, context);
|
|
30
|
-
const files = context.files.sort((left, right) =>
|
|
30
|
+
const files = context.files.sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
|
|
31
31
|
assertExpectedFilesWereVisited(expected, files);
|
|
32
32
|
return {
|
|
33
33
|
files,
|
|
34
|
-
containers: context.containers.sort((left, right) =>
|
|
34
|
+
containers: context.containers.sort((left, right) => compareUnicodeCodePoints(left.path, right.path)),
|
|
35
35
|
text_bytes_read: context.textBytes,
|
|
36
36
|
invalid_utf8_files: context.invalidUtf8,
|
|
37
37
|
};
|
|
@@ -43,9 +43,10 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
|
|
|
43
43
|
prefix,
|
|
44
44
|
containerSha256,
|
|
45
45
|
iterator: reader.entries(context.signal)[Symbol.asyncIterator](),
|
|
46
|
-
owned: false,
|
|
47
46
|
},
|
|
48
47
|
];
|
|
48
|
+
const ownedReaders = [];
|
|
49
|
+
let failure;
|
|
49
50
|
try {
|
|
50
51
|
while (stack.length > 0) {
|
|
51
52
|
const frame = stack.at(-1);
|
|
@@ -54,8 +55,6 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
|
|
|
54
55
|
const next = await frame.iterator.next();
|
|
55
56
|
if (next.done) {
|
|
56
57
|
stack.pop();
|
|
57
|
-
if (frame.owned)
|
|
58
|
-
await frame.reader.close();
|
|
59
58
|
continue;
|
|
60
59
|
}
|
|
61
60
|
const entry = next.value;
|
|
@@ -64,17 +63,32 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
|
|
|
64
63
|
const nestedAsar = isFilesystemAsar(entry, path);
|
|
65
64
|
context.registry.add(path, nestedAsar ? "directory" : entry.kind);
|
|
66
65
|
if (nestedAsar) {
|
|
67
|
-
const
|
|
66
|
+
const container = context.expectedContainers.get(path);
|
|
67
|
+
// Inventory deliberately does not expand unverified or unavailable
|
|
68
|
+
// nested archives. Keep the same boundary here when reconstruction
|
|
69
|
+
// reads the active entries again.
|
|
70
|
+
if (container === undefined)
|
|
71
|
+
throw new ArtifactReaderFailure("integrity", `Nested ASAR was not present in inventory: ${path}`);
|
|
72
|
+
if (container.hash_status === "mismatched")
|
|
73
|
+
continue;
|
|
74
|
+
if (container.hash_status === "unavailable")
|
|
75
|
+
throw new ArtifactReaderFailure("unavailable", `Nested ASAR bytes were unavailable during inventory: ${path}`);
|
|
76
|
+
if (container.hash_status !== "verified")
|
|
77
|
+
throw new ArtifactReaderFailure("integrity", `Nested ASAR was not integrity-verified: ${path}`);
|
|
78
|
+
const inventory = container.inventory;
|
|
79
|
+
if (inventory === null)
|
|
80
|
+
throw new ArtifactReaderFailure("integrity", `Verified nested ASAR has no inventory node: ${path}`);
|
|
68
81
|
await verifyEntryBytes(await frame.reader.open(entry, context.signal), inventory, context.signal);
|
|
69
82
|
context.containers.push(inventory);
|
|
70
83
|
const nested = new AsarArtifactReader(entry.adapterKey);
|
|
84
|
+
ownedReaders.push(nested);
|
|
71
85
|
stack.push({
|
|
72
86
|
reader: nested,
|
|
73
87
|
prefix: path,
|
|
74
88
|
containerSha256: inventory.sha256,
|
|
75
89
|
iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
|
|
76
|
-
owned: true,
|
|
77
90
|
});
|
|
91
|
+
await nested.prepareContainer(inventory.sha256, context.signal);
|
|
78
92
|
continue;
|
|
79
93
|
}
|
|
80
94
|
const expected = context.expected.get(path);
|
|
@@ -97,20 +111,31 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
|
|
|
97
111
|
});
|
|
98
112
|
}
|
|
99
113
|
}
|
|
114
|
+
catch (cause) {
|
|
115
|
+
failure = { cause };
|
|
116
|
+
}
|
|
100
117
|
finally {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
118
|
+
for (const { iterator } of stack) {
|
|
119
|
+
try {
|
|
120
|
+
await iterator.return?.();
|
|
121
|
+
}
|
|
122
|
+
catch (cause) {
|
|
123
|
+
failure ??= { cause };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const owned of ownedReaders.reverse()) {
|
|
127
|
+
try {
|
|
128
|
+
await owned.close();
|
|
129
|
+
}
|
|
130
|
+
catch (cause) {
|
|
131
|
+
failure = {
|
|
132
|
+
cause: ArtifactReaderFailure.withCleanup(failure?.cause ?? cause, ArtifactReaderFailure.cleanupObservation(cause, `nested ASAR reader for ${prefix}`)),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
107
136
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const container = context.expectedContainers.get(path);
|
|
111
|
-
if (container === undefined)
|
|
112
|
-
throw new ArtifactReaderFailure("integrity", `Nested ASAR disappeared from inventory: ${path}`);
|
|
113
|
-
return container;
|
|
137
|
+
if (failure !== undefined)
|
|
138
|
+
throw failure.cause;
|
|
114
139
|
};
|
|
115
140
|
const readText = async (context, input) => {
|
|
116
141
|
if (input.expected.kind === "native-addon") {
|
|
@@ -155,8 +180,18 @@ const expectedInventory = (snapshot) => {
|
|
|
155
180
|
const files = new Map();
|
|
156
181
|
const containers = new Map();
|
|
157
182
|
for (const occurrence of snapshot.occurrences) {
|
|
158
|
-
if (occurrence.
|
|
183
|
+
if (occurrence.logical_path === ".")
|
|
159
184
|
continue;
|
|
185
|
+
const isNestedAsar = occurrence.entry_kind === "file" &&
|
|
186
|
+
occurrence.logical_path.toLowerCase().endsWith(".asar");
|
|
187
|
+
if (occurrence.artifact_id === null) {
|
|
188
|
+
if (isNestedAsar)
|
|
189
|
+
containers.set(occurrence.logical_path, {
|
|
190
|
+
hash_status: occurrence.hash_status,
|
|
191
|
+
inventory: null,
|
|
192
|
+
});
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
160
195
|
const node = nodes.get(occurrence.artifact_id);
|
|
161
196
|
if (node === undefined)
|
|
162
197
|
throw new ArtifactReaderFailure("integrity", `Artifact inventory node is missing: ${occurrence.logical_path}`);
|
|
@@ -165,12 +200,15 @@ const expectedInventory = (snapshot) => {
|
|
|
165
200
|
// node_modules/@zip.js remains a graph node and must never be opened.
|
|
166
201
|
if (occurrence.entry_kind !== "file")
|
|
167
202
|
continue;
|
|
168
|
-
if (
|
|
203
|
+
if (isNestedAsar)
|
|
169
204
|
containers.set(occurrence.logical_path, {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
205
|
+
hash_status: occurrence.hash_status,
|
|
206
|
+
inventory: {
|
|
207
|
+
path: occurrence.logical_path,
|
|
208
|
+
sha256: node.sha256,
|
|
209
|
+
bytes: node.size,
|
|
210
|
+
inventory_artifact_id: node.artifact_id,
|
|
211
|
+
},
|
|
174
212
|
});
|
|
175
213
|
const kind = relevantKind(occurrence.logical_path);
|
|
176
214
|
if (kind === undefined)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
2
|
+
import { AnalysisCancelledError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
4
|
+
import { BrowserObservationError } from "../domain/browserObservationError.js";
|
|
5
|
+
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
6
|
+
import { PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
7
|
+
const OPERATION = "capture_browser_scenario";
|
|
8
|
+
const browserScenarioLimitations = (session) => [
|
|
9
|
+
"Event sequence records provider receipt order; simultaneous browser causality is not inferred.",
|
|
10
|
+
"Network content is retained only when selected; response bytes are browser-decoded, not compressed wire bytes.",
|
|
11
|
+
"Request bytes are limited to what Playwright exposes; not_exposed does not establish body absence or multipart file coverage.",
|
|
12
|
+
"Network content reads settle within 5 seconds each and never wait for unfinished responses or refetch them.",
|
|
13
|
+
"Playwright scenario events do not expose request initiator stacks; receipt order does not prove causality.",
|
|
14
|
+
"Storage values are hashed only after declared-secret redaction.",
|
|
15
|
+
...(session.eventLimitations?.() ?? []),
|
|
16
|
+
...(session.mode === "connect"
|
|
17
|
+
? [
|
|
18
|
+
"CDP attachment cannot recover pre-attach events or guarantee launch-time context options.",
|
|
19
|
+
]
|
|
20
|
+
: []),
|
|
21
|
+
];
|
|
22
|
+
/** Project one session into the common capture fields used by success and failure. */
|
|
23
|
+
export const browserScenarioCaptureData = (input) => ({
|
|
24
|
+
browser: {
|
|
25
|
+
mode: input.session.mode,
|
|
26
|
+
process_ownership: input.session.processOwnership,
|
|
27
|
+
cleanup: input.cleanup,
|
|
28
|
+
product: input.session.product,
|
|
29
|
+
version: input.session.version,
|
|
30
|
+
},
|
|
31
|
+
scenario: {
|
|
32
|
+
start_origin: new URL(input.scenario.start_url.url).origin,
|
|
33
|
+
action_count: input.scenario.actions.length,
|
|
34
|
+
secret_references: input.scenario.secrets
|
|
35
|
+
.map(({ secret_id: id }) => id)
|
|
36
|
+
.sort(),
|
|
37
|
+
network_content: input.scenario.capture.network,
|
|
38
|
+
},
|
|
39
|
+
duration_ms: Date.now() - input.startedAt,
|
|
40
|
+
steps: [...input.steps],
|
|
41
|
+
events: input.session.events(),
|
|
42
|
+
limitations: [
|
|
43
|
+
...browserScenarioLimitations(input.session),
|
|
44
|
+
...(input.limitations ?? []),
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
/** Describe the cleanup failure without discarding its resource evidence. */
|
|
48
|
+
export const browserScenarioCleanupObservation = (cause) => cause instanceof AnalysisError && cause.cleanup !== undefined
|
|
49
|
+
? cause.cleanup
|
|
50
|
+
: {
|
|
51
|
+
reason: cause instanceof Error ? cause.message : String(cause),
|
|
52
|
+
resources: cause instanceof AnalysisError && cause.cleanupResources.length > 0
|
|
53
|
+
? cause.cleanupResources
|
|
54
|
+
: ["browser_transport"],
|
|
55
|
+
};
|
|
56
|
+
/** Retain operation diagnostics and capture data after cleanup settles. */
|
|
57
|
+
export const browserScenarioOperationFailure = (cause, partialObservation, cleanupFailure) => {
|
|
58
|
+
const primary = cause instanceof AnalysisError
|
|
59
|
+
? cause
|
|
60
|
+
: new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION, { cause });
|
|
61
|
+
const primaryProjection = projectAnalysisError(primary);
|
|
62
|
+
const cleanupCause = cleanupFailure === undefined
|
|
63
|
+
? undefined
|
|
64
|
+
: cleanupFailure.cause instanceof AnalysisError
|
|
65
|
+
? cleanupFailure.cause
|
|
66
|
+
: new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, "close_browser_scenario", { cause: cleanupFailure.cause });
|
|
67
|
+
const cleanupObservation = cleanupFailure === undefined
|
|
68
|
+
? undefined
|
|
69
|
+
: browserScenarioCleanupObservation(cleanupFailure.cause);
|
|
70
|
+
const retainedOptions = {
|
|
71
|
+
cause: primary,
|
|
72
|
+
partialObservation,
|
|
73
|
+
...(primary.capturedOutput === undefined
|
|
74
|
+
? {}
|
|
75
|
+
: { capturedOutput: primary.capturedOutput }),
|
|
76
|
+
...(primary.cleanup === undefined ? {} : { cleanup: primary.cleanup }),
|
|
77
|
+
};
|
|
78
|
+
if (cleanupCause === undefined) {
|
|
79
|
+
if (primary instanceof AnalysisCancelledError)
|
|
80
|
+
return new AnalysisCancelledError(primary.operation, retainedOptions);
|
|
81
|
+
if (primary instanceof AnalysisTimeoutError)
|
|
82
|
+
return new AnalysisTimeoutError(primary.operation, primary.timeoutMs, retainedOptions);
|
|
83
|
+
if (primary instanceof BrowserObservationError)
|
|
84
|
+
return new BrowserObservationError(primary.operation, primary.reason, {
|
|
85
|
+
...retainedOptions,
|
|
86
|
+
...(primary.userMessage === undefined
|
|
87
|
+
? {}
|
|
88
|
+
: { detail: primary.userMessage }),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const cleanup = cleanupObservation ?? primary.cleanup;
|
|
92
|
+
return new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION, {
|
|
93
|
+
...retainedOptions,
|
|
94
|
+
cause: cleanupCause === undefined
|
|
95
|
+
? primary
|
|
96
|
+
: new AggregateError([primary, cleanupCause], "Browser scenario operation and cleanup both failed", { cause: primary }),
|
|
97
|
+
userMessage: primaryProjection.message,
|
|
98
|
+
...(cleanup === undefined ? {} : { cleanup }),
|
|
99
|
+
diagnostics: {
|
|
100
|
+
primary_error: primaryProjection,
|
|
101
|
+
...(cleanupCause === undefined
|
|
102
|
+
? {}
|
|
103
|
+
: { cleanup_error: projectAnalysisError(cleanupCause) }),
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sanitizeBrowserUrl, } from "../domain/browserObservation.js";
|
|
2
|
+
import { browserTargetListSchema, webPageInspectionSchema, } from "../domain/browserObservationSchemas.js";
|
|
2
3
|
import { analyzeCapturedWebBundle } from "../domain/webBundleAnalyzer.js";
|
|
3
4
|
import { webBundleAnalysisSchema, } from "../domain/webBundleAnalysis.js";
|
|
4
5
|
import { webObservationSessionSchema, } from "../domain/browserSession.js";
|
|
@@ -19,15 +20,12 @@ import { observeCdpSession } from "./CdpObservationSession.js";
|
|
|
19
20
|
import { discoverWebMcp } from "./CdpWebMcpDiscovery.js";
|
|
20
21
|
import { captureCdpScreenshot } from "./CdpScreenshot.js";
|
|
21
22
|
import { comparePngScreenshots } from "./PngVisualDiff.js";
|
|
22
|
-
/** Public identity committed by passive browser observations. */
|
|
23
|
-
export { CDP_BROWSER_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
24
23
|
import { CDP_BROWSER_PROVIDER_IDENTITY } from "./providerIdentities.js";
|
|
25
|
-
const IDENTITY = CDP_BROWSER_PROVIDER_IDENTITY;
|
|
26
24
|
const CLEANUP_DOMAINS = ["Network", "Debugger", "Runtime", "Page"];
|
|
27
25
|
/** Passive browser observation through a selected user-owned CDP endpoint. */
|
|
28
26
|
export class CdpBrowserProvider {
|
|
29
27
|
identity() {
|
|
30
|
-
return
|
|
28
|
+
return CDP_BROWSER_PROVIDER_IDENTITY;
|
|
31
29
|
}
|
|
32
30
|
async listTargets(input, options = {}) {
|
|
33
31
|
try {
|
|
@@ -263,4 +261,6 @@ const providerError = (cause, operation) => cause instanceof BrowserObservationE
|
|
|
263
261
|
? new BrowserObservationError(operation, cause.reason, { cause })
|
|
264
262
|
: cause instanceof AnalysisError
|
|
265
263
|
? cause
|
|
266
|
-
: new ProviderAdapterError(
|
|
264
|
+
: new ProviderAdapterError(CDP_BROWSER_PROVIDER_IDENTITY.id, operation, {
|
|
265
|
+
cause,
|
|
266
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { inferJsonShape } from "../domain/jsonShape.js";
|
|
2
2
|
import { safeResponseMetadata } from "./CdpSafeMetadata.js";
|
|
3
|
-
import { allowedSanitizedUrl, isHttpUrl, numberValue, recordValue, recordsValue, cdpStringValue, } from "./CdpCaptureValues.js";
|
|
3
|
+
import { allowedSanitizedUrl, isHttpUrl, numberValue, recordValue, recordsValue, scriptMetadataValues, cdpStringValue, } from "./CdpCaptureValues.js";
|
|
4
4
|
import { requestBodyShape, updateResponseBodyShape, } from "./CdpCaptureEventBodyShapes.js";
|
|
5
5
|
import { consolePrimitive, decodeBase64, exclusionReasonForUrl, executionContextKey, firstCallFrame, initiatorLocation, integerOrNull, isJsonMediaType, isMainFrameNavigation, } from "./CdpCaptureEventHelpers.js";
|
|
6
6
|
import { CDP_CAPTURE_SCRIPT_METADATA_LIMITS, } from "./CdpCaptureEventTypes.js";
|
|
@@ -44,9 +44,7 @@ export const handleScriptParsed = (state, params) => {
|
|
|
44
44
|
rawUrl,
|
|
45
45
|
url: sanitized.url,
|
|
46
46
|
origin: sanitized.origin,
|
|
47
|
-
|
|
48
|
-
length: Math.max(0, Math.min(Number.MAX_SAFE_INTEGER, Math.trunc(numberValue(params.length) ?? 0))),
|
|
49
|
-
isModule: params.isModule === true,
|
|
47
|
+
...scriptMetadataValues(params),
|
|
50
48
|
language: cdpStringValue(params.scriptLanguage) ?? null,
|
|
51
49
|
executionContextKey: executionContextKey(params.executionContextId),
|
|
52
50
|
};
|
|
@@ -3,7 +3,6 @@ import * as bodyShapes from "./CdpCaptureEventBodyShapes.js";
|
|
|
3
3
|
import * as handlers from "./CdpCaptureEventHandlers.js";
|
|
4
4
|
import { isJsonMediaType } from "./CdpCaptureEventHelpers.js";
|
|
5
5
|
import { recordValue } from "./CdpCaptureValues.js";
|
|
6
|
-
export {} from "./CdpCaptureEventTypes.js";
|
|
7
6
|
/** Event accumulator that validates and normalizes payloads at ingestion. */
|
|
8
7
|
export class CdpCaptureEvents {
|
|
9
8
|
#scriptMetadataBudgetExclusionsRecorded = false;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import {
|
|
3
|
+
import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
|
|
4
4
|
import { CdpConnection } from "./CdpConnection.js";
|
|
5
5
|
import { optionalCdpCommand } from "./CdpOptionalCommand.js";
|
|
6
6
|
import { recordValue, recordsValue, cdpStringValue, } from "./CdpCaptureValues.js";
|
|
@@ -16,7 +16,7 @@ export const captureStorageFingerprints = async ({ context, origin, cookieUrl, l
|
|
|
16
16
|
await addCookies(run, cookieUrl);
|
|
17
17
|
await addIndexedDb(run, origin, indexedDbNames);
|
|
18
18
|
await addCaches(run, caches);
|
|
19
|
-
state.items.sort((left, right) =>
|
|
19
|
+
state.items.sort((left, right) => compareUnicodeCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
|
|
20
20
|
const complete = state.complete && state.items.every(({ complete }) => complete);
|
|
21
21
|
return { items: state.items, complete };
|
|
22
22
|
};
|
|
@@ -282,7 +282,7 @@ const stableValue = (value) => {
|
|
|
282
282
|
return String(value);
|
|
283
283
|
return Object.fromEntries(Object.entries(record)
|
|
284
284
|
.filter(([key]) => key !== "objectId" && key !== "customPreview")
|
|
285
|
-
.sort(([left], [right]) =>
|
|
285
|
+
.sort(([left], [right]) => compareUnicodeCodePoints(left, right))
|
|
286
286
|
.map(([key, item]) => [key, stableValue(item)]));
|
|
287
287
|
};
|
|
288
288
|
const stableValueComplete = (value) => {
|
|
@@ -13,12 +13,32 @@ export const recordsValue = (value) => Array.isArray(value)
|
|
|
13
13
|
: [];
|
|
14
14
|
export const cdpStringValue = (value) => typeof value === "string" ? value : undefined;
|
|
15
15
|
export const numberValue = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
16
|
+
/** Preserve partial script declarations; omitted or invalid fields remain unknown. */
|
|
17
|
+
export const scriptMetadataValues = (value) => {
|
|
18
|
+
const length = numberValue(value?.length);
|
|
19
|
+
return {
|
|
20
|
+
hash: cdpStringValue(value?.hash) ?? null,
|
|
21
|
+
length: length !== undefined && Number.isSafeInteger(length) && length >= 0
|
|
22
|
+
? length
|
|
23
|
+
: null,
|
|
24
|
+
isModule: typeof value?.isModule === "boolean" ? value.isModule : null,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
16
27
|
export const requiredRecord = (value) => {
|
|
17
28
|
const record = recordValue(value);
|
|
18
29
|
if (record === undefined)
|
|
19
30
|
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
20
31
|
return record;
|
|
21
32
|
};
|
|
33
|
+
/** Require producer source text; an absent source is distinct from an empty script. */
|
|
34
|
+
export const requiredScriptSource = (value, operation) => {
|
|
35
|
+
const source = cdpStringValue(recordValue(value)?.scriptSource);
|
|
36
|
+
if (source === undefined)
|
|
37
|
+
throw new BrowserObservationError(operation, "protocol_error", {
|
|
38
|
+
detail: "Debugger.getScriptSource returned malformed source text: scriptSource must be a string.",
|
|
39
|
+
});
|
|
40
|
+
return source;
|
|
41
|
+
};
|
|
22
42
|
export const isHttpUrl = (value) => {
|
|
23
43
|
if (value === undefined)
|
|
24
44
|
return false;
|