rea-agents 3.0.0 → 3.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 (628) hide show
  1. package/README.md +83 -108
  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/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -10,9 +10,10 @@ export const cleanupHopperSession = async (input) => {
10
10
  resources: new Set(),
11
11
  cleanupResult: undefined,
12
12
  shutdownConfirmed: false,
13
- ownedProcessStopped: false,
14
13
  };
15
- await report(input.progress, 0, "requesting Hopper document shutdown");
14
+ await report(input.progress, 0, input.retainDocument
15
+ ? "detaching REA from the Hopper document"
16
+ : "requesting Hopper document shutdown");
16
17
  await requestShutdown(input, state);
17
18
  await report(input.progress, 0.35, "releasing Hopper bridge transport");
18
19
  input.releaseTransport(input.socket);
@@ -34,12 +35,13 @@ const requestShutdown = async (input, state) => {
34
35
  return;
35
36
  }
36
37
  const shutdown = await input
37
- .request("shutdown")
38
+ .request(input.retainDocument || input.launch?.shutdownMode === "process-cleanup"
39
+ ? "shutdown"
40
+ : "shutdown_document")
38
41
  .catch(() => err(new HopperProcessError(null)));
39
42
  if (shutdown.ok &&
40
43
  isHopperCleanupRequired(shutdown.value) &&
41
- input.launch?.shutdownByCleanup === true &&
42
- input.launch.cleanup !== undefined) {
44
+ input.launch?.shutdownMode === "process-cleanup") {
43
45
  state.cleanupResult = await input.launch
44
46
  .cleanup()
45
47
  .catch(providerCleanupFailure);
@@ -82,7 +84,9 @@ const stopProcess = async (input, state) => {
82
84
  }
83
85
  input.logger.info(diagnostic, "Owned Hopper launcher shutdown completed");
84
86
  if (stopped.status !== "incomplete") {
85
- state.ownedProcessStopped = stopped.status !== "not-owned";
87
+ if (input.launch?.shutdownMode === "process-cleanup" &&
88
+ stopped.status !== "not-owned")
89
+ state.shutdownConfirmed = true;
86
90
  return;
87
91
  }
88
92
  const processGroupId = supervisor.launch.ownership?.processGroupId;
@@ -95,8 +99,7 @@ const stopProcess = async (input, state) => {
95
99
  };
96
100
  const recordUnconfirmedDocument = (input, state) => {
97
101
  if ((input.socket === undefined && input.launch === undefined) ||
98
- state.shutdownConfirmed ||
99
- state.ownedProcessStopped)
102
+ state.shutdownConfirmed)
100
103
  return;
101
104
  state.resources.add("hopper-document");
102
105
  state.issues.push({
@@ -142,7 +145,6 @@ const activityDetails = (activity) => ({
142
145
  request_id: activity.requestId,
143
146
  operation: activity.operation,
144
147
  elapsed_ms: activity.elapsedMs,
145
- timeout_ms: activity.timeoutMs,
146
148
  caller_state: activity.callerState,
147
149
  queued_requests: activity.queuedRequests,
148
150
  });
@@ -17,7 +17,6 @@ import { HopperRequestQueue, } from "./HopperRequestQueue.js";
17
17
  import { HopperResponseStream } from "./HopperResponseStream.js";
18
18
  import { responseResult, } from "./protocol.js";
19
19
  const SHUTDOWN_TIMEOUT_MS = 30_000;
20
- const MAX_QUEUED_REQUESTS = 64;
21
20
  const SESSION_ROOT = process.platform === "darwin" ? "/tmp" : tmpdir();
22
21
  /** Safe launcher telemetry; stderr content is intentionally never exposed. */
23
22
  /**
@@ -60,10 +59,9 @@ export class HopperClient {
60
59
  this.#logger = options.logger ?? silentLogger;
61
60
  this.#options = {
62
61
  ...options,
63
- requestTimeoutMs: options.requestTimeoutMs ?? 30_000,
64
62
  startupTimeoutMs: options.startupTimeoutMs ?? 120_000,
65
63
  };
66
- this.#requests = new HopperRequestQueue(MAX_QUEUED_REQUESTS, ({ id, method, params }, failed) => {
64
+ this.#requests = new HopperRequestQueue(({ id, method, params }, failed) => {
67
65
  const socket = this.#socket;
68
66
  const token = this.#token;
69
67
  if (socket === undefined || socket.destroyed || token === undefined) {
@@ -255,6 +253,7 @@ export class HopperClient {
255
253
  logger: this.#logger,
256
254
  onDiagnostic: this.#options.onDiagnostic,
257
255
  request: (method) => this.#request(method, {}, { timeoutMs: SHUTDOWN_TIMEOUT_MS }),
256
+ retainDocument: options.retainDocument === true,
258
257
  releaseTransport: (socket) => {
259
258
  this.#failAll(new HopperProcessError(null));
260
259
  if (socket !== undefined)
@@ -304,18 +303,16 @@ export class HopperClient {
304
303
  return err(new HopperTimeoutError(this.#options.startupTimeoutMs));
305
304
  }
306
305
  async #request(method, params, options) {
306
+ const id = this.#nextId++;
307
307
  const socket = this.#socket;
308
308
  const token = this.#token;
309
309
  if (socket === undefined || socket.destroyed || token === undefined) {
310
- return err(new HopperProcessError(null));
310
+ return err(new HopperProcessError(null, undefined, method, id));
311
311
  }
312
312
  if (options.signal?.aborted === true)
313
313
  return err(new HopperCancelledError());
314
- const id = this.#nextId++;
315
314
  const startedAt = performance.now();
316
- const timeoutMs = options.timeoutMs ?? this.#options.requestTimeoutMs;
317
315
  const result = await this.#requests.run(id, method, params, {
318
- timeoutMs,
319
316
  ...(options.signal === undefined ? {} : { signal: options.signal }),
320
317
  ...(options.progress !== undefined ? { progress: options.progress } : {}),
321
318
  });
@@ -399,6 +396,6 @@ export class HopperClient {
399
396
  }
400
397
  }
401
398
  const isAborted = (signal) => signal?.aborted === true;
402
- const startupInterruption = (deadline) => deadline.cancelled
399
+ const startupInterruption = (deadline) => deadline.interruption === "cancelled"
403
400
  ? new HopperCancelledError()
404
401
  : new HopperTimeoutError(deadline.timeoutMs);
@@ -1,8 +1,8 @@
1
1
  import { hopperStartupFailure, } from "../domain/errors.js";
2
2
  import { parseLinuxPrivateDisplayDiagnostic } from "./LinuxPrivateDisplayDiagnostic.js";
3
- /** Extract only a matching, versioned Linux adapter failure record. */
3
+ /** Extract only a matching Linux adapter failure record. */
4
4
  export const hopperLauncherFailureDiagnostic = (event) => {
5
- const parsed = parseLinuxPrivateDisplayDiagnostic(event.snapshot.stderr.text, event.snapshot.stderr.truncated);
5
+ const parsed = parseLinuxPrivateDisplayDiagnostic(event.snapshot.stderr.text);
6
6
  if (!parsed.ok)
7
7
  return undefined;
8
8
  const expected = hopperStartupFailure(event.code)?.code;
@@ -34,15 +34,8 @@ const CAPABILITIES = Object.freeze(HOPPER_PROVIDER_TOOL_CONTRACTS.map((contract)
34
34
  return Object.freeze({
35
35
  provider: IDENTITY,
36
36
  operation,
37
- inputContractVersion: 1,
38
- outputContractVersion: 1,
39
37
  available: true,
40
38
  reason: null,
41
- pagination: isRecord(contract.inputSchema.properties) &&
42
- "offset" in contract.inputSchema.properties
43
- ? "offset"
44
- : "none",
45
- exhaustive: false,
46
39
  effects: Object.freeze({
47
40
  mutatesArtifact: MUTATING_OPERATIONS.has(contract.name),
48
41
  launchesProcess: true,
@@ -52,19 +45,11 @@ const CAPABILITIES = Object.freeze(HOPPER_PROVIDER_TOOL_CONTRACTS.map((contract)
52
45
  changesPermissions: false,
53
46
  requiresRoot: false,
54
47
  }),
55
- limits: Object.freeze({
56
- maxResults: null,
57
- maxPayloadBytes: contract.name === "read_bytes" ? 4_096 : null,
58
- timeoutMs: null,
59
- }),
60
48
  limitations: Object.freeze([
61
49
  "Results depend on Hopper's completed static analysis.",
62
50
  ]),
63
51
  });
64
52
  }));
65
- function isRecord(value) {
66
- return typeof value === "object" && value !== null && !Array.isArray(value);
67
- }
68
53
  /** Concrete analysis provider backed by REA's private Hopper bridge. */
69
54
  export class HopperProvider {
70
55
  config;
@@ -129,20 +114,6 @@ export class HopperProvider {
129
114
  reason: null,
130
115
  diagnostics,
131
116
  };
132
- if (!["mach-o", "elf", "pe"].includes(target.format))
133
- return {
134
- status: "unsupported",
135
- code: "target_format_unsupported",
136
- reason: `Hopper cannot open ${target.format} through this adapter.`,
137
- diagnostics,
138
- };
139
- if (target.architecture === undefined)
140
- return {
141
- status: "unsupported",
142
- code: "architecture_unsupported",
143
- reason: "Hopper requires a supported concrete target architecture.",
144
- diagnostics,
145
- };
146
117
  return {
147
118
  status: "supported",
148
119
  code: null,
@@ -223,7 +194,6 @@ export class HopperProvider {
223
194
  requestId: activity.requestId,
224
195
  operation: activity.operation,
225
196
  elapsedMs: activity.elapsedMs,
226
- timeoutMs: activity.timeoutMs,
227
197
  callerState: activity.callerState,
228
198
  },
229
199
  queuedRequests: activity?.queuedRequests ?? 0,
@@ -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" };