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
@@ -1,7 +1,9 @@
1
- import { readdir, readlink, realpath } from "node:fs/promises";
1
+ import { opendir, readlink, realpath } from "node:fs/promises";
2
2
  import { dirname, join, resolve } from "node:path";
3
- import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
4
- import { cancelled, entryFailure, filesystemFailureDetail, safeSize, } from "./ReferenceSourceReaderErrors.js";
3
+ import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
4
+ import { OwnedDirectoryHandle } from "../filesystem/OwnedDirectoryHandle.js";
5
+ import { err, ok } from "../domain/result.js";
6
+ import { cancelled, entryFailure, failure, filesystemFailureDetail, safeSize, } from "./ReferenceSourceReaderErrors.js";
5
7
  import { isPathWithinRoot } from "../domain/localPath.js";
6
8
  import { pathFromRoot } from "./ReferenceSourceReaderPaths.js";
7
9
  import { readStableFile } from "./ReferenceSourceReaderFile.js";
@@ -15,15 +17,76 @@ export const traverseDirectory = async (state, current) => {
15
17
  state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", before.code, before.message));
16
18
  return { ok: true, value: undefined };
17
19
  }
18
- const names = await readDirectoryNames(current.path);
20
+ const directories = [];
21
+ let readFailure;
22
+ let handle;
23
+ try {
24
+ handle = await opendir(current.path);
25
+ }
26
+ catch (cause) {
27
+ readFailure = directoryReadFailure(cause);
28
+ }
29
+ if (handle !== undefined) {
30
+ const owner = new OwnedDirectoryHandle(handle);
31
+ let result = ok(undefined);
32
+ let cleanup;
33
+ try {
34
+ for (;;) {
35
+ let child;
36
+ try {
37
+ child = await handle.read();
38
+ }
39
+ catch (cause) {
40
+ readFailure = directoryReadFailure(cause);
41
+ break;
42
+ }
43
+ if (child === null)
44
+ break;
45
+ result = await processEntry(state, current, child.name, directories);
46
+ if (!result.ok)
47
+ break;
48
+ }
49
+ }
50
+ finally {
51
+ cleanup = await state.resources.release({
52
+ kind: "directory-handle",
53
+ handle: owner,
54
+ resource: current.path,
55
+ });
56
+ }
57
+ if (cleanup.kind === "failed") {
58
+ if (result.ok && !isAborted(state.signal) && readFailure !== undefined)
59
+ state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", "io", readFailure));
60
+ const observation = ArtifactReaderFailure.cleanupObservation(cleanup.cause, current.path);
61
+ const previous = result.ok ? undefined : result.error.cleanup;
62
+ const primary = result.ok
63
+ ? isAborted(state.signal)
64
+ ? cancelled()
65
+ : failure("io", readFailure ??
66
+ `Reference directory cleanup failed: ${current.path}`)
67
+ : result.error;
68
+ return err({
69
+ ...primary,
70
+ cleanup: previous === undefined
71
+ ? observation
72
+ : {
73
+ reason: `${previous.reason}; ${observation.reason}`,
74
+ resources: [
75
+ ...new Set([...previous.resources, ...observation.resources]),
76
+ ],
77
+ },
78
+ cause: primary.cause ?? cleanup.cause,
79
+ });
80
+ }
81
+ if (!result.ok)
82
+ return result;
83
+ }
19
84
  if (isAborted(state.signal))
20
85
  return { ok: false, error: cancelled() };
21
- if (!names.ok) {
22
- state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", "io", names.message));
86
+ if (readFailure !== undefined) {
87
+ state.entries.push(entryFailure(pathFromRoot(state.root, current.path), "directory", "io", readFailure));
23
88
  return { ok: true, value: undefined };
24
89
  }
25
- if (isAborted(state.signal))
26
- return { ok: false, error: cancelled() };
27
90
  const after = await validateDirectory(state.root, state.rootIdentity, current.path, state.signal);
28
91
  if (isAborted(state.signal))
29
92
  return { ok: false, error: cancelled() };
@@ -37,29 +100,15 @@ export const traverseDirectory = async (state, current) => {
37
100
  kind: "directory",
38
101
  path: pathFromRoot(state.root, current.path),
39
102
  });
40
- const directories = [];
41
- for (const name of names.value) {
42
- const result = await processEntry(state, current, name, directories);
43
- if (!result.ok)
44
- return result;
45
- }
46
103
  directories.reverse();
47
104
  state.pending.push(...directories);
48
105
  return { ok: true, value: undefined };
49
106
  };
50
- const readDirectoryNames = async (path) => {
51
- try {
52
- return {
53
- ok: true,
54
- value: (await readdir(path)).sort(compareUnicodeCodePoints),
55
- };
56
- }
57
- catch (cause) {
58
- const message = filesystemFailureDetail(cause, "Directory could not be read");
59
- if (message === undefined)
60
- throw cause;
61
- return { ok: false, message };
62
- }
107
+ const directoryReadFailure = (cause) => {
108
+ const message = filesystemFailureDetail(cause, "Directory could not be read");
109
+ if (message === undefined)
110
+ throw cause;
111
+ return message;
63
112
  };
64
113
  const readMetadata = async (path) => {
65
114
  try {
@@ -77,18 +126,6 @@ const processEntry = async (state, current, name, directories) => {
77
126
  return { ok: false, error: cancelled() };
78
127
  const absolute = join(current.path, name);
79
128
  const path = pathFromRoot(state.root, absolute);
80
- const excluded = applyExclusion(state.shouldExclude, path);
81
- if (!excluded.ok)
82
- return {
83
- ok: false,
84
- error: {
85
- tag: "reference-source-reader",
86
- code: "io",
87
- message: "Reference source exclusion check failed",
88
- },
89
- };
90
- if (excluded.value)
91
- return { ok: true, value: undefined };
92
129
  const metadata = await readMetadata(absolute);
93
130
  if (isAborted(state.signal))
94
131
  return { ok: false, error: cancelled() };
@@ -96,28 +133,41 @@ const processEntry = async (state, current, name, directories) => {
96
133
  state.entries.push(entryFailure(path, "unknown", "io", metadata.message));
97
134
  return { ok: true, value: undefined };
98
135
  }
99
- if (isAborted(state.signal))
136
+ const kind = metadata.value.isSymbolicLink()
137
+ ? "symlink"
138
+ : metadata.value.isDirectory()
139
+ ? "directory"
140
+ : metadata.value.isFile()
141
+ ? "file"
142
+ : "other";
143
+ const excluded = applyExclusion(state.shouldExclude, path, kind);
144
+ if (!excluded.ok)
100
145
  return {
101
146
  ok: false,
102
147
  error: {
103
148
  tag: "reference-source-reader",
104
- code: "cancelled",
105
- message: "Reference source traversal cancelled",
149
+ code: "io",
150
+ message: "Reference source exclusion check failed",
106
151
  },
107
152
  };
108
- if (metadata.value.isSymbolicLink())
153
+ if (excluded.value)
154
+ return { ok: true, value: undefined };
155
+ if (isAborted(state.signal))
156
+ return { ok: false, error: cancelled() };
157
+ if (kind === "symlink")
109
158
  state.entries.push(await describeSymlink(state.root, absolute, path, state.signal));
110
- else if (metadata.value.isDirectory()) {
159
+ else if (kind === "directory") {
111
160
  directories.push({ path: absolute });
112
161
  }
113
- else if (!metadata.value.isFile())
162
+ else if (kind !== "file")
114
163
  state.entries.push(entryFailure(path, "other", "unsupported", "Entry is not a regular file", safeSize(metadata.value.size)));
115
164
  else
116
- await processFileEntry(state, absolute, path, metadata.value);
165
+ return processFileEntry(state, absolute, path, metadata.value);
117
166
  return { ok: true, value: undefined };
118
167
  };
119
168
  const processFileEntry = async (state, absolute, path, metadata) => {
120
169
  const result = await readStableFile({
170
+ resources: state.resources,
121
171
  root: state.root,
122
172
  rootIdentity: state.rootIdentity,
123
173
  absolute,
@@ -125,9 +175,22 @@ const processFileEntry = async (state, absolute, path, metadata) => {
125
175
  expected: metadata,
126
176
  ...(state.signal === undefined ? {} : { signal: state.signal }),
127
177
  });
128
- if (result.status === "read" && result.kind === "file")
129
- state.bytesRead += result.bytes.byteLength;
130
- state.entries.push(result);
178
+ const { entry } = result;
179
+ if (entry.status === "read" && entry.kind === "file")
180
+ state.bytesRead += entry.bytes.byteLength;
181
+ state.entries.push(entry);
182
+ if (result.cleanup !== undefined)
183
+ return err({
184
+ tag: "reference-source-reader",
185
+ code: entry.status === "failed" && entry.code === "cancelled"
186
+ ? "cancelled"
187
+ : "io",
188
+ message: entry.status === "failed"
189
+ ? entry.message
190
+ : `Reference file cleanup failed: ${path}`,
191
+ cleanup: result.cleanup,
192
+ });
193
+ return ok(undefined);
131
194
  };
132
195
  const describeSymlink = async (root, absolute, path, signal) => {
133
196
  try {
@@ -190,9 +253,9 @@ const describeSymlink = async (root, absolute, path, signal) => {
190
253
  return entryFailure(path, "symlink", "io", message);
191
254
  }
192
255
  };
193
- const applyExclusion = (shouldExclude, path) => {
256
+ const applyExclusion = (shouldExclude, path, kind) => {
194
257
  try {
195
- return { ok: true, value: shouldExclude?.(path) === true };
258
+ return { ok: true, value: shouldExclude?.(path, kind) === true };
196
259
  }
197
260
  catch (cause) {
198
261
  // Exclusion predicates are caller-supplied; a throwing predicate fails
@@ -33,6 +33,18 @@ export const filesystemFailureDetail = (cause, operation) => {
33
33
  ? `${operation}: ${cause.message}`
34
34
  : undefined;
35
35
  };
36
+ /** Preserve root I/O detail while separating bad selections from access failures. */
37
+ export const rootFilesystemFailure = (cause, operation) => {
38
+ if (!(cause instanceof Error))
39
+ return undefined;
40
+ const code = Reflect.get(cause, "code");
41
+ if (typeof code !== "string" || !FILESYSTEM_ERROR_CODES.has(code))
42
+ return undefined;
43
+ return {
44
+ code: code === "ENOENT" || code === "ENOTDIR" ? "invalid-root" : "io",
45
+ message: `${operation}: ${cause.message}`,
46
+ };
47
+ };
36
48
  export const entryFailure = (...[path, kind, code, message, size]) => ({
37
49
  status: "failed",
38
50
  kind,
@@ -1,6 +1,7 @@
1
- import { constants } from "node:fs";
2
- import { open } from "node:fs/promises";
3
1
  import { dirname } from "node:path";
2
+ import { NonRegularFileReadError, RegularFileAdmissionFailure, openRegularFile, } from "../filesystem/RegularFile.js";
3
+ import { OwnedFileHandle } from "../filesystem/OwnedFileHandle.js";
4
+ import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
4
5
  import { entryFailure, filesystemFailureDetail, safeSize, } from "./ReferenceSourceReaderErrors.js";
5
6
  import { isAborted, sameFile, validateDirectory, } from "./ReferenceSourceReaderValidate.js";
6
7
  import {} from "./ReferenceSourceReaderTypes.js";
@@ -22,7 +23,8 @@ const prepareFileRead = async (request, handle) => {
22
23
  }
23
24
  return { status: "ready", before };
24
25
  };
25
- const readFileContents = async (request) => {
26
+ /** Read a stable-size file through its borrowed descriptor; growth is a change. */
27
+ export const readFileContents = async (request) => {
26
28
  const { handle, path, signal } = request;
27
29
  const chunks = [];
28
30
  let total = 0;
@@ -32,7 +34,12 @@ const readFileContents = async (request) => {
32
34
  status: "failed",
33
35
  entry: entryFailure(path, "file", "cancelled", "File read cancelled", total),
34
36
  };
35
- const chunk = Buffer.allocUnsafe(READ_CHUNK_BYTES);
37
+ // One extra byte detects growth without allocating a full chunk at EOF.
38
+ const remaining = request.expectedSize - BigInt(total);
39
+ const chunkBytes = remaining >= BigInt(READ_CHUNK_BYTES)
40
+ ? READ_CHUNK_BYTES
41
+ : Number(remaining) + 1;
42
+ const chunk = Buffer.allocUnsafe(chunkBytes);
36
43
  const read = await handle.read(chunk, 0, chunk.byteLength, null);
37
44
  if (isAborted(signal))
38
45
  return {
@@ -42,6 +49,11 @@ const readFileContents = async (request) => {
42
49
  if (read.bytesRead === 0)
43
50
  break;
44
51
  total += read.bytesRead;
52
+ if (BigInt(total) > request.expectedSize)
53
+ return {
54
+ status: "failed",
55
+ entry: entryFailure(path, "file", "changed", "File grew while it was read", total),
56
+ };
45
57
  chunks.push(chunk.subarray(0, read.bytesRead));
46
58
  }
47
59
  return { status: "ok", chunks, total };
@@ -63,19 +75,45 @@ const finalizeFileRead = async (request) => {
63
75
  };
64
76
  };
65
77
  export const readStableFile = async (request) => {
78
+ let owner;
79
+ let cleanup;
80
+ let entry;
81
+ try {
82
+ entry = await readStableFileEntry(request, (admitted) => {
83
+ owner = admitted;
84
+ });
85
+ }
86
+ finally {
87
+ if (owner !== undefined) {
88
+ const result = await request.resources.release({
89
+ kind: "file-handle",
90
+ handle: owner,
91
+ resource: request.absolute,
92
+ });
93
+ if (result.kind === "failed")
94
+ cleanup = ArtifactReaderFailure.cleanupObservation(result.cause, request.absolute);
95
+ }
96
+ }
97
+ return { entry, ...(cleanup === undefined ? {} : { cleanup }) };
98
+ };
99
+ const readStableFileEntry = async (request, retain) => {
66
100
  const { root, rootIdentity, absolute, path, expected, signal } = request;
67
- let handle;
68
101
  try {
69
102
  const parentBefore = await validateDirectory(root, rootIdentity, dirname(absolute), signal);
70
103
  if (!parentBefore.ok)
71
104
  return entryFailure(path, "file", parentBefore.code, parentBefore.message, safeSize(expected.size));
72
- handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
105
+ const handle = await openRegularFile(absolute, {
106
+ symlinks: "reject",
107
+ signal,
108
+ });
109
+ retain(new OwnedFileHandle(handle));
73
110
  const prepared = await prepareFileRead(request, handle);
74
111
  if (prepared.status === "failed")
75
112
  return prepared.entry;
76
113
  const contents = await readFileContents({
77
114
  handle,
78
115
  path,
116
+ expectedSize: prepared.before.size,
79
117
  ...(signal === undefined ? {} : { signal }),
80
118
  });
81
119
  if (contents.status === "failed")
@@ -94,15 +132,17 @@ export const readStableFile = async (request) => {
94
132
  });
95
133
  }
96
134
  catch (cause) {
135
+ if (cause instanceof RegularFileAdmissionFailure) {
136
+ retain(cause.owner);
137
+ cause = cause.cause;
138
+ }
97
139
  if (isAborted(signal))
98
140
  return entryFailure(path, "file", "cancelled", "File read cancelled", safeSize(expected.size));
141
+ if (cause instanceof NonRegularFileReadError)
142
+ return entryFailure(path, "file", "changed", "File is no longer a regular file", safeSize(expected.size));
99
143
  const message = filesystemFailureDetail(cause, "File could not be read safely");
100
144
  if (message === undefined)
101
145
  throw cause;
102
146
  return entryFailure(path, "file", "io", message, safeSize(expected.size));
103
147
  }
104
- finally {
105
- // best-effort cleanup: file-handle close must not mask the read result.
106
- await handle?.close().catch(() => undefined);
107
- }
108
148
  };
@@ -1,7 +1,7 @@
1
1
  import { constants } from "node:fs";
2
2
  import { lstat, realpath } from "node:fs/promises";
3
3
  import { err, ok } from "../domain/result.js";
4
- import { cancelled, failure, filesystemFailureDetail, } from "./ReferenceSourceReaderErrors.js";
4
+ import { cancelled, failure, filesystemFailureDetail, rootFilesystemFailure, } from "./ReferenceSourceReaderErrors.js";
5
5
  import { isPathWithinRoot } from "../domain/localPath.js";
6
6
  import {} from "./ReferenceSourceReaderTypes.js";
7
7
  export const bigLstat = (path) => lstat(path, { bigint: true });
@@ -74,9 +74,9 @@ export const prepareRoot = async (root, signal) => {
74
74
  catch (cause) {
75
75
  if (isAborted(signal))
76
76
  return err(cancelled());
77
- const message = filesystemFailureDetail(cause, "Reference source root could not be resolved");
78
- if (message === undefined)
77
+ const rootFailure = rootFilesystemFailure(cause, "Reference source root could not be resolved");
78
+ if (rootFailure === undefined)
79
79
  throw cause;
80
- return err(failure("invalid-root", `${message}: ${root}`));
80
+ return err(failure(rootFailure.code, `${rootFailure.message}: ${root}`));
81
81
  }
82
82
  };
@@ -1,18 +1,53 @@
1
1
  import { McpServer, isCallToolResult, isJSONRPCRequest, isJSONRPCNotification, isJSONRPCResultResponse, } from "@modelcontextprotocol/server";
2
2
  import { analysisErrorProjectionSchema } from "../contracts/errorSchemas.js";
3
+ import { compactAdvertisedInputSchema } from "../contracts/compactInputSchema.js";
4
+ import { transformAdvertisedInputJsonSchema } from "../contracts/toolSchemaMetadata.js";
3
5
  import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
4
6
  import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
5
7
  import { createEvidence } from "../domain/evidence.js";
6
8
  import { jsonObjectSchema } from "../domain/jsonValue.js";
7
9
  import { encodeToolResult } from "./toolResultEncoding.js";
10
+ /** A Zod schema whose standard interface exposes a JSON Schema projection. */
11
+ const hasAdvertisedInputJsonSchema = (value) => {
12
+ if (typeof value !== "object" || value === null)
13
+ return false;
14
+ const standard = Reflect.get(value, "~standard");
15
+ if (typeof standard !== "object" || standard === null)
16
+ return false;
17
+ const jsonSchema = Reflect.get(standard, "jsonSchema");
18
+ return (typeof jsonSchema === "object" &&
19
+ jsonSchema !== null &&
20
+ Reflect.get(jsonSchema, "input") !== undefined);
21
+ };
8
22
  /** Bind oversized MCP error recovery to this server's Evidence ledger. */
9
23
  export class EvidenceMcpServer extends McpServer {
10
24
  recordEvidence;
11
25
  delivery;
12
- constructor(info, options, recordEvidence, delivery) {
26
+ compactPresentation;
27
+ constructor(info, options, recordEvidence, delivery, compactPresentation = undefined) {
13
28
  super(info, options);
14
29
  this.recordEvidence = recordEvidence;
15
30
  this.delivery = delivery;
31
+ this.compactPresentation = compactPresentation;
32
+ }
33
+ /**
34
+ * Compact the advertised input schema of every registered tool when the
35
+ * compact profile is active. The registered canonical schema, its parser,
36
+ * and output schemas are untouched; only the advertised JSON Schema
37
+ * projection is rendered within the provider's per-schema size budget.
38
+ * The signatures mirror the SDK's registrations so call sites keep their
39
+ * inferred handler argument types.
40
+ */
41
+ registerTool(name, config, callback) {
42
+ const budget = this.compactPresentation?.budgetBytes;
43
+ const inputSchema = budget !== undefined &&
44
+ config !== undefined &&
45
+ hasAdvertisedInputJsonSchema(config.inputSchema)
46
+ ? transformAdvertisedInputJsonSchema(config.inputSchema, (projected) => compactAdvertisedInputSchema(projected, budget).schema)
47
+ : undefined;
48
+ return super.registerTool(name, (inputSchema === undefined
49
+ ? config
50
+ : { ...config, inputSchema }), callback);
16
51
  }
17
52
  /** Preserve the SDK transport lifecycle while retaining oversized errors. */
18
53
  connect(transport) {
@@ -0,0 +1,9 @@
1
+ /** Run one complete tool workflow inside session admission when supplied. */
2
+ export const runAdmittedToolOperation = async (server, admission, operationName, signal, operation) => {
3
+ if (admission === undefined)
4
+ return operation();
5
+ const admitted = await admission(operationName, signal, operation);
6
+ return admitted.ok
7
+ ? admitted.value
8
+ : server.delivery.toErrorToolResult(admitted.error);
9
+ };
@@ -0,0 +1,21 @@
1
+ import { logToolExecution } from "./toolLogging.js";
2
+ import { runAdmittedToolOperation } from "./admittedToolOperation.js";
3
+ /**
4
+ * Bind one service-backed handler to its exact named contract through the
5
+ * shared log/execute/record/deliver workflow.
6
+ */
7
+ export const createContractToolHandler = (server, service, logger, recordEvidence, withAdmittedAnalysis) => (contract) => createEvidenceToolHandler(server, (input, options) => service.execute(contract.name, input, options), logger, recordEvidence, withAdmittedAnalysis)(contract);
8
+ /** Bind a named Evidence-producing operation to shared logging and delivery. */
9
+ export const createEvidenceToolHandler = (server, operation, logger, recordEvidence, withAdmittedAnalysis) => (contract) => {
10
+ const name = contract.name;
11
+ return async (input, context) => {
12
+ const executeAndRecord = async () => {
13
+ const result = await logToolExecution(logger, name, () => operation(input, { signal: context.mcpReq.signal }));
14
+ if (!result.ok)
15
+ return server.delivery.toCallToolResult(result, contract);
16
+ const recorded = recordEvidence?.(result.value);
17
+ return server.delivery.toEvidenceToolResult(result.value, contract, recorded);
18
+ };
19
+ return runAdmittedToolOperation(server, withAdmittedAnalysis, name, context.mcpReq.signal, executeAndRecord);
20
+ };
21
+ };