rea-agents 6.0.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 (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -2,7 +2,6 @@ import { readEvidenceBundle, writeEvidenceBundle, } from "../application/Evidenc
2
2
  import { toolContract } from "../contracts/toolContracts.js";
3
3
  import { ok } from "../domain/result.js";
4
4
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
5
- import { toCallToolResult } from "./toolResult.js";
6
5
  /** Register evidence bundle import and export tools. */
7
6
  export const registerEvidenceTools = (registration) => {
8
7
  registerExportEvidenceTool(registration);
@@ -10,55 +9,51 @@ export const registerEvidenceTools = (registration) => {
10
9
  registerSnapshotEvidenceTool(registration);
11
10
  };
12
11
  const registerExportEvidenceTool = ({ server, session, exportContract, }) => {
13
- server.registerTool(exportContract.name, toolRegistrationOptions(exportContract), async (input) => {
14
- const bundle = session.exportEvidenceBundle();
15
- const written = await writeEvidenceBundle(bundle, input.path, input.overwrite);
12
+ server.registerTool(exportContract.name, toolRegistrationOptions(exportContract), async (input, context) => {
13
+ const bundle = bundleForSerialization(session);
14
+ const written = await writeEvidenceBundle(bundle, input.path, input.overwrite, context.mcpReq.signal);
16
15
  return written.ok
17
- ? toCallToolResult(ok({
16
+ ? server.delivery.toCallToolResult(ok({
18
17
  path: written.value.path,
19
18
  bytes: written.value.bytes,
20
19
  records: bundle.records.length,
21
20
  unknowns: bundle.unknowns.length,
22
21
  }), exportContract)
23
- : toCallToolResult(written, exportContract);
22
+ : server.delivery.toCallToolResult(written, exportContract);
24
23
  });
25
24
  };
26
25
  const registerSnapshotEvidenceTool = ({ server, session, snapshotContract, }) => {
27
- server.registerTool(snapshotContract.name, toolRegistrationOptions(snapshotContract), () => toCallToolResult(ok(session.exportEvidenceBundle()), snapshotContract));
26
+ server.registerTool(snapshotContract.name, toolRegistrationOptions(snapshotContract), () => server.delivery.toCallToolResult(ok(bundleForSerialization(session)), snapshotContract));
28
27
  };
29
28
  const registerImportEvidenceTool = ({ server, session, importContract, }) => {
30
29
  server.registerTool(importContract.name, toolRegistrationOptions(importContract), async (input) => {
31
30
  const path = input.path;
32
31
  const loaded = await readEvidenceBundle(path);
33
32
  if (!loaded.ok)
34
- return toCallToolResult(loaded, importContract);
35
- const retainedUnknownRevisions = new Set(session
36
- .exportEvidenceBundle()
37
- .unknowns.map((unknown) => unknownRevisionKey(unknown)));
33
+ return server.delivery.toCallToolResult(loaded, importContract);
34
+ const retainedUnknownRevisions = new Set(bundleForSerialization(session).unknowns.map((unknown) => unknownRevisionKey(unknown)));
38
35
  const imported = session.importEvidenceBundle(loaded.value);
39
36
  return imported.ok
40
- ? toCallToolResult(ok({
37
+ ? server.delivery.toCallToolResult(ok({
41
38
  imported: imported.value,
42
39
  unknowns_added: loaded.value.unknowns.filter((unknown) => !retainedUnknownRevisions.has(unknownRevisionKey(unknown))).length,
43
- total: session.exportEvidenceBundle().records.length,
40
+ total: bundleForSerialization(session).records.length,
44
41
  }), importContract)
45
- : toCallToolResult(imported, importContract);
42
+ : server.delivery.toCallToolResult(imported, importContract);
46
43
  });
47
44
  };
45
+ const bundleForSerialization = (session) => session.evidenceBundleForSerialization?.() ?? session.exportEvidenceBundle();
48
46
  const unknownRevisionKey = (unknown) => `${unknown.unknown_id}:${String(unknown.revision)}`;
49
47
  /** Register residual-unknown query and mutation tools. */
50
48
  const registerListUnknownsTool = ({ server, session, }) => {
51
49
  const listContract = toolContract("list_unknowns");
52
50
  server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input) => {
53
- const filters = input;
54
51
  const all = session.listUnknowns({
55
- ...(filters.status === undefined ? {} : { status: filters.status }),
56
- ...(filters.severity === undefined
57
- ? {}
58
- : { severity: filters.severity }),
59
- ...(filters.domain === undefined ? {} : { domain: filters.domain }),
52
+ ...(input.status === undefined ? {} : { status: input.status }),
53
+ ...(input.severity === undefined ? {} : { severity: input.severity }),
54
+ ...(input.domain === undefined ? {} : { domain: input.domain }),
60
55
  });
61
- return toCallToolResult(ok({
56
+ return server.delivery.toCallToolResult(ok({
62
57
  items: all,
63
58
  total: all.length,
64
59
  }), listContract);
@@ -68,19 +63,19 @@ const registerRecordUnknownTool = ({ server, session, }) => {
68
63
  const recordContract = toolContract("record_unknown");
69
64
  server.registerTool(recordContract.name, toolRegistrationOptions(recordContract), (input) => {
70
65
  const result = session.recordUnknown(input);
71
- return toCallToolResult(result, recordContract);
66
+ return server.delivery.toCallToolResult(result, recordContract);
72
67
  });
73
68
  };
74
69
  const registerUpdateUnknownTool = ({ server, session, }) => {
75
70
  const updateContract = toolContract("update_unknown");
76
71
  server.registerTool(updateContract.name, toolRegistrationOptions(updateContract), (input) => {
77
72
  const result = session.updateUnknown(input);
78
- return toCallToolResult(result, updateContract);
73
+ return server.delivery.toCallToolResult(result, updateContract);
79
74
  });
80
75
  };
81
76
  const registerVerifyUnknownTool = ({ server, session, }) => {
82
77
  const verifyContract = toolContract("verify_unknown_resolution");
83
- server.registerTool(verifyContract.name, toolRegistrationOptions(verifyContract), (input) => toCallToolResult(session.verifyUnknownResolution(input.unknown_id), verifyContract));
78
+ server.registerTool(verifyContract.name, toolRegistrationOptions(verifyContract), (input) => server.delivery.toCallToolResult(session.verifyUnknownResolution(input.unknown_id), verifyContract));
84
79
  };
85
80
  export const registerUnknownTools = (registration) => {
86
81
  registerListUnknownsTool(registration);
@@ -1,18 +1,31 @@
1
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
1
2
  import { buildCapabilityInventory } from "../application/CapabilityInventory.js";
2
3
  import { toolContract } from "../contracts/toolContracts.js";
3
4
  import { jsonObjectSchema } from "../domain/jsonValue.js";
4
5
  import { createServerIdentity } from "../serverIdentity.js";
5
6
  import { mcpClientMetadata } from "./mcpClientMetadata.js";
6
7
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
7
- import { toCallToolResult } from "./toolResult.js";
8
+ import { err } from "../domain/result.js";
8
9
  /** Register the read-only provider and target status operation. */
9
10
  export const registerSessionStatusTool = (options) => {
10
- const { server, session, contract, startedAt, availabilityPolicy } = options;
11
- server.registerTool(contract.name, toolRegistrationOptions(contract), (input, context) => {
12
- const { client, clientFeatures, protocolVersion } = mcpClientMetadata(context);
11
+ const { server, session, contract, startedAt, availabilityPolicy, androidAnalysisAvailability, } = options;
12
+ server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
13
+ const { client, clientFeatures, protocolVersion } = mcpClientMetadata(context, server.server);
14
+ let androidAvailability;
15
+ try {
16
+ androidAvailability = await androidAnalysisAvailability(context.mcpReq.signal);
17
+ }
18
+ catch (cause) {
19
+ if (!context.mcpReq.signal.aborted)
20
+ throw cause;
21
+ return server.delivery.toCallToolResult(err(new AnalysisCancelledError("binary_session")), contract);
22
+ }
13
23
  const status = session.status();
14
24
  const statusObject = jsonObjectSchema.parse(status);
15
- const toolAvailability = buildCapabilityInventory(status, availabilityPolicy(), clientFeatures);
25
+ const toolAvailability = buildCapabilityInventory(status, {
26
+ ...availabilityPolicy(),
27
+ androidAnalysisAvailability: androidAvailability,
28
+ }, clientFeatures);
16
29
  const serverIdentity = createServerIdentity({
17
30
  startedAt,
18
31
  expected: {
@@ -29,7 +42,7 @@ export const registerSessionStatusTool = (options) => {
29
42
  ...(client === undefined ? {} : { client }),
30
43
  ...(protocolVersion === undefined ? {} : { protocolVersion }),
31
44
  });
32
- return toCallToolResult({
45
+ return server.delivery.toCallToolResult({
33
46
  ok: true,
34
47
  value: projectSessionStatus({
35
48
  status: statusObject,
@@ -1,4 +1,3 @@
1
- import { z } from "zod";
2
1
  import { getNavigationContext, inspectAddressContext, } from "../application/AnalysisContextQueries.js";
3
2
  import { readAnalysisSnapshot } from "../application/binary/AnalysisSnapshotFiles.js";
4
3
  import { createProcessCaptureEvidence } from "../application/process/ProcessEvidence.js";
@@ -19,7 +18,6 @@ import { registerSessionStatusTool } from "./registerSessionStatusTool.js";
19
18
  import { sessionAvailabilityPolicy, } from "./sessionAvailabilityPolicy.js";
20
19
  import { logToolExecution } from "./toolLogging.js";
21
20
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
22
- import { toCallToolResult } from "./toolResult.js";
23
21
  const recordProcessResidualUnknowns = (session, evidence, residuals) => {
24
22
  for (const residual of residuals) {
25
23
  const unknown = session.recordUnknown({
@@ -48,7 +46,6 @@ const recordProcessResidualUnknowns = (session, evidence, residuals) => {
48
46
  };
49
47
  const registerProcessTools = ({ server, session, logger, captureContract, }) => {
50
48
  server.registerTool(captureContract.name, toolRegistrationOptions(captureContract), async (input, context) => {
51
- const scenario = input;
52
49
  const progress = mcpProgressReporter(context);
53
50
  await progress.report({
54
51
  phase: captureContract.name,
@@ -56,7 +53,7 @@ const registerProcessTools = ({ server, session, logger, captureContract, }) =>
56
53
  total: 1,
57
54
  message: "started",
58
55
  });
59
- const captured = await logToolExecution(logger, captureContract.name, () => captureProcessScenario(scenario, context.mcpReq.signal));
56
+ const captured = await logToolExecution(logger, captureContract.name, () => captureProcessScenario(input, context.mcpReq.signal));
60
57
  await progress.report({
61
58
  phase: captureContract.name,
62
59
  completed: 1,
@@ -65,19 +62,19 @@ const registerProcessTools = ({ server, session, logger, captureContract, }) =>
65
62
  terminal: true,
66
63
  });
67
64
  if (!captured.ok)
68
- return toCallToolResult(captured, captureContract);
69
- const evidence = createProcessCaptureEvidence(scenario, captured.value);
65
+ return server.delivery.toCallToolResult(captured, captureContract);
66
+ const evidence = createProcessCaptureEvidence(input, captured.value);
70
67
  const recorded = session.recordEvidence(evidence);
71
68
  if (!recorded.ok)
72
- return toCallToolResult(recorded, captureContract);
69
+ return server.delivery.toCallToolResult(recorded, captureContract);
73
70
  const unknowns = recordProcessResidualUnknowns(session, evidence, captured.value.residual_unknowns);
74
71
  if (!unknowns.ok)
75
- return toCallToolResult(unknowns, captureContract);
76
- return toCallToolResult(ok(evidence), captureContract);
72
+ return server.delivery.toCallToolResult(unknowns, captureContract);
73
+ return server.delivery.toEvidenceToolResult(evidence, captureContract, recorded);
77
74
  });
78
75
  };
79
76
  const registerLifecycleTools = (registration) => {
80
- const { server, session, statusContract, startedAt, availabilityPolicy } = registration;
77
+ const { server, session, statusContract, startedAt, availabilityPolicy, androidAnalysisAvailability, } = registration;
81
78
  registerOpenLifecycleTool(registration);
82
79
  registerCloseLifecycleTool(registration);
83
80
  registerSessionStatusTool({
@@ -86,6 +83,7 @@ const registerLifecycleTools = (registration) => {
86
83
  contract: statusContract,
87
84
  startedAt,
88
85
  availabilityPolicy,
86
+ androidAnalysisAvailability,
89
87
  });
90
88
  };
91
89
  const registerOpenLifecycleTool = ({ server, session, logger, openContract, }) => {
@@ -94,7 +92,7 @@ const registerOpenLifecycleTool = ({ server, session, logger, openContract, }) =
94
92
  if (input.snapshot_path !== undefined) {
95
93
  const loaded = await readAnalysisSnapshot(input.snapshot_path);
96
94
  if (!loaded.ok)
97
- return toCallToolResult(loaded, openContract);
95
+ return server.delivery.toCallToolResult(loaded, openContract);
98
96
  snapshot = loaded.value;
99
97
  }
100
98
  const opened = await logToolExecution(logger, openContract.name, () => session.open(input.path, {
@@ -106,30 +104,27 @@ const registerOpenLifecycleTool = ({ server, session, logger, openContract, }) =
106
104
  ...(snapshot === undefined ? {} : { snapshot }),
107
105
  }));
108
106
  return opened.ok
109
- ? toCallToolResult({
107
+ ? server.delivery.toCallToolResult({
110
108
  ok: true,
111
109
  value: {
112
110
  path: opened.value.path,
113
111
  format: opened.value.format,
114
112
  kind: opened.value.kind,
115
- loaderArgs: z
116
- .array(z.string())
117
- .parse(session.openCompatibility().loaderArgs ?? []),
118
113
  sha256: opened.value.sha256,
119
114
  architecture: opened.value.architecture ?? null,
120
115
  },
121
116
  }, openContract)
122
- : toCallToolResult(opened, openContract);
117
+ : server.delivery.toCallToolResult(opened, openContract);
123
118
  });
124
119
  };
125
120
  const registerContextTools = (server, session) => {
126
121
  const navigationContract = toolContract("get_navigation_context");
127
122
  const addressContract = toolContract("inspect_address_context");
128
123
  server.registerTool(navigationContract.name, toolRegistrationOptions(navigationContract), async (input, context) => {
129
- return toCallToolResult(await getNavigationContext(session, input, context.mcpReq.signal), navigationContract);
124
+ return server.delivery.toCallToolResult(await getNavigationContext(session, input, context.mcpReq.signal), navigationContract);
130
125
  });
131
126
  server.registerTool(addressContract.name, toolRegistrationOptions(addressContract), async (input, context) => {
132
- return toCallToolResult(await inspectAddressContext(session, input, context.mcpReq.signal), addressContract);
127
+ return server.delivery.toCallToolResult(await inspectAddressContext(session, input, context.mcpReq.signal), addressContract);
133
128
  });
134
129
  };
135
130
  export const registerSessionTools = (server, session, logger, options = {}) => {
@@ -153,6 +148,7 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
153
148
  statusContract,
154
149
  startedAt: options.startedAt ?? new Date().toISOString(),
155
150
  availabilityPolicy: sessionAvailabilityPolicy(options.availabilityPolicy, {}),
151
+ androidAnalysisAvailability: options.androidAnalysisAvailability ?? missingAndroidAvailability,
156
152
  });
157
153
  registerEvidenceTools({
158
154
  server,
@@ -175,3 +171,9 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
175
171
  registerUnknownTools({ server, session });
176
172
  registerContextTools(server, session);
177
173
  };
174
+ const missingAndroidAvailability = async () => ({
175
+ status: "unavailable",
176
+ code: "not_configured",
177
+ reason: "Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux, macOS, or Windows x64 with its matching bundled native controls.",
178
+ diagnostics: { configured: false },
179
+ });
@@ -1,17 +1,14 @@
1
1
  import { toolContract } from "../contracts/toolContracts.js";
2
2
  import { logToolExecution } from "./toolLogging.js";
3
3
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
4
- import { toCallToolResult } from "./toolResult.js";
5
4
  /** Bind the module relationship workflow to its exact canonical contract. */
6
5
  export const registerWebModuleTool = (server, service, logger, recordEvidence) => {
7
6
  const contract = toolContract("trace_web_module_imports");
8
7
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
9
8
  const result = await logToolExecution(logger, contract.name, () => service.trace(input, { signal: context.mcpReq.signal }));
10
9
  if (!result.ok)
11
- return toCallToolResult(result, contract);
10
+ return server.delivery.toCallToolResult(result, contract);
12
11
  const recorded = recordEvidence?.(result.value);
13
- return recorded !== undefined && !recorded.ok
14
- ? toCallToolResult(recorded, contract)
15
- : toCallToolResult(result, contract);
12
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
16
13
  });
17
14
  };
@@ -1,7 +1,6 @@
1
1
  import { toolContract } from "../contracts/toolContracts.js";
2
2
  import { logToolExecution } from "./toolLogging.js";
3
3
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
4
- import { toCallToolResult } from "./toolResult.js";
5
4
  /** Bind historical inspection to its named contract and caller-owned Evidence writer. */
6
5
  export const registerWebNetworkCaptureTool = (server, service, logger, recordEvidence) => {
7
6
  const contract = toolContract("inspect_web_network_capture");
@@ -19,10 +18,8 @@ export const registerWebNetworkCaptureTool = (server, service, logger, recordEvi
19
18
  server.registerTool(contract.name, { ...registration, inputSchema }, async (input, context) => {
20
19
  const result = await logToolExecution(logger, contract.name, () => service.inspect(input, { signal: context.mcpReq.signal }));
21
20
  if (!result.ok)
22
- return toCallToolResult(result, contract);
21
+ return server.delivery.toCallToolResult(result, contract);
23
22
  const recorded = recordEvidence?.(result.value);
24
- return recorded !== undefined && !recorded.ok
25
- ? toCallToolResult(recorded, contract)
26
- : toCallToolResult(result, contract);
23
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
27
24
  });
28
25
  };
@@ -2,7 +2,6 @@ import { toolContract } from "../contracts/toolContracts.js";
2
2
  import { mcpProgressReporter } from "./mcpProgress.js";
3
3
  import { logToolExecution } from "./toolLogging.js";
4
4
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
5
- import { toCallToolResult } from "./toolResult.js";
6
5
  /** Bind distinct runtime operations to named contracts and the session's Evidence owner. */
7
6
  export const registerWebRuntimeTools = (server, service, logger, recordEvidence) => {
8
7
  const execution = toolContract("observe_web_execution");
@@ -13,19 +12,15 @@ export const registerWebRuntimeTools = (server, service, logger, recordEvidence)
13
12
  progress: mcpProgressReporter(context),
14
13
  }));
15
14
  if (!result.ok)
16
- return toCallToolResult(result, execution);
15
+ return server.delivery.toCallToolResult(result, execution);
17
16
  const recorded = recordEvidence?.(result.value);
18
- return recorded !== undefined && !recorded.ok
19
- ? toCallToolResult(recorded, execution)
20
- : toCallToolResult(result, execution);
17
+ return server.delivery.toEvidenceToolResult(result.value, execution, recorded);
21
18
  });
22
19
  server.registerTool(listeners.name, toolRegistrationOptions(listeners), async (input, context) => {
23
20
  const result = await logToolExecution(logger, listeners.name, () => service.inspect(input, { signal: context.mcpReq.signal }));
24
21
  if (!result.ok)
25
- return toCallToolResult(result, listeners);
22
+ return server.delivery.toCallToolResult(result, listeners);
26
23
  const recorded = recordEvidence?.(result.value);
27
- return recorded !== undefined && !recorded.ok
28
- ? toCallToolResult(recorded, listeners)
29
- : toCallToolResult(result, listeners);
24
+ return server.delivery.toEvidenceToolResult(result.value, listeners, recorded);
30
25
  });
31
26
  };
@@ -2,17 +2,14 @@ import { exportWebScriptsValidated } from "../application/WebScriptExportService
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 } from "./toolResult.js";
6
5
  /** Register local script export without requiring a live browser provider. */
7
6
  export const registerWebScriptTool = (server, options) => {
8
7
  const contract = toolContract("export_web_scripts");
9
8
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
10
9
  const result = await logToolExecution(options.logger, contract.name, () => exportWebScriptsValidated(input, { signal: context.mcpReq.signal }));
11
10
  if (!result.ok)
12
- return toCallToolResult(result, contract);
11
+ return server.delivery.toCallToolResult(result, contract);
13
12
  const recorded = options.recordEvidence?.(result.value);
14
- return recorded !== undefined && !recorded.ok
15
- ? toCallToolResult(recorded, contract)
16
- : toCallToolResult(result, contract);
13
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
17
14
  });
18
15
  };
@@ -1,17 +1,14 @@
1
1
  import { toolContract } from "../contracts/toolContracts.js";
2
2
  import { logToolExecution } from "./toolLogging.js";
3
3
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
4
- import { toCallToolResult } from "./toolResult.js";
5
4
  /** Bind source point tracing to its exact named contract and session Evidence owner. */
6
5
  export const registerWebSourceLocationTool = (server, service, logger, recordEvidence) => {
7
6
  const contract = toolContract("trace_web_source_location");
8
7
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input, context) => {
9
8
  const result = await logToolExecution(logger, contract.name, () => service.trace(input, { signal: context.mcpReq.signal }));
10
9
  if (!result.ok)
11
- return toCallToolResult(result, contract);
10
+ return server.delivery.toCallToolResult(result, contract);
12
11
  const recorded = recordEvidence?.(result.value);
13
- return recorded !== undefined && !recorded.ok
14
- ? toCallToolResult(recorded, contract)
15
- : toCallToolResult(result, contract);
12
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
16
13
  });
17
14
  };
@@ -1,5 +1,8 @@
1
1
  import { setImmediate } from "node:timers/promises";
2
+ import { z } from "zod";
3
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
2
4
  import { AnalysisCancelledError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
5
+ import { describeValidationFailure } from "../domain/evidenceBundle.js";
3
6
  import { err, ok } from "../domain/result.js";
4
7
  import { mcpProgressReporter } from "./mcpProgress.js";
5
8
  /** Run synchronous derived work with transport yields and a publication guard. */
@@ -19,9 +22,18 @@ export const runDerivedOperation = async (context, operation, compute) => {
19
22
  value = compute();
20
23
  }
21
24
  catch (cause) {
22
- return err(cause instanceof AnalysisCancelledError
23
- ? cause
24
- : new AnalysisInputError(operation, { cause }));
25
+ // Typed causes already name the failed constraint; keep their issues.
26
+ if (cause instanceof AnalysisError)
27
+ return err(cause);
28
+ return err(new AnalysisInputError(operation, { cause }, cause instanceof TypeError || cause instanceof z.ZodError
29
+ ? [
30
+ {
31
+ path: [],
32
+ reason: "invalid_value",
33
+ message: describeValidationFailure(cause),
34
+ },
35
+ ]
36
+ : []));
25
37
  }
26
38
  await progress.report({
27
39
  phase: "compute",
@@ -9,7 +9,6 @@ export const sessionAvailabilityPolicy = (configured, defaults) => {
9
9
  binaryLayoutEnabled: defaults.optionalFeatures?.binaryLayoutEnabled ?? false,
10
10
  firmwareInspectionEnabled: defaults.optionalFeatures?.firmwareInspectionEnabled ?? false,
11
11
  firmwareExtractionEnabled: defaults.optionalFeatures?.firmwareExtractionEnabled ?? false,
12
- androidAnalysisEnabled: defaults.optionalFeatures?.androidAnalysisEnabled ?? false,
13
12
  javascriptRecoveryEnabled: defaults.optionalFeatures?.javascriptRecoveryEnabled ?? false,
14
13
  webModuleResolutionEnabled: defaults.optionalFeatures?.webModuleResolutionEnabled ?? false,
15
14
  browserObservationEnabled: defaults.optionalFeatures?.browserObservationEnabled ?? false,
@@ -1,9 +1,9 @@
1
- import { toolInputSchemaWithMetadata } from "../contracts/toolSchemaMetadata.js";
1
+ import { toolInputSchemaWithMetadata, toolOutputSchemaWithMetadata, } from "../contracts/toolSchemaMetadata.js";
2
2
  /** Project the canonical Zod contracts directly into SDK registration. */
3
3
  export const toolRegistrationOptions = (contract) => ({
4
4
  title: contract.title,
5
5
  description: contract.description,
6
6
  inputSchema: toolInputSchemaWithMetadata(contract),
7
- outputSchema: contract.outputSchema,
7
+ outputSchema: toolOutputSchemaWithMetadata(contract),
8
8
  annotations: contract.annotations,
9
9
  });
@@ -1,53 +1,77 @@
1
+ import { STDIO_DEFAULT_MAX_BUFFER_SIZE } from "@modelcontextprotocol/server";
1
2
  import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
2
3
  import {} from "../domain/analysisErrorBase.js";
3
- /**
4
- * Serialize an application result as MCP text and structured content.
5
- * Shared error projection preserves actionable local diagnostics while omitting
6
- * raw cause objects; explicitly retained bounded command output stays visible.
7
- */
8
- export const toCallToolResult = (result, contract) => result.ok ? successResult(result.value, contract) : errorResult(result.error);
9
- const errorResult = (error) => {
10
- const projected = projectAnalysisError(error);
11
- const structuredContent = { error: projected };
12
- return {
13
- content: [
14
- {
15
- type: "text",
16
- text: JSON.stringify(structuredContent),
17
- },
18
- ],
19
- structuredContent,
20
- isError: true,
21
- };
22
- };
23
- const successResult = (value, contract) => {
24
- const candidate = projectEvidence(value) ??
25
- (contract.kind === "session" ? { result: value } : value);
26
- return {
27
- content: [
28
- {
29
- type: "text",
30
- text: JSON.stringify(candidate),
31
- },
32
- ],
33
- structuredContent: candidate,
34
- };
35
- };
36
- const projectEvidence = (value) => {
37
- if (typeof value !== "object" ||
38
- value === null ||
39
- Array.isArray(value) ||
40
- typeof value.evidence_id !== "string" ||
41
- !/^ev_[a-f0-9]{64}$/u.test(value.evidence_id) ||
42
- !("normalized_result" in value))
43
- return undefined;
44
- const normalizedResult = value.normalized_result;
45
- const evidenceId = value.evidence_id;
46
- if (normalizedResult === undefined || typeof evidenceId !== "string")
47
- return undefined;
48
- return {
49
- result: normalizedResult,
50
- evidence_id: evidenceId,
51
- evidence: value,
52
- };
53
- };
4
+ import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
5
+ import { encodeToolResult, MCP_RESULT_STRING_LIMIT, } from "./toolResultEncoding.js";
6
+ /** Create one delivery policy from the already selected, parsed response budget. */
7
+ export const createToolResultDelivery = (maximumResponseBytes) => new ToolResultDelivery(maximumResponseBytes ?? STDIO_DEFAULT_MAX_BUFFER_SIZE);
8
+ /** Immutable encoding and recovery policy shared by one MCP server. */
9
+ export class ToolResultDelivery {
10
+ resultBudgetBytes;
11
+ constructor(maximumResponseBytes) {
12
+ this.resultBudgetBytes = maximumResponseBytes - 1024;
13
+ Object.freeze(this);
14
+ }
15
+ /** Serialize a plain application result or its actionable error. */
16
+ toCallToolResult(result, contract) {
17
+ return result.ok
18
+ ? this.successResult(contract.kind === "session" ? { result: result.value } : result.value, contract)
19
+ : this.toErrorToolResult(result.error);
20
+ }
21
+ /** Deliver Evidence using the producer's explicit recording acknowledgment. */
22
+ toEvidenceToolResult(evidence, contract, recorded) {
23
+ return recorded !== undefined && !recorded.ok
24
+ ? this.toErrorToolResult(recorded.error)
25
+ : this.successResult(evidence, contract, {
26
+ evidence_id: evidence.evidence_id,
27
+ ...(recorded === undefined
28
+ ? {}
29
+ : {
30
+ evidence_reference: {
31
+ kind: "retained-evidence",
32
+ evidence_id: evidence.evidence_id,
33
+ },
34
+ }),
35
+ });
36
+ }
37
+ /** Project an error without allocating oversized repeated MCP text. */
38
+ toErrorToolResult(error) {
39
+ const structuredContent = { error: projectAnalysisError(error) };
40
+ // Errors reach the wire as text only; the structured copy is a private
41
+ // carrier the transport removes after its own budget check.
42
+ const encoded = encodeToolResult(structuredContent, this.resultBudgetBytes, "text");
43
+ // The transport retains an oversized projected error before replacing it
44
+ // with a recoverable delivery constraint, using this same budget.
45
+ return {
46
+ content: encoded.ok ? [{ type: "text", text: encoded.text }] : [],
47
+ structuredContent,
48
+ isError: true,
49
+ };
50
+ }
51
+ successResult(value, contract, recovery = {}) {
52
+ const encoded = encodeToolResult(value, this.resultBudgetBytes);
53
+ if (encoded.ok)
54
+ return {
55
+ content: [{ type: "text", text: encoded.text }],
56
+ structuredContent: value,
57
+ };
58
+ const retainedEvidence = recovery.evidence_reference !== undefined;
59
+ const recoveryAdvice = retainedEvidence
60
+ ? "Export retained evidence to consume the complete analysis, or use complete CLI JSON output."
61
+ : encoded.constraint === "string-length"
62
+ ? "Use complete CLI JSON output to consume the analysis."
63
+ : "Use a larger MCP response budget with a matching client receive buffer, or use complete CLI JSON output to consume the analysis.";
64
+ return this.toErrorToolResult(new AnalysisResourceConstraintError(contract.name, "transport", encoded.constraint === "string-length"
65
+ ? `The operation completed, but its complete MCP response exceeds Node's single-string representation limit. ${recoveryAdvice}`
66
+ : `The operation completed, but its complete MCP response exceeds the stdio response budget. The analysis result was not truncated. ${recoveryAdvice}`, {
67
+ boundary: "mcp-response",
68
+ default_receive_buffer_bytes: STDIO_DEFAULT_MAX_BUFFER_SIZE,
69
+ result_budget_bytes: this.resultBudgetBytes,
70
+ max_string_code_units: MCP_RESULT_STRING_LIMIT,
71
+ response_bytes_at_least: encoded.bytesAtLeast,
72
+ response_code_units_at_least: encoded.codeUnitsAtLeast,
73
+ constraint: encoded.constraint,
74
+ ...recovery,
75
+ }));
76
+ }
77
+ }
@@ -0,0 +1,34 @@
1
+ import { constants as bufferConstants } from "node:buffer";
2
+ import { bufferedJsonParts, jsonParts } from "../domain/jsonSerialization.js";
3
+ export const MCP_RESULT_STRING_LIMIT = bufferConstants.MAX_STRING_LENGTH - 1024;
4
+ const RESULT_ENVELOPE_BYTES = Buffer.byteLength(JSON.stringify({
5
+ content: [{ type: "text", text: "" }],
6
+ structuredContent: null,
7
+ })) - 4;
8
+ const TEXT_RESULT_ENVELOPE_BYTES = Buffer.byteLength(JSON.stringify({ content: [{ type: "text", text: "" }] }));
9
+ /** Account for the delivered JSON representations before allocating the complete text. */
10
+ export const encodeToolResult = (value, budgetBytes, representations = "structured-and-text") => {
11
+ const structured = representations === "structured-and-text";
12
+ const parts = [];
13
+ let bytes = structured ? RESULT_ENVELOPE_BYTES : TEXT_RESULT_ENVELOPE_BYTES;
14
+ let codeUnits = bytes;
15
+ for (const part of bufferedJsonParts(jsonParts(value))) {
16
+ const escapedPart = JSON.stringify(part);
17
+ bytes +=
18
+ (structured ? Buffer.byteLength(part) : 0) +
19
+ Buffer.byteLength(escapedPart) -
20
+ 2;
21
+ codeUnits += (structured ? part.length : 0) + escapedPart.length - 2;
22
+ if (bytes > budgetBytes || codeUnits > MCP_RESULT_STRING_LIMIT)
23
+ return {
24
+ ok: false,
25
+ bytesAtLeast: bytes,
26
+ codeUnitsAtLeast: codeUnits,
27
+ constraint: codeUnits > MCP_RESULT_STRING_LIMIT
28
+ ? "string-length"
29
+ : "receive-buffer",
30
+ };
31
+ parts.push(part);
32
+ }
33
+ return { ok: true, text: parts.join(""), bytes };
34
+ };
@@ -34,6 +34,7 @@ const inspectionSchema = z.strictObject({
34
34
  privateDacl: z.literal(true),
35
35
  atomicJobAssignment: z.literal(true),
36
36
  killOnOwnerClose: z.literal(true),
37
+ protocolStdin: z.boolean().optional(),
37
38
  });
38
39
  const bindingSchema = z.strictObject({
39
40
  call: z.custom((value) => typeof value === "function"),