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.
Files changed (246) hide show
  1. package/README.md +78 -32
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/ArtifactExtraction.js +1 -1
  4. package/dist/application/ArtifactInventory/classify.js +42 -0
  5. package/dist/application/ArtifactInventory/hash.js +43 -0
  6. package/dist/application/ArtifactInventory/reader.js +41 -0
  7. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  8. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  9. package/dist/application/ArtifactInventory/types.js +10 -0
  10. package/dist/application/ArtifactInventory.js +9 -351
  11. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  12. package/dist/application/BinarySession.js +47 -270
  13. package/dist/application/BinarySessionExecution.js +28 -0
  14. package/dist/application/BinarySessionOpen.js +39 -0
  15. package/dist/application/BinarySessionRecords.js +149 -0
  16. package/dist/application/BinarySessionStatus.js +75 -0
  17. package/dist/application/CapabilityInventory.js +24 -2
  18. package/dist/application/ClientRegistrationStatus.js +1 -1
  19. package/dist/application/CrossVersionInventory.js +8 -2
  20. package/dist/application/CrossVersionInvestigation.js +1 -23
  21. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  22. package/dist/application/DirectAnalysis.js +47 -44
  23. package/dist/application/Doctor.js +156 -238
  24. package/dist/application/DoctorDiagnostics.js +180 -0
  25. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  26. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  27. package/dist/application/EnhancedToolPagination.js +22 -0
  28. package/dist/application/EnhancedToolTypes.js +4 -0
  29. package/dist/application/EnhancedTools.js +20 -37
  30. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  31. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  32. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  33. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  34. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  35. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  36. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  37. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  38. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  39. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  40. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  41. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  42. package/dist/application/JavaScriptJsonModules.js +39 -0
  43. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  44. package/dist/application/JavaScriptReplayPermission.js +16 -0
  45. package/dist/application/JavaScriptReplayService.js +182 -156
  46. package/dist/application/LinuxHopper.js +10 -0
  47. package/dist/application/MacHopper.js +22 -11
  48. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  49. package/dist/application/PermissionAuthority.js +106 -63
  50. package/dist/application/ProcessCaptureCapability.js +1 -1
  51. package/dist/application/ProcessCapturePermission.js +13 -0
  52. package/dist/application/ProcessCli.js +2 -12
  53. package/dist/application/ProcessHarness.js +1 -1
  54. package/dist/application/ProjectPermissionStore.js +48 -9
  55. package/dist/application/RealHopperAssertions.js +76 -0
  56. package/dist/application/ReconstructionCoverageService.js +69 -0
  57. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  58. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  59. package/dist/application/Setup.js +147 -259
  60. package/dist/application/SetupClientConfiguration.js +220 -0
  61. package/dist/application/SetupClients.js +24 -2
  62. package/dist/application/SetupPlan.js +123 -12
  63. package/dist/application/SetupSkill.js +26 -12
  64. package/dist/application/SupportedClients.js +1 -0
  65. package/dist/application/Uninstall.js +6 -3
  66. package/dist/application/WindowsCapabilities.js +86 -0
  67. package/dist/artifacts/AsarArtifactReader.js +11 -0
  68. package/dist/browser/BrowserProcessStartup.js +88 -0
  69. package/dist/browser/CdpCaptureDocuments.js +12 -8
  70. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  71. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  72. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  73. package/dist/browser/CdpCaptureEventState.js +1 -0
  74. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  75. package/dist/browser/CdpCaptureEvents.js +29 -496
  76. package/dist/browser/CdpObservationSession.js +51 -8
  77. package/dist/browser/CdpPageCapture.js +12 -133
  78. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  79. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  80. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  81. package/dist/browser/PngVisualDiff.js +9 -2
  82. package/dist/catalogIdentity.js +4 -0
  83. package/dist/cli/artifactCommands.js +82 -0
  84. package/dist/cli/coreAnalysisCommands.js +232 -0
  85. package/dist/cli/managedCommands.js +397 -0
  86. package/dist/cli/managedProjectGraphCommand.js +24 -0
  87. package/dist/cli/options.js +9 -0
  88. package/dist/cli/setupCommands.js +108 -0
  89. package/dist/cli/types.js +1 -0
  90. package/dist/cli/utilityCommands.js +122 -0
  91. package/dist/cli.js +10 -768
  92. package/dist/cliApplicationCommands.js +118 -4
  93. package/dist/cliBrowserAdvancedCommands.js +73 -16
  94. package/dist/cliBrowserCommands.js +39 -115
  95. package/dist/cliCommandNames.js +4 -0
  96. package/dist/cliElectronCommands.js +33 -62
  97. package/dist/cliEvidenceCommands.js +13 -2
  98. package/dist/cliInvestigationCommands.js +53 -10
  99. package/dist/cliObservationOptions.js +137 -0
  100. package/dist/cliPolicyCommands.js +80 -46
  101. package/dist/cliSetup.js +289 -0
  102. package/dist/config/environment.js +107 -0
  103. package/dist/config/parseConfig.js +228 -0
  104. package/dist/config/parsers.js +68 -0
  105. package/dist/config/permissions.js +30 -0
  106. package/dist/config/types.js +1 -0
  107. package/dist/config.js +1 -375
  108. package/dist/contracts/applicationToolContracts.js +134 -0
  109. package/dist/contracts/managedToolContracts.js +1 -1
  110. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  111. package/dist/contracts/providerSelection.js +2 -0
  112. package/dist/contracts/toolContracts.js +2 -2
  113. package/dist/contracts/toolEffects.js +14 -0
  114. package/dist/contracts/toolOutputSchemaGroups.js +232 -0
  115. package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
  116. package/dist/contracts/toolOutputSchemas.js +2 -550
  117. package/dist/domain/analysisErrorPresentation.js +234 -0
  118. package/dist/domain/analysisErrorProjection.js +284 -0
  119. package/dist/domain/artifactComparison.js +34 -15
  120. package/dist/domain/binaryTarget.js +87 -37
  121. package/dist/domain/browserObservation.js +1 -285
  122. package/dist/domain/browserObservationSchemas.js +286 -0
  123. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  124. package/dist/domain/errors.js +4 -486
  125. package/dist/domain/functionComparison.js +4 -165
  126. package/dist/domain/functionComparisonDimensions.js +164 -0
  127. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  128. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  129. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  130. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  131. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  132. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  133. package/dist/domain/javascriptSemanticIr.js +30 -0
  134. package/dist/domain/javascriptSemanticProjection.js +366 -0
  135. package/dist/domain/javascriptSemanticState.js +40 -0
  136. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  137. package/dist/domain/javascriptSemanticValues.js +352 -0
  138. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  139. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  140. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  141. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  142. package/dist/domain/knownPageCoverage.js +21 -0
  143. package/dist/domain/managedApplicationGraph.js +14 -364
  144. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  145. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  146. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  147. package/dist/domain/managedArtifact.js +16 -8
  148. package/dist/domain/managedMemberComparison.js +37 -391
  149. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  150. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  151. package/dist/domain/managedNativeVerification.js +27 -389
  152. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  153. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  154. package/dist/domain/managedReconstruction.js +82 -69
  155. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  156. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  157. package/dist/domain/permissionPolicy.js +2 -0
  158. package/dist/domain/reconstructionCoverage.js +387 -0
  159. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  160. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  161. package/dist/domain/runtimeCharacterization.js +85 -0
  162. package/dist/domain/webBundleAnalyzer.js +3 -409
  163. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  164. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  165. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  166. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  167. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  168. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  169. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  170. package/dist/dotnet/ManagedMemberRows.js +120 -0
  171. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  172. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  173. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  174. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  175. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  176. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  177. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  178. package/dist/dotnet/ManagedPeReader.js +59 -28
  179. package/dist/generatedPackageMetadata.js +2 -2
  180. package/dist/ghidra/GhidraClient.js +76 -91
  181. package/dist/ghidra/GhidraClientStartup.js +29 -0
  182. package/dist/ghidra/GhidraClientWire.js +34 -0
  183. package/dist/ghidra/GhidraDefaults.js +1 -1
  184. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  185. package/dist/ghidra/GhidraInstallation.js +20 -15
  186. package/dist/ghidra/GhidraLauncher.js +93 -29
  187. package/dist/ghidra/GhidraProvider.js +61 -161
  188. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  189. package/dist/ghidra/GhidraSessionValues.js +2 -0
  190. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  191. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  192. package/dist/ghidra/GhidraTransport.js +71 -0
  193. package/dist/identity.js +3 -2
  194. package/dist/main/messages.js +5 -0
  195. package/dist/main/reload.js +49 -0
  196. package/dist/main/shutdown.js +25 -0
  197. package/dist/main/startup.js +14 -0
  198. package/dist/main/state.js +26 -0
  199. package/dist/main/transport.js +61 -0
  200. package/dist/main/types.js +1 -0
  201. package/dist/main.js +35 -146
  202. package/dist/process/PrivateRuntimeRoot.js +3 -2
  203. package/dist/process/ProcessOwnership.js +35 -0
  204. package/dist/process/ProviderProcess.js +2 -0
  205. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  206. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  207. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  208. package/dist/replay/ReplayOutcome.js +95 -0
  209. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  210. package/dist/server/ProcessCaptureElicitation.js +157 -0
  211. package/dist/server/createServer.js +119 -54
  212. package/dist/server/registerApplicationTools/characterization.js +57 -0
  213. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  214. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  215. package/dist/server/registerApplicationTools/coverage.js +84 -0
  216. package/dist/server/registerApplicationTools/helpers.js +42 -0
  217. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  218. package/dist/server/registerApplicationTools/types.js +1 -0
  219. package/dist/server/registerApplicationTools.js +10 -112
  220. package/dist/server/registerBrowserTools.js +59 -83
  221. package/dist/server/registerElectronTools.js +31 -46
  222. package/dist/server/registerEnhancedTools.js +34 -42
  223. package/dist/server/registerEvidenceResources.js +54 -0
  224. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  225. package/dist/server/registerInvestigationTools/types.js +1 -0
  226. package/dist/server/registerInvestigationTools.js +83 -116
  227. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  228. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  229. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  230. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  231. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  232. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  233. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  234. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  235. package/dist/server/registerManagedWorkflowTools.js +10 -274
  236. package/dist/server/registerOfficialTools.js +73 -59
  237. package/dist/server/registerSessionRecordTools.js +137 -0
  238. package/dist/server/registerSessionStatusTool.js +2 -1
  239. package/dist/server/registerSessionTools.js +60 -164
  240. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  241. package/dist/server/toolRegistrationOptions.js +101 -3
  242. package/dist/server/toolResult.js +5 -0
  243. package/package.json +10 -11
  244. package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +20 -7
  245. package/scripts/prepare-node-pty.mjs +0 -35
  246. package/scripts/rebuild-native.mjs +0 -22
@@ -1,115 +1,13 @@
1
- import { compareApplicationVersionsEvidenceValidated, traceApplicationFeatureEvidenceValidated, } from "../application/JavaScriptApplicationWorkflowService.js";
2
- import { runControlledReplayValidated, } from "../application/JavaScriptReplayService.js";
3
- import { APPLICATION_TOOL_CONTRACTS } from "../contracts/applicationToolContracts.js";
4
- import { compareApplicationVersionsInputSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
5
- import { applicationVersionComparisonResultSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
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
- const [traceContract, compareContract, replayContract] = APPLICATION_TOOL_CONTRACTS;
17
- server.registerTool(traceContract.name, toolRegistrationOptions(traceContract), async (input) => {
18
- const parsedInput = safeParseToolInput(traceApplicationFeatureInputSchema, input, traceContract.name);
19
- if (!parsedInput.ok)
20
- return toCallToolResult(parsedInput, traceContract);
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.registerTool(listContract.name, toolRegistrationOptions(listContract), async (input, context) => {
18
- const parsedInput = safeParseToolInput(listBrowserTargetsInputSchema, input, listContract.name);
19
- if (!parsedInput.ok)
20
- return toCallToolResult(parsedInput, listContract);
21
- const parsed = parsedInput.value;
22
- const result = await logToolExecution(options.logger, listContract.name, () => listBrowserTargets(options.browser, options.permissionAuthority, parsed, { signal: context.mcpReq.signal }));
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.registerTool(inspectContract.name, toolRegistrationOptions(inspectContract), async (input, context) => {
28
- const parsedInput = safeParseToolInput(inspectWebPageInputSchema, input, inspectContract.name);
29
- if (!parsedInput.ok)
30
- return toCallToolResult(parsedInput, inspectContract);
31
- const parsed = parsedInput.value;
32
- const result = await logToolExecution(options.logger, inspectContract.name, () => inspectWebPage(options.browser, options.permissionAuthority, parsed, {
33
- signal: context.mcpReq.signal,
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.registerTool(analyzeContract.name, toolRegistrationOptions(analyzeContract), async (input, context) => {
41
- const parsedInput = safeParseToolInput(analyzeWebBundleInputSchema, input, analyzeContract.name);
42
- if (!parsedInput.ok)
43
- return toCallToolResult(parsedInput, analyzeContract);
44
- const parsed = parsedInput.value;
45
- const result = await logToolExecution(options.logger, analyzeContract.name, () => analyzeWebBundle(options.browser, options.permissionAuthority, parsed, {
46
- signal: context.mcpReq.signal,
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.registerTool(sessionContract.name, toolRegistrationOptions(sessionContract), async (input, context) => {
54
- const parsedInput = safeParseToolInput(observeWebSessionInputSchema, input, sessionContract.name);
55
- if (!parsedInput.ok)
56
- return toCallToolResult(parsedInput, sessionContract);
57
- const parsed = parsedInput.value;
58
- const result = await logToolExecution(options.logger, sessionContract.name, () => observeWebSession(options.browser, options.permissionAuthority, parsed, {
59
- signal: context.mcpReq.signal,
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.registerTool(webMcpContract.name, toolRegistrationOptions(webMcpContract), async (input, context) => {
67
- const parsedInput = safeParseToolInput(discoverWebMcpToolsInputSchema, input, webMcpContract.name);
68
- if (!parsedInput.ok)
69
- return toCallToolResult(parsedInput, webMcpContract);
70
- const parsed = parsedInput.value;
71
- const result = await logToolExecution(options.logger, webMcpContract.name, () => discoverWebMcpTools(options.browser, options.permissionAuthority, parsed, {
72
- signal: context.mcpReq.signal,
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.registerTool(captureDiffContract.name, toolRegistrationOptions(captureDiffContract), async (input) => {
80
- const parsedInput = safeParseToolInput(compareWebCapturesInputSchema, input, captureDiffContract.name);
81
- if (!parsedInput.ok)
82
- return toCallToolResult(parsedInput, captureDiffContract);
83
- const parsed = parsedInput.value;
84
- const result = await logToolExecution(options.logger, captureDiffContract.name, () => compareWebCaptureEvidence(options.browser, parsed));
85
- if (!result.ok)
86
- return toCallToolResult(result, captureDiffContract);
87
- return evidenceResult(options, captureDiffContract, result.value);
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.registerTool(screenshotContract.name, toolRegistrationOptions(screenshotContract), async (input, context) => {
90
- const parsedInput = safeParseToolInput(captureWebScreenshotInputSchema, input, screenshotContract.name);
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, screenshotContract);
93
- const parsed = parsedInput.value;
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, screenshotContract);
100
- return evidenceResult(options, screenshotContract, result.value);
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.registerTool(listContract.name, toolRegistrationOptions(listContract), async (input, context) => {
17
- const parsedInput = safeParseToolInput(listElectronTargetsInputSchema, input, listContract.name);
18
- if (!parsedInput.ok)
19
- return toCallToolResult(parsedInput, listContract);
20
- const parsed = parsedInput.value;
21
- const result = await logToolExecution(options.logger, listContract.name, () => listElectronTargets(options.electron, options.permissionAuthority, parsed, { signal: context.mcpReq.signal }));
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.registerTool(inspectContract.name, toolRegistrationOptions(inspectContract), async (input, context) => {
27
- const parsedInput = safeParseToolInput(inspectElectronPageInputSchema, input, inspectContract.name);
28
- if (!parsedInput.ok)
29
- return toCallToolResult(parsedInput, inspectContract);
30
- const parsed = parsedInput.value;
31
- const result = await logToolExecution(options.logger, inspectContract.name, () => inspectElectronPage(options.electron, options.permissionAuthority, parsed, {
32
- signal: context.mcpReq.signal,
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.registerTool(analyzeContract.name, toolRegistrationOptions(analyzeContract), async (input, context) => {
40
- const parsedInput = safeParseToolInput(analyzeJavaScriptApplicationInputSchema, input, analyzeContract.name);
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, analyzeContract);
43
- const parsed = parsedInput.value;
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, 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);
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
- 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
- }
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",