rea-agents 1.6.0 → 2.0.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 +157 -66
- package/bridge/ghidra/ReaGhidraBridge.java +2075 -0
- package/bridge/hopper_bridge.py +13 -3
- package/dist/application/AbortablePromise.js +25 -0
- package/dist/application/AnalysisProvider.js +3 -0
- package/dist/application/AnalysisProviderEvaluation.js +60 -0
- package/dist/application/AnalysisProviderRegistry.js +228 -0
- package/dist/application/AnalysisSnapshotCache.js +41 -21
- package/dist/application/AnalysisSnapshotFiles.js +5 -6
- package/dist/application/BinarySession.js +218 -101
- package/dist/application/CapabilityInventory.js +18 -0
- package/dist/application/CompositeProvider.js +20 -8
- package/dist/application/CrossVersionInvestigation.js +10 -6
- package/dist/application/DirectAnalysis.js +49 -35
- package/dist/application/Doctor.js +110 -8
- package/dist/application/ElectronBoundaryAnalysis.js +96 -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 +199 -0
- package/dist/application/EnhancedTools.js +39 -14
- package/dist/application/InvestigationProviders.js +41 -0
- 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 +305 -0
- package/dist/application/JavaScriptArtifactAnalysisTypes.js +1 -0
- package/dist/application/JavaScriptArtifactFiles.js +231 -0
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +54 -0
- package/dist/application/JavaScriptArtifactGraphBuilder.js +144 -0
- package/dist/application/JavaScriptArtifactGraphContext.js +205 -0
- package/dist/application/JavaScriptArtifactGraphDocuments.js +108 -0
- package/dist/application/JavaScriptArtifactGraphEvidence.js +99 -0
- package/dist/application/JavaScriptArtifactGraphFindings.js +271 -0
- package/dist/application/JavaScriptArtifactGraphStructure.js +409 -0
- package/dist/application/JavaScriptArtifactReconstruction.js +77 -0
- package/dist/application/JavaScriptArtifactReconstructionInput.js +18 -0
- package/dist/application/JavaScriptReplayPlanning.js +201 -0
- package/dist/application/JavaScriptReplayService.js +266 -0
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +25 -0
- package/dist/application/JavaScriptRuntimeReconciliationService.js +27 -0
- package/dist/application/MacHopper.js +20 -4
- 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/PermissionAuthority.js +1 -1
- package/dist/application/ProcessCaptureLifecycle.js +1 -1
- package/dist/application/ProcessHarness.js +1 -1
- package/dist/application/ProcessSampling.js +16 -12
- package/dist/application/ProjectPermissionStore.js +1 -0
- package/dist/application/SessionProviderRouter.js +219 -0
- package/dist/application/Setup.js +84 -60
- package/dist/application/SetupClients.js +1 -1
- package/dist/application/SetupPlan.js +9 -2
- package/dist/application/SupportedClients.js +40 -16
- package/dist/application/Upgrade.js +1 -1
- package/dist/application/runtime.js +11 -6
- package/dist/artifacts/AsarArtifactReader.js +23 -3
- package/dist/browser/CdpBrowserProvider.js +4 -2
- package/dist/browser/CdpCaptureEvents.js +49 -0
- package/dist/browser/CdpElectronInspection.js +106 -162
- package/dist/browser/CdpElectronProvider.js +9 -3
- package/dist/browser/CdpElectronScriptEvents.js +69 -0
- package/dist/browser/CdpElectronScripts.js +94 -0
- package/dist/browser/CdpElectronWorkers.js +56 -0
- package/dist/browser/CdpEndpoint.js +14 -1
- package/dist/browser/CdpPageCapture.js +8 -4
- package/dist/catalogIdentity.js +6 -42
- package/dist/cli.js +446 -34
- package/dist/cliApplicationCommands.js +62 -0
- package/dist/cliBrowserAdvancedCommands.js +5 -4
- package/dist/cliBrowserCommands.js +5 -4
- package/dist/cliCommandNames.js +56 -0
- package/dist/cliElectronCommands.js +106 -3
- package/dist/cliEvidenceCommands.js +4 -3
- package/dist/cliInvestigationCommands.js +2 -1
- package/dist/cliJsonInput.js +54 -0
- package/dist/cliPolicyCommands.js +2 -1
- package/dist/cliProcessCommands.js +3 -2
- package/dist/config.js +101 -2
- package/dist/contracts/applicationToolContracts.js +91 -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/enhancedInputs.js +2 -2
- 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 +28 -0
- package/dist/contracts/sessionLifecycleInputs.js +2 -0
- package/dist/contracts/toolContractExamples.js +10 -25
- package/dist/contracts/toolContracts.js +69 -65
- package/dist/contracts/toolEffects.js +160 -0
- package/dist/contracts/toolOutputSchemas.js +152 -42
- package/dist/doctorRuntime.js +47 -0
- package/dist/domain/analysisProfile.js +78 -0
- package/dist/domain/analysisSnapshot.js +92 -46
- package/dist/domain/artifactComparison.js +3 -4
- package/dist/domain/artifactGraph.js +1 -0
- package/dist/domain/binaryTarget.js +4 -29
- package/dist/domain/browserObservation.js +3 -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 +194 -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 +148 -7
- package/dist/domain/evidence.js +44 -5
- package/dist/domain/evidenceBundle.js +9 -7
- package/dist/domain/functionComparison.js +9 -3
- package/dist/domain/functionComparisonNormalization.js +37 -0
- package/dist/domain/functionComparisonSchemas.js +3 -8
- package/dist/domain/functionDossierEvidence.js +4 -1
- package/dist/domain/hopperValues.js +66 -9
- package/dist/domain/inputIssueProjection.js +52 -0
- package/dist/domain/investigationWorkspace.js +2 -1
- package/dist/domain/javascriptApplicationAnalysis.js +155 -0
- package/dist/domain/javascriptApplicationChangeGraph.js +231 -0
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +379 -0
- package/dist/domain/javascriptApplicationGraph.js +282 -0
- package/dist/domain/javascriptApplicationGraphSchemas.js +139 -0
- package/dist/domain/javascriptApplicationVersionComparison.js +116 -0
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +139 -0
- package/dist/domain/javascriptApplicationVersionItems.js +221 -0
- package/dist/domain/javascriptApplicationVersionKeys.js +170 -0
- package/dist/domain/javascriptAstFingerprint.js +143 -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 +88 -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 +191 -0
- package/dist/domain/javascriptStaticAnalysis.js +346 -0
- package/dist/domain/javascriptStaticAnalysisFindings.js +39 -0
- package/dist/domain/javascriptStaticAnalysisHelpers.js +274 -0
- package/dist/domain/javascriptStaticAnalysisState.js +23 -0
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/managedApplicationGraph.js +556 -0
- package/dist/domain/managedArtifact.js +444 -0
- package/dist/domain/managedMemberComparison.js +565 -0
- package/dist/domain/managedNativeVerification.js +408 -0
- package/dist/domain/managedReconstruction.js +183 -0
- package/dist/domain/managedRuntimeCorrelation.js +175 -0
- package/dist/domain/reconstructionVerificationSchemas.js +1 -3
- package/dist/dotnet/ManagedArtifactInspector.js +318 -0
- package/dist/dotnet/ManagedMemberInspector.js +887 -0
- package/dist/dotnet/ManagedMetadataHeaps.js +131 -0
- package/dist/dotnet/ManagedMetadataInventory.js +368 -0
- package/dist/dotnet/ManagedMetadataLayout.js +322 -0
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +391 -0
- package/dist/dotnet/ManagedPeReader.js +157 -0
- package/dist/dotnet/ManagedReaderFailure.js +10 -0
- package/dist/dotnet/ManagedStaticProvider.js +203 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +37 -0
- package/dist/ghidra/GhidraClient.js +400 -0
- package/dist/ghidra/GhidraClientTypes.js +1 -0
- package/dist/ghidra/GhidraDefaults.js +20 -0
- package/dist/ghidra/GhidraDiagnostics.js +43 -0
- package/dist/ghidra/GhidraDoctor.js +59 -0
- package/dist/ghidra/GhidraFunctionValues.js +264 -0
- package/dist/ghidra/GhidraInstallation.js +239 -0
- package/dist/ghidra/GhidraInventoryValues.js +217 -0
- package/dist/ghidra/GhidraLauncher.js +139 -0
- package/dist/ghidra/GhidraProvider.js +366 -0
- package/dist/ghidra/GhidraRequestQueue.js +98 -0
- package/dist/ghidra/GhidraResponseBuffer.js +31 -0
- package/dist/ghidra/GhidraResponseRouter.js +24 -0
- package/dist/ghidra/GhidraSessionError.js +39 -0
- package/dist/ghidra/GhidraSessionValues.js +62 -0
- package/dist/ghidra/GhidraSocketConnection.js +46 -0
- package/dist/ghidra/protocol.js +69 -0
- package/dist/hopper/BridgeLauncher.js +19 -54
- package/dist/hopper/HopperAnalysisProfile.js +106 -0
- package/dist/hopper/HopperClient.js +154 -162
- package/dist/hopper/HopperProvider.js +99 -7
- package/dist/hopper/HopperSessionValues.js +27 -0
- package/dist/hopper/HopperSocketConnection.js +31 -0
- package/dist/main.js +14 -0
- package/dist/native/NativeMacOSProvider.js +3 -1
- package/dist/process/PendingOperations.js +59 -0
- package/dist/process/PrivateRuntimeRoot.js +33 -0
- package/dist/process/ProviderDeadline.js +95 -0
- package/dist/process/ProviderProcess.js +275 -0
- package/dist/replay/JavaScriptReplayWorker.js +286 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +434 -0
- package/dist/replay/LinuxRuntimeClosure.js +46 -0
- package/dist/replay/LinuxSeccompPolicy.js +40 -0
- package/dist/replay/ReplayWorkerProtocol.js +55 -0
- package/dist/replay/SystemJavaScriptReplayHost.js +182 -0
- package/dist/server/createServer.js +53 -0
- package/dist/server/promptCompletion.js +9 -3
- package/dist/server/registerApplicationTools.js +115 -0
- package/dist/server/registerArtifactComparisonTool.js +16 -9
- package/dist/server/registerBrowserTools.js +33 -8
- package/dist/server/registerBundleComparisonTool.js +17 -20
- package/dist/server/registerElectronTools.js +45 -3
- package/dist/server/registerEnhancedTools.js +67 -19
- package/dist/server/registerEvidenceTools.js +5 -1
- package/dist/server/registerFunctionComparisonTool.js +14 -7
- package/dist/server/registerInvestigationTools.js +21 -17
- package/dist/server/registerManagedTools.js +6 -0
- package/dist/server/registerManagedWorkflowTools.js +277 -0
- package/dist/server/registerOfficialTools.js +11 -8
- package/dist/server/registerProcessComparisonTool.js +25 -47
- package/dist/server/registerSessionStatusTool.js +7 -7
- package/dist/server/registerSessionTools.js +57 -87
- package/dist/server/sessionEvidence.js +14 -19
- package/dist/server/toolInputValidation.js +77 -0
- package/dist/server/toolRegistrationOptions.js +79 -2
- package/dist/server/toolResult.js +25 -17
- package/package.json +17 -7
- package/scripts/rea.mjs +36 -2
- package/skills/rea-analysis/SKILL.md +59 -3
- /package/dist/{application → process}/ProcessOwnership.js +0 -0
|
@@ -1,22 +1,33 @@
|
|
|
1
|
+
import { analyzeJavaScriptApplicationValidated } from "../application/JavaScriptApplicationService.js";
|
|
2
|
+
import { reconcileJavaScriptRuntimeEvidenceValidated } from "../application/JavaScriptRuntimeReconciliationService.js";
|
|
1
3
|
import { inspectElectronPage, listElectronTargets, } from "../application/ElectronObservationService.js";
|
|
2
4
|
import { ELECTRON_TOOL_CONTRACTS } from "../contracts/electronToolContracts.js";
|
|
3
5
|
import { inspectElectronPageInputSchema, listElectronTargetsInputSchema, } from "../domain/electronObservation.js";
|
|
6
|
+
import { analyzeJavaScriptApplicationInputSchema } from "../domain/javascriptApplicationAnalysis.js";
|
|
7
|
+
import { reconcileJavaScriptRuntimeInputSchema } from "../domain/javascriptRuntimeReconciliationSchemas.js";
|
|
4
8
|
import { logToolExecution } from "./toolLogging.js";
|
|
5
9
|
import { toCallToolResult } from "./toolResult.js";
|
|
6
10
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
11
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
7
12
|
import { mcpProgressReporter } from "./mcpProgress.js";
|
|
8
13
|
/** Register Electron tools even when provider or permission policy is absent. */
|
|
9
14
|
export const registerElectronTools = (server, options) => {
|
|
10
|
-
const [listContract, inspectContract] = ELECTRON_TOOL_CONTRACTS;
|
|
15
|
+
const [listContract, inspectContract, analyzeContract, reconcileContract] = ELECTRON_TOOL_CONTRACTS;
|
|
11
16
|
server.registerTool(listContract.name, toolRegistrationOptions(listContract), async (input, context) => {
|
|
12
|
-
const
|
|
17
|
+
const parsedInput = safeParseToolInput(listElectronTargetsInputSchema, input, listContract.name);
|
|
18
|
+
if (!parsedInput.ok)
|
|
19
|
+
return toCallToolResult(parsedInput, listContract);
|
|
20
|
+
const parsed = parsedInput.value;
|
|
13
21
|
const result = await logToolExecution(options.logger, listContract.name, () => listElectronTargets(options.electron, options.permissionAuthority, parsed, { signal: context.mcpReq.signal }));
|
|
14
22
|
if (!result.ok)
|
|
15
23
|
return toCallToolResult(result, listContract);
|
|
16
24
|
return evidenceResult(options, listContract, result.value);
|
|
17
25
|
});
|
|
18
26
|
server.registerTool(inspectContract.name, toolRegistrationOptions(inspectContract), async (input, context) => {
|
|
19
|
-
const
|
|
27
|
+
const parsedInput = safeParseToolInput(inspectElectronPageInputSchema, input, inspectContract.name);
|
|
28
|
+
if (!parsedInput.ok)
|
|
29
|
+
return toCallToolResult(parsedInput, inspectContract);
|
|
30
|
+
const parsed = parsedInput.value;
|
|
20
31
|
const result = await logToolExecution(options.logger, inspectContract.name, () => inspectElectronPage(options.electron, options.permissionAuthority, parsed, {
|
|
21
32
|
signal: context.mcpReq.signal,
|
|
22
33
|
progress: mcpProgressReporter(context),
|
|
@@ -25,6 +36,37 @@ export const registerElectronTools = (server, options) => {
|
|
|
25
36
|
return toCallToolResult(result, inspectContract);
|
|
26
37
|
return evidenceResult(options, inspectContract, result.value);
|
|
27
38
|
});
|
|
39
|
+
server.registerTool(analyzeContract.name, toolRegistrationOptions(analyzeContract), async (input, context) => {
|
|
40
|
+
const parsedInput = safeParseToolInput(analyzeJavaScriptApplicationInputSchema, input, analyzeContract.name);
|
|
41
|
+
if (!parsedInput.ok)
|
|
42
|
+
return toCallToolResult(parsedInput, analyzeContract);
|
|
43
|
+
const parsed = parsedInput.value;
|
|
44
|
+
const result = await logToolExecution(options.logger, analyzeContract.name, () => analyzeJavaScriptApplicationValidated(options.permissionAuthority, parsed, {
|
|
45
|
+
signal: context.mcpReq.signal,
|
|
46
|
+
progress: mcpProgressReporter(context),
|
|
47
|
+
}));
|
|
48
|
+
if (!result.ok)
|
|
49
|
+
return toCallToolResult(result, analyzeContract);
|
|
50
|
+
return evidenceResult(options, analyzeContract, result.value);
|
|
51
|
+
});
|
|
52
|
+
server.registerTool(reconcileContract.name, toolRegistrationOptions(reconcileContract), async (input) => {
|
|
53
|
+
const parsedInput = safeParseToolInput(reconcileJavaScriptRuntimeInputSchema, input, reconcileContract.name);
|
|
54
|
+
if (!parsedInput.ok)
|
|
55
|
+
return toCallToolResult(parsedInput, reconcileContract);
|
|
56
|
+
const parsed = parsedInput.value;
|
|
57
|
+
const result = await logToolExecution(options.logger, reconcileContract.name, () => Promise.resolve(reconcileJavaScriptRuntimeEvidenceValidated(parsed)));
|
|
58
|
+
if (!result.ok)
|
|
59
|
+
return toCallToolResult(result, reconcileContract);
|
|
60
|
+
for (const source of [
|
|
61
|
+
...parsed.static_layers.map(({ analysis }) => analysis),
|
|
62
|
+
...parsed.runtime_observations,
|
|
63
|
+
]) {
|
|
64
|
+
const recorded = options.recordEvidence?.(source);
|
|
65
|
+
if (recorded !== undefined && !recorded.ok)
|
|
66
|
+
return toCallToolResult(recorded, reconcileContract);
|
|
67
|
+
}
|
|
68
|
+
return evidenceResult(options, reconcileContract, result.value);
|
|
69
|
+
});
|
|
28
70
|
};
|
|
29
71
|
const evidenceResult = (options, contract, evidence) => {
|
|
30
72
|
const recorded = options.recordEvidence?.(evidence);
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import { EnhancedTools } from "../application/EnhancedTools.js";
|
|
1
|
+
import { EnhancedTools, } from "../application/EnhancedTools.js";
|
|
2
2
|
import { enhancedToolNameSchema } from "../contracts/enhancedInputs.js";
|
|
3
3
|
import { ENHANCED_TOOL_CONTRACTS, } from "../contracts/toolContracts.js";
|
|
4
4
|
import { toCallToolResult } from "./toolResult.js";
|
|
5
5
|
import { logToolExecution } from "./toolLogging.js";
|
|
6
6
|
import { createEvidence } from "../domain/evidence.js";
|
|
7
|
-
import { jsonObjectSchema } from "../domain/jsonValue.js";
|
|
8
7
|
import { enhancedInputSchemas } from "../contracts/enhancedInputs.js";
|
|
9
|
-
import { UnknownRegistryError } from "../domain/errors.js";
|
|
8
|
+
import { AnalysisInputError, UnknownRegistryError } from "../domain/errors.js";
|
|
9
|
+
import { ok } from "../domain/result.js";
|
|
10
10
|
import { mcpProgressReporter } from "./mcpProgress.js";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
version: "1",
|
|
15
|
-
};
|
|
11
|
+
import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "../application/InvestigationProviders.js";
|
|
12
|
+
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
13
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
16
14
|
/** Register composed workflows against the same port as direct bridge tools. */
|
|
17
15
|
export const registerEnhancedTools = (server, analysis, options) => {
|
|
18
16
|
const services = new EnhancedTools(analysis);
|
|
@@ -20,6 +18,7 @@ export const registerEnhancedTools = (server, analysis, options) => {
|
|
|
20
18
|
registerEnhancedTool(server, services, contract, {
|
|
21
19
|
logger: options.logger,
|
|
22
20
|
activeTarget: options.activeTarget,
|
|
21
|
+
analysisProfile: options.analysisProfile,
|
|
23
22
|
recordEvidence: options.recordEvidence,
|
|
24
23
|
recordUnknown: options.recordUnknown,
|
|
25
24
|
});
|
|
@@ -27,12 +26,7 @@ export const registerEnhancedTools = (server, analysis, options) => {
|
|
|
27
26
|
};
|
|
28
27
|
const registerEnhancedTool = (server, services, contract, registration) => {
|
|
29
28
|
const name = enhancedToolNameSchema.parse(contract.name);
|
|
30
|
-
server.registerTool(name, {
|
|
31
|
-
description: contract.description,
|
|
32
|
-
inputSchema: contract.inputSchema,
|
|
33
|
-
outputSchema: contract.outputSchema,
|
|
34
|
-
annotations: contract.annotations,
|
|
35
|
-
}, async (input, context) => {
|
|
29
|
+
server.registerTool(name, toolRegistrationOptions(contract), async (input, context) => {
|
|
36
30
|
const progress = mcpProgressReporter(context);
|
|
37
31
|
await progress.report({
|
|
38
32
|
phase: name,
|
|
@@ -40,9 +34,12 @@ const registerEnhancedTool = (server, services, contract, registration) => {
|
|
|
40
34
|
total: 1,
|
|
41
35
|
message: "started",
|
|
42
36
|
});
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
const validatedCall = parseEnhancedCall(name, input);
|
|
38
|
+
if (!validatedCall.ok)
|
|
39
|
+
return toCallToolResult(validatedCall, contract);
|
|
40
|
+
const parsedInput = validatedCall.value.input;
|
|
41
|
+
const parameters = jsonParameters(parsedInput);
|
|
42
|
+
const result = await logToolExecution(registration.logger, name, () => services.executeValidated(validatedCall.value, context.mcpReq.signal));
|
|
46
43
|
await progress.report({
|
|
47
44
|
phase: name,
|
|
48
45
|
completed: 1,
|
|
@@ -51,10 +48,16 @@ const registerEnhancedTool = (server, services, contract, registration) => {
|
|
|
51
48
|
terminal: true,
|
|
52
49
|
});
|
|
53
50
|
if (result.ok) {
|
|
54
|
-
const
|
|
51
|
+
const upstreamProfile = registration.analysisProfile?.();
|
|
52
|
+
const evidence = createEvidence(registration.activeTarget?.(), REA_WORKFLOW_PROVIDER, {
|
|
55
53
|
operation: name,
|
|
56
54
|
parameters,
|
|
57
55
|
result: result.value,
|
|
56
|
+
...(upstreamProfile === undefined
|
|
57
|
+
? {}
|
|
58
|
+
: {
|
|
59
|
+
analysisProfile: workflowAnalysisProfile(upstreamProfile),
|
|
60
|
+
}),
|
|
58
61
|
confidence: "derived",
|
|
59
62
|
limitations: [
|
|
60
63
|
"Derived by an REA workflow from one or more provider observations.",
|
|
@@ -65,7 +68,7 @@ const registerEnhancedTool = (server, services, contract, registration) => {
|
|
|
65
68
|
return toCallToolResult(recorded, contract);
|
|
66
69
|
const unknowns = recordWorkflowUnknowns({
|
|
67
70
|
name,
|
|
68
|
-
input:
|
|
71
|
+
input: parameters,
|
|
69
72
|
result: result.value,
|
|
70
73
|
evidenceId: evidence.evidence_id,
|
|
71
74
|
recordUnknown: registration.recordUnknown,
|
|
@@ -79,6 +82,51 @@ const registerEnhancedTool = (server, services, contract, registration) => {
|
|
|
79
82
|
return toCallToolResult(result, contract);
|
|
80
83
|
});
|
|
81
84
|
};
|
|
85
|
+
const jsonParameters = (input) => Object.fromEntries(Object.entries(input).filter((entry) => entry[1] !== undefined));
|
|
86
|
+
const parseEnhancedCall = (name, input) => {
|
|
87
|
+
switch (name) {
|
|
88
|
+
case "swift_classes": {
|
|
89
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.swift_classes, input, name);
|
|
90
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
91
|
+
}
|
|
92
|
+
case "get_objc_classes": {
|
|
93
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.get_objc_classes, input, name);
|
|
94
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
95
|
+
}
|
|
96
|
+
case "get_objc_protocols": {
|
|
97
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.get_objc_protocols, input, name);
|
|
98
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
99
|
+
}
|
|
100
|
+
case "batch_decompile": {
|
|
101
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.batch_decompile, input, name);
|
|
102
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
103
|
+
}
|
|
104
|
+
case "get_call_graph": {
|
|
105
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.get_call_graph, input, name);
|
|
106
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
107
|
+
}
|
|
108
|
+
case "analyze_swift_types": {
|
|
109
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.analyze_swift_types, input, name);
|
|
110
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
111
|
+
}
|
|
112
|
+
case "find_xrefs_to_name": {
|
|
113
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.find_xrefs_to_name, input, name);
|
|
114
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
115
|
+
}
|
|
116
|
+
case "binary_overview": {
|
|
117
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.binary_overview, input, name);
|
|
118
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
119
|
+
}
|
|
120
|
+
case "analyze_function": {
|
|
121
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.analyze_function, input, name);
|
|
122
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
123
|
+
}
|
|
124
|
+
case "trace_feature": {
|
|
125
|
+
const parsed = safeParseToolInput(enhancedInputSchemas.trace_feature, input, name);
|
|
126
|
+
return parsed.ok ? ok({ name, input: parsed.value }) : parsed;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
82
130
|
const recordWorkflowUnknowns = ({ name, input, result, evidenceId, recordUnknown, }) => {
|
|
83
131
|
if (name !== "trace_feature" ||
|
|
84
132
|
input.unknown_registry_approved !== true ||
|
|
@@ -4,6 +4,7 @@ import { logToolExecution } from "./toolLogging.js";
|
|
|
4
4
|
import { toCallToolResult } from "./toolResult.js";
|
|
5
5
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
6
6
|
import { mcpProgressReporter } from "./mcpProgress.js";
|
|
7
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
7
8
|
import { AnalysisProtocolError, PermissionRequiredError, } from "../domain/errors.js";
|
|
8
9
|
import { err } from "../domain/result.js";
|
|
9
10
|
/** Register provider-backed contracts that return atomic Evidence v2 observations. */
|
|
@@ -17,7 +18,10 @@ export const registerEvidenceTools = (server, analysis, contracts, options) => {
|
|
|
17
18
|
total: 1,
|
|
18
19
|
message: "started",
|
|
19
20
|
});
|
|
20
|
-
const
|
|
21
|
+
const parsedInput = safeParseToolInput(contract.inputSchema, input, contract.name);
|
|
22
|
+
if (!parsedInput.ok)
|
|
23
|
+
return toCallToolResult(parsedInput, contract);
|
|
24
|
+
const parameters = jsonObjectSchema.parse(parsedInput.value);
|
|
21
25
|
if (options.permissionAuthority !== undefined) {
|
|
22
26
|
const request = permissionRequest(contract.name, parameters);
|
|
23
27
|
if (request !== undefined) {
|
|
@@ -4,21 +4,29 @@ import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
|
4
4
|
import { FUNCTION_COMPARISON_PROVIDER } from "./sessionToolPolicies.js";
|
|
5
5
|
import { toCallToolResult } from "./toolResult.js";
|
|
6
6
|
import { recordDerivedEvidence } from "./recordDerivedEvidence.js";
|
|
7
|
-
import {
|
|
7
|
+
import { resolveSessionEvidenceIds } from "./sessionEvidence.js";
|
|
8
8
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
9
9
|
import { runDerivedOperation } from "./runDerivedOperation.js";
|
|
10
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
10
11
|
/** Register explicit Evidence-backed function comparison. */
|
|
11
12
|
export const registerFunctionComparisonTool = (server, session, contract) => {
|
|
12
13
|
server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
|
|
13
|
-
const
|
|
14
|
-
|
|
14
|
+
const parsedInput = safeParseToolInput(functionComparisonInputSchema, input, contract.name);
|
|
15
|
+
if (!parsedInput.ok)
|
|
16
|
+
return toCallToolResult(parsedInput, contract);
|
|
17
|
+
const parsed = parsedInput.value;
|
|
18
|
+
const expected = {
|
|
19
|
+
operation: "analyze_function",
|
|
20
|
+
predicate: "rea.analysis/v2",
|
|
21
|
+
};
|
|
22
|
+
const left = resolveSessionEvidenceIds(session, parsed.left_evidence_ids, expected);
|
|
15
23
|
if (!left.ok)
|
|
16
24
|
return toCallToolResult(left, contract);
|
|
17
|
-
const right =
|
|
25
|
+
const right = resolveSessionEvidenceIds(session, parsed.right_evidence_ids, expected);
|
|
18
26
|
if (!right.ok)
|
|
19
27
|
return toCallToolResult(right, contract);
|
|
20
|
-
const leftIds =
|
|
21
|
-
const rightIds =
|
|
28
|
+
const leftIds = left.value.map(({ evidence_id: id }) => id);
|
|
29
|
+
const rightIds = right.value.map(({ evidence_id: id }) => id);
|
|
22
30
|
const computed = await runDerivedOperation(context, contract.name, () => compareFunctions(left.value, right.value, parsed.offset, parsed.limit));
|
|
23
31
|
if (!computed.ok)
|
|
24
32
|
return toCallToolResult(computed, contract);
|
|
@@ -69,4 +77,3 @@ const functionUnknownInput = ({ approved, status, leftIds, rightIds, }) => {
|
|
|
69
77
|
relationships: [],
|
|
70
78
|
};
|
|
71
79
|
};
|
|
72
|
-
const evidenceIds = (input) => (Array.isArray(input) ? input : [input]).map(({ evidence_id: id }) => id);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { runCrossVersionInvestigationValidated } from "../application/CrossVersionInvestigation.js";
|
|
2
|
+
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
3
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
2
4
|
import { buildCallPath, callPathInputSchema } from "../domain/callPath.js";
|
|
3
5
|
import { correlateStaticAndRuntime, staticRuntimeCorrelationInputSchema, } from "../domain/staticRuntimeCorrelation.js";
|
|
4
6
|
import { reconstructionVerificationInputSchema, verifyReconstruction, } from "../domain/reconstructionVerification.js";
|
|
@@ -30,7 +32,10 @@ const investigationExecution = (session, signal, inputRoots, integrityContinueEn
|
|
|
30
32
|
const isIncomplete = (status) => status === "unknown" || status === "truncated";
|
|
31
33
|
const registerChangedBehavior = (server, session, contract, policies) => {
|
|
32
34
|
server.registerTool(contract.name, contractOptions(contract), async (input, context) => {
|
|
33
|
-
const
|
|
35
|
+
const parsedInput = safeParseToolInput(changedBehaviorInputSchema, input, contract.name);
|
|
36
|
+
if (!parsedInput.ok)
|
|
37
|
+
return toCallToolResult(parsedInput, contract);
|
|
38
|
+
const parsed = parsedInput.value;
|
|
34
39
|
const investigationRun = parsed.investigation_run;
|
|
35
40
|
if (investigationRun !== undefined) {
|
|
36
41
|
const progress = mcpProgressReporter(context);
|
|
@@ -54,7 +59,7 @@ const registerChangedBehavior = (server, session, contract, policies) => {
|
|
|
54
59
|
operation: contract.name,
|
|
55
60
|
});
|
|
56
61
|
}
|
|
57
|
-
const investigated = await
|
|
62
|
+
const investigated = await runCrossVersionInvestigationValidated(investigationRun, policies.evidenceFiles, {
|
|
58
63
|
...investigationExecution(session, context.mcpReq.signal, policies.inputRoots, policies.integrityContinueEnabled?.() ?? false, progress),
|
|
59
64
|
...(workspaceAuthorization === undefined
|
|
60
65
|
? {}
|
|
@@ -134,7 +139,10 @@ const registerChangedBehavior = (server, session, contract, policies) => {
|
|
|
134
139
|
};
|
|
135
140
|
const registerCallPath = (server, session, contract) => {
|
|
136
141
|
server.registerTool(contract.name, contractOptions(contract), async (input, context) => {
|
|
137
|
-
const
|
|
142
|
+
const parsedInput = safeParseToolInput(callPathInputSchema, input, contract.name);
|
|
143
|
+
if (!parsedInput.ok)
|
|
144
|
+
return toCallToolResult(parsedInput, contract);
|
|
145
|
+
const parsed = parsedInput.value;
|
|
138
146
|
const closure = evidenceClosure(session, functionEvidenceIds(parsed.functions));
|
|
139
147
|
if (!closure.ok)
|
|
140
148
|
return toCallToolResult(closure, contract);
|
|
@@ -177,7 +185,10 @@ const registerCallPath = (server, session, contract) => {
|
|
|
177
185
|
};
|
|
178
186
|
const registerStaticRuntime = (server, session, contract) => {
|
|
179
187
|
server.registerTool(contract.name, contractOptions(contract), async (input, context) => {
|
|
180
|
-
const
|
|
188
|
+
const parsedInput = safeParseToolInput(staticRuntimeCorrelationInputSchema, input, contract.name);
|
|
189
|
+
if (!parsedInput.ok)
|
|
190
|
+
return toCallToolResult(parsedInput, contract);
|
|
191
|
+
const parsed = parsedInput.value;
|
|
181
192
|
const closure = evidenceClosure(session, comparisonClosure([
|
|
182
193
|
...parsed.static_comparisons,
|
|
183
194
|
...parsed.runtime_comparisons,
|
|
@@ -219,13 +230,11 @@ const registerStaticRuntime = (server, session, contract) => {
|
|
|
219
230
|
};
|
|
220
231
|
const registerReconstruction = (server, session, contract) => {
|
|
221
232
|
server.registerTool(contract.name, contractOptions(contract), async (input, context) => {
|
|
222
|
-
const
|
|
233
|
+
const parsedInput = safeParseToolInput(reconstructionVerificationInputSchema, input, contract.name);
|
|
234
|
+
if (!parsedInput.ok)
|
|
235
|
+
return toCallToolResult(parsedInput, contract);
|
|
236
|
+
const parsed = parsedInput.value;
|
|
223
237
|
const owned = session.exportEvidenceBundle();
|
|
224
|
-
const ownedUnknowns = new Set(owned.unknowns.map(({ revision_digest: digest }) => digest));
|
|
225
|
-
const ownedEvidenceIds = new Set(owned.records.map(({ evidence_id: id }) => id));
|
|
226
|
-
if (parsed.evidence_bundle.records.some(({ evidence_id: id }) => !ownedEvidenceIds.has(id)) ||
|
|
227
|
-
parsed.evidence_bundle.unknowns.some(({ revision_digest: digest }) => !ownedUnknowns.has(digest)))
|
|
228
|
-
return toCallToolResult(err(new EvidenceIntegrityError("Reconstruction input unknown history is not present in this session")), contract);
|
|
229
238
|
const computed = await runDerivedOperation(context, contract.name, () => verifyReconstruction(parsed.specification, owned, parsed.offset, parsed.limit));
|
|
230
239
|
if (!computed.ok)
|
|
231
240
|
return toCallToolResult(computed, contract);
|
|
@@ -261,12 +270,7 @@ const registerReconstruction = (server, session, contract) => {
|
|
|
261
270
|
}), contract);
|
|
262
271
|
});
|
|
263
272
|
};
|
|
264
|
-
const contractOptions =
|
|
265
|
-
description: contract.description,
|
|
266
|
-
inputSchema: contract.inputSchema,
|
|
267
|
-
outputSchema: contract.outputSchema,
|
|
268
|
-
annotations: contract.annotations,
|
|
269
|
-
});
|
|
273
|
+
const contractOptions = toolRegistrationOptions;
|
|
270
274
|
const comparisonClosure = (comparisons) => uniqueIds(comparisons.flatMap((evidence) => [
|
|
271
275
|
evidence.evidence_id,
|
|
272
276
|
...evidence.evidence_links,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { MANAGED_TOOL_CONTRACTS } from "../contracts/managedToolContracts.js";
|
|
2
|
+
import { registerEvidenceTools } from "./registerEvidenceTools.js";
|
|
3
|
+
/** Register execution-free managed PE/CLI inspection. */
|
|
4
|
+
export const registerManagedTools = (server, analysis, options) => {
|
|
5
|
+
registerEvidenceTools(server, analysis, MANAGED_TOOL_CONTRACTS, options);
|
|
6
|
+
};
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { compareManagedMembersEvidenceValidated } from "../application/ManagedMemberComparisonService.js";
|
|
2
|
+
import { projectManagedApplicationGraphEvidence } from "../application/ManagedApplicationGraphService.js";
|
|
3
|
+
import { verifyManagedNativeBoundariesEvidence } from "../application/ManagedNativeVerificationService.js";
|
|
4
|
+
import { importManagedReconstructionEvidenceValidated } from "../application/ManagedReconstructionService.js";
|
|
5
|
+
import { planManagedRuntimeCorrelationEvidenceValidated, } from "../application/ManagedRuntimeCorrelationService.js";
|
|
6
|
+
import { compareManagedMembersReferenceInputSchema, managedApplicationGraphReferenceInputSchema, managedNativeVerificationReferenceInputSchema, managedReconstructionReferenceInputSchema, managedRuntimeCorrelationReferenceInputSchema, MANAGED_WORKFLOW_TOOL_CONTRACTS, } from "../contracts/managedWorkflowToolContracts.js";
|
|
7
|
+
import { managedMemberComparisonResultSchema } from "../domain/managedMemberComparison.js";
|
|
8
|
+
import { managedNativeVerificationResultSchema } from "../domain/managedNativeVerification.js";
|
|
9
|
+
import { logToolExecution } from "./toolLogging.js";
|
|
10
|
+
import { toCallToolResult } from "./toolResult.js";
|
|
11
|
+
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
12
|
+
import { safeParseToolInput } from "./toolInputValidation.js";
|
|
13
|
+
import { resolveSessionEvidenceIds } from "./sessionEvidence.js";
|
|
14
|
+
/** Register provider-neutral managed-code workflows. */
|
|
15
|
+
export const registerManagedWorkflowTools = (server, options) => {
|
|
16
|
+
const compareContract = contract("compare_managed_members");
|
|
17
|
+
const nativeVerificationContract = contract("verify_managed_native_boundaries");
|
|
18
|
+
const reconstructionContract = contract("import_managed_reconstruction");
|
|
19
|
+
const runtimeContract = contract("plan_managed_runtime_correlation");
|
|
20
|
+
const graphContract = contract("project_managed_application_graph");
|
|
21
|
+
server.registerTool(compareContract.name, toolRegistrationOptions(compareContract), async (input) => {
|
|
22
|
+
const parsedInput = safeParseToolInput(compareManagedMembersReferenceInputSchema, input, compareContract.name);
|
|
23
|
+
if (!parsedInput.ok)
|
|
24
|
+
return toCallToolResult(parsedInput, compareContract);
|
|
25
|
+
const resolved = resolveManagedEvidence(options.session, [
|
|
26
|
+
parsedInput.value.left_evidence_id,
|
|
27
|
+
parsedInput.value.right_evidence_id,
|
|
28
|
+
]);
|
|
29
|
+
if (!resolved.ok)
|
|
30
|
+
return toCallToolResult(resolved, compareContract);
|
|
31
|
+
const [left, right] = resolved.value;
|
|
32
|
+
if (left === undefined || right === undefined)
|
|
33
|
+
throw new TypeError("Managed comparison Evidence resolution failed");
|
|
34
|
+
const { left_evidence_id: _leftEvidenceId, right_evidence_id: _rightEvidenceId, ...referencedInput } = parsedInput.value;
|
|
35
|
+
const parsed = { ...referencedInput, left, right };
|
|
36
|
+
const result = await logToolExecution(options.logger, compareContract.name, () => Promise.resolve(compareManagedMembersEvidenceValidated(parsed)));
|
|
37
|
+
if (!result.ok)
|
|
38
|
+
return toCallToolResult(result, compareContract);
|
|
39
|
+
const recorded = recordSources(options.recordEvidence, [
|
|
40
|
+
parsed.left,
|
|
41
|
+
parsed.right,
|
|
42
|
+
]);
|
|
43
|
+
if (!recorded.ok)
|
|
44
|
+
return toCallToolResult(recorded, compareContract);
|
|
45
|
+
const comparison = managedMemberComparisonResultSchema.parse(result.value.normalized_result);
|
|
46
|
+
const unknown = comparison.summary.unknown > 0;
|
|
47
|
+
const output = parsed.unknown_registry_approved === true && unknown
|
|
48
|
+
? options.recordEvidenceWithUnknown?.(result.value, {
|
|
49
|
+
approved: true,
|
|
50
|
+
question: "Which managed members remain unmatched or ambiguous across these versions?",
|
|
51
|
+
severity: "medium",
|
|
52
|
+
domain: "managed-member-comparison",
|
|
53
|
+
supporting_evidence_ids: [result.value.evidence_id],
|
|
54
|
+
contradicting_evidence_ids: [],
|
|
55
|
+
required_authority: "shipped-artifact",
|
|
56
|
+
required_confidence: "observed",
|
|
57
|
+
required_environment: null,
|
|
58
|
+
recommended_probes: [
|
|
59
|
+
{
|
|
60
|
+
operation: "inspect_managed_members",
|
|
61
|
+
rationale: "Repeat static member inspection with complete pages and method bodies.",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
relationships: [],
|
|
65
|
+
})
|
|
66
|
+
: options.recordEvidence?.(result.value);
|
|
67
|
+
if (output !== undefined && !output.ok)
|
|
68
|
+
return toCallToolResult(output, compareContract);
|
|
69
|
+
return toCallToolResult({ ok: true, value: result.value }, compareContract, {
|
|
70
|
+
evidenceResourcesAvailable: output !== undefined,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
server.registerTool(nativeVerificationContract.name, toolRegistrationOptions(nativeVerificationContract), async (input) => {
|
|
74
|
+
const parsedInput = safeParseToolInput(managedNativeVerificationReferenceInputSchema, input, nativeVerificationContract.name);
|
|
75
|
+
if (!parsedInput.ok)
|
|
76
|
+
return toCallToolResult(parsedInput, nativeVerificationContract);
|
|
77
|
+
const managedBoundaries = resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_boundaries_evidence_id);
|
|
78
|
+
if (!managedBoundaries.ok)
|
|
79
|
+
return toCallToolResult(managedBoundaries, nativeVerificationContract);
|
|
80
|
+
const nativeObservations = resolveNativeEvidence(options.session, parsedInput.value.native_observation_evidence_ids);
|
|
81
|
+
if (!nativeObservations.ok)
|
|
82
|
+
return toCallToolResult(nativeObservations, nativeVerificationContract);
|
|
83
|
+
const managedBoundary = managedBoundaries.value[0];
|
|
84
|
+
if (managedBoundary === undefined)
|
|
85
|
+
throw new TypeError("Managed boundary Evidence resolution failed");
|
|
86
|
+
const { managed_boundaries_evidence_id: _managedBoundariesEvidenceId, native_observation_evidence_ids: _nativeObservationEvidenceIds, ...referencedInput } = parsedInput.value;
|
|
87
|
+
const parsed = {
|
|
88
|
+
...referencedInput,
|
|
89
|
+
managed_boundaries: managedBoundary,
|
|
90
|
+
native_observations: nativeObservations.value,
|
|
91
|
+
};
|
|
92
|
+
const result = await logToolExecution(options.logger, nativeVerificationContract.name, () => Promise.resolve(verifyManagedNativeBoundariesEvidence(parsed)));
|
|
93
|
+
if (!result.ok)
|
|
94
|
+
return toCallToolResult(result, nativeVerificationContract);
|
|
95
|
+
const recordedSources = recordSources(options.recordEvidence, [
|
|
96
|
+
parsed.managed_boundaries,
|
|
97
|
+
...parsed.native_observations,
|
|
98
|
+
]);
|
|
99
|
+
if (!recordedSources.ok)
|
|
100
|
+
return toCallToolResult(recordedSources, nativeVerificationContract);
|
|
101
|
+
const verification = managedNativeVerificationResultSchema.parse(result.value.normalized_result);
|
|
102
|
+
const unknown = verification.summary.unresolved > 0 ||
|
|
103
|
+
verification.summary.contradicted > 0 ||
|
|
104
|
+
verification.summary.native_body_unresolved > 0;
|
|
105
|
+
const output = parsed.unknown_registry_approved === true && unknown
|
|
106
|
+
? options.recordEvidenceWithUnknown?.(result.value, {
|
|
107
|
+
approved: true,
|
|
108
|
+
question: "Which managed/native boundaries remain unresolved or contradicted by the supplied native Evidence?",
|
|
109
|
+
severity: "medium",
|
|
110
|
+
domain: "managed-native-verification",
|
|
111
|
+
supporting_evidence_ids: [result.value.evidence_id],
|
|
112
|
+
contradicting_evidence_ids: [],
|
|
113
|
+
required_authority: "shipped-artifact",
|
|
114
|
+
required_confidence: "observed",
|
|
115
|
+
required_environment: null,
|
|
116
|
+
recommended_probes: [
|
|
117
|
+
{
|
|
118
|
+
operation: "inspect_managed_native_boundaries",
|
|
119
|
+
rationale: "Repeat managed boundary inspection with complete ModuleRef, ImplMap, and native implementation pages.",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
operation: "analyze_function",
|
|
123
|
+
rationale: "Analyze the provider-resolved native function candidate for the declared export.",
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
relationships: [],
|
|
127
|
+
})
|
|
128
|
+
: options.recordEvidence?.(result.value);
|
|
129
|
+
if (output !== undefined && !output.ok)
|
|
130
|
+
return toCallToolResult(output, nativeVerificationContract);
|
|
131
|
+
return toCallToolResult(result, nativeVerificationContract, {
|
|
132
|
+
evidenceResourcesAvailable: output !== undefined,
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
server.registerTool(reconstructionContract.name, toolRegistrationOptions(reconstructionContract), async (input) => {
|
|
136
|
+
const parsedInput = safeParseToolInput(managedReconstructionReferenceInputSchema, input, reconstructionContract.name);
|
|
137
|
+
if (!parsedInput.ok)
|
|
138
|
+
return toCallToolResult(parsedInput, reconstructionContract);
|
|
139
|
+
const resolved = resolveManagedEvidence(options.session, [
|
|
140
|
+
parsedInput.value.static_members_evidence_id,
|
|
141
|
+
]);
|
|
142
|
+
if (!resolved.ok)
|
|
143
|
+
return toCallToolResult(resolved, reconstructionContract);
|
|
144
|
+
const staticMembers = resolved.value[0];
|
|
145
|
+
if (staticMembers === undefined)
|
|
146
|
+
throw new TypeError("Managed reconstruction Evidence resolution failed");
|
|
147
|
+
const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
|
|
148
|
+
const parsed = { ...referencedInput, static_members: staticMembers };
|
|
149
|
+
const result = await logToolExecution(options.logger, reconstructionContract.name, () => Promise.resolve(importManagedReconstructionEvidenceValidated(parsed)));
|
|
150
|
+
if (!result.ok)
|
|
151
|
+
return toCallToolResult(result, reconstructionContract);
|
|
152
|
+
const recordedSource = options.recordEvidence?.(parsed.static_members);
|
|
153
|
+
if (recordedSource !== undefined && !recordedSource.ok)
|
|
154
|
+
return toCallToolResult(recordedSource, reconstructionContract);
|
|
155
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
156
|
+
if (recorded !== undefined && !recorded.ok)
|
|
157
|
+
return toCallToolResult(recorded, reconstructionContract);
|
|
158
|
+
return toCallToolResult(result, reconstructionContract, {
|
|
159
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
server.registerTool(runtimeContract.name, toolRegistrationOptions(runtimeContract), async (input) => {
|
|
163
|
+
const parsedInput = safeParseToolInput(managedRuntimeCorrelationReferenceInputSchema, input, runtimeContract.name);
|
|
164
|
+
if (!parsedInput.ok)
|
|
165
|
+
return toCallToolResult(parsedInput, runtimeContract);
|
|
166
|
+
const resolved = resolveManagedEvidence(options.session, [
|
|
167
|
+
parsedInput.value.static_members_evidence_id,
|
|
168
|
+
]);
|
|
169
|
+
if (!resolved.ok)
|
|
170
|
+
return toCallToolResult(resolved, runtimeContract);
|
|
171
|
+
const staticMembers = resolved.value[0];
|
|
172
|
+
if (staticMembers === undefined)
|
|
173
|
+
throw new TypeError("Managed runtime Evidence resolution failed");
|
|
174
|
+
const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
|
|
175
|
+
const parsed = { ...referencedInput, static_members: staticMembers };
|
|
176
|
+
const result = await logToolExecution(options.logger, runtimeContract.name, () => planManagedRuntimeCorrelationEvidenceValidated(options.runtime, parsed));
|
|
177
|
+
if (!result.ok)
|
|
178
|
+
return toCallToolResult(result, runtimeContract);
|
|
179
|
+
const recordedSource = options.recordEvidence?.(parsed.static_members);
|
|
180
|
+
if (recordedSource !== undefined && !recordedSource.ok)
|
|
181
|
+
return toCallToolResult(recordedSource, runtimeContract);
|
|
182
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
183
|
+
if (recorded !== undefined && !recorded.ok)
|
|
184
|
+
return toCallToolResult(recorded, runtimeContract);
|
|
185
|
+
return toCallToolResult(result, runtimeContract, {
|
|
186
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
server.registerTool(graphContract.name, toolRegistrationOptions(graphContract), async (input) => {
|
|
190
|
+
const parsedInput = safeParseToolInput(managedApplicationGraphReferenceInputSchema, input, graphContract.name);
|
|
191
|
+
if (!parsedInput.ok)
|
|
192
|
+
return toCallToolResult(parsedInput, graphContract);
|
|
193
|
+
const managedArtifact = parsedInput.value.managed_artifact_evidence_id === undefined
|
|
194
|
+
? undefined
|
|
195
|
+
: resolveManagedArtifactEvidence(options.session, parsedInput.value.managed_artifact_evidence_id);
|
|
196
|
+
if (managedArtifact !== undefined && !managedArtifact.ok)
|
|
197
|
+
return toCallToolResult(managedArtifact, graphContract);
|
|
198
|
+
const managedMembers = parsedInput.value.managed_members_evidence_id === undefined
|
|
199
|
+
? undefined
|
|
200
|
+
: resolveManagedEvidence(options.session, [
|
|
201
|
+
parsedInput.value.managed_members_evidence_id,
|
|
202
|
+
]);
|
|
203
|
+
if (managedMembers !== undefined && !managedMembers.ok)
|
|
204
|
+
return toCallToolResult(managedMembers, graphContract);
|
|
205
|
+
const managedBoundaries = parsedInput.value.managed_native_boundaries_evidence_id === undefined
|
|
206
|
+
? undefined
|
|
207
|
+
: resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_native_boundaries_evidence_id);
|
|
208
|
+
if (managedBoundaries !== undefined && !managedBoundaries.ok)
|
|
209
|
+
return toCallToolResult(managedBoundaries, graphContract);
|
|
210
|
+
const parsed = {
|
|
211
|
+
limits: parsedInput.value.limits,
|
|
212
|
+
managed_artifact: managedArtifact?.value[0],
|
|
213
|
+
managed_members: managedMembers?.value[0],
|
|
214
|
+
managed_native_boundaries: managedBoundaries?.value[0],
|
|
215
|
+
};
|
|
216
|
+
const result = await logToolExecution(options.logger, graphContract.name, () => Promise.resolve(projectManagedApplicationGraphEvidence(parsed)));
|
|
217
|
+
if (!result.ok)
|
|
218
|
+
return toCallToolResult(result, graphContract);
|
|
219
|
+
const recordedSources = recordSources(options.recordEvidence, sourceEvidence(parsed));
|
|
220
|
+
if (!recordedSources.ok)
|
|
221
|
+
return toCallToolResult(recordedSources, graphContract);
|
|
222
|
+
const recorded = options.recordEvidence?.(result.value);
|
|
223
|
+
if (recorded !== undefined && !recorded.ok)
|
|
224
|
+
return toCallToolResult(recorded, graphContract);
|
|
225
|
+
return toCallToolResult(result, graphContract, {
|
|
226
|
+
evidenceResourcesAvailable: recorded !== undefined,
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
const contract = (name) => {
|
|
231
|
+
const found = MANAGED_WORKFLOW_TOOL_CONTRACTS.find((candidate) => candidate.name === name);
|
|
232
|
+
if (found === undefined)
|
|
233
|
+
throw new Error(`Missing ${name} contract`);
|
|
234
|
+
return found;
|
|
235
|
+
};
|
|
236
|
+
const resolveManagedEvidence = (session, evidenceIds) => resolveSessionEvidenceIds(session, evidenceIds, {
|
|
237
|
+
operation: "inspect_managed_members",
|
|
238
|
+
predicate: "rea.analysis/v2",
|
|
239
|
+
});
|
|
240
|
+
const resolveManagedArtifactEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
|
|
241
|
+
operation: "inspect_managed_artifact",
|
|
242
|
+
predicate: "rea.analysis/v2",
|
|
243
|
+
});
|
|
244
|
+
const resolveManagedBoundaryEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
|
|
245
|
+
operation: "inspect_managed_native_boundaries",
|
|
246
|
+
predicate: "rea.analysis/v2",
|
|
247
|
+
});
|
|
248
|
+
const resolveNativeEvidence = (session, evidenceIds) => {
|
|
249
|
+
const records = [];
|
|
250
|
+
for (const evidenceId of evidenceIds) {
|
|
251
|
+
const operation = session.evidenceById(evidenceId)?.operation;
|
|
252
|
+
const expectedOperation = operation === "inspect_macho" || operation === "analyze_function"
|
|
253
|
+
? operation
|
|
254
|
+
: "inspect_macho or analyze_function";
|
|
255
|
+
const resolved = resolveSessionEvidenceIds(session, [evidenceId], {
|
|
256
|
+
operation: expectedOperation,
|
|
257
|
+
predicate: "rea.analysis/v2",
|
|
258
|
+
});
|
|
259
|
+
if (!resolved.ok)
|
|
260
|
+
return resolved;
|
|
261
|
+
records.push(...resolved.value);
|
|
262
|
+
}
|
|
263
|
+
return { ok: true, value: records };
|
|
264
|
+
};
|
|
265
|
+
const recordSources = (recordEvidence, sources) => {
|
|
266
|
+
for (const source of sources) {
|
|
267
|
+
const recorded = recordEvidence?.(source);
|
|
268
|
+
if (recorded !== undefined && !recorded.ok)
|
|
269
|
+
return recorded;
|
|
270
|
+
}
|
|
271
|
+
return { ok: true, value: null };
|
|
272
|
+
};
|
|
273
|
+
const sourceEvidence = (input) => [
|
|
274
|
+
input.managed_artifact,
|
|
275
|
+
input.managed_members,
|
|
276
|
+
input.managed_native_boundaries,
|
|
277
|
+
].filter((evidence) => evidence !== undefined);
|