rea-agents 3.2.1 → 4.0.1
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 +183 -332
- package/bridge/ghidra/ReaGhidraBridge.java +561 -74
- package/bridge/hopper_bridge.py +70 -27
- package/bridge/native/ReaNativeUI.swift +157 -0
- package/dist/application/AnalysisContextQueries.js +19 -5
- package/dist/application/AnalysisSnapshotCache.js +30 -11
- package/dist/application/AppleAssetCatalogAnalysis.js +171 -0
- package/dist/application/ArtifactExtractionDestination.js +0 -12
- package/dist/application/ArtifactGraphConstruction.js +44 -11
- package/dist/application/ArtifactInventory/classify.js +7 -15
- package/dist/application/ArtifactInventory/hash.js +4 -2
- package/dist/application/ArtifactInventory/policy.js +2 -17
- package/dist/application/ArtifactInventory/reader.js +3 -3
- package/dist/application/ArtifactInventory/scanCanonical.js +2 -2
- package/dist/application/ArtifactInventory/scanReader.js +12 -4
- package/dist/application/ArtifactInventory/types.js +0 -3
- package/dist/application/BinarySession.js +28 -43
- package/dist/application/BinarySessionExecution.js +37 -1
- package/dist/application/BinaryTargetResolver.js +50 -4
- package/dist/application/BrowserEvidence.js +36 -7
- package/dist/application/BrowserObservationService.js +17 -44
- package/dist/application/BrowserScenarioCaptureService.js +2 -35
- package/dist/application/BrowserScenarioEvidence.js +13 -9
- package/dist/application/CapabilityClientRequirements.js +2 -11
- package/dist/application/CapabilityInventory.js +21 -35
- package/dist/application/ClientConfigurationDocument.js +84 -7
- package/dist/application/ClientRegistrationIdentity.js +32 -0
- package/dist/application/ClientRegistrationStatus.js +59 -6
- package/dist/application/DirectAnalysis.js +37 -58
- package/dist/application/DirectAnalysisStatus.js +4 -4
- package/dist/application/Doctor.js +89 -80
- package/dist/application/DoctorDiagnostics.js +2 -26
- package/dist/application/DoctorScope.js +8 -14
- package/dist/application/ElectronActiveEvidence.js +10 -27
- package/dist/application/ElectronActiveObservationService.js +9 -36
- package/dist/application/ElectronBoundaryAnalysis.js +2 -0
- package/dist/application/ElectronBoundaryGraphNative.js +1 -1
- package/dist/application/ElectronEvidence.js +8 -3
- package/dist/application/ElectronObservationService.js +9 -25
- package/dist/application/EnhancedLiteralTracing.js +4 -8
- package/dist/application/EnhancedTools.js +15 -35
- package/dist/application/FilesystemSnapshot.js +7 -8
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +2 -1
- package/dist/application/JavaScriptApplicationWorkflowService.js +31 -7
- package/dist/application/JavaScriptArtifactAnalysis.js +6 -4
- package/dist/application/JavaScriptArtifactFiles.js +5 -0
- package/dist/application/JavaScriptArtifactPathResolution.js +179 -47
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +6 -3
- package/dist/application/JavaScriptRuntimeObservationService.js +9 -25
- package/dist/application/JavaScriptRuntimeReconciliationService.js +45 -4
- package/dist/application/JavaScriptSemanticGraphAsyncProjection.js +11 -0
- package/dist/application/JavaScriptSemanticGraphChildProcessProjection.js +11 -0
- package/dist/application/JavaScriptSemanticGraphDataProjection.js +11 -0
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +14 -5
- package/dist/application/JsonFiles.js +1 -1
- package/dist/application/LazyAnalysisProvider.js +27 -6
- package/dist/application/ManagedMemberComparisonService.js +19 -6
- package/dist/application/NativeApiInspection.js +2 -0
- package/dist/application/NativeCallRoutes.js +72 -0
- package/dist/application/NativeDispatchMetadataInspection.js +33 -0
- package/dist/application/NativeUiActionTrace.js +73 -49
- package/dist/application/NativeValueTrace.js +320 -0
- package/dist/application/ProcessCaptureCapability.js +32 -5
- package/dist/application/ProcessCaptureEnvironment.js +9 -26
- package/dist/application/ProcessCaptureError.js +1 -5
- package/dist/application/ProcessCaptureJournal.js +3 -40
- package/dist/application/ProcessCaptureLifecycle.js +102 -111
- package/dist/application/ProcessCli.js +18 -25
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessFilesystemEffects.js +36 -0
- package/dist/application/ProcessHarness.js +41 -120
- package/dist/application/ProcessNormalization.js +2 -17
- package/dist/application/ProcessScenarioRuntimeValidation.js +76 -0
- package/dist/application/ReferenceSourceImport.js +3 -4
- package/dist/application/Setup.js +236 -84
- package/dist/application/SetupClientConfiguration.js +14 -9
- package/dist/application/SetupPlan.js +138 -86
- package/dist/application/SetupSkill.js +0 -1
- package/dist/application/SupportedClients.js +102 -21
- package/dist/application/Uninstall.js +31 -20
- package/dist/application/Update.js +93 -0
- package/dist/application/UpdateMaintenance.js +108 -0
- package/dist/application/UpdateRuntime.js +126 -0
- package/dist/application/runtime.js +13 -2
- package/dist/artifacts/ArtifactPaths.js +6 -8
- package/dist/artifacts/ArtifactProvider.js +94 -41
- package/dist/artifacts/AsarArtifactReader.js +19 -4
- package/dist/artifacts/KeyedArchiveReader.js +110 -0
- package/dist/artifacts/MachOSliceArtifactReader.js +53 -5
- package/dist/artifacts/ZipArtifactReader.js +18 -1
- package/dist/browser/BrowserScenarioSecrets.js +28 -1
- package/dist/browser/CdpBrowserProvider.js +36 -15
- package/dist/browser/CdpCaptureDocuments.js +22 -8
- package/dist/browser/CdpCaptureEventHandlers.js +14 -5
- package/dist/browser/CdpCaptureEventHelpers.js +13 -0
- package/dist/browser/CdpCaptureEvents.js +10 -1
- package/dist/browser/CdpElectronInspection.js +5 -10
- package/dist/browser/CdpElectronProvider.js +1 -5
- package/dist/browser/CdpElectronScripts.js +1 -1
- package/dist/browser/CdpEndpoint.js +3 -2
- package/dist/browser/CdpObservationSession.js +14 -10
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpPageCaptureScripts.js +1 -1
- package/dist/browser/CdpSafeMetadata.js +5 -4
- package/dist/browser/CdpScreenshot.js +16 -5
- package/dist/browser/CdpTargetSession.js +25 -4
- package/dist/browser/CdpWebMcpDiscovery.js +93 -20
- package/dist/browser/JavaScriptRuntimeScope.js +28 -2
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +9 -8
- package/dist/browser/PlaywrightElectronActiveActions.js +3 -10
- package/dist/browser/PlaywrightElectronActiveProvider.js +5 -5
- package/dist/browser/PlaywrightScenarioActions.js +1 -1
- package/dist/browser/PlaywrightScenarioArtifacts.js +13 -25
- package/dist/browser/PlaywrightScenarioBrowser.js +28 -25
- package/dist/browser/PlaywrightScenarioEvents.js +82 -93
- package/dist/browser/PlaywrightScenarioSession.js +27 -123
- package/dist/browser/PngVisualDiff.js +22 -3
- package/dist/browser/V8InspectorCaptureProjection.js +7 -1
- package/dist/browser/V8InspectorProvider.js +60 -7
- package/dist/browser/WebSourceMapFetcher.js +99 -53
- package/dist/cli/artifactCommands.js +56 -12
- package/dist/cli/coreAnalysisCommands.js +110 -0
- package/dist/cli/managedCommands.js +1 -31
- package/dist/cli/setupCommands.js +16 -14
- package/dist/cli/utilityCommands.js +61 -4
- package/dist/cli.js +5 -7
- package/dist/cliApplicationCommands.js +0 -83
- package/dist/cliBrowserAdvancedCommands.js +7 -11
- package/dist/cliBrowserCommands.js +15 -23
- package/dist/cliBrowserContext.js +3 -24
- package/dist/cliBrowserScenarioCommands.js +2 -10
- package/dist/cliCommandNames.js +82 -7
- package/dist/cliElectronCommands.js +10 -36
- package/dist/cliJavaScriptRuntimeCommands.js +6 -30
- package/dist/cliJsonInput.js +4 -2
- package/dist/cliLogging.js +16 -7
- package/dist/cliObservationOptions.js +1 -1
- package/dist/cliOutput.js +2 -4
- package/dist/cliProcessCommands.js +6 -33
- package/dist/cliSetup.js +90 -160
- package/dist/config/environment.js +2 -78
- package/dist/config/parseConfig.js +18 -109
- package/dist/config/parsers.js +0 -23
- package/dist/contracts/applicationToolContracts.js +1 -118
- package/dist/contracts/artifactToolContracts.js +11 -19
- package/dist/contracts/browserScenarioToolContracts.js +1 -5
- package/dist/contracts/browserToolContracts.js +9 -16
- package/dist/contracts/electronToolContracts.js +5 -6
- package/dist/contracts/enhancedInputs.js +3 -2
- package/dist/contracts/errorSchemas.js +16 -40
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +2 -2
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +4 -4
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +1 -1
- package/dist/contracts/managedToolContracts.js +7 -4
- package/dist/contracts/managedWorkflowExamples.js +0 -22
- package/dist/contracts/managedWorkflowToolContracts.js +16 -31
- package/dist/contracts/nativeToolContracts.js +9 -0
- package/dist/contracts/promptContracts.js +6 -6
- package/dist/contracts/sessionToolSchemas.js +3 -3
- package/dist/contracts/toolContractExamples.js +4 -3
- package/dist/contracts/toolContracts.js +18 -7
- package/dist/contracts/toolEffects.js +34 -21
- package/dist/contracts/toolOutputSchemaGroups.js +18 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +9 -6
- package/dist/contracts/toolSchemaMetadata.js +5 -8
- package/dist/doctorRuntime.js +0 -41
- package/dist/domain/analysisErrorPresentation.js +4 -28
- package/dist/domain/analysisErrorProjection.js +33 -50
- package/dist/domain/analysisProfile.js +1 -1
- package/dist/domain/analysisSnapshot.js +77 -3
- package/dist/domain/androidApplication.js +5 -4
- package/dist/domain/appleApplication.js +5 -4
- package/dist/domain/appleAssetCatalog.js +127 -0
- package/dist/domain/artifactComparison.js +7 -11
- package/dist/domain/artifactGraph.js +8 -6
- package/dist/domain/artifactInspection.js +13 -12
- package/dist/domain/binaryTarget.js +23 -9
- package/dist/domain/browserObservation.js +43 -24
- package/dist/domain/browserObservationSchemas.js +2 -1
- package/dist/domain/browserScenario.js +7 -107
- package/dist/domain/browserScenarioCapture.js +0 -1
- package/dist/domain/browserScenarioCaptureValues.js +5 -4
- package/dist/domain/browserScenarioDiff.js +1 -3
- package/dist/domain/browserScenarioValues.js +16 -107
- package/dist/domain/bundleComparison.js +18 -17
- package/dist/domain/callPathSchemas.js +17 -7
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/comparisonSemantics.js +19 -0
- package/dist/domain/completionLedgerGeneration.js +3 -2
- package/dist/domain/conformancePackage.js +2 -1
- package/dist/domain/conformanceTrustGate.js +3 -5
- package/dist/domain/customProtocolCapture.js +2 -2
- package/dist/domain/digests.js +30 -0
- package/dist/domain/dosMz.js +83 -0
- package/dist/domain/electronActiveObservation.js +7 -5
- package/dist/domain/electronObservation.js +3 -2
- package/dist/domain/electronStaticAnalysisNative.js +15 -6
- package/dist/domain/emptyArraySchema.js +3 -0
- package/dist/domain/errors.js +10 -28
- package/dist/domain/evidence.js +5 -3
- package/dist/domain/evidenceCompletionLedger.js +3 -2
- package/dist/domain/functionComparisonNormalization.js +24 -18
- package/dist/domain/functionComparisonResults.js +3 -7
- package/dist/domain/functionComparisonSchemas.js +3 -2
- package/dist/domain/hopperValues.js +108 -8
- package/dist/domain/javascriptApplicationAnalysis.js +4 -7
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +4 -3
- package/dist/domain/javascriptApplicationGraphSchemas.js +8 -7
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +9 -7
- package/dist/domain/javascriptApplicationVersionItems.js +12 -18
- package/dist/domain/javascriptAstValues.js +4 -0
- package/dist/domain/javascriptExportShapeComparison.js +1 -6
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +6 -10
- package/dist/domain/javascriptExportShapeVariants.js +15 -2
- package/dist/domain/javascriptFeatureTraceSchemas.js +8 -7
- package/dist/domain/javascriptRuntimeObservation.js +14 -2
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +8 -0
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +4 -2
- package/dist/domain/javascriptRuntimeReconciliationResult.js +6 -4
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +19 -18
- package/dist/domain/javascriptRuntimeStaticCandidates.js +18 -6
- package/dist/domain/javascriptSemanticAnalysis.js +57 -19
- package/dist/domain/javascriptSemanticAsyncEffects.js +39 -40
- package/dist/domain/javascriptSemanticCalls.js +46 -27
- package/dist/domain/javascriptSemanticChildProcesses.js +43 -50
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +91 -18
- package/dist/domain/javascriptSemanticDataEffects.js +22 -10
- package/dist/domain/javascriptSemanticGraphSchemas.js +8 -6
- package/dist/domain/javascriptSemanticObjects.js +13 -3
- package/dist/domain/javascriptSemanticProjection.js +144 -38
- package/dist/domain/javascriptSemanticPromises.js +14 -27
- package/dist/domain/javascriptSemanticQuerySchemas.js +6 -9
- package/dist/domain/javascriptSemanticResources.js +2 -5
- package/dist/domain/javascriptSemanticState.js +4 -0
- package/dist/domain/javascriptSemanticTraceSchemas.js +2 -1
- package/dist/domain/javascriptSemanticTraversal.js +13 -5
- package/dist/domain/javascriptSemanticValues.js +10 -9
- package/dist/domain/javascriptSourceParser.js +5 -1
- package/dist/domain/javascriptStaticAnalysisCalls.js +8 -5
- package/dist/domain/javascriptStaticAnalysisHelpers.js +16 -7
- package/dist/domain/keyedArchive.js +181 -0
- package/dist/domain/managedApplicationGraph.js +4 -3
- package/dist/domain/managedArtifact.js +2 -1
- package/dist/domain/managedMemberComparison.js +18 -13
- package/dist/domain/managedMemberComparisonCoverage.js +2 -1
- package/dist/domain/managedMemberComparisonItems.js +27 -7
- package/dist/domain/managedMemberComparisonMatch.js +22 -6
- package/dist/domain/managedNativeVerificationMatch.js +2 -2
- package/dist/domain/managedNativeVerificationSchemas.js +7 -5
- package/dist/domain/managedReconstruction.js +6 -5
- package/dist/domain/nativeApiBoundary.js +7 -0
- package/dist/domain/nativeDataType.js +51 -0
- package/dist/domain/nativeInspection.js +0 -1
- package/dist/domain/nativeInstruction.js +82 -0
- package/dist/domain/nativeInvestigationGraph.js +9 -5
- package/dist/domain/nativeUiObservation.js +123 -0
- package/dist/domain/nativeValueFlow.js +17 -0
- package/dist/domain/nativeValueTrace.js +64 -0
- package/dist/domain/objcSwiftMetadata.js +39 -0
- package/dist/domain/peInspection.js +1 -0
- package/dist/domain/processCapture.js +5 -55
- package/dist/domain/processCaptureExample.js +0 -9
- package/dist/domain/processCaptureValidation.js +13 -144
- package/dist/domain/processComparison.js +3 -25
- package/dist/domain/processObservation.js +0 -29
- package/dist/domain/processScenario.js +28 -228
- package/dist/domain/processTraceDimensionProjection.js +0 -15
- package/dist/domain/processTraceEvaluation.js +0 -6
- package/dist/domain/protocolCapture.js +8 -36
- package/dist/domain/reconstructionCoverage.js +3 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +4 -12
- package/dist/domain/reconstructionReadinessSchemas.js +4 -3
- package/dist/domain/reconstructionVerification.js +2 -1
- package/dist/domain/reconstructionVerificationSchemas.js +6 -13
- package/dist/domain/referenceSourceClassification.js +0 -110
- package/dist/domain/referenceSourceGraph.js +15 -5
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/runtimeIdentification.js +6 -5
- package/dist/domain/sourceMapContents.js +5 -0
- package/dist/domain/sourceToBundleComparison.js +3 -10
- package/dist/domain/sourceToBundleComparisonSchemas.js +7 -6
- package/dist/domain/sourceToBundleSignals.js +9 -3
- package/dist/domain/staticRuntimeCorrelation.js +5 -11
- package/dist/domain/webBundleAnalysis.js +17 -9
- package/dist/domain/webBundleAnalyzer.js +1 -1
- package/dist/domain/webCaptureDiff.js +5 -11
- package/dist/domain/webCaptureDiffSchemas.js +2 -1
- package/dist/domain/webMcpDiscovery.js +2 -1
- package/dist/dotnet/ManagedMemberInspectorCore.js +15 -7
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +57 -40
- package/dist/dotnet/ManagedMemberRows.js +2 -0
- package/dist/dotnet/ManagedMethodBodyReader.js +15 -8
- package/dist/dotnet/ManagedPeReader.js +2 -0
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +15 -5
- package/dist/ghidra/GhidraClient.js +38 -8
- package/dist/ghidra/GhidraFunctionValues.js +56 -20
- package/dist/ghidra/GhidraInstallation.js +7 -4
- package/dist/ghidra/GhidraInventoryValues.js +44 -9
- package/dist/ghidra/GhidraLauncher.js +18 -3
- package/dist/ghidra/GhidraProvider.js +23 -2
- package/dist/ghidra/GhidraRequestQueue.js +45 -4
- package/dist/ghidra/GhidraSessionValues.js +5 -0
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperProvider.js +29 -6
- package/dist/hopper/HopperTargetLease.js +18 -4
- package/dist/logger.js +0 -13
- package/dist/main/messages.js +0 -1
- package/dist/main/reload.js +3 -32
- package/dist/main/shutdown.js +1 -2
- package/dist/main/transport.js +0 -17
- package/dist/main.js +0 -10
- package/dist/native/AppleDispatchMetadata.js +582 -0
- package/dist/native/AppleObjcProtocols.js +88 -0
- package/dist/native/AppleSwiftVtables.js +86 -0
- package/dist/native/CommandRunner.js +1 -1
- package/dist/native/NativeHostCapabilities.js +23 -0
- package/dist/native/NativeMacOSProvider.js +61 -9
- package/dist/native/NativeMachoInspection.js +39 -6
- package/dist/native/NativeUiHelperRuntime.js +42 -0
- package/dist/native/NativeUiObservation.js +174 -0
- package/dist/native/parsers/codesign.js +4 -1
- package/dist/native/parsers/dyldInfo.js +51 -25
- package/dist/native/parsers/lipo.js +13 -4
- package/dist/native/parsers/otool.js +84 -39
- package/dist/native/parsers/plist.js +2 -1
- package/dist/process/ExecFileOutput.js +5 -1
- package/dist/process/ProcessOwnership.js +69 -33
- package/dist/process/ProcessOwnershipObservation.js +31 -12
- package/dist/process/ProviderProcess.js +4 -2
- package/dist/reference/ReferenceSourceReaderEntries.js +48 -31
- package/dist/reference/ReferenceSourceReaderErrors.js +24 -0
- package/dist/reference/ReferenceSourceReaderFile.js +11 -5
- package/dist/reference/ReferenceSourceReaderValidate.js +22 -8
- package/dist/server/createServer.js +7 -62
- package/dist/server/registerApplicationTools/helpers.js +2 -9
- package/dist/server/registerApplicationTools.js +0 -4
- package/dist/server/registerArtifactComparisonTool.js +1 -1
- package/dist/server/registerBrowserScenarioTool.js +4 -2
- package/dist/server/registerBrowserTools.js +7 -7
- package/dist/server/registerBundleComparisonTool.js +1 -1
- package/dist/server/registerCloseLifecycleTool.js +1 -1
- package/dist/server/registerElectronTools.js +10 -4
- package/dist/server/registerEnhancedTools.js +20 -12
- package/dist/server/registerEvidenceTools.js +4 -28
- package/dist/server/registerFunctionComparisonTool.js +1 -1
- package/dist/server/registerInvestigationTools.js +6 -6
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -2
- package/dist/server/registerManagedTools.js +28 -14
- package/dist/server/registerManagedWorkflowTools.js +0 -2
- package/dist/server/registerProcessComparisonTool.js +1 -3
- package/dist/server/registerSessionRecordTools.js +9 -9
- package/dist/server/registerSessionStatusTool.js +1 -1
- package/dist/server/registerSessionTools.js +28 -57
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionToolPolicies.js +0 -4
- package/dist/server/toolResult.js +8 -10
- package/package.json +32 -22
- package/skills/reverse-engineer-anything/SKILL.md +15 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +3 -2
- package/skills/reverse-engineer-anything/references/javascript-applications.md +3 -2
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +8 -6
- package/skills/reverse-engineer-anything/references/runtime-observation.md +15 -11
- package/dist/application/CommandShimReplay.js +0 -152
- package/dist/application/ConfiguredRoots.js +0 -19
- package/dist/application/InstrumentedJavaScriptReplayHost.js +0 -36
- package/dist/application/JavaScriptReplayPermission.js +0 -16
- package/dist/application/JavaScriptReplayPlanning.js +0 -207
- package/dist/application/JavaScriptReplayService.js +0 -274
- package/dist/application/LoopbackReplay.js +0 -389
- package/dist/application/LoopbackReplayRecorder.js +0 -129
- package/dist/application/ManagedRuntimeCorrelationService.js +0 -104
- package/dist/application/NodeRuntimeCharacterizationService.js +0 -191
- package/dist/application/PermissionAuthority.js +0 -268
- package/dist/application/PermissionConfiguration.js +0 -26
- package/dist/application/PermissionFailure.js +0 -5
- package/dist/application/ProcessCaptureAuthority.js +0 -24
- package/dist/application/ProcessCapturePermission.js +0 -13
- package/dist/application/ProcessCheckpoints.js +0 -178
- package/dist/application/ProcessReactiveCoordinator.js +0 -223
- package/dist/application/ProcessReactiveEffects.js +0 -153
- package/dist/application/ProcessReactiveHarness.js +0 -106
- package/dist/application/ProcessReactiveObservations.js +0 -105
- package/dist/application/ProjectPermissionStore.js +0 -199
- package/dist/application/RuntimeExecutableDiagnostics.js +0 -198
- package/dist/application/Upgrade.js +0 -134
- package/dist/browser/SensitiveTextCapture.js +0 -8
- package/dist/cliPolicyCommands.js +0 -185
- package/dist/config/browserScenario.js +0 -77
- package/dist/config/electronAutomation.js +0 -35
- package/dist/config/javascriptReplay.js +0 -41
- package/dist/config/managedRuntime.js +0 -25
- package/dist/config/passiveObservation.js +0 -87
- package/dist/config/permissions.js +0 -23
- package/dist/config/processCapture.js +0 -47
- package/dist/contracts/replayMachineExample.js +0 -37
- package/dist/domain/javascriptExportInstrumentation.js +0 -95
- package/dist/domain/javascriptReplay.js +0 -360
- package/dist/domain/managedRuntimeCorrelation.js +0 -181
- package/dist/domain/nodeRuntimeCharacterization.js +0 -63
- package/dist/domain/permissionPolicy.js +0 -176
- package/dist/domain/processCaptureReactiveSchema.js +0 -68
- package/dist/domain/processCaptureReactiveValidation.js +0 -180
- package/dist/domain/processReactiveCheckpointDataflow.js +0 -32
- package/dist/domain/processReactiveMatching.js +0 -196
- package/dist/domain/processReactiveRuntime.js +0 -116
- package/dist/domain/processReactiveScenario.js +0 -296
- package/dist/domain/processReactiveScenarioPreflight.js +0 -95
- package/dist/domain/processReactiveTransition.js +0 -187
- package/dist/domain/replayMachine.js +0 -320
- package/dist/domain/replayMachineRun.js +0 -168
- package/dist/domain/replayMachineRuntime.js +0 -296
- package/dist/domain/replayMachineValues.js +0 -84
- package/dist/domain/runtimeCharacterization.js +0 -84
- package/dist/replay/JavaScriptReplayWorker.js +0 -382
- package/dist/replay/JavaScriptReplayWorkerTypes.js +0 -1
- package/dist/replay/LinuxJavaScriptReplayRunner.js +0 -216
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -121
- package/dist/replay/LinuxRuntimeClosure.js +0 -44
- package/dist/replay/LinuxSeccompPolicy.js +0 -40
- package/dist/replay/ReplayOutcome.js +0 -104
- package/dist/replay/ReplayProcessLifecycle.js +0 -96
- package/dist/replay/ReplaySeccompFile.js +0 -29
- package/dist/replay/ReplayWorkerProtocol.js +0 -58
- package/dist/replay/SystemJavaScriptReplayHost.js +0 -153
- package/dist/server/ProcessCaptureElicitation.js +0 -153
- package/dist/server/registerApplicationTools/characterization.js +0 -46
- package/dist/server/registerApplicationTools/controlledReplay.js +0 -31
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +0 -29
- package/dist/server/registerReplayMachineTool.js +0 -14
- package/skills/reverse-engineer-anything/references/controlled-replay.md +0 -12
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
import { readdir, readlink, realpath } from "node:fs/promises";
|
|
2
2
|
import { dirname, join, resolve } from "node:path";
|
|
3
3
|
import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
|
|
4
|
-
import { entryFailure, safeSize } from "./ReferenceSourceReaderErrors.js";
|
|
4
|
+
import { cancelled, entryFailure, filesystemFailureDetail, safeSize, } from "./ReferenceSourceReaderErrors.js";
|
|
5
5
|
import { isPathWithinRoot } from "../domain/localPath.js";
|
|
6
6
|
import { pathFromRoot } from "./ReferenceSourceReaderPaths.js";
|
|
7
7
|
import { readStableFile } from "./ReferenceSourceReaderFile.js";
|
|
8
8
|
import { isAborted, sameFile, validateDirectory, bigLstat, } from "./ReferenceSourceReaderValidate.js";
|
|
9
9
|
import {} from "./ReferenceSourceReaderTypes.js";
|
|
10
10
|
export const traverseDirectory = async (state, current) => {
|
|
11
|
-
const before = await validateDirectory(state.root, state.rootIdentity, current.path);
|
|
11
|
+
const before = await validateDirectory(state.root, state.rootIdentity, current.path, state.signal);
|
|
12
|
+
if (isAborted(state.signal))
|
|
13
|
+
return { ok: false, error: cancelled() };
|
|
12
14
|
if (!before.ok) {
|
|
13
15
|
state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", before.code, before.message));
|
|
14
16
|
return { ok: true, value: undefined };
|
|
15
17
|
}
|
|
16
18
|
const names = await readDirectoryNames(current.path);
|
|
19
|
+
if (isAborted(state.signal))
|
|
20
|
+
return { ok: false, error: cancelled() };
|
|
17
21
|
if (!names.ok) {
|
|
18
22
|
state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", "io", names.message));
|
|
19
23
|
return { ok: true, value: undefined };
|
|
20
24
|
}
|
|
21
25
|
if (isAborted(state.signal))
|
|
22
|
-
return {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
code: "cancelled",
|
|
27
|
-
message: "Reference source traversal cancelled",
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
const after = await validateDirectory(state.root, state.rootIdentity, current.path);
|
|
26
|
+
return { ok: false, error: cancelled() };
|
|
27
|
+
const after = await validateDirectory(state.root, state.rootIdentity, current.path, state.signal);
|
|
28
|
+
if (isAborted(state.signal))
|
|
29
|
+
return { ok: false, error: cancelled() };
|
|
31
30
|
if (!after.ok || !sameFile(before.stats, after.stats)) {
|
|
32
31
|
state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", "changed", "Directory changed while it was read"));
|
|
33
32
|
return { ok: true, value: undefined };
|
|
@@ -49,28 +48,27 @@ const readDirectoryNames = async (path) => {
|
|
|
49
48
|
value: (await readdir(path)).sort(compareUnicodeCodePoints),
|
|
50
49
|
};
|
|
51
50
|
}
|
|
52
|
-
catch {
|
|
53
|
-
|
|
51
|
+
catch (cause) {
|
|
52
|
+
const message = filesystemFailureDetail(cause, "Directory could not be read");
|
|
53
|
+
if (message === undefined)
|
|
54
|
+
throw cause;
|
|
55
|
+
return { ok: false, message };
|
|
54
56
|
}
|
|
55
57
|
};
|
|
56
58
|
const readMetadata = async (path) => {
|
|
57
59
|
try {
|
|
58
60
|
return { ok: true, value: await bigLstat(path) };
|
|
59
61
|
}
|
|
60
|
-
catch {
|
|
61
|
-
|
|
62
|
+
catch (cause) {
|
|
63
|
+
const message = filesystemFailureDetail(cause, "Entry metadata could not be read");
|
|
64
|
+
if (message === undefined)
|
|
65
|
+
throw cause;
|
|
66
|
+
return { ok: false, message };
|
|
62
67
|
}
|
|
63
68
|
};
|
|
64
69
|
const processEntry = async (state, current, name, directories) => {
|
|
65
70
|
if (isAborted(state.signal))
|
|
66
|
-
return {
|
|
67
|
-
ok: false,
|
|
68
|
-
error: {
|
|
69
|
-
tag: "reference-source-reader",
|
|
70
|
-
code: "cancelled",
|
|
71
|
-
message: "Reference source traversal cancelled",
|
|
72
|
-
},
|
|
73
|
-
};
|
|
71
|
+
return { ok: false, error: cancelled() };
|
|
74
72
|
const absolute = join(current.path, name);
|
|
75
73
|
const path = pathFromRoot(state.root, absolute);
|
|
76
74
|
const excluded = applyExclusion(state.shouldExclude, path);
|
|
@@ -86,6 +84,8 @@ const processEntry = async (state, current, name, directories) => {
|
|
|
86
84
|
if (excluded.value)
|
|
87
85
|
return { ok: true, value: undefined };
|
|
88
86
|
const metadata = await readMetadata(absolute);
|
|
87
|
+
if (isAborted(state.signal))
|
|
88
|
+
return { ok: false, error: cancelled() };
|
|
89
89
|
if (!metadata.ok) {
|
|
90
90
|
state.entries.push(entryFailure(path, "unknown", "io", metadata.message));
|
|
91
91
|
return { ok: true, value: undefined };
|
|
@@ -100,7 +100,7 @@ const processEntry = async (state, current, name, directories) => {
|
|
|
100
100
|
},
|
|
101
101
|
};
|
|
102
102
|
if (metadata.value.isSymbolicLink())
|
|
103
|
-
state.entries.push(await describeSymlink(state.root, absolute, path));
|
|
103
|
+
state.entries.push(await describeSymlink(state.root, absolute, path, state.signal));
|
|
104
104
|
else if (metadata.value.isDirectory()) {
|
|
105
105
|
state.entries.push({ status: "read", kind: "directory", path });
|
|
106
106
|
directories.push({ path: absolute });
|
|
@@ -124,7 +124,7 @@ const processFileEntry = async (state, absolute, path, metadata) => {
|
|
|
124
124
|
state.bytesRead += result.bytes.byteLength;
|
|
125
125
|
state.entries.push(result);
|
|
126
126
|
};
|
|
127
|
-
const describeSymlink = async (root, absolute, path) => {
|
|
127
|
+
const describeSymlink = async (root, absolute, path, signal) => {
|
|
128
128
|
try {
|
|
129
129
|
const rawTarget = await readlink(absolute);
|
|
130
130
|
const lexicalTarget = resolve(dirname(absolute), rawTarget);
|
|
@@ -133,7 +133,7 @@ const describeSymlink = async (root, absolute, path) => {
|
|
|
133
133
|
status: "read",
|
|
134
134
|
kind: "symlink",
|
|
135
135
|
path,
|
|
136
|
-
target:
|
|
136
|
+
target: lexicalTarget,
|
|
137
137
|
targetState: "external",
|
|
138
138
|
};
|
|
139
139
|
try {
|
|
@@ -150,22 +150,39 @@ const describeSymlink = async (root, absolute, path) => {
|
|
|
150
150
|
status: "read",
|
|
151
151
|
kind: "symlink",
|
|
152
152
|
path,
|
|
153
|
-
target:
|
|
153
|
+
target: canonicalTarget,
|
|
154
154
|
targetState: "external",
|
|
155
155
|
};
|
|
156
156
|
}
|
|
157
|
-
catch {
|
|
157
|
+
catch (cause) {
|
|
158
|
+
if (isAborted(signal))
|
|
159
|
+
return entryFailure(path, "symlink", "cancelled", "Symlink inspection cancelled");
|
|
160
|
+
const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
|
|
161
|
+
if (code !== "ENOENT") {
|
|
162
|
+
const message = filesystemFailureDetail(cause, "Symbolic link target could not be resolved");
|
|
163
|
+
if (message === undefined)
|
|
164
|
+
throw cause;
|
|
165
|
+
return entryFailure(path, "symlink", "io", message);
|
|
166
|
+
}
|
|
167
|
+
const missingOutsideRoot = !isPathWithinRoot(root, lexicalTarget);
|
|
158
168
|
return {
|
|
159
169
|
status: "read",
|
|
160
170
|
kind: "symlink",
|
|
161
171
|
path,
|
|
162
|
-
target:
|
|
172
|
+
target: missingOutsideRoot
|
|
173
|
+
? lexicalTarget
|
|
174
|
+
: pathFromRoot(root, lexicalTarget),
|
|
163
175
|
targetState: "missing",
|
|
164
176
|
};
|
|
165
177
|
}
|
|
166
178
|
}
|
|
167
|
-
catch {
|
|
168
|
-
|
|
179
|
+
catch (cause) {
|
|
180
|
+
if (isAborted(signal))
|
|
181
|
+
return entryFailure(path, "symlink", "cancelled", "Symlink inspection cancelled");
|
|
182
|
+
const message = filesystemFailureDetail(cause, "Symbolic link target could not be read");
|
|
183
|
+
if (message === undefined)
|
|
184
|
+
throw cause;
|
|
185
|
+
return entryFailure(path, "symlink", "io", message);
|
|
169
186
|
}
|
|
170
187
|
};
|
|
171
188
|
const applyExclusion = (shouldExclude, path) => {
|
|
@@ -9,6 +9,30 @@ export const safeSize = (size) => {
|
|
|
9
9
|
const value = Number(size);
|
|
10
10
|
return Number.isSafeInteger(value) && value >= 0 ? value : undefined;
|
|
11
11
|
};
|
|
12
|
+
const FILESYSTEM_ERROR_CODES = new Set([
|
|
13
|
+
"EACCES",
|
|
14
|
+
"EBADF",
|
|
15
|
+
"EEXIST",
|
|
16
|
+
"EIO",
|
|
17
|
+
"EISDIR",
|
|
18
|
+
"ELOOP",
|
|
19
|
+
"EMFILE",
|
|
20
|
+
"ENFILE",
|
|
21
|
+
"ENOENT",
|
|
22
|
+
"ENOTDIR",
|
|
23
|
+
"ENOSPC",
|
|
24
|
+
"EPERM",
|
|
25
|
+
"EROFS",
|
|
26
|
+
]);
|
|
27
|
+
/** Preserve actionable operating-system detail while leaving invariants visible. */
|
|
28
|
+
export const filesystemFailureDetail = (cause, operation) => {
|
|
29
|
+
if (!(cause instanceof Error))
|
|
30
|
+
return undefined;
|
|
31
|
+
const code = Reflect.get(cause, "code");
|
|
32
|
+
return typeof code === "string" && FILESYSTEM_ERROR_CODES.has(code)
|
|
33
|
+
? `${operation}: ${cause.message}`
|
|
34
|
+
: undefined;
|
|
35
|
+
};
|
|
12
36
|
export const entryFailure = (...[path, kind, code, message, size]) => ({
|
|
13
37
|
status: "failed",
|
|
14
38
|
kind,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { open } from "node:fs/promises";
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
|
-
import { entryFailure, safeSize } from "./ReferenceSourceReaderErrors.js";
|
|
4
|
+
import { entryFailure, filesystemFailureDetail, safeSize, } from "./ReferenceSourceReaderErrors.js";
|
|
5
5
|
import { isAborted, sameFile, validateDirectory, } from "./ReferenceSourceReaderValidate.js";
|
|
6
6
|
import {} from "./ReferenceSourceReaderTypes.js";
|
|
7
7
|
const READ_CHUNK_BYTES = 64 * 1024;
|
|
@@ -49,7 +49,7 @@ const readFileContents = async (request) => {
|
|
|
49
49
|
const finalizeFileRead = async (request) => {
|
|
50
50
|
const { root, rootIdentity, absolute, path, handle, before, parentBefore, chunks, total, } = request;
|
|
51
51
|
const after = await handle.stat({ bigint: true });
|
|
52
|
-
const parentAfter = await validateDirectory(root, rootIdentity, dirname(absolute));
|
|
52
|
+
const parentAfter = await validateDirectory(root, rootIdentity, dirname(absolute), request.signal);
|
|
53
53
|
if (!parentAfter.ok || !sameFile(parentBefore.stats, parentAfter.stats))
|
|
54
54
|
return entryFailure(path, "file", "changed", "Parent directory changed while file was read", total);
|
|
55
55
|
if (!sameFile(before, after) || BigInt(total) !== after.size)
|
|
@@ -66,7 +66,7 @@ export const readStableFile = async (request) => {
|
|
|
66
66
|
const { root, rootIdentity, absolute, path, expected, signal } = request;
|
|
67
67
|
let handle;
|
|
68
68
|
try {
|
|
69
|
-
const parentBefore = await validateDirectory(root, rootIdentity, dirname(absolute));
|
|
69
|
+
const parentBefore = await validateDirectory(root, rootIdentity, dirname(absolute), signal);
|
|
70
70
|
if (!parentBefore.ok)
|
|
71
71
|
return entryFailure(path, "file", parentBefore.code, parentBefore.message, safeSize(expected.size));
|
|
72
72
|
handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
@@ -90,10 +90,16 @@ export const readStableFile = async (request) => {
|
|
|
90
90
|
parentBefore,
|
|
91
91
|
chunks: contents.chunks,
|
|
92
92
|
total: contents.total,
|
|
93
|
+
...(signal === undefined ? {} : { signal }),
|
|
93
94
|
});
|
|
94
95
|
}
|
|
95
|
-
catch {
|
|
96
|
-
|
|
96
|
+
catch (cause) {
|
|
97
|
+
if (isAborted(signal))
|
|
98
|
+
return entryFailure(path, "file", "cancelled", "File read cancelled", safeSize(expected.size));
|
|
99
|
+
const message = filesystemFailureDetail(cause, "File could not be read safely");
|
|
100
|
+
if (message === undefined)
|
|
101
|
+
throw cause;
|
|
102
|
+
return entryFailure(path, "file", "io", message, safeSize(expected.size));
|
|
97
103
|
}
|
|
98
104
|
finally {
|
|
99
105
|
await handle?.close().catch(() => undefined);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { lstat, realpath } from "node:fs/promises";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
|
-
import { cancelled, failure } from "./ReferenceSourceReaderErrors.js";
|
|
4
|
+
import { cancelled, failure, filesystemFailureDetail, } from "./ReferenceSourceReaderErrors.js";
|
|
5
5
|
import { isPathWithinRoot } from "../domain/localPath.js";
|
|
6
6
|
import {} from "./ReferenceSourceReaderTypes.js";
|
|
7
7
|
export const bigLstat = (path) => lstat(path, { bigint: true });
|
|
@@ -12,7 +12,7 @@ export const sameFile = (left, right) => left.dev === right.dev &&
|
|
|
12
12
|
left.ctimeNs === right.ctimeNs;
|
|
13
13
|
export const isAborted = (signal) => signal?.aborted === true;
|
|
14
14
|
export const noFollowOpenSupported = () => Number.isSafeInteger(constants.O_NOFOLLOW) && constants.O_NOFOLLOW !== 0;
|
|
15
|
-
export const validateDirectory = async (root, rootIdentity, path) => {
|
|
15
|
+
export const validateDirectory = async (root, rootIdentity, path, signal) => {
|
|
16
16
|
try {
|
|
17
17
|
const rootNow = await bigLstat(root);
|
|
18
18
|
if (!sameFile(rootIdentity, rootNow))
|
|
@@ -39,11 +39,20 @@ export const validateDirectory = async (root, rootIdentity, path) => {
|
|
|
39
39
|
};
|
|
40
40
|
return { ok: true, stats };
|
|
41
41
|
}
|
|
42
|
-
catch {
|
|
42
|
+
catch (cause) {
|
|
43
|
+
if (isAborted(signal))
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
code: "cancelled",
|
|
47
|
+
message: "Reference source traversal cancelled",
|
|
48
|
+
};
|
|
49
|
+
const message = filesystemFailureDetail(cause, "Directory identity could not be verified");
|
|
50
|
+
if (message === undefined)
|
|
51
|
+
throw cause;
|
|
43
52
|
return {
|
|
44
53
|
ok: false,
|
|
45
54
|
code: "io",
|
|
46
|
-
message
|
|
55
|
+
message,
|
|
47
56
|
};
|
|
48
57
|
}
|
|
49
58
|
};
|
|
@@ -53,16 +62,21 @@ export const prepareRoot = async (root, signal) => {
|
|
|
53
62
|
try {
|
|
54
63
|
const metadata = await bigLstat(root);
|
|
55
64
|
if (metadata.isSymbolicLink() || !metadata.isDirectory())
|
|
56
|
-
return err(failure("invalid-root",
|
|
65
|
+
return err(failure("invalid-root", `Reference source root is not a directory: ${root}`));
|
|
57
66
|
const canonicalRoot = await realpath(root);
|
|
58
67
|
if (isAborted(signal))
|
|
59
68
|
return err(cancelled());
|
|
60
69
|
const canonicalMetadata = await bigLstat(canonicalRoot);
|
|
61
70
|
if (!sameFile(metadata, canonicalMetadata))
|
|
62
|
-
return err(failure("invalid-root",
|
|
71
|
+
return err(failure("invalid-root", `Reference source root changed during resolution: ${root}`));
|
|
63
72
|
return ok({ canonicalRoot, rootIdentity: canonicalMetadata });
|
|
64
73
|
}
|
|
65
|
-
catch {
|
|
66
|
-
|
|
74
|
+
catch (cause) {
|
|
75
|
+
if (isAborted(signal))
|
|
76
|
+
return err(cancelled());
|
|
77
|
+
const message = filesystemFailureDetail(cause, "Reference source root could not be resolved");
|
|
78
|
+
if (message === undefined)
|
|
79
|
+
throw cause;
|
|
80
|
+
return err(failure("invalid-root", `${message}: ${root}`));
|
|
67
81
|
}
|
|
68
82
|
};
|
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CLIENT_CAPABILITIES_META_KEY, createRequestStateCodec, McpServer, PROTOCOL_VERSION_META_KEY, } from "@modelcontextprotocol/server";
|
|
3
|
-
import { MANAGED_RUNTIME_DISABLED } from "../application/ManagedRuntimeCorrelationService.js";
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
4
2
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
5
3
|
import { silentLogger } from "../logger.js";
|
|
6
|
-
import { LinuxJavaScriptReplayRunner } from "../replay/LinuxJavaScriptReplayRunner.js";
|
|
7
|
-
import { SystemJavaScriptReplayHost } from "../replay/SystemJavaScriptReplayHost.js";
|
|
8
|
-
import { mcpEnvelopeValue } from "./mcpClientMetadata.js";
|
|
9
|
-
import { PROCESS_CAPTURE_ELICITATION_POLICY, } from "./ProcessCaptureElicitation.js";
|
|
10
4
|
import { registerApplicationTools } from "./registerApplicationTools.js";
|
|
11
5
|
import { registerArtifactTools } from "./registerArtifactTools.js";
|
|
12
6
|
import { registerBrowserScenarioTool } from "./registerBrowserScenarioTool.js";
|
|
@@ -21,53 +15,29 @@ import { registerOfficialTools } from "./registerOfficialTools.js";
|
|
|
21
15
|
import { registerGuidedPrompts } from "./registerPrompts.js";
|
|
22
16
|
import { registerSessionTools } from "./registerSessionTools.js";
|
|
23
17
|
import { sessionAvailabilityPolicy } from "./sessionAvailabilityPolicy.js";
|
|
24
|
-
import { DENY_PROCESS_POLICY } from "./sessionToolPolicies.js";
|
|
25
18
|
const TARGET_FREE_INSTRUCTIONS = "REA provides reverse-engineering tools for local artifacts, native binaries, managed code, browser pages, and runtimes. Use the tool that directly answers the question; discover targets or inspect inventory only when needed. Tool results include inline Evidence and report their coverage and limitations.";
|
|
26
19
|
const ACTIVE_TARGET_INSTRUCTIONS = "REA analyzes the active reverse-engineering target. Use the analysis tool that answers the question directly. Search or list symbols when discovery is needed; analyze_function provides a function dossier, and focused procedure tools return individual facets.";
|
|
27
20
|
const installSessionToolAvailability = (server, session, options) => {
|
|
28
21
|
if (session === undefined)
|
|
29
22
|
return undefined;
|
|
30
23
|
const policy = sessionAvailabilityPolicy(options.availabilityPolicy, {
|
|
31
|
-
processPolicy: options.processPolicy?.() ?? DENY_PROCESS_POLICY,
|
|
32
24
|
optionalFeatures: {
|
|
33
25
|
browserObservationEnabled: options.browserObservation !== undefined,
|
|
34
26
|
browserScenarioEnabled: options.browserScenarioCapture !== undefined,
|
|
35
27
|
electronObservationEnabled: options.electronObservation !== undefined,
|
|
36
|
-
electronAutomationEnabled: options.electronActiveObservation !== undefined
|
|
37
|
-
options.permissionAuthority !== undefined,
|
|
28
|
+
electronAutomationEnabled: options.electronActiveObservation !== undefined,
|
|
38
29
|
v8InspectorObservationEnabled: options.javascriptRuntimeObservation !== undefined,
|
|
39
|
-
javascriptReplayEnabled: options.javascriptReplayPolicy?.().status === "enabled",
|
|
40
|
-
managedRuntimeEnabled: options.managedRuntimePolicy?.().status === "enabled",
|
|
41
30
|
},
|
|
42
31
|
});
|
|
43
32
|
return {
|
|
44
33
|
policy,
|
|
45
34
|
};
|
|
46
35
|
};
|
|
47
|
-
const
|
|
48
|
-
stateCodec,
|
|
49
|
-
supported: (context) => {
|
|
50
|
-
const envelope = context.mcpReq.envelope;
|
|
51
|
-
const version = mcpEnvelopeValue(envelope, PROTOCOL_VERSION_META_KEY);
|
|
52
|
-
const capabilities = mcpEnvelopeValue(envelope, CLIENT_CAPABILITIES_META_KEY);
|
|
53
|
-
return (typeof version === "string" &&
|
|
54
|
-
PROCESS_CAPTURE_ELICITATION_POLICY.protocolVersions.some((supported) => supported === version) &&
|
|
55
|
-
isRecord(capabilities) &&
|
|
56
|
-
isRecord(capabilities.elicitation) &&
|
|
57
|
-
capabilities.elicitation.form !== undefined);
|
|
58
|
-
},
|
|
59
|
-
now: Date.now,
|
|
60
|
-
consumedNonces: new Map(),
|
|
61
|
-
});
|
|
62
|
-
const createMcpServer = (processCaptureStateCodec, session) => new McpServer({
|
|
36
|
+
const createMcpServer = (session) => new McpServer({
|
|
63
37
|
name: PRODUCT_IDENTITY.mcpServerKey,
|
|
64
38
|
version: PRODUCT_IDENTITY.packageVersion,
|
|
65
39
|
}, {
|
|
66
40
|
capabilities: {},
|
|
67
|
-
inputRequired: {
|
|
68
|
-
roundTimeoutMs: PROCESS_CAPTURE_ELICITATION_POLICY.roundTimeoutMs,
|
|
69
|
-
},
|
|
70
|
-
requestState: { verify: processCaptureStateCodec.verify },
|
|
71
41
|
instructions: session === undefined
|
|
72
42
|
? ACTIVE_TARGET_INSTRUCTIONS
|
|
73
43
|
: TARGET_FREE_INSTRUCTIONS,
|
|
@@ -80,26 +50,16 @@ const createMcpServer = (processCaptureStateCodec, session) => new McpServer({
|
|
|
80
50
|
export const createServer = (analysis, session, options = {}) => {
|
|
81
51
|
const startedAt = new Date().toISOString();
|
|
82
52
|
const logger = options.logger ?? silentLogger;
|
|
83
|
-
const
|
|
84
|
-
const processCaptureStateCodec = createRequestStateCodec({
|
|
85
|
-
key: randomBytes(32),
|
|
86
|
-
ttlSeconds: PROCESS_CAPTURE_ELICITATION_POLICY.stateTtlSeconds,
|
|
87
|
-
});
|
|
88
|
-
const server = createMcpServer(processCaptureStateCodec, session);
|
|
53
|
+
const server = createMcpServer(session);
|
|
89
54
|
const availability = installSessionToolAvailability(server, session, options);
|
|
90
|
-
server.server.onclose = () => {
|
|
91
|
-
permissionAuthority?.clearSessionGrants();
|
|
92
|
-
};
|
|
93
55
|
const toolLogger = logger.child({ layer: "server" });
|
|
94
56
|
const { activeTarget, recordEvidence, recordEvidenceWithUnknown } = createSessionRecorders(server, session);
|
|
95
|
-
const processCaptureElicitation = createProcessCaptureElicitation(processCaptureStateCodec);
|
|
96
57
|
const toolContext = {
|
|
97
58
|
server,
|
|
98
59
|
analysis,
|
|
99
60
|
session,
|
|
100
61
|
options,
|
|
101
62
|
logger: toolLogger,
|
|
102
|
-
permissionAuthority,
|
|
103
63
|
activeTarget,
|
|
104
64
|
recordEvidence,
|
|
105
65
|
recordEvidenceWithUnknown,
|
|
@@ -113,14 +73,11 @@ export const createServer = (analysis, session, options = {}) => {
|
|
|
113
73
|
...(availability === undefined
|
|
114
74
|
? {}
|
|
115
75
|
: { availabilityPolicy: availability.policy }),
|
|
116
|
-
...(permissionAuthority === undefined ? {} : { permissionAuthority }),
|
|
117
76
|
startedAt,
|
|
118
|
-
processCaptureElicitation,
|
|
119
77
|
});
|
|
120
78
|
}
|
|
121
79
|
return server;
|
|
122
80
|
};
|
|
123
|
-
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
124
81
|
const createSessionRecorders = (server, session) => ({
|
|
125
82
|
activeTarget: session === undefined ? undefined : () => session.activeTarget(),
|
|
126
83
|
recordEvidence: session === undefined
|
|
@@ -136,7 +93,7 @@ const createSessionRecorders = (server, session) => ({
|
|
|
136
93
|
return recorded;
|
|
137
94
|
},
|
|
138
95
|
});
|
|
139
|
-
const registerBinaryAnalysisTools = ({ server, analysis, session,
|
|
96
|
+
const registerBinaryAnalysisTools = ({ server, analysis, session, logger, activeTarget, recordEvidence, recordEvidenceWithUnknown, }) => {
|
|
140
97
|
const recordUnknown = session === undefined
|
|
141
98
|
? undefined
|
|
142
99
|
: (input) => session.recordUnknown(input);
|
|
@@ -155,7 +112,6 @@ const registerBinaryAnalysisTools = ({ server, analysis, session, options, logge
|
|
|
155
112
|
registerNativeTools(server, analysis, evidenceOptions);
|
|
156
113
|
registerArtifactTools(server, analysis, {
|
|
157
114
|
...evidenceOptions,
|
|
158
|
-
...(permissionAuthority === undefined ? {} : { permissionAuthority }),
|
|
159
115
|
});
|
|
160
116
|
registerManagedTools(server, analysis, {
|
|
161
117
|
...evidenceOptions,
|
|
@@ -167,14 +123,10 @@ const registerBinaryAnalysisTools = ({ server, analysis, session, options, logge
|
|
|
167
123
|
recordEvidence,
|
|
168
124
|
recordEvidenceWithUnknown,
|
|
169
125
|
session,
|
|
170
|
-
runtime: {
|
|
171
|
-
policy: options.managedRuntimePolicy ?? (() => MANAGED_RUNTIME_DISABLED),
|
|
172
|
-
authority: permissionAuthority,
|
|
173
|
-
},
|
|
174
126
|
});
|
|
175
127
|
};
|
|
176
|
-
const registerObservationTools = ({ server, options, logger,
|
|
177
|
-
const common = { logger,
|
|
128
|
+
const registerObservationTools = ({ server, options, logger, recordEvidence, recordEvidenceWithUnknown, }) => {
|
|
129
|
+
const common = { logger, recordEvidence };
|
|
178
130
|
registerBrowserTools(server, {
|
|
179
131
|
...common,
|
|
180
132
|
browser: options.browserObservation,
|
|
@@ -196,12 +148,5 @@ const registerObservationTools = ({ server, options, logger, permissionAuthority
|
|
|
196
148
|
logger,
|
|
197
149
|
recordEvidence,
|
|
198
150
|
recordEvidenceWithUnknown,
|
|
199
|
-
permissionAuthority,
|
|
200
|
-
replay: {
|
|
201
|
-
policy: options.javascriptReplayPolicy ?? (() => ({ status: "disabled" })),
|
|
202
|
-
host: options.javascriptReplayHost ?? new SystemJavaScriptReplayHost(),
|
|
203
|
-
runner: options.javascriptReplayRunner ?? new LinuxJavaScriptReplayRunner(),
|
|
204
|
-
authority: permissionAuthority,
|
|
205
|
-
},
|
|
206
151
|
});
|
|
207
152
|
};
|
|
@@ -30,17 +30,10 @@ const unknownRegistration = (evidence, kind) => ({
|
|
|
30
30
|
? [
|
|
31
31
|
{
|
|
32
32
|
operation: "reconcile_javascript_runtime",
|
|
33
|
-
rationale: "Add
|
|
33
|
+
rationale: "Add passive runtime Evidence without promoting it to static fact.",
|
|
34
34
|
},
|
|
35
35
|
]
|
|
36
|
-
:
|
|
37
|
-
? []
|
|
38
|
-
: [
|
|
39
|
-
{
|
|
40
|
-
operation: "run_controlled_replay",
|
|
41
|
-
rationale: "Validate exact approved module behavior separately when runtime semantics are required.",
|
|
42
|
-
},
|
|
43
|
-
]),
|
|
36
|
+
: []),
|
|
44
37
|
],
|
|
45
38
|
relationships: [],
|
|
46
39
|
});
|
|
@@ -3,8 +3,6 @@ import { registerTraceJavaScriptSemanticsTool } from "./registerApplicationTools
|
|
|
3
3
|
import { registerCompareApplicationVersionsTool } from "./registerApplicationTools/compareVersions.js";
|
|
4
4
|
import { registerCompareSourceToBundleTool } from "./registerApplicationTools/compareSourceToBundle.js";
|
|
5
5
|
import { registerCompareJavaScriptExportShapesTool } from "./registerApplicationTools/compareExportShapes.js";
|
|
6
|
-
import { registerControlledReplayTool } from "./registerApplicationTools/controlledReplay.js";
|
|
7
|
-
import { registerCharacterizationTools } from "./registerApplicationTools/characterization.js";
|
|
8
6
|
import { registerCoverageTools } from "./registerApplicationTools/coverage.js";
|
|
9
7
|
import { registerReconstructionObligationLedgerTool } from "./registerApplicationTools/obligationLedger.js";
|
|
10
8
|
/** Register provider-neutral JavaScript application graph workflows. */
|
|
@@ -14,8 +12,6 @@ export const registerApplicationTools = (server, options) => {
|
|
|
14
12
|
registerCompareApplicationVersionsTool(server, options);
|
|
15
13
|
registerCompareSourceToBundleTool(server, options);
|
|
16
14
|
registerCompareJavaScriptExportShapesTool(server, options);
|
|
17
|
-
registerControlledReplayTool(server, options);
|
|
18
|
-
registerCharacterizationTools(server, options);
|
|
19
15
|
registerReconstructionObligationLedgerTool(server, options);
|
|
20
16
|
registerCoverageTools(server, options);
|
|
21
17
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { toolContract } from "../contracts/toolContracts.js";
|
|
2
2
|
import { compareArtifacts } from "../domain/artifactComparison.js";
|
|
3
3
|
import { createEvidence, parseEvidence } from "../domain/evidence.js";
|
|
4
4
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
@@ -4,12 +4,14 @@ import { browserScenarioSchema } from "../domain/browserScenario.js";
|
|
|
4
4
|
import { logToolExecution } from "./toolLogging.js";
|
|
5
5
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
6
6
|
import { toCallToolResult } from "./toolResult.js";
|
|
7
|
-
/** Register the
|
|
7
|
+
/** Register the browser scenario tool with execution-time provider diagnostics. */
|
|
8
8
|
export const registerBrowserScenarioTool = (server, options) => {
|
|
9
9
|
const [contract] = BROWSER_SCENARIO_TOOL_CONTRACTS;
|
|
10
10
|
server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
|
|
11
11
|
const scenario = browserScenarioSchema.parse(input);
|
|
12
|
-
const result = await logToolExecution(options.logger, contract.name, () => captureBrowserScenario(options.provider,
|
|
12
|
+
const result = await logToolExecution(options.logger, contract.name, () => captureBrowserScenario(options.provider, scenario, {
|
|
13
|
+
signal: context.mcpReq.signal,
|
|
14
|
+
}));
|
|
13
15
|
if (!result.ok)
|
|
14
16
|
return toCallToolResult(result, contract);
|
|
15
17
|
const recorded = options.recordEvidence?.(result.value);
|
|
@@ -6,28 +6,28 @@ import { mcpProgressReporter } from "./mcpProgress.js";
|
|
|
6
6
|
import { logToolExecution } from "./toolLogging.js";
|
|
7
7
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
8
8
|
import { toCallToolResult } from "./toolResult.js";
|
|
9
|
-
/** Register browser tools
|
|
9
|
+
/** Register browser tools with execution-time provider diagnostics. */
|
|
10
10
|
// oxlint-disable-next-line max-lines-per-function -- direct SDK calls retain each schema-handler type correlation.
|
|
11
11
|
export const registerBrowserTools = (server, options) => {
|
|
12
12
|
const [listContract, inspectContract, analyzeContract, sessionContract, webMcpContract, captureDiffContract, screenshotContract, screenshotDiffContract,] = BROWSER_TOOL_CONTRACTS;
|
|
13
|
-
server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input, context) => runBrowserTool(options, listContract, { input, context }, (parsed, { signal }) => listBrowserTargets(options.browser,
|
|
13
|
+
server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input, context) => runBrowserTool(options, listContract, { input, context }, (parsed, { signal }) => listBrowserTargets(options.browser, parsed, {
|
|
14
14
|
signal,
|
|
15
15
|
})));
|
|
16
|
-
server.registerTool(inspectContract.name, toolRegistrationOptions(inspectContract), (input, context) => runBrowserTool(options, inspectContract, { input, context }, (parsed, { signal, progress }) => inspectWebPage(options.browser,
|
|
17
|
-
server.registerTool(analyzeContract.name, toolRegistrationOptions(analyzeContract), (input, context) => runBrowserTool(options, analyzeContract, { input, context }, (parsed, { signal, progress }) => analyzeWebBundle(options.browser,
|
|
16
|
+
server.registerTool(inspectContract.name, toolRegistrationOptions(inspectContract), (input, context) => runBrowserTool(options, inspectContract, { input, context }, (parsed, { signal, progress }) => inspectWebPage(options.browser, inspectWebPageInputSchema.parse(parsed), { signal, progress })));
|
|
17
|
+
server.registerTool(analyzeContract.name, toolRegistrationOptions(analyzeContract), (input, context) => runBrowserTool(options, analyzeContract, { input, context }, (parsed, { signal, progress }) => analyzeWebBundle(options.browser, analyzeWebBundleInputSchema.parse(parsed), {
|
|
18
18
|
signal,
|
|
19
19
|
progress,
|
|
20
20
|
})));
|
|
21
|
-
server.registerTool(sessionContract.name, toolRegistrationOptions(sessionContract), (input, context) => runBrowserTool(options, sessionContract, { input, context }, (parsed, { signal, progress }) => observeWebSession(options.browser,
|
|
21
|
+
server.registerTool(sessionContract.name, toolRegistrationOptions(sessionContract), (input, context) => runBrowserTool(options, sessionContract, { input, context }, (parsed, { signal, progress }) => observeWebSession(options.browser, parsed, {
|
|
22
22
|
signal,
|
|
23
23
|
progress,
|
|
24
24
|
})));
|
|
25
|
-
server.registerTool(webMcpContract.name, toolRegistrationOptions(webMcpContract), (input, context) => runBrowserTool(options, webMcpContract, { input, context }, (parsed, { signal, progress }) => discoverWebMcpTools(options.browser,
|
|
25
|
+
server.registerTool(webMcpContract.name, toolRegistrationOptions(webMcpContract), (input, context) => runBrowserTool(options, webMcpContract, { input, context }, (parsed, { signal, progress }) => discoverWebMcpTools(options.browser, parsed, {
|
|
26
26
|
signal,
|
|
27
27
|
progress,
|
|
28
28
|
})));
|
|
29
29
|
server.registerTool(captureDiffContract.name, toolRegistrationOptions(captureDiffContract), (input, context) => runBrowserTool(options, captureDiffContract, { input, context }, (parsed) => compareWebCaptureEvidence(options.browser, parsed)));
|
|
30
|
-
server.registerTool(screenshotContract.name, toolRegistrationOptions(screenshotContract), (input, context) => runBrowserTool(options, screenshotContract, { input, context }, (parsed, { signal, progress }) => captureWebScreenshot(options.browser,
|
|
30
|
+
server.registerTool(screenshotContract.name, toolRegistrationOptions(screenshotContract), (input, context) => runBrowserTool(options, screenshotContract, { input, context }, (parsed, { signal, progress }) => captureWebScreenshot(options.browser, parsed, {
|
|
31
31
|
signal,
|
|
32
32
|
progress,
|
|
33
33
|
})));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readEvidenceBundle } from "../application/EvidenceBundleFiles.js";
|
|
2
|
-
import {
|
|
2
|
+
import { toolContract } from "../contracts/toolContracts.js";
|
|
3
3
|
import { compareBundles } from "../domain/bundleComparison.js";
|
|
4
4
|
import { createEvidence } from "../domain/evidence.js";
|
|
5
5
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
@@ -6,7 +6,7 @@ import { logToolExecution } from "./toolLogging.js";
|
|
|
6
6
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
7
7
|
import { toCallToolResult } from "./toolResult.js";
|
|
8
8
|
/** Register provider cleanup and optional pre-close snapshot persistence. */
|
|
9
|
-
export const registerCloseLifecycleTool = ({ server, session, logger,
|
|
9
|
+
export const registerCloseLifecycleTool = ({ server, session, logger, closeContract, }) => {
|
|
10
10
|
server.registerTool(closeContract.name, toolRegistrationOptions(closeContract), async (input, context) => {
|
|
11
11
|
const progress = mcpProgressReporter(context);
|
|
12
12
|
if (input.snapshot_path === undefined) {
|
|
@@ -8,20 +8,26 @@ import { mcpProgressReporter } from "./mcpProgress.js";
|
|
|
8
8
|
import { logToolExecution } from "./toolLogging.js";
|
|
9
9
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
10
10
|
import { toCallToolResult } from "./toolResult.js";
|
|
11
|
-
/** Register Electron tools even when provider
|
|
11
|
+
/** Register Electron tools even when a provider is absent. */
|
|
12
12
|
// oxlint-disable-next-line max-lines-per-function -- direct SDK calls retain each schema-handler type correlation.
|
|
13
13
|
export const registerElectronTools = (server, options) => {
|
|
14
14
|
const [listContract, inspectContract, analyzeContract, reconcileContract, activeContract,] = ELECTRON_TOOL_CONTRACTS;
|
|
15
|
-
server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input, context) => runElectronTool(options, listContract, { input, context }, (parsed, { signal }) => listElectronTargets(options.electron,
|
|
15
|
+
server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input, context) => runElectronTool(options, listContract, { input, context }, (parsed, { signal }) => listElectronTargets(options.electron, parsed, {
|
|
16
16
|
signal,
|
|
17
17
|
})));
|
|
18
18
|
server.registerTool(inspectContract.name, toolRegistrationOptions(inspectContract), (input, context) => runElectronTool(options, inspectContract, { input, context }, async (parsed, { signal, progress }) => {
|
|
19
19
|
const request = inspectElectronPageInputSchema.parse(parsed);
|
|
20
|
-
return inspectElectronPage(options.electron,
|
|
20
|
+
return inspectElectronPage(options.electron, request, {
|
|
21
|
+
signal,
|
|
22
|
+
progress,
|
|
23
|
+
});
|
|
21
24
|
}));
|
|
22
25
|
server.registerTool(analyzeContract.name, toolRegistrationOptions(analyzeContract), (input, context) => runElectronTool(options, analyzeContract, { input, context }, (parsed, { signal, progress }) => analyzeJavaScriptApplicationValidated(parsed, { signal, progress })));
|
|
23
26
|
server.registerTool(reconcileContract.name, toolRegistrationOptions(reconcileContract), (input, context) => runElectronTool(options, reconcileContract, { input, context }, (parsed) => Promise.resolve(reconcileJavaScriptRuntimeEvidenceValidated(parsed))));
|
|
24
|
-
server.registerTool(activeContract.name, toolRegistrationOptions(activeContract), (input, context) => runElectronTool(options, activeContract, { input, context }, (parsed, { signal, progress }) => captureElectronScenario(options.electronActive,
|
|
27
|
+
server.registerTool(activeContract.name, toolRegistrationOptions(activeContract), (input, context) => runElectronTool(options, activeContract, { input, context }, (parsed, { signal, progress }) => captureElectronScenario(options.electronActive, parsed, {
|
|
28
|
+
signal,
|
|
29
|
+
progress,
|
|
30
|
+
})));
|
|
25
31
|
};
|
|
26
32
|
const runElectronTool = async (options, contract, request, execute) => {
|
|
27
33
|
const { input, context } = request;
|