rea-agents 6.3.0 → 6.4.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 (487) hide show
  1. package/README.md +7 -4
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -0,0 +1,179 @@
1
+ import { Client, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
2
+ import { z } from "zod";
3
+ import { jsonValueSchema } from "../domain/jsonValue.js";
4
+ import { AnalysisCancelledError, AnalysisProtocolError, } from "../domain/analysisErrorCore.js";
5
+ const toolResultSchema = z.object({
6
+ isError: z.boolean().optional(),
7
+ structuredContent: z.record(z.string(), z.unknown()).optional(),
8
+ content: z
9
+ .array(z.object({ type: z.string(), text: z.string().optional() }).passthrough())
10
+ .default([]),
11
+ });
12
+ /** Decode a JEB MCP tool result without inventing an empty observation. */
13
+ export const decodeJebToolResult = (input) => {
14
+ const result = toolResultSchema.parse(input);
15
+ const blocks = result.content.flatMap((block) => block.type === "text" && block.text !== undefined ? [block.text] : []);
16
+ if (result.structuredContent !== undefined) {
17
+ // isError envelopes carry JEB's {success:false, message} refusal semantics;
18
+ // decode them so the provider can preserve the engine's own reason.
19
+ return jsonValueSchema.parse(result.structuredContent);
20
+ }
21
+ if (blocks.length !== 1)
22
+ throw new AnalysisProtocolError("JEB MCP omitted a single structured or text result; unsupported content cannot establish an empty observation.");
23
+ try {
24
+ return jsonValueSchema.parse(JSON.parse(blocks[0] ?? "null"));
25
+ }
26
+ catch {
27
+ if (result.isError === true)
28
+ throw new AnalysisProtocolError(`JEB MCP tool failed: ${blocks[0] ?? "unexplained engine failure"}`);
29
+ return blocks[0] ?? null;
30
+ }
31
+ };
32
+ /** Serve JEB requests from a running engine client over streamable HTTP. */
33
+ export const createStreamableHttpJebMcpConnection = (endpoint) => {
34
+ let state;
35
+ let closing;
36
+ let closed = false;
37
+ const waitForCaller = (promise, signal) => {
38
+ if (signal?.aborted === true)
39
+ return Promise.reject(new AnalysisCancelledError("jeb_mcp"));
40
+ if (signal === undefined)
41
+ return promise;
42
+ return new Promise((resolve, reject) => {
43
+ const abort = () => {
44
+ signal.removeEventListener("abort", abort);
45
+ reject(new AnalysisCancelledError("jeb_mcp"));
46
+ };
47
+ signal.addEventListener("abort", abort, { once: true });
48
+ void promise.then((value) => {
49
+ signal.removeEventListener("abort", abort);
50
+ resolve(value);
51
+ }, (cause) => {
52
+ signal.removeEventListener("abort", abort);
53
+ reject(cause);
54
+ });
55
+ });
56
+ };
57
+ const dispose = async (owner) => {
58
+ if (owner.disposal !== undefined)
59
+ return owner.disposal;
60
+ const cleanup = (async () => {
61
+ const settled = await Promise.allSettled([
62
+ owner.client.close(),
63
+ owner.transport.close(),
64
+ ]);
65
+ const failures = settled.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
66
+ if (failures.length > 0)
67
+ throw new AggregateError(failures, "JEB MCP connection cleanup failed");
68
+ if (state === owner)
69
+ state = undefined;
70
+ })();
71
+ owner.disposal = cleanup;
72
+ try {
73
+ await cleanup;
74
+ }
75
+ catch (cause) {
76
+ owner.disposal = undefined;
77
+ throw cause;
78
+ }
79
+ };
80
+ const connect = async (signal) => {
81
+ if (signal?.aborted === true)
82
+ throw new AnalysisCancelledError("jeb_mcp");
83
+ if (closing !== undefined)
84
+ await closing;
85
+ if (closed) {
86
+ if (state !== undefined)
87
+ await dispose(state);
88
+ throw new AnalysisProtocolError("JEB MCP connection is closed");
89
+ }
90
+ if (state?.tools !== undefined && state.disposal === undefined)
91
+ return state.tools;
92
+ if (state?.acquisition !== undefined)
93
+ return waitForCaller(state.acquisition, signal);
94
+ if (state !== undefined) {
95
+ await dispose(state);
96
+ if (state !== undefined || closing !== undefined)
97
+ return connect(signal);
98
+ }
99
+ const owner = {
100
+ client: new Client({
101
+ name: "rea-jeb",
102
+ version: "0.0.0",
103
+ }),
104
+ transport: new StreamableHTTPClientTransport(endpoint, {
105
+ requestInit: { redirect: "error" },
106
+ }),
107
+ signal: new AbortController(),
108
+ tools: undefined,
109
+ acquisition: undefined,
110
+ disposal: undefined,
111
+ };
112
+ state = owner;
113
+ const acquisition = (async () => {
114
+ try {
115
+ await owner.client.connect(owner.transport, {
116
+ signal: owner.signal.signal,
117
+ });
118
+ const listing = await owner.client.listTools({}, { signal: owner.signal.signal });
119
+ const tools = listing.tools.map((tool) => tool.name);
120
+ owner.tools = tools;
121
+ return tools;
122
+ }
123
+ catch (cause) {
124
+ owner.signal.abort(cause);
125
+ try {
126
+ await dispose(owner);
127
+ }
128
+ catch (cleanupCause) {
129
+ throw new AggregateError([cause, cleanupCause], "JEB MCP connection acquisition and cleanup failed", { cause });
130
+ }
131
+ throw cause;
132
+ }
133
+ })();
134
+ owner.acquisition = acquisition;
135
+ void acquisition.then(() => {
136
+ if (owner.acquisition === acquisition)
137
+ owner.acquisition = undefined;
138
+ }, () => {
139
+ if (owner.acquisition === acquisition)
140
+ owner.acquisition = undefined;
141
+ });
142
+ return waitForCaller(acquisition, signal);
143
+ };
144
+ return {
145
+ connect,
146
+ async call(name, args, signal) {
147
+ await connect(signal);
148
+ const owner = state;
149
+ if (owner === undefined || owner.tools === undefined)
150
+ throw new AnalysisProtocolError("JEB MCP client failed to connect");
151
+ const result = await owner.client.callTool({ name, arguments: args }, signal === undefined ? {} : { signal });
152
+ return decodeJebToolResult(result);
153
+ },
154
+ async close() {
155
+ closed = true;
156
+ if (closing !== undefined)
157
+ return closing;
158
+ const operation = (async () => {
159
+ const owner = state;
160
+ if (owner === undefined)
161
+ return;
162
+ owner.tools = undefined;
163
+ owner.signal.abort();
164
+ if (owner.acquisition !== undefined)
165
+ await owner.acquisition.catch(() => undefined);
166
+ if (state === owner)
167
+ await dispose(owner);
168
+ })();
169
+ closing = operation;
170
+ try {
171
+ await operation;
172
+ }
173
+ finally {
174
+ if (closing === operation)
175
+ closing = undefined;
176
+ }
177
+ },
178
+ };
179
+ };
@@ -0,0 +1,40 @@
1
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
2
+ import { err, ok } from "../domain/result.js";
3
+ /** Default JEB MCP endpoint documented by the engine's headless client. */
4
+ export const DEFAULT_JEB_MCP_ENDPOINT = "http://127.0.0.1:8425/mcp";
5
+ /**
6
+ * Normalize the caller-selected JEB MCP endpoint.
7
+ *
8
+ * Only the scheme, host, and port select the engine; credentials, paths with
9
+ * segments beyond the MCP route, queries, and fragments are rejected rather
10
+ * than silently dropped.
11
+ */
12
+ export const parseJebMcpEndpoint = (value) => {
13
+ const raw = value === undefined || value.length === 0 ? null : value;
14
+ let url;
15
+ try {
16
+ url = new URL(raw ?? DEFAULT_JEB_MCP_ENDPOINT);
17
+ }
18
+ catch {
19
+ return err(new AnalysisInputError("jeb_mcp_endpoint", {
20
+ cause: "Expected an absolute http(s) URL",
21
+ }));
22
+ }
23
+ if (url.protocol !== "http:" && url.protocol !== "https:")
24
+ return err(new AnalysisInputError("jeb_mcp_endpoint", {
25
+ cause: "Only http and https JEB MCP endpoints are supported",
26
+ }));
27
+ if (url.hostname !== "127.0.0.1" && url.hostname !== "[::1]")
28
+ return err(new AnalysisInputError("jeb_mcp_endpoint", {
29
+ cause: "JEB MCP endpoint must use a literal loopback host (127.0.0.1 or ::1)",
30
+ }));
31
+ if (url.username !== "" || url.password !== "")
32
+ return err(new AnalysisInputError("jeb_mcp_endpoint", {
33
+ cause: "Embedding credentials in the JEB MCP endpoint is not supported; configure authentication with the engine",
34
+ }));
35
+ if (url.search !== "" || url.hash !== "")
36
+ return err(new AnalysisInputError("jeb_mcp_endpoint", {
37
+ cause: "JEB MCP endpoint query strings and fragments are not supported",
38
+ }));
39
+ return ok(url);
40
+ };
@@ -0,0 +1,299 @@
1
+ import { z } from "zod";
2
+ import { createAnalysisExecution } from "../application/AnalysisProvider.js";
3
+ import { jebResultSchemas } from "../domain/jeb/jebAnalysis.js";
4
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisProtocolError, AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.js";
5
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
6
+ import { err, ok } from "../domain/result.js";
7
+ import { parseJebMcpEndpoint, DEFAULT_JEB_MCP_ENDPOINT, } from "./JebMcpEndpoint.js";
8
+ import { createStreamableHttpJebMcpConnection, } from "./JebMcpConnection.js";
9
+ export const JEB_PROVIDER_IDENTITY = {
10
+ id: "jeb",
11
+ name: "JEB",
12
+ version: null,
13
+ };
14
+ /** JEB's tool envelope: success with typed fields, or a message-only failure. */
15
+ const failure = z
16
+ .object({
17
+ success: z.literal(false),
18
+ message: z.string().optional(),
19
+ error: z
20
+ .object({
21
+ code: z.string().optional(),
22
+ message: z.string().optional(),
23
+ recovery_tool: z.string().optional(),
24
+ })
25
+ .optional(),
26
+ })
27
+ .passthrough();
28
+ const clientInformation = z
29
+ .object({
30
+ success: z.literal(true),
31
+ version: z.string().optional(),
32
+ gui_client: z.boolean().optional(),
33
+ startup_ts: z.number().int().nonnegative().optional(),
34
+ message: z.string().nullish(),
35
+ })
36
+ .passthrough();
37
+ const unitEntry = z.object({ unit_path: z.string(), unit_type: z.string() });
38
+ const openProject = z
39
+ .object({
40
+ success: z.literal(true),
41
+ name: z.string().nullish(),
42
+ creation_datetime: z.string().nullish(),
43
+ input_files: z
44
+ .array(z.object({
45
+ file_name: z.string(),
46
+ file_size: z.number().int().nonnegative(),
47
+ contents_sha256_hash: z.string(),
48
+ }))
49
+ .optional(),
50
+ units: z.array(unitEntry).optional(),
51
+ })
52
+ .passthrough();
53
+ const listUnits = z
54
+ .object({ success: z.literal(true), units: z.array(unitEntry) })
55
+ .passthrough();
56
+ const decompiledItem = z
57
+ .object({ success: z.literal(true), text: z.string() })
58
+ .passthrough();
59
+ const refusalReason = (payload, fallback) => {
60
+ const parsed = failure.safeParse(payload);
61
+ if (!parsed.success)
62
+ return fallback;
63
+ const envelope = parsed.data;
64
+ const reason = envelope.error?.message ?? envelope.message ?? envelope.error?.code;
65
+ if (reason !== undefined && reason.length > 0)
66
+ return reason;
67
+ return fallback;
68
+ };
69
+ /** Serve REA's JEB operations from a running engine client over MCP. */
70
+ export class JebProvider {
71
+ #connection;
72
+ #endpoint;
73
+ #identity = JEB_PROVIDER_IDENTITY;
74
+ #guiClient = null;
75
+ constructor(options = {}) {
76
+ const environment = options.environment ?? {};
77
+ const endpoint = parseJebMcpEndpoint(environment.REA_JEB_MCP_URL);
78
+ if (!endpoint.ok)
79
+ throw endpoint.error;
80
+ this.#endpoint = endpoint.value;
81
+ this.#connection = (options.connectionFactory ??
82
+ ((url) => createStreamableHttpJebMcpConnection(url)))(this.#endpoint);
83
+ }
84
+ async inspectAvailability(signal) {
85
+ try {
86
+ await this.#refreshClientInformation(signal);
87
+ return {
88
+ status: "available",
89
+ code: null,
90
+ reason: null,
91
+ diagnostics: {
92
+ endpoint: this.#endpoint.toString(),
93
+ engine_version: this.#identity.version,
94
+ },
95
+ };
96
+ }
97
+ catch (cause) {
98
+ if (signal?.aborted === true)
99
+ throw cause;
100
+ return {
101
+ status: "unavailable",
102
+ code: "not_configured",
103
+ reason: cause instanceof Error
104
+ ? cause.message
105
+ : "The JEB MCP endpoint did not respond",
106
+ diagnostics: { endpoint: this.#endpoint.toString() },
107
+ };
108
+ }
109
+ }
110
+ async close() {
111
+ await this.#connection.close();
112
+ }
113
+ async execute(request, options) {
114
+ if (options?.signal?.aborted === true)
115
+ return err(new AnalysisCancelledError(request.operation));
116
+ try {
117
+ const execution = await this.#dispatch(request, options?.signal);
118
+ if (options?.signal?.aborted)
119
+ return err(new AnalysisCancelledError(request.operation));
120
+ if (execution.ok)
121
+ this.#identity = {
122
+ ...this.#identity,
123
+ version: execution.value.provider.version,
124
+ };
125
+ return execution;
126
+ }
127
+ catch (cause) {
128
+ if (options?.signal?.aborted)
129
+ return err(new AnalysisCancelledError(request.operation, { cause }));
130
+ return err(this.#providerFailure(request.operation, cause));
131
+ }
132
+ }
133
+ async #dispatch(request, signal) {
134
+ const cancelled = (operation) => {
135
+ if (signal?.aborted === true)
136
+ throw new AnalysisCancelledError(operation);
137
+ };
138
+ switch (request.operation) {
139
+ case "inspect_jeb_client": {
140
+ cancelled(request.operation);
141
+ return this.#inspectClient(signal);
142
+ }
143
+ case "open_jeb_project": {
144
+ cancelled(request.operation);
145
+ return this.#openProject(request, signal);
146
+ }
147
+ case "list_jeb_units": {
148
+ cancelled(request.operation);
149
+ return this.#listUnits(request, signal);
150
+ }
151
+ case "decompile_jeb_item": {
152
+ cancelled(request.operation);
153
+ return this.#decompileItem(request, signal);
154
+ }
155
+ }
156
+ }
157
+ async #engine(signal) {
158
+ await this.#requireClientInformation(signal);
159
+ return {
160
+ name: "jeb",
161
+ version: this.#identity.version,
162
+ endpoint: this.#endpoint.toString(),
163
+ gui_client: this.#guiClient,
164
+ };
165
+ }
166
+ async #requireClientInformation(signal) {
167
+ if (this.#identity.version !== null)
168
+ return;
169
+ await this.#refreshClientInformation(signal);
170
+ }
171
+ async #refreshClientInformation(signal) {
172
+ if (signal?.aborted === true)
173
+ throw new AnalysisCancelledError("inspect_jeb_client");
174
+ const payload = await this.#connection.call("get_client_information", {}, signal);
175
+ const information = clientInformation.parse(this.#requireSuccess(payload, "inspect_jeb_client"));
176
+ this.#identity = {
177
+ ...this.#identity,
178
+ version: information.version ?? null,
179
+ };
180
+ this.#guiClient = information.gui_client ?? null;
181
+ }
182
+ async #inspectClient(signal) {
183
+ const payload = await this.#connection.call("get_client_information", {}, signal);
184
+ const information = clientInformation.parse(this.#requireSuccess(payload, "inspect_jeb_client"));
185
+ this.#identity = {
186
+ ...this.#identity,
187
+ version: information.version ?? null,
188
+ };
189
+ this.#guiClient = information.gui_client ?? null;
190
+ const result = jebResultSchemas.inspect_jeb_client.parse({
191
+ engine: {
192
+ name: "jeb",
193
+ version: information.version ?? null,
194
+ endpoint: this.#endpoint.toString(),
195
+ gui_client: information.gui_client ?? null,
196
+ },
197
+ startup_ts: information.startup_ts ?? null,
198
+ message: information.message ?? null,
199
+ });
200
+ return ok(createAnalysisExecution(result, this.#identity, {
201
+ rawResult: payload,
202
+ limitations: information.version === undefined
203
+ ? ["The engine did not report its version."]
204
+ : [],
205
+ }));
206
+ }
207
+ async #openProject(request, signal) {
208
+ const payload = await this.#connection.call("open_project", {
209
+ file_path: request.input.path,
210
+ }, signal);
211
+ const opened = openProject.parse(this.#requireSuccess(payload, request.operation));
212
+ const engine = await this.#engine(signal);
213
+ const result = jebResultSchemas.open_jeb_project.parse({
214
+ engine,
215
+ project_name: opened.name ?? null,
216
+ creation_datetime: opened.creation_datetime ?? null,
217
+ input_files: opened.input_files ?? [],
218
+ units: opened.units ?? [],
219
+ });
220
+ return ok(createAnalysisExecution(result, this.#identity, {
221
+ rawResult: payload,
222
+ limitations: [
223
+ "JEB resolves and analyzes the artifact on the engine host; REA did not open the target itself.",
224
+ ],
225
+ }));
226
+ }
227
+ async #listUnits(request, signal) {
228
+ const { count, index, filter, parent_unit_path } = request.input;
229
+ const payload = await this.#connection.call("list_units", {
230
+ count,
231
+ index,
232
+ ...(filter === undefined ? {} : { filter }),
233
+ ...(parent_unit_path === undefined ? {} : { parent_unit_path }),
234
+ }, signal);
235
+ const listed = listUnits.parse(this.#requireSuccess(payload, request.operation));
236
+ const units = listed.units;
237
+ const engine = await this.#engine(signal);
238
+ const result = jebResultSchemas.list_jeb_units.parse({
239
+ engine,
240
+ filter: filter ?? null,
241
+ parent_unit_path: parent_unit_path ?? null,
242
+ index,
243
+ count,
244
+ units,
245
+ coverage: units.length < count ? "complete" : "partial",
246
+ });
247
+ return ok(createAnalysisExecution(result, this.#identity, {
248
+ rawResult: payload,
249
+ limitations: [
250
+ "The engine caps unit pages at 100; a full page means more units may exist.",
251
+ ],
252
+ }));
253
+ }
254
+ async #decompileItem(request, signal) {
255
+ const { item_address, item_kind, unit_path } = request.input;
256
+ const payload = await this.#connection.call("decompile_code_item", {
257
+ item_address,
258
+ item_kind,
259
+ ...(unit_path === undefined ? {} : { unit_path }),
260
+ }, signal);
261
+ const decompiled = decompiledItem.parse(this.#requireSuccess(payload, request.operation));
262
+ const engine = await this.#engine(signal);
263
+ const result = jebResultSchemas.decompile_jeb_item.parse({
264
+ engine,
265
+ unit_path: unit_path ?? null,
266
+ item_address,
267
+ item_kind,
268
+ text: decompiled.text,
269
+ });
270
+ return ok(createAnalysisExecution(result, this.#identity, {
271
+ rawResult: payload,
272
+ limitations: unit_path === undefined
273
+ ? [
274
+ "The engine selected the project's first code unit implicitly; the effective unit identity is unknown.",
275
+ ]
276
+ : [],
277
+ }));
278
+ }
279
+ #requireSuccess(payload, operation) {
280
+ if (typeof payload !== "object" || payload === null)
281
+ throw new AnalysisProtocolError("JEB MCP returned a non-object envelope; no observation can be established");
282
+ const success = payload.success;
283
+ if (success === false)
284
+ throw new AnalysisUnsupportedTargetError(operation, this.#endpoint.toString(), refusalReason(payload, "The engine refused the request"));
285
+ if (success !== true)
286
+ throw new AnalysisProtocolError("JEB MCP omitted its success field; no observation can be established");
287
+ return payload;
288
+ }
289
+ #providerFailure(operation, cause) {
290
+ if (cause instanceof AnalysisError)
291
+ return cause;
292
+ if (cause instanceof z.ZodError)
293
+ return new AnalysisProtocolError("JEB omitted or malformed required observation fields", { cause });
294
+ return new AnalysisCapabilityUnavailableError("jeb", operation, cause instanceof Error ? cause.message : String(cause), {
295
+ cause: cause instanceof Error ? cause : undefined,
296
+ userMessage: `Start a JEB client serving MCP (default ${DEFAULT_JEB_MCP_ENDPOINT}) or set REA_JEB_MCP_URL to the running endpoint.`,
297
+ });
298
+ }
299
+ }
package/dist/mcpDoctor.js CHANGED
@@ -5,6 +5,7 @@ import { resolve } from "node:path";
5
5
  import { CATALOG_IDENTITY } from "./catalogIdentity.js";
6
6
  import { PROMPT_CONTRACTS } from "./contracts/promptContracts.js";
7
7
  import { TOOL_CONTRACTS } from "./contracts/toolContracts.js";
8
+ import { err, ok } from "./domain/result.js";
8
9
  import { PRODUCT_IDENTITY } from "./identity.js";
9
10
  import { MCP_STARTUP_POLICY } from "./mcpStartupPolicy.js";
10
11
  const OUTPUT_FORMATS = ["toon", "json", "yaml", "md", "jsonl"];
@@ -85,16 +86,22 @@ export const runProductionMcpDoctor = async (options) => {
85
86
  };
86
87
  const inspectProductionMcpSession = async (client, deadline, signal) => {
87
88
  const request = requestOptions(deadline, signal);
88
- const [tools, prompts, requestFlow] = await Promise.all([
89
+ const [tools, prompts] = await Promise.all([
89
90
  client.listTools(undefined, request),
90
91
  client.listPrompts(undefined, request),
91
- client.callTool({ name: "binary_session", arguments: {} }, request),
92
92
  ]);
93
+ const sessionTool = tools.tools.find(({ name }) => name === "binary_session");
94
+ const requestFlow = await client
95
+ .callTool({ name: "binary_session", arguments: {} }, {
96
+ ...requestOptions(deadline, signal),
97
+ ...(sessionTool === undefined ? {} : { toolDefinition: sessionTool }),
98
+ })
99
+ .then(ok, (cause) => err({ kind: "request-flow", detail: errorMessage(cause) }));
93
100
  const inventory = {
94
101
  tools: compareInventory(TOOL_CONTRACTS.map(({ name }) => name), tools.tools.map(({ name }) => name)),
95
102
  prompts: compareInventory(PROMPT_CONTRACTS.map(({ name }) => name), prompts.prompts.map(({ name }) => name)),
96
103
  };
97
- const observedIdentity = parseIdentityToolResult(requestFlow.structuredContent);
104
+ const observedIdentity = parseIdentityToolResult(requestFlow.ok ? requestFlow.value.structuredContent : undefined);
98
105
  const serverVersion = client.getServerVersion();
99
106
  const protocolVersion = client.getNegotiatedProtocolVersion();
100
107
  const checks = [
@@ -115,8 +122,10 @@ const inspectProductionMcpSession = async (client, deadline, signal) => {
115
122
  },
116
123
  {
117
124
  name: "request-flow",
118
- ok: requestFlow.isError !== true,
119
- detail: "binary_session target-free request",
125
+ ok: requestFlow.ok && requestFlow.value.isError !== true,
126
+ detail: requestFlow.ok
127
+ ? "binary_session target-free request"
128
+ : requestFlow.error.detail,
120
129
  },
121
130
  ];
122
131
  return {
@@ -136,7 +145,7 @@ const inspectProductionMcpSession = async (client, deadline, signal) => {
136
145
  },
137
146
  request_flow: {
138
147
  tool: "binary_session",
139
- ok: requestFlow.isError !== true,
148
+ ok: requestFlow.ok && requestFlow.value.isError !== true,
140
149
  },
141
150
  checks,
142
151
  };
@@ -1,9 +1,15 @@
1
1
  const describeFixups = (fixups) => {
2
- if (fixups.kind === "chained")
3
- return `chained fixups: ${fixups.formats.join(", ") || "no fixup segments"}`;
4
- return fixups.kind === "dyld-info"
5
- ? "LC_DYLD_INFO bind opcodes"
6
- : "no fixup load commands";
2
+ const unread = fixups.unreadRebaseBytes > 0
3
+ ? `LC_DYLD_INFO rebase opcodes were not decoded (${fixups.unreadRebaseBytes} bytes)`
4
+ : undefined;
5
+ const kind = fixups.kind === "chained"
6
+ ? `chained fixups: ${fixups.formats.join(", ") || "no fixup segments"}`
7
+ : fixups.kind === "dyld-info"
8
+ ? "LC_DYLD_INFO bind opcodes"
9
+ : unread === undefined
10
+ ? "no fixup load commands"
11
+ : undefined;
12
+ return [unread, kind].filter((line) => line !== undefined).join("; ");
7
13
  };
8
14
  /** Append the per-facet coverage of one Apple dispatch metadata decode. */
9
15
  export const pushDispatchCoverage = (input) => {
@@ -42,15 +48,22 @@ export const pushDispatchCoverage = (input) => {
42
48
  examined: categoriesExamined,
43
49
  decoded: result.objc_categories.filter(({ decode }) => decode.status === "decoded").length,
44
50
  });
51
+ const fixupReason = [
52
+ describeFixups(fixups),
53
+ ...fixups.issues.map(({ code, location, message }) => `${code}${location === undefined ? "" : ` at ${location}`}: ${message}`),
54
+ ]
55
+ .filter((line) => line.length > 0)
56
+ .join("; ");
45
57
  result.coverage.push({
46
58
  facet: "pointer_fixups",
47
- status: fixups.issues.length > 0 ? "partial" : "complete",
48
- reason: [
49
- describeFixups(fixups),
50
- ...fixups.issues.map(({ code, location, message }) => `${code}${location === undefined ? "" : ` at ${location}`}: ${message}`),
51
- ].join("; "),
52
- examined: 0,
53
- decoded: 0,
59
+ status: fixups.issues.length > 0 || fixups.unreadRebaseBytes > 0
60
+ ? "partial"
61
+ : fixups.examined === 0
62
+ ? "unsupported"
63
+ : "complete",
64
+ reason: fixupReason.length > 0 ? fixupReason : null,
65
+ examined: fixups.examined,
66
+ decoded: fixups.issues.length > 0 ? 0 : fixups.examined,
54
67
  });
55
68
  result.coverage.push({
56
69
  facet: "swift_generic_resilient_witnesses_overrides_async_coroutines",
@@ -1,8 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
- import { open } from "node:fs/promises";
3
- import { constants } from "node:fs";
4
2
  import { objcSwiftMetadataSchema, nativeDispatchMetadataResultSchema, } from "../domain/native/objcSwiftMetadata.js";
5
- import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
3
+ import { AnalysisCancelledError, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
4
+ import { openRegularFile } from "../filesystem/RegularFile.js";
5
+ import { readBoundedFileBytes } from "../process/BoundedFileBytes.js";
6
6
  import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
7
7
  import { pushDispatchCoverage } from "./AppleDispatchCoverage.js";
8
8
  import { parsePointerFixups } from "./AppleMachoFixups.js";
@@ -140,14 +140,21 @@ export const decodeAppleDispatchMetadata = (bytes, maxRecords, provenance, archi
140
140
  export const inspectAppleDispatchMetadata = async (target, maxRecords, signal) => {
141
141
  if (target.kind !== "executable" || target.format !== "mach-o")
142
142
  throw new TypeError("Apple dispatch metadata requires a Mach-O target");
143
- const handle = await open(target.path, constants.O_RDONLY | constants.O_NOFOLLOW);
143
+ const maximumBytes = 64 * 1024 * 1024;
144
+ const capacityError = () => new AnalysisResourceConstraintError("inspect_native_dispatch_metadata", "memory", "Apple static metadata input exceeds its 64 MiB snapshot budget", { input_bytes: maximumBytes });
145
+ const handle = await openRegularFile(target.path, {
146
+ symlinks: "reject",
147
+ signal,
148
+ });
144
149
  try {
145
150
  const before = await handle.stat();
146
- if (!before.isFile() || before.size > 64 * 1024 * 1024)
147
- throw new RangeError("Apple metadata target must be a regular file no larger than 64 MiB");
151
+ if (before.size > maximumBytes)
152
+ throw capacityError();
148
153
  if (signal?.aborted)
149
154
  throw new AnalysisCancelledError("inspect_native_dispatch_metadata");
150
- const bytes = await handle.readFile({ signal });
155
+ const bytes = await readBoundedFileBytes(handle, maximumBytes, signal);
156
+ if (bytes === undefined)
157
+ throw capacityError();
151
158
  const digest = createHash("sha256").update(bytes).digest("hex");
152
159
  if (digest !== target.sha256)
153
160
  throw new EvidenceIntegrityError("Apple metadata target digest changed after session binding");