rea-agents 3.1.0 → 3.2.1

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 (590) hide show
  1. package/README.md +72 -95
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -1,38 +1,27 @@
1
- import { performance } from "node:perf_hooks";
2
- import { HopperCancelledError, HopperProcessError, HopperProtocolError, HopperTimeoutError, } from "../domain/errors.js";
1
+ import { HopperCancelledError, HopperProcessError, HopperProtocolError, HopperRemoteError, } from "../domain/errors.js";
3
2
  import { err } from "../domain/result.js";
4
- /** Bounded FIFO that keeps the wire serialized until Hopper actually replies. */
3
+ /** FIFO that keeps the wire serialized until Hopper actually replies. */
5
4
  export class HopperRequestQueue {
6
- maximum;
7
5
  send;
8
6
  #queue = [];
9
7
  #active;
10
- constructor(maximum, send) {
11
- this.maximum = maximum;
8
+ constructor(send) {
12
9
  this.send = send;
13
10
  }
14
- /** Queue one request, counting queue wait against its caller deadline. */
11
+ /** Queue one request until Hopper replies or the caller cancels it. */
15
12
  run(id, method, params, options) {
16
13
  if (options.signal?.aborted === true)
17
14
  return Promise.resolve(err(new HopperCancelledError()));
18
- if (options.timeoutMs <= 0)
19
- return Promise.resolve(err(new HopperTimeoutError(options.timeoutMs)));
20
- if (this.#size() >= this.maximum)
21
- return Promise.resolve(err(new HopperProtocolError(`Hopper serial request queue reached its ${String(this.maximum)}-request limit`)));
22
15
  return new Promise((resolve) => {
23
16
  let entry;
24
17
  const onAbort = options.signal === undefined ? undefined : () => this.#cancel(entry);
25
- const timer = setTimeout(() => this.#timeout(entry), options.timeoutMs);
26
18
  entry = {
27
19
  id,
28
20
  method,
29
21
  params,
30
22
  signal: options.signal,
31
- timeoutMs: options.timeoutMs,
32
- deadline: performance.now() + options.timeoutMs,
33
23
  progress: options.progress,
34
24
  resolve,
35
- timer,
36
25
  onAbort,
37
26
  callerState: "waiting",
38
27
  callerSettled: false,
@@ -53,8 +42,16 @@ export class HopperRequestQueue {
53
42
  if (entry === undefined || entry.id !== id)
54
43
  return false;
55
44
  this.#releaseWire(entry);
56
- if (!entry.callerSettled)
57
- this.#settleCaller(entry, result, "waiting");
45
+ if (!entry.callerSettled) {
46
+ const contextual = !result.ok && result.error instanceof HopperRemoteError
47
+ ? err(new HopperRemoteError(result.error.code, result.error.safeMessage, {
48
+ diagnosticType: result.error.diagnosticType,
49
+ operation: entry.method,
50
+ requestId: entry.id,
51
+ }))
52
+ : result;
53
+ this.#settleCaller(entry, contextual, "waiting");
54
+ }
58
55
  this.#active = undefined;
59
56
  this.#drain();
60
57
  return true;
@@ -88,10 +85,10 @@ export class HopperRequestQueue {
88
85
  if (active !== undefined) {
89
86
  this.#releaseWire(active);
90
87
  if (!active.callerSettled)
91
- this.#settleCaller(active, err(error), "waiting");
88
+ this.#settleCaller(active, err(withRequestContext(error, active)), "waiting");
92
89
  }
93
90
  for (const entry of this.#queue.splice(0))
94
- this.#settleCaller(entry, err(error), "waiting");
91
+ this.#settleCaller(entry, err(withRequestContext(error, entry)), "waiting");
95
92
  }
96
93
  /** Snapshot the one request still occupying Hopper's serial Python thread. */
97
94
  activity() {
@@ -102,7 +99,6 @@ export class HopperRequestQueue {
102
99
  requestId: active.id,
103
100
  operation: active.method,
104
101
  elapsedMs: Math.max(0, Math.round(performance.now() - active.startedAt)),
105
- timeoutMs: active.timeoutMs,
106
102
  callerState: active.callerState,
107
103
  queuedRequests: this.#queue.length,
108
104
  };
@@ -124,11 +120,8 @@ export class HopperRequestQueue {
124
120
  const entry = this.#queue.shift();
125
121
  if (entry === undefined)
126
122
  return;
127
- const remaining = entry.deadline - performance.now();
128
- if (entry.signal?.aborted === true || remaining <= 0) {
129
- this.#settleCaller(entry, entry.signal?.aborted === true
130
- ? err(new HopperCancelledError())
131
- : err(new HopperTimeoutError(entry.timeoutMs)), entry.signal?.aborted === true ? "cancelled" : "timed_out");
123
+ if (entry.signal?.aborted === true) {
124
+ this.#settleCaller(entry, err(new HopperCancelledError()), "cancelled");
132
125
  this.#drain();
133
126
  return;
134
127
  }
@@ -148,19 +141,6 @@ export class HopperRequestQueue {
148
141
  this.accept(entry.id, err(new HopperProtocolError("Hopper socket write failed", { cause })));
149
142
  }
150
143
  }
151
- #timeout(entry) {
152
- if (entry.callerSettled)
153
- return;
154
- if (this.#active === entry) {
155
- this.#settleCaller(entry, err(new HopperTimeoutError(entry.timeoutMs)), "timed_out");
156
- return;
157
- }
158
- const index = this.#queue.indexOf(entry);
159
- if (index < 0)
160
- return;
161
- this.#queue.splice(index, 1);
162
- this.#settleCaller(entry, err(new HopperTimeoutError(entry.timeoutMs)), "timed_out");
163
- }
164
144
  #cancel(entry) {
165
145
  if (entry.callerSettled)
166
146
  return;
@@ -183,7 +163,6 @@ export class HopperRequestQueue {
183
163
  clearInterval(entry.heartbeat);
184
164
  entry.heartbeat = undefined;
185
165
  }
186
- clearTimeout(entry.timer);
187
166
  if (entry.signal !== undefined && entry.onAbort !== undefined)
188
167
  entry.signal.removeEventListener("abort", entry.onAbort);
189
168
  entry.resolve(result);
@@ -192,7 +171,6 @@ export class HopperRequestQueue {
192
171
  if (entry.heartbeat !== undefined)
193
172
  clearInterval(entry.heartbeat);
194
173
  entry.heartbeat = undefined;
195
- clearTimeout(entry.timer);
196
174
  if (entry.signal !== undefined && entry.onAbort !== undefined)
197
175
  entry.signal.removeEventListener("abort", entry.onAbort);
198
176
  }
@@ -213,3 +191,6 @@ export class HopperRequestQueue {
213
191
  }
214
192
  }
215
193
  }
194
+ const withRequestContext = (error, entry) => error instanceof HopperProcessError
195
+ ? new HopperProcessError(error.exitCode, error.diagnostic, entry.method, entry.id)
196
+ : error;
@@ -1,6 +1,5 @@
1
1
  import { parseBridgeMessageLine, } from "./protocol.js";
2
- const MAX_LINE_BYTES = 10 * 1024 * 1024;
3
- /** Incrementally validates bounded Hopper NDJSON response frames. */
2
+ /** Incrementally validates Hopper NDJSON response frames. */
4
3
  export class HopperResponseStream {
5
4
  options;
6
5
  #buffer = "";
@@ -13,17 +12,10 @@ export class HopperResponseStream {
13
12
  while (newline >= 0) {
14
13
  const line = this.#buffer.slice(0, newline).trim();
15
14
  this.#buffer = this.#buffer.slice(newline + 1);
16
- if (Buffer.byteLength(line) > MAX_LINE_BYTES) {
17
- this.options.abort("Hopper response exceeded the maximum line size");
18
- return;
19
- }
20
15
  if (line.length > 0 && !this.#acceptLine(line))
21
16
  return;
22
17
  newline = this.#buffer.indexOf("\n");
23
18
  }
24
- if (Buffer.byteLength(this.#buffer) > MAX_LINE_BYTES) {
25
- this.options.abort("Hopper response exceeded the maximum line size");
26
- }
27
19
  }
28
20
  reset() {
29
21
  this.#buffer = "";
@@ -11,13 +11,14 @@ export const parseHopperServerInfo = (value, expectedRunId) => {
11
11
  return ok({ name: value.name, version: value.version });
12
12
  return err(new HopperProtocolError("Hopper bridge health result is invalid"));
13
13
  };
14
- /** Require Hopper to confirm both analysis and document shutdown. */
14
+ /** Require confirmation that the REA bridge detached or its document closed. */
15
15
  export const isHopperShutdownAcknowledgement = (value) => {
16
16
  if (typeof value !== "object" || value === null || Array.isArray(value))
17
17
  return false;
18
18
  if (value.shutdown !== true)
19
19
  return false;
20
- return value.analysis_stopped === true && value.document_closed === true;
20
+ return ((value.analysis_stopped === true && value.document_closed === true) ||
21
+ (value.document_closed === false && value.document_retained === true));
21
22
  };
22
23
  /** Detect the verified Linux bridge response that requires group cleanup. */
23
24
  export const isHopperCleanupRequired = (value) => typeof value === "object" &&
@@ -0,0 +1,119 @@
1
+ import { createHash } from "node:crypto";
2
+ import { chmod, lstat, mkdir, realpath, rm } from "node:fs/promises";
3
+ import { createConnection, createServer, } from "node:net";
4
+ import { join, resolve } from "node:path";
5
+ const leaseDirectory = join("/tmp", `rea-hopper-${process.getuid?.() ?? 0}`);
6
+ /** Keep two REA processes from opening duplicate Hopper documents for one target/profile. */
7
+ export const acquireHopperTargetLease = async (input) => {
8
+ const directory = input.directory ?? leaseDirectory;
9
+ await ensureLeaseDirectory(directory);
10
+ const targetPath = await realpath(input.targetPath).catch(() => resolve(input.targetPath));
11
+ const key = createHash("sha256")
12
+ .update(JSON.stringify({
13
+ targetPath,
14
+ targetKind: input.targetKind,
15
+ loaderArgs: input.loaderArgs,
16
+ }))
17
+ .digest("hex")
18
+ .slice(0, 32);
19
+ const socketPath = join(directory, `${key}.sock`);
20
+ const owner = { runId: input.runId, processId: process.pid };
21
+ for (let attempt = 0; attempt < 2; attempt += 1) {
22
+ const server = createServer((socket) => sendOwner(socket, owner));
23
+ const bound = await bind(server, socketPath);
24
+ if (bound) {
25
+ await chmod(socketPath, 0o600);
26
+ let released = false;
27
+ return {
28
+ acquired: true,
29
+ lease: {
30
+ release: async () => {
31
+ if (released)
32
+ return;
33
+ released = true;
34
+ await closeServer(server);
35
+ await rm(socketPath, { force: true });
36
+ },
37
+ },
38
+ };
39
+ }
40
+ const existingOwner = await readOwner(socketPath);
41
+ if (existingOwner !== undefined)
42
+ return { acquired: false, owner: existingOwner };
43
+ await rm(socketPath, { force: true });
44
+ }
45
+ throw new Error("Could not acquire the Hopper target lease");
46
+ };
47
+ const ensureLeaseDirectory = async (directory) => {
48
+ await mkdir(directory, { recursive: true, mode: 0o700 });
49
+ const directoryStat = await lstat(directory);
50
+ if (directoryStat.isSymbolicLink() ||
51
+ directoryStat.isDirectory() === false ||
52
+ (process.getuid !== undefined && directoryStat.uid !== process.getuid()))
53
+ throw new Error("Hopper target lease directory is not private");
54
+ if ((directoryStat.mode & 0o077) !== 0)
55
+ await chmod(directory, 0o700);
56
+ };
57
+ const bind = (server, socketPath) => new Promise((resolveBind, reject) => {
58
+ const onError = (error) => {
59
+ server.removeListener("listening", onListening);
60
+ if (error.code === "EADDRINUSE")
61
+ resolveBind(false);
62
+ else
63
+ reject(error);
64
+ };
65
+ const onListening = () => {
66
+ server.removeListener("error", onError);
67
+ resolveBind(true);
68
+ };
69
+ server.once("error", onError);
70
+ server.once("listening", onListening);
71
+ server.listen(socketPath);
72
+ });
73
+ const sendOwner = (socket, owner) => {
74
+ socket.end(`${JSON.stringify(owner)}\n`);
75
+ };
76
+ const readOwner = (socketPath) => new Promise((resolveOwner) => {
77
+ const socket = createConnection(socketPath);
78
+ let response = "";
79
+ const timer = setTimeout(() => {
80
+ socket.destroy();
81
+ resolveOwner(undefined);
82
+ }, 250);
83
+ const finish = (owner) => {
84
+ clearTimeout(timer);
85
+ socket.destroy();
86
+ resolveOwner(owner);
87
+ };
88
+ socket.on("data", (chunk) => {
89
+ response += chunk.toString("utf8");
90
+ const newline = response.indexOf("\n");
91
+ if (newline < 0)
92
+ return;
93
+ try {
94
+ const value = JSON.parse(response.slice(0, newline));
95
+ if (typeof value === "object" &&
96
+ value !== null &&
97
+ typeof Reflect.get(value, "runId") === "string" &&
98
+ typeof Reflect.get(value, "processId") === "number")
99
+ finish({
100
+ runId: Reflect.get(value, "runId"),
101
+ processId: Reflect.get(value, "processId"),
102
+ });
103
+ else
104
+ finish(undefined);
105
+ }
106
+ catch {
107
+ finish(undefined);
108
+ }
109
+ });
110
+ socket.on("error", () => finish(undefined));
111
+ socket.on("end", () => finish(undefined));
112
+ });
113
+ const closeServer = (server) => new Promise((resolveClose, reject) => {
114
+ if (!server.listening) {
115
+ resolveClose();
116
+ return;
117
+ }
118
+ server.close((error) => (error ? reject(error) : resolveClose()));
119
+ });
@@ -1,17 +1,10 @@
1
1
  import { z } from "zod";
2
2
  import { isHopperStartupFailureCode, } from "../domain/hopperStartupFailure.js";
3
- export const LINUX_PRIVATE_DISPLAY_DIAGNOSTIC_PREFIX = "REA_X11_DIAGNOSTIC_V1=";
4
- const diagnosticSchema = z
5
- .object({
6
- schema_version: z.literal(1),
3
+ export const LINUX_PRIVATE_DISPLAY_DIAGNOSTIC_PREFIX = "REA_X11_DIAGNOSTIC=";
4
+ const diagnosticContextSchema = z.object({
7
5
  component: z.literal("hopper_private_display"),
8
6
  operation: z.enum(["probe", "launch"]),
9
- status: z.enum(["ready", "error"]),
10
- failure_code: z.string().max(64).nullable(),
11
- reason: z
12
- .string()
13
- .regex(/^[a-z0-9_]+$/u)
14
- .max(64),
7
+ reason: z.string().regex(/^[a-z0-9_]+$/u),
15
8
  socket_directory: z.literal("/tmp/.X11-unix"),
16
9
  socket_directory_mode: z
17
10
  .string()
@@ -28,16 +21,28 @@ const diagnosticSchema = z
28
21
  fallback_reason: z
29
22
  .string()
30
23
  .regex(/^[a-z0-9_]+$/u)
31
- .max(64)
32
24
  .nullable(),
33
25
  xvfb_stderr_bytes: z.number().int().nonnegative().safe(),
34
- xvfb_stderr_truncated: z.boolean(),
35
- })
36
- .strict();
37
- /** Parse exactly one bounded, versioned helper diagnostic from stderr. */
38
- export const parseLinuxPrivateDisplayDiagnostic = (stderr, truncated) => {
39
- if (truncated)
40
- return { ok: false, reason: "diagnostic_truncated" };
26
+ });
27
+ const failureCodeSchema = z.string().transform((value, context) => {
28
+ if (isHopperStartupFailureCode(value))
29
+ return value;
30
+ context.addIssue({
31
+ code: "custom",
32
+ message: "Unknown startup failure code",
33
+ });
34
+ return z.NEVER;
35
+ });
36
+ const diagnosticSchema = z.discriminatedUnion("status", [
37
+ diagnosticContextSchema
38
+ .extend({ status: z.literal("ready"), failure_code: z.null() })
39
+ .strict(),
40
+ diagnosticContextSchema
41
+ .extend({ status: z.literal("error"), failure_code: failureCodeSchema })
42
+ .strict(),
43
+ ]);
44
+ /** Parse exactly one helper diagnostic from stderr. */
45
+ export const parseLinuxPrivateDisplayDiagnostic = (stderr) => {
41
46
  const records = stderr
42
47
  .split("\n")
43
48
  .filter((line) => line.startsWith(LINUX_PRIVATE_DISPLAY_DIAGNOSTIC_PREFIX));
@@ -52,19 +57,7 @@ export const parseLinuxPrivateDisplayDiagnostic = (stderr, truncated) => {
52
57
  const parsed = diagnosticSchema.safeParse(JSON.parse(record.slice(LINUX_PRIVATE_DISPLAY_DIAGNOSTIC_PREFIX.length)));
53
58
  if (!parsed.success)
54
59
  return { ok: false, reason: "diagnostic_malformed" };
55
- const code = parsed.data.failure_code;
56
- if (code !== null && !isHopperStartupFailureCode(code))
57
- return { ok: false, reason: "diagnostic_malformed" };
58
- if ((parsed.data.status === "ready" && code !== null) ||
59
- (parsed.data.status === "error" && code === null))
60
- return { ok: false, reason: "diagnostic_malformed" };
61
- return {
62
- ok: true,
63
- value: {
64
- ...parsed.data,
65
- failure_code: code,
66
- },
67
- };
60
+ return { ok: true, value: parsed.data };
68
61
  }
69
62
  catch {
70
63
  return { ok: false, reason: "diagnostic_malformed" };
@@ -6,7 +6,6 @@ import { parseLinuxPrivateDisplayDiagnostic } from "./LinuxPrivateDisplayDiagnos
6
6
  const PYTHON_PATH = "/usr/bin/python3";
7
7
  const UNSHARE_PATH = "/usr/bin/unshare";
8
8
  const DEFAULT_PROBE_TIMEOUT_MS = 5_000;
9
- const PROBE_OUTPUT_LIMIT_BYTES = 64 * 1024;
10
9
  /** Probe the exact Xvfb boundary and select the least-privileged viable strategy. */
11
10
  export const selectLinuxPrivateDisplayStrategy = async (options) => {
12
11
  const timeoutMs = options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
@@ -26,7 +25,6 @@ export const selectLinuxPrivateDisplayStrategy = async (options) => {
26
25
  effective_socket_directory_mode: isolated.diagnostic.effective_socket_directory_mode,
27
26
  effective_mount_read_only: isolated.diagnostic.effective_mount_read_only,
28
27
  xvfb_stderr_bytes: isolated.diagnostic.xvfb_stderr_bytes,
29
- xvfb_stderr_truncated: isolated.diagnostic.xvfb_stderr_truncated,
30
28
  });
31
29
  return {
32
30
  ok: true,
@@ -39,7 +37,7 @@ export const selectLinuxPrivateDisplayStrategy = async (options) => {
39
37
  },
40
38
  };
41
39
  };
42
- /** Run one helper probe in an owned process group with a hard output bound. */
40
+ /** Run one helper probe in an owned process group and retain its full diagnostics. */
43
41
  export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
44
42
  if (options.signal?.aborted === true)
45
43
  return emptyProcessResult("cancelled");
@@ -61,9 +59,7 @@ export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
61
59
  ownsProcessLifetime: true,
62
60
  cleanup: () => cleanupOwnedProcessGroup(started.ownership),
63
61
  };
64
- const supervisor = new ProviderProcessSupervisor(launch, {
65
- maxOutputBytesPerStream: PROBE_OUTPUT_LIMIT_BYTES,
66
- });
62
+ const supervisor = new ProviderProcessSupervisor(launch);
67
63
  const outcome = await waitForProbeExit(supervisor, options.timeoutMs, options.signal);
68
64
  let cleanupIncomplete = false;
69
65
  if (outcome !== "exit") {
@@ -82,7 +78,6 @@ export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
82
78
  exitCode: snapshot.exitCode,
83
79
  stderr: snapshot.stderr.text,
84
80
  stderrBytes: snapshot.stderr.bytes,
85
- stderrTruncated: snapshot.stderr.truncated,
86
81
  cleanupIncomplete,
87
82
  };
88
83
  };
@@ -142,7 +137,7 @@ const evaluatedProbe = async (strategy, options, timeoutMs, runner) => {
142
137
  ok: false,
143
138
  diagnostic: syntheticDiagnostic(strategy, "cleanup_incomplete"),
144
139
  };
145
- const parsed = parseLinuxPrivateDisplayDiagnostic(processResult.stderr, processResult.stderrTruncated);
140
+ const parsed = parseLinuxPrivateDisplayDiagnostic(processResult.stderr);
146
141
  if (!parsed.ok)
147
142
  return {
148
143
  ok: false,
@@ -162,10 +157,8 @@ const evaluatedProbe = async (strategy, options, timeoutMs, runner) => {
162
157
  };
163
158
  const exitMatchesDiagnostic = (exitCode, diagnostic) => diagnostic.status === "ready"
164
159
  ? exitCode === 0
165
- : diagnostic.failure_code !== null &&
166
- hopperStartupExitCode(diagnostic.failure_code) === exitCode;
160
+ : hopperStartupExitCode(diagnostic.failure_code) === exitCode;
167
161
  const syntheticDiagnostic = (strategy, reason, failureCode = "private_display_unavailable") => ({
168
- schema_version: 1,
169
162
  component: "hopper_private_display",
170
163
  operation: "probe",
171
164
  status: "error",
@@ -180,14 +173,11 @@ const syntheticDiagnostic = (strategy, reason, failureCode = "private_display_un
180
173
  strategy,
181
174
  fallback_reason: null,
182
175
  xvfb_stderr_bytes: 0,
183
- xvfb_stderr_truncated: false,
184
176
  });
185
177
  const unavailable = (diagnostic) => ({
186
178
  ok: false,
187
179
  strategy: "unavailable",
188
- exitCode: diagnostic.failure_code === null
189
- ? 70
190
- : (hopperStartupExitCode(diagnostic.failure_code) ?? 70),
180
+ exitCode: hopperStartupExitCode(diagnostic.failure_code) ?? 70,
191
181
  diagnostic: { ...diagnostic, strategy: "unavailable" },
192
182
  });
193
183
  const emptyProcessResult = (outcome) => ({
@@ -195,7 +185,6 @@ const emptyProcessResult = (outcome) => ({
195
185
  exitCode: undefined,
196
186
  stderr: "",
197
187
  stderrBytes: 0,
198
- stderrTruncated: false,
199
188
  cleanupIncomplete: false,
200
189
  });
201
190
  const waitForProbeExit = async (supervisor, timeoutMs, signal) => {
@@ -5,7 +5,7 @@ import { err, ok } from "../domain/result.js";
5
5
  const remoteErrorSchema = z
6
6
  .object({
7
7
  code: z.number().int(),
8
- message: z.string().max(512),
8
+ message: z.string(),
9
9
  type: z
10
10
  .enum([
11
11
  "remote",
@@ -38,10 +38,10 @@ const eventSchema = z
38
38
  z
39
39
  .object({
40
40
  type: z.literal("progress"),
41
- phase: z.string().min(1).max(64),
41
+ phase: z.string().min(1),
42
42
  completed: z.number().nonnegative().finite(),
43
43
  total: z.number().nonnegative().finite().nullable(),
44
- message: z.string().min(1).max(512),
44
+ message: z.string().min(1),
45
45
  terminal: z.boolean().optional(),
46
46
  })
47
47
  .strict(),
@@ -82,5 +82,7 @@ export const parseBridgeMessageLine = (line) => {
82
82
  };
83
83
  /** Project a parsed response into its result or expected remote failure. */
84
84
  export const responseResult = (response) => "error" in response
85
- ? err(new HopperRemoteError(response.error.code, response.error.message, response.error.type))
85
+ ? err(new HopperRemoteError(response.error.code, response.error.message, {
86
+ diagnosticType: response.error.type,
87
+ }))
86
88
  : ok(response.result);
@@ -33,9 +33,6 @@ export const registerConfigReload = (input) => {
33
33
  return;
34
34
  }
35
35
  runtimeState.currentConfig = refreshed.value;
36
- Object.assign(runtimeState.evidencePolicy, refreshed.value.evidenceFilePolicy);
37
- Object.assign(runtimeState.snapshotPolicy, refreshed.value.analysisSnapshotFilePolicy);
38
- runtimeState.investigationRoots.splice(0, runtimeState.investigationRoots.length, ...refreshed.value.investigationInputRoots);
39
36
  })
40
37
  .catch(() => {
41
38
  serverLogger.error(MCP_PERMISSION_RELOAD_FAILED);
@@ -8,7 +8,7 @@ export const createShutdown = (input) => {
8
8
  unregisterReload();
9
9
  unregisterShutdown();
10
10
  await handle.close();
11
- await session.close();
11
+ await session.close({ retainProviderDocuments: true });
12
12
  permissionAuthority.clearSessionGrants();
13
13
  })();
14
14
  return shutdownPromise;
@@ -1,12 +1,3 @@
1
1
  export const createRuntimeState = (config) => ({
2
2
  currentConfig: config,
3
- evidencePolicy: {
4
- ...config.evidenceFilePolicy,
5
- roots: [...config.evidenceFilePolicy.roots],
6
- },
7
- snapshotPolicy: {
8
- ...config.analysisSnapshotFilePolicy,
9
- roots: [...config.analysisSnapshotFilePolicy.roots],
10
- },
11
- investigationRoots: [...config.investigationInputRoots],
12
3
  });
@@ -14,9 +14,6 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
14
14
  handle = dependencies.serve(() => (dependencies.createServer ?? createServer)(session, session, {
15
15
  logger: serverContext.logger,
16
16
  processPolicy: () => serverContext.runtimeState.currentConfig.processExecutionPolicy,
17
- evidenceFilePolicy: serverContext.runtimeState.evidencePolicy,
18
- investigationInputRoots: serverContext.runtimeState.investigationRoots,
19
- analysisSnapshotFilePolicy: serverContext.runtimeState.snapshotPolicy,
20
17
  permissionAuthority: serverContext.permissionAuthority,
21
18
  ...optionalProviders,
22
19
  artifactIntegrityContinueEnabled: () => serverContext.runtimeState.currentConfig
@@ -41,8 +38,6 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
41
38
  };
42
39
  const runtimeAvailability = (state) => ({
43
40
  processCaptureEnabled: state.currentConfig.processExecutionPolicy.status === "enabled",
44
- evidenceFileRoots: state.currentConfig.evidenceFilePolicy.roots.length,
45
- investigationInputRoots: state.currentConfig.investigationInputRoots.length,
46
41
  browserObservationEnabled: state.currentConfig.browserObservationPolicy.status === "enabled",
47
42
  browserScenarioEnabled: state.currentConfig.browserScenarioPolicy.status === "enabled",
48
43
  electronObservationEnabled: state.currentConfig.electronObservationPolicy.status === "enabled",