rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,12 +1,42 @@
1
- /** Classify path-stable filesystem effects between two bounded states. */
1
+ import { sep } from "node:path";
2
+ const unobservedAbsenceReason = (path, phase, completeRoots, filesByPath) => {
3
+ const alias = path.slice(0, path.indexOf(":"));
4
+ if (!completeRoots.has(alias))
5
+ return `The ${phase} snapshot did not exhaust path enumeration under ${alias}; absence remains unknown.`;
6
+ const rootPath = `${alias}:.`;
7
+ if (path !== rootPath && filesByPath.get(rootPath)?.type === "symlink")
8
+ return `The ${phase} snapshot did not follow the symbolic link at ${rootPath}; descendant absence remains unknown.`;
9
+ for (let index = path.lastIndexOf(sep); index > 0; index = path.lastIndexOf(sep, index - 1)) {
10
+ const parent = path.slice(0, index);
11
+ if (filesByPath.get(parent)?.type === "symlink")
12
+ return `The ${phase} snapshot did not follow the symbolic link at ${parent}; descendant absence remains unknown.`;
13
+ }
14
+ return undefined;
15
+ };
16
+ /** Classify effects only when a snapshot establishes the missing path's absence. */
2
17
  export const classifyFilesystemEffects = (before, after) => {
3
- const beforeByPath = new Map(before.map((file) => [file.path, file]));
4
- const afterByPath = new Map(after.map((file) => [file.path, file]));
18
+ const beforeByPath = new Map(before.files.map((file) => [file.path, file]));
19
+ const afterByPath = new Map(after.files.map((file) => [file.path, file]));
20
+ const beforeCompleteRoots = new Set(before.completeRoots);
21
+ const afterCompleteRoots = new Set(after.completeRoots);
5
22
  return [...new Set([...beforeByPath.keys(), ...afterByPath.keys()])]
6
23
  .sort()
7
24
  .map((path) => {
8
25
  const beforeFile = beforeByPath.get(path) ?? null;
9
26
  const afterFile = afterByPath.get(path) ?? null;
27
+ const reason = beforeFile === null
28
+ ? unobservedAbsenceReason(path, "before", beforeCompleteRoots, beforeByPath)
29
+ : afterFile === null
30
+ ? unobservedAbsenceReason(path, "after", afterCompleteRoots, afterByPath)
31
+ : undefined;
32
+ if (reason !== undefined)
33
+ return {
34
+ path,
35
+ status: "unknown",
36
+ before: beforeFile,
37
+ after: afterFile,
38
+ reason,
39
+ };
10
40
  if (beforeFile === null) {
11
41
  if (afterFile === null)
12
42
  throw new TypeError(`Filesystem effect ${path} has no file state`);
@@ -1,9 +1,8 @@
1
- import { parseProcessCapture } from "../../domain/process/processCapture.js";
1
+ import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
2
2
  import { err, ok } from "../../domain/result.js";
3
3
  import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
4
4
  import {} from "../../domain/analysisErrorBase.js";
5
- import { describeProcessCaptureExecutionFailure, ProcessCaptureError, processCaptureCancelled, } from "./ProcessCaptureError.js";
6
- export { ProcessCaptureError } from "./ProcessCaptureError.js";
5
+ import { describeProcessCaptureExecutionFailure, ProcessCaptureError, normalizeCaptureFailure, processCaptureCancelled, } from "./ProcessCaptureError.js";
7
6
  import { startProcessSampler } from "./ProcessSampling.js";
8
7
  import { snapshotRoots } from "./FilesystemSnapshot.js";
9
8
  import { TerminalRenderer } from "./TerminalRenderer.js";
@@ -15,14 +14,11 @@ import { createProcessCaptureJournal, scheduleScenarioInteractions, } from "./Pr
15
14
  import { makeProcessCaptureEnvironment } from "./ProcessCaptureEnvironment.js";
16
15
  import { classifyFilesystemEffects } from "./ProcessFilesystemEffects.js";
17
16
  import { processCaptureOwnershipUnavailableReason } from "./ProcessCaptureCapability.js";
18
- import { DarwinProcessOwnershipInspectionError } from "../DarwinProcessRunTokenReader.js";
19
- export { probeProcessCaptureCapability } from "./ProcessCaptureCapability.js";
20
17
  const cleanupFailedStartup = async (options) => {
21
18
  const sampledProcessGroupIds = options.terminal !== undefined &&
22
19
  options.observations?.process_samples.state === "available"
23
20
  ? selectCapturedProcessGroupIds(options.terminal.pid, options.observations.process_samples.value).filter((groupId) => groupId !== options.terminal?.pid)
24
21
  : undefined;
25
- options.terminal?.kill("SIGKILL");
26
22
  if (options.observations !== undefined && options.renderer !== undefined) {
27
23
  try {
28
24
  options.observations.rendered_frames = {
@@ -89,7 +85,7 @@ const startCaptureRuntime = async (options) => {
89
85
  value: scenario.normalization.pids ? 1 : terminal.pid,
90
86
  };
91
87
  const executableIdentity = observeLaunchedExecutable(scenario.executable, selectedExecutable);
92
- const framesTruncated = captureTerminalFrames({
88
+ const rawTerminalRetention = captureTerminalFrames({
93
89
  ...options,
94
90
  terminal,
95
91
  started,
@@ -117,7 +113,7 @@ const startCaptureRuntime = async (options) => {
117
113
  startedAt,
118
114
  executableIdentity,
119
115
  lastOutput: () => lastOutput,
120
- framesTruncated,
116
+ rawTerminalRetention,
121
117
  stopSampler,
122
118
  };
123
119
  }
@@ -181,18 +177,6 @@ const finishProcessRun = async (options) => {
181
177
  : { scenario: options.scenario, rootPid };
182
178
  return resolveProcessResult(cleanupFailure === undefined ? verifiedCapture : capture, executionFailure, cleanup, options.observations, partialContext);
183
179
  };
184
- /** Preserve typed process-inspection preflight failures at the capture boundary. */
185
- export const normalizeCaptureFailure = (cause, signal) => {
186
- if (cause instanceof ProcessCaptureError)
187
- return cause;
188
- if (cause instanceof DarwinProcessOwnershipInspectionError)
189
- return new ProcessCaptureError(cause.message, { cause });
190
- if (signal?.aborted === true &&
191
- (cause === signal.reason ||
192
- (cause instanceof Error && cause.name === "AbortError")))
193
- return processCaptureCancelled();
194
- return cause;
195
- };
196
180
  const completeCapture = async (options) => {
197
181
  const unavailableReason = (stage, cause) => `${stage} failed: ${cause instanceof Error ? cause.message : "unknown failure"}`;
198
182
  const { runtime, scenario } = options;
@@ -201,7 +185,7 @@ const completeCapture = async (options) => {
201
185
  throw processCaptureCancelled();
202
186
  let settlement;
203
187
  try {
204
- settlement = await observeSettlement(options.runId, selectCapturedProcessGroupIds(runtime.terminal.pid, options.samples), scenario.settle_ms, options.recordEvent, options.hostPlatform);
188
+ settlement = await observeSettlement(options.runId, selectCapturedProcessGroupIds(runtime.terminal.pid, options.samples), scenario.settle_ms, options.recordEvent, options.hostPlatform, options.signal);
205
189
  }
206
190
  catch (cause) {
207
191
  options.observationBuffer.settlement = {
@@ -214,7 +198,8 @@ const completeCapture = async (options) => {
214
198
  state: "available",
215
199
  value: settlement,
216
200
  };
217
- const samplingPartial = (await runtime.stopSampler()).partial;
201
+ const sampling = await runtime.stopSampler();
202
+ const samplingPartial = sampling.partial;
218
203
  await settleProcessCaptureJournal(options.eventJournal);
219
204
  assertNotCancelled(options.signal);
220
205
  let after;
@@ -266,7 +251,7 @@ const completeCapture = async (options) => {
266
251
  name: "after_settlement",
267
252
  at_ms: Math.max(0, Date.now() - runtime.started),
268
253
  files: after.files,
269
- effects: classifyFilesystemEffects(options.before.files, after.files),
254
+ effects: classifyFilesystemEffects(options.before, after),
270
255
  truncated: after.truncated,
271
256
  },
272
257
  ];
@@ -284,7 +269,8 @@ const completeCapture = async (options) => {
284
269
  options.observationBuffer.manifest = { state: "available", value: manifest };
285
270
  const truncated = options.initiallyTruncated ||
286
271
  after.truncated ||
287
- runtime.framesTruncated() ||
272
+ runtime.rawTerminalRetention().observed_frames >
273
+ runtime.rawTerminalRetention().retained_frames ||
288
274
  checkpoints.some(({ truncated: partial }) => partial) ||
289
275
  samplingPartial ||
290
276
  runtime.renderer.truncated();
@@ -295,6 +281,17 @@ const completeCapture = async (options) => {
295
281
  before: options.before,
296
282
  after,
297
283
  truncated,
284
+ ...(options.before.coverage === undefined || after.coverage === undefined
285
+ ? {}
286
+ : {
287
+ truncationDetails: {
288
+ raw_terminal: runtime.rawTerminalRetention(),
289
+ rendered_terminal: runtime.renderer.retention(),
290
+ filesystem_before: options.before.coverage,
291
+ filesystem_after: after.coverage,
292
+ process: sampling.coverage,
293
+ },
294
+ }),
298
295
  scenario,
299
296
  rootPid: runtime.terminal.pid,
300
297
  samplingPartial,
@@ -389,7 +386,6 @@ const runProcessScenario = async (scenario, signal, hostEnvironment = process.en
389
386
  });
390
387
  }
391
388
  catch (cause) {
392
- runtime?.terminal.kill("SIGKILL");
393
389
  executionFailure = normalizeCaptureFailure(cause, signal);
394
390
  if (runtime !== undefined &&
395
391
  observations.rendered_frames.state === "unavailable" &&
@@ -1,3 +1,4 @@
1
+ import { isIP } from "node:net";
1
2
  /** Bucket one elapsed process-capture timestamp under scenario normalization. */
2
3
  export const normalizeProcessElapsedTime = (elapsedMs, timeBucketMs) => Math.floor(elapsedMs / timeBucketMs) * timeBucketMs;
3
4
  /** Normalize one terminal/protocol payload under explicitly selected scenario rules. */
@@ -10,14 +11,31 @@ export const normalizeProcessText = (value, scenario, temporaryRoot, pid) => {
10
11
  for (const [index, root] of scenario.filesystem_observation_paths.entries())
11
12
  normalized = normalized.replaceAll(root, `<filesystem-root-${String(index)}>`);
12
13
  }
14
+ if (scenario.normalization.ports)
15
+ normalized = normalizePortTokens(normalized);
13
16
  if (scenario.normalization.pids)
14
17
  normalized = normalizePidTokens(normalized, [pid]);
15
- if (scenario.normalization.ports)
16
- normalized = normalized.replaceAll(/(?<=[:=])\d{2,5}\b/g, "<port>");
17
18
  for (const pattern of scenario.normalization.patterns)
18
19
  normalized = normalized.replaceAll(pattern.pattern, pattern.replacement);
19
20
  return normalized;
20
21
  };
22
+ // A port may end a sentence, but a period followed by a letter, digit, or
23
+ // underscore in any script continues a decimal, version, or host name and is
24
+ // not a port boundary.
25
+ // PTY chunks are normalized independently, so a period that ends the chunk
26
+ // stays unnormalized: its continuation may arrive in the next chunk.
27
+ const normalizePortTokens = (value) => {
28
+ const endpointNormalized = value.replaceAll(/(\b[a-z][a-z0-9+.-]*:\/\/[^\s/?#"'<>]+|\blocalhost|\b(?:\d{1,3}\.){3}\d{1,3}|\[[\da-f:.%]+\]):(\d{1,5})(?![\p{L}\p{N}_@:]|\.(?:[\p{L}\p{N}_]|$))/giu, (match, endpoint, port) => {
29
+ if (Number(port) > 65_535)
30
+ return match;
31
+ const isEndpoint = endpoint.includes("://")
32
+ ? URL.canParse(`${endpoint}:${port}`)
33
+ : endpoint.toLowerCase() === "localhost" ||
34
+ isIP(endpoint.replace(/^\[|\]$/gu, "")) !== 0;
35
+ return isEndpoint ? `${endpoint}:<port>` : match;
36
+ });
37
+ return endpointNormalized.replaceAll(/(\b(?:port|tcp_port|udp_port|listen)\b["']?\s*[:=]\s*)(\d{1,5})(?![\p{L}\p{N}_]|\.(?:[\p{L}\p{N}_]|$))/giu, (match, prefix, port) => Number(port) <= 65_535 ? `${prefix}<port>` : match);
38
+ };
21
39
  /** Project sampled observations under the caller-selected normalization rules. */
22
40
  export const normalizeProcessSamples = (samples, scenario, rootPid) => {
23
41
  const identifiers = [
@@ -328,6 +328,9 @@ export const startProcessSampler = (options) => {
328
328
  let stopped = false;
329
329
  let abortCurrent;
330
330
  let partial = false;
331
+ let limitReached = false;
332
+ let samplingFailures = 0;
333
+ let firstSamplingFailure = null;
331
334
  let rootInitialized = false;
332
335
  const sample = () => {
333
336
  if (stopped || pending !== undefined)
@@ -363,6 +366,7 @@ export const startProcessSampler = (options) => {
363
366
  continue;
364
367
  if (samples.length >= limit) {
365
368
  partial = true;
369
+ limitReached = true;
366
370
  continue;
367
371
  }
368
372
  lastObservations.set(value.pid, observation);
@@ -372,8 +376,16 @@ export const startProcessSampler = (options) => {
372
376
  }
373
377
  })
374
378
  .catch((cause) => {
375
- if (!(cause instanceof Error && cause.name === "AbortError"))
379
+ if (!(cause instanceof Error && cause.name === "AbortError")) {
376
380
  partial = true;
381
+ samplingFailures += 1;
382
+ firstSamplingFailure ??=
383
+ cause instanceof Error
384
+ ? `${cause.name}: ${cause.message}`
385
+ : typeof cause === "string"
386
+ ? cause
387
+ : `Unexpected sampling rejection (${typeof cause})`;
388
+ }
377
389
  })
378
390
  .then(() => {
379
391
  abortCurrent = undefined;
@@ -387,6 +399,17 @@ export const startProcessSampler = (options) => {
387
399
  clearInterval(timer);
388
400
  abortCurrent?.();
389
401
  await pending;
390
- return { partial };
402
+ return {
403
+ partial,
404
+ coverage: {
405
+ sample_limit: limit,
406
+ sampling_partial: partial,
407
+ retained_samples: samples.length,
408
+ sample_limit_reached: limitReached,
409
+ sampling_failures: samplingFailures,
410
+ first_sampling_failure: firstSamplingFailure,
411
+ coverage: "sampled",
412
+ },
413
+ };
391
414
  };
392
415
  };
@@ -19,6 +19,8 @@ export class TerminalRenderer {
19
19
  #frames = [];
20
20
  #pending = Promise.resolve();
21
21
  #capturedBytes = 0;
22
+ #observedBytes = 0;
23
+ #observedFrames = 0;
22
24
  #truncated = false;
23
25
  constructor(options) {
24
26
  this.options = options;
@@ -55,6 +57,16 @@ export class TerminalRenderer {
55
57
  truncated() {
56
58
  return this.#truncated;
57
59
  }
60
+ /** Budget accounting after awaiting queued writes with frames(). */
61
+ retention() {
62
+ return {
63
+ budget_bytes: this.options.maxBytes,
64
+ observed_bytes: this.#observedBytes,
65
+ retained_bytes: this.#capturedBytes,
66
+ observed_frames: this.#observedFrames,
67
+ retained_frames: this.#frames.length,
68
+ };
69
+ }
58
70
  /** Release addon and terminal resources after all writes settle. */
59
71
  async dispose() {
60
72
  await this.#pending;
@@ -71,6 +83,8 @@ export class TerminalRenderer {
71
83
  const serializedState = this.options.normalize(this.#serializeAddon.serialize());
72
84
  const bytes = Buffer.byteLength(serializedState) +
73
85
  lines.reduce((total, line) => total + Buffer.byteLength(line), 0);
86
+ this.#observedBytes += bytes;
87
+ this.#observedFrames += 1;
74
88
  if (this.#capturedBytes + bytes > this.options.maxBytes) {
75
89
  this.#truncated = true;
76
90
  return;
@@ -0,0 +1,14 @@
1
+ /** Snapshot caller-selected variables using Node child-process key semantics. */
2
+ export const snapshotEnvironment = (environment, platform = process.platform) => {
3
+ if (platform !== "win32")
4
+ return Object.freeze({ ...environment });
5
+ const snapshot = {};
6
+ // Node sorts keys lexicographically and forwards the first case-insensitive
7
+ // match on Windows. Canonical keys also make subsequent lookups deterministic.
8
+ for (const key of Object.keys(environment).sort()) {
9
+ const canonicalKey = key.toUpperCase();
10
+ if (!Object.hasOwn(snapshot, canonicalKey))
11
+ snapshot[canonicalKey] = environment[key];
12
+ }
13
+ return Object.freeze(snapshot);
14
+ };
@@ -0,0 +1,157 @@
1
+ import { McpServer, isCallToolResult, isJSONRPCRequest, isJSONRPCNotification, isJSONRPCResultResponse, } from "@modelcontextprotocol/server";
2
+ import { analysisErrorProjectionSchema } from "../contracts/errorSchemas.js";
3
+ import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
4
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
5
+ import { createEvidence } from "../domain/evidence.js";
6
+ import { jsonObjectSchema } from "../domain/jsonValue.js";
7
+ import { encodeToolResult } from "./toolResultEncoding.js";
8
+ /** Bind oversized MCP error recovery to this server's Evidence ledger. */
9
+ export class EvidenceMcpServer extends McpServer {
10
+ recordEvidence;
11
+ delivery;
12
+ constructor(info, options, recordEvidence, delivery) {
13
+ super(info, options);
14
+ this.recordEvidence = recordEvidence;
15
+ this.delivery = delivery;
16
+ }
17
+ /** Preserve the SDK transport lifecycle while retaining oversized errors. */
18
+ connect(transport) {
19
+ return super.connect(new ErrorEvidenceTransport(transport, this.recordEvidence, this.delivery));
20
+ }
21
+ }
22
+ class ErrorEvidenceTransport {
23
+ transport;
24
+ recordEvidence;
25
+ delivery;
26
+ onclose;
27
+ onerror;
28
+ onmessage;
29
+ hasPerRequestStream;
30
+ pendingTools = new Map();
31
+ constructor(transport, recordEvidence, delivery) {
32
+ this.transport = transport;
33
+ this.recordEvidence = recordEvidence;
34
+ this.delivery = delivery;
35
+ if (transport.hasPerRequestStream !== undefined)
36
+ this.hasPerRequestStream = transport.hasPerRequestStream;
37
+ transport.onmessage = (message, extra) => {
38
+ if (isJSONRPCRequest(message) &&
39
+ message.method === "tools/call" &&
40
+ typeof message.params?.["name"] === "string")
41
+ this.pendingTools.set(message.id, message.params["name"]);
42
+ // The SDK suppresses replies after cancellation, so send() cannot release
43
+ // this bookkeeping. Keep transport authentication outside retained data.
44
+ if (isJSONRPCNotification(message) &&
45
+ message.method === "notifications/cancelled") {
46
+ const id = message.params?.["requestId"];
47
+ if (typeof id === "string" || typeof id === "number")
48
+ this.pendingTools.delete(id);
49
+ }
50
+ this.onmessage?.(message, extra);
51
+ };
52
+ transport.onerror = (error) => this.onerror?.(error);
53
+ transport.onclose = () => {
54
+ this.pendingTools.clear();
55
+ this.onclose?.();
56
+ };
57
+ }
58
+ get sessionId() {
59
+ return this.transport.sessionId;
60
+ }
61
+ set sessionId(value) {
62
+ this.transport.sessionId = value;
63
+ }
64
+ start() {
65
+ return this.transport.start();
66
+ }
67
+ async close() {
68
+ try {
69
+ await this.transport.close();
70
+ }
71
+ finally {
72
+ this.pendingTools.clear();
73
+ }
74
+ }
75
+ setProtocolVersion(version) {
76
+ this.transport.setProtocolVersion?.(version);
77
+ }
78
+ setSupportedProtocolVersions(versions) {
79
+ this.transport.setSupportedProtocolVersions?.(versions);
80
+ }
81
+ async send(message, options) {
82
+ const id = "id" in message &&
83
+ (typeof message.id === "string" || typeof message.id === "number")
84
+ ? message.id
85
+ : undefined;
86
+ const tool = id === undefined ? undefined : this.pendingTools.get(id);
87
+ try {
88
+ const recovered = this.recoverError(message, tool);
89
+ if (isJSONRPCResultResponse(recovered) &&
90
+ isCallToolResult(recovered.result) &&
91
+ recovered.result.isError === true) {
92
+ // Keep the complete typed JSON in content. Error projections are not
93
+ // success outputSchema data; oversized recovery must consume their
94
+ // private structured carrier before it is removed from the wire.
95
+ const { structuredContent: _diagnostic, ...result } = recovered.result;
96
+ await this.transport.send({ ...recovered, result }, options);
97
+ }
98
+ else
99
+ await this.transport.send(recovered, options);
100
+ }
101
+ finally {
102
+ if (!isJSONRPCRequest(message) && id !== undefined)
103
+ this.pendingTools.delete(id);
104
+ }
105
+ }
106
+ recoverError(message, tool) {
107
+ if (!isJSONRPCResultResponse(message) ||
108
+ !isCallToolResult(message.result) ||
109
+ message.result.isError !== true ||
110
+ message.result.structuredContent === undefined)
111
+ return message;
112
+ const structured = jsonObjectSchema.parse(message.result.structuredContent);
113
+ const budget = this.delivery.resultBudgetBytes;
114
+ // The delivered error omits structuredContent, so only its text counts.
115
+ const encoded = encodeToolResult(structured, budget, "text");
116
+ if (encoded.ok)
117
+ return message;
118
+ const operation = tool ?? "mcp_tool_error";
119
+ const originalError = analysisErrorProjectionSchema.safeParse(structured["error"]);
120
+ // Retain the already projected diagnostic. Transport authentication and raw
121
+ // request arguments are deliberately excluded: the application owns their
122
+ // explicit sensitivity policy, and its error projection is authoritative.
123
+ const evidence = createEvidence(undefined, { id: "rea-mcp", name: "REA MCP delivery", version: "1" }, {
124
+ operation: "mcp_tool_error",
125
+ parameters: { tool_name: operation },
126
+ result: structured,
127
+ rawResult: jsonObjectSchema.parse(message.result),
128
+ });
129
+ const recorded = this.recordEvidence?.(evidence);
130
+ const retained = recorded !== undefined && recorded.ok;
131
+ const failure = new AnalysisResourceConstraintError(operation, "transport", "The tool failed, but its complete error response exceeds the MCP response budget.", {
132
+ boundary: "mcp-response",
133
+ ...(originalError.success
134
+ ? { original_error_code: originalError.data.code }
135
+ : {}),
136
+ result_budget_bytes: budget,
137
+ response_bytes_at_least: encoded.bytesAtLeast,
138
+ constraint: encoded.constraint,
139
+ ...(retained
140
+ ? {
141
+ evidence_reference: {
142
+ kind: "retained-evidence",
143
+ evidence_id: evidence.evidence_id,
144
+ },
145
+ }
146
+ : { retention: recorded === undefined ? "unavailable" : "failed" }),
147
+ ...(recorded !== undefined && !recorded.ok
148
+ ? { retention_error: projectAnalysisError(recorded.error) }
149
+ : {}),
150
+ }, {
151
+ remediationAction: retained
152
+ ? "Export the retained original error through export_evidence_bundle to a caller-selected path. The connection remains usable."
153
+ : "Restart REA with a larger REA_MCP_MAX_RESPONSE_BYTES and matching client receive buffer, then retry. The original error could not be retained by this server.",
154
+ });
155
+ return { ...message, result: this.delivery.toErrorToolResult(failure) };
156
+ }
157
+ }