rea-agents 2.0.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 +78 -32
- 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 +24 -2
- package/dist/application/ClientRegistrationStatus.js +1 -1
- package/dist/application/CrossVersionInventory.js +8 -2
- package/dist/application/CrossVersionInvestigation.js +1 -23
- package/dist/application/CrossVersionInvestigationCollections.js +23 -0
- package/dist/application/DirectAnalysis.js +47 -44
- package/dist/application/Doctor.js +156 -238
- package/dist/application/DoctorDiagnostics.js +180 -0
- package/dist/application/ElectronBoundaryAnalysis.js +23 -7
- package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
- package/dist/application/EnhancedToolPagination.js +22 -0
- package/dist/application/EnhancedToolTypes.js +4 -0
- package/dist/application/EnhancedTools.js +20 -37
- package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
- package/dist/application/InvestigationWorkspaceStore.js +24 -10
- package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
- package/dist/application/JavaScriptArtifactFiles.js +6 -2
- package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
- package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
- package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
- package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
- 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 +1 -1
- package/dist/application/JavaScriptJsonModules.js +39 -0
- package/dist/application/JavaScriptModuleRelationships.js +262 -0
- package/dist/application/JavaScriptReplayPermission.js +16 -0
- package/dist/application/JavaScriptReplayService.js +182 -156
- package/dist/application/LinuxHopper.js +10 -0
- package/dist/application/MacHopper.js +22 -11
- 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/ProjectPermissionStore.js +48 -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/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 +29 -496
- package/dist/browser/CdpObservationSession.js +51 -8
- package/dist/browser/CdpPageCapture.js +12 -133
- 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 +4 -0
- 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 +10 -768
- package/dist/cliApplicationCommands.js +118 -4
- package/dist/cliBrowserAdvancedCommands.js +73 -16
- package/dist/cliBrowserCommands.js +39 -115
- package/dist/cliCommandNames.js +4 -0
- package/dist/cliElectronCommands.js +33 -62
- package/dist/cliEvidenceCommands.js +13 -2
- package/dist/cliInvestigationCommands.js +53 -10
- 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 -375
- package/dist/contracts/applicationToolContracts.js +134 -0
- package/dist/contracts/managedToolContracts.js +1 -1
- package/dist/contracts/managedWorkflowToolContracts.js +3 -3
- package/dist/contracts/providerSelection.js +2 -0
- package/dist/contracts/toolContracts.js +2 -2
- package/dist/contracts/toolEffects.js +14 -0
- package/dist/contracts/toolOutputSchemaGroups.js +232 -0
- package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
- package/dist/contracts/toolOutputSchemas.js +2 -550
- package/dist/domain/analysisErrorPresentation.js +234 -0
- package/dist/domain/analysisErrorProjection.js +284 -0
- package/dist/domain/artifactComparison.js +34 -15
- package/dist/domain/binaryTarget.js +87 -37
- package/dist/domain/browserObservation.js +1 -285
- package/dist/domain/browserObservationSchemas.js +286 -0
- package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
- package/dist/domain/errors.js +4 -486
- package/dist/domain/functionComparison.js +4 -165
- package/dist/domain/functionComparisonDimensions.js +164 -0
- package/dist/domain/javascriptApplicationVersionItems.js +18 -6
- package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
- package/dist/domain/javascriptExportInstrumentation.js +97 -0
- package/dist/domain/javascriptFeatureTraversal.js +19 -7
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
- 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 +5 -221
- package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
- package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
- package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
- package/dist/domain/knownPageCoverage.js +21 -0
- package/dist/domain/managedApplicationGraph.js +14 -364
- 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 +16 -8
- package/dist/domain/managedMemberComparison.js +37 -391
- package/dist/domain/managedMemberComparisonCoverage.js +72 -0
- package/dist/domain/managedMemberComparisonMatch.js +356 -0
- package/dist/domain/managedNativeVerification.js +27 -389
- package/dist/domain/managedNativeVerificationMatch.js +272 -0
- package/dist/domain/managedNativeVerificationSchemas.js +141 -0
- package/dist/domain/managedReconstruction.js +82 -69
- package/dist/domain/managedRuntimeCorrelation.js +12 -3
- 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 +8 -0
- 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 +50 -29
- package/dist/dotnet/ManagedMemberInspector.js +51 -785
- package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
- package/dist/dotnet/ManagedMemberRows.js +120 -0
- package/dist/dotnet/ManagedMetadataInventory.js +42 -306
- package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
- package/dist/dotnet/ManagedMetadataLayout.js +48 -111
- 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 +102 -350
- package/dist/dotnet/ManagedPeReader.js +59 -28
- 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 +61 -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 -146
- 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 +64 -50
- package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
- package/dist/replay/ReplayOutcome.js +95 -0
- package/dist/replay/ReplayProcessLifecycle.js +71 -0
- package/dist/server/ProcessCaptureElicitation.js +157 -0
- package/dist/server/createServer.js +119 -54
- 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 +10 -112
- package/dist/server/registerBrowserTools.js +59 -83
- package/dist/server/registerElectronTools.js +31 -46
- package/dist/server/registerEnhancedTools.js +34 -42
- package/dist/server/registerEvidenceResources.js +54 -0
- package/dist/server/registerInvestigationTools/helpers.js +74 -0
- package/dist/server/registerInvestigationTools/types.js +1 -0
- package/dist/server/registerInvestigationTools.js +83 -116
- 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 +10 -274
- package/dist/server/registerOfficialTools.js +73 -59
- package/dist/server/registerSessionRecordTools.js +137 -0
- package/dist/server/registerSessionStatusTool.js +2 -1
- package/dist/server/registerSessionTools.js +60 -164
- package/dist/server/sessionAvailabilityPolicy.js +10 -0
- package/dist/server/toolRegistrationOptions.js +101 -3
- package/dist/server/toolResult.js +5 -0
- package/package.json +10 -11
- package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +20 -7
- package/scripts/prepare-node-pty.mjs +0 -35
- package/scripts/rebuild-native.mjs +0 -22
|
@@ -1,115 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { traceApplicationFeatureInputSchema } from "../domain/javascriptFeatureTraceSchemas.js";
|
|
7
|
-
import { parseEvidence } from "../domain/evidence.js";
|
|
8
|
-
import { controlledReplayInputSchema, controlledReplayOutputSchema, } from "../domain/javascriptReplay.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 { mcpProgressReporter } from "./mcpProgress.js";
|
|
1
|
+
import { registerTraceFeatureTool } from "./registerApplicationTools/traceFeature.js";
|
|
2
|
+
import { registerCompareApplicationVersionsTool } from "./registerApplicationTools/compareVersions.js";
|
|
3
|
+
import { registerControlledReplayTool } from "./registerApplicationTools/controlledReplay.js";
|
|
4
|
+
import { registerCharacterizationTools } from "./registerApplicationTools/characterization.js";
|
|
5
|
+
import { registerCoverageTools } from "./registerApplicationTools/coverage.js";
|
|
14
6
|
/** Register provider-neutral JavaScript application graph workflows. */
|
|
15
7
|
export const registerApplicationTools = (server, options) => {
|
|
16
|
-
|
|
17
|
-
server
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const parsed = parsedInput.value;
|
|
22
|
-
const result = await logToolExecution(options.logger, traceContract.name, () => Promise.resolve(traceApplicationFeatureEvidenceValidated(parsed)));
|
|
23
|
-
if (!result.ok)
|
|
24
|
-
return toCallToolResult(result, traceContract);
|
|
25
|
-
const sources = [parsed.application, ...parsed.native_observations];
|
|
26
|
-
const recorded = recordSources(options.recordEvidence, sources);
|
|
27
|
-
if (!recorded.ok)
|
|
28
|
-
return toCallToolResult(recorded, traceContract);
|
|
29
|
-
return recordResult(options, traceContract, result.value);
|
|
30
|
-
});
|
|
31
|
-
server.registerTool(compareContract.name, toolRegistrationOptions(compareContract), async (input) => {
|
|
32
|
-
const parsedInput = safeParseToolInput(compareApplicationVersionsInputSchema, input, compareContract.name);
|
|
33
|
-
if (!parsedInput.ok)
|
|
34
|
-
return toCallToolResult(parsedInput, compareContract);
|
|
35
|
-
const parsed = parsedInput.value;
|
|
36
|
-
const result = await logToolExecution(options.logger, compareContract.name, () => Promise.resolve(compareApplicationVersionsEvidenceValidated(parsed)));
|
|
37
|
-
if (!result.ok)
|
|
38
|
-
return toCallToolResult(result, compareContract);
|
|
39
|
-
const sources = [
|
|
40
|
-
parsed.left,
|
|
41
|
-
parsed.right,
|
|
42
|
-
...parsed.left_native_observations,
|
|
43
|
-
...parsed.right_native_observations,
|
|
44
|
-
];
|
|
45
|
-
const recorded = recordSources(options.recordEvidence, sources);
|
|
46
|
-
if (!recorded.ok)
|
|
47
|
-
return toCallToolResult(recorded, compareContract);
|
|
48
|
-
const comparison = applicationVersionComparisonResultSchema.parse(result.value.normalized_result);
|
|
49
|
-
const unknown = comparison.summary.unknown > 0;
|
|
50
|
-
return recordResult(options, compareContract, result.value, parsed.unknown_registry_approved === true && unknown);
|
|
51
|
-
});
|
|
52
|
-
server.registerTool(replayContract.name, toolRegistrationOptions(replayContract), async (input, context) => {
|
|
53
|
-
const parsedInput = safeParseToolInput(controlledReplayInputSchema, input, replayContract.name);
|
|
54
|
-
if (!parsedInput.ok)
|
|
55
|
-
return toCallToolResult(parsedInput, replayContract);
|
|
56
|
-
const parsed = parsedInput.value;
|
|
57
|
-
const result = await logToolExecution(options.logger, replayContract.name, () => runControlledReplayValidated(options.replay, parsed, {
|
|
58
|
-
signal: context.mcpReq.signal,
|
|
59
|
-
progress: mcpProgressReporter(context),
|
|
60
|
-
}));
|
|
61
|
-
if (!result.ok)
|
|
62
|
-
return toCallToolResult(result, replayContract);
|
|
63
|
-
const output = controlledReplayOutputSchema.parse(result.value);
|
|
64
|
-
if (output.evidence !== null) {
|
|
65
|
-
const sourcesRecorded = recordSources(options.recordEvidence, output.source_evidence.map((item) => parseEvidence(item)));
|
|
66
|
-
if (!sourcesRecorded.ok)
|
|
67
|
-
return toCallToolResult(sourcesRecorded, replayContract);
|
|
68
|
-
const recorded = options.recordEvidence?.(parseEvidence(output.evidence));
|
|
69
|
-
if (recorded !== undefined && !recorded.ok)
|
|
70
|
-
return toCallToolResult(recorded, replayContract);
|
|
71
|
-
}
|
|
72
|
-
return toCallToolResult(result, replayContract, {
|
|
73
|
-
evidenceResourcesAvailable: output.evidence !== null && options.recordEvidence !== undefined,
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
};
|
|
77
|
-
const recordSources = (recordEvidence, sources) => {
|
|
78
|
-
for (const source of sources) {
|
|
79
|
-
const recorded = recordEvidence?.(source);
|
|
80
|
-
if (recorded !== undefined && !recorded.ok)
|
|
81
|
-
return recorded;
|
|
82
|
-
}
|
|
83
|
-
return { ok: true, value: null };
|
|
84
|
-
};
|
|
85
|
-
const recordResult = (options, contract, evidence, recordUnknown = false) => {
|
|
86
|
-
const recorded = recordUnknown
|
|
87
|
-
? options.recordEvidenceWithUnknown?.(evidence, {
|
|
88
|
-
approved: true,
|
|
89
|
-
question: "Which application entities remain unmatched or ambiguous across these versions?",
|
|
90
|
-
severity: "medium",
|
|
91
|
-
domain: "application-version-comparison",
|
|
92
|
-
supporting_evidence_ids: [evidence.evidence_id],
|
|
93
|
-
contradicting_evidence_ids: [],
|
|
94
|
-
required_authority: "shipped-artifact",
|
|
95
|
-
required_confidence: "observed",
|
|
96
|
-
required_environment: null,
|
|
97
|
-
recommended_probes: [
|
|
98
|
-
{
|
|
99
|
-
operation: "analyze_javascript_application",
|
|
100
|
-
rationale: "Repeat static reconstruction with complete artifacts and source maps when available.",
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
operation: "reconcile_javascript_runtime",
|
|
104
|
-
rationale: "Add approved passive runtime Evidence without promoting it to static fact.",
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
relationships: [],
|
|
108
|
-
})
|
|
109
|
-
: options.recordEvidence?.(evidence);
|
|
110
|
-
if (recorded !== undefined && !recorded.ok)
|
|
111
|
-
return toCallToolResult(recorded, contract);
|
|
112
|
-
return toCallToolResult({ ok: true, value: evidence }, contract, {
|
|
113
|
-
evidenceResourcesAvailable: recorded !== undefined,
|
|
114
|
-
});
|
|
8
|
+
registerTraceFeatureTool(server, options);
|
|
9
|
+
registerCompareApplicationVersionsTool(server, options);
|
|
10
|
+
registerControlledReplayTool(server, options);
|
|
11
|
+
registerCharacterizationTools(server, options);
|
|
12
|
+
registerCoverageTools(server, options);
|
|
115
13
|
};
|
|
@@ -14,100 +14,76 @@ import { mcpProgressReporter } from "./mcpProgress.js";
|
|
|
14
14
|
/** Register browser tools even when policy/provider availability denies execution. */
|
|
15
15
|
export const registerBrowserTools = (server, options) => {
|
|
16
16
|
const [listContract, inspectContract, analyzeContract, sessionContract, webMcpContract, captureDiffContract, screenshotContract, screenshotDiffContract,] = BROWSER_TOOL_CONTRACTS;
|
|
17
|
-
server
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (!result.ok)
|
|
24
|
-
return toCallToolResult(result, listContract);
|
|
25
|
-
return evidenceResult(options, listContract, result.value);
|
|
17
|
+
registerBrowserTool(server, options, {
|
|
18
|
+
contract: listContract,
|
|
19
|
+
schema: listBrowserTargetsInputSchema,
|
|
20
|
+
execute: (parsed, { signal }) => listBrowserTargets(options.browser, options.permissionAuthority, parsed, {
|
|
21
|
+
signal,
|
|
22
|
+
}),
|
|
26
23
|
});
|
|
27
|
-
server
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
progress: mcpProgressReporter(context),
|
|
35
|
-
}));
|
|
36
|
-
if (!result.ok)
|
|
37
|
-
return toCallToolResult(result, inspectContract);
|
|
38
|
-
return evidenceResult(options, inspectContract, result.value);
|
|
24
|
+
registerBrowserTool(server, options, {
|
|
25
|
+
contract: inspectContract,
|
|
26
|
+
schema: inspectWebPageInputSchema,
|
|
27
|
+
execute: (parsed, { signal, progress }) => inspectWebPage(options.browser, options.permissionAuthority, parsed, {
|
|
28
|
+
signal,
|
|
29
|
+
progress,
|
|
30
|
+
}),
|
|
39
31
|
});
|
|
40
|
-
server
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
progress: mcpProgressReporter(context),
|
|
48
|
-
}));
|
|
49
|
-
if (!result.ok)
|
|
50
|
-
return toCallToolResult(result, analyzeContract);
|
|
51
|
-
return evidenceResult(options, analyzeContract, result.value);
|
|
32
|
+
registerBrowserTool(server, options, {
|
|
33
|
+
contract: analyzeContract,
|
|
34
|
+
schema: analyzeWebBundleInputSchema,
|
|
35
|
+
execute: (parsed, { signal, progress }) => analyzeWebBundle(options.browser, options.permissionAuthority, parsed, {
|
|
36
|
+
signal,
|
|
37
|
+
progress,
|
|
38
|
+
}),
|
|
52
39
|
});
|
|
53
|
-
server
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
progress: mcpProgressReporter(context),
|
|
61
|
-
}));
|
|
62
|
-
if (!result.ok)
|
|
63
|
-
return toCallToolResult(result, sessionContract);
|
|
64
|
-
return evidenceResult(options, sessionContract, result.value);
|
|
40
|
+
registerBrowserTool(server, options, {
|
|
41
|
+
contract: sessionContract,
|
|
42
|
+
schema: observeWebSessionInputSchema,
|
|
43
|
+
execute: (parsed, { signal, progress }) => observeWebSession(options.browser, options.permissionAuthority, parsed, {
|
|
44
|
+
signal,
|
|
45
|
+
progress,
|
|
46
|
+
}),
|
|
65
47
|
});
|
|
66
|
-
server
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
progress: mcpProgressReporter(context),
|
|
74
|
-
}));
|
|
75
|
-
if (!result.ok)
|
|
76
|
-
return toCallToolResult(result, webMcpContract);
|
|
77
|
-
return evidenceResult(options, webMcpContract, result.value);
|
|
48
|
+
registerBrowserTool(server, options, {
|
|
49
|
+
contract: webMcpContract,
|
|
50
|
+
schema: discoverWebMcpToolsInputSchema,
|
|
51
|
+
execute: (parsed, { signal, progress }) => discoverWebMcpTools(options.browser, options.permissionAuthority, parsed, {
|
|
52
|
+
signal,
|
|
53
|
+
progress,
|
|
54
|
+
}),
|
|
78
55
|
});
|
|
79
|
-
server
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
56
|
+
registerBrowserTool(server, options, {
|
|
57
|
+
contract: captureDiffContract,
|
|
58
|
+
schema: compareWebCapturesInputSchema,
|
|
59
|
+
execute: (parsed, _context) => compareWebCaptureEvidence(options.browser, parsed),
|
|
60
|
+
});
|
|
61
|
+
registerBrowserTool(server, options, {
|
|
62
|
+
contract: screenshotContract,
|
|
63
|
+
schema: captureWebScreenshotInputSchema,
|
|
64
|
+
execute: (parsed, { signal, progress }) => captureWebScreenshot(options.browser, options.permissionAuthority, parsed, {
|
|
65
|
+
signal,
|
|
66
|
+
progress,
|
|
67
|
+
}),
|
|
88
68
|
});
|
|
89
|
-
server
|
|
90
|
-
|
|
69
|
+
registerBrowserTool(server, options, {
|
|
70
|
+
contract: screenshotDiffContract,
|
|
71
|
+
schema: compareWebScreenshotsInputSchema,
|
|
72
|
+
execute: (parsed, _context) => compareWebScreenshotEvidence(options.browser, parsed),
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const registerBrowserTool = (server, options, spec) => {
|
|
76
|
+
server.registerTool(spec.contract.name, toolRegistrationOptions(spec.contract), async (input, context) => {
|
|
77
|
+
const parsedInput = safeParseToolInput(spec.schema, input, spec.contract.name);
|
|
91
78
|
if (!parsedInput.ok)
|
|
92
|
-
return toCallToolResult(parsedInput,
|
|
93
|
-
const
|
|
94
|
-
const result = await logToolExecution(options.logger, screenshotContract.name, () => captureWebScreenshot(options.browser, options.permissionAuthority, parsed, {
|
|
79
|
+
return toCallToolResult(parsedInput, spec.contract);
|
|
80
|
+
const result = await logToolExecution(options.logger, spec.contract.name, () => spec.execute(parsedInput.value, {
|
|
95
81
|
signal: context.mcpReq.signal,
|
|
96
82
|
progress: mcpProgressReporter(context),
|
|
97
83
|
}));
|
|
98
84
|
if (!result.ok)
|
|
99
|
-
return toCallToolResult(result,
|
|
100
|
-
return evidenceResult(options,
|
|
101
|
-
});
|
|
102
|
-
server.registerTool(screenshotDiffContract.name, toolRegistrationOptions(screenshotDiffContract), async (input) => {
|
|
103
|
-
const parsedInput = safeParseToolInput(compareWebScreenshotsInputSchema, input, screenshotDiffContract.name);
|
|
104
|
-
if (!parsedInput.ok)
|
|
105
|
-
return toCallToolResult(parsedInput, screenshotDiffContract);
|
|
106
|
-
const parsed = parsedInput.value;
|
|
107
|
-
const result = await logToolExecution(options.logger, screenshotDiffContract.name, () => compareWebScreenshotEvidence(options.browser, parsed));
|
|
108
|
-
if (!result.ok)
|
|
109
|
-
return toCallToolResult(result, screenshotDiffContract);
|
|
110
|
-
return evidenceResult(options, screenshotDiffContract, result.value);
|
|
85
|
+
return toCallToolResult(result, spec.contract);
|
|
86
|
+
return evidenceResult(options, spec.contract, result.value);
|
|
111
87
|
});
|
|
112
88
|
};
|
|
113
89
|
const evidenceResult = (options, contract, evidence) => {
|
|
@@ -13,59 +13,44 @@ import { mcpProgressReporter } from "./mcpProgress.js";
|
|
|
13
13
|
/** Register Electron tools even when provider or permission policy is absent. */
|
|
14
14
|
export const registerElectronTools = (server, options) => {
|
|
15
15
|
const [listContract, inspectContract, analyzeContract, reconcileContract] = ELECTRON_TOOL_CONTRACTS;
|
|
16
|
-
server
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (!result.ok)
|
|
23
|
-
return toCallToolResult(result, listContract);
|
|
24
|
-
return evidenceResult(options, listContract, result.value);
|
|
16
|
+
registerElectronTool(server, options, {
|
|
17
|
+
contract: listContract,
|
|
18
|
+
schema: listElectronTargetsInputSchema,
|
|
19
|
+
execute: (parsed, { signal }) => listElectronTargets(options.electron, options.permissionAuthority, parsed, {
|
|
20
|
+
signal,
|
|
21
|
+
}),
|
|
25
22
|
});
|
|
26
|
-
server
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
progress: mcpProgressReporter(context),
|
|
34
|
-
}));
|
|
35
|
-
if (!result.ok)
|
|
36
|
-
return toCallToolResult(result, inspectContract);
|
|
37
|
-
return evidenceResult(options, inspectContract, result.value);
|
|
23
|
+
registerElectronTool(server, options, {
|
|
24
|
+
contract: inspectContract,
|
|
25
|
+
schema: inspectElectronPageInputSchema,
|
|
26
|
+
execute: (parsed, { signal, progress }) => inspectElectronPage(options.electron, options.permissionAuthority, parsed, {
|
|
27
|
+
signal,
|
|
28
|
+
progress,
|
|
29
|
+
}),
|
|
38
30
|
});
|
|
39
|
-
server
|
|
40
|
-
|
|
31
|
+
registerElectronTool(server, options, {
|
|
32
|
+
contract: analyzeContract,
|
|
33
|
+
schema: analyzeJavaScriptApplicationInputSchema,
|
|
34
|
+
execute: (parsed, { signal, progress }) => analyzeJavaScriptApplicationValidated(options.permissionAuthority, parsed, { signal, progress }),
|
|
35
|
+
});
|
|
36
|
+
registerElectronTool(server, options, {
|
|
37
|
+
contract: reconcileContract,
|
|
38
|
+
schema: reconcileJavaScriptRuntimeInputSchema,
|
|
39
|
+
execute: (parsed, _context) => Promise.resolve(reconcileJavaScriptRuntimeEvidenceValidated(parsed)),
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
const registerElectronTool = (server, options, spec) => {
|
|
43
|
+
server.registerTool(spec.contract.name, toolRegistrationOptions(spec.contract), async (input, context) => {
|
|
44
|
+
const parsedInput = safeParseToolInput(spec.schema, input, spec.contract.name);
|
|
41
45
|
if (!parsedInput.ok)
|
|
42
|
-
return toCallToolResult(parsedInput,
|
|
43
|
-
const
|
|
44
|
-
const result = await logToolExecution(options.logger, analyzeContract.name, () => analyzeJavaScriptApplicationValidated(options.permissionAuthority, parsed, {
|
|
46
|
+
return toCallToolResult(parsedInput, spec.contract);
|
|
47
|
+
const result = await logToolExecution(options.logger, spec.contract.name, () => spec.execute(parsedInput.value, {
|
|
45
48
|
signal: context.mcpReq.signal,
|
|
46
49
|
progress: mcpProgressReporter(context),
|
|
47
50
|
}));
|
|
48
51
|
if (!result.ok)
|
|
49
|
-
return toCallToolResult(result,
|
|
50
|
-
return evidenceResult(options,
|
|
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);
|
|
52
|
+
return toCallToolResult(result, spec.contract);
|
|
53
|
+
return evidenceResult(options, spec.contract, result.value);
|
|
69
54
|
});
|
|
70
55
|
};
|
|
71
56
|
const evidenceResult = (options, contract, evidence) => {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { EnhancedTools, } from "../application/EnhancedTools.js";
|
|
2
|
-
import { enhancedToolNameSchema } from "../contracts/enhancedInputs.js";
|
|
2
|
+
import { enhancedInputSchemas, 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 { enhancedInputSchemas } from "../contracts/enhancedInputs.js";
|
|
8
7
|
import { AnalysisInputError, UnknownRegistryError } from "../domain/errors.js";
|
|
9
8
|
import { ok } from "../domain/result.js";
|
|
10
9
|
import { mcpProgressReporter } from "./mcpProgress.js";
|
|
@@ -83,50 +82,43 @@ const registerEnhancedTool = (server, services, contract, registration) => {
|
|
|
83
82
|
});
|
|
84
83
|
};
|
|
85
84
|
const jsonParameters = (input) => Object.fromEntries(Object.entries(input).filter((entry) => entry[1] !== undefined));
|
|
85
|
+
const ENHANCED_INPUT_PARSERS = {
|
|
86
|
+
swift_classes: (input) => safeParseToolInput(enhancedInputSchemas.swift_classes, input, "swift_classes"),
|
|
87
|
+
get_objc_classes: (input) => safeParseToolInput(enhancedInputSchemas.get_objc_classes, input, "get_objc_classes"),
|
|
88
|
+
get_objc_protocols: (input) => safeParseToolInput(enhancedInputSchemas.get_objc_protocols, input, "get_objc_protocols"),
|
|
89
|
+
batch_decompile: (input) => safeParseToolInput(enhancedInputSchemas.batch_decompile, input, "batch_decompile"),
|
|
90
|
+
get_call_graph: (input) => safeParseToolInput(enhancedInputSchemas.get_call_graph, input, "get_call_graph"),
|
|
91
|
+
analyze_swift_types: (input) => safeParseToolInput(enhancedInputSchemas.analyze_swift_types, input, "analyze_swift_types"),
|
|
92
|
+
find_xrefs_to_name: (input) => safeParseToolInput(enhancedInputSchemas.find_xrefs_to_name, input, "find_xrefs_to_name"),
|
|
93
|
+
binary_overview: (input) => safeParseToolInput(enhancedInputSchemas.binary_overview, input, "binary_overview"),
|
|
94
|
+
analyze_function: (input) => safeParseToolInput(enhancedInputSchemas.analyze_function, input, "analyze_function"),
|
|
95
|
+
trace_feature: (input) => safeParseToolInput(enhancedInputSchemas.trace_feature, input, "trace_feature"),
|
|
96
|
+
};
|
|
86
97
|
const parseEnhancedCall = (name, input) => {
|
|
87
98
|
switch (name) {
|
|
88
|
-
case "swift_classes":
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
case "
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
case "
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
case "
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
case "
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
}
|
|
99
|
+
case "swift_classes":
|
|
100
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.swift_classes(input), (value) => ({ name, input: value }));
|
|
101
|
+
case "get_objc_classes":
|
|
102
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.get_objc_classes(input), (value) => ({ name, input: value }));
|
|
103
|
+
case "get_objc_protocols":
|
|
104
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.get_objc_protocols(input), (value) => ({ name, input: value }));
|
|
105
|
+
case "batch_decompile":
|
|
106
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.batch_decompile(input), (value) => ({ name, input: value }));
|
|
107
|
+
case "get_call_graph":
|
|
108
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.get_call_graph(input), (value) => ({ name, input: value }));
|
|
109
|
+
case "analyze_swift_types":
|
|
110
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.analyze_swift_types(input), (value) => ({ name, input: value }));
|
|
111
|
+
case "find_xrefs_to_name":
|
|
112
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.find_xrefs_to_name(input), (value) => ({ name, input: value }));
|
|
113
|
+
case "binary_overview":
|
|
114
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.binary_overview(input), (value) => ({ name, input: value }));
|
|
115
|
+
case "analyze_function":
|
|
116
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.analyze_function(input), (value) => ({ name, input: value }));
|
|
117
|
+
case "trace_feature":
|
|
118
|
+
return mapEnhancedCall(ENHANCED_INPUT_PARSERS.trace_feature(input), (value) => ({ name, input: value }));
|
|
128
119
|
}
|
|
129
120
|
};
|
|
121
|
+
const mapEnhancedCall = (parsed, project) => parsed.ok ? ok(project(parsed.value)) : parsed;
|
|
130
122
|
const recordWorkflowUnknowns = ({ name, input, result, evidenceId, recordUnknown, }) => {
|
|
131
123
|
if (name !== "trace_feature" ||
|
|
132
124
|
input.unknown_registry_approved !== true ||
|
|
@@ -4,6 +4,45 @@ import canonicalize from "canonicalize";
|
|
|
4
4
|
const evidenceUri = (evidenceId) => `rea://evidence/${evidenceId}`;
|
|
5
5
|
/** Expose immutable session-owned Evidence v2 records as MCP resources. */
|
|
6
6
|
export const registerEvidenceResources = (server, session) => {
|
|
7
|
+
registerReconstructionCoverageResource(server, session);
|
|
8
|
+
registerInvestigationWorkspaceResource(server, session);
|
|
9
|
+
registerSessionEvidenceResource(server, session);
|
|
10
|
+
registerActiveResidualUnknownsResource(server, session);
|
|
11
|
+
registerAnalysisSnapshotResource(server, session);
|
|
12
|
+
registerArtifactPageResource(server, session);
|
|
13
|
+
registerFunctionDossierResource(server, session);
|
|
14
|
+
registerEvidenceSectionResource(server, session);
|
|
15
|
+
registerResidualUnknownResource(server, session);
|
|
16
|
+
};
|
|
17
|
+
const registerReconstructionCoverageResource = (server, session) => {
|
|
18
|
+
server.registerResource("reconstruction-coverage-revision", new ResourceTemplate("rea://reconstruction-coverage/{workspaceId}/revision/{revision}", {
|
|
19
|
+
list: () => ({
|
|
20
|
+
resources: session
|
|
21
|
+
.reconstructionCoverageWorkspaces()
|
|
22
|
+
.map((workspace) => ({
|
|
23
|
+
uri: coverageWorkspaceUri(workspace.workspace_id, workspace.revision),
|
|
24
|
+
name: `${workspace.workspace_id} revision ${String(workspace.revision)}`,
|
|
25
|
+
title: `${workspace.name} coverage revision ${String(workspace.revision)}`,
|
|
26
|
+
description: "Immutable evidence-backed reconstruction coverage workspace revision.",
|
|
27
|
+
mimeType: "application/json",
|
|
28
|
+
})),
|
|
29
|
+
}),
|
|
30
|
+
}), {
|
|
31
|
+
title: "Reconstruction coverage revision",
|
|
32
|
+
description: "Canonical CAS-linked surfaces, owners, claims, verifiers, evidence, and completion boundaries.",
|
|
33
|
+
mimeType: "application/json",
|
|
34
|
+
}, (uri, variables) => {
|
|
35
|
+
const workspaceId = stringVariable(variables.workspaceId, uri.href);
|
|
36
|
+
const revisionText = stringVariable(variables.revision, uri.href);
|
|
37
|
+
if (!/^\d+$/u.test(revisionText))
|
|
38
|
+
throw new ResourceNotFoundError(uri.href);
|
|
39
|
+
const workspace = session.reconstructionCoverageWorkspace(workspaceId, Number(revisionText));
|
|
40
|
+
if (workspace === undefined)
|
|
41
|
+
throw new ResourceNotFoundError(uri.href);
|
|
42
|
+
return jsonResource(uri.href, workspace);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const registerInvestigationWorkspaceResource = (server, session) => {
|
|
7
46
|
server.registerResource("investigation-workspace-revision", new ResourceTemplate("rea://workspace/{workspaceId}/revision/{revision}", {
|
|
8
47
|
list: () => ({
|
|
9
48
|
resources: session.investigationWorkspaces().map((workspace) => ({
|
|
@@ -40,6 +79,8 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
40
79
|
throw new ResourceNotFoundError(uri.href);
|
|
41
80
|
return jsonResource(uri.href, workspace);
|
|
42
81
|
});
|
|
82
|
+
};
|
|
83
|
+
const registerSessionEvidenceResource = (server, session) => {
|
|
43
84
|
server.registerResource("session-evidence", new ResourceTemplate("rea://evidence/{evidenceId}", {
|
|
44
85
|
list: () => ({
|
|
45
86
|
resources: session.exportEvidenceBundle().records.map((evidence) => ({
|
|
@@ -77,11 +118,15 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
77
118
|
],
|
|
78
119
|
};
|
|
79
120
|
});
|
|
121
|
+
};
|
|
122
|
+
const registerActiveResidualUnknownsResource = (server, session) => {
|
|
80
123
|
server.registerResource("active-residual-unknowns", "rea://unknowns/active", {
|
|
81
124
|
title: "Active residual unknowns",
|
|
82
125
|
description: "Current unresolved session-owned residual unknown heads.",
|
|
83
126
|
mimeType: "application/json",
|
|
84
127
|
}, (uri) => jsonResource(uri.href, session.listUnknowns().filter(({ status }) => status !== "resolved")));
|
|
128
|
+
};
|
|
129
|
+
const registerAnalysisSnapshotResource = (server, session) => {
|
|
85
130
|
server.registerResource("analysis-snapshot", new ResourceTemplate("rea://snapshot/{snapshotDigest}", {
|
|
86
131
|
list: () => {
|
|
87
132
|
const snapshot = session.exportAnalysisSnapshot();
|
|
@@ -111,6 +156,8 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
111
156
|
throw new ResourceNotFoundError(uri.href);
|
|
112
157
|
return jsonResource(uri.href, snapshot.value);
|
|
113
158
|
});
|
|
159
|
+
};
|
|
160
|
+
const registerArtifactPageResource = (server, session) => {
|
|
114
161
|
server.registerResource("artifact-page", new ResourceTemplate("rea://artifact/{manifestId}/{collection}", {
|
|
115
162
|
list: undefined,
|
|
116
163
|
complete: {
|
|
@@ -143,6 +190,8 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
143
190
|
limitations: evidence.limitations,
|
|
144
191
|
});
|
|
145
192
|
});
|
|
193
|
+
};
|
|
194
|
+
const registerFunctionDossierResource = (server, session) => {
|
|
146
195
|
server.registerResource("function-dossier", new ResourceTemplate("rea://function/{targetSha256}/{address}", {
|
|
147
196
|
list: undefined,
|
|
148
197
|
}), {
|
|
@@ -161,6 +210,8 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
161
210
|
throw new ResourceNotFoundError(uri.href);
|
|
162
211
|
return jsonResource(uri.href, evidence);
|
|
163
212
|
});
|
|
213
|
+
};
|
|
214
|
+
const registerEvidenceSectionResource = (server, session) => {
|
|
164
215
|
server.registerResource("evidence-section", new ResourceTemplate("rea://evidence/{evidenceId}/section/{section}", {
|
|
165
216
|
list: undefined,
|
|
166
217
|
complete: {
|
|
@@ -191,6 +242,8 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
191
242
|
value,
|
|
192
243
|
});
|
|
193
244
|
});
|
|
245
|
+
};
|
|
246
|
+
const registerResidualUnknownResource = (server, session) => {
|
|
194
247
|
server.registerResource("residual-unknown", new ResourceTemplate("rea://unknown/{unknownId}", {
|
|
195
248
|
list: () => ({
|
|
196
249
|
resources: session.listUnknowns().map((unknown) => ({
|
|
@@ -224,6 +277,7 @@ export const registerEvidenceResources = (server, session) => {
|
|
|
224
277
|
return jsonResource(uri.href, { current: unknown, history });
|
|
225
278
|
});
|
|
226
279
|
};
|
|
280
|
+
const coverageWorkspaceUri = (workspaceId, revision) => `rea://reconstruction-coverage/${workspaceId}/revision/${String(revision)}`;
|
|
227
281
|
const workspaceUri = (workspaceId, revision) => `rea://workspace/${workspaceId}/revision/${String(revision)}`;
|
|
228
282
|
const EVIDENCE_SECTIONS = [
|
|
229
283
|
"result",
|