rea-agents 1.7.0 → 2.1.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 +112 -59
- package/bridge/ghidra/ReaGhidraBridge.java +96 -11
- package/dist/application/ArtifactExtraction.js +1 -1
- package/dist/application/ArtifactInventory/classify.js +42 -0
- package/dist/application/ArtifactInventory/hash.js +43 -0
- package/dist/application/ArtifactInventory/reader.js +41 -0
- package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
- package/dist/application/ArtifactInventory/scanReader.js +124 -0
- package/dist/application/ArtifactInventory/types.js +10 -0
- package/dist/application/ArtifactInventory.js +9 -351
- package/dist/application/AuthorizedArtifactInventory.js +2 -2
- package/dist/application/BinarySession.js +47 -270
- package/dist/application/BinarySessionExecution.js +28 -0
- package/dist/application/BinarySessionOpen.js +39 -0
- package/dist/application/BinarySessionRecords.js +149 -0
- package/dist/application/BinarySessionStatus.js +75 -0
- package/dist/application/CapabilityInventory.js +42 -2
- package/dist/application/ClientRegistrationStatus.js +1 -1
- package/dist/application/CrossVersionInventory.js +8 -2
- package/dist/application/CrossVersionInvestigation.js +11 -29
- package/dist/application/CrossVersionInvestigationCollections.js +23 -0
- package/dist/application/DirectAnalysis.js +47 -44
- package/dist/application/Doctor.js +165 -197
- package/dist/application/DoctorDiagnostics.js +180 -0
- package/dist/application/ElectronBoundaryAnalysis.js +112 -0
- package/dist/application/ElectronBoundaryGraph.js +9 -0
- package/dist/application/ElectronBoundaryGraphContext.js +62 -0
- package/dist/application/ElectronBoundaryGraphIpc.js +242 -0
- package/dist/application/ElectronBoundaryGraphNative.js +86 -0
- package/dist/application/ElectronBoundaryGraphWindows.js +223 -0
- package/dist/application/EnhancedToolPagination.js +22 -0
- package/dist/application/EnhancedToolTypes.js +4 -0
- package/dist/application/EnhancedTools.js +58 -50
- package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
- package/dist/application/InvestigationProviders.js +30 -0
- package/dist/application/InvestigationWorkspaceStore.js +24 -10
- package/dist/application/JavaScriptApplicationEvidence.js +26 -0
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +89 -0
- package/dist/application/JavaScriptApplicationService.js +74 -0
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +29 -0
- package/dist/application/JavaScriptApplicationWorkflowService.js +90 -0
- package/dist/application/JavaScriptArtifactAnalysis.js +52 -7
- package/dist/application/JavaScriptArtifactFiles.js +6 -2
- package/dist/application/JavaScriptArtifactGraphBuilder.js +82 -17
- package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
- package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
- package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
- package/dist/application/JavaScriptArtifactGraphEvidence.js +24 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
- package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
- package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
- package/dist/application/JavaScriptArtifactReconstruction.js +4 -1
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -83
- package/dist/application/JavaScriptJsonModules.js +39 -0
- package/dist/application/JavaScriptModuleRelationships.js +262 -0
- package/dist/application/JavaScriptReplayPermission.js +16 -0
- package/dist/application/JavaScriptReplayPlanning.js +201 -0
- package/dist/application/JavaScriptReplayService.js +292 -0
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +25 -0
- package/dist/application/JavaScriptRuntimeReconciliationService.js +27 -0
- package/dist/application/LinuxHopper.js +10 -0
- package/dist/application/MacHopper.js +22 -11
- package/dist/application/ManagedApplicationGraphService.js +55 -0
- package/dist/application/ManagedMemberComparisonService.js +122 -0
- package/dist/application/ManagedNativeVerificationService.js +39 -0
- package/dist/application/ManagedReconstructionService.js +58 -0
- package/dist/application/ManagedRuntimeCorrelationService.js +103 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
- package/dist/application/PermissionAuthority.js +106 -63
- package/dist/application/ProcessCaptureCapability.js +1 -1
- package/dist/application/ProcessCapturePermission.js +13 -0
- package/dist/application/ProcessCli.js +2 -12
- package/dist/application/ProcessHarness.js +1 -1
- package/dist/application/ProcessSampling.js +15 -11
- package/dist/application/ProjectPermissionStore.js +49 -9
- package/dist/application/RealHopperAssertions.js +76 -0
- package/dist/application/ReconstructionCoverageService.js +69 -0
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
- package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
- package/dist/application/Setup.js +147 -259
- package/dist/application/SetupClientConfiguration.js +220 -0
- package/dist/application/SetupClients.js +24 -2
- package/dist/application/SetupPlan.js +123 -12
- package/dist/application/SetupSkill.js +26 -12
- package/dist/application/SupportedClients.js +1 -0
- package/dist/application/Uninstall.js +6 -3
- package/dist/application/WindowsCapabilities.js +86 -0
- package/dist/application/runtime.js +2 -0
- package/dist/artifacts/AsarArtifactReader.js +11 -0
- package/dist/browser/BrowserProcessStartup.js +88 -0
- package/dist/browser/CdpCaptureDocuments.js +12 -8
- package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
- package/dist/browser/CdpCaptureEventHandlers.js +336 -0
- package/dist/browser/CdpCaptureEventHelpers.js +71 -0
- package/dist/browser/CdpCaptureEventState.js +1 -0
- package/dist/browser/CdpCaptureEventTypes.js +1 -0
- package/dist/browser/CdpCaptureEvents.js +46 -464
- package/dist/browser/CdpElectronInspection.js +106 -162
- package/dist/browser/CdpElectronProvider.js +5 -1
- package/dist/browser/CdpElectronScriptEvents.js +69 -0
- package/dist/browser/CdpElectronScripts.js +94 -0
- package/dist/browser/CdpElectronWorkers.js +56 -0
- package/dist/browser/CdpObservationSession.js +51 -8
- package/dist/browser/CdpPageCapture.js +12 -129
- package/dist/browser/CdpPageCaptureScripts.js +97 -0
- package/dist/browser/CdpPageCaptureWorkers.js +46 -0
- package/dist/browser/CdpWebMcpDiscovery.js +38 -14
- package/dist/browser/PngVisualDiff.js +9 -2
- package/dist/catalogIdentity.js +8 -1
- package/dist/cli/artifactCommands.js +82 -0
- package/dist/cli/coreAnalysisCommands.js +232 -0
- package/dist/cli/managedCommands.js +397 -0
- package/dist/cli/managedProjectGraphCommand.js +24 -0
- package/dist/cli/options.js +9 -0
- package/dist/cli/setupCommands.js +108 -0
- package/dist/cli/types.js +1 -0
- package/dist/cli/utilityCommands.js +122 -0
- package/dist/cli.js +13 -383
- package/dist/cliApplicationCommands.js +176 -0
- package/dist/cliBrowserAdvancedCommands.js +73 -16
- package/dist/cliBrowserCommands.js +39 -115
- package/dist/cliCommandNames.js +17 -0
- package/dist/cliElectronCommands.js +100 -27
- package/dist/cliEvidenceCommands.js +13 -2
- package/dist/cliInvestigationCommands.js +53 -10
- package/dist/cliJsonInput.js +54 -0
- package/dist/cliObservationOptions.js +137 -0
- package/dist/cliPolicyCommands.js +80 -46
- package/dist/cliSetup.js +289 -0
- package/dist/config/environment.js +107 -0
- package/dist/config/parseConfig.js +228 -0
- package/dist/config/parsers.js +68 -0
- package/dist/config/permissions.js +30 -0
- package/dist/config/types.js +1 -0
- package/dist/config.js +1 -292
- package/dist/contracts/applicationToolContracts.js +225 -0
- package/dist/contracts/artifactToolContracts.js +5 -9
- package/dist/contracts/browserToolContracts.js +14 -62
- package/dist/contracts/electronToolContracts.js +45 -19
- package/dist/contracts/errorSchemas.js +1 -0
- package/dist/contracts/investigationExamples.js +0 -6
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +46 -0
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +208 -0
- package/dist/contracts/managedToolContracts.js +153 -0
- package/dist/contracts/managedWorkflowExamples.js +346 -0
- package/dist/contracts/managedWorkflowToolContracts.js +203 -0
- package/dist/contracts/nativeToolContracts.js +2 -6
- package/dist/contracts/promptContracts.js +18 -2
- package/dist/contracts/providerSelection.js +2 -0
- package/dist/contracts/toolContractExamples.js +10 -25
- package/dist/contracts/toolContracts.js +49 -47
- package/dist/contracts/toolEffects.js +174 -0
- package/dist/contracts/toolOutputSchemaGroups.js +232 -0
- package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
- package/dist/contracts/toolOutputSchemas.js +2 -535
- package/dist/doctorRuntime.js +42 -1
- package/dist/domain/analysisErrorPresentation.js +234 -0
- package/dist/domain/analysisErrorProjection.js +284 -0
- package/dist/domain/artifactComparison.js +37 -19
- package/dist/domain/binaryTarget.js +87 -37
- package/dist/domain/browserObservation.js +1 -282
- package/dist/domain/browserObservationSchemas.js +286 -0
- package/dist/domain/bundleComparison.js +4 -4
- package/dist/domain/electronObservation.js +13 -0
- package/dist/domain/electronStaticAnalysis.js +9 -0
- package/dist/domain/electronStaticAnalysisBrowser.js +206 -0
- package/dist/domain/electronStaticAnalysisIpc.js +171 -0
- package/dist/domain/electronStaticAnalysisNative.js +164 -0
- package/dist/domain/electronStaticAnalysisTypes.js +1 -0
- package/dist/domain/electronStaticAnalysisValues.js +103 -0
- package/dist/domain/errors.js +32 -448
- package/dist/domain/functionComparison.js +4 -165
- package/dist/domain/functionComparisonDimensions.js +164 -0
- package/dist/domain/functionComparisonSchemas.js +3 -8
- package/dist/domain/inputIssueProjection.js +52 -0
- package/dist/domain/javascriptApplicationAnalysis.js +155 -0
- package/dist/domain/javascriptApplicationChangeGraph.js +231 -0
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +18 -0
- package/dist/domain/javascriptApplicationGraph.js +2 -1
- package/dist/domain/javascriptApplicationGraphSchemas.js +7 -0
- package/dist/domain/javascriptApplicationVersionComparison.js +116 -0
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +139 -0
- package/dist/domain/javascriptApplicationVersionItems.js +233 -0
- package/dist/domain/javascriptApplicationVersionKeys.js +170 -0
- package/dist/domain/javascriptExportInstrumentation.js +97 -0
- package/dist/domain/javascriptFeatureSeed.js +140 -0
- package/dist/domain/javascriptFeatureTrace.js +232 -0
- package/dist/domain/javascriptFeatureTraceSchemas.js +136 -0
- package/dist/domain/javascriptFeatureTraversal.js +100 -0
- package/dist/domain/javascriptNativeHandoff.js +85 -0
- package/dist/domain/javascriptReplay.js +361 -0
- package/dist/domain/javascriptRuntimeLoadState.js +106 -0
- package/dist/domain/javascriptRuntimeReconciliation.js +42 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +169 -0
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +247 -0
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +160 -0
- package/dist/domain/javascriptRuntimeReconciliationResult.js +119 -0
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +316 -0
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +245 -0
- package/dist/domain/javascriptRuntimeStaticCandidates.js +193 -0
- package/dist/domain/javascriptSemanticAnalysis.js +386 -0
- package/dist/domain/javascriptSemanticIr.js +30 -0
- package/dist/domain/javascriptSemanticProjection.js +366 -0
- package/dist/domain/javascriptSemanticState.js +40 -0
- package/dist/domain/javascriptSemanticTraversal.js +22 -0
- package/dist/domain/javascriptSemanticValues.js +352 -0
- package/dist/domain/javascriptStaticAnalysis.js +26 -254
- package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
- package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
- package/dist/domain/javascriptStaticAnalysisFindings.js +39 -0
- package/dist/domain/javascriptStaticAnalysisHelpers.js +81 -2
- package/dist/domain/javascriptStaticAnalysisState.js +6 -0
- package/dist/domain/knownPageCoverage.js +21 -0
- package/dist/domain/managedApplicationGraph.js +206 -0
- package/dist/domain/managedApplicationGraphCoverage.js +170 -0
- package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
- package/dist/domain/managedApplicationGraphNodes.js +336 -0
- package/dist/domain/managedArtifact.js +452 -0
- package/dist/domain/managedMemberComparison.js +211 -0
- package/dist/domain/managedMemberComparisonCoverage.js +72 -0
- package/dist/domain/managedMemberComparisonMatch.js +356 -0
- package/dist/domain/managedNativeVerification.js +46 -0
- package/dist/domain/managedNativeVerificationMatch.js +272 -0
- package/dist/domain/managedNativeVerificationSchemas.js +141 -0
- package/dist/domain/managedReconstruction.js +196 -0
- package/dist/domain/managedRuntimeCorrelation.js +184 -0
- package/dist/domain/nodeRuntimeCharacterization.js +66 -0
- package/dist/domain/permissionPolicy.js +2 -0
- package/dist/domain/reconstructionCoverage.js +387 -0
- package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
- package/dist/domain/reconstructionVerificationSchemas.js +9 -3
- package/dist/domain/runtimeCharacterization.js +85 -0
- package/dist/domain/webBundleAnalyzer.js +3 -409
- package/dist/domain/webBundleAnalyzerAst.js +77 -0
- package/dist/domain/webBundleAnalyzerInspection.js +307 -0
- package/dist/domain/webBundleAnalyzerResult.js +120 -0
- package/dist/dotnet/ManagedArtifactInspector.js +339 -0
- package/dist/dotnet/ManagedMemberInspector.js +153 -0
- package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
- package/dist/dotnet/ManagedMemberRows.js +120 -0
- package/dist/dotnet/ManagedMetadataHeaps.js +131 -0
- package/dist/dotnet/ManagedMetadataInventory.js +104 -0
- package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
- package/dist/dotnet/ManagedMetadataLayout.js +259 -0
- package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
- package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +143 -0
- package/dist/dotnet/ManagedPeReader.js +188 -0
- package/dist/dotnet/ManagedReaderFailure.js +10 -0
- package/dist/dotnet/ManagedStaticProvider.js +203 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraClient.js +76 -91
- package/dist/ghidra/GhidraClientStartup.js +29 -0
- package/dist/ghidra/GhidraClientWire.js +34 -0
- package/dist/ghidra/GhidraDefaults.js +1 -1
- package/dist/ghidra/GhidraDiagnostics.js +6 -1
- package/dist/ghidra/GhidraInstallation.js +20 -15
- package/dist/ghidra/GhidraLauncher.js +93 -29
- package/dist/ghidra/GhidraProvider.js +67 -161
- package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
- package/dist/ghidra/GhidraSessionValues.js +2 -0
- package/dist/ghidra/GhidraSocketConnection.js +44 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
- package/dist/ghidra/GhidraTransport.js +71 -0
- package/dist/identity.js +3 -2
- package/dist/main/messages.js +5 -0
- package/dist/main/reload.js +49 -0
- package/dist/main/shutdown.js +25 -0
- package/dist/main/startup.js +14 -0
- package/dist/main/state.js +26 -0
- package/dist/main/transport.js +61 -0
- package/dist/main/types.js +1 -0
- package/dist/main.js +35 -132
- package/dist/process/PrivateRuntimeRoot.js +3 -2
- package/dist/process/ProcessOwnership.js +35 -0
- package/dist/process/ProviderProcess.js +2 -0
- package/dist/replay/JavaScriptReplayWorker.js +300 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +217 -0
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
- package/dist/replay/LinuxRuntimeClosure.js +46 -0
- package/dist/replay/LinuxSeccompPolicy.js +40 -0
- package/dist/replay/ReplayOutcome.js +95 -0
- package/dist/replay/ReplayProcessLifecycle.js +71 -0
- package/dist/replay/ReplayWorkerProtocol.js +55 -0
- package/dist/replay/SystemJavaScriptReplayHost.js +182 -0
- package/dist/server/ProcessCaptureElicitation.js +157 -0
- package/dist/server/createServer.js +158 -41
- package/dist/server/registerApplicationTools/characterization.js +57 -0
- package/dist/server/registerApplicationTools/compareVersions.js +34 -0
- package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
- package/dist/server/registerApplicationTools/coverage.js +84 -0
- package/dist/server/registerApplicationTools/helpers.js +42 -0
- package/dist/server/registerApplicationTools/traceFeature.js +26 -0
- package/dist/server/registerApplicationTools/types.js +1 -0
- package/dist/server/registerApplicationTools.js +13 -0
- package/dist/server/registerArtifactComparisonTool.js +16 -9
- package/dist/server/registerBrowserTools.js +61 -60
- package/dist/server/registerBundleComparisonTool.js +17 -20
- package/dist/server/registerElectronTools.js +39 -12
- package/dist/server/registerEnhancedTools.js +52 -15
- package/dist/server/registerEvidenceResources.js +54 -0
- package/dist/server/registerEvidenceTools.js +5 -1
- package/dist/server/registerFunctionComparisonTool.js +14 -7
- package/dist/server/registerInvestigationTools/helpers.js +74 -0
- package/dist/server/registerInvestigationTools/types.js +1 -0
- package/dist/server/registerInvestigationTools.js +103 -132
- package/dist/server/registerManagedTools.js +6 -0
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
- package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
- package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
- package/dist/server/registerManagedWorkflowTools/types.js +1 -0
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
- package/dist/server/registerManagedWorkflowTools.js +13 -0
- package/dist/server/registerOfficialTools.js +81 -67
- package/dist/server/registerProcessComparisonTool.js +25 -47
- package/dist/server/registerSessionRecordTools.js +137 -0
- package/dist/server/registerSessionStatusTool.js +9 -8
- package/dist/server/registerSessionTools.js +77 -216
- package/dist/server/sessionAvailabilityPolicy.js +10 -0
- package/dist/server/sessionEvidence.js +14 -19
- package/dist/server/toolInputValidation.js +77 -0
- package/dist/server/toolRegistrationOptions.js +177 -2
- package/dist/server/toolResult.js +30 -17
- package/package.json +21 -14
- package/scripts/rea.mjs +1 -1
- package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +75 -6
- package/scripts/prepare-node-pty.mjs +0 -35
- package/scripts/rebuild-native.mjs +0 -22
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { compareManagedMembersEvidenceValidated } from "../../application/ManagedMemberComparisonService.js";
|
|
2
|
+
import { compareManagedMembersReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
|
|
3
|
+
import { managedMemberComparisonResultSchema } from "../../domain/managedMemberComparison.js";
|
|
4
|
+
import { logToolExecution } from "../toolLogging.js";
|
|
5
|
+
import { toCallToolResult } from "../toolResult.js";
|
|
6
|
+
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
|
|
7
|
+
import { safeParseToolInput } from "../toolInputValidation.js";
|
|
8
|
+
import { managedWorkflowContract } from "./contract.js";
|
|
9
|
+
import { recordManagedSources, resolveManagedEvidence } from "./evidence.js";
|
|
10
|
+
const compareContract = managedWorkflowContract("compare_managed_members");
|
|
11
|
+
/** Register the managed member comparison workflow tool. */
|
|
12
|
+
export const registerCompareManagedMembers = (server, options) => {
|
|
13
|
+
server.registerTool(compareContract.name, toolRegistrationOptions(compareContract), async (input) => {
|
|
14
|
+
const parsedInput = safeParseToolInput(compareManagedMembersReferenceInputSchema, input, compareContract.name);
|
|
15
|
+
if (!parsedInput.ok)
|
|
16
|
+
return toCallToolResult(parsedInput, compareContract);
|
|
17
|
+
const resolved = resolveManagedEvidence(options.session, [
|
|
18
|
+
parsedInput.value.left_evidence_id,
|
|
19
|
+
parsedInput.value.right_evidence_id,
|
|
20
|
+
]);
|
|
21
|
+
if (!resolved.ok)
|
|
22
|
+
return toCallToolResult(resolved, compareContract);
|
|
23
|
+
const [left, right] = resolved.value;
|
|
24
|
+
if (left === undefined || right === undefined)
|
|
25
|
+
throw new TypeError("Managed comparison Evidence resolution failed");
|
|
26
|
+
const { left_evidence_id: _leftEvidenceId, right_evidence_id: _rightEvidenceId, ...referencedInput } = parsedInput.value;
|
|
27
|
+
const parsed = { ...referencedInput, left, right };
|
|
28
|
+
const result = await logToolExecution(options.logger, compareContract.name, () => Promise.resolve(compareManagedMembersEvidenceValidated(parsed)));
|
|
29
|
+
if (!result.ok)
|
|
30
|
+
return toCallToolResult(result, compareContract);
|
|
31
|
+
const recorded = recordManagedSources(options.recordEvidence, [
|
|
32
|
+
parsed.left,
|
|
33
|
+
parsed.right,
|
|
34
|
+
]);
|
|
35
|
+
if (!recorded.ok)
|
|
36
|
+
return toCallToolResult(recorded, compareContract);
|
|
37
|
+
const comparison = managedMemberComparisonResultSchema.parse(result.value.normalized_result);
|
|
38
|
+
const unknown = comparison.summary.unknown > 0;
|
|
39
|
+
const output = parsed.unknown_registry_approved === true && unknown
|
|
40
|
+
? options.recordEvidenceWithUnknown?.(result.value, {
|
|
41
|
+
approved: true,
|
|
42
|
+
question: "Which managed members remain unmatched or ambiguous across these versions?",
|
|
43
|
+
severity: "medium",
|
|
44
|
+
domain: "managed-member-comparison",
|
|
45
|
+
supporting_evidence_ids: [result.value.evidence_id],
|
|
46
|
+
contradicting_evidence_ids: [],
|
|
47
|
+
required_authority: "shipped-artifact",
|
|
48
|
+
required_confidence: "observed",
|
|
49
|
+
required_environment: null,
|
|
50
|
+
recommended_probes: [
|
|
51
|
+
{
|
|
52
|
+
operation: "inspect_managed_members",
|
|
53
|
+
rationale: "Repeat static member inspection with complete pages and method bodies.",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
relationships: [],
|
|
57
|
+
})
|
|
58
|
+
: options.recordEvidence?.(result.value);
|
|
59
|
+
if (output !== undefined && !output.ok)
|
|
60
|
+
return toCallToolResult(output, compareContract);
|
|
61
|
+
return toCallToolResult({ ok: true, value: result.value }, compareContract, {
|
|
62
|
+
evidenceResourcesAvailable: output !== undefined,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MANAGED_WORKFLOW_TOOL_CONTRACTS } from "../../contracts/managedWorkflowToolContracts.js";
|
|
2
|
+
/** Locate one managed workflow tool contract by exact name. */
|
|
3
|
+
export const managedWorkflowContract = (name) => {
|
|
4
|
+
const found = MANAGED_WORKFLOW_TOOL_CONTRACTS.find((candidate) => candidate.name === name);
|
|
5
|
+
if (found === undefined)
|
|
6
|
+
throw new Error(`Missing ${name} contract`);
|
|
7
|
+
return found;
|
|
8
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { resolveSessionEvidenceIds } from "../sessionEvidence.js";
|
|
2
|
+
export const resolveManagedEvidence = (session, evidenceIds) => resolveSessionEvidenceIds(session, evidenceIds, {
|
|
3
|
+
operation: "inspect_managed_members",
|
|
4
|
+
predicate: "rea.analysis/v2",
|
|
5
|
+
});
|
|
6
|
+
export const resolveManagedArtifactEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
|
|
7
|
+
operation: "inspect_managed_artifact",
|
|
8
|
+
predicate: "rea.analysis/v2",
|
|
9
|
+
});
|
|
10
|
+
export const resolveManagedBoundaryEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
|
|
11
|
+
operation: "inspect_managed_native_boundaries",
|
|
12
|
+
predicate: "rea.analysis/v2",
|
|
13
|
+
});
|
|
14
|
+
export const resolveNativeEvidence = (session, evidenceIds) => {
|
|
15
|
+
const records = [];
|
|
16
|
+
for (const evidenceId of evidenceIds) {
|
|
17
|
+
const operation = session.evidenceById(evidenceId)?.operation;
|
|
18
|
+
const expectedOperation = operation === "inspect_macho" || operation === "analyze_function"
|
|
19
|
+
? operation
|
|
20
|
+
: "inspect_macho or analyze_function";
|
|
21
|
+
const resolved = resolveSessionEvidenceIds(session, [evidenceId], {
|
|
22
|
+
operation: expectedOperation,
|
|
23
|
+
predicate: "rea.analysis/v2",
|
|
24
|
+
});
|
|
25
|
+
if (!resolved.ok)
|
|
26
|
+
return resolved;
|
|
27
|
+
records.push(...resolved.value);
|
|
28
|
+
}
|
|
29
|
+
return { ok: true, value: records };
|
|
30
|
+
};
|
|
31
|
+
export const recordManagedSources = (recordEvidence, sources) => {
|
|
32
|
+
for (const source of sources) {
|
|
33
|
+
const recorded = recordEvidence?.(source);
|
|
34
|
+
if (recorded !== undefined && !recorded.ok)
|
|
35
|
+
return recorded;
|
|
36
|
+
}
|
|
37
|
+
return { ok: true, value: null };
|
|
38
|
+
};
|
|
39
|
+
export const sourceEvidence = (input) => [
|
|
40
|
+
input.managed_artifact,
|
|
41
|
+
input.managed_members,
|
|
42
|
+
input.managed_native_boundaries,
|
|
43
|
+
].filter((evidence) => evidence !== undefined);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { importManagedReconstructionEvidenceValidated } from "../../application/ManagedReconstructionService.js";
|
|
2
|
+
import { managedReconstructionReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
|
|
3
|
+
import { logToolExecution } from "../toolLogging.js";
|
|
4
|
+
import { toCallToolResult } from "../toolResult.js";
|
|
5
|
+
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
|
|
6
|
+
import { safeParseToolInput } from "../toolInputValidation.js";
|
|
7
|
+
import { managedWorkflowContract } from "./contract.js";
|
|
8
|
+
import { resolveManagedEvidence } from "./evidence.js";
|
|
9
|
+
const reconstructionContract = managedWorkflowContract("import_managed_reconstruction");
|
|
10
|
+
/** Register the managed reconstruction import workflow tool. */
|
|
11
|
+
export const registerImportManagedReconstruction = (server, options) => {
|
|
12
|
+
server.registerTool(reconstructionContract.name, toolRegistrationOptions(reconstructionContract), async (input) => {
|
|
13
|
+
const parsedInput = safeParseToolInput(managedReconstructionReferenceInputSchema, input, reconstructionContract.name);
|
|
14
|
+
if (!parsedInput.ok)
|
|
15
|
+
return toCallToolResult(parsedInput, reconstructionContract);
|
|
16
|
+
const resolved = resolveManagedEvidence(options.session, [
|
|
17
|
+
parsedInput.value.static_members_evidence_id,
|
|
18
|
+
]);
|
|
19
|
+
if (!resolved.ok)
|
|
20
|
+
return toCallToolResult(resolved, reconstructionContract);
|
|
21
|
+
const staticMembers = resolved.value[0];
|
|
22
|
+
if (staticMembers === undefined)
|
|
23
|
+
throw new TypeError("Managed reconstruction Evidence resolution failed");
|
|
24
|
+
const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
|
|
25
|
+
const parsed = { ...referencedInput, static_members: staticMembers };
|
|
26
|
+
const result = await logToolExecution(options.logger, reconstructionContract.name, () => Promise.resolve(importManagedReconstructionEvidenceValidated(parsed)));
|
|
27
|
+
if (!result.ok)
|
|
28
|
+
return toCallToolResult(result, reconstructionContract);
|
|
29
|
+
const recordedSource = options.recordEvidence?.(parsed.static_members);
|
|
30
|
+
if (recordedSource !== undefined && !recordedSource.ok)
|
|
31
|
+
return toCallToolResult(recordedSource, reconstructionContract);
|
|
32
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
33
|
+
if (recorded !== undefined && !recorded.ok)
|
|
34
|
+
return toCallToolResult(recorded, reconstructionContract);
|
|
35
|
+
return toCallToolResult(result, reconstructionContract, {
|
|
36
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { planManagedRuntimeCorrelationEvidenceValidated } from "../../application/ManagedRuntimeCorrelationService.js";
|
|
2
|
+
import { managedRuntimeCorrelationReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
|
|
3
|
+
import { logToolExecution } from "../toolLogging.js";
|
|
4
|
+
import { toCallToolResult } from "../toolResult.js";
|
|
5
|
+
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
|
|
6
|
+
import { safeParseToolInput } from "../toolInputValidation.js";
|
|
7
|
+
import { managedWorkflowContract } from "./contract.js";
|
|
8
|
+
import { resolveManagedEvidence } from "./evidence.js";
|
|
9
|
+
const runtimeContract = managedWorkflowContract("plan_managed_runtime_correlation");
|
|
10
|
+
/** Register the managed runtime correlation planning workflow tool. */
|
|
11
|
+
export const registerPlanManagedRuntimeCorrelation = (server, options) => {
|
|
12
|
+
server.registerTool(runtimeContract.name, toolRegistrationOptions(runtimeContract), async (input) => {
|
|
13
|
+
const parsedInput = safeParseToolInput(managedRuntimeCorrelationReferenceInputSchema, input, runtimeContract.name);
|
|
14
|
+
if (!parsedInput.ok)
|
|
15
|
+
return toCallToolResult(parsedInput, runtimeContract);
|
|
16
|
+
const resolved = resolveManagedEvidence(options.session, [
|
|
17
|
+
parsedInput.value.static_members_evidence_id,
|
|
18
|
+
]);
|
|
19
|
+
if (!resolved.ok)
|
|
20
|
+
return toCallToolResult(resolved, runtimeContract);
|
|
21
|
+
const staticMembers = resolved.value[0];
|
|
22
|
+
if (staticMembers === undefined)
|
|
23
|
+
throw new TypeError("Managed runtime Evidence resolution failed");
|
|
24
|
+
const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
|
|
25
|
+
const parsed = { ...referencedInput, static_members: staticMembers };
|
|
26
|
+
const result = await logToolExecution(options.logger, runtimeContract.name, () => Promise.resolve(planManagedRuntimeCorrelationEvidenceValidated(options.runtime, parsed)));
|
|
27
|
+
if (!result.ok)
|
|
28
|
+
return toCallToolResult(result, runtimeContract);
|
|
29
|
+
const recordedSource = options.recordEvidence?.(parsed.static_members);
|
|
30
|
+
if (recordedSource !== undefined && !recordedSource.ok)
|
|
31
|
+
return toCallToolResult(recordedSource, runtimeContract);
|
|
32
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
33
|
+
if (recorded !== undefined && !recorded.ok)
|
|
34
|
+
return toCallToolResult(recorded, runtimeContract);
|
|
35
|
+
return toCallToolResult(result, runtimeContract, {
|
|
36
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { projectManagedApplicationGraphEvidence } from "../../application/ManagedApplicationGraphService.js";
|
|
2
|
+
import { managedApplicationGraphReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
|
|
3
|
+
import { logToolExecution } from "../toolLogging.js";
|
|
4
|
+
import { toCallToolResult } from "../toolResult.js";
|
|
5
|
+
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
|
|
6
|
+
import { safeParseToolInput } from "../toolInputValidation.js";
|
|
7
|
+
import { managedWorkflowContract } from "./contract.js";
|
|
8
|
+
import { recordManagedSources, resolveManagedArtifactEvidence, resolveManagedBoundaryEvidence, resolveManagedEvidence, sourceEvidence, } from "./evidence.js";
|
|
9
|
+
const graphContract = managedWorkflowContract("project_managed_application_graph");
|
|
10
|
+
/** Register the managed application graph projection workflow tool. */
|
|
11
|
+
export const registerProjectManagedApplicationGraph = (server, options) => {
|
|
12
|
+
server.registerTool(graphContract.name, toolRegistrationOptions(graphContract), async (input) => {
|
|
13
|
+
const parsedInput = safeParseToolInput(managedApplicationGraphReferenceInputSchema, input, graphContract.name);
|
|
14
|
+
if (!parsedInput.ok)
|
|
15
|
+
return toCallToolResult(parsedInput, graphContract);
|
|
16
|
+
const managedArtifact = parsedInput.value.managed_artifact_evidence_id === undefined
|
|
17
|
+
? undefined
|
|
18
|
+
: resolveManagedArtifactEvidence(options.session, parsedInput.value.managed_artifact_evidence_id);
|
|
19
|
+
if (managedArtifact !== undefined && !managedArtifact.ok)
|
|
20
|
+
return toCallToolResult(managedArtifact, graphContract);
|
|
21
|
+
const managedMembers = parsedInput.value.managed_members_evidence_id === undefined
|
|
22
|
+
? undefined
|
|
23
|
+
: resolveManagedEvidence(options.session, [
|
|
24
|
+
parsedInput.value.managed_members_evidence_id,
|
|
25
|
+
]);
|
|
26
|
+
if (managedMembers !== undefined && !managedMembers.ok)
|
|
27
|
+
return toCallToolResult(managedMembers, graphContract);
|
|
28
|
+
const managedBoundaries = parsedInput.value.managed_native_boundaries_evidence_id === undefined
|
|
29
|
+
? undefined
|
|
30
|
+
: resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_native_boundaries_evidence_id);
|
|
31
|
+
if (managedBoundaries !== undefined && !managedBoundaries.ok)
|
|
32
|
+
return toCallToolResult(managedBoundaries, graphContract);
|
|
33
|
+
const parsed = {
|
|
34
|
+
limits: parsedInput.value.limits,
|
|
35
|
+
managed_artifact: managedArtifact?.value[0],
|
|
36
|
+
managed_members: managedMembers?.value[0],
|
|
37
|
+
managed_native_boundaries: managedBoundaries?.value[0],
|
|
38
|
+
};
|
|
39
|
+
const result = await logToolExecution(options.logger, graphContract.name, () => Promise.resolve(projectManagedApplicationGraphEvidence(parsed)));
|
|
40
|
+
if (!result.ok)
|
|
41
|
+
return toCallToolResult(result, graphContract);
|
|
42
|
+
const recordedSources = recordManagedSources(options.recordEvidence, sourceEvidence(parsed));
|
|
43
|
+
if (!recordedSources.ok)
|
|
44
|
+
return toCallToolResult(recordedSources, graphContract);
|
|
45
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
46
|
+
if (recorded !== undefined && !recorded.ok)
|
|
47
|
+
return toCallToolResult(recorded, graphContract);
|
|
48
|
+
return toCallToolResult(result, graphContract, {
|
|
49
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { verifyManagedNativeBoundariesEvidence } from "../../application/ManagedNativeVerificationService.js";
|
|
2
|
+
import { managedNativeVerificationReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
|
|
3
|
+
import { managedNativeVerificationResultSchema } from "../../domain/managedNativeVerification.js";
|
|
4
|
+
import { logToolExecution } from "../toolLogging.js";
|
|
5
|
+
import { toCallToolResult } from "../toolResult.js";
|
|
6
|
+
import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
|
|
7
|
+
import { safeParseToolInput } from "../toolInputValidation.js";
|
|
8
|
+
import { managedWorkflowContract } from "./contract.js";
|
|
9
|
+
import { recordManagedSources, resolveManagedBoundaryEvidence, resolveNativeEvidence, } from "./evidence.js";
|
|
10
|
+
const nativeVerificationContract = managedWorkflowContract("verify_managed_native_boundaries");
|
|
11
|
+
/** Register the managed/native boundary verification workflow tool. */
|
|
12
|
+
export const registerVerifyManagedNativeBoundaries = (server, options) => {
|
|
13
|
+
server.registerTool(nativeVerificationContract.name, toolRegistrationOptions(nativeVerificationContract), async (input) => {
|
|
14
|
+
const parsedInput = safeParseToolInput(managedNativeVerificationReferenceInputSchema, input, nativeVerificationContract.name);
|
|
15
|
+
if (!parsedInput.ok)
|
|
16
|
+
return toCallToolResult(parsedInput, nativeVerificationContract);
|
|
17
|
+
const managedBoundaries = resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_boundaries_evidence_id);
|
|
18
|
+
if (!managedBoundaries.ok)
|
|
19
|
+
return toCallToolResult(managedBoundaries, nativeVerificationContract);
|
|
20
|
+
const nativeObservations = resolveNativeEvidence(options.session, parsedInput.value.native_observation_evidence_ids);
|
|
21
|
+
if (!nativeObservations.ok)
|
|
22
|
+
return toCallToolResult(nativeObservations, nativeVerificationContract);
|
|
23
|
+
const managedBoundary = managedBoundaries.value[0];
|
|
24
|
+
if (managedBoundary === undefined)
|
|
25
|
+
throw new TypeError("Managed boundary Evidence resolution failed");
|
|
26
|
+
const { managed_boundaries_evidence_id: _managedBoundariesEvidenceId, native_observation_evidence_ids: _nativeObservationEvidenceIds, ...referencedInput } = parsedInput.value;
|
|
27
|
+
const parsed = {
|
|
28
|
+
...referencedInput,
|
|
29
|
+
managed_boundaries: managedBoundary,
|
|
30
|
+
native_observations: nativeObservations.value,
|
|
31
|
+
};
|
|
32
|
+
const result = await logToolExecution(options.logger, nativeVerificationContract.name, () => Promise.resolve(verifyManagedNativeBoundariesEvidence(parsed)));
|
|
33
|
+
if (!result.ok)
|
|
34
|
+
return toCallToolResult(result, nativeVerificationContract);
|
|
35
|
+
const recordedSources = recordManagedSources(options.recordEvidence, [
|
|
36
|
+
parsed.managed_boundaries,
|
|
37
|
+
...parsed.native_observations,
|
|
38
|
+
]);
|
|
39
|
+
if (!recordedSources.ok)
|
|
40
|
+
return toCallToolResult(recordedSources, nativeVerificationContract);
|
|
41
|
+
const verification = managedNativeVerificationResultSchema.parse(result.value.normalized_result);
|
|
42
|
+
const unknown = verification.summary.unresolved > 0 ||
|
|
43
|
+
verification.summary.contradicted > 0 ||
|
|
44
|
+
verification.summary.native_body_unresolved > 0;
|
|
45
|
+
const output = parsed.unknown_registry_approved === true && unknown
|
|
46
|
+
? options.recordEvidenceWithUnknown?.(result.value, {
|
|
47
|
+
approved: true,
|
|
48
|
+
question: "Which managed/native boundaries remain unresolved or contradicted by the supplied native Evidence?",
|
|
49
|
+
severity: "medium",
|
|
50
|
+
domain: "managed-native-verification",
|
|
51
|
+
supporting_evidence_ids: [result.value.evidence_id],
|
|
52
|
+
contradicting_evidence_ids: [],
|
|
53
|
+
required_authority: "shipped-artifact",
|
|
54
|
+
required_confidence: "observed",
|
|
55
|
+
required_environment: null,
|
|
56
|
+
recommended_probes: [
|
|
57
|
+
{
|
|
58
|
+
operation: "inspect_managed_native_boundaries",
|
|
59
|
+
rationale: "Repeat managed boundary inspection with complete ModuleRef, ImplMap, and native implementation pages.",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
operation: "analyze_function",
|
|
63
|
+
rationale: "Analyze the provider-resolved native function candidate for the declared export.",
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
relationships: [],
|
|
67
|
+
})
|
|
68
|
+
: options.recordEvidence?.(result.value);
|
|
69
|
+
if (output !== undefined && !output.ok)
|
|
70
|
+
return toCallToolResult(output, nativeVerificationContract);
|
|
71
|
+
return toCallToolResult(result, nativeVerificationContract, {
|
|
72
|
+
evidenceResourcesAvailable: output !== undefined,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { registerCompareManagedMembers } from "./registerManagedWorkflowTools/compareManagedMembers.js";
|
|
2
|
+
import { registerVerifyManagedNativeBoundaries } from "./registerManagedWorkflowTools/verifyManagedNativeBoundaries.js";
|
|
3
|
+
import { registerImportManagedReconstruction } from "./registerManagedWorkflowTools/importManagedReconstruction.js";
|
|
4
|
+
import { registerPlanManagedRuntimeCorrelation } from "./registerManagedWorkflowTools/planManagedRuntimeCorrelation.js";
|
|
5
|
+
import { registerProjectManagedApplicationGraph } from "./registerManagedWorkflowTools/projectManagedApplicationGraph.js";
|
|
6
|
+
/** Register provider-neutral managed-code workflows. */
|
|
7
|
+
export const registerManagedWorkflowTools = (server, options) => {
|
|
8
|
+
registerCompareManagedMembers(server, options);
|
|
9
|
+
registerVerifyManagedNativeBoundaries(server, options);
|
|
10
|
+
registerImportManagedReconstruction(server, options);
|
|
11
|
+
registerPlanManagedRuntimeCorrelation(server, options);
|
|
12
|
+
registerProjectManagedApplicationGraph(server, options);
|
|
13
|
+
};
|
|
@@ -5,6 +5,8 @@ import { logToolExecution } from "./toolLogging.js";
|
|
|
5
5
|
import { createEvidence } from "../domain/evidence.js";
|
|
6
6
|
import { AnalysisCapabilityUnavailableError, UnknownRegistryError, } from "../domain/errors.js";
|
|
7
7
|
import { mcpProgressReporter } from "./mcpProgress.js";
|
|
8
|
+
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
9
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
8
10
|
/** Register direct bridge proxies, preserving MCP cancellation and typed errors. */
|
|
9
11
|
export const registerOfficialTools = (server, analysis, options) => {
|
|
10
12
|
for (const contract of OFFICIAL_TOOL_CONTRACTS) {
|
|
@@ -17,81 +19,93 @@ export const registerOfficialTools = (server, analysis, options) => {
|
|
|
17
19
|
}
|
|
18
20
|
};
|
|
19
21
|
const registerOfficialTool = (server, analysis, contract, registration) => {
|
|
20
|
-
server.registerTool(contract.name, {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}, async (input, context) => {
|
|
26
|
-
const arguments_ = projectOfficialArguments(contract, input);
|
|
22
|
+
server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
|
|
23
|
+
const parsedInput = safeParseToolInput(contract.inputSchema, input, contract.name);
|
|
24
|
+
if (!parsedInput.ok)
|
|
25
|
+
return toCallToolResult(parsedInput, contract);
|
|
26
|
+
const arguments_ = projectOfficialArguments(contract, parsedInput.value);
|
|
27
27
|
const progress = mcpProgressReporter(context);
|
|
28
|
-
await
|
|
29
|
-
|
|
30
|
-
completed: 0,
|
|
31
|
-
total: 1,
|
|
32
|
-
message: "started",
|
|
33
|
-
});
|
|
34
|
-
const result = await logToolExecution(registration.logger, contract.name, () => analysis.execute(contract.name, arguments_, {
|
|
28
|
+
const result = await runOfficialOperation(analysis, contract, arguments_, {
|
|
29
|
+
logger: registration.logger,
|
|
35
30
|
signal: context.mcpReq.signal,
|
|
36
31
|
progress,
|
|
37
|
-
}));
|
|
38
|
-
await progress.report({
|
|
39
|
-
phase: contract.name,
|
|
40
|
-
completed: 1,
|
|
41
|
-
total: 1,
|
|
42
|
-
message: result.ok ? "completed" : "failed",
|
|
43
|
-
terminal: true,
|
|
44
32
|
});
|
|
45
|
-
if (result.ok) {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
...(result.value.analysisProfile === undefined
|
|
51
|
-
? {}
|
|
52
|
-
: { analysisProfile: result.value.analysisProfile }),
|
|
53
|
-
rawResult: result.value.rawResult,
|
|
54
|
-
limitations: result.value.limitations,
|
|
55
|
-
locations: result.value.locations,
|
|
56
|
-
});
|
|
57
|
-
const recorded = registration.recordEvidence?.(evidence);
|
|
58
|
-
if (recorded !== undefined && !recorded.ok)
|
|
59
|
-
return toCallToolResult(recorded, contract);
|
|
60
|
-
return toCallToolResult({ ok: true, value: evidence }, contract, {
|
|
61
|
-
evidenceResourcesAvailable: recorded !== undefined,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
if (result.error instanceof AnalysisCapabilityUnavailableError &&
|
|
65
|
-
approvedUnknownTracking(input) &&
|
|
66
|
-
registration.recordUnknown !== undefined) {
|
|
67
|
-
const unknown = registration.recordUnknown({
|
|
68
|
-
approved: true,
|
|
69
|
-
question: "The requested analysis is unavailable for the current target.",
|
|
70
|
-
severity: "medium",
|
|
71
|
-
domain: "analysis-capability",
|
|
72
|
-
supporting_evidence_ids: [],
|
|
73
|
-
contradicting_evidence_ids: [],
|
|
74
|
-
required_authority: "shipped-artifact",
|
|
75
|
-
required_confidence: "observed",
|
|
76
|
-
required_environment: null,
|
|
77
|
-
recommended_probes: [
|
|
78
|
-
{
|
|
79
|
-
operation: contract.name,
|
|
80
|
-
rationale: "Choose another analysis or target that can answer this question.",
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
relationships: [],
|
|
84
|
-
});
|
|
85
|
-
if (!unknown.ok &&
|
|
86
|
-
!(unknown.error instanceof UnknownRegistryError &&
|
|
87
|
-
unknown.error.reason === "already-exists"))
|
|
88
|
-
return toCallToolResult(unknown, contract);
|
|
33
|
+
if (!result.ok) {
|
|
34
|
+
const unknownError = recordOfficialUnknown(input, result.error, contract, registration.recordUnknown);
|
|
35
|
+
if (unknownError !== undefined)
|
|
36
|
+
return toCallToolResult(unknownError, contract);
|
|
37
|
+
return toCallToolResult(result, contract);
|
|
89
38
|
}
|
|
90
|
-
|
|
39
|
+
const evidence = createEvidence(result.value.subject ?? registration.activeTarget?.(), result.value.provider, {
|
|
40
|
+
operation: contract.name,
|
|
41
|
+
parameters: arguments_,
|
|
42
|
+
result: result.value.result,
|
|
43
|
+
...(result.value.analysisProfile === undefined
|
|
44
|
+
? {}
|
|
45
|
+
: { analysisProfile: result.value.analysisProfile }),
|
|
46
|
+
rawResult: result.value.rawResult,
|
|
47
|
+
limitations: result.value.limitations,
|
|
48
|
+
locations: result.value.locations,
|
|
49
|
+
});
|
|
50
|
+
const recorded = registration.recordEvidence?.(evidence);
|
|
51
|
+
if (recorded !== undefined && !recorded.ok)
|
|
52
|
+
return toCallToolResult(recorded, contract);
|
|
53
|
+
return toCallToolResult({ ok: true, value: evidence }, contract, {
|
|
54
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const runOfficialOperation = async (analysis, contract, arguments_, execution) => {
|
|
59
|
+
await execution.progress.report({
|
|
60
|
+
phase: contract.name,
|
|
61
|
+
completed: 0,
|
|
62
|
+
total: 1,
|
|
63
|
+
message: "started",
|
|
64
|
+
});
|
|
65
|
+
const result = await logToolExecution(execution.logger, contract.name, () => analysis.execute(contract.name, arguments_, {
|
|
66
|
+
signal: execution.signal,
|
|
67
|
+
progress: execution.progress,
|
|
68
|
+
}));
|
|
69
|
+
await execution.progress.report({
|
|
70
|
+
phase: contract.name,
|
|
71
|
+
completed: 1,
|
|
72
|
+
total: 1,
|
|
73
|
+
message: result.ok ? "completed" : "failed",
|
|
74
|
+
terminal: true,
|
|
75
|
+
});
|
|
76
|
+
return result;
|
|
77
|
+
};
|
|
78
|
+
const recordOfficialUnknown = (input, error, contract, recordUnknown) => {
|
|
79
|
+
if (!(error instanceof AnalysisCapabilityUnavailableError) ||
|
|
80
|
+
!approvedUnknownTracking(input) ||
|
|
81
|
+
recordUnknown === undefined)
|
|
82
|
+
return undefined;
|
|
83
|
+
const unknown = recordUnknown({
|
|
84
|
+
approved: true,
|
|
85
|
+
question: "The requested analysis is unavailable for the current target.",
|
|
86
|
+
severity: "medium",
|
|
87
|
+
domain: "analysis-capability",
|
|
88
|
+
supporting_evidence_ids: [],
|
|
89
|
+
contradicting_evidence_ids: [],
|
|
90
|
+
required_authority: "shipped-artifact",
|
|
91
|
+
required_confidence: "observed",
|
|
92
|
+
required_environment: null,
|
|
93
|
+
recommended_probes: [
|
|
94
|
+
{
|
|
95
|
+
operation: contract.name,
|
|
96
|
+
rationale: "Choose another analysis or target that can answer this question.",
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
relationships: [],
|
|
91
100
|
});
|
|
101
|
+
if (!unknown.ok &&
|
|
102
|
+
!(unknown.error instanceof UnknownRegistryError &&
|
|
103
|
+
unknown.error.reason === "already-exists"))
|
|
104
|
+
return unknown;
|
|
105
|
+
return undefined;
|
|
92
106
|
};
|
|
93
107
|
const projectOfficialArguments = (contract, input) => {
|
|
94
|
-
const parsed = jsonObjectSchema.parse(
|
|
108
|
+
const parsed = jsonObjectSchema.parse(input);
|
|
95
109
|
const projected = {};
|
|
96
110
|
for (const key of Object.keys(contract.inputSchema.shape)) {
|
|
97
111
|
if (key === "unknown_registry_approved")
|
|
@@ -1,35 +1,40 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { SESSION_TOOL_CONTRACTS } from "../contracts/toolContracts.js";
|
|
1
|
+
import { processComparisonInputSchema, SESSION_TOOL_CONTRACTS, } from "../contracts/toolContracts.js";
|
|
4
2
|
import { createEvidence } from "../domain/evidence.js";
|
|
5
3
|
import { EvidenceIntegrityError } from "../domain/errors.js";
|
|
6
4
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
7
|
-
import { compareProcessCaptures,
|
|
5
|
+
import { compareProcessCaptures, parseProcessCapture, } from "../domain/processCapture.js";
|
|
8
6
|
import { recordDerivedEvidence } from "./recordDerivedEvidence.js";
|
|
9
7
|
import { err } from "../domain/result.js";
|
|
10
8
|
import { PROCESS_PROVIDER } from "./sessionToolPolicies.js";
|
|
11
9
|
import { toCallToolResult } from "./toolResult.js";
|
|
12
10
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
13
11
|
import { runDerivedOperation } from "./runDerivedOperation.js";
|
|
12
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
13
|
+
import { resolveSessionEvidenceIds } from "./sessionEvidence.js";
|
|
14
14
|
/** Register deterministic process-capture comparison and contradiction tracking. */
|
|
15
15
|
export const registerProcessComparisonTool = (server, session, contract, now = Date.now) => {
|
|
16
16
|
server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
const parsedInput = safeParseToolInput(processComparisonInputSchema, input, contract.name);
|
|
18
|
+
if (!parsedInput.ok)
|
|
19
|
+
return toCallToolResult(parsedInput, contract);
|
|
20
|
+
const parsed = parsedInput.value;
|
|
21
|
+
const expected = {
|
|
22
|
+
operation: "capture_process_scenario",
|
|
23
|
+
predicate: "rea.process-capture/v4",
|
|
24
|
+
};
|
|
25
|
+
const leftRecord = resolveSessionEvidenceIds(session, [parsed.left_evidence_id], expected);
|
|
26
|
+
if (!leftRecord.ok)
|
|
27
|
+
return toCallToolResult(leftRecord, contract);
|
|
28
|
+
const rightRecord = resolveSessionEvidenceIds(session, [parsed.right_evidence_id], expected);
|
|
29
|
+
if (!rightRecord.ok)
|
|
30
|
+
return toCallToolResult(rightRecord, contract);
|
|
30
31
|
let comparison;
|
|
32
|
+
let leftCapture;
|
|
33
|
+
let rightCapture;
|
|
31
34
|
try {
|
|
32
|
-
|
|
35
|
+
leftCapture = parseProcessCapture(leftRecord.value[0]?.normalized_result);
|
|
36
|
+
rightCapture = parseProcessCapture(rightRecord.value[0]?.normalized_result);
|
|
37
|
+
const computed = await runDerivedOperation(context, contract.name, () => compareProcessCaptures(leftCapture, rightCapture, {
|
|
33
38
|
...(parsed.max_capture_age_ms === undefined
|
|
34
39
|
? {}
|
|
35
40
|
: { maxCaptureAgeMs: parsed.max_capture_age_ms }),
|
|
@@ -50,8 +55,8 @@ export const registerProcessComparisonTool = (server, session, contract, now = D
|
|
|
50
55
|
parameters: {
|
|
51
56
|
left_evidence_id: parsed.left_evidence_id,
|
|
52
57
|
right_evidence_id: parsed.right_evidence_id,
|
|
53
|
-
left_normalization:
|
|
54
|
-
right_normalization:
|
|
58
|
+
left_normalization: leftCapture.normalization,
|
|
59
|
+
right_normalization: rightCapture.normalization,
|
|
55
60
|
},
|
|
56
61
|
result: jsonValueSchema.parse(comparison),
|
|
57
62
|
confidence: "derived",
|
|
@@ -62,33 +67,6 @@ export const registerProcessComparisonTool = (server, session, contract, now = D
|
|
|
62
67
|
return toCallToolResult(recordDerivedEvidence(session, evidence, comparisonUnknownInput(parsed, comparison)), contract);
|
|
63
68
|
});
|
|
64
69
|
};
|
|
65
|
-
const validateCaptureSources = (session, parsed) => {
|
|
66
|
-
for (const [evidenceId, capture] of [
|
|
67
|
-
[parsed.left_evidence_id, parsed.left],
|
|
68
|
-
[parsed.right_evidence_id, parsed.right],
|
|
69
|
-
]) {
|
|
70
|
-
const evidence = session.evidenceById(evidenceId);
|
|
71
|
-
let evidenceCapture;
|
|
72
|
-
try {
|
|
73
|
-
evidenceCapture = parseProcessCapture(evidence?.normalized_result);
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
evidenceCapture = undefined;
|
|
77
|
-
}
|
|
78
|
-
if (evidence === undefined ||
|
|
79
|
-
evidence.operation !== "capture_process_scenario" ||
|
|
80
|
-
evidence.predicate_type !== "rea.process-capture/v4" ||
|
|
81
|
-
evidence.provider.id !== PROCESS_PROVIDER.id ||
|
|
82
|
-
evidence.provider.name !== PROCESS_PROVIDER.name ||
|
|
83
|
-
evidence.provider.version !== PROCESS_PROVIDER.version ||
|
|
84
|
-
evidence.confidence !== "observed" ||
|
|
85
|
-
evidence.authority !== "controlled-replay" ||
|
|
86
|
-
evidenceCapture === undefined ||
|
|
87
|
-
canonicalize(evidenceCapture) !== canonicalize(capture))
|
|
88
|
-
return err(new EvidenceIntegrityError("Process comparison payload does not match its source Evidence"));
|
|
89
|
-
}
|
|
90
|
-
return { ok: true, value: null };
|
|
91
|
-
};
|
|
92
70
|
const comparisonUnknownInput = (parsed, comparison) => {
|
|
93
71
|
if (parsed.unknown_registry_approved !== true ||
|
|
94
72
|
comparison.status === "unchanged")
|