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,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
|
|
4
5
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
6
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
6
7
|
const unknownIdSchema = prefixedDigestSchema("unk");
|
|
@@ -232,5 +233,5 @@ const canonicalJson = (value) => {
|
|
|
232
233
|
throw new TypeError("Unknown identity failed");
|
|
233
234
|
return serialized;
|
|
234
235
|
};
|
|
235
|
-
const sortedUnique = (values) => [...new Set(values)].sort(
|
|
236
|
-
const sortedRelationships = (values) => [...values].sort((left, right) =>
|
|
236
|
+
const sortedUnique = (values) => [...new Set(values)].sort(compareUnicodeCodePoints);
|
|
237
|
+
const sortedRelationships = (values) => [...values].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.type, left.unknown_id]), compositeKey([right.type, right.unknown_id])));
|
|
@@ -3,11 +3,12 @@ import canonicalize from "canonicalize";
|
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { artifactComparisonResultSchema } from "./artifactComparison.js";
|
|
5
5
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
6
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
6
7
|
import { comparisonSourceEvidenceIds } from "./comparisonSourceEvidence.js";
|
|
7
8
|
import { evidenceSchema, parseEvidence } from "./evidence.js";
|
|
8
|
-
import { functionComparisonResultSchema } from "./
|
|
9
|
+
import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
|
|
9
10
|
import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
|
|
10
|
-
import { comparisonStatusSchema, processCaptureComparisonSchema, } from "./process/
|
|
11
|
+
import { comparisonStatusSchema, processCaptureComparisonSchema, } from "./process/processComparison.js";
|
|
11
12
|
import { PROCESS_COMPARISON_DIMENSIONS } from "./process/processComparison.js";
|
|
12
13
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
13
14
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
@@ -146,7 +147,7 @@ export const correlateStaticAndRuntime = (input) => {
|
|
|
146
147
|
const runtimeById = byId(runtimeEvidence);
|
|
147
148
|
const correlations = parsed.mappings
|
|
148
149
|
.map((mapping) => correlate(mapping, staticById, runtimeById))
|
|
149
|
-
.sort((left, right) => left.correlation_id
|
|
150
|
+
.sort((left, right) => compareUnicodeCodePoints(left.correlation_id, right.correlation_id));
|
|
150
151
|
if (new Set(correlations.map(({ correlation_id: id }) => id)).size !==
|
|
151
152
|
correlations.length)
|
|
152
153
|
throw new TypeError("Static/runtime correlation rejects duplicate mappings");
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Portable ASCII identifier starting with a letter. */
|
|
2
|
+
export const IDENTIFIER_PATTERN = /^[A-Za-z][A-Za-z0-9._\x2d]*$/u;
|
|
3
|
+
/** Stable evidence identifier, also admitting namespace and path separators. */
|
|
4
|
+
export const STABLE_IDENTIFIER_PATTERN = /^[A-Za-z][A-Za-z0-9._:\x2f\x2d]*$/u;
|
|
5
|
+
/** Canonical padded base64, including zero pad bits and the empty encoding. */
|
|
6
|
+
export const CANONICAL_BASE64_PATTERN = /^(?:[A-Za-z0-9+\x2f]{4})*(?:[A-Za-z0-9+\x2f][AQgw]==|[A-Za-z0-9+\x2f]{2}[AEIMQUYcgkosw048]=)?$/;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const LEGACY_CATEGORIES = [
|
|
2
|
+
["_TtC", "classes"],
|
|
3
|
+
["_TtV", "structs"],
|
|
4
|
+
["_TtO", "enums"],
|
|
5
|
+
["_TtP", "protocols"],
|
|
6
|
+
["_TtE", "extensions"],
|
|
7
|
+
];
|
|
8
|
+
const NOMINAL_CATEGORIES = new Map([
|
|
9
|
+
["C", "classes"],
|
|
10
|
+
["V", "structs"],
|
|
11
|
+
["O", "enums"],
|
|
12
|
+
["P", "protocols"],
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* Recognize Swift manglings and decode literal module/nominal contexts.
|
|
16
|
+
* Substitutions, generic contexts, and other encodings remain unknown.
|
|
17
|
+
*/
|
|
18
|
+
export const classifySwiftSymbol = (name) => {
|
|
19
|
+
const prefix = /^_?(?:\$[sS]|_T0)/u.exec(name);
|
|
20
|
+
if (prefix === null) {
|
|
21
|
+
if (!name.includes("_Tt"))
|
|
22
|
+
return undefined;
|
|
23
|
+
return {
|
|
24
|
+
category: LEGACY_CATEGORIES.find(([prefix]) => name.startsWith(prefix))?.[1] ??
|
|
25
|
+
null,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const mangling = name.slice(prefix[0].length);
|
|
29
|
+
let offset = identifierEnd(mangling, 0);
|
|
30
|
+
if (offset === undefined)
|
|
31
|
+
return { category: null };
|
|
32
|
+
let category = null;
|
|
33
|
+
for (;;) {
|
|
34
|
+
const end = identifierEnd(mangling, offset);
|
|
35
|
+
if (end === undefined)
|
|
36
|
+
break;
|
|
37
|
+
const kind = mangling.charAt(end);
|
|
38
|
+
const nominal = NOMINAL_CATEGORIES.get(kind);
|
|
39
|
+
if (nominal === undefined) {
|
|
40
|
+
// Current swiftc emits protocol descriptors as `…<Nominal>Mp` without
|
|
41
|
+
// the nominal `P` marker (e.g. `_$s4main7ScoringMp`). Decode that exact
|
|
42
|
+
// suffix; unknown substitution encodings stay unclassified, never guessed.
|
|
43
|
+
if (mangling.slice(end) === "Mp")
|
|
44
|
+
category = "protocols";
|
|
45
|
+
else if (kind === "E" && category !== null)
|
|
46
|
+
category = "extensions";
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
category = nominal;
|
|
50
|
+
offset = end + 1;
|
|
51
|
+
}
|
|
52
|
+
return { category };
|
|
53
|
+
};
|
|
54
|
+
const identifierEnd = (mangling, offset) => {
|
|
55
|
+
const lengthToken = /^[1-9][0-9]*/u.exec(mangling.slice(offset))?.[0];
|
|
56
|
+
if (lengthToken === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
const start = offset + lengthToken.length;
|
|
59
|
+
const end = start + Number(lengthToken);
|
|
60
|
+
// Swift identifiers with substitutions/punycode need a fuller decoder.
|
|
61
|
+
if (!Number.isSafeInteger(end) ||
|
|
62
|
+
end > mangling.length ||
|
|
63
|
+
!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(mangling.slice(start, end)))
|
|
64
|
+
return undefined;
|
|
65
|
+
return end;
|
|
66
|
+
};
|
|
@@ -1,7 +1,20 @@
|
|
|
1
|
+
import { classifySwiftSymbol, } from "./swiftSymbolClassification.js";
|
|
2
|
+
/** Objective-C class definition markers emitted by modern Apple clang. */
|
|
3
|
+
const OBJC_CLASS_MARKER = "OBJC_CLASS_$_";
|
|
4
|
+
/** Local class records emitted by Apple's fragile Objective-C ABI. */
|
|
5
|
+
const LEGACY_OBJC_CLASS_PREFIX = "l_OBJC_CLASS_";
|
|
6
|
+
/**
|
|
7
|
+
* Objective-C protocol declaration marker. `PROTOCOL_REFERENCE` slots
|
|
8
|
+
* share the substring but are uses, not definitions.
|
|
9
|
+
*/
|
|
10
|
+
const OBJC_PROTOCOL_MARKER = "OBJC_PROTOCOL_$_";
|
|
1
11
|
/** Select and deduplicate Objective-C class labels. */
|
|
2
12
|
export const discoverObjcClasses = (names, pattern) => {
|
|
3
13
|
const classes = uniqueByName(names
|
|
4
|
-
.filter(({ name }) =>
|
|
14
|
+
.filter(({ name }) => name.includes(OBJC_CLASS_MARKER) ||
|
|
15
|
+
(name.startsWith(LEGACY_OBJC_CLASS_PREFIX) &&
|
|
16
|
+
name.length > LEGACY_OBJC_CLASS_PREFIX.length &&
|
|
17
|
+
!/^l_OBJC_CLASS_NAME_(?:\.\d+)?$/u.test(name)))
|
|
5
18
|
.filter(({ name }) => pattern.length === 0 || name.includes(pattern)));
|
|
6
19
|
return {
|
|
7
20
|
count: classes.length,
|
|
@@ -10,39 +23,89 @@ export const discoverObjcClasses = (names, pattern) => {
|
|
|
10
23
|
};
|
|
11
24
|
/** Select and deduplicate Objective-C and Swift protocol labels. */
|
|
12
25
|
export const discoverObjcProtocols = (names) => {
|
|
13
|
-
const protocols = uniqueByName(names.filter(({ name }) => name.includes(
|
|
26
|
+
const protocols = uniqueByName(names.filter(({ name }) => name.includes(OBJC_PROTOCOL_MARKER) ||
|
|
27
|
+
name.includes("_TtP") ||
|
|
28
|
+
(name.endsWith("Mp") &&
|
|
29
|
+
classifySwiftSymbol(name)?.category === "protocols")));
|
|
14
30
|
return {
|
|
15
31
|
count: protocols.length,
|
|
16
32
|
protocols: protocols.map(toJsonEntry),
|
|
17
33
|
};
|
|
18
34
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
["structs", "
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
["extensions", "_TtE"],
|
|
25
|
-
];
|
|
26
|
-
/** Categorize deduplicated Swift mangled symbols. */
|
|
27
|
-
export const categorizeSwiftTypes = (procedures, filter = {}) => {
|
|
28
|
-
const groups = Object.fromEntries([...SWIFT_CATEGORIES.map(([category]) => category), "other"].map((category) => [category, []]));
|
|
35
|
+
/** Categorize procedure names using Swift manglings at their exact addresses. */
|
|
36
|
+
export const categorizeSwiftTypes = (procedures, filter = {}, symbols = []) => {
|
|
37
|
+
const groups = Object.fromEntries(["classes", "structs", "enums", "protocols", "extensions", "other"].map((category) => [category, []]));
|
|
38
|
+
const aliases = swiftAliasesByAddress(symbols);
|
|
39
|
+
const pattern = filter.pattern;
|
|
29
40
|
const seen = new Set();
|
|
41
|
+
const unclassifiedNames = new Set();
|
|
42
|
+
const unclassified = [];
|
|
30
43
|
for (const entry of procedures) {
|
|
31
|
-
if (
|
|
44
|
+
if (seen.has(entry.name))
|
|
32
45
|
continue;
|
|
33
|
-
const
|
|
34
|
-
|
|
46
|
+
const mangledNames = [
|
|
47
|
+
...new Set([
|
|
48
|
+
...(classifySwiftSymbol(entry.name) === undefined ? [] : [entry.name]),
|
|
49
|
+
...(aliases.get(entry.address) ?? []),
|
|
50
|
+
]),
|
|
51
|
+
];
|
|
52
|
+
if (mangledNames.length === 0)
|
|
35
53
|
continue;
|
|
36
|
-
if (
|
|
54
|
+
if (pattern !== undefined &&
|
|
55
|
+
![entry.name, ...mangledNames].some((name) => name.includes(pattern)))
|
|
37
56
|
continue;
|
|
38
|
-
|
|
39
|
-
|
|
57
|
+
const kinds = new Set(mangledNames.map((name) => classifySwiftSymbol(name)?.category ?? null));
|
|
58
|
+
const category = kinds.size === 1 ? ([...kinds][0] ?? null) : null;
|
|
59
|
+
const item = {
|
|
60
|
+
address: entry.address,
|
|
61
|
+
name: entry.name,
|
|
62
|
+
mangled_names: mangledNames,
|
|
63
|
+
};
|
|
64
|
+
if (category === null && !unclassifiedNames.has(entry.name)) {
|
|
65
|
+
unclassifiedNames.add(entry.name);
|
|
66
|
+
unclassified.push({
|
|
67
|
+
...item,
|
|
68
|
+
reason: kinds.size > 1 && !kinds.has(null)
|
|
69
|
+
? "conflicting_categories"
|
|
70
|
+
: "category_not_decoded",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const bucket = category ?? "other";
|
|
74
|
+
if (filter.category === undefined || filter.category === bucket) {
|
|
75
|
+
seen.add(entry.name);
|
|
76
|
+
groups[bucket]?.push(item);
|
|
77
|
+
}
|
|
40
78
|
}
|
|
41
79
|
const categories = Object.fromEntries(Object.entries(groups).map(([category, items]) => [
|
|
42
80
|
category,
|
|
43
|
-
{ count: items.length, items
|
|
81
|
+
{ count: items.length, items },
|
|
44
82
|
]));
|
|
45
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
total: Object.values(groups).reduce((sum, items) => sum + items.length, 0),
|
|
85
|
+
categories,
|
|
86
|
+
unclassified,
|
|
87
|
+
limitations: [
|
|
88
|
+
"Identification uses Swift mangled procedure names or same-address symbol aliases. Demangled names without retained Swift manglings cannot be identified. Counts deduplicate procedure names, not source declarations.",
|
|
89
|
+
...(unclassified.length === 0
|
|
90
|
+
? []
|
|
91
|
+
: [
|
|
92
|
+
"Some Swift categories could not be established from the retained manglings. Unclassified observations remain inline regardless of the category filter.",
|
|
93
|
+
]),
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
const swiftAliasesByAddress = (symbols) => {
|
|
98
|
+
const aliases = new Map();
|
|
99
|
+
for (const { address, name } of symbols) {
|
|
100
|
+
if (classifySwiftSymbol(name) === undefined)
|
|
101
|
+
continue;
|
|
102
|
+
const existing = aliases.get(address);
|
|
103
|
+
if (existing === undefined)
|
|
104
|
+
aliases.set(address, [name]);
|
|
105
|
+
else
|
|
106
|
+
existing.push(name);
|
|
107
|
+
}
|
|
108
|
+
return aliases;
|
|
46
109
|
};
|
|
47
110
|
const uniqueByName = (entries) => {
|
|
48
111
|
const seen = new Set();
|
|
@@ -15,3 +15,9 @@ export const compareUnicodeCodePoints = (left, right) => {
|
|
|
15
15
|
return 0;
|
|
16
16
|
return leftIndex === left.length ? -1 : 1;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Collision-free composite key for deduplication/sorting. `\0`-joins
|
|
20
|
+
* collide when any component contains NUL (valid in JS property names);
|
|
21
|
+
* a JSON tuple escapes every component. Single owner for composite keys.
|
|
22
|
+
*/
|
|
23
|
+
export const compositeKey = (parts) => JSON.stringify(parts);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parse } from "@babel/parser";
|
|
2
2
|
import * as t from "@babel/types";
|
|
3
3
|
import { sanitizeEndpointCandidate } from "./browserObservation.js";
|
|
4
|
+
import { compositeKey } from "./unicodeCodePointOrder.js";
|
|
4
5
|
import { traverseJavaScriptAst } from "./javascript/javascriptSemanticTraversal.js";
|
|
5
6
|
import { classifyParsedJavaScriptOpenReceivers } from "./javascript/javascriptSemanticAnalysis.js";
|
|
6
7
|
import { semanticStaticPropertyName } from "./javascript/javascriptAstValues.js";
|
|
@@ -169,7 +170,14 @@ const addWebMcpDeclaration = (script, node, accumulator) => {
|
|
|
169
170
|
].filter(Boolean)
|
|
170
171
|
: [])
|
|
171
172
|
: [];
|
|
172
|
-
|
|
173
|
+
// Property names are a variable-length source-derived list: NUL-joins
|
|
174
|
+
// would collapse ["a\0b"] with ["a", "b"] and drop a declaration.
|
|
175
|
+
const key = compositeKey([
|
|
176
|
+
"webmcp",
|
|
177
|
+
script.script_key,
|
|
178
|
+
name ?? "",
|
|
179
|
+
schemaPropertyNames,
|
|
180
|
+
]);
|
|
173
181
|
addUnique(accumulator, key, () => accumulator.webMcp.push({
|
|
174
182
|
name: name ?? null,
|
|
175
183
|
description: description ?? null,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
3
|
import { webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
3
|
-
export { captureSnapshotSchema, compareWebCapturesInputSchema, webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
4
4
|
/** Compare normalized observations without treating incomplete absence as proof. */
|
|
5
5
|
export const compareWebCaptures = (input) => {
|
|
6
6
|
const before = input.before.inspection;
|
|
@@ -42,8 +42,8 @@ const compareIdentities = (before, after) => {
|
|
|
42
42
|
for (const identity of after.keys())
|
|
43
43
|
if (!before.has(identity))
|
|
44
44
|
changes.push({ identity, change: "added" });
|
|
45
|
-
return changes.sort((left, right) => left.identity
|
|
46
|
-
left.change
|
|
45
|
+
return changes.sort((left, right) => compareUnicodeCodePoints(left.identity, right.identity) ||
|
|
46
|
+
compareUnicodeCodePoints(left.change, right.change));
|
|
47
47
|
};
|
|
48
48
|
const compareDimension = (before, after, complete, reason) => {
|
|
49
49
|
const all = compareIdentities(before, after).filter(({ change }) => complete || change === "modified");
|
|
@@ -73,7 +73,7 @@ const accessibilityDimension = (before, after) => {
|
|
|
73
73
|
const afterAccess = accessibilityComparable(after);
|
|
74
74
|
const textComparable = beforeAccess.text && afterAccess.text;
|
|
75
75
|
const nodesComparable = beforeAccess.nodes && afterAccess.nodes;
|
|
76
|
-
return compareDimension(singleton("accessibility_tree",
|
|
76
|
+
return compareDimension(singleton("accessibility_tree", digestCanonicalValue(accessibilityProjection(before.accessibility, textComparable, nodesComparable))), singleton("accessibility_tree", digestCanonicalValue(accessibilityProjection(after.accessibility, textComparable, nodesComparable))), beforeAccess.complete && afterAccess.complete, "Accessibility tree or text capture was incomplete in at least one observation.");
|
|
77
77
|
};
|
|
78
78
|
const storageDimension = (before, after) => {
|
|
79
79
|
const keysComplete = storageKeysComparable(before) && storageKeysComparable(after);
|
|
@@ -87,32 +87,65 @@ const storageDimension = (before, after) => {
|
|
|
87
87
|
const compareWebCaptureDimensions = (input) => {
|
|
88
88
|
const before = input.before.inspection;
|
|
89
89
|
const after = input.after.inspection;
|
|
90
|
-
const dimension = compareDimension;
|
|
91
90
|
return {
|
|
92
|
-
dom_structure:
|
|
91
|
+
dom_structure: compareDimension(singleton("document", digestCanonicalValue(domProjection(before))), singleton("document", digestCanonicalValue(domProjection(after))), sectionsComplete(before, ["frames", "dom"]) &&
|
|
93
92
|
sectionsComplete(after, ["frames", "dom"]), "DOM or frame capture was incomplete in at least one observation."),
|
|
94
|
-
scripts:
|
|
93
|
+
scripts: compareDimension(keyed(before.scripts.items.map(scriptProjection), (item) => item.script_key), keyed(after.scripts.items.map(scriptProjection), (item) => item.script_key), sectionsComplete(before, ["scripts"]) &&
|
|
95
94
|
sectionsComplete(after, ["scripts"]), "Script inventory was incomplete in at least one observation."),
|
|
96
|
-
resources:
|
|
95
|
+
resources: compareDimension(keyed(before.resources, (item) => item.resource_key), keyed(after.resources, (item) => item.resource_key), sectionsComplete(before, ["resources"]) &&
|
|
97
96
|
sectionsComplete(after, ["resources"]), "Resource inventory was incomplete in at least one observation."),
|
|
98
|
-
network:
|
|
99
|
-
|
|
100
|
-
metadata: dimension(singleton("metadata", digest(metadataProjection(before))), singleton("metadata", digest(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
|
|
97
|
+
network: networkDimension(before, after),
|
|
98
|
+
metadata: compareDimension(singleton("metadata", digestCanonicalValue(metadataProjection(before))), singleton("metadata", digestCanonicalValue(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
|
|
101
99
|
sectionsComplete(after, ["metadata"]), "Safe metadata capture was incomplete in at least one observation."),
|
|
102
|
-
webmcp:
|
|
100
|
+
webmcp: compareDimension(webMcpMap(input.before.webmcp), webMcpMap(input.after.webmcp), webMcpComplete(input.before.webmcp) && webMcpComplete(input.after.webmcp), "WebMCP discovery was unavailable or incomplete in at least one capture."),
|
|
103
101
|
accessibility: accessibilityDimension(before, after),
|
|
104
102
|
storage: storageDimension(before, after),
|
|
105
103
|
};
|
|
106
104
|
};
|
|
107
|
-
const keyed = (values, identity) => new Map(values.map((value) => [identity(value),
|
|
108
|
-
const
|
|
105
|
+
const keyed = (values, identity) => new Map(values.map((value) => [identity(value), digestCanonicalValue(value)]));
|
|
106
|
+
const bodyShapesSelected = (inspection) => !inspection.completeness.excluded.some(({ section, reason }) => section === "json_body_shapes" && reason === "not_approved") &&
|
|
107
|
+
(inspection.network.requests.length === 0 ||
|
|
108
|
+
inspection.network.requests.some(({ body_shapes }) => body_shapes.status !== "not_approved"));
|
|
109
|
+
const networkIdentity = (request) => `net_${digestCanonicalValue({ method: request.method, url: request.url, resource_type: request.resource_type })}`;
|
|
110
|
+
const networkDimension = (before, after) => {
|
|
111
|
+
const selected = bodyShapesSelected(before) && bodyShapesSelected(after);
|
|
112
|
+
const sources = new Map();
|
|
113
|
+
if (selected) {
|
|
114
|
+
const observedSources = (inspection) => {
|
|
115
|
+
const result = new Map();
|
|
116
|
+
for (const request of inspection.network.requests) {
|
|
117
|
+
const identity = networkIdentity(request);
|
|
118
|
+
const previous = result.get(identity);
|
|
119
|
+
result.set(identity, {
|
|
120
|
+
request: previous?.request !== false && request.body_shapes.request !== null,
|
|
121
|
+
response: previous?.response !== false &&
|
|
122
|
+
request.body_shapes.response !== null,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
};
|
|
127
|
+
const left = observedSources(before);
|
|
128
|
+
const right = observedSources(after);
|
|
129
|
+
for (const [identity, coverage] of left) {
|
|
130
|
+
const next = right.get(identity);
|
|
131
|
+
sources.set(identity, {
|
|
132
|
+
request: coverage.request && next?.request === true,
|
|
133
|
+
response: coverage.response && next?.response === true,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const shapesComplete = !selected ||
|
|
138
|
+
[before, after].every((inspection) => sectionsComplete(inspection, ["json_body_shapes"]) &&
|
|
139
|
+
inspection.network.requests.every(({ body_shapes }) => body_shapes.status === "included"));
|
|
140
|
+
return compareDimension(networkMap(before, sources), networkMap(after, sources), sectionsComplete(before, ["network_requests"]) &&
|
|
141
|
+
sectionsComplete(after, ["network_requests"]) &&
|
|
142
|
+
shapesComplete, "Network capture or selected JSON body-shape coverage is attach-window limited, unavailable, or incomplete.");
|
|
143
|
+
};
|
|
144
|
+
const networkMap = (inspection, sources) => {
|
|
109
145
|
const grouped = new Map();
|
|
110
146
|
for (const request of inspection.network.requests) {
|
|
111
|
-
const identity =
|
|
112
|
-
|
|
113
|
-
url: request.url,
|
|
114
|
-
resource_type: request.resource_type,
|
|
115
|
-
})}`;
|
|
147
|
+
const identity = networkIdentity(request);
|
|
148
|
+
const shapes = sources.get(identity);
|
|
116
149
|
const values = grouped.get(identity) ?? [];
|
|
117
150
|
values.push({
|
|
118
151
|
status: request.status,
|
|
@@ -120,13 +153,18 @@ const networkMap = (inspection) => {
|
|
|
120
153
|
encoded_data_length: request.encoded_data_length,
|
|
121
154
|
redirects: (request.redirects ?? []).map(({ request_timestamp: _requestTimestamp, redirect_event_timestamp: _redirectEventTimestamp, ...redirect }) => redirect),
|
|
122
155
|
initiator: request.initiator,
|
|
123
|
-
|
|
156
|
+
...(shapes?.request === true
|
|
157
|
+
? { request_shape: request.body_shapes.request }
|
|
158
|
+
: {}),
|
|
159
|
+
...(shapes?.response === true
|
|
160
|
+
? { response_shape: request.body_shapes.response }
|
|
161
|
+
: {}),
|
|
124
162
|
});
|
|
125
163
|
grouped.set(identity, values);
|
|
126
164
|
}
|
|
127
165
|
return new Map([...grouped].map(([identity, values]) => [
|
|
128
166
|
identity,
|
|
129
|
-
|
|
167
|
+
digestCanonicalValue(values.map((value) => digestCanonicalValue(value)).sort()),
|
|
130
168
|
]));
|
|
131
169
|
};
|
|
132
170
|
const webMcpMap = (discovery) => discovery === null
|
|
@@ -148,7 +186,9 @@ const incompleteSections = (completeness) => new Set([
|
|
|
148
186
|
const domProjection = (inspection) => ({
|
|
149
187
|
frames: inspection.frames
|
|
150
188
|
.map(({ url, origin }) => ({ url, origin }))
|
|
151
|
-
.sort((left, right) => left.url
|
|
189
|
+
.sort((left, right) => compareUnicodeCodePoints(left.url, right.url) ||
|
|
190
|
+
compareUnicodeCodePoints(left.origin ?? "", right.origin ?? "") ||
|
|
191
|
+
Number(left.origin !== null) - Number(right.origin !== null)),
|
|
152
192
|
nodes: inspection.dom.nodes.map(({ index: _index, ...node }) => node),
|
|
153
193
|
});
|
|
154
194
|
const scriptProjection = (script) => ({
|
|
@@ -163,17 +203,18 @@ const scriptProjection = (script) => ({
|
|
|
163
203
|
const metadataProjection = (inspection) => ({
|
|
164
204
|
responses: inspection.metadata.responses
|
|
165
205
|
.map(({ request_id: _requestId, ...response }) => response)
|
|
166
|
-
.map((value) =>
|
|
206
|
+
.map((value) => digestCanonicalValue(value))
|
|
207
|
+
.sort(),
|
|
208
|
+
dom_urls: inspection.metadata.dom_urls
|
|
209
|
+
.map((value) => digestCanonicalValue(value))
|
|
167
210
|
.sort(),
|
|
168
|
-
dom_urls: inspection.metadata.dom_urls.map((value) => digest(value)).sort(),
|
|
169
211
|
agent_hints: inspection.metadata.agent_hints
|
|
170
|
-
.map((value) =>
|
|
212
|
+
.map((value) => digestCanonicalValue(value))
|
|
171
213
|
.sort(),
|
|
172
214
|
excluded_dom_urls: inspection.metadata.excluded_dom_urls,
|
|
173
215
|
headers_allowlisted: inspection.metadata.headers_allowlisted,
|
|
174
216
|
});
|
|
175
217
|
const singleton = (key, value) => new Map([[key, value]]);
|
|
176
|
-
const digest = (value) => canonicalDigest(value);
|
|
177
218
|
const accessibilityComparable = (inspection) => {
|
|
178
219
|
const text = inspection.accessibility.text_capture.status === "included" &&
|
|
179
220
|
inspection.accessibility.text_capture.excluded_fields === 0;
|
|
@@ -210,7 +251,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
|
|
|
210
251
|
const map = new Map([
|
|
211
252
|
[
|
|
212
253
|
"storage:summary",
|
|
213
|
-
|
|
254
|
+
digestCanonicalValue({
|
|
214
255
|
origin: storage.origin,
|
|
215
256
|
values_redacted: storage.values_redacted,
|
|
216
257
|
...(includeUsage
|
|
@@ -226,7 +267,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
|
|
|
226
267
|
return map;
|
|
227
268
|
const add = (kind, keys) => {
|
|
228
269
|
for (const key of keys) {
|
|
229
|
-
map.set(`storage:${kind}:${key}`,
|
|
270
|
+
map.set(`storage:${kind}:${key}`, digestCanonicalValue(key));
|
|
230
271
|
}
|
|
231
272
|
};
|
|
232
273
|
add("local_storage", storage.local_storage_keys);
|
|
@@ -237,7 +278,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
|
|
|
237
278
|
const identity = `${fingerprint.scope}:${fingerprint.identity_sha256}`;
|
|
238
279
|
if (!fingerprintIdentities.has(identity))
|
|
239
280
|
continue;
|
|
240
|
-
map.set(`storage:content:${identity}`,
|
|
281
|
+
map.set(`storage:content:${identity}`, digestCanonicalValue(fingerprint.value_sha256));
|
|
241
282
|
}
|
|
242
283
|
return map;
|
|
243
284
|
};
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { emptyArraySchema } from "./emptyArraySchema.js";
|
|
3
|
-
import { webPageInspectionSchema } from "./
|
|
3
|
+
import { webPageInspectionSchema } from "./browserObservationSchemas.js";
|
|
4
4
|
import { webMcpDiscoverySchema } from "./webMcpDiscovery.js";
|
|
5
5
|
/** One normalized passive page snapshot accepted by capture comparison. */
|
|
6
6
|
export const captureSnapshotSchema = z.object({
|
|
7
|
-
inspection: webPageInspectionSchema,
|
|
8
|
-
webmcp: webMcpDiscoverySchema
|
|
7
|
+
inspection: webPageInspectionSchema.describe("Complete normalized_result from inspect_web_page, including capture identity, observations, completeness, and limitations."),
|
|
8
|
+
webmcp: webMcpDiscoverySchema
|
|
9
|
+
.nullable()
|
|
10
|
+
.default(null)
|
|
11
|
+
.describe("Complete normalized_result from discover_webmcp_tools for this capture, or null when it was not recorded."),
|
|
9
12
|
});
|
|
10
13
|
/** Input for deterministic comparison of two normalized web captures. */
|
|
11
14
|
export const compareWebCapturesInputSchema = z.strictObject({
|
|
@@ -47,12 +50,6 @@ const dimensionSchema = z.union([
|
|
|
47
50
|
reason: z.string(),
|
|
48
51
|
}),
|
|
49
52
|
]);
|
|
50
|
-
const legacyUnknownDimension = {
|
|
51
|
-
status: "unknown",
|
|
52
|
-
total_changes: 0,
|
|
53
|
-
changes: [],
|
|
54
|
-
reason: "Dimension was not recorded by this version 1 capture diff.",
|
|
55
|
-
};
|
|
56
53
|
/** Completeness-aware changes across stable browser evidence dimensions. */
|
|
57
54
|
export const webCaptureDiffSchema = z
|
|
58
55
|
.object({
|
|
@@ -66,8 +63,8 @@ export const webCaptureDiffSchema = z
|
|
|
66
63
|
network: dimensionSchema,
|
|
67
64
|
metadata: dimensionSchema,
|
|
68
65
|
webmcp: dimensionSchema,
|
|
69
|
-
accessibility: dimensionSchema
|
|
70
|
-
storage: dimensionSchema
|
|
66
|
+
accessibility: dimensionSchema,
|
|
67
|
+
storage: dimensionSchema,
|
|
71
68
|
}),
|
|
72
69
|
limitations: z.array(z.string()),
|
|
73
70
|
})
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { webRuntimeLocationSchema, webRuntimeScopeSchema, webRuntimeSourceSchema, webRuntimeTargetSchema, } from "./webRuntime.js";
|
|
3
|
+
import { browserVersionSchema } from "./browserObservationSchemas.js";
|
|
3
4
|
/** Inspect listeners registered directly on the first main-document CSS match. */
|
|
4
5
|
export const inspectWebEventListenersInputSchema = webRuntimeScopeSchema.extend({
|
|
5
6
|
selector: z.string().min(1),
|
|
6
7
|
});
|
|
7
8
|
/** A listener declaration and its source location do not establish that it ran. */
|
|
8
9
|
export const webEventListenersSchema = z.object({
|
|
9
|
-
browser:
|
|
10
|
+
browser: browserVersionSchema,
|
|
10
11
|
target: webRuntimeTargetSchema,
|
|
11
12
|
inspected_at: z.iso.datetime(),
|
|
12
13
|
selected_node: z.object({
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { jsonObjectSchema } from "./jsonValue.js";
|
|
3
|
-
import {
|
|
3
|
+
import { webRuntimeLocationSchema, webRuntimeScopeSchema, webRuntimeSourceSchema, webRuntimeTargetSchema, } from "./webRuntime.js";
|
|
4
|
+
import { browserVersionSchema } from "./browserObservationSchemas.js";
|
|
4
5
|
/** Explicit instrumentation request for one finite, externally driven execution window. */
|
|
5
6
|
export const observeWebExecutionInputSchema = webRuntimeScopeSchema.extend({
|
|
6
7
|
observation_ms: z.number().int().min(1).max(2_147_483_647).default(10_000),
|
|
@@ -18,7 +19,7 @@ const functionSchema = z.object({
|
|
|
18
19
|
});
|
|
19
20
|
/** Precise V8 ranges retain their nested structure and counts without summing them. */
|
|
20
21
|
export const webExecutionSchema = z.object({
|
|
21
|
-
browser:
|
|
22
|
+
browser: browserVersionSchema,
|
|
22
23
|
target: webRuntimeTargetSchema,
|
|
23
24
|
window: z.object({
|
|
24
25
|
armed_at: z.iso.datetime(),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
3
4
|
/** Assign deterministic identities to a bounded resource inventory. */
|
|
4
5
|
export const stableWebResources = (resources) => {
|
|
5
6
|
const keyed = resources.map((resource) => ({
|
|
@@ -8,8 +9,8 @@ export const stableWebResources = (resources) => {
|
|
|
8
9
|
}));
|
|
9
10
|
return [
|
|
10
11
|
...new Map(keyed.map((resource) => [resource.resource_key, resource])).values(),
|
|
11
|
-
].sort((left, right) => left.resource_key
|
|
12
|
-
left.url
|
|
12
|
+
].sort((left, right) => compareUnicodeCodePoints(left.resource_key, right.resource_key) ||
|
|
13
|
+
compareUnicodeCodePoints(left.url, right.url));
|
|
13
14
|
};
|
|
14
15
|
/** Reconcile one script with resource-tree observations without fuzzy matching. */
|
|
15
16
|
export const reconcileWebScript = (script, resources) => {
|
|
@@ -2,8 +2,8 @@ import { z } from "zod";
|
|
|
2
2
|
import { browserCompletenessSchema } from "./browserCompleteness.js";
|
|
3
3
|
import { browserAllowedOriginsSchema, browserEndpointSchema, } from "./browserObservation.js";
|
|
4
4
|
import { browserVersionSchema } from "./browserObservationSchemas.js";
|
|
5
|
-
import {
|
|
6
|
-
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
|
+
import { jsonValueSchema } from "./jsonValue.js";
|
|
6
|
+
import { digestSchema, prefixedDigestSchema } from "./../domain/digests.js";
|
|
7
7
|
/** Input for passive discovery of page-registered WebMCP tools. */
|
|
8
8
|
export const discoverWebMcpToolsInputSchema = z.strictObject({
|
|
9
9
|
cdp_endpoint: browserEndpointSchema,
|
|
@@ -19,7 +19,8 @@ const webMcpToolSchema = z.object({
|
|
|
19
19
|
frame_url: z.string(),
|
|
20
20
|
owner_origin: z.string(),
|
|
21
21
|
declaration_kind: z.enum(["declarative", "imperative"]),
|
|
22
|
-
|
|
22
|
+
input_schema: jsonValueSchema.nullable(),
|
|
23
|
+
input_schema_sha256: digestSchema.nullable(),
|
|
23
24
|
annotations: z.object({
|
|
24
25
|
read_only: z.boolean().nullable(),
|
|
25
26
|
untrusted_content: z.boolean().nullable(),
|
|
@@ -71,8 +71,6 @@ export const webRuntimeTargetSchema = z.object({
|
|
|
71
71
|
frame_id: z.string().min(1),
|
|
72
72
|
loader_id: z.string().nullable(),
|
|
73
73
|
});
|
|
74
|
-
/** Producer product identity is observed separately from the unknown host platform. */
|
|
75
|
-
export const webRuntimeBrowserSchema = browserVersionSchema;
|
|
76
74
|
/** Complete runtime evidence has explicit byte budgets rather than silent item truncation. */
|
|
77
75
|
export const WEB_RUNTIME_LIMITS = {
|
|
78
76
|
protocolBytes: 64 * 1024 * 1024,
|
|
@@ -18,13 +18,13 @@ const sourceSchema = z.discriminatedUnion("kind", [
|
|
|
18
18
|
kind: z.literal("page-script"),
|
|
19
19
|
script_key: z.string().min(1),
|
|
20
20
|
frame_id: z.string().nullable(),
|
|
21
|
-
is_module: z.boolean(),
|
|
21
|
+
is_module: z.boolean().nullable(),
|
|
22
22
|
language: z.string().nullable(),
|
|
23
23
|
source_map_url: z.string().nullable(),
|
|
24
24
|
}),
|
|
25
25
|
z.strictObject({
|
|
26
26
|
kind: z.literal("scenario-response"),
|
|
27
|
-
transaction_id: z.string().
|
|
27
|
+
transaction_id: z.string().min(1),
|
|
28
28
|
request_sequence: z.number().int().min(1),
|
|
29
29
|
response_sequence: z.number().int().min(1).nullable(),
|
|
30
30
|
status: z.number().nullable(),
|