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
@@ -0,0 +1,74 @@
1
+ import { EvidenceIntegrityError, } from "../../domain/errors.js";
2
+ import { err, ok } from "../../domain/result.js";
3
+ import { recordDerivedEvidence } from "../recordDerivedEvidence.js";
4
+ import { evaluateReconstructionClosure } from "../../domain/reconstructionCoverage.js";
5
+ import { AnalysisInputError } from "../../domain/errors.js";
6
+ /** Build the execution context passed to cross-version investigation. */
7
+ export const investigationContext = ({ session, signal, inputRoots, integrityContinueEnabled, progress, }) => ({
8
+ session,
9
+ signal,
10
+ inputRoots,
11
+ integrityContinueEnabled,
12
+ ...(progress === undefined ? {} : { progress }),
13
+ });
14
+ export const isIncomplete = (status) => status === "unknown" || status === "truncated";
15
+ export const comparisonClosure = (comparisons) => uniqueIds(comparisons.flatMap((evidence) => [
16
+ evidence.evidence_id,
17
+ ...evidence.evidence_links,
18
+ ]));
19
+ export const functionEvidenceIds = (groups) => uniqueIds(groups.flatMap((group) => (Array.isArray(group) ? group : [group]).map(({ evidence_id: id }) => id)));
20
+ const uniqueIds = (ids) => [...new Set(ids)].sort((left, right) => left.localeCompare(right));
21
+ export const evidenceClosure = (session, seedIds) => {
22
+ const records = new Map(session
23
+ .exportEvidenceBundle()
24
+ .records.map((evidence) => [evidence.evidence_id, evidence]));
25
+ const visited = new Set();
26
+ const pending = [...seedIds];
27
+ while (pending.length > 0) {
28
+ const evidenceId = pending.pop();
29
+ if (evidenceId === undefined || visited.has(evidenceId))
30
+ continue;
31
+ const evidence = records.get(evidenceId);
32
+ if (evidence === undefined)
33
+ return err(new EvidenceIntegrityError("Investigation input has a dangling Evidence link"));
34
+ visited.add(evidenceId);
35
+ pending.push(...evidence.evidence_links);
36
+ }
37
+ return ok(uniqueIds([...visited]));
38
+ };
39
+ /** Verify a retained coverage boundary before reconstruction evidence is derived. */
40
+ export const verifyCoverageReadiness = (session, coverage) => {
41
+ if (coverage === undefined)
42
+ return ok(null);
43
+ const workspace = session.reconstructionCoverageWorkspace(coverage.workspace_id, coverage.revision);
44
+ if (workspace === undefined ||
45
+ workspace.revision_sha256 !== coverage.revision_sha256)
46
+ return err(new EvidenceIntegrityError("The requested reconstruction coverage revision is not retained by this session"));
47
+ try {
48
+ const result = evaluateReconstructionClosure(workspace, coverage.boundary_id, Date.now());
49
+ return result.status === "ready"
50
+ ? ok(null)
51
+ : err(new EvidenceIntegrityError(`Reconstruction coverage boundary is ${result.status}; readiness requires ready`));
52
+ }
53
+ catch (cause) {
54
+ return err(new AnalysisInputError("verify_reconstruction", { cause }));
55
+ }
56
+ };
57
+ export const recordWorkflowEvidence = (...[session, evidence, approved, unresolved, input]) => {
58
+ if (approved !== true || !unresolved) {
59
+ return recordDerivedEvidence(session, evidence, undefined);
60
+ }
61
+ return recordDerivedEvidence(session, evidence, {
62
+ approved: true,
63
+ question: input.question,
64
+ severity: "high",
65
+ domain: input.domain,
66
+ supporting_evidence_ids: [evidence.evidence_id],
67
+ contradicting_evidence_ids: [],
68
+ required_authority: input.requiredAuthority,
69
+ required_confidence: input.requiredConfidence,
70
+ required_environment: null,
71
+ recommended_probes: [...input.probes],
72
+ relationships: [],
73
+ });
74
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -6,15 +6,14 @@ import { correlateStaticAndRuntime, staticRuntimeCorrelationInputSchema, } from
6
6
  import { reconstructionVerificationInputSchema, verifyReconstruction, } from "../domain/reconstructionVerification.js";
7
7
  import { changedBehaviorResultSchema, changedBehaviorInputSchema, findChangedBehavior, } from "../domain/changedBehavior.js";
8
8
  import { createEvidence } from "../domain/evidence.js";
9
- import { EvidenceIntegrityError, } from "../domain/errors.js";
9
+ import {} from "../domain/errors.js";
10
10
  import { jsonValueSchema } from "../domain/jsonValue.js";
11
- import { err, ok } from "../domain/result.js";
12
11
  import { CALL_PATH_PROVIDER, CHANGED_BEHAVIOR_PROVIDER, RECONSTRUCTION_PROVIDER, STATIC_RUNTIME_PROVIDER, } from "./sessionToolPolicies.js";
13
12
  import { toCallToolResult } from "./toolResult.js";
14
- import { recordDerivedEvidence } from "./recordDerivedEvidence.js";
15
13
  import { mcpProgressReporter } from "./mcpProgress.js";
16
- import { runDerivedOperation } from "./runDerivedOperation.js";
14
+ import { runDerivedOperation, } from "./runDerivedOperation.js";
17
15
  import { authorizeFileReadWithDeferredWrite, authorizeRootPermission, } from "../application/DeferredFileAuthorization.js";
16
+ import { comparisonClosure, evidenceClosure, functionEvidenceIds, investigationContext, isIncomplete, recordWorkflowEvidence, verifyCoverageReadiness, } from "./registerInvestigationTools/helpers.js";
18
17
  /** Register Evidence-composed differential investigation workflows. */
19
18
  export const registerInvestigationTools = (server, session, contracts, policies) => {
20
19
  registerChangedBehavior(server, session, contracts[0], policies);
@@ -22,14 +21,6 @@ export const registerInvestigationTools = (server, session, contracts, policies)
22
21
  registerStaticRuntime(server, session, contracts[2]);
23
22
  registerReconstruction(server, session, contracts[3]);
24
23
  };
25
- const investigationExecution = (session, signal, inputRoots, integrityContinueEnabled, progress) => ({
26
- session,
27
- signal,
28
- inputRoots,
29
- integrityContinueEnabled,
30
- ...(progress === undefined ? {} : { progress }),
31
- });
32
- const isIncomplete = (status) => status === "unknown" || status === "truncated";
33
24
  const registerChangedBehavior = (server, session, contract, policies) => {
34
25
  server.registerTool(contract.name, contractOptions(contract), async (input, context) => {
35
26
  const parsedInput = safeParseToolInput(changedBehaviorInputSchema, input, contract.name);
@@ -37,69 +28,16 @@ const registerChangedBehavior = (server, session, contract, policies) => {
37
28
  return toCallToolResult(parsedInput, contract);
38
29
  const parsed = parsedInput.value;
39
30
  const investigationRun = parsed.investigation_run;
40
- if (investigationRun !== undefined) {
41
- const progress = mcpProgressReporter(context);
42
- let workspaceAuthorization;
43
- let authorizeInputRead;
44
- if (policies.permissionAuthority !== undefined) {
45
- const authority = policies.permissionAuthority;
46
- const authorizedWorkspace = await authorizeFileReadWithDeferredWrite(authority, {
47
- path: investigationRun.workspace_path,
48
- readCapability: "investigation_workspace_read",
49
- writeCapability: "investigation_workspace_write",
50
- operation: contract.name,
51
- });
52
- if (!authorizedWorkspace.ok)
53
- return toCallToolResult(authorizedWorkspace, contract);
54
- workspaceAuthorization = authorizedWorkspace.value;
55
- authorizeInputRead = () => authorizeRootPermission(authority, {
56
- capability: "investigation_input",
57
- roots: [investigationRun.left_path, investigationRun.right_path],
58
- access: "read",
59
- operation: contract.name,
60
- });
61
- }
62
- const investigated = await runCrossVersionInvestigationValidated(investigationRun, policies.evidenceFiles, {
63
- ...investigationExecution(session, context.mcpReq.signal, policies.inputRoots, policies.integrityContinueEnabled?.() ?? false, progress),
64
- ...(workspaceAuthorization === undefined
65
- ? {}
66
- : {
67
- authorizeWorkspaceWrite: workspaceAuthorization.authorizeWrite,
68
- }),
69
- ...(authorizeInputRead === undefined ? {} : { authorizeInputRead }),
31
+ if (investigationRun !== undefined)
32
+ return runAutomaticInvestigation({
33
+ server,
34
+ session,
35
+ contract,
36
+ policies,
37
+ investigationRun,
38
+ unknownRegistryApproved: parsed.unknown_registry_approved,
39
+ context,
70
40
  });
71
- if (!investigated.ok)
72
- return toCallToolResult(investigated, contract);
73
- const workspace = investigated.value.workspace;
74
- if (session.retainInvestigationWorkspace(workspace) === "added")
75
- server.sendResourceListChanged();
76
- const result = changedBehaviorResultSchema.parse(investigated.value.evidence.normalized_result);
77
- const toolResult = toCallToolResult(recordWorkflowEvidence(session, investigated.value.evidence, parsed.unknown_registry_approved, isIncomplete(result.behavior_status), {
78
- question: `Automatic changed behavior run ${result.investigation_run?.run_id ?? "unknown"} remains ${result.behavior_status}`,
79
- domain: "changed-behavior",
80
- requiredAuthority: "controlled-replay",
81
- requiredConfidence: "observed",
82
- probes: [
83
- {
84
- operation: "capture_process_scenario",
85
- rationale: "Capture both versions under the same bounded scenario and environment.",
86
- },
87
- ],
88
- }), contract);
89
- return {
90
- ...toolResult,
91
- content: [
92
- ...toolResult.content,
93
- {
94
- type: "resource_link",
95
- uri: `rea://workspace/${workspace.workspace_id}/revision/${String(workspace.revision)}`,
96
- name: `${workspace.workspace_id} revision ${String(workspace.revision)}`,
97
- description: "Immutable CAS-linked investigation workspace revision",
98
- mimeType: "application/json",
99
- },
100
- ],
101
- };
102
- }
103
41
  const closure = evidenceClosure(session, comparisonClosure(parsed.comparisons));
104
42
  if (!closure.ok)
105
43
  return toCallToolResult(closure, contract);
@@ -137,6 +75,74 @@ const registerChangedBehavior = (server, session, contract, policies) => {
137
75
  return toCallToolResult(recorded, contract);
138
76
  });
139
77
  };
78
+ const runAutomaticInvestigation = async (input) => {
79
+ const { policies, investigationRun, contract, session } = input;
80
+ const progress = mcpProgressReporter(input.context);
81
+ let workspaceAuthorization;
82
+ let authorizeInputRead;
83
+ if (policies.permissionAuthority !== undefined) {
84
+ const authority = policies.permissionAuthority;
85
+ const authorizedWorkspace = await authorizeFileReadWithDeferredWrite(authority, {
86
+ path: investigationRun.workspace_path,
87
+ readCapability: "investigation_workspace_read",
88
+ writeCapability: "investigation_workspace_write",
89
+ operation: contract.name,
90
+ });
91
+ if (!authorizedWorkspace.ok)
92
+ return toCallToolResult(authorizedWorkspace, contract);
93
+ workspaceAuthorization = authorizedWorkspace.value;
94
+ authorizeInputRead = () => authorizeRootPermission(authority, {
95
+ capability: "investigation_input",
96
+ roots: [investigationRun.left_path, investigationRun.right_path],
97
+ access: "read",
98
+ operation: contract.name,
99
+ });
100
+ }
101
+ const investigated = await runCrossVersionInvestigationValidated(investigationRun, policies.evidenceFiles, {
102
+ ...investigationContext({
103
+ session,
104
+ signal: input.context.mcpReq.signal,
105
+ inputRoots: policies.inputRoots,
106
+ integrityContinueEnabled: policies.integrityContinueEnabled?.() ?? false,
107
+ progress,
108
+ }),
109
+ ...(workspaceAuthorization === undefined
110
+ ? {}
111
+ : { authorizeWorkspaceWrite: workspaceAuthorization.authorizeWrite }),
112
+ ...(authorizeInputRead === undefined ? {} : { authorizeInputRead }),
113
+ });
114
+ if (!investigated.ok)
115
+ return toCallToolResult(investigated, contract);
116
+ const workspace = investigated.value.workspace;
117
+ if (session.retainInvestigationWorkspace(workspace) === "added")
118
+ input.server.sendResourceListChanged();
119
+ const result = changedBehaviorResultSchema.parse(investigated.value.evidence.normalized_result);
120
+ const toolResult = toCallToolResult(recordWorkflowEvidence(session, investigated.value.evidence, input.unknownRegistryApproved, isIncomplete(result.behavior_status), {
121
+ question: `Automatic changed behavior run ${result.investigation_run?.run_id ?? "unknown"} remains ${result.behavior_status}`,
122
+ domain: "changed-behavior",
123
+ requiredAuthority: "controlled-replay",
124
+ requiredConfidence: "observed",
125
+ probes: [
126
+ {
127
+ operation: "capture_process_scenario",
128
+ rationale: "Capture both versions under the same bounded scenario and environment.",
129
+ },
130
+ ],
131
+ }), contract);
132
+ return {
133
+ ...toolResult,
134
+ content: [
135
+ ...toolResult.content,
136
+ {
137
+ type: "resource_link",
138
+ uri: `rea://workspace/${workspace.workspace_id}/revision/${String(workspace.revision)}`,
139
+ name: `${workspace.workspace_id} revision ${String(workspace.revision)}`,
140
+ description: "Immutable CAS-linked investigation workspace revision",
141
+ mimeType: "application/json",
142
+ },
143
+ ],
144
+ };
145
+ };
140
146
  const registerCallPath = (server, session, contract) => {
141
147
  server.registerTool(contract.name, contractOptions(contract), async (input, context) => {
142
148
  const parsedInput = safeParseToolInput(callPathInputSchema, input, contract.name);
@@ -234,6 +240,9 @@ const registerReconstruction = (server, session, contract) => {
234
240
  if (!parsedInput.ok)
235
241
  return toCallToolResult(parsedInput, contract);
236
242
  const parsed = parsedInput.value;
243
+ const coverage = verifyCoverageReadiness(session, parsed.coverage);
244
+ if (!coverage.ok)
245
+ return toCallToolResult(coverage, contract);
237
246
  const owned = session.exportEvidenceBundle();
238
247
  const computed = await runDerivedOperation(context, contract.name, () => verifyReconstruction(parsed.specification, owned, parsed.offset, parsed.limit));
239
248
  if (!computed.ok)
@@ -271,45 +280,3 @@ const registerReconstruction = (server, session, contract) => {
271
280
  });
272
281
  };
273
282
  const contractOptions = toolRegistrationOptions;
274
- const comparisonClosure = (comparisons) => uniqueIds(comparisons.flatMap((evidence) => [
275
- evidence.evidence_id,
276
- ...evidence.evidence_links,
277
- ]));
278
- const functionEvidenceIds = (groups) => uniqueIds(groups.flatMap((group) => (Array.isArray(group) ? group : [group]).map(({ evidence_id: id }) => id)));
279
- const uniqueIds = (ids) => [...new Set(ids)].sort((left, right) => left.localeCompare(right));
280
- const evidenceClosure = (session, seedIds) => {
281
- const records = new Map(session
282
- .exportEvidenceBundle()
283
- .records.map((evidence) => [evidence.evidence_id, evidence]));
284
- const visited = new Set();
285
- const pending = [...seedIds];
286
- while (pending.length > 0) {
287
- const evidenceId = pending.pop();
288
- if (evidenceId === undefined || visited.has(evidenceId))
289
- continue;
290
- const evidence = records.get(evidenceId);
291
- if (evidence === undefined)
292
- return err(new EvidenceIntegrityError("Investigation input has a dangling Evidence link"));
293
- visited.add(evidenceId);
294
- pending.push(...evidence.evidence_links);
295
- }
296
- return ok(uniqueIds([...visited]));
297
- };
298
- const recordWorkflowEvidence = (...[session, evidence, approved, unresolved, input]) => {
299
- if (approved !== true || !unresolved) {
300
- return recordDerivedEvidence(session, evidence, undefined);
301
- }
302
- return recordDerivedEvidence(session, evidence, {
303
- approved: true,
304
- question: input.question,
305
- severity: "high",
306
- domain: input.domain,
307
- supporting_evidence_ids: [evidence.evidence_id],
308
- contradicting_evidence_ids: [],
309
- required_authority: input.requiredAuthority,
310
- required_confidence: input.requiredConfidence,
311
- required_environment: null,
312
- recommended_probes: [...input.probes],
313
- relationships: [],
314
- });
315
- };
@@ -0,0 +1,65 @@
1
+ import { compareManagedMembersEvidenceValidated } from "../../application/ManagedMemberComparisonService.js";
2
+ import { compareManagedMembersReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
3
+ import { managedMemberComparisonResultSchema } from "../../domain/managedMemberComparison.js";
4
+ import { logToolExecution } from "../toolLogging.js";
5
+ import { toCallToolResult } from "../toolResult.js";
6
+ import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
7
+ import { safeParseToolInput } from "../toolInputValidation.js";
8
+ import { managedWorkflowContract } from "./contract.js";
9
+ import { recordManagedSources, resolveManagedEvidence } from "./evidence.js";
10
+ const compareContract = managedWorkflowContract("compare_managed_members");
11
+ /** Register the managed member comparison workflow tool. */
12
+ export const registerCompareManagedMembers = (server, options) => {
13
+ server.registerTool(compareContract.name, toolRegistrationOptions(compareContract), async (input) => {
14
+ const parsedInput = safeParseToolInput(compareManagedMembersReferenceInputSchema, input, compareContract.name);
15
+ if (!parsedInput.ok)
16
+ return toCallToolResult(parsedInput, compareContract);
17
+ const resolved = resolveManagedEvidence(options.session, [
18
+ parsedInput.value.left_evidence_id,
19
+ parsedInput.value.right_evidence_id,
20
+ ]);
21
+ if (!resolved.ok)
22
+ return toCallToolResult(resolved, compareContract);
23
+ const [left, right] = resolved.value;
24
+ if (left === undefined || right === undefined)
25
+ throw new TypeError("Managed comparison Evidence resolution failed");
26
+ const { left_evidence_id: _leftEvidenceId, right_evidence_id: _rightEvidenceId, ...referencedInput } = parsedInput.value;
27
+ const parsed = { ...referencedInput, left, right };
28
+ const result = await logToolExecution(options.logger, compareContract.name, () => Promise.resolve(compareManagedMembersEvidenceValidated(parsed)));
29
+ if (!result.ok)
30
+ return toCallToolResult(result, compareContract);
31
+ const recorded = recordManagedSources(options.recordEvidence, [
32
+ parsed.left,
33
+ parsed.right,
34
+ ]);
35
+ if (!recorded.ok)
36
+ return toCallToolResult(recorded, compareContract);
37
+ const comparison = managedMemberComparisonResultSchema.parse(result.value.normalized_result);
38
+ const unknown = comparison.summary.unknown > 0;
39
+ const output = parsed.unknown_registry_approved === true && unknown
40
+ ? options.recordEvidenceWithUnknown?.(result.value, {
41
+ approved: true,
42
+ question: "Which managed members remain unmatched or ambiguous across these versions?",
43
+ severity: "medium",
44
+ domain: "managed-member-comparison",
45
+ supporting_evidence_ids: [result.value.evidence_id],
46
+ contradicting_evidence_ids: [],
47
+ required_authority: "shipped-artifact",
48
+ required_confidence: "observed",
49
+ required_environment: null,
50
+ recommended_probes: [
51
+ {
52
+ operation: "inspect_managed_members",
53
+ rationale: "Repeat static member inspection with complete pages and method bodies.",
54
+ },
55
+ ],
56
+ relationships: [],
57
+ })
58
+ : options.recordEvidence?.(result.value);
59
+ if (output !== undefined && !output.ok)
60
+ return toCallToolResult(output, compareContract);
61
+ return toCallToolResult({ ok: true, value: result.value }, compareContract, {
62
+ evidenceResourcesAvailable: output !== undefined,
63
+ });
64
+ });
65
+ };
@@ -0,0 +1,8 @@
1
+ import { MANAGED_WORKFLOW_TOOL_CONTRACTS } from "../../contracts/managedWorkflowToolContracts.js";
2
+ /** Locate one managed workflow tool contract by exact name. */
3
+ export const managedWorkflowContract = (name) => {
4
+ const found = MANAGED_WORKFLOW_TOOL_CONTRACTS.find((candidate) => candidate.name === name);
5
+ if (found === undefined)
6
+ throw new Error(`Missing ${name} contract`);
7
+ return found;
8
+ };
@@ -0,0 +1,43 @@
1
+ import { resolveSessionEvidenceIds } from "../sessionEvidence.js";
2
+ export const resolveManagedEvidence = (session, evidenceIds) => resolveSessionEvidenceIds(session, evidenceIds, {
3
+ operation: "inspect_managed_members",
4
+ predicate: "rea.analysis/v2",
5
+ });
6
+ export const resolveManagedArtifactEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
7
+ operation: "inspect_managed_artifact",
8
+ predicate: "rea.analysis/v2",
9
+ });
10
+ export const resolveManagedBoundaryEvidence = (session, evidenceId) => resolveSessionEvidenceIds(session, [evidenceId], {
11
+ operation: "inspect_managed_native_boundaries",
12
+ predicate: "rea.analysis/v2",
13
+ });
14
+ export const resolveNativeEvidence = (session, evidenceIds) => {
15
+ const records = [];
16
+ for (const evidenceId of evidenceIds) {
17
+ const operation = session.evidenceById(evidenceId)?.operation;
18
+ const expectedOperation = operation === "inspect_macho" || operation === "analyze_function"
19
+ ? operation
20
+ : "inspect_macho or analyze_function";
21
+ const resolved = resolveSessionEvidenceIds(session, [evidenceId], {
22
+ operation: expectedOperation,
23
+ predicate: "rea.analysis/v2",
24
+ });
25
+ if (!resolved.ok)
26
+ return resolved;
27
+ records.push(...resolved.value);
28
+ }
29
+ return { ok: true, value: records };
30
+ };
31
+ export const recordManagedSources = (recordEvidence, sources) => {
32
+ for (const source of sources) {
33
+ const recorded = recordEvidence?.(source);
34
+ if (recorded !== undefined && !recorded.ok)
35
+ return recorded;
36
+ }
37
+ return { ok: true, value: null };
38
+ };
39
+ export const sourceEvidence = (input) => [
40
+ input.managed_artifact,
41
+ input.managed_members,
42
+ input.managed_native_boundaries,
43
+ ].filter((evidence) => evidence !== undefined);
@@ -0,0 +1,39 @@
1
+ import { importManagedReconstructionEvidenceValidated } from "../../application/ManagedReconstructionService.js";
2
+ import { managedReconstructionReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
3
+ import { logToolExecution } from "../toolLogging.js";
4
+ import { toCallToolResult } from "../toolResult.js";
5
+ import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
6
+ import { safeParseToolInput } from "../toolInputValidation.js";
7
+ import { managedWorkflowContract } from "./contract.js";
8
+ import { resolveManagedEvidence } from "./evidence.js";
9
+ const reconstructionContract = managedWorkflowContract("import_managed_reconstruction");
10
+ /** Register the managed reconstruction import workflow tool. */
11
+ export const registerImportManagedReconstruction = (server, options) => {
12
+ server.registerTool(reconstructionContract.name, toolRegistrationOptions(reconstructionContract), async (input) => {
13
+ const parsedInput = safeParseToolInput(managedReconstructionReferenceInputSchema, input, reconstructionContract.name);
14
+ if (!parsedInput.ok)
15
+ return toCallToolResult(parsedInput, reconstructionContract);
16
+ const resolved = resolveManagedEvidence(options.session, [
17
+ parsedInput.value.static_members_evidence_id,
18
+ ]);
19
+ if (!resolved.ok)
20
+ return toCallToolResult(resolved, reconstructionContract);
21
+ const staticMembers = resolved.value[0];
22
+ if (staticMembers === undefined)
23
+ throw new TypeError("Managed reconstruction Evidence resolution failed");
24
+ const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
25
+ const parsed = { ...referencedInput, static_members: staticMembers };
26
+ const result = await logToolExecution(options.logger, reconstructionContract.name, () => Promise.resolve(importManagedReconstructionEvidenceValidated(parsed)));
27
+ if (!result.ok)
28
+ return toCallToolResult(result, reconstructionContract);
29
+ const recordedSource = options.recordEvidence?.(parsed.static_members);
30
+ if (recordedSource !== undefined && !recordedSource.ok)
31
+ return toCallToolResult(recordedSource, reconstructionContract);
32
+ const recorded = options.recordEvidence?.(result.value);
33
+ if (recorded !== undefined && !recorded.ok)
34
+ return toCallToolResult(recorded, reconstructionContract);
35
+ return toCallToolResult(result, reconstructionContract, {
36
+ evidenceResourcesAvailable: recorded !== undefined,
37
+ });
38
+ });
39
+ };
@@ -0,0 +1,39 @@
1
+ import { planManagedRuntimeCorrelationEvidenceValidated } from "../../application/ManagedRuntimeCorrelationService.js";
2
+ import { managedRuntimeCorrelationReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
3
+ import { logToolExecution } from "../toolLogging.js";
4
+ import { toCallToolResult } from "../toolResult.js";
5
+ import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
6
+ import { safeParseToolInput } from "../toolInputValidation.js";
7
+ import { managedWorkflowContract } from "./contract.js";
8
+ import { resolveManagedEvidence } from "./evidence.js";
9
+ const runtimeContract = managedWorkflowContract("plan_managed_runtime_correlation");
10
+ /** Register the managed runtime correlation planning workflow tool. */
11
+ export const registerPlanManagedRuntimeCorrelation = (server, options) => {
12
+ server.registerTool(runtimeContract.name, toolRegistrationOptions(runtimeContract), async (input) => {
13
+ const parsedInput = safeParseToolInput(managedRuntimeCorrelationReferenceInputSchema, input, runtimeContract.name);
14
+ if (!parsedInput.ok)
15
+ return toCallToolResult(parsedInput, runtimeContract);
16
+ const resolved = resolveManagedEvidence(options.session, [
17
+ parsedInput.value.static_members_evidence_id,
18
+ ]);
19
+ if (!resolved.ok)
20
+ return toCallToolResult(resolved, runtimeContract);
21
+ const staticMembers = resolved.value[0];
22
+ if (staticMembers === undefined)
23
+ throw new TypeError("Managed runtime Evidence resolution failed");
24
+ const { static_members_evidence_id: _staticMembersEvidenceId, ...referencedInput } = parsedInput.value;
25
+ const parsed = { ...referencedInput, static_members: staticMembers };
26
+ const result = await logToolExecution(options.logger, runtimeContract.name, () => Promise.resolve(planManagedRuntimeCorrelationEvidenceValidated(options.runtime, parsed)));
27
+ if (!result.ok)
28
+ return toCallToolResult(result, runtimeContract);
29
+ const recordedSource = options.recordEvidence?.(parsed.static_members);
30
+ if (recordedSource !== undefined && !recordedSource.ok)
31
+ return toCallToolResult(recordedSource, runtimeContract);
32
+ const recorded = options.recordEvidence?.(result.value);
33
+ if (recorded !== undefined && !recorded.ok)
34
+ return toCallToolResult(recorded, runtimeContract);
35
+ return toCallToolResult(result, runtimeContract, {
36
+ evidenceResourcesAvailable: recorded !== undefined,
37
+ });
38
+ });
39
+ };
@@ -0,0 +1,52 @@
1
+ import { projectManagedApplicationGraphEvidence } from "../../application/ManagedApplicationGraphService.js";
2
+ import { managedApplicationGraphReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
3
+ import { logToolExecution } from "../toolLogging.js";
4
+ import { toCallToolResult } from "../toolResult.js";
5
+ import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
6
+ import { safeParseToolInput } from "../toolInputValidation.js";
7
+ import { managedWorkflowContract } from "./contract.js";
8
+ import { recordManagedSources, resolveManagedArtifactEvidence, resolveManagedBoundaryEvidence, resolveManagedEvidence, sourceEvidence, } from "./evidence.js";
9
+ const graphContract = managedWorkflowContract("project_managed_application_graph");
10
+ /** Register the managed application graph projection workflow tool. */
11
+ export const registerProjectManagedApplicationGraph = (server, options) => {
12
+ server.registerTool(graphContract.name, toolRegistrationOptions(graphContract), async (input) => {
13
+ const parsedInput = safeParseToolInput(managedApplicationGraphReferenceInputSchema, input, graphContract.name);
14
+ if (!parsedInput.ok)
15
+ return toCallToolResult(parsedInput, graphContract);
16
+ const managedArtifact = parsedInput.value.managed_artifact_evidence_id === undefined
17
+ ? undefined
18
+ : resolveManagedArtifactEvidence(options.session, parsedInput.value.managed_artifact_evidence_id);
19
+ if (managedArtifact !== undefined && !managedArtifact.ok)
20
+ return toCallToolResult(managedArtifact, graphContract);
21
+ const managedMembers = parsedInput.value.managed_members_evidence_id === undefined
22
+ ? undefined
23
+ : resolveManagedEvidence(options.session, [
24
+ parsedInput.value.managed_members_evidence_id,
25
+ ]);
26
+ if (managedMembers !== undefined && !managedMembers.ok)
27
+ return toCallToolResult(managedMembers, graphContract);
28
+ const managedBoundaries = parsedInput.value.managed_native_boundaries_evidence_id === undefined
29
+ ? undefined
30
+ : resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_native_boundaries_evidence_id);
31
+ if (managedBoundaries !== undefined && !managedBoundaries.ok)
32
+ return toCallToolResult(managedBoundaries, graphContract);
33
+ const parsed = {
34
+ limits: parsedInput.value.limits,
35
+ managed_artifact: managedArtifact?.value[0],
36
+ managed_members: managedMembers?.value[0],
37
+ managed_native_boundaries: managedBoundaries?.value[0],
38
+ };
39
+ const result = await logToolExecution(options.logger, graphContract.name, () => Promise.resolve(projectManagedApplicationGraphEvidence(parsed)));
40
+ if (!result.ok)
41
+ return toCallToolResult(result, graphContract);
42
+ const recordedSources = recordManagedSources(options.recordEvidence, sourceEvidence(parsed));
43
+ if (!recordedSources.ok)
44
+ return toCallToolResult(recordedSources, graphContract);
45
+ const recorded = options.recordEvidence?.(result.value);
46
+ if (recorded !== undefined && !recorded.ok)
47
+ return toCallToolResult(recorded, graphContract);
48
+ return toCallToolResult(result, graphContract, {
49
+ evidenceResourcesAvailable: recorded !== undefined,
50
+ });
51
+ });
52
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ import { verifyManagedNativeBoundariesEvidence } from "../../application/ManagedNativeVerificationService.js";
2
+ import { managedNativeVerificationReferenceInputSchema } from "../../contracts/managedWorkflowToolContracts.js";
3
+ import { managedNativeVerificationResultSchema } from "../../domain/managedNativeVerification.js";
4
+ import { logToolExecution } from "../toolLogging.js";
5
+ import { toCallToolResult } from "../toolResult.js";
6
+ import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
7
+ import { safeParseToolInput } from "../toolInputValidation.js";
8
+ import { managedWorkflowContract } from "./contract.js";
9
+ import { recordManagedSources, resolveManagedBoundaryEvidence, resolveNativeEvidence, } from "./evidence.js";
10
+ const nativeVerificationContract = managedWorkflowContract("verify_managed_native_boundaries");
11
+ /** Register the managed/native boundary verification workflow tool. */
12
+ export const registerVerifyManagedNativeBoundaries = (server, options) => {
13
+ server.registerTool(nativeVerificationContract.name, toolRegistrationOptions(nativeVerificationContract), async (input) => {
14
+ const parsedInput = safeParseToolInput(managedNativeVerificationReferenceInputSchema, input, nativeVerificationContract.name);
15
+ if (!parsedInput.ok)
16
+ return toCallToolResult(parsedInput, nativeVerificationContract);
17
+ const managedBoundaries = resolveManagedBoundaryEvidence(options.session, parsedInput.value.managed_boundaries_evidence_id);
18
+ if (!managedBoundaries.ok)
19
+ return toCallToolResult(managedBoundaries, nativeVerificationContract);
20
+ const nativeObservations = resolveNativeEvidence(options.session, parsedInput.value.native_observation_evidence_ids);
21
+ if (!nativeObservations.ok)
22
+ return toCallToolResult(nativeObservations, nativeVerificationContract);
23
+ const managedBoundary = managedBoundaries.value[0];
24
+ if (managedBoundary === undefined)
25
+ throw new TypeError("Managed boundary Evidence resolution failed");
26
+ const { managed_boundaries_evidence_id: _managedBoundariesEvidenceId, native_observation_evidence_ids: _nativeObservationEvidenceIds, ...referencedInput } = parsedInput.value;
27
+ const parsed = {
28
+ ...referencedInput,
29
+ managed_boundaries: managedBoundary,
30
+ native_observations: nativeObservations.value,
31
+ };
32
+ const result = await logToolExecution(options.logger, nativeVerificationContract.name, () => Promise.resolve(verifyManagedNativeBoundariesEvidence(parsed)));
33
+ if (!result.ok)
34
+ return toCallToolResult(result, nativeVerificationContract);
35
+ const recordedSources = recordManagedSources(options.recordEvidence, [
36
+ parsed.managed_boundaries,
37
+ ...parsed.native_observations,
38
+ ]);
39
+ if (!recordedSources.ok)
40
+ return toCallToolResult(recordedSources, nativeVerificationContract);
41
+ const verification = managedNativeVerificationResultSchema.parse(result.value.normalized_result);
42
+ const unknown = verification.summary.unresolved > 0 ||
43
+ verification.summary.contradicted > 0 ||
44
+ verification.summary.native_body_unresolved > 0;
45
+ const output = parsed.unknown_registry_approved === true && unknown
46
+ ? options.recordEvidenceWithUnknown?.(result.value, {
47
+ approved: true,
48
+ question: "Which managed/native boundaries remain unresolved or contradicted by the supplied native Evidence?",
49
+ severity: "medium",
50
+ domain: "managed-native-verification",
51
+ supporting_evidence_ids: [result.value.evidence_id],
52
+ contradicting_evidence_ids: [],
53
+ required_authority: "shipped-artifact",
54
+ required_confidence: "observed",
55
+ required_environment: null,
56
+ recommended_probes: [
57
+ {
58
+ operation: "inspect_managed_native_boundaries",
59
+ rationale: "Repeat managed boundary inspection with complete ModuleRef, ImplMap, and native implementation pages.",
60
+ },
61
+ {
62
+ operation: "analyze_function",
63
+ rationale: "Analyze the provider-resolved native function candidate for the declared export.",
64
+ },
65
+ ],
66
+ relationships: [],
67
+ })
68
+ : options.recordEvidence?.(result.value);
69
+ if (output !== undefined && !output.ok)
70
+ return toCallToolResult(output, nativeVerificationContract);
71
+ return toCallToolResult(result, nativeVerificationContract, {
72
+ evidenceResourcesAvailable: output !== undefined,
73
+ });
74
+ });
75
+ };