rea-agents 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -2,10 +2,11 @@ import { BrowserObservationError, } from "../domain/errors.js";
|
|
|
2
2
|
import { stableWebResources } from "../domain/webInventory.js";
|
|
3
3
|
import { CdpConnection } from "./CdpConnection.js";
|
|
4
4
|
import { CdpCaptureEvents } from "./CdpCaptureEvents.js";
|
|
5
|
+
import { authorizedMainFrame } from "./CdpAuthorizedMainFrame.js";
|
|
5
6
|
import { captureStorage } from "./CdpCaptureStorage.js";
|
|
6
7
|
import { optionalCdpCommand } from "./CdpOptionalCommand.js";
|
|
7
8
|
import { captureAccessibility, captureDom, captureFrames, captureResources, mainFrameUrl, } from "./CdpCaptureDocuments.js";
|
|
8
|
-
import { allowedSanitizedUrl, delayWithCancellation,
|
|
9
|
+
import { allowedSanitizedUrl, delayWithCancellation, } from "./CdpCaptureValues.js";
|
|
9
10
|
import { captureScripts } from "./CdpPageCaptureScripts.js";
|
|
10
11
|
import { captureWorkers } from "./CdpPageCaptureWorkers.js";
|
|
11
12
|
/** Capture and normalize one attached page without evaluating page JavaScript. */
|
|
@@ -23,7 +24,7 @@ export const capturePage = async (context) => {
|
|
|
23
24
|
allowedOrigins,
|
|
24
25
|
limitations: [
|
|
25
26
|
"Observation starts when REA attaches; prior network and console activity is unavailable.",
|
|
26
|
-
"Raw network headers, bodies, cookies, storage values, console objects, and WebSocket payloads are never retained; separately approved captures retain only
|
|
27
|
+
"Raw network headers, bodies, cookies, storage values, console objects, and WebSocket payloads are never retained; separately approved captures retain only redacted text or value-free shapes.",
|
|
27
28
|
"Source maps are reported only as declarative URLs and are not fetched.",
|
|
28
29
|
"URL-less scripts and console events without an allowed source URL are excluded because their origin cannot be proven.",
|
|
29
30
|
],
|
|
@@ -41,26 +42,24 @@ const captureAuthorizedPage = async (state) => {
|
|
|
41
42
|
const { connection, sessionId, input, signal } = context;
|
|
42
43
|
await authorizeObservationWindow(state);
|
|
43
44
|
await captureJsonResponseBodies(state);
|
|
44
|
-
const frameResult = await
|
|
45
|
+
const frameResult = await authorizedMainFrame({
|
|
46
|
+
connection: context.connection,
|
|
47
|
+
sessionId: context.sessionId,
|
|
48
|
+
signal: context.signal,
|
|
49
|
+
allowedOrigins,
|
|
50
|
+
delayOperation: context.operation,
|
|
51
|
+
});
|
|
45
52
|
const attachedUrl = mainFrameUrl(frameResult) ?? "";
|
|
46
|
-
const frameCapture = captureFrames(frameResult, allowedOrigins,
|
|
53
|
+
const frameCapture = captureFrames(frameResult, allowedOrigins, undefined, state.events.completeness);
|
|
47
54
|
const frames = frameCapture.items;
|
|
48
|
-
if (frameCapture.total > frames.length)
|
|
49
|
-
state.events.completeness.truncate("frames");
|
|
50
55
|
const captureFrame = frames[0];
|
|
51
56
|
if (captureFrame === undefined)
|
|
52
57
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
53
58
|
state.events.beginFinalCapture(captureFrame.frame_id);
|
|
54
|
-
const resourceCapture = captureResources(await connection.send("Page.getResourceTree", {}, sessionId, signal), allowedOrigins,
|
|
55
|
-
if (resourceCapture.total > resourceCapture.items.length)
|
|
56
|
-
state.events.completeness.truncate("resources");
|
|
59
|
+
const resourceCapture = captureResources(await connection.send("Page.getResourceTree", {}, sessionId, signal), allowedOrigins, state.events.completeness);
|
|
57
60
|
const resources = stableWebResources(resourceCapture.items.map(publicResource));
|
|
58
61
|
const dom = await capturePageDom(state);
|
|
59
|
-
if (dom.total > dom.nodes.length)
|
|
60
|
-
state.events.completeness.truncate("dom");
|
|
61
62
|
const accessibility = await accessibilityForFrames(state, frames);
|
|
62
|
-
if (accessibility.total > accessibility.nodes.length)
|
|
63
|
-
state.events.completeness.truncate("accessibility");
|
|
64
63
|
const scripts = await captureScripts({
|
|
65
64
|
context,
|
|
66
65
|
events: state.events,
|
|
@@ -68,15 +67,17 @@ const captureAuthorizedPage = async (state) => {
|
|
|
68
67
|
resources,
|
|
69
68
|
frameIds: new Set(frames.map((frame) => frame.frame_id)),
|
|
70
69
|
});
|
|
71
|
-
const
|
|
72
|
-
if (workerCapture.total > workerCapture.items.length)
|
|
73
|
-
state.events.completeness.truncate("workers");
|
|
70
|
+
const workers = await captureWorkers({ context, allowedOrigins, limitations, events: state.events }, new Set(frames.map((frame) => frame.frame_id)));
|
|
74
71
|
const storageCapture = await captureStorage(context, frames[0]?.origin ?? new URL(attachedUrl).origin, limitations);
|
|
75
|
-
if (storageCapture.truncated)
|
|
76
|
-
state.events.completeness.truncate("storage_keys");
|
|
77
72
|
if (!input.include_storage_keys)
|
|
78
73
|
state.events.completeness.exclude("storage_keys", "not_approved", null);
|
|
79
|
-
const completedFrameResult = await
|
|
74
|
+
const completedFrameResult = await authorizedMainFrame({
|
|
75
|
+
connection: context.connection,
|
|
76
|
+
sessionId: context.sessionId,
|
|
77
|
+
signal: context.signal,
|
|
78
|
+
allowedOrigins,
|
|
79
|
+
delayOperation: context.operation,
|
|
80
|
+
});
|
|
80
81
|
const completedUrl = mainFrameUrl(completedFrameResult) ?? "";
|
|
81
82
|
if (state.events.originViolation)
|
|
82
83
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
@@ -91,7 +92,7 @@ const captureAuthorizedPage = async (state) => {
|
|
|
91
92
|
accessibility,
|
|
92
93
|
scripts: scripts.inventory,
|
|
93
94
|
resources,
|
|
94
|
-
workers
|
|
95
|
+
workers,
|
|
95
96
|
storage: storageCapture.value,
|
|
96
97
|
}),
|
|
97
98
|
sourceMapRequests: scripts.sourceMapRequests,
|
|
@@ -118,9 +119,14 @@ const authorizeObservationWindow = async (state) => {
|
|
|
118
119
|
const { connection, sessionId, signal } = context;
|
|
119
120
|
await report(context.progress, 1, "Enabling passive CDP domains");
|
|
120
121
|
await connection.send("Page.enable", {}, sessionId, signal);
|
|
121
|
-
const initialFrameResult = await
|
|
122
|
-
|
|
123
|
-
.
|
|
122
|
+
const initialFrameResult = await authorizedMainFrame({
|
|
123
|
+
connection: context.connection,
|
|
124
|
+
sessionId: context.sessionId,
|
|
125
|
+
signal: context.signal,
|
|
126
|
+
allowedOrigins,
|
|
127
|
+
delayOperation: context.operation,
|
|
128
|
+
});
|
|
129
|
+
const mainFrame = captureFrames(initialFrameResult, allowedOrigins).items[0];
|
|
124
130
|
if (mainFrame === undefined)
|
|
125
131
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
126
132
|
events.beginAuthorizedFrame(mainFrame.frame_id);
|
|
@@ -140,7 +146,6 @@ const capturePageDom = async (state) => {
|
|
|
140
146
|
return captureDom(result, allowedOrigins, context.input, state.events.completeness);
|
|
141
147
|
};
|
|
142
148
|
const normalizedInspection = (state, captured) => ({
|
|
143
|
-
schema_version: 2,
|
|
144
149
|
browser: state.context.discovery.version,
|
|
145
150
|
target: normalizedTarget(state.context.target, captured.attachedUrl, state.allowedOrigins),
|
|
146
151
|
capture_window: {
|
|
@@ -183,32 +188,17 @@ const normalizedInspection = (state, captured) => ({
|
|
|
183
188
|
storage: captured.storage,
|
|
184
189
|
limitations: state.limitations,
|
|
185
190
|
});
|
|
186
|
-
const authorizedFrameTree = async (context, allowedOrigins) => {
|
|
187
|
-
for (let attempt = 0; attempt < 80; attempt += 1) {
|
|
188
|
-
const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
|
|
189
|
-
const currentUrl = mainFrameUrl(result);
|
|
190
|
-
if (allowedSanitizedUrl(currentUrl, allowedOrigins) !== undefined)
|
|
191
|
-
return result;
|
|
192
|
-
if (isHttpUrl(currentUrl))
|
|
193
|
-
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
194
|
-
await delayWithCancellation(25, context.operation, context.signal);
|
|
195
|
-
}
|
|
196
|
-
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
197
|
-
};
|
|
198
191
|
const enableObservationDomains = async (connection, sessionId, signal) => {
|
|
199
192
|
await connection.send("Runtime.enable", {}, sessionId, signal);
|
|
200
|
-
await connection.send("Debugger.enable", {
|
|
201
|
-
await connection.send("Network.enable", {
|
|
202
|
-
maxTotalBufferSize: 4 * 1_024 * 1_024,
|
|
203
|
-
maxResourceBufferSize: 1_024 * 1_024,
|
|
204
|
-
}, sessionId, signal);
|
|
193
|
+
await connection.send("Debugger.enable", {}, sessionId, signal);
|
|
194
|
+
await connection.send("Network.enable", {}, sessionId, signal);
|
|
205
195
|
};
|
|
206
196
|
const accessibilityForFrames = async (state, frames) => {
|
|
207
197
|
const { context, limitations, events } = state;
|
|
208
198
|
const results = [];
|
|
209
199
|
let unavailable = false;
|
|
210
200
|
for (const frame of frames) {
|
|
211
|
-
const result = await optionalCdpCommand(context, "Accessibility.getFullAXTree", {
|
|
201
|
+
const result = await optionalCdpCommand(context, "Accessibility.getFullAXTree", { frameId: frame.frame_id }, limitations);
|
|
212
202
|
if (result === undefined)
|
|
213
203
|
unavailable = true;
|
|
214
204
|
else
|
|
@@ -216,16 +206,12 @@ const accessibilityForFrames = async (state, frames) => {
|
|
|
216
206
|
}
|
|
217
207
|
if (unavailable)
|
|
218
208
|
events.completeness.unavailable("accessibility");
|
|
219
|
-
const capture = captureAccessibility(results,
|
|
209
|
+
const capture = captureAccessibility(results, {
|
|
220
210
|
includeText: context.input.include_accessibility_text,
|
|
221
|
-
maximumFieldBytes: context.input.limits.max_ax_text_field_bytes,
|
|
222
|
-
maximumTotalBytes: context.input.limits.max_total_ax_text_bytes,
|
|
223
211
|
...(results.length === 0 && unavailable ? { unavailable: true } : {}),
|
|
224
212
|
});
|
|
225
213
|
if (!context.input.include_accessibility_text)
|
|
226
214
|
events.completeness.exclude("accessibility", "not_approved", capture.textCapture.excluded_fields);
|
|
227
|
-
if (capture.textCapture.status === "truncated")
|
|
228
|
-
events.completeness.truncate("accessibility");
|
|
229
215
|
if (capture.treeIncomplete)
|
|
230
216
|
events.completeness.truncate("accessibility");
|
|
231
217
|
return capture;
|
|
@@ -246,7 +232,7 @@ const normalizedTarget = (target, currentUrl, allowedOrigins) => {
|
|
|
246
232
|
return {
|
|
247
233
|
target_id: target.id,
|
|
248
234
|
type: target.type,
|
|
249
|
-
title: target.title
|
|
235
|
+
title: target.title,
|
|
250
236
|
url: url?.url ?? "[unsupported-url]",
|
|
251
237
|
origin: url?.origin ?? "",
|
|
252
238
|
attached: target.attached,
|
|
@@ -8,7 +8,6 @@ export const captureScripts = async (options) => {
|
|
|
8
8
|
frameIds,
|
|
9
9
|
rawResources,
|
|
10
10
|
resources,
|
|
11
|
-
totalSourceBytes: 0,
|
|
12
11
|
};
|
|
13
12
|
const drafts = [];
|
|
14
13
|
for (const script of events.scripts.values())
|
|
@@ -42,26 +41,9 @@ const buildScriptDraft = async (script, state) => {
|
|
|
42
41
|
};
|
|
43
42
|
};
|
|
44
43
|
const captureScriptSource = async (script, state) => {
|
|
45
|
-
const { context
|
|
46
|
-
if (script.length > context.input.limits.max_script_source_bytes) {
|
|
47
|
-
events.completeness.truncate("script_sources");
|
|
48
|
-
return sourceExcluded("declared script length exceeds per-script limit");
|
|
49
|
-
}
|
|
50
|
-
if (state.totalSourceBytes + script.length >
|
|
51
|
-
context.input.limits.max_total_script_source_bytes) {
|
|
52
|
-
events.completeness.truncate("script_sources");
|
|
53
|
-
return sourceExcluded("total script source limit reached");
|
|
54
|
-
}
|
|
44
|
+
const { context } = state;
|
|
55
45
|
const result = requiredRecord(await context.connection.send("Debugger.getScriptSource", { scriptId: script.scriptId }, context.sessionId, context.signal));
|
|
56
46
|
const content = stringValue(result.scriptSource) ?? "";
|
|
57
|
-
const bytes = Buffer.byteLength(content);
|
|
58
|
-
if (bytes > context.input.limits.max_script_source_bytes ||
|
|
59
|
-
state.totalSourceBytes + bytes >
|
|
60
|
-
context.input.limits.max_total_script_source_bytes) {
|
|
61
|
-
events.completeness.truncate("script_sources");
|
|
62
|
-
return sourceExcluded("actual source exceeds configured byte limits");
|
|
63
|
-
}
|
|
64
|
-
state.totalSourceBytes += bytes;
|
|
65
47
|
return sourceResult(content);
|
|
66
48
|
};
|
|
67
49
|
const keyAndBuildInventory = (drafts, scriptCount) => {
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { allowedSanitizedUrl,
|
|
1
|
+
import { allowedSanitizedUrl, isHttpUrl, recordValue, recordsValue, stringValue, } from "./CdpCaptureValues.js";
|
|
2
2
|
import { optionalCdpCommand } from "./CdpOptionalCommand.js";
|
|
3
3
|
export const captureWorkers = async (input, frameIds) => {
|
|
4
4
|
const { context, allowedOrigins, limitations, events } = input;
|
|
5
5
|
const completeness = events.completeness;
|
|
6
6
|
const result = await optionalCdpCommand({ ...context, sessionId: undefined }, "Target.getTargets", {}, limitations);
|
|
7
7
|
const items = [];
|
|
8
|
-
let total = 0;
|
|
9
8
|
if (result === undefined)
|
|
10
9
|
completeness.unavailable("workers");
|
|
11
10
|
for (const target of recordsValue(recordValue(result)?.targetInfos)) {
|
|
@@ -29,18 +28,15 @@ export const captureWorkers = async (input, frameIds) => {
|
|
|
29
28
|
: "unsupported_url");
|
|
30
29
|
continue;
|
|
31
30
|
}
|
|
32
|
-
total += 1;
|
|
33
|
-
if (items.length >= context.input.limits.max_workers)
|
|
34
|
-
continue;
|
|
35
31
|
items.push({
|
|
36
|
-
target_id:
|
|
37
|
-
type
|
|
32
|
+
target_id: stringValue(target.targetId) ?? "",
|
|
33
|
+
type,
|
|
38
34
|
url: url.url,
|
|
39
35
|
origin: url.origin,
|
|
40
36
|
attached: target.attached === true,
|
|
41
|
-
opener_target_id:
|
|
42
|
-
parent_frame_id:
|
|
37
|
+
opener_target_id: stringValue(target.openerId) ?? null,
|
|
38
|
+
parent_frame_id: stringValue(target.parentFrameId) ?? null,
|
|
43
39
|
});
|
|
44
40
|
}
|
|
45
|
-
return
|
|
41
|
+
return items;
|
|
46
42
|
};
|
|
@@ -37,15 +37,15 @@ const normalizedHeaders = (value) => {
|
|
|
37
37
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
38
38
|
return new Map();
|
|
39
39
|
const headers = new Map();
|
|
40
|
-
for (const [name, raw] of Object.entries(value)
|
|
41
|
-
const normalized = name.toLowerCase()
|
|
40
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
41
|
+
const normalized = name.toLowerCase();
|
|
42
42
|
const header = typeof raw === "string"
|
|
43
43
|
? raw
|
|
44
44
|
: typeof raw === "number" && Number.isFinite(raw)
|
|
45
45
|
? String(raw)
|
|
46
46
|
: undefined;
|
|
47
47
|
if (header !== undefined)
|
|
48
|
-
headers.set(normalized, header
|
|
48
|
+
headers.set(normalized, header);
|
|
49
49
|
}
|
|
50
50
|
return headers;
|
|
51
51
|
};
|
|
@@ -53,13 +53,13 @@ const parseCsp = (value, baseUrl, allowedOrigins) => {
|
|
|
53
53
|
const directives = [];
|
|
54
54
|
let nonceCount = 0;
|
|
55
55
|
let hashCount = 0;
|
|
56
|
-
for (const rawDirective of (value ?? "").split(";")
|
|
56
|
+
for (const rawDirective of (value ?? "").split(";")) {
|
|
57
57
|
const [rawName, ...tokens] = rawDirective.trim().split(/\s+/u);
|
|
58
58
|
const name = (rawName ?? "").toLowerCase();
|
|
59
|
-
if (!/^[a-z][a-z0-9-]
|
|
59
|
+
if (!/^[a-z][a-z0-9-]*$/u.test(name))
|
|
60
60
|
continue;
|
|
61
61
|
const sources = [];
|
|
62
|
-
for (const token of tokens
|
|
62
|
+
for (const token of tokens) {
|
|
63
63
|
const lower = token.toLowerCase();
|
|
64
64
|
if (lower.startsWith("'nonce-")) {
|
|
65
65
|
nonceCount += 1;
|
|
@@ -80,9 +80,9 @@ const parseCsp = (value, baseUrl, allowedOrigins) => {
|
|
|
80
80
|
const cspSource = (token, baseUrl, allowedOrigins) => {
|
|
81
81
|
const lower = token.toLowerCase();
|
|
82
82
|
if (/^'[a-z0-9-]+'$/u.test(lower))
|
|
83
|
-
return { kind: "keyword", value: lower
|
|
83
|
+
return { kind: "keyword", value: lower };
|
|
84
84
|
if (/^[a-z][a-z0-9+.-]*:$/u.test(lower))
|
|
85
|
-
return { kind: "scheme", value: lower
|
|
85
|
+
return { kind: "scheme", value: lower };
|
|
86
86
|
try {
|
|
87
87
|
const parsed = new URL(token, baseUrl);
|
|
88
88
|
return allowedOrigins.has(parsed.origin)
|
|
@@ -95,8 +95,8 @@ const cspSource = (token, baseUrl, allowedOrigins) => {
|
|
|
95
95
|
};
|
|
96
96
|
const parseLinks = (value, baseUrl, allowedOrigins) => {
|
|
97
97
|
const links = [];
|
|
98
|
-
for (const entry of splitLinkHeader(value ?? "")
|
|
99
|
-
const match = /^\s*<([^>]
|
|
98
|
+
for (const entry of splitLinkHeader(value ?? "")) {
|
|
99
|
+
const match = /^\s*<([^>]*)>(.*)$/u.exec(entry);
|
|
100
100
|
if (match === null)
|
|
101
101
|
continue;
|
|
102
102
|
const parameters = linkParameters(match[2] ?? "");
|
|
@@ -107,8 +107,7 @@ const parseLinks = (value, baseUrl, allowedOrigins) => {
|
|
|
107
107
|
rel: (parameters.get("rel") ?? "")
|
|
108
108
|
.toLowerCase()
|
|
109
109
|
.split(/\s+/u)
|
|
110
|
-
.filter(Boolean)
|
|
111
|
-
.slice(0, 32),
|
|
110
|
+
.filter(Boolean),
|
|
112
111
|
as: boundedHeader(parameters.get("as")),
|
|
113
112
|
type: boundedHeader(parameters.get("type")),
|
|
114
113
|
crossorigin: boundedHeader(parameters.get("crossorigin")),
|
|
@@ -134,15 +133,15 @@ const splitLinkHeader = (value) => {
|
|
|
134
133
|
};
|
|
135
134
|
const linkParameters = (value) => {
|
|
136
135
|
const parameters = new Map();
|
|
137
|
-
for (const raw of value.split(";").slice(1
|
|
136
|
+
for (const raw of value.split(";").slice(1)) {
|
|
138
137
|
const separator = raw.indexOf("=");
|
|
139
138
|
const name = (separator < 0 ? raw : raw.slice(0, separator))
|
|
140
139
|
.trim()
|
|
141
140
|
.toLowerCase();
|
|
142
|
-
if (!/^[a-z][a-z0-9-]
|
|
141
|
+
if (!/^[a-z][a-z0-9-]*$/u.test(name))
|
|
143
142
|
continue;
|
|
144
143
|
const parameter = separator < 0 ? "" : raw.slice(separator + 1).trim();
|
|
145
|
-
parameters.set(name, unquote(parameter)
|
|
144
|
+
parameters.set(name, unquote(parameter));
|
|
146
145
|
}
|
|
147
146
|
return parameters;
|
|
148
147
|
};
|
|
@@ -163,10 +162,8 @@ const permissionFeatures = (value) => [
|
|
|
163
162
|
...new Set((value ?? "")
|
|
164
163
|
.split(",")
|
|
165
164
|
.map((entry) => entry.split("=", 1)[0]?.trim().toLowerCase() ?? "")
|
|
166
|
-
.filter((feature) => /^[a-z][a-z0-9-]
|
|
167
|
-
]
|
|
168
|
-
.sort()
|
|
169
|
-
.slice(0, 200);
|
|
165
|
+
.filter((feature) => /^[a-z][a-z0-9-]*$/u.test(feature))),
|
|
166
|
+
].sort();
|
|
170
167
|
const wellKnownHint = (url) => {
|
|
171
168
|
try {
|
|
172
169
|
const path = new URL(url).pathname.toLowerCase();
|
|
@@ -180,20 +177,20 @@ const wellKnownHint = (url) => {
|
|
|
180
177
|
};
|
|
181
178
|
const agentHint = (mechanism, declaration, url) => ({
|
|
182
179
|
mechanism,
|
|
183
|
-
declaration
|
|
180
|
+
declaration,
|
|
184
181
|
url,
|
|
185
182
|
trust: "page-declared-untrusted",
|
|
186
183
|
});
|
|
187
184
|
const isAgentRel = (value) => ["mcp", "model-context", "ai-plugin", "service-desc"].includes(value);
|
|
188
185
|
const policyToken = (value) => {
|
|
189
186
|
const token = (value ?? "").trim().toLowerCase();
|
|
190
|
-
return /^[a-z][a-z0-9_.-]
|
|
187
|
+
return /^[a-z][a-z0-9_.-]*$/u.test(token) ? token : null;
|
|
191
188
|
};
|
|
192
189
|
const nonnegativeInteger = (value) => {
|
|
193
190
|
const number = numberValue(value === undefined ? undefined : Number(value));
|
|
194
191
|
return number === undefined ? null : Math.max(0, Math.trunc(number));
|
|
195
192
|
};
|
|
196
|
-
const boundedHeader = (value) => value === undefined ? null : value.trim().toLowerCase()
|
|
193
|
+
const boundedHeader = (value) => value === undefined ? null : value.trim().toLowerCase();
|
|
197
194
|
const unquote = (value) => value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1) : value;
|
|
198
195
|
const agentHeaderNames = ["x-model-context", "x-webmcp", "mcp-server"];
|
|
199
196
|
const wellKnownAgentPaths = new Set([
|
|
@@ -38,8 +38,7 @@ export const captureCdpScreenshot = async (context) => {
|
|
|
38
38
|
}
|
|
39
39
|
const encoded = stringValue(result?.data);
|
|
40
40
|
const bytes = encoded === undefined ? undefined : decodeCanonicalBase64(encoded);
|
|
41
|
-
if (bytes === undefined
|
|
42
|
-
bytes.byteLength > context.input.maximum_image_bytes)
|
|
41
|
+
if (bytes === undefined)
|
|
43
42
|
throw new BrowserObservationError("inspect_web_page", "payload_limit");
|
|
44
43
|
const dimensions = pngDimensions(bytes);
|
|
45
44
|
if (navigation.leftScope)
|
|
@@ -57,7 +56,6 @@ export const captureCdpScreenshot = async (context) => {
|
|
|
57
56
|
terminal: true,
|
|
58
57
|
});
|
|
59
58
|
return {
|
|
60
|
-
schema_version: 1,
|
|
61
59
|
browser: context.discovery.version,
|
|
62
60
|
target: {
|
|
63
61
|
target_id: context.target.id,
|
|
@@ -94,8 +92,8 @@ const pngDimensions = (bytes) => {
|
|
|
94
92
|
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
95
93
|
const width = bytes.readUInt32BE(16);
|
|
96
94
|
const height = bytes.readUInt32BE(20);
|
|
97
|
-
if (width === 0 || height === 0
|
|
98
|
-
throw new BrowserObservationError("inspect_web_page", "
|
|
95
|
+
if (width === 0 || height === 0)
|
|
96
|
+
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
99
97
|
return { width, height };
|
|
100
98
|
};
|
|
101
99
|
const PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
@@ -40,8 +40,7 @@ const attachedSessionId = (value, operation) => {
|
|
|
40
40
|
value === null ||
|
|
41
41
|
!("sessionId" in value) ||
|
|
42
42
|
typeof value.sessionId !== "string" ||
|
|
43
|
-
value.sessionId.length === 0
|
|
44
|
-
value.sessionId.length > 256)
|
|
43
|
+
value.sessionId.length === 0)
|
|
45
44
|
throw new BrowserObservationError(operation, "protocol_error");
|
|
46
45
|
return value.sessionId;
|
|
47
46
|
};
|
|
@@ -5,7 +5,7 @@ import { BrowserObservationError } from "../domain/errors.js";
|
|
|
5
5
|
import { allowedSanitizedUrl, delayWithCancellation, numberValue, recordValue, recordsValue, stringValue, } from "./CdpCaptureValues.js";
|
|
6
6
|
import { captureFrames, mainFrameUrl } from "./CdpCaptureDocuments.js";
|
|
7
7
|
import { optionalCdpCommand } from "./CdpOptionalCommand.js";
|
|
8
|
-
import {
|
|
8
|
+
import { redactSensitiveText } from "./SensitiveTextCapture.js";
|
|
9
9
|
/** Discover WebMCP registrations without evaluating or invoking page code. */
|
|
10
10
|
export const discoverWebMcp = async (context) => {
|
|
11
11
|
const origins = new Set(context.input.allowed_origins);
|
|
@@ -19,7 +19,7 @@ export const discoverWebMcp = async (context) => {
|
|
|
19
19
|
const initialUrl = mainFrameUrl(frameTree);
|
|
20
20
|
if (allowedSanitizedUrl(initialUrl, origins) === undefined)
|
|
21
21
|
throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
|
|
22
|
-
const frames = captureFrames(frameTree, origins,
|
|
22
|
+
const frames = captureFrames(frameTree, origins, undefined, completeness).items;
|
|
23
23
|
const frameUrls = new Map(frames.map((frame) => [
|
|
24
24
|
frame.frame_id,
|
|
25
25
|
{
|
|
@@ -57,7 +57,7 @@ export const discoverWebMcp = async (context) => {
|
|
|
57
57
|
}
|
|
58
58
|
else
|
|
59
59
|
// CDP sends the enable response before the required toolsAdded replay.
|
|
60
|
-
await delayWithCancellation(
|
|
60
|
+
await delayWithCancellation(context.input.observation_ms, "discover_webmcp_tools", context.signal);
|
|
61
61
|
await assertStableAuthorizedFrame(context, initialUrl, origins);
|
|
62
62
|
return buildWebMcpResult({
|
|
63
63
|
context,
|
|
@@ -96,7 +96,7 @@ const ingestFrameScopeEvent = (event, state) => {
|
|
|
96
96
|
};
|
|
97
97
|
const handleFrameDetached = (params, state) => {
|
|
98
98
|
const frameId = stringValue(params.frameId);
|
|
99
|
-
if (frameId === undefined
|
|
99
|
+
if (frameId === undefined) {
|
|
100
100
|
state.completeness.exclude("webmcp_tools", "invalid_protocol_value");
|
|
101
101
|
return true;
|
|
102
102
|
}
|
|
@@ -105,7 +105,7 @@ const handleFrameDetached = (params, state) => {
|
|
|
105
105
|
};
|
|
106
106
|
const handleFrameUpdate = (frame, state) => {
|
|
107
107
|
const frameId = stringValue(frame?.id) ?? stringValue(frame?.frameId);
|
|
108
|
-
if (frameId === undefined
|
|
108
|
+
if (frameId === undefined) {
|
|
109
109
|
state.completeness.exclude("webmcp_tools", "invalid_protocol_value");
|
|
110
110
|
return true;
|
|
111
111
|
}
|
|
@@ -173,10 +173,6 @@ const ingestWebMcpEvent = (options) => {
|
|
|
173
173
|
const normalized = normalizeTool(declared, input, frames, completeness);
|
|
174
174
|
if (normalized === undefined)
|
|
175
175
|
continue;
|
|
176
|
-
if (!tools.has(normalized.tool_key) && tools.size >= input.max_tools) {
|
|
177
|
-
completeness.drop("webmcp_tools");
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
176
|
tools.set(normalized.tool_key, normalized);
|
|
181
177
|
}
|
|
182
178
|
};
|
|
@@ -191,19 +187,19 @@ const normalizeTool = (value, input, frames, completeness) => {
|
|
|
191
187
|
completeness.exclude("webmcp_tools", "out_of_target_scope");
|
|
192
188
|
return undefined;
|
|
193
189
|
}
|
|
194
|
-
const description =
|
|
190
|
+
const description = redactSensitiveText(stringValue(value.description) ?? "");
|
|
195
191
|
const annotations = recordValue(value.annotations);
|
|
196
192
|
return {
|
|
197
193
|
tool_key: toolKey(frame.url, name),
|
|
198
|
-
name:
|
|
194
|
+
name: redactSensitiveText(name),
|
|
199
195
|
description,
|
|
200
|
-
frame_id: frameId
|
|
196
|
+
frame_id: frameId,
|
|
201
197
|
frame_url: frame.url,
|
|
202
198
|
owner_origin: frame.origin,
|
|
203
199
|
declaration_kind: numberValue(value.backendNodeId) === undefined
|
|
204
200
|
? "imperative"
|
|
205
201
|
: "declarative",
|
|
206
|
-
input_schema_shape: schemaShape(value.inputSchema
|
|
202
|
+
input_schema_shape: schemaShape(value.inputSchema),
|
|
207
203
|
annotations: {
|
|
208
204
|
read_only: booleanOrNull(annotations?.readOnly),
|
|
209
205
|
untrusted_content: booleanOrNull(annotations?.untrustedContent),
|
|
@@ -213,17 +209,13 @@ const normalizeTool = (value, input, frames, completeness) => {
|
|
|
213
209
|
trust: "page-declared-untrusted",
|
|
214
210
|
};
|
|
215
211
|
};
|
|
216
|
-
const schemaShape = (value
|
|
212
|
+
const schemaShape = (value) => {
|
|
217
213
|
if (recordValue(value) === undefined)
|
|
218
214
|
return null;
|
|
219
215
|
const encoded = JSON.stringify(value);
|
|
220
|
-
const shape = inferJsonShape(encoded
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
maximumDepth: input.max_schema_depth,
|
|
224
|
-
});
|
|
225
|
-
if (shape === null || shape.truncated)
|
|
226
|
-
completeness.truncate("webmcp_tools");
|
|
216
|
+
const shape = inferJsonShape(encoded);
|
|
217
|
+
if (shape === null)
|
|
218
|
+
throw new BrowserObservationError("inspect_web_page", "protocol_error");
|
|
227
219
|
return shape;
|
|
228
220
|
};
|
|
229
221
|
const registrationSource = (stack, allowedOrigins) => {
|
|
@@ -242,7 +234,6 @@ const buildWebMcpResult = (options) => {
|
|
|
242
234
|
const targetUrl = mainFrameUrl(frameTree) ?? context.target.url;
|
|
243
235
|
const sanitized = allowedSanitizedUrl(targetUrl, new Set(context.input.allowed_origins));
|
|
244
236
|
return {
|
|
245
|
-
schema_version: 1,
|
|
246
237
|
browser: context.discovery.version,
|
|
247
238
|
target: {
|
|
248
239
|
target_id: context.target.id,
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import { realpath } from "node:fs/promises";
|
|
2
|
-
import { isAbsolute
|
|
1
|
+
import { realpath, stat } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
/**
|
|
5
|
-
export const
|
|
6
|
-
|
|
7
|
-
for (const root of roots)
|
|
8
|
-
canonical.push(await realpath(root));
|
|
9
|
-
return [...new Set(canonical)].sort();
|
|
10
|
-
};
|
|
11
|
-
/** Resolve one file URL and reject host, encoding, and symlink root escapes. */
|
|
12
|
-
export const authorizedElectronFile = async (value, roots) => {
|
|
13
|
-
if (value.length > 65_536 || /%(?:2f|5c)/iu.test(value))
|
|
4
|
+
/** Resolve one local file URL while rejecting remote hosts and encoded separators. */
|
|
5
|
+
export const authorizedElectronFile = async (value) => {
|
|
6
|
+
if (/%(?:2f|5c)/iu.test(value))
|
|
14
7
|
return undefined;
|
|
15
8
|
let url;
|
|
16
9
|
try {
|
|
@@ -35,16 +28,12 @@ export const authorizedElectronFile = async (value, roots) => {
|
|
|
35
28
|
return undefined;
|
|
36
29
|
let canonical;
|
|
37
30
|
try {
|
|
31
|
+
if (!(await stat(path)).isFile())
|
|
32
|
+
return undefined;
|
|
38
33
|
canonical = await realpath(path);
|
|
39
34
|
}
|
|
40
35
|
catch {
|
|
41
36
|
return undefined;
|
|
42
37
|
}
|
|
43
|
-
return
|
|
44
|
-
? canonical
|
|
45
|
-
: undefined;
|
|
46
|
-
};
|
|
47
|
-
const withinRoot = (root, path) => {
|
|
48
|
-
const remainder = relative(root, path);
|
|
49
|
-
return (remainder === "" || (!remainder.startsWith("..") && !isAbsolute(remainder)));
|
|
38
|
+
return canonical;
|
|
50
39
|
};
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import { browserOriginSchema, sanitizeBrowserUrl, } from "../domain/browserObservation.js";
|
|
2
|
-
import { authorizedElectronFile
|
|
3
|
-
/**
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
-
export const authorizeRuntimeLocation = async (value, roots, origins) => {
|
|
7
|
-
if (value.startsWith("node:") && value.length <= 4_096)
|
|
2
|
+
import { authorizedElectronFile } from "./ElectronFileScope.js";
|
|
3
|
+
/** Resolve a protocol location exposed by the explicitly selected Inspector endpoint. */
|
|
4
|
+
export const authorizeRuntimeLocation = async (value) => {
|
|
5
|
+
if (value.startsWith("node:") && value.length > 0)
|
|
8
6
|
return {
|
|
9
7
|
allowed: true,
|
|
10
8
|
location: { kind: "builtin", specifier: value },
|
|
11
9
|
};
|
|
12
10
|
if (value.startsWith("file:")) {
|
|
13
|
-
const filePath = await authorizedElectronFile(value
|
|
11
|
+
const filePath = await authorizedElectronFile(value);
|
|
14
12
|
return filePath === undefined
|
|
15
|
-
? { allowed: false, reason: "
|
|
13
|
+
? { allowed: false, reason: "unsupported_location" }
|
|
16
14
|
: { allowed: true, location: { kind: "file", file_path: filePath } };
|
|
17
15
|
}
|
|
18
16
|
let url;
|
|
@@ -25,8 +23,8 @@ export const authorizeRuntimeLocation = async (value, roots, origins) => {
|
|
|
25
23
|
if (!["http:", "https:"].includes(url.protocol))
|
|
26
24
|
return { allowed: false, reason: "unsupported_location" };
|
|
27
25
|
const parsedOrigin = browserOriginSchema.safeParse(url.origin);
|
|
28
|
-
if (!parsedOrigin.success
|
|
29
|
-
return { allowed: false, reason: "
|
|
26
|
+
if (!parsedOrigin.success)
|
|
27
|
+
return { allowed: false, reason: "unsupported_location" };
|
|
30
28
|
return {
|
|
31
29
|
allowed: true,
|
|
32
30
|
location: {
|
|
@@ -36,3 +34,5 @@ export const authorizeRuntimeLocation = async (value, roots, origins) => {
|
|
|
36
34
|
},
|
|
37
35
|
};
|
|
38
36
|
};
|
|
37
|
+
/** Authorize a target whose Node Inspector URL omits its main entry path. */
|
|
38
|
+
export const authorizeRuntimeTargetLocation = async (value) => authorizeRuntimeLocation(value);
|