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,277 +1,13 @@
1
- import { compareManagedMembersEvidenceValidated } from "../application/ManagedMemberComparisonService.js";
2
- import { projectManagedApplicationGraphEvidence } from "../application/ManagedApplicationGraphService.js";
3
- import { verifyManagedNativeBoundariesEvidence } from "../application/ManagedNativeVerificationService.js";
4
- import { importManagedReconstructionEvidenceValidated } from "../application/ManagedReconstructionService.js";
5
- import { planManagedRuntimeCorrelationEvidenceValidated, } from "../application/ManagedRuntimeCorrelationService.js";
6
- import { compareManagedMembersReferenceInputSchema, managedApplicationGraphReferenceInputSchema, managedNativeVerificationReferenceInputSchema, managedReconstructionReferenceInputSchema, managedRuntimeCorrelationReferenceInputSchema, MANAGED_WORKFLOW_TOOL_CONTRACTS, } from "../contracts/managedWorkflowToolContracts.js";
7
- import { managedMemberComparisonResultSchema } from "../domain/managedMemberComparison.js";
8
- import { managedNativeVerificationResultSchema } from "../domain/managedNativeVerification.js";
9
- import { logToolExecution } from "./toolLogging.js";
10
- import { toCallToolResult } from "./toolResult.js";
11
- import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
12
- import { safeParseToolInput } from "./toolInputValidation.js";
13
- import { resolveSessionEvidenceIds } from "./sessionEvidence.js";
1
+ import { registerCompareManagedMembers } from "./registerManagedWorkflowTools/compareManagedMembers.js";
2
+ import { registerVerifyManagedNativeBoundaries } from "./registerManagedWorkflowTools/verifyManagedNativeBoundaries.js";
3
+ import { registerImportManagedReconstruction } from "./registerManagedWorkflowTools/importManagedReconstruction.js";
4
+ import { registerPlanManagedRuntimeCorrelation } from "./registerManagedWorkflowTools/planManagedRuntimeCorrelation.js";
5
+ import { registerProjectManagedApplicationGraph } from "./registerManagedWorkflowTools/projectManagedApplicationGraph.js";
14
6
  /** Register provider-neutral managed-code workflows. */
15
7
  export const registerManagedWorkflowTools = (server, options) => {
16
- const compareContract = contract("compare_managed_members");
17
- const nativeVerificationContract = contract("verify_managed_native_boundaries");
18
- const reconstructionContract = contract("import_managed_reconstruction");
19
- const runtimeContract = contract("plan_managed_runtime_correlation");
20
- const graphContract = contract("project_managed_application_graph");
21
- server.registerTool(compareContract.name, toolRegistrationOptions(compareContract), async (input) => {
22
- const parsedInput = safeParseToolInput(compareManagedMembersReferenceInputSchema, input, compareContract.name);
23
- if (!parsedInput.ok)
24
- return toCallToolResult(parsedInput, compareContract);
25
- const resolved = resolveManagedEvidence(options.session, [
26
- parsedInput.value.left_evidence_id,
27
- parsedInput.value.right_evidence_id,
28
- ]);
29
- if (!resolved.ok)
30
- return toCallToolResult(resolved, compareContract);
31
- const [left, right] = resolved.value;
32
- if (left === undefined || right === undefined)
33
- throw new TypeError("Managed comparison Evidence resolution failed");
34
- const { left_evidence_id: _leftEvidenceId, right_evidence_id: _rightEvidenceId, ...referencedInput } = parsedInput.value;
35
- const parsed = { ...referencedInput, left, right };
36
- const result = await logToolExecution(options.logger, compareContract.name, () => Promise.resolve(compareManagedMembersEvidenceValidated(parsed)));
37
- if (!result.ok)
38
- return toCallToolResult(result, compareContract);
39
- const recorded = recordSources(options.recordEvidence, [
40
- parsed.left,
41
- parsed.right,
42
- ]);
43
- if (!recorded.ok)
44
- return toCallToolResult(recorded, compareContract);
45
- const comparison = managedMemberComparisonResultSchema.parse(result.value.normalized_result);
46
- const unknown = comparison.summary.unknown > 0;
47
- const output = parsed.unknown_registry_approved === true && unknown
48
- ? options.recordEvidenceWithUnknown?.(result.value, {
49
- approved: true,
50
- question: "Which managed members remain unmatched or ambiguous across these versions?",
51
- severity: "medium",
52
- domain: "managed-member-comparison",
53
- supporting_evidence_ids: [result.value.evidence_id],
54
- contradicting_evidence_ids: [],
55
- required_authority: "shipped-artifact",
56
- required_confidence: "observed",
57
- required_environment: null,
58
- recommended_probes: [
59
- {
60
- operation: "inspect_managed_members",
61
- rationale: "Repeat static member inspection with complete pages and method bodies.",
62
- },
63
- ],
64
- relationships: [],
65
- })
66
- : options.recordEvidence?.(result.value);
67
- if (output !== undefined && !output.ok)
68
- return toCallToolResult(output, compareContract);
69
- return toCallToolResult({ ok: true, value: result.value }, compareContract, {
70
- evidenceResourcesAvailable: output !== undefined,
71
- });
72
- });
73
- server.registerTool(nativeVerificationContract.name, toolRegistrationOptions(nativeVerificationContract), async (input) => {
74
- const parsedInput = safeParseToolInput(managedNativeVerificationReferenceInputSchema, input, nativeVerificationContract.name);
75
- if (!parsedInput.ok)
76
- return toCallToolResult(parsedInput, nativeVerificationContract);
77
- const managedBoundaries = resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_boundaries_evidence_id);
78
- if (!managedBoundaries.ok)
79
- return toCallToolResult(managedBoundaries, nativeVerificationContract);
80
- const nativeObservations = resolveNativeEvidence(options.session, parsedInput.value.native_observation_evidence_ids);
81
- if (!nativeObservations.ok)
82
- return toCallToolResult(nativeObservations, nativeVerificationContract);
83
- const managedBoundary = managedBoundaries.value[0];
84
- if (managedBoundary === undefined)
85
- throw new TypeError("Managed boundary Evidence resolution failed");
86
- const { managed_boundaries_evidence_id: _managedBoundariesEvidenceId, native_observation_evidence_ids: _nativeObservationEvidenceIds, ...referencedInput } = parsedInput.value;
87
- const parsed = {
88
- ...referencedInput,
89
- managed_boundaries: managedBoundary,
90
- native_observations: nativeObservations.value,
91
- };
92
- const result = await logToolExecution(options.logger, nativeVerificationContract.name, () => Promise.resolve(verifyManagedNativeBoundariesEvidence(parsed)));
93
- if (!result.ok)
94
- return toCallToolResult(result, nativeVerificationContract);
95
- const recordedSources = recordSources(options.recordEvidence, [
96
- parsed.managed_boundaries,
97
- ...parsed.native_observations,
98
- ]);
99
- if (!recordedSources.ok)
100
- return toCallToolResult(recordedSources, nativeVerificationContract);
101
- const verification = managedNativeVerificationResultSchema.parse(result.value.normalized_result);
102
- const unknown = verification.summary.unresolved > 0 ||
103
- verification.summary.contradicted > 0 ||
104
- verification.summary.native_body_unresolved > 0;
105
- const output = parsed.unknown_registry_approved === true && unknown
106
- ? options.recordEvidenceWithUnknown?.(result.value, {
107
- approved: true,
108
- question: "Which managed/native boundaries remain unresolved or contradicted by the supplied native Evidence?",
109
- severity: "medium",
110
- domain: "managed-native-verification",
111
- supporting_evidence_ids: [result.value.evidence_id],
112
- contradicting_evidence_ids: [],
113
- required_authority: "shipped-artifact",
114
- required_confidence: "observed",
115
- required_environment: null,
116
- recommended_probes: [
117
- {
118
- operation: "inspect_managed_native_boundaries",
119
- rationale: "Repeat managed boundary inspection with complete ModuleRef, ImplMap, and native implementation pages.",
120
- },
121
- {
122
- operation: "analyze_function",
123
- rationale: "Analyze the provider-resolved native function candidate for the declared export.",
124
- },
125
- ],
126
- relationships: [],
127
- })
128
- : options.recordEvidence?.(result.value);
129
- if (output !== undefined && !output.ok)
130
- return toCallToolResult(output, nativeVerificationContract);
131
- return toCallToolResult(result, nativeVerificationContract, {
132
- evidenceResourcesAvailable: output !== undefined,
133
- });
134
- });
135
- server.registerTool(reconstructionContract.name, toolRegistrationOptions(reconstructionContract), async (input) => {
136
- const parsedInput = safeParseToolInput(managedReconstructionReferenceInputSchema, input, reconstructionContract.name);
137
- if (!parsedInput.ok)
138
- return toCallToolResult(parsedInput, reconstructionContract);
139
- const resolved = resolveManagedEvidence(options.session, [
140
- parsedInput.value.static_members_evidence_id,
141
- ]);
142
- if (!resolved.ok)
143
- return toCallToolResult(resolved, reconstructionContract);
144
- const staticMembers = resolved.value[0];
145
- if (staticMembers === undefined)
146
- throw new TypeError("Managed reconstruction Evidence resolution failed");
147
- const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
148
- const parsed = { ...referencedInput, static_members: staticMembers };
149
- const result = await logToolExecution(options.logger, reconstructionContract.name, () => Promise.resolve(importManagedReconstructionEvidenceValidated(parsed)));
150
- if (!result.ok)
151
- return toCallToolResult(result, reconstructionContract);
152
- const recordedSource = options.recordEvidence?.(parsed.static_members);
153
- if (recordedSource !== undefined && !recordedSource.ok)
154
- return toCallToolResult(recordedSource, reconstructionContract);
155
- const recorded = options.recordEvidence?.(result.value);
156
- if (recorded !== undefined && !recorded.ok)
157
- return toCallToolResult(recorded, reconstructionContract);
158
- return toCallToolResult(result, reconstructionContract, {
159
- evidenceResourcesAvailable: recorded !== undefined,
160
- });
161
- });
162
- server.registerTool(runtimeContract.name, toolRegistrationOptions(runtimeContract), async (input) => {
163
- const parsedInput = safeParseToolInput(managedRuntimeCorrelationReferenceInputSchema, input, runtimeContract.name);
164
- if (!parsedInput.ok)
165
- return toCallToolResult(parsedInput, runtimeContract);
166
- const resolved = resolveManagedEvidence(options.session, [
167
- parsedInput.value.static_members_evidence_id,
168
- ]);
169
- if (!resolved.ok)
170
- return toCallToolResult(resolved, runtimeContract);
171
- const staticMembers = resolved.value[0];
172
- if (staticMembers === undefined)
173
- throw new TypeError("Managed runtime Evidence resolution failed");
174
- const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
175
- const parsed = { ...referencedInput, static_members: staticMembers };
176
- const result = await logToolExecution(options.logger, runtimeContract.name, () => planManagedRuntimeCorrelationEvidenceValidated(options.runtime, parsed));
177
- if (!result.ok)
178
- return toCallToolResult(result, runtimeContract);
179
- const recordedSource = options.recordEvidence?.(parsed.static_members);
180
- if (recordedSource !== undefined && !recordedSource.ok)
181
- return toCallToolResult(recordedSource, runtimeContract);
182
- const recorded = options.recordEvidence?.(result.value);
183
- if (recorded !== undefined && !recorded.ok)
184
- return toCallToolResult(recorded, runtimeContract);
185
- return toCallToolResult(result, runtimeContract, {
186
- evidenceResourcesAvailable: recorded !== undefined,
187
- });
188
- });
189
- server.registerTool(graphContract.name, toolRegistrationOptions(graphContract), async (input) => {
190
- const parsedInput = safeParseToolInput(managedApplicationGraphReferenceInputSchema, input, graphContract.name);
191
- if (!parsedInput.ok)
192
- return toCallToolResult(parsedInput, graphContract);
193
- const managedArtifact = parsedInput.value.managed_artifact_evidence_id === undefined
194
- ? undefined
195
- : resolveManagedArtifactEvidence(options.session, parsedInput.value.managed_artifact_evidence_id);
196
- if (managedArtifact !== undefined && !managedArtifact.ok)
197
- return toCallToolResult(managedArtifact, graphContract);
198
- const managedMembers = parsedInput.value.managed_members_evidence_id === undefined
199
- ? undefined
200
- : resolveManagedEvidence(options.session, [
201
- parsedInput.value.managed_members_evidence_id,
202
- ]);
203
- if (managedMembers !== undefined && !managedMembers.ok)
204
- return toCallToolResult(managedMembers, graphContract);
205
- const managedBoundaries = parsedInput.value.managed_native_boundaries_evidence_id === undefined
206
- ? undefined
207
- : resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_native_boundaries_evidence_id);
208
- if (managedBoundaries !== undefined && !managedBoundaries.ok)
209
- return toCallToolResult(managedBoundaries, graphContract);
210
- const parsed = {
211
- limits: parsedInput.value.limits,
212
- managed_artifact: managedArtifact?.value[0],
213
- managed_members: managedMembers?.value[0],
214
- managed_native_boundaries: managedBoundaries?.value[0],
215
- };
216
- const result = await logToolExecution(options.logger, graphContract.name, () => Promise.resolve(projectManagedApplicationGraphEvidence(parsed)));
217
- if (!result.ok)
218
- return toCallToolResult(result, graphContract);
219
- const recordedSources = recordSources(options.recordEvidence, sourceEvidence(parsed));
220
- if (!recordedSources.ok)
221
- return toCallToolResult(recordedSources, graphContract);
222
- const recorded = options.recordEvidence?.(result.value);
223
- if (recorded !== undefined && !recorded.ok)
224
- return toCallToolResult(recorded, graphContract);
225
- return toCallToolResult(result, graphContract, {
226
- evidenceResourcesAvailable: recorded !== undefined,
227
- });
228
- });
8
+ registerCompareManagedMembers(server, options);
9
+ registerVerifyManagedNativeBoundaries(server, options);
10
+ registerImportManagedReconstruction(server, options);
11
+ registerPlanManagedRuntimeCorrelation(server, options);
12
+ registerProjectManagedApplicationGraph(server, options);
229
13
  };
230
- const contract = (name) => {
231
- const found = MANAGED_WORKFLOW_TOOL_CONTRACTS.find((candidate) => candidate.name === name);
232
- if (found === undefined)
233
- throw new Error(`Missing ${name} contract`);
234
- return found;
235
- };
236
- const resolveManagedEvidence = (session, evidenceIds) => resolveSessionEvidenceIds(session, evidenceIds, {
237
- operation: "inspect_managed_members",
238
- predicate: "rea.analysis/v2",
239
- });
240
- const resolveManagedArtifactEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
241
- operation: "inspect_managed_artifact",
242
- predicate: "rea.analysis/v2",
243
- });
244
- const resolveManagedBoundaryEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
245
- operation: "inspect_managed_native_boundaries",
246
- predicate: "rea.analysis/v2",
247
- });
248
- const resolveNativeEvidence = (session, evidenceIds) => {
249
- const records = [];
250
- for (const evidenceId of evidenceIds) {
251
- const operation = session.evidenceById(evidenceId)?.operation;
252
- const expectedOperation = operation === "inspect_macho" || operation === "analyze_function"
253
- ? operation
254
- : "inspect_macho or analyze_function";
255
- const resolved = resolveSessionEvidenceIds(session, [evidenceId], {
256
- operation: expectedOperation,
257
- predicate: "rea.analysis/v2",
258
- });
259
- if (!resolved.ok)
260
- return resolved;
261
- records.push(...resolved.value);
262
- }
263
- return { ok: true, value: records };
264
- };
265
- const recordSources = (recordEvidence, sources) => {
266
- for (const source of sources) {
267
- const recorded = recordEvidence?.(source);
268
- if (recorded !== undefined && !recorded.ok)
269
- return recorded;
270
- }
271
- return { ok: true, value: null };
272
- };
273
- const sourceEvidence = (input) => [
274
- input.managed_artifact,
275
- input.managed_members,
276
- input.managed_native_boundaries,
277
- ].filter((evidence) => evidence !== undefined);
@@ -25,70 +25,84 @@ const registerOfficialTool = (server, analysis, contract, registration) => {
25
25
  return toCallToolResult(parsedInput, contract);
26
26
  const arguments_ = projectOfficialArguments(contract, parsedInput.value);
27
27
  const progress = mcpProgressReporter(context);
28
- await progress.report({
29
- phase: contract.name,
30
- completed: 0,
31
- total: 1,
32
- message: "started",
33
- });
34
- const result = await logToolExecution(registration.logger, contract.name, () => analysis.execute(contract.name, arguments_, {
28
+ const result = await runOfficialOperation(analysis, contract, arguments_, {
29
+ logger: registration.logger,
35
30
  signal: context.mcpReq.signal,
36
31
  progress,
37
- }));
38
- await progress.report({
39
- phase: contract.name,
40
- completed: 1,
41
- total: 1,
42
- message: result.ok ? "completed" : "failed",
43
- terminal: true,
44
32
  });
45
- if (result.ok) {
46
- const evidence = createEvidence(result.value.subject ?? registration.activeTarget?.(), result.value.provider, {
47
- operation: contract.name,
48
- parameters: arguments_,
49
- result: result.value.result,
50
- ...(result.value.analysisProfile === undefined
51
- ? {}
52
- : { analysisProfile: result.value.analysisProfile }),
53
- rawResult: result.value.rawResult,
54
- limitations: result.value.limitations,
55
- locations: result.value.locations,
56
- });
57
- const recorded = registration.recordEvidence?.(evidence);
58
- if (recorded !== undefined && !recorded.ok)
59
- return toCallToolResult(recorded, contract);
60
- return toCallToolResult({ ok: true, value: evidence }, contract, {
61
- evidenceResourcesAvailable: recorded !== undefined,
62
- });
63
- }
64
- if (result.error instanceof AnalysisCapabilityUnavailableError &&
65
- approvedUnknownTracking(input) &&
66
- registration.recordUnknown !== undefined) {
67
- const unknown = registration.recordUnknown({
68
- approved: true,
69
- question: "The requested analysis is unavailable for the current target.",
70
- severity: "medium",
71
- domain: "analysis-capability",
72
- supporting_evidence_ids: [],
73
- contradicting_evidence_ids: [],
74
- required_authority: "shipped-artifact",
75
- required_confidence: "observed",
76
- required_environment: null,
77
- recommended_probes: [
78
- {
79
- operation: contract.name,
80
- rationale: "Choose another analysis or target that can answer this question.",
81
- },
82
- ],
83
- relationships: [],
84
- });
85
- if (!unknown.ok &&
86
- !(unknown.error instanceof UnknownRegistryError &&
87
- unknown.error.reason === "already-exists"))
88
- return toCallToolResult(unknown, contract);
33
+ if (!result.ok) {
34
+ const unknownError = recordOfficialUnknown(input, result.error, contract, registration.recordUnknown);
35
+ if (unknownError !== undefined)
36
+ return toCallToolResult(unknownError, contract);
37
+ return toCallToolResult(result, contract);
89
38
  }
90
- return toCallToolResult(result, contract);
39
+ const evidence = createEvidence(result.value.subject ?? registration.activeTarget?.(), result.value.provider, {
40
+ operation: contract.name,
41
+ parameters: arguments_,
42
+ result: result.value.result,
43
+ ...(result.value.analysisProfile === undefined
44
+ ? {}
45
+ : { analysisProfile: result.value.analysisProfile }),
46
+ rawResult: result.value.rawResult,
47
+ limitations: result.value.limitations,
48
+ locations: result.value.locations,
49
+ });
50
+ const recorded = registration.recordEvidence?.(evidence);
51
+ if (recorded !== undefined && !recorded.ok)
52
+ return toCallToolResult(recorded, contract);
53
+ return toCallToolResult({ ok: true, value: evidence }, contract, {
54
+ evidenceResourcesAvailable: recorded !== undefined,
55
+ });
56
+ });
57
+ };
58
+ const runOfficialOperation = async (analysis, contract, arguments_, execution) => {
59
+ await execution.progress.report({
60
+ phase: contract.name,
61
+ completed: 0,
62
+ total: 1,
63
+ message: "started",
64
+ });
65
+ const result = await logToolExecution(execution.logger, contract.name, () => analysis.execute(contract.name, arguments_, {
66
+ signal: execution.signal,
67
+ progress: execution.progress,
68
+ }));
69
+ await execution.progress.report({
70
+ phase: contract.name,
71
+ completed: 1,
72
+ total: 1,
73
+ message: result.ok ? "completed" : "failed",
74
+ terminal: true,
75
+ });
76
+ return result;
77
+ };
78
+ const recordOfficialUnknown = (input, error, contract, recordUnknown) => {
79
+ if (!(error instanceof AnalysisCapabilityUnavailableError) ||
80
+ !approvedUnknownTracking(input) ||
81
+ recordUnknown === undefined)
82
+ return undefined;
83
+ const unknown = recordUnknown({
84
+ approved: true,
85
+ question: "The requested analysis is unavailable for the current target.",
86
+ severity: "medium",
87
+ domain: "analysis-capability",
88
+ supporting_evidence_ids: [],
89
+ contradicting_evidence_ids: [],
90
+ required_authority: "shipped-artifact",
91
+ required_confidence: "observed",
92
+ required_environment: null,
93
+ recommended_probes: [
94
+ {
95
+ operation: contract.name,
96
+ rationale: "Choose another analysis or target that can answer this question.",
97
+ },
98
+ ],
99
+ relationships: [],
91
100
  });
101
+ if (!unknown.ok &&
102
+ !(unknown.error instanceof UnknownRegistryError &&
103
+ unknown.error.reason === "already-exists"))
104
+ return unknown;
105
+ return undefined;
92
106
  };
93
107
  const projectOfficialArguments = (contract, input) => {
94
108
  const parsed = jsonObjectSchema.parse(input);
@@ -0,0 +1,137 @@
1
+ import { readEvidenceBundle, writeEvidenceBundle, } from "../application/EvidenceBundleFiles.js";
2
+ import { exportEvidenceBundleInputSchema, importEvidenceBundleInputSchema, listUnknownsInputSchema, SESSION_TOOL_CONTRACTS, verifyUnknownResolutionInputSchema, } from "../contracts/toolContracts.js";
3
+ import { AnalysisProtocolError, PermissionRequiredError, } from "../domain/errors.js";
4
+ import { recordUnknownInputSchema, updateUnknownInputSchema, } from "../domain/residualUnknown.js";
5
+ import { err, ok } from "../domain/result.js";
6
+ import { safeParseToolInput } from "./toolInputValidation.js";
7
+ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
8
+ import { toCallToolResult } from "./toolResult.js";
9
+ /** Register evidence bundle import and export tools. */
10
+ export const registerEvidenceTools = (registration) => {
11
+ registerExportEvidenceTool(registration);
12
+ registerImportEvidenceTool(registration);
13
+ };
14
+ const registerExportEvidenceTool = ({ server, session, exportContract, filePolicy, permissionAuthority, }) => {
15
+ server.registerTool(exportContract.name, toolRegistrationOptions(exportContract), async (input) => {
16
+ const parsedInput = safeParseToolInput(exportEvidenceBundleInputSchema, input, exportContract.name);
17
+ if (!parsedInput.ok)
18
+ return toCallToolResult(parsedInput, exportContract);
19
+ const parsed = parsedInput.value;
20
+ const bundle = session.exportEvidenceBundle();
21
+ if (parsed.path === undefined)
22
+ return toCallToolResult(ok(bundle), exportContract);
23
+ const denied = await authorizeEvidencePath({
24
+ authority: permissionAuthority,
25
+ capability: "evidence_write",
26
+ path: parsed.path,
27
+ access: "write",
28
+ operationIdentity: `export_evidence:${parsed.path}`,
29
+ });
30
+ if (denied !== undefined)
31
+ return toCallToolResult(denied, exportContract);
32
+ const written = await writeEvidenceBundle(bundle, parsed.path, parsed.overwrite, filePolicy);
33
+ return written.ok
34
+ ? toCallToolResult(ok({
35
+ path: written.value.path,
36
+ bytes: written.value.bytes,
37
+ records: bundle.records.length,
38
+ }), exportContract)
39
+ : toCallToolResult(written, exportContract);
40
+ });
41
+ };
42
+ const registerImportEvidenceTool = ({ server, session, importContract, filePolicy, permissionAuthority, }) => {
43
+ server.registerTool(importContract.name, toolRegistrationOptions(importContract), async (input) => {
44
+ const parsedInput = safeParseToolInput(importEvidenceBundleInputSchema, input, importContract.name);
45
+ if (!parsedInput.ok)
46
+ return toCallToolResult(parsedInput, importContract);
47
+ const path = parsedInput.value.path;
48
+ const denied = await authorizeEvidencePath({
49
+ authority: permissionAuthority,
50
+ capability: "evidence_read",
51
+ path,
52
+ access: "read",
53
+ operationIdentity: `import_evidence:${path}`,
54
+ });
55
+ if (denied !== undefined)
56
+ return toCallToolResult(denied, importContract);
57
+ const loaded = await readEvidenceBundle(path, filePolicy);
58
+ if (!loaded.ok)
59
+ return toCallToolResult(loaded, importContract);
60
+ const imported = session.importEvidenceBundle(loaded.value);
61
+ if (imported.ok && imported.value > 0)
62
+ server.sendResourceListChanged();
63
+ return imported.ok
64
+ ? toCallToolResult(ok({
65
+ imported: imported.value,
66
+ total: session.exportEvidenceBundle().records.length,
67
+ }), importContract)
68
+ : toCallToolResult(imported, importContract);
69
+ });
70
+ };
71
+ const authorizeEvidencePath = async (input) => {
72
+ if (input.authority === undefined)
73
+ return undefined;
74
+ const authorized = await input.authority.authorize({
75
+ capability: input.capability,
76
+ roots: [input.path],
77
+ executables: [],
78
+ environment_names: [],
79
+ network: "none",
80
+ mount: false,
81
+ operation_identity: input.operationIdentity,
82
+ }, input.access);
83
+ return authorized.ok ? undefined : permissionFailure(authorized);
84
+ };
85
+ /** Register residual-unknown query and mutation tools. */
86
+ export const registerUnknownTools = ({ server, session, contracts, }) => {
87
+ const listContract = contracts[14];
88
+ const recordContract = contracts[15];
89
+ const updateContract = contracts[16];
90
+ const verifyContract = contracts[17];
91
+ server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input) => {
92
+ const parsed = safeParseToolInput(listUnknownsInputSchema, input, listContract.name);
93
+ if (!parsed.ok)
94
+ return toCallToolResult(parsed, listContract);
95
+ const filters = parsed.value;
96
+ return toCallToolResult(ok(session.listUnknowns({
97
+ ...(filters.status === undefined ? {} : { status: filters.status }),
98
+ ...(filters.severity === undefined
99
+ ? {}
100
+ : { severity: filters.severity }),
101
+ ...(filters.domain === undefined ? {} : { domain: filters.domain }),
102
+ })), listContract);
103
+ });
104
+ server.registerTool(recordContract.name, toolRegistrationOptions(recordContract), (input) => {
105
+ const parsed = safeParseToolInput(recordUnknownInputSchema, input, recordContract.name);
106
+ if (!parsed.ok)
107
+ return toCallToolResult(parsed, recordContract);
108
+ const result = session.recordUnknown(parsed.value);
109
+ if (result.ok)
110
+ server.sendResourceListChanged();
111
+ return toCallToolResult(result, recordContract);
112
+ });
113
+ server.registerTool(updateContract.name, toolRegistrationOptions(updateContract), (input) => {
114
+ const parsed = safeParseToolInput(updateUnknownInputSchema, input, updateContract.name);
115
+ if (!parsed.ok)
116
+ return toCallToolResult(parsed, updateContract);
117
+ const result = session.updateUnknown(parsed.value);
118
+ if (result.ok)
119
+ server.sendResourceListChanged();
120
+ return toCallToolResult(result, updateContract);
121
+ });
122
+ server.registerTool(verifyContract.name, toolRegistrationOptions(verifyContract), (input) => {
123
+ const parsed = safeParseToolInput(verifyUnknownResolutionInputSchema, input, verifyContract.name);
124
+ return parsed.ok
125
+ ? toCallToolResult(session.verifyUnknownResolution(parsed.value.unknown_id), verifyContract)
126
+ : toCallToolResult(parsed, verifyContract);
127
+ });
128
+ };
129
+ const permissionFailure = (failure) => {
130
+ if (failure.ok)
131
+ return err(new AnalysisProtocolError("Expected a denied permission"));
132
+ return err(failure.error instanceof PermissionRequiredError
133
+ ? failure.error
134
+ : new AnalysisProtocolError(failure.error.message, {
135
+ cause: failure.error,
136
+ }));
137
+ };
@@ -6,7 +6,8 @@ import { buildCapabilityInventory } from "../application/CapabilityInventory.js"
6
6
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
7
7
  import { safeParseToolInput } from "./toolInputValidation.js";
8
8
  /** Register the read-only provider and target status operation. */
9
- export const registerSessionStatusTool = (server, session, contract, startedAt, availabilityPolicy) => {
9
+ export const registerSessionStatusTool = (options) => {
10
+ const { server, session, contract, startedAt, availabilityPolicy } = options;
10
11
  server.registerTool(contract.name, toolRegistrationOptions(contract), (input) => {
11
12
  const parsedInput = safeParseToolInput(binarySessionInputSchema, input, contract.name);
12
13
  if (!parsedInput.ok)