rea-agents 6.1.0 → 6.2.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 (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,35 +1,37 @@
1
1
  import { McpServer, isCallToolResult, isJSONRPCRequest, isJSONRPCNotification, isJSONRPCResultResponse, } from "@modelcontextprotocol/server";
2
2
  import { analysisErrorProjectionSchema } from "../contracts/errorSchemas.js";
3
- import { parseMcpResponseBudget } from "../config/mcpResponseBudget.js";
4
3
  import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
5
4
  import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
6
5
  import { createEvidence } from "../domain/evidence.js";
7
6
  import { jsonObjectSchema } from "../domain/jsonValue.js";
8
- import { toErrorToolResult } from "./toolResult.js";
9
- import { encodeToolResult, MCP_RESULT_BUDGET_BYTES, } from "./toolResultEncoding.js";
7
+ import { encodeToolResult } from "./toolResultEncoding.js";
10
8
  /** Bind oversized MCP error recovery to this server's Evidence ledger. */
11
9
  export class EvidenceMcpServer extends McpServer {
12
10
  recordEvidence;
13
- constructor(info, options, recordEvidence) {
11
+ delivery;
12
+ constructor(info, options, recordEvidence, delivery) {
14
13
  super(info, options);
15
14
  this.recordEvidence = recordEvidence;
15
+ this.delivery = delivery;
16
16
  }
17
17
  /** Preserve the SDK transport lifecycle while retaining oversized errors. */
18
18
  connect(transport) {
19
- return super.connect(new ErrorEvidenceTransport(transport, this.recordEvidence));
19
+ return super.connect(new ErrorEvidenceTransport(transport, this.recordEvidence, this.delivery));
20
20
  }
21
21
  }
22
22
  class ErrorEvidenceTransport {
23
23
  transport;
24
24
  recordEvidence;
25
+ delivery;
25
26
  onclose;
26
27
  onerror;
27
28
  onmessage;
28
29
  hasPerRequestStream;
29
30
  pendingTools = new Map();
30
- constructor(transport, recordEvidence) {
31
+ constructor(transport, recordEvidence, delivery) {
31
32
  this.transport = transport;
32
33
  this.recordEvidence = recordEvidence;
34
+ this.delivery = delivery;
33
35
  if (transport.hasPerRequestStream !== undefined)
34
36
  this.hasPerRequestStream = transport.hasPerRequestStream;
35
37
  transport.onmessage = (message, extra) => {
@@ -83,7 +85,18 @@ class ErrorEvidenceTransport {
83
85
  : undefined;
84
86
  const tool = id === undefined ? undefined : this.pendingTools.get(id);
85
87
  try {
86
- await this.transport.send(this.recoverError(message, tool), options);
88
+ const recovered = this.recoverError(message, tool);
89
+ if (isJSONRPCResultResponse(recovered) &&
90
+ isCallToolResult(recovered.result) &&
91
+ recovered.result.isError === true) {
92
+ // Keep the complete typed JSON in content. Error projections are not
93
+ // success outputSchema data; oversized recovery must consume their
94
+ // private structured carrier before it is removed from the wire.
95
+ const { structuredContent: _diagnostic, ...result } = recovered.result;
96
+ await this.transport.send({ ...recovered, result }, options);
97
+ }
98
+ else
99
+ await this.transport.send(recovered, options);
87
100
  }
88
101
  finally {
89
102
  if (!isJSONRPCRequest(message) && id !== undefined)
@@ -97,11 +110,9 @@ class ErrorEvidenceTransport {
97
110
  message.result.structuredContent === undefined)
98
111
  return message;
99
112
  const structured = jsonObjectSchema.parse(message.result.structuredContent);
100
- const configured = parseMcpResponseBudget(process.env.REA_MCP_MAX_RESPONSE_BYTES);
101
- const budget = configured.ok && configured.value !== undefined
102
- ? configured.value - 1024
103
- : MCP_RESULT_BUDGET_BYTES;
104
- const encoded = encodeToolResult(structured, budget);
113
+ const budget = this.delivery.resultBudgetBytes;
114
+ // The delivered error omits structuredContent, so only its text counts.
115
+ const encoded = encodeToolResult(structured, budget, "text");
105
116
  if (encoded.ok)
106
117
  return message;
107
118
  const operation = tool ?? "mcp_tool_error";
@@ -139,8 +150,8 @@ class ErrorEvidenceTransport {
139
150
  }, {
140
151
  remediationAction: retained
141
152
  ? "Export the retained original error through export_evidence_bundle to a caller-selected path. The connection remains usable."
142
- : "Configure a larger REA_MCP_MAX_RESPONSE_BYTES and matching client receive buffer, then retry. The original error could not be retained by this server.",
153
+ : "Restart REA with a larger REA_MCP_MAX_RESPONSE_BYTES and matching client receive buffer, then retry. The original error could not be retained by this server.",
143
154
  });
144
- return { ...message, result: toErrorToolResult(failure) };
155
+ return { ...message, result: this.delivery.toErrorToolResult(failure) };
145
156
  }
146
157
  }
@@ -1,10 +1,14 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { createEvmInterfaceService } from "../composition/evm.js";
2
3
  import { registerEvmTools } from "./registerEvmTools.js";
3
4
  import { registerRecordedCrashTools } from "./registerRecordedCrashTools.js";
4
5
  import { createRecordedCrashService } from "../composition/binaryDiagnostics.js";
6
+ import { registerAnalysisViewTool } from "./registerAnalysisViewTool.js";
5
7
  import { registerBinaryDiagnosticsTools } from "./registerBinaryDiagnosticsTools.js";
6
8
  import { createBinaryLayoutService } from "../composition/binaryDiagnostics.js";
7
9
  import { EvidenceMcpServer } from "./EvidenceMcpServer.js";
10
+ import { createToolResultDelivery, } from "./toolResult.js";
11
+ import { parseMcpResponseBudget } from "../config/mcpResponseBudget.js";
8
12
  import { isAbsolute } from "node:path";
9
13
  import { PRODUCT_IDENTITY } from "../identity.js";
10
14
  import { silentLogger } from "../logger.js";
@@ -42,35 +46,27 @@ import { registerSessionTools } from "./registerSessionTools.js";
42
46
  import { sessionAvailabilityPolicy } from "./sessionAvailabilityPolicy.js";
43
47
  const TARGET_FREE_INSTRUCTIONS = "REA provides reverse-engineering tools for local artifacts, native binaries, managed code, browser pages, and runtimes. Use the tool that directly answers the question; discover targets or inspect inventory only when needed. Tool results include inline Evidence and report their coverage and limitations.";
44
48
  const ACTIVE_TARGET_INSTRUCTIONS = "REA analyzes the active reverse-engineering target. Use the analysis tool that answers the question directly. Search or list symbols when discovery is needed; analyze_function provides a function dossier, and focused procedure tools return individual facets.";
45
- const installSessionToolAvailability = (server, session, options) => {
49
+ const installSessionToolAvailability = (session, options, environment) => {
46
50
  if (session === undefined)
47
51
  return undefined;
52
+ const linux = process.platform === "linux";
53
+ const linuxX64 = linux && process.arch === "x64";
54
+ const pwntools = linuxX64 && isAbsolute(environment.REA_PWNTOOLS_PYTHON ?? "");
48
55
  const policy = sessionAvailabilityPolicy(options.availabilityPolicy, {
49
56
  optionalProviderLoadFailures: options.optionalProviderLoadFailures,
50
57
  optionalFeatures: {
51
- evmInterfaceEnabled: options.evmInterface !== undefined ||
52
- (process.platform === "linux" && process.arch === "x64"),
58
+ evmInterfaceEnabled: options.evmInterface !== undefined || linuxX64,
53
59
  webModuleResolutionEnabled: options.webModuleTrace !== undefined ||
54
- isAbsolute(process.env.REA_BROWSER_EXECUTABLE ?? ""),
55
- recordedCrashEnabled: options.recordedCrash !== undefined ||
56
- (process.platform === "linux" &&
57
- process.arch === "x64" &&
58
- isAbsolute(process.env.REA_PWNTOOLS_PYTHON ?? "")),
59
- binaryLayoutEnabled: options.binaryLayout !== undefined ||
60
- (process.platform === "linux" &&
61
- process.arch === "x64" &&
62
- isAbsolute(process.env.REA_PWNTOOLS_PYTHON ?? "")),
60
+ isAbsolute(environment.REA_BROWSER_EXECUTABLE ?? ""),
61
+ recordedCrashEnabled: options.recordedCrash !== undefined || pwntools,
62
+ binaryLayoutEnabled: options.binaryLayout !== undefined || pwntools,
63
63
  firmwareInspectionEnabled: options.firmwareAnalysis !== undefined ||
64
- (process.platform === "linux" &&
65
- isAbsolute(process.env.REA_BINWALK_COMMAND ?? "")),
64
+ (linux && isAbsolute(environment.REA_BINWALK_COMMAND ?? "")),
66
65
  firmwareExtractionEnabled: options.firmwareAnalysis !== undefined ||
67
- (process.platform === "linux" &&
68
- isAbsolute(process.env.REA_UNBLOB_COMMAND ?? "")),
66
+ (linux && isAbsolute(environment.REA_UNBLOB_COMMAND ?? "")),
69
67
  browserObservationEnabled: options.browserObservation !== undefined,
70
68
  javascriptRecoveryEnabled: options.javascriptRecovery !== undefined ||
71
- (process.platform === "linux" &&
72
- process.arch === "x64" &&
73
- isAbsolute(process.env.REA_WAKARU_COMMAND ?? "")),
69
+ (linuxX64 && isAbsolute(environment.REA_WAKARU_COMMAND ?? "")),
74
70
  browserScenarioEnabled: options.browserScenarioCapture !== undefined,
75
71
  electronObservationEnabled: options.electronObservation !== undefined,
76
72
  electronAutomationEnabled: options.electronActiveObservation !== undefined,
@@ -81,7 +77,7 @@ const installSessionToolAvailability = (server, session, options) => {
81
77
  policy,
82
78
  };
83
79
  };
84
- const createMcpServer = (session) => new EvidenceMcpServer({
80
+ const createMcpServer = (session, delivery) => new EvidenceMcpServer({
85
81
  name: PRODUCT_IDENTITY.mcpServerKey,
86
82
  version: PRODUCT_IDENTITY.packageVersion,
87
83
  }, {
@@ -91,25 +87,29 @@ const createMcpServer = (session) => new EvidenceMcpServer({
91
87
  : TARGET_FREE_INSTRUCTIONS,
92
88
  }, session === undefined
93
89
  ? undefined
94
- : (evidence) => session.recordEvidence(evidence));
90
+ : (evidence) => session.recordEvidence(evidence), delivery);
95
91
  /**
96
92
  * Construct one MCP server without acquiring subprocess resources.
97
93
  * Supplying a session adds target lifecycle tools; omitting it retains the
98
94
  * fixed-target seam used by focused tests and embedders.
99
95
  */
100
96
  export const createServer = (analysis, session, options = {}) => {
97
+ const environment = snapshotEnvironment(options.environment ?? process.env);
98
+ const delivery = selectToolResultDelivery(environment, options.delivery);
99
+ const selectedOptions = { ...options, environment, delivery };
101
100
  const startedAt = new Date().toISOString();
102
101
  const logger = options.logger ?? silentLogger;
103
- const server = createMcpServer(session);
104
- const android = options.androidAnalysis ?? createAndroidAnalysisProvider();
105
- const availability = installSessionToolAvailability(server, session, options);
102
+ const server = createMcpServer(session, delivery);
103
+ const android = options.androidAnalysis ?? createAndroidAnalysisProvider(environment);
104
+ const availability = installSessionToolAvailability(session, selectedOptions, environment);
106
105
  const toolLogger = logger.child({ layer: "server" });
107
106
  const { evidenceById, activeTarget, recordEvidence, recordEvidenceWithUnknown, } = createSessionRecorders(server, session);
108
107
  const toolContext = {
109
108
  server,
110
109
  analysis,
111
110
  session,
112
- options,
111
+ options: selectedOptions,
112
+ environment,
113
113
  logger: toolLogger,
114
114
  evidenceById,
115
115
  activeTarget,
@@ -131,21 +131,12 @@ export const createServer = (analysis, session, options = {}) => {
131
131
  if (result.status === "rejected")
132
132
  throw result.reason;
133
133
  };
134
- registerAndroidTools(server, new AndroidAnalysisService(android), toolLogger, recordEvidence);
135
- registerBinaryDiagnosticsTools(server, options.binaryLayout ?? createBinaryLayoutService(), toolLogger, recordEvidence);
136
- registerEvmTools(server, options.evmInterface ?? createEvmInterfaceService(), toolLogger, recordEvidence);
137
- registerRecordedCrashTools(server, options.recordedCrash ?? createRecordedCrashService(), toolLogger, recordEvidence);
138
- registerFirmwareTools(server, new FirmwareAnalysisService(options.firmwareAnalysis ?? createFirmwareAnalysisProvider()), toolLogger, recordEvidence);
134
+ registerConfiguredAnalysisTools(toolContext, android);
139
135
  registerObservationTools(toolContext);
140
- registerWebModuleTool(server, options.webModuleTrace ?? createWebModuleTraceService(), toolLogger, recordEvidence);
141
- registerWebSourceLocationTool(server, options.webSourceLocation ?? createWebSourceLocationService(), toolLogger, recordEvidence);
142
- registerWebRuntimeTools(server, options.webRuntime ?? createWebRuntimeService(), toolLogger, recordEvidence);
143
- registerWebNetworkCaptureTool(server, options.webNetworkCapture ?? createWebNetworkCaptureService(), toolLogger, recordEvidence);
144
- registerJavaScriptRecoveryTool(server, new JavaScriptRecoveryService(options.javascriptRecovery ?? createJavaScriptRecoveryProvider()), toolLogger, recordEvidence);
145
136
  registerGuidedPrompts(server, analysis, session);
146
137
  if (session !== undefined) {
147
138
  registerSessionTools(server, session, toolLogger, {
148
- ...options,
139
+ ...selectedOptions,
149
140
  ...(availability === undefined
150
141
  ? {}
151
142
  : { availabilityPolicy: availability.policy }),
@@ -155,6 +146,28 @@ export const createServer = (analysis, session, options = {}) => {
155
146
  }
156
147
  return server;
157
148
  };
149
+ const selectToolResultDelivery = (environment, selected) => {
150
+ if (selected !== undefined)
151
+ return selected;
152
+ const configured = parseMcpResponseBudget(environment.REA_MCP_MAX_RESPONSE_BYTES);
153
+ if (!configured.ok)
154
+ throw configured.error;
155
+ return createToolResultDelivery(configured.value);
156
+ };
157
+ const registerConfiguredAnalysisTools = ({ server, options, environment, logger: toolLogger, evidenceById, recordEvidence, }, android) => {
158
+ registerAndroidTools(server, new AndroidAnalysisService(android), toolLogger, recordEvidence);
159
+ registerBinaryDiagnosticsTools(server, options.binaryLayout ?? createBinaryLayoutService(environment), toolLogger, recordEvidence);
160
+ registerAnalysisViewTool(server, toolLogger, evidenceById, recordEvidence);
161
+ registerEvmTools(server, options.evmInterface ?? createEvmInterfaceService(environment), toolLogger, recordEvidence);
162
+ registerRecordedCrashTools(server, options.recordedCrash ?? createRecordedCrashService(environment), toolLogger, recordEvidence);
163
+ registerFirmwareTools(server, new FirmwareAnalysisService(options.firmwareAnalysis ?? createFirmwareAnalysisProvider(environment)), toolLogger, recordEvidence);
164
+ registerWebModuleTool(server, options.webModuleTrace ?? createWebModuleTraceService(environment), toolLogger, recordEvidence);
165
+ registerWebSourceLocationTool(server, options.webSourceLocation ?? createWebSourceLocationService(environment), toolLogger, recordEvidence);
166
+ registerWebRuntimeTools(server, options.webRuntime ?? createWebRuntimeService(), toolLogger, recordEvidence);
167
+ registerWebNetworkCaptureTool(server, options.webNetworkCapture ?? createWebNetworkCaptureService(environment), toolLogger, recordEvidence);
168
+ registerJavaScriptRecoveryTool(server, new JavaScriptRecoveryService(options.javascriptRecovery ??
169
+ createJavaScriptRecoveryProvider(environment)), toolLogger, recordEvidence);
170
+ };
158
171
  const createSessionRecorders = (server, session) => ({
159
172
  evidenceById: session === undefined
160
173
  ? undefined
@@ -1,12 +1,19 @@
1
1
  import { CLIENT_CAPABILITIES_META_KEY, CLIENT_INFO_META_KEY, PROTOCOL_VERSION_META_KEY, } from "@modelcontextprotocol/server";
2
- /** Client metadata bound to the current SDK request rather than server-global state. */
3
- export const mcpClientMetadata = (context) => {
2
+ /**
3
+ * Client metadata for the current request. A 2026-era request carries it in
4
+ * its per-request envelope; a 2025-era connection sends no envelope, so its
5
+ * `initialize` handshake supplies the values.
6
+ */
7
+ export const mcpClientMetadata = (context, connection) => {
4
8
  const envelope = context.mcpReq.envelope;
5
- const client = implementation(mcpEnvelopeValue(envelope, CLIENT_INFO_META_KEY));
6
- const protocolVersion = mcpEnvelopeValue(envelope, PROTOCOL_VERSION_META_KEY);
9
+ // The SDK deprecates these accessors only in favor of the envelope, which
10
+ // 2025-era requests do not carry; they still return initialize values.
11
+ const value = (key, initialized) => envelope === undefined ? initialized() : mcpEnvelopeValue(envelope, key);
12
+ const client = implementation(value(CLIENT_INFO_META_KEY, () => connection.getClientVersion()));
13
+ const protocolVersion = value(PROTOCOL_VERSION_META_KEY, () => connection.getNegotiatedProtocolVersion());
7
14
  return {
8
15
  ...(client === undefined ? {} : { client }),
9
- clientFeatures: capabilityFeatures(mcpEnvelopeValue(envelope, CLIENT_CAPABILITIES_META_KEY)),
16
+ clientFeatures: capabilityFeatures(value(CLIENT_CAPABILITIES_META_KEY, () => connection.getClientCapabilities())),
10
17
  ...(typeof protocolVersion === "string" ? { protocolVersion } : {}),
11
18
  };
12
19
  };
@@ -2,13 +2,10 @@ import { z } from "zod";
2
2
  import { uniqueSorted } from "../domain/canonicalOrdering.js";
3
3
  import { artifactInventoryResultSchema } from "../domain/artifactGraph.js";
4
4
  import { artifactInspectionResultSchema } from "../domain/artifactInspection.js";
5
- import { parseProcessCapture } from "../domain/process/processCapture.js";
5
+ import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
6
6
  const documentListSchema = z.array(z.string().min(1));
7
7
  const providerStatusSchema = z.object({
8
- providers: z.array(z.object({ id: z.string().min(1) })),
9
- analysis_provider_candidates: z
10
- .array(z.object({ provider: z.object({ id: z.string().min(1) }) }))
11
- .optional(),
8
+ analysis_provider_candidates: z.array(z.object({ provider: z.object({ id: z.string().min(1) }) })),
12
9
  });
13
10
  /** Build live completion over the active provider and session ledger. */
14
11
  export const createPromptCompletionSource = (analysis, session) => ({
@@ -74,9 +71,7 @@ const providerCandidates = (session) => {
74
71
  const parsed = providerStatusSchema.safeParse(session.status());
75
72
  if (!parsed.success)
76
73
  return [];
77
- const candidates = (parsed.data.analysis_provider_candidates?.length ?? 0) > 0
78
- ? (parsed.data.analysis_provider_candidates?.map(({ provider }) => provider.id) ?? [])
79
- : parsed.data.providers.map(({ id }) => id);
74
+ const candidates = parsed.data.analysis_provider_candidates.map(({ provider }) => provider.id);
80
75
  return ["auto", ...candidates];
81
76
  };
82
77
  const evidenceCandidates = (kind, session) => {
@@ -0,0 +1,15 @@
1
+ import { inspectAnalysisView } from "../application/analysisView/AnalysisViewService.js";
2
+ import { toolContract } from "../contracts/toolContracts.js";
3
+ import { logToolExecution } from "./toolLogging.js";
4
+ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
5
+ /** Bind selected-view projection to its named contract and session Evidence owner. */
6
+ export const registerAnalysisViewTool = (server, logger, evidenceById, recordEvidence) => {
7
+ const contract = toolContract("inspect_analysis_view");
8
+ server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
9
+ const result = await logToolExecution(logger, contract.name, () => Promise.resolve(inspectAnalysisView(input, evidenceById)));
10
+ if (!result.ok)
11
+ return server.delivery.toCallToolResult(result, contract);
12
+ const recorded = recordEvidence?.(result.value);
13
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
14
+ });
15
+ };
@@ -2,7 +2,6 @@ import { AndroidAnalysisService } from "../application/android/AndroidAnalysisSe
2
2
  import { toolContract } from "../contracts/toolContracts.js";
3
3
  import { logToolExecution } from "./toolLogging.js";
4
4
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
5
- import { toCallToolResult, toEvidenceToolResult } from "./toolResult.js";
6
5
  /** Bind Android handlers to their exact named contracts through shared workflows. */
7
6
  export const registerAndroidTools = (server, service, logger, recordEvidence) => {
8
7
  const handler = (contract) => {
@@ -10,9 +9,9 @@ export const registerAndroidTools = (server, service, logger, recordEvidence) =>
10
9
  return async (input, context) => {
11
10
  const result = await logToolExecution(logger, name, () => service.execute(name, input, { signal: context.mcpReq.signal }));
12
11
  if (!result.ok)
13
- return toCallToolResult(result, contract);
12
+ return server.delivery.toCallToolResult(result, contract);
14
13
  const recorded = recordEvidence?.(result.value);
15
- return toEvidenceToolResult(result.value, contract, recorded);
14
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
16
15
  };
17
16
  };
18
17
  const packageContract = toolContract("inspect_android_package");
@@ -5,7 +5,6 @@ import { applicationToolContract } from "../../contracts/applicationToolContract
5
5
  import { javaScriptExportShapeComparisonResultSchema } from "../../domain/javascript/javascriptExportShapeComparisonSchemas.js";
6
6
  import { logToolExecution } from "../toolLogging.js";
7
7
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
8
- import { toCallToolResult } from "../toolResult.js";
9
8
  import { recordResult } from "./helpers.js";
10
9
  const contract = applicationToolContract("compare_javascript_export_shapes");
11
10
  /** Register the execution-free exact JavaScript export-shape comparison. */
@@ -13,19 +12,19 @@ export const registerCompareJavaScriptExportShapesTool = (server, options) => {
13
12
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
14
13
  const resolved = resolvePairedEvidenceRequest(input, options.evidenceById);
15
14
  if (!resolved.ok)
16
- return toCallToolResult(resolved, contract);
15
+ return server.delivery.toCallToolResult(resolved, contract);
17
16
  const parsed = resolved.value;
18
17
  const result = await logToolExecution(options.logger, contract.name, () => Promise.resolve(compareJavaScriptExportShapesEvidenceValidated(parsed)));
19
18
  if (!result.ok)
20
- return toCallToolResult(result, contract);
19
+ return server.delivery.toCallToolResult(result, contract);
21
20
  const recorded = recordSessionEvidenceSources(options.recordEvidence, [
22
21
  parsed.left,
23
22
  parsed.right,
24
23
  ]);
25
24
  if (!recorded.ok)
26
- return toCallToolResult(recorded, contract);
25
+ return server.delivery.toCallToolResult(recorded, contract);
27
26
  const comparison = javaScriptExportShapeComparisonResultSchema.parse(result.value.normalized_result);
28
27
  const unknown = comparison.summary.unknown > 0;
29
- return recordResult(options, contract, result.value, unknown ? "javascript-export-shape" : undefined);
28
+ return recordResult({ ...options, delivery: server.delivery }, contract, result.value, unknown ? "javascript-export-shape" : undefined);
30
29
  });
31
30
  };
@@ -5,7 +5,6 @@ import { applicationToolContract } from "../../contracts/applicationToolContract
5
5
  import { sourceToBundleComparisonResultSchema } from "../../domain/javascript/sourceToBundleComparisonSchemas.js";
6
6
  import { logToolExecution } from "../toolLogging.js";
7
7
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
8
- import { toCallToolResult } from "../toolResult.js";
9
8
  import { recordResult } from "./helpers.js";
10
9
  const contract = applicationToolContract("compare_source_to_bundle");
11
10
  /** Register conservative historical-source to bundle comparison. */
@@ -13,18 +12,18 @@ export const registerCompareSourceToBundleTool = (server, options) => {
13
12
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
14
13
  const resolved = resolveApplicationEvidenceRequest(input, options.evidenceById);
15
14
  if (!resolved.ok)
16
- return toCallToolResult(resolved, contract);
15
+ return server.delivery.toCallToolResult(resolved, contract);
17
16
  const parsed = resolved.value;
18
17
  const result = await logToolExecution(options.logger, contract.name, () => Promise.resolve(compareSourceToBundleEvidenceValidated(parsed)));
19
18
  if (!result.ok)
20
- return toCallToolResult(result, contract);
19
+ return server.delivery.toCallToolResult(result, contract);
21
20
  const recorded = recordSessionEvidenceSources(options.recordEvidence, [
22
21
  parsed.application,
23
22
  ]);
24
23
  if (!recorded.ok)
25
- return toCallToolResult(recorded, contract);
24
+ return server.delivery.toCallToolResult(recorded, contract);
26
25
  const comparison = sourceToBundleComparisonResultSchema.parse(result.value.normalized_result);
27
- return recordResult(options, contract, result.value, comparison.summary.unknown > 0
26
+ return recordResult({ ...options, delivery: server.delivery }, contract, result.value, comparison.summary.unknown > 0
28
27
  ? "source-to-bundle-comparison"
29
28
  : undefined);
30
29
  });
@@ -5,7 +5,6 @@ import { applicationToolContract } from "../../contracts/applicationToolContract
5
5
  import { applicationVersionComparisonResultSchema } from "../../domain/javascript/javascriptApplicationVersionComparisonSchemas.js";
6
6
  import { logToolExecution } from "../toolLogging.js";
7
7
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
8
- import { toCallToolResult } from "../toolResult.js";
9
8
  import { recordResult } from "./helpers.js";
10
9
  const compareContract = applicationToolContract("compare_application_versions");
11
10
  /** Register the provider-neutral JavaScript version comparison tool. */
@@ -13,11 +12,11 @@ export const registerCompareApplicationVersionsTool = (server, options) => {
13
12
  server.registerTool(compareContract.name, toolRegistrationOptions(compareContract), async (input) => {
14
13
  const resolved = resolvePairedEvidenceRequest(input, options.evidenceById);
15
14
  if (!resolved.ok)
16
- return toCallToolResult(resolved, compareContract);
15
+ return server.delivery.toCallToolResult(resolved, compareContract);
17
16
  const parsed = resolved.value;
18
17
  const result = await logToolExecution(options.logger, compareContract.name, () => Promise.resolve(compareApplicationVersionsEvidenceValidated(parsed)));
19
18
  if (!result.ok)
20
- return toCallToolResult(result, compareContract);
19
+ return server.delivery.toCallToolResult(result, compareContract);
21
20
  const sources = [
22
21
  parsed.left,
23
22
  parsed.right,
@@ -26,9 +25,9 @@ export const registerCompareApplicationVersionsTool = (server, options) => {
26
25
  ];
27
26
  const recorded = recordSessionEvidenceSources(options.recordEvidence, sources);
28
27
  if (!recorded.ok)
29
- return toCallToolResult(recorded, compareContract);
28
+ return server.delivery.toCallToolResult(recorded, compareContract);
30
29
  const comparison = applicationVersionComparisonResultSchema.parse(result.value.normalized_result);
31
30
  const unknown = comparison.summary.unknown > 0;
32
- return recordResult(options, compareContract, result.value, unknown ? "application-version-comparison" : undefined);
31
+ return recordResult({ ...options, delivery: server.delivery }, compareContract, result.value, unknown ? "application-version-comparison" : undefined);
33
32
  });
34
33
  };
@@ -2,12 +2,11 @@ import { evaluateReconstructionCoverage } from "../../application/Reconstruction
2
2
  import { applicationToolContract } from "../../contracts/applicationToolContracts.js";
3
3
  import { logToolExecution } from "../toolLogging.js";
4
4
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
5
- import { toCallToolResult } from "../toolResult.js";
6
5
  const contract = applicationToolContract("evaluate_reconstruction_coverage");
7
6
  /** Register the inline fail-closed reconstruction coverage evaluator. */
8
7
  export const registerCoverageTools = (server, options) => {
9
8
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
10
9
  const result = await logToolExecution(options.logger, contract.name, () => Promise.resolve(evaluateReconstructionCoverage(input)));
11
- return toCallToolResult(result, contract);
10
+ return server.delivery.toCallToolResult(result, contract);
12
11
  });
13
12
  };
@@ -1,10 +1,9 @@
1
1
  import { APPLICATION_TOOL_CONTRACTS } from "../../contracts/applicationToolContracts.js";
2
- import { toEvidenceToolResult } from "../toolResult.js";
3
2
  export const recordResult = (options, contract, evidence, unknownKind) => {
4
3
  const recorded = unknownKind === undefined
5
4
  ? options.recordEvidence?.(evidence)
6
5
  : options.recordEvidenceWithUnknown?.(evidence, unknownRegistration(evidence, unknownKind));
7
- return toEvidenceToolResult(evidence, contract, recorded);
6
+ return options.delivery.toEvidenceToolResult(evidence, contract, recorded);
8
7
  };
9
8
  const unknownRegistration = (evidence, kind) => ({
10
9
  question: kind === "application-version-comparison"
@@ -3,7 +3,6 @@ import { buildReconstructionObligationLedgerEvidenceValidated, resolveReconstruc
3
3
  import { applicationToolContract } from "../../contracts/applicationToolContracts.js";
4
4
  import { logToolExecution } from "../toolLogging.js";
5
5
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
6
- import { toCallToolResult } from "../toolResult.js";
7
6
  import { recordResult } from "./helpers.js";
8
7
  const contract = applicationToolContract("build_reconstruction_obligation_ledger");
9
8
  /** Register conservative reconstruction-obligation generation and closure. */
@@ -11,13 +10,13 @@ export const registerReconstructionObligationLedgerTool = (server, options) => {
11
10
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
12
11
  const resolved = resolveReconstructionObligationLedgerRequest(input);
13
12
  if (!resolved.ok)
14
- return toCallToolResult(resolved, contract);
13
+ return server.delivery.toCallToolResult(resolved, contract);
15
14
  const result = await logToolExecution(options.logger, contract.name, () => Promise.resolve(buildReconstructionObligationLedgerEvidenceValidated(resolved.value)));
16
15
  if (!result.ok)
17
- return toCallToolResult(result, contract);
16
+ return server.delivery.toCallToolResult(result, contract);
18
17
  const recorded = recordSessionEvidenceSources(options.recordEvidence, resolved.value.evidence_bundle.records);
19
18
  if (!recorded.ok)
20
- return toCallToolResult(recorded, contract);
21
- return recordResult(options, contract, result.value);
19
+ return server.delivery.toCallToolResult(recorded, contract);
20
+ return recordResult({ ...options, delivery: server.delivery }, contract, result.value);
22
21
  });
23
22
  };
@@ -4,7 +4,6 @@ import { APPLICATION_TOOL_CONTRACTS, applicationToolContract, } from "../../cont
4
4
  import { recordSessionEvidenceSources } from "../sessionEvidence.js";
5
5
  import { logToolExecution } from "../toolLogging.js";
6
6
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
7
- import { toCallToolResult } from "../toolResult.js";
8
7
  import { recordResult } from "./helpers.js";
9
8
  /** Register execution-free Android and Apple inventory projection tools. */
10
9
  export const registerProjectMobileApplicationGraphTools = (server, options) => {
@@ -26,11 +25,11 @@ const registerProjection = (context) => {
26
25
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
27
26
  const result = await logToolExecution(options.logger, contract.name, () => Promise.resolve(project(input)));
28
27
  if (!result.ok)
29
- return toCallToolResult(result, contract);
28
+ return server.delivery.toCallToolResult(result, contract);
30
29
  const recordedSources = recordSessionEvidenceSources(options.recordEvidence, inventoryEvidenceSources(input));
31
30
  if (!recordedSources.ok)
32
- return toCallToolResult(recordedSources, contract);
33
- return recordResult(options, contract, result.value);
31
+ return server.delivery.toCallToolResult(recordedSources, contract);
32
+ return recordResult({ ...options, delivery: server.delivery }, contract, result.value);
34
33
  });
35
34
  };
36
35
  const inventoryEvidenceSources = (input) => {
@@ -4,7 +4,6 @@ import { traceApplicationFeatureEvidenceValidated } from "../../application/java
4
4
  import { applicationToolContract } from "../../contracts/applicationToolContracts.js";
5
5
  import { logToolExecution } from "../toolLogging.js";
6
6
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
7
- import { toCallToolResult } from "../toolResult.js";
8
7
  import { recordResult } from "./helpers.js";
9
8
  const traceContract = applicationToolContract("trace_application_feature");
10
9
  /** Register the provider-neutral JavaScript feature trace tool. */
@@ -12,15 +11,15 @@ export const registerTraceFeatureTool = (server, options) => {
12
11
  server.registerTool(traceContract.name, toolRegistrationOptions(traceContract), async (input) => {
13
12
  const resolved = resolveApplicationEvidenceRequest(input, options.evidenceById);
14
13
  if (!resolved.ok)
15
- return toCallToolResult(resolved, traceContract);
14
+ return server.delivery.toCallToolResult(resolved, traceContract);
16
15
  const parsed = resolved.value;
17
16
  const result = await logToolExecution(options.logger, traceContract.name, () => Promise.resolve(traceApplicationFeatureEvidenceValidated(parsed)));
18
17
  if (!result.ok)
19
- return toCallToolResult(result, traceContract);
18
+ return server.delivery.toCallToolResult(result, traceContract);
20
19
  const sources = [parsed.application, ...parsed.native_observations];
21
20
  const recorded = recordSessionEvidenceSources(options.recordEvidence, sources);
22
21
  if (!recorded.ok)
23
- return toCallToolResult(recorded, traceContract);
24
- return recordResult(options, traceContract, result.value);
22
+ return server.delivery.toCallToolResult(recorded, traceContract);
23
+ return recordResult({ ...options, delivery: server.delivery }, traceContract, result.value);
25
24
  });
26
25
  };
@@ -4,7 +4,6 @@ import { traceJavaScriptSemanticsEvidenceValidated } from "../../application/jav
4
4
  import { applicationToolContract } from "../../contracts/applicationToolContracts.js";
5
5
  import { logToolExecution } from "../toolLogging.js";
6
6
  import { toolRegistrationOptions } from "../toolRegistrationOptions.js";
7
- import { toCallToolResult } from "../toolResult.js";
8
7
  import { recordResult } from "./helpers.js";
9
8
  const contract = applicationToolContract("trace_javascript_semantics");
10
9
  /** Register the bounded JavaScript semantic relation trace tool. */
@@ -12,16 +11,16 @@ export const registerTraceJavaScriptSemanticsTool = (server, options) => {
12
11
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
13
12
  const resolved = resolveApplicationEvidenceRequest(input, options.evidenceById);
14
13
  if (!resolved.ok)
15
- return toCallToolResult(resolved, contract);
14
+ return server.delivery.toCallToolResult(resolved, contract);
16
15
  const parsed = resolved.value;
17
16
  const result = await logToolExecution(options.logger, contract.name, () => Promise.resolve(traceJavaScriptSemanticsEvidenceValidated(parsed)));
18
17
  if (!result.ok)
19
- return toCallToolResult(result, contract);
18
+ return server.delivery.toCallToolResult(result, contract);
20
19
  const recorded = recordSessionEvidenceSources(options.recordEvidence, [
21
20
  parsed.application,
22
21
  ]);
23
22
  if (!recorded.ok)
24
- return toCallToolResult(recorded, contract);
25
- return recordResult(options, contract, result.value);
23
+ return server.delivery.toCallToolResult(recorded, contract);
24
+ return recordResult({ ...options, delivery: server.delivery }, contract, result.value);
26
25
  });
27
26
  };
@@ -4,9 +4,8 @@ import { createEvidence, parseEvidence } from "../domain/evidence.js";
4
4
  import { jsonValueSchema } from "../domain/jsonValue.js";
5
5
  import { recordDerivedEvidence } from "./recordDerivedEvidence.js";
6
6
  import { runDerivedOperation } from "./runDerivedOperation.js";
7
- import { ARTIFACT_COMPARISON_PROVIDER } from "./sessionToolPolicies.js";
7
+ import { ARTIFACT_COMPARISON_PROVIDER } from "../application/InvestigationProviders.js";
8
8
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
9
- import { toCallToolResult, toEvidenceToolResult } from "./toolResult.js";
10
9
  /** Register Evidence-backed deterministic artifact comparison. */
11
10
  export const registerArtifactComparisonTool = (server, session, contract) => {
12
11
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
@@ -16,13 +15,13 @@ export const registerArtifactComparisonTool = (server, session, contract) => {
16
15
  return { left, right, comparison: compareArtifacts(left, right) };
17
16
  });
18
17
  if (!computed.ok)
19
- return toCallToolResult(computed, contract);
18
+ return server.delivery.toCallToolResult(computed, contract);
20
19
  const { left, right, comparison } = computed.value;
21
20
  const sources = [left, right];
22
21
  for (const source of sources) {
23
22
  const recordedSource = session.recordEvidence(source);
24
23
  if (!recordedSource.ok)
25
- return toCallToolResult(recordedSource, contract);
24
+ return server.delivery.toCallToolResult(recordedSource, contract);
26
25
  }
27
26
  const leftEvidenceIds = [left.evidence_id];
28
27
  const rightEvidenceIds = [right.evidence_id];
@@ -39,7 +38,7 @@ export const registerArtifactComparisonTool = (server, session, contract) => {
39
38
  limitations: comparison.limitations,
40
39
  evidenceLinks: [...leftEvidenceIds, ...rightEvidenceIds],
41
40
  });
42
- return toEvidenceToolResult(evidence, contract, recordDerivedEvidence(session, evidence, artifactUnknownInput(left, right, comparison.status, evidence.evidence_id)));
41
+ return server.delivery.toEvidenceToolResult(evidence, contract, recordDerivedEvidence(session, evidence, artifactUnknownInput(left, right, comparison.status, evidence.evidence_id)));
43
42
  });
44
43
  };
45
44
  const artifactUnknownInput = (left, right, status, comparisonEvidenceId) => {