rea-agents 1.7.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 (333) hide show
  1. package/README.md +112 -59
  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 +42 -2
  18. package/dist/application/ClientRegistrationStatus.js +1 -1
  19. package/dist/application/CrossVersionInventory.js +8 -2
  20. package/dist/application/CrossVersionInvestigation.js +11 -29
  21. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  22. package/dist/application/DirectAnalysis.js +47 -44
  23. package/dist/application/Doctor.js +165 -197
  24. package/dist/application/DoctorDiagnostics.js +180 -0
  25. package/dist/application/ElectronBoundaryAnalysis.js +112 -0
  26. package/dist/application/ElectronBoundaryGraph.js +9 -0
  27. package/dist/application/ElectronBoundaryGraphContext.js +62 -0
  28. package/dist/application/ElectronBoundaryGraphIpc.js +242 -0
  29. package/dist/application/ElectronBoundaryGraphNative.js +86 -0
  30. package/dist/application/ElectronBoundaryGraphWindows.js +223 -0
  31. package/dist/application/EnhancedToolPagination.js +22 -0
  32. package/dist/application/EnhancedToolTypes.js +4 -0
  33. package/dist/application/EnhancedTools.js +58 -50
  34. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  35. package/dist/application/InvestigationProviders.js +30 -0
  36. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  37. package/dist/application/JavaScriptApplicationEvidence.js +26 -0
  38. package/dist/application/JavaScriptApplicationEvidenceGraph.js +89 -0
  39. package/dist/application/JavaScriptApplicationService.js +74 -0
  40. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +29 -0
  41. package/dist/application/JavaScriptApplicationWorkflowService.js +90 -0
  42. package/dist/application/JavaScriptArtifactAnalysis.js +52 -7
  43. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  44. package/dist/application/JavaScriptArtifactGraphBuilder.js +82 -17
  45. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  46. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  47. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  48. package/dist/application/JavaScriptArtifactGraphEvidence.js +24 -14
  49. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  50. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  51. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  52. package/dist/application/JavaScriptArtifactReconstruction.js +4 -1
  53. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -83
  54. package/dist/application/JavaScriptJsonModules.js +39 -0
  55. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  56. package/dist/application/JavaScriptReplayPermission.js +16 -0
  57. package/dist/application/JavaScriptReplayPlanning.js +201 -0
  58. package/dist/application/JavaScriptReplayService.js +292 -0
  59. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +25 -0
  60. package/dist/application/JavaScriptRuntimeReconciliationService.js +27 -0
  61. package/dist/application/LinuxHopper.js +10 -0
  62. package/dist/application/MacHopper.js +22 -11
  63. package/dist/application/ManagedApplicationGraphService.js +55 -0
  64. package/dist/application/ManagedMemberComparisonService.js +122 -0
  65. package/dist/application/ManagedNativeVerificationService.js +39 -0
  66. package/dist/application/ManagedReconstructionService.js +58 -0
  67. package/dist/application/ManagedRuntimeCorrelationService.js +103 -0
  68. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  69. package/dist/application/PermissionAuthority.js +106 -63
  70. package/dist/application/ProcessCaptureCapability.js +1 -1
  71. package/dist/application/ProcessCapturePermission.js +13 -0
  72. package/dist/application/ProcessCli.js +2 -12
  73. package/dist/application/ProcessHarness.js +1 -1
  74. package/dist/application/ProcessSampling.js +15 -11
  75. package/dist/application/ProjectPermissionStore.js +49 -9
  76. package/dist/application/RealHopperAssertions.js +76 -0
  77. package/dist/application/ReconstructionCoverageService.js +69 -0
  78. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  79. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  80. package/dist/application/Setup.js +147 -259
  81. package/dist/application/SetupClientConfiguration.js +220 -0
  82. package/dist/application/SetupClients.js +24 -2
  83. package/dist/application/SetupPlan.js +123 -12
  84. package/dist/application/SetupSkill.js +26 -12
  85. package/dist/application/SupportedClients.js +1 -0
  86. package/dist/application/Uninstall.js +6 -3
  87. package/dist/application/WindowsCapabilities.js +86 -0
  88. package/dist/application/runtime.js +2 -0
  89. package/dist/artifacts/AsarArtifactReader.js +11 -0
  90. package/dist/browser/BrowserProcessStartup.js +88 -0
  91. package/dist/browser/CdpCaptureDocuments.js +12 -8
  92. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  93. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  94. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  95. package/dist/browser/CdpCaptureEventState.js +1 -0
  96. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  97. package/dist/browser/CdpCaptureEvents.js +46 -464
  98. package/dist/browser/CdpElectronInspection.js +106 -162
  99. package/dist/browser/CdpElectronProvider.js +5 -1
  100. package/dist/browser/CdpElectronScriptEvents.js +69 -0
  101. package/dist/browser/CdpElectronScripts.js +94 -0
  102. package/dist/browser/CdpElectronWorkers.js +56 -0
  103. package/dist/browser/CdpObservationSession.js +51 -8
  104. package/dist/browser/CdpPageCapture.js +12 -129
  105. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  106. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  107. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  108. package/dist/browser/PngVisualDiff.js +9 -2
  109. package/dist/catalogIdentity.js +8 -1
  110. package/dist/cli/artifactCommands.js +82 -0
  111. package/dist/cli/coreAnalysisCommands.js +232 -0
  112. package/dist/cli/managedCommands.js +397 -0
  113. package/dist/cli/managedProjectGraphCommand.js +24 -0
  114. package/dist/cli/options.js +9 -0
  115. package/dist/cli/setupCommands.js +108 -0
  116. package/dist/cli/types.js +1 -0
  117. package/dist/cli/utilityCommands.js +122 -0
  118. package/dist/cli.js +13 -383
  119. package/dist/cliApplicationCommands.js +176 -0
  120. package/dist/cliBrowserAdvancedCommands.js +73 -16
  121. package/dist/cliBrowserCommands.js +39 -115
  122. package/dist/cliCommandNames.js +17 -0
  123. package/dist/cliElectronCommands.js +100 -27
  124. package/dist/cliEvidenceCommands.js +13 -2
  125. package/dist/cliInvestigationCommands.js +53 -10
  126. package/dist/cliJsonInput.js +54 -0
  127. package/dist/cliObservationOptions.js +137 -0
  128. package/dist/cliPolicyCommands.js +80 -46
  129. package/dist/cliSetup.js +289 -0
  130. package/dist/config/environment.js +107 -0
  131. package/dist/config/parseConfig.js +228 -0
  132. package/dist/config/parsers.js +68 -0
  133. package/dist/config/permissions.js +30 -0
  134. package/dist/config/types.js +1 -0
  135. package/dist/config.js +1 -292
  136. package/dist/contracts/applicationToolContracts.js +225 -0
  137. package/dist/contracts/artifactToolContracts.js +5 -9
  138. package/dist/contracts/browserToolContracts.js +14 -62
  139. package/dist/contracts/electronToolContracts.js +45 -19
  140. package/dist/contracts/errorSchemas.js +1 -0
  141. package/dist/contracts/investigationExamples.js +0 -6
  142. package/dist/contracts/javascriptApplicationWorkflowExamples.js +46 -0
  143. package/dist/contracts/javascriptRuntimeReconciliationExample.js +208 -0
  144. package/dist/contracts/managedToolContracts.js +153 -0
  145. package/dist/contracts/managedWorkflowExamples.js +346 -0
  146. package/dist/contracts/managedWorkflowToolContracts.js +203 -0
  147. package/dist/contracts/nativeToolContracts.js +2 -6
  148. package/dist/contracts/promptContracts.js +18 -2
  149. package/dist/contracts/providerSelection.js +2 -0
  150. package/dist/contracts/toolContractExamples.js +10 -25
  151. package/dist/contracts/toolContracts.js +49 -47
  152. package/dist/contracts/toolEffects.js +174 -0
  153. package/dist/contracts/toolOutputSchemaGroups.js +232 -0
  154. package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
  155. package/dist/contracts/toolOutputSchemas.js +2 -535
  156. package/dist/doctorRuntime.js +42 -1
  157. package/dist/domain/analysisErrorPresentation.js +234 -0
  158. package/dist/domain/analysisErrorProjection.js +284 -0
  159. package/dist/domain/artifactComparison.js +37 -19
  160. package/dist/domain/binaryTarget.js +87 -37
  161. package/dist/domain/browserObservation.js +1 -282
  162. package/dist/domain/browserObservationSchemas.js +286 -0
  163. package/dist/domain/bundleComparison.js +4 -4
  164. package/dist/domain/electronObservation.js +13 -0
  165. package/dist/domain/electronStaticAnalysis.js +9 -0
  166. package/dist/domain/electronStaticAnalysisBrowser.js +206 -0
  167. package/dist/domain/electronStaticAnalysisIpc.js +171 -0
  168. package/dist/domain/electronStaticAnalysisNative.js +164 -0
  169. package/dist/domain/electronStaticAnalysisTypes.js +1 -0
  170. package/dist/domain/electronStaticAnalysisValues.js +103 -0
  171. package/dist/domain/errors.js +32 -448
  172. package/dist/domain/functionComparison.js +4 -165
  173. package/dist/domain/functionComparisonDimensions.js +164 -0
  174. package/dist/domain/functionComparisonSchemas.js +3 -8
  175. package/dist/domain/inputIssueProjection.js +52 -0
  176. package/dist/domain/javascriptApplicationAnalysis.js +155 -0
  177. package/dist/domain/javascriptApplicationChangeGraph.js +231 -0
  178. package/dist/domain/javascriptApplicationEvidenceSchemas.js +18 -0
  179. package/dist/domain/javascriptApplicationGraph.js +2 -1
  180. package/dist/domain/javascriptApplicationGraphSchemas.js +7 -0
  181. package/dist/domain/javascriptApplicationVersionComparison.js +116 -0
  182. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +139 -0
  183. package/dist/domain/javascriptApplicationVersionItems.js +233 -0
  184. package/dist/domain/javascriptApplicationVersionKeys.js +170 -0
  185. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  186. package/dist/domain/javascriptFeatureSeed.js +140 -0
  187. package/dist/domain/javascriptFeatureTrace.js +232 -0
  188. package/dist/domain/javascriptFeatureTraceSchemas.js +136 -0
  189. package/dist/domain/javascriptFeatureTraversal.js +100 -0
  190. package/dist/domain/javascriptNativeHandoff.js +85 -0
  191. package/dist/domain/javascriptReplay.js +361 -0
  192. package/dist/domain/javascriptRuntimeLoadState.js +106 -0
  193. package/dist/domain/javascriptRuntimeReconciliation.js +42 -0
  194. package/dist/domain/javascriptRuntimeReconciliationGraph.js +169 -0
  195. package/dist/domain/javascriptRuntimeReconciliationMatching.js +247 -0
  196. package/dist/domain/javascriptRuntimeReconciliationParsing.js +160 -0
  197. package/dist/domain/javascriptRuntimeReconciliationResult.js +119 -0
  198. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +316 -0
  199. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +245 -0
  200. package/dist/domain/javascriptRuntimeStaticCandidates.js +193 -0
  201. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  202. package/dist/domain/javascriptSemanticIr.js +30 -0
  203. package/dist/domain/javascriptSemanticProjection.js +366 -0
  204. package/dist/domain/javascriptSemanticState.js +40 -0
  205. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  206. package/dist/domain/javascriptSemanticValues.js +352 -0
  207. package/dist/domain/javascriptStaticAnalysis.js +26 -254
  208. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  209. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  210. package/dist/domain/javascriptStaticAnalysisFindings.js +39 -0
  211. package/dist/domain/javascriptStaticAnalysisHelpers.js +81 -2
  212. package/dist/domain/javascriptStaticAnalysisState.js +6 -0
  213. package/dist/domain/knownPageCoverage.js +21 -0
  214. package/dist/domain/managedApplicationGraph.js +206 -0
  215. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  216. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  217. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  218. package/dist/domain/managedArtifact.js +452 -0
  219. package/dist/domain/managedMemberComparison.js +211 -0
  220. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  221. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  222. package/dist/domain/managedNativeVerification.js +46 -0
  223. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  224. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  225. package/dist/domain/managedReconstruction.js +196 -0
  226. package/dist/domain/managedRuntimeCorrelation.js +184 -0
  227. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  228. package/dist/domain/permissionPolicy.js +2 -0
  229. package/dist/domain/reconstructionCoverage.js +387 -0
  230. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  231. package/dist/domain/reconstructionVerificationSchemas.js +9 -3
  232. package/dist/domain/runtimeCharacterization.js +85 -0
  233. package/dist/domain/webBundleAnalyzer.js +3 -409
  234. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  235. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  236. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  237. package/dist/dotnet/ManagedArtifactInspector.js +339 -0
  238. package/dist/dotnet/ManagedMemberInspector.js +153 -0
  239. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  240. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  241. package/dist/dotnet/ManagedMemberRows.js +120 -0
  242. package/dist/dotnet/ManagedMetadataHeaps.js +131 -0
  243. package/dist/dotnet/ManagedMetadataInventory.js +104 -0
  244. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  245. package/dist/dotnet/ManagedMetadataLayout.js +259 -0
  246. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  247. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  248. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  249. package/dist/dotnet/ManagedNativeBoundaryInspector.js +143 -0
  250. package/dist/dotnet/ManagedPeReader.js +188 -0
  251. package/dist/dotnet/ManagedReaderFailure.js +10 -0
  252. package/dist/dotnet/ManagedStaticProvider.js +203 -0
  253. package/dist/generatedPackageMetadata.js +2 -2
  254. package/dist/ghidra/GhidraClient.js +76 -91
  255. package/dist/ghidra/GhidraClientStartup.js +29 -0
  256. package/dist/ghidra/GhidraClientWire.js +34 -0
  257. package/dist/ghidra/GhidraDefaults.js +1 -1
  258. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  259. package/dist/ghidra/GhidraInstallation.js +20 -15
  260. package/dist/ghidra/GhidraLauncher.js +93 -29
  261. package/dist/ghidra/GhidraProvider.js +67 -161
  262. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  263. package/dist/ghidra/GhidraSessionValues.js +2 -0
  264. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  265. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  266. package/dist/ghidra/GhidraTransport.js +71 -0
  267. package/dist/identity.js +3 -2
  268. package/dist/main/messages.js +5 -0
  269. package/dist/main/reload.js +49 -0
  270. package/dist/main/shutdown.js +25 -0
  271. package/dist/main/startup.js +14 -0
  272. package/dist/main/state.js +26 -0
  273. package/dist/main/transport.js +61 -0
  274. package/dist/main/types.js +1 -0
  275. package/dist/main.js +35 -132
  276. package/dist/process/PrivateRuntimeRoot.js +3 -2
  277. package/dist/process/ProcessOwnership.js +35 -0
  278. package/dist/process/ProviderProcess.js +2 -0
  279. package/dist/replay/JavaScriptReplayWorker.js +300 -0
  280. package/dist/replay/LinuxJavaScriptReplayRunner.js +217 -0
  281. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  282. package/dist/replay/LinuxRuntimeClosure.js +46 -0
  283. package/dist/replay/LinuxSeccompPolicy.js +40 -0
  284. package/dist/replay/ReplayOutcome.js +95 -0
  285. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  286. package/dist/replay/ReplayWorkerProtocol.js +55 -0
  287. package/dist/replay/SystemJavaScriptReplayHost.js +182 -0
  288. package/dist/server/ProcessCaptureElicitation.js +157 -0
  289. package/dist/server/createServer.js +158 -41
  290. package/dist/server/registerApplicationTools/characterization.js +57 -0
  291. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  292. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  293. package/dist/server/registerApplicationTools/coverage.js +84 -0
  294. package/dist/server/registerApplicationTools/helpers.js +42 -0
  295. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  296. package/dist/server/registerApplicationTools/types.js +1 -0
  297. package/dist/server/registerApplicationTools.js +13 -0
  298. package/dist/server/registerArtifactComparisonTool.js +16 -9
  299. package/dist/server/registerBrowserTools.js +61 -60
  300. package/dist/server/registerBundleComparisonTool.js +17 -20
  301. package/dist/server/registerElectronTools.js +39 -12
  302. package/dist/server/registerEnhancedTools.js +52 -15
  303. package/dist/server/registerEvidenceResources.js +54 -0
  304. package/dist/server/registerEvidenceTools.js +5 -1
  305. package/dist/server/registerFunctionComparisonTool.js +14 -7
  306. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  307. package/dist/server/registerInvestigationTools/types.js +1 -0
  308. package/dist/server/registerInvestigationTools.js +103 -132
  309. package/dist/server/registerManagedTools.js +6 -0
  310. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  311. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  312. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  313. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  314. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  315. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  316. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  317. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  318. package/dist/server/registerManagedWorkflowTools.js +13 -0
  319. package/dist/server/registerOfficialTools.js +81 -67
  320. package/dist/server/registerProcessComparisonTool.js +25 -47
  321. package/dist/server/registerSessionRecordTools.js +137 -0
  322. package/dist/server/registerSessionStatusTool.js +9 -8
  323. package/dist/server/registerSessionTools.js +77 -216
  324. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  325. package/dist/server/sessionEvidence.js +14 -19
  326. package/dist/server/toolInputValidation.js +77 -0
  327. package/dist/server/toolRegistrationOptions.js +177 -2
  328. package/dist/server/toolResult.js +30 -17
  329. package/package.json +21 -14
  330. package/scripts/rea.mjs +1 -1
  331. package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +75 -6
  332. package/scripts/prepare-node-pty.mjs +0 -35
  333. package/scripts/rebuild-native.mjs +0 -22
@@ -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
+ };
@@ -3,15 +3,16 @@ import { toCallToolResult } from "./toolResult.js";
3
3
  import { jsonObjectSchema } from "../domain/jsonValue.js";
4
4
  import { createServerIdentity } from "../serverIdentity.js";
5
5
  import { buildCapabilityInventory } from "../application/CapabilityInventory.js";
6
+ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
7
+ import { safeParseToolInput } from "./toolInputValidation.js";
6
8
  /** Register the read-only provider and target status operation. */
7
- export const registerSessionStatusTool = (server, session, contract, startedAt, availabilityPolicy) => {
8
- server.registerTool(contract.name, {
9
- description: contract.description,
10
- inputSchema: contract.inputSchema,
11
- outputSchema: contract.outputSchema,
12
- annotations: contract.annotations,
13
- }, (input) => {
14
- const parsed = binarySessionInputSchema.parse(input);
9
+ export const registerSessionStatusTool = (options) => {
10
+ const { server, session, contract, startedAt, availabilityPolicy } = options;
11
+ server.registerTool(contract.name, toolRegistrationOptions(contract), (input) => {
12
+ const parsedInput = safeParseToolInput(binarySessionInputSchema, input, contract.name);
13
+ if (!parsedInput.ok)
14
+ return toCallToolResult(parsedInput, contract);
15
+ const parsed = parsedInput.value;
15
16
  const client = server.server.getClientVersion();
16
17
  const clientCapabilities = server.server.getClientCapabilities();
17
18
  const status = session.status();
@@ -5,8 +5,7 @@ import { logToolExecution } from "./toolLogging.js";
5
5
  import { err, ok } from "../domain/result.js";
6
6
  import { processScenarioSchema } from "../domain/processCapture.js";
7
7
  import { captureProcessScenario } from "../application/ProcessHarness.js";
8
- import { recordUnknownInputSchema, updateUnknownInputSchema, } from "../domain/residualUnknown.js";
9
- import { readEvidenceBundle, writeEvidenceBundle, } from "../application/EvidenceBundleFiles.js";
8
+ import { processCapturePermissionRequest } from "../application/ProcessCapturePermission.js";
10
9
  import { readAnalysisSnapshot, writeAnalysisSnapshot, } from "../application/AnalysisSnapshotFiles.js";
11
10
  import { AnalysisProtocolError, PermissionRequiredError, UnknownRegistryError, } from "../domain/errors.js";
12
11
  import { DENY_EVIDENCE_FILE_POLICY, DENY_PROCESS_POLICY, } from "./sessionToolPolicies.js";
@@ -14,11 +13,17 @@ import { createProcessCaptureEvidence } from "../application/ProcessEvidence.js"
14
13
  import { registerProcessComparisonTool } from "./registerProcessComparisonTool.js";
15
14
  import { registerArtifactComparisonTool } from "./registerArtifactComparisonTool.js";
16
15
  import { registerFunctionComparisonTool } from "./registerFunctionComparisonTool.js";
16
+ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
17
+ import { safeParseToolInput } from "./toolInputValidation.js";
17
18
  import { registerBundleComparisonTool } from "./registerBundleComparisonTool.js";
18
19
  import { registerInvestigationTools } from "./registerInvestigationTools.js";
19
20
  import { closeBinaryInputSchema, openBinaryInputSchema, } from "../contracts/sessionLifecycleInputs.js";
20
21
  import { registerSessionStatusTool } from "./registerSessionStatusTool.js";
21
22
  import { mcpProgressReporter } from "./mcpProgress.js";
23
+ import { authorizeProcessCaptureWithElicitation, } from "./ProcessCaptureElicitation.js";
24
+ import { isInputRequiredResult } from "@modelcontextprotocol/server";
25
+ import { registerEvidenceTools, registerUnknownTools, } from "./registerSessionRecordTools.js";
26
+ import { sessionAvailabilityPolicy } from "./sessionAvailabilityPolicy.js";
22
27
  const permissionFailure = (failure) => {
23
28
  if (failure.ok)
24
29
  return err(new AnalysisProtocolError("Expected a denied permission"));
@@ -57,27 +62,19 @@ const recordProcessResidualUnknowns = (session, scenario, evidence, residuals) =
57
62
  }
58
63
  return ok(null);
59
64
  };
60
- const registerProcessTools = ({ server, session, logger, processPolicy, captureContract, permissionAuthority, }) => {
61
- server.registerTool(captureContract.name, {
62
- description: captureContract.description,
63
- inputSchema: captureContract.inputSchema,
64
- outputSchema: captureContract.outputSchema,
65
- annotations: captureContract.annotations,
66
- }, async (input, context) => {
67
- const scenario = processScenarioSchema.parse(input);
65
+ const registerProcessTools = ({ server, session, logger, processPolicy, captureContract, permissionAuthority, processCaptureElicitation, }) => {
66
+ server.registerTool(captureContract.name, toolRegistrationOptions(captureContract), async (input, context) => {
67
+ const parsedInput = safeParseToolInput(processScenarioSchema, input, captureContract.name);
68
+ if (!parsedInput.ok)
69
+ return toCallToolResult(parsedInput, captureContract);
70
+ const scenario = parsedInput.value;
68
71
  if (permissionAuthority !== undefined) {
69
- const authorized = await permissionAuthority.authorize({
70
- capability: "process_capture",
71
- roots: [scenario.working_directory, ...scenario.filesystem_roots],
72
- executables: [scenario.executable],
73
- environment_names: [
74
- ...Object.keys(scenario.environment),
75
- ...scenario.inherit_environment,
76
- ],
77
- network: scenario.network_access === "host" ? "external" : "none",
78
- mount: false,
79
- operation_identity: `capture_process_scenario:${scenario.executable}`,
80
- }, "read");
72
+ const request = processCapturePermissionRequest(scenario);
73
+ const authorized = processCaptureElicitation === undefined
74
+ ? await permissionAuthority.authorize(request, "read")
75
+ : await authorizeProcessCaptureWithElicitation(permissionAuthority, request, context, processCaptureElicitation);
76
+ if (isInputRequiredResult(authorized))
77
+ return authorized;
81
78
  if (!authorized.ok)
82
79
  return toCallToolResult(permissionFailure(authorized), captureContract);
83
80
  }
@@ -108,151 +105,24 @@ const registerProcessTools = ({ server, session, logger, processPolicy, captureC
108
105
  return toCallToolResult(ok(evidence), captureContract);
109
106
  });
110
107
  };
111
- const registerEvidenceTools = ({ server, session, exportContract, importContract, filePolicy, permissionAuthority, }) => {
112
- server.registerTool(exportContract.name, {
113
- description: exportContract.description,
114
- inputSchema: exportContract.inputSchema,
115
- outputSchema: exportContract.outputSchema,
116
- annotations: exportContract.annotations,
117
- }, async (input) => {
118
- const parsed = z
119
- .object({
120
- path: z.string().min(1).optional(),
121
- overwrite: z.boolean().default(false),
122
- })
123
- .parse(input);
124
- const bundle = session.exportEvidenceBundle();
125
- if (parsed.path === undefined)
126
- return toCallToolResult(ok(bundle), exportContract);
127
- if (permissionAuthority !== undefined) {
128
- const authorized = await permissionAuthority.authorize({
129
- capability: "evidence_write",
130
- roots: [parsed.path],
131
- executables: [],
132
- environment_names: [],
133
- network: "none",
134
- mount: false,
135
- operation_identity: `export_evidence:${parsed.path}`,
136
- }, "write");
137
- if (!authorized.ok)
138
- return toCallToolResult(permissionFailure(authorized), exportContract);
139
- }
140
- const written = await writeEvidenceBundle(bundle, parsed.path, parsed.overwrite, filePolicy);
141
- return written.ok
142
- ? toCallToolResult(ok({
143
- path: written.value.path,
144
- bytes: written.value.bytes,
145
- records: bundle.records.length,
146
- }), exportContract)
147
- : toCallToolResult(written, exportContract);
148
- });
149
- server.registerTool(importContract.name, {
150
- description: importContract.description,
151
- inputSchema: importContract.inputSchema,
152
- outputSchema: importContract.outputSchema,
153
- annotations: importContract.annotations,
154
- }, async (input) => {
155
- const path = z.object({ path: z.string().min(1) }).parse(input).path;
156
- if (permissionAuthority !== undefined) {
157
- const authorized = await permissionAuthority.authorize({
158
- capability: "evidence_read",
159
- roots: [path],
160
- executables: [],
161
- environment_names: [],
162
- network: "none",
163
- mount: false,
164
- operation_identity: `import_evidence:${path}`,
165
- }, "read");
166
- if (!authorized.ok)
167
- return toCallToolResult(permissionFailure(authorized), importContract);
168
- }
169
- const loaded = await readEvidenceBundle(path, filePolicy);
170
- if (!loaded.ok)
171
- return toCallToolResult(loaded, importContract);
172
- const imported = session.importEvidenceBundle(loaded.value);
173
- if (imported.ok && imported.value > 0)
174
- server.sendResourceListChanged();
175
- return imported.ok
176
- ? toCallToolResult(ok({
177
- imported: imported.value,
178
- total: session.exportEvidenceBundle().records.length,
179
- }), importContract)
180
- : toCallToolResult(imported, importContract);
181
- });
182
- };
183
- const registerUnknownTools = ({ server, session, contracts: [listContract, recordContract, updateContract, verifyContract], }) => {
184
- server.registerTool(listContract.name, {
185
- description: listContract.description,
186
- inputSchema: listContract.inputSchema,
187
- outputSchema: listContract.outputSchema,
188
- annotations: listContract.annotations,
189
- }, (input) => {
190
- const filters = z
191
- .object({
192
- status: z
193
- .enum([
194
- "open",
195
- "investigating",
196
- "blocked",
197
- "contradicted",
198
- "resolved",
199
- ])
200
- .optional(),
201
- severity: z.enum(["low", "medium", "high", "critical"]).optional(),
202
- domain: z.string().trim().min(1).max(100).optional(),
203
- })
204
- .parse(input);
205
- return toCallToolResult(ok(session.listUnknowns({
206
- ...(filters.status === undefined ? {} : { status: filters.status }),
207
- ...(filters.severity === undefined
208
- ? {}
209
- : { severity: filters.severity }),
210
- ...(filters.domain === undefined ? {} : { domain: filters.domain }),
211
- })), listContract);
212
- });
213
- server.registerTool(recordContract.name, {
214
- description: recordContract.description,
215
- inputSchema: recordContract.inputSchema,
216
- outputSchema: recordContract.outputSchema,
217
- annotations: recordContract.annotations,
218
- }, (input) => {
219
- const recorded = session.recordUnknown(recordUnknownInputSchema.parse(input));
220
- if (recorded.ok)
221
- server.sendResourceListChanged();
222
- return toCallToolResult(recorded, recordContract);
223
- });
224
- server.registerTool(updateContract.name, {
225
- description: updateContract.description,
226
- inputSchema: updateContract.inputSchema,
227
- outputSchema: updateContract.outputSchema,
228
- annotations: updateContract.annotations,
229
- }, (input) => {
230
- const updated = session.updateUnknown(updateUnknownInputSchema.parse(input));
231
- if (updated.ok)
232
- server.sendResourceListChanged();
233
- return toCallToolResult(updated, updateContract);
234
- });
235
- server.registerTool(verifyContract.name, {
236
- description: verifyContract.description,
237
- inputSchema: verifyContract.inputSchema,
238
- outputSchema: verifyContract.outputSchema,
239
- annotations: verifyContract.annotations,
240
- }, (input) => {
241
- const unknownId = z
242
- .object({ unknown_id: z.string().regex(/^unk_[a-f0-9]{64}$/u) })
243
- .parse(input).unknown_id;
244
- return toCallToolResult(session.verifyUnknownResolution(unknownId), verifyContract);
108
+ const registerLifecycleTools = (registration) => {
109
+ const { server, session, contracts, startedAt, availabilityPolicy } = registration;
110
+ registerOpenLifecycleTool(registration);
111
+ registerCloseLifecycleTool(registration);
112
+ registerSessionStatusTool({
113
+ server,
114
+ session,
115
+ contract: contracts[2],
116
+ startedAt,
117
+ availabilityPolicy,
245
118
  });
246
119
  };
247
- const registerLifecycleTools = ({ server, session, logger, contracts, snapshotFilePolicy, startedAt, availabilityPolicy, permissionAuthority, }) => {
248
- const [openContract, closeContract, statusContract] = contracts;
249
- server.registerTool(openContract.name, {
250
- description: openContract.description,
251
- inputSchema: openContract.inputSchema,
252
- outputSchema: openContract.outputSchema,
253
- annotations: openContract.annotations,
254
- }, async (input, context) => {
255
- const parsed = openBinaryInputSchema.parse(input);
120
+ const registerOpenLifecycleTool = ({ server, session, logger, contracts: [openContract], snapshotFilePolicy, permissionAuthority, }) => {
121
+ server.registerTool(openContract.name, toolRegistrationOptions(openContract), async (input, context) => {
122
+ const parsedInput = safeParseToolInput(openBinaryInputSchema, input, openContract.name);
123
+ if (!parsedInput.ok)
124
+ return toCallToolResult(parsedInput, openContract);
125
+ const parsed = parsedInput.value;
256
126
  let snapshot;
257
127
  if (parsed.snapshot_path !== undefined) {
258
128
  if (permissionAuthority !== undefined) {
@@ -298,56 +168,55 @@ const registerLifecycleTools = ({ server, session, logger, contracts, snapshotFi
298
168
  }, openContract)
299
169
  : toCallToolResult(opened, openContract);
300
170
  });
301
- server.registerTool(closeContract.name, {
302
- description: closeContract.description,
303
- inputSchema: closeContract.inputSchema,
304
- outputSchema: closeContract.outputSchema,
305
- annotations: closeContract.annotations,
306
- }, async (input) => {
307
- const parsed = closeBinaryInputSchema.parse(input);
308
- if (parsed.snapshot_path !== undefined) {
309
- if (permissionAuthority !== undefined) {
310
- const authorized = await permissionAuthority.authorize({
311
- capability: "snapshot_write",
312
- roots: [parsed.snapshot_path],
313
- executables: [],
314
- environment_names: [],
315
- network: "none",
316
- mount: false,
317
- operation_identity: `close_binary:snapshot:${parsed.snapshot_path}`,
318
- }, "write");
319
- if (!authorized.ok)
320
- return toCallToolResult(permissionFailure(authorized), closeContract);
321
- }
322
- const snapshot = session.exportAnalysisSnapshot();
323
- if (!snapshot.ok)
324
- return toCallToolResult(snapshot, closeContract);
325
- const written = await writeAnalysisSnapshot(snapshot.value, parsed.snapshot_path, parsed.overwrite, snapshotFilePolicy);
326
- if (!written.ok)
327
- return toCallToolResult(written, closeContract);
171
+ };
172
+ const registerCloseLifecycleTool = ({ server, session, logger, contracts: [, closeContract], snapshotFilePolicy, permissionAuthority, }) => {
173
+ server.registerTool(closeContract.name, toolRegistrationOptions(closeContract), async (input) => {
174
+ const parsedInput = safeParseToolInput(closeBinaryInputSchema, input, closeContract.name);
175
+ if (!parsedInput.ok)
176
+ return toCallToolResult(parsedInput, closeContract);
177
+ const parsed = parsedInput.value;
178
+ if (parsed.snapshot_path === undefined) {
328
179
  const closed = await logToolExecution(logger, closeContract.name, () => session.close());
329
180
  if (closed.ok)
330
181
  server.sendToolListChanged();
331
- return closed.ok
332
- ? toCallToolResult(ok({
333
- path: written.value.path,
334
- bytes: written.value.bytes,
335
- entries: snapshot.value.entries.length,
336
- }), closeContract)
337
- : toCallToolResult(closed, closeContract);
182
+ return toCallToolResult(closed, closeContract);
183
+ }
184
+ if (permissionAuthority !== undefined) {
185
+ const authorized = await permissionAuthority.authorize({
186
+ capability: "snapshot_write",
187
+ roots: [parsed.snapshot_path],
188
+ executables: [],
189
+ environment_names: [],
190
+ network: "none",
191
+ mount: false,
192
+ operation_identity: `close_binary:snapshot:${parsed.snapshot_path}`,
193
+ }, "write");
194
+ if (!authorized.ok)
195
+ return toCallToolResult(permissionFailure(authorized), closeContract);
338
196
  }
197
+ const snapshot = session.exportAnalysisSnapshot();
198
+ if (!snapshot.ok)
199
+ return toCallToolResult(snapshot, closeContract);
200
+ const written = await writeAnalysisSnapshot(snapshot.value, parsed.snapshot_path, parsed.overwrite, snapshotFilePolicy);
201
+ if (!written.ok)
202
+ return toCallToolResult(written, closeContract);
339
203
  const closed = await logToolExecution(logger, closeContract.name, () => session.close());
340
204
  if (closed.ok)
341
205
  server.sendToolListChanged();
342
- return toCallToolResult(closed, closeContract);
206
+ return closed.ok
207
+ ? toCallToolResult(ok({
208
+ path: written.value.path,
209
+ bytes: written.value.bytes,
210
+ entries: snapshot.value.entries.length,
211
+ }), closeContract)
212
+ : toCallToolResult(closed, closeContract);
343
213
  });
344
- registerSessionStatusTool(server, session, statusContract, startedAt, availabilityPolicy);
345
214
  };
346
215
  export const registerSessionTools = (server, session, logger, options = {}) => {
347
216
  const processPolicy = options.processPolicy ?? DENY_PROCESS_POLICY;
348
217
  const evidenceFilePolicy = options.evidenceFilePolicy ?? DENY_EVIDENCE_FILE_POLICY;
349
218
  const analysisSnapshotFilePolicy = options.analysisSnapshotFilePolicy ?? DENY_EVIDENCE_FILE_POLICY;
350
- const [openContract, closeContract, statusContract, exportContract, importContract, captureContract, compareContract, compareArtifactsContract, compareFunctionsContract, compareBundlesContract, changedBehaviorContract, callPathContract, staticRuntimeContract, reconstructionContract, listUnknownContract, recordUnknownContract, updateUnknownContract, verifyUnknownContract,] = SESSION_TOOL_CONTRACTS;
219
+ const [openContract, closeContract, statusContract, exportContract, importContract, captureContract, compareContract, compareArtifactsContract, compareFunctionsContract, compareBundlesContract, changedBehaviorContract, callPathContract, staticRuntimeContract, reconstructionContract,] = SESSION_TOOL_CONTRACTS;
351
220
  registerLifecycleTools({
352
221
  server,
353
222
  session,
@@ -355,13 +224,7 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
355
224
  contracts: [openContract, closeContract, statusContract],
356
225
  snapshotFilePolicy: analysisSnapshotFilePolicy,
357
226
  startedAt: options.startedAt ?? new Date().toISOString(),
358
- availabilityPolicy: options.availabilityPolicy ??
359
- (() => ({
360
- processCaptureEnabled: processPolicy.enabled,
361
- evidenceFileRoots: evidenceFilePolicy.roots.length,
362
- browserObservationEnabled: false,
363
- electronObservationEnabled: false,
364
- })),
227
+ availabilityPolicy: sessionAvailabilityPolicy(options.availabilityPolicy, processPolicy, evidenceFilePolicy),
365
228
  ...(options.permissionAuthority === undefined
366
229
  ? {}
367
230
  : { permissionAuthority: options.permissionAuthority }),
@@ -385,11 +248,14 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
385
248
  ...(options.permissionAuthority === undefined
386
249
  ? {}
387
250
  : { permissionAuthority: options.permissionAuthority }),
251
+ ...(options.processCaptureElicitation === undefined
252
+ ? {}
253
+ : { processCaptureElicitation: options.processCaptureElicitation }),
388
254
  });
389
255
  registerProcessComparisonTool(server, session, compareContract);
390
256
  registerArtifactComparisonTool(server, session, compareArtifactsContract);
391
257
  registerFunctionComparisonTool(server, session, compareFunctionsContract);
392
- registerBundleComparisonTool(server, session, compareBundlesContract);
258
+ registerBundleComparisonTool(server, session, compareBundlesContract, evidenceFilePolicy);
393
259
  const investigationContracts = [
394
260
  changedBehaviorContract,
395
261
  callPathContract,
@@ -411,11 +277,6 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
411
277
  registerUnknownTools({
412
278
  server,
413
279
  session,
414
- contracts: [
415
- listUnknownContract,
416
- recordUnknownContract,
417
- updateUnknownContract,
418
- verifyUnknownContract,
419
- ],
280
+ contracts: SESSION_TOOL_CONTRACTS,
420
281
  });
421
282
  };
@@ -0,0 +1,10 @@
1
+ /** Select configured availability reporting or the target-free defaults. */
2
+ export const sessionAvailabilityPolicy = (configured, processPolicy, evidenceFilePolicy) => configured ??
3
+ (() => ({
4
+ processCaptureEnabled: processPolicy.enabled,
5
+ evidenceFileRoots: evidenceFilePolicy.roots.length,
6
+ browserObservationEnabled: false,
7
+ electronObservationEnabled: false,
8
+ javascriptReplayEnabled: false,
9
+ managedRuntimeEnabled: false,
10
+ }));
@@ -1,22 +1,17 @@
1
- import canonicalize from "canonicalize";
2
- import { EvidenceIntegrityError } from "../domain/errors.js";
3
- import { parseEvidence } from "../domain/evidence.js";
1
+ import { EvidenceIntegrityError, EvidenceReferenceError, } from "../domain/errors.js";
4
2
  import { err, ok } from "../domain/result.js";
5
- /** Resolve caller-supplied records to their immutable session-owned values. */
6
- export const resolveSessionEvidence = (session, input) => {
7
- const supplied = Array.isArray(input) ? input : [input];
8
- const authoritative = [];
9
- for (const item of supplied) {
10
- const parsed = parseEvidence(item);
11
- const owned = session.evidenceById(parsed.evidence_id);
12
- if (owned === undefined || canonicalize(owned) !== canonicalize(parsed))
13
- return err(new EvidenceIntegrityError("Comparison input does not match its session-owned Evidence"));
14
- authoritative.push(owned);
3
+ /** Resolve bounded IDs to authoritative records with exact semantic identity. */
4
+ export const resolveSessionEvidenceIds = (session, evidenceIds, expected) => {
5
+ const records = [];
6
+ for (const evidenceId of evidenceIds) {
7
+ const record = session.evidenceById(evidenceId);
8
+ if (record === undefined)
9
+ return err(new EvidenceReferenceError(evidenceId, "missing", expected.operation, null));
10
+ if (record.operation !== expected.operation)
11
+ return err(new EvidenceReferenceError(evidenceId, "wrong_operation", expected.operation, record.operation));
12
+ if (record.predicate_type !== expected.predicate)
13
+ return err(new EvidenceReferenceError(evidenceId, "wrong_predicate", expected.predicate, record.predicate_type));
14
+ records.push(record);
15
15
  }
16
- return ok(authoritative);
17
- };
18
- /** Check exact ownership for a single Evidence record. */
19
- export const isSessionEvidence = (session, input) => {
20
- const owned = session.evidenceById(input.evidence_id);
21
- return owned !== undefined && canonicalize(owned) === canonicalize(input);
16
+ return ok(records);
22
17
  };