rea-agents 3.1.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 (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,6 +1,5 @@
1
1
  import { WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON } from "../process/WindowsAuthority.js";
2
2
  import { GENERATED_MCP_TOOL_CATALOG } from "../generatedMcpToolCatalog.js";
3
- import { GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS, GHIDRA_MAX_LINE_BYTES, GHIDRA_REQUEST_TIMEOUT_MS, } from "./GhidraDefaults.js";
4
3
  import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
5
4
  import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
6
5
  /** Public identity committed by every Ghidra-backed observation. */
@@ -17,27 +16,9 @@ export const GHIDRA_PROVIDER_TOOL_CONTRACTS = Object.freeze([...GHIDRA_INVENTORY
17
16
  throw new TypeError(`Missing provider-neutral contract for ${operation}`);
18
17
  return contract;
19
18
  }));
20
- const PAGINATED_OPERATIONS = new Set([
21
- "list_names",
22
- "list_procedures",
23
- "list_strings",
24
- "search_procedures",
25
- "search_strings",
26
- "procedure_references",
27
- "read_function_instructions",
28
- "analyze_function",
29
- ]);
30
- const SEARCH_OPERATIONS = new Set([
31
- "search_procedures",
32
- "search_strings",
33
- ]);
34
- const DECOMPILE_OPERATIONS = new Set([
35
- "procedure_pseudo_code",
36
- "analyze_function",
37
- ]);
38
19
  /** Health limitations shared by every Ghidra-backed capability. */
39
20
  export const healthLimitations = Object.freeze([
40
- "The session serves operations only after default Ghidra auto-analysis completes; an analysis timeout fails the open instead of exposing partial results.",
21
+ "The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.",
41
22
  "The imported Program and temporary project are ephemeral, read-only to REA, and deleted on close.",
42
23
  ]);
43
24
  /** Additional limitations applied to the experimental Windows x64 P0 boundary. */
@@ -73,7 +54,6 @@ export const limitationsFor = (operation) => {
73
54
  return [
74
55
  ...common,
75
56
  "Only Ghidra-defined string Data is observed; charset is reported, while a non-missing terminator cannot distinguish a present terminator from a fixed or Pascal layout.",
76
- "Returned values are bounded to 1,024 Unicode code points and mark value_truncated instead of silently crossing the wire budget.",
77
57
  ];
78
58
  case "list_segments":
79
59
  return [
@@ -82,26 +62,23 @@ export const limitationsFor = (operation) => {
82
62
  ];
83
63
  case "search_procedures":
84
64
  case "search_strings":
85
- return [
86
- ...common,
87
- "Literal search enforces 1,000,000 cumulative work units; regex mode also accepts only a conservative finite Java-regex subset with 10,000 static paths and 4,096 UTF-16 code units per candidate.",
88
- ];
65
+ return common;
89
66
  case "procedure_pseudo_code":
90
67
  return [
91
68
  ...common,
92
- "Pseudocode is Ghidra decompiler output, not original source and not text-equivalent to Hopper output; each decompile has a 30-second native deadline.",
69
+ "Pseudocode is Ghidra decompiler output, not original source and not text-equivalent to Hopper output.",
93
70
  "External functions and functions without an analyzable body return null; other decompiler failures remain explicit.",
94
71
  ];
95
72
  case "read_function_instructions":
96
73
  return [
97
74
  ...common,
98
- "This bounded fast path reads only the requested function instruction window and does not invoke the decompiler or whole-program string/name inventories.",
75
+ "This fast path reads only the requested function and does not invoke the decompiler or whole-program string/name inventories.",
99
76
  "Instruction text is Ghidra-specific and does not claim textual equivalence with Hopper output.",
100
77
  ];
101
78
  case "procedure_assembly":
102
79
  return [
103
80
  ...common,
104
- "Assembly is Ghidra Listing text and fails rather than silently truncating when the 100,000-instruction or 1 MiB wire bound is exceeded.",
81
+ "Assembly is Ghidra Listing text and does not claim textual equivalence with Hopper output.",
105
82
  ];
106
83
  case "procedure_callers":
107
84
  case "procedure_callees":
@@ -120,7 +97,6 @@ export const limitationsFor = (operation) => {
120
97
  ...common,
121
98
  "Reference kinds are direct Ghidra ReferenceManager observations; unresolved computed flows without a target are absent and remain unknown.",
122
99
  "Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
123
- "Instruction scans stop at max_instructions; a truncated scan reports an unknown total and no false continuation.",
124
100
  ];
125
101
  case "analyze_function":
126
102
  return [
@@ -128,7 +104,7 @@ export const limitationsFor = (operation) => {
128
104
  "The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.",
129
105
  "Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.",
130
106
  "Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
131
- "The Java bridge serializes one function request per Program through a bounded 32-request queue and applies a 30-second native decompilation deadline.",
107
+ "The Java bridge serializes one function request per Program and lets each decompilation run until it completes or the caller cancels.",
132
108
  ];
133
109
  default:
134
110
  return common;
@@ -142,14 +118,8 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
142
118
  return Object.freeze({
143
119
  provider: GHIDRA_PROVIDER_IDENTITY,
144
120
  operation,
145
- inputContractVersion: 1,
146
- outputContractVersion: 1,
147
121
  available: true,
148
122
  reason: null,
149
- pagination: PAGINATED_OPERATIONS.has(contract.name)
150
- ? "offset"
151
- : "none",
152
- exhaustive: !PAGINATED_OPERATIONS.has(contract.name),
153
123
  effects: Object.freeze({
154
124
  mutatesArtifact: false,
155
125
  launchesProcess: true,
@@ -159,17 +129,6 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
159
129
  changesPermissions: false,
160
130
  requiresRoot: false,
161
131
  }),
162
- limits: Object.freeze({
163
- maxResults: PAGINATED_OPERATIONS.has(contract.name)
164
- ? SEARCH_OPERATIONS.has(contract.name)
165
- ? 100
166
- : 500
167
- : null,
168
- maxPayloadBytes: GHIDRA_MAX_LINE_BYTES,
169
- timeoutMs: DECOMPILE_OPERATIONS.has(contract.name)
170
- ? GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS
171
- : GHIDRA_REQUEST_TIMEOUT_MS,
172
- }),
173
132
  limitations: Object.freeze(limitationsFor(contract.name)),
174
133
  });
175
134
  }));
@@ -1,41 +1,28 @@
1
- import { performance } from "node:perf_hooks";
2
1
  import { err } from "../domain/result.js";
3
- /** Bounded FIFO that admits one Ghidra Program request at a time. */
2
+ /** FIFO that admits one Ghidra Program request at a time. */
4
3
  export class GhidraRequestQueue {
5
- maximum;
6
4
  execute;
7
5
  failure;
8
6
  #queue = [];
9
7
  #active = false;
10
- #size = 0;
11
- constructor(maximum, execute, failure) {
12
- this.maximum = maximum;
8
+ constructor(execute, failure) {
13
9
  this.execute = execute;
14
10
  this.failure = failure;
15
11
  }
16
- /** Queue one request, counting queue wait against its declared deadline. */
12
+ /** Queue one request until it completes, is cancelled, or the session closes. */
17
13
  run(method, parameters, options) {
18
14
  if (options.signal?.aborted === true)
19
15
  return Promise.resolve(err(this.failure("cancelled", "Ghidra request was cancelled")));
20
- if (options.timeoutMs <= 0)
21
- return Promise.resolve(err(this.failure("timeout", "Ghidra request deadline elapsed", options.timeoutMs)));
22
- if (this.#size >= this.maximum)
23
- return Promise.resolve(err(this.failure("protocol", `Ghidra serial request queue reached its ${String(this.maximum)}-request limit`)));
24
- this.#size += 1;
25
16
  return new Promise((resolve) => {
26
17
  let entry;
27
18
  const onAbort = options.signal === undefined
28
19
  ? undefined
29
20
  : () => this.#rejectQueued(entry, err(this.failure("cancelled", "Ghidra request was cancelled")));
30
- const timer = setTimeout(() => this.#rejectQueued(entry, err(this.failure("timeout", "Ghidra request deadline elapsed in the serial queue", options.timeoutMs))), options.timeoutMs);
31
21
  entry = {
32
22
  method,
33
23
  parameters,
34
24
  signal: options.signal,
35
- timeoutMs: options.timeoutMs,
36
- deadline: performance.now() + options.timeoutMs,
37
25
  resolve,
38
- timer,
39
26
  onAbort,
40
27
  };
41
28
  this.#queue.push(entry);
@@ -48,7 +35,6 @@ export class GhidraRequestQueue {
48
35
  failQueued(failure) {
49
36
  for (const entry of this.#queue.splice(0)) {
50
37
  this.#release(entry);
51
- this.#size -= 1;
52
38
  entry.resolve(err(failure));
53
39
  }
54
40
  }
@@ -59,25 +45,17 @@ export class GhidraRequestQueue {
59
45
  if (entry === undefined)
60
46
  return;
61
47
  this.#release(entry);
62
- const remaining = entry.deadline - performance.now();
63
- if (entry.signal?.aborted === true || remaining <= 0) {
64
- this.#size -= 1;
65
- entry.resolve(err(entry.signal?.aborted === true
66
- ? this.failure("cancelled", "Ghidra request was cancelled")
67
- : this.failure("timeout", "Ghidra request deadline elapsed in the serial queue", entry.timeoutMs)));
48
+ if (entry.signal?.aborted === true) {
49
+ entry.resolve(err(this.failure("cancelled", "Ghidra request was cancelled")));
68
50
  this.#drain();
69
51
  return;
70
52
  }
71
53
  this.#active = true;
72
- void this.execute(entry.method, entry.parameters, {
73
- ...(entry.signal === undefined ? {} : { signal: entry.signal }),
74
- timeoutMs: remaining,
75
- })
54
+ void this.execute(entry.method, entry.parameters, entry.signal === undefined ? {} : { signal: entry.signal })
76
55
  .then(entry.resolve)
77
56
  .catch(() => entry.resolve(err(this.failure("protocol", "Ghidra serial request execution rejected unexpectedly"))))
78
57
  .finally(() => {
79
58
  this.#active = false;
80
- this.#size -= 1;
81
59
  this.#drain();
82
60
  });
83
61
  }
@@ -87,11 +65,9 @@ export class GhidraRequestQueue {
87
65
  return;
88
66
  this.#queue.splice(index, 1);
89
67
  this.#release(entry);
90
- this.#size -= 1;
91
68
  entry.resolve(result);
92
69
  }
93
70
  #release(entry) {
94
- clearTimeout(entry.timer);
95
71
  if (entry.signal !== undefined && entry.onAbort !== undefined)
96
72
  entry.signal.removeEventListener("abort", entry.onAbort);
97
73
  }
@@ -1,4 +1,4 @@
1
- /** Splits fragmented UTF-8 socket data while enforcing a byte limit per line. */
1
+ /** Splits fragmented UTF-8 socket data into response lines. */
2
2
  export class GhidraResponseBuffer {
3
3
  #options;
4
4
  #buffer = "";
@@ -12,17 +12,11 @@ export class GhidraResponseBuffer {
12
12
  while (newline >= 0) {
13
13
  const encodedLine = this.#buffer.slice(0, newline);
14
14
  this.#buffer = this.#buffer.slice(newline + 1);
15
- if (Buffer.byteLength(encodedLine) > this.#options.maxLineBytes) {
16
- this.#options.onFailure("Ghidra response exceeded the maximum line size");
17
- return;
18
- }
19
15
  const line = encodedLine.trim();
20
16
  if (line.length > 0)
21
17
  this.#options.onLine(line);
22
18
  newline = this.#buffer.indexOf("\n");
23
19
  }
24
- if (Buffer.byteLength(this.#buffer) > this.#options.maxLineBytes)
25
- this.#options.onFailure("Ghidra response exceeded the maximum line size");
26
20
  }
27
21
  /** Drop any incomplete line when a session closes. */
28
22
  reset() {
@@ -1,6 +1,5 @@
1
1
  import { z } from "zod";
2
2
  import { err, ok } from "../domain/result.js";
3
- import { GHIDRA_BRIDGE_VERSION } from "./GhidraDefaults.js";
4
3
  import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
5
4
  import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
6
5
  /** Exact methods proved by the bridge handshake after auto-analysis. */
@@ -14,7 +13,6 @@ const capabilitySchema = z.enum(GHIDRA_SESSION_CAPABILITIES);
14
13
  const sessionInfoSchema = z
15
14
  .object({
16
15
  name: z.literal("REA Ghidra bridge"),
17
- bridge_version: z.literal(GHIDRA_BRIDGE_VERSION),
18
16
  run_id: z.string().uuid(),
19
17
  profile_digest: z.string().regex(/^[a-f0-9]{64}$/u),
20
18
  provider: z
@@ -1,7 +1,6 @@
1
1
  import { access, open } from "node:fs/promises";
2
2
  import { err, ok } from "../domain/result.js";
3
3
  import { GhidraSessionError } from "./GhidraSessionError.js";
4
- const MAX_ENDPOINT_BYTES = 1024;
5
4
  /** Observe a ready endpoint, returning null while its bridge is not listening. */
6
5
  export const observeGhidraEndpoint = async (endpoint) => {
7
6
  if (endpoint.transport === "unix-socket") {
@@ -25,11 +24,10 @@ export const observeGhidraEndpoint = async (endpoint) => {
25
24
  : err(endpointFailure(endpoint, "Ghidra endpoint observation failed", cause));
26
25
  }
27
26
  try {
28
- const bytes = Buffer.alloc(MAX_ENDPOINT_BYTES + 1);
29
- const observed = await handle.read(bytes, 0, bytes.length, 0);
30
- if (observed.bytesRead === 0 || observed.bytesRead > MAX_ENDPOINT_BYTES)
27
+ const encoded = await handle.readFile("utf8");
28
+ if (encoded.length === 0)
31
29
  return err(endpointFailure(endpoint, "Ghidra TCP endpoint is invalid"));
32
- return parseTcpEndpoint(endpoint, bytes.subarray(0, observed.bytesRead).toString("utf8"));
30
+ return parseTcpEndpoint(endpoint, encoded);
33
31
  }
34
32
  catch (cause) {
35
33
  return err(endpointFailure(endpoint, "Ghidra endpoint read failed", cause));
@@ -44,8 +42,7 @@ const parseTcpEndpoint = (endpoint, encoded) => {
44
42
  if (typeof value !== "object" ||
45
43
  value === null ||
46
44
  Array.isArray(value) ||
47
- !hasExactKeys(value, ["host", "port", "schema_version"]) ||
48
- value.schema_version !== 1 ||
45
+ !hasExactKeys(value, ["host", "port"]) ||
49
46
  value.host !== "127.0.0.1" ||
50
47
  !Number.isSafeInteger(value.port) ||
51
48
  typeof value.port !== "number" ||
@@ -12,8 +12,8 @@ const responseSchema = z.discriminatedUnion("ok", [
12
12
  ok: z.literal(false),
13
13
  error: z
14
14
  .object({
15
- code: z.string().min(1).max(128),
16
- message: z.string().min(1).max(4_096),
15
+ code: z.string().min(1),
16
+ message: z.string().min(1),
17
17
  })
18
18
  .strict(),
19
19
  }),
@@ -5,10 +5,12 @@ import { promisify } from "node:util";
5
5
  import { HopperCancelledError, HopperProcessError, HopperStartError, } from "../domain/errors.js";
6
6
  import { err, ok } from "../domain/result.js";
7
7
  import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
8
+ import { execFileOutput } from "../process/ExecFileOutput.js";
8
9
  import { spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
9
10
  import { waitForAbortableDelay } from "../process/ProviderDeadline.js";
10
11
  import { selectLinuxPrivateDisplayStrategy, } from "./LinuxPrivateDisplayProbe.js";
11
12
  import writeFileAtomic from "write-file-atomic";
13
+ import { acquireHopperTargetLease } from "./HopperTargetLease.js";
12
14
  const execFileAsync = promisify(execFile);
13
15
  const HOPPER_BACKGROUND_STARTUP_MS = 5_000;
14
16
  /**
@@ -33,57 +35,68 @@ export class HopperApplicationLauncher {
33
35
  this.dependencies = dependencies;
34
36
  }
35
37
  async launch(session, options = {}) {
36
- const bootstrapPath = `${session.directory}/bootstrap.py`;
37
- const ownsProcessLifetime = usesLinuxDemo(this.options);
38
- const source = [
39
- `REA_SOCKET = ${JSON.stringify(session.socketPath)}`,
40
- `REA_TOKEN = ${JSON.stringify(session.token)}`,
41
- `REA_RUN_ID = ${JSON.stringify(session.runId)}`,
42
- `REA_TARGET_PATH = ${JSON.stringify(this.options.targetPath)}`,
43
- `REA_OWNS_PROCESS_LIFETIME = ${ownsProcessLifetime ? "True" : "False"}`,
44
- `exec(compile(open(${JSON.stringify(this.options.bridgeScriptPath)}, 'rb').read(), ${JSON.stringify(this.options.bridgeScriptPath)}, 'exec'))`,
45
- "",
46
- ].join("\n");
38
+ const leaseResult = await this.#acquireTargetLease(session.runId);
39
+ if (!leaseResult.ok)
40
+ return leaseResult;
41
+ const lease = leaseResult.value;
42
+ let leaseTransferred = false;
47
43
  try {
48
- await writeFile(bootstrapPath, source, { encoding: "utf8", mode: 0o600 });
49
- await chmod(bootstrapPath, 0o600);
44
+ const ownsProcessLifetime = usesLinuxDemo(this.options);
45
+ const bootstrap = await this.#writeBootstrap(session, ownsProcessLifetime);
46
+ if (!bootstrap.ok)
47
+ return bootstrap;
48
+ const launched = await this.#launchPreparedTarget({
49
+ session,
50
+ signal: options.signal,
51
+ bootstrapPath: bootstrap.value,
52
+ ownsProcessLifetime,
53
+ lease,
54
+ });
55
+ leaseTransferred = launched.ok;
56
+ return launched;
50
57
  }
51
- catch (cause) {
52
- return err(new HopperStartError({ cause }));
58
+ finally {
59
+ if (!leaseTransferred)
60
+ await lease?.release();
53
61
  }
62
+ }
63
+ async #launchPreparedTarget(input) {
64
+ const { session, signal, bootstrapPath, ownsProcessLifetime, lease } = input;
54
65
  const action = this.options.targetKind === "database" ? "--database" : "--executable";
55
- const args = [
66
+ const argumentsForTarget = [
56
67
  ...this.options.loaderArgs,
57
68
  "--analysis",
58
- "--python",
69
+ "-Y",
59
70
  bootstrapPath,
60
71
  action,
61
72
  this.options.targetPath,
62
73
  ];
63
74
  try {
64
- if (options.signal?.aborted === true)
75
+ if (signal?.aborted === true)
65
76
  return err(new HopperCancelledError());
66
- const display = await this.#privateDisplay(options.signal);
77
+ const display = await this.#privateDisplay(signal);
67
78
  if (!display.ok)
68
79
  return err(display.error);
69
- const prepared = await prepareHopperApplication(this.options.launcherPath, options.signal);
80
+ const prepared = await prepareHopperApplication(this.options.launcherPath, signal);
70
81
  if (!prepared)
71
82
  return err(new HopperCancelledError());
72
- const linuxDemo = linuxDemoLaunch(this.options, session, args, display.strategy);
73
- const ownershipCommand = linuxDemo?.ownershipCommand ?? this.options.launcherPath;
74
- const started = await spawnOwnedProviderProcess({
75
- command: linuxDemo?.command ?? this.options.launcherPath,
76
- arguments: linuxDemo?.args ?? args,
77
- runId: session.runId,
78
- expectedCommand: ownershipCommand,
83
+ const linuxDemo = linuxDemoLaunch(this.options, session, argumentsForTarget, display.strategy);
84
+ const started = await launchHopperProcess({
85
+ options: this.options,
86
+ session,
87
+ bootstrapPath,
88
+ ownsProcessLifetime,
89
+ argumentsForTarget,
90
+ linuxDemo,
91
+ signal,
79
92
  });
80
- const child = started.process;
81
- const pid = started.ownership.leaderPid;
93
+ if (started === null)
94
+ return err(new HopperCancelledError());
95
+ const cleanup = () => cleanupOwnedProcessGroup(started.ownership).finally(() => lease?.release());
82
96
  const ownership = {
83
- schema_version: 1,
84
97
  run_id: session.runId,
85
- pid,
86
- process_group_id: pid,
98
+ pid: started.ownership.leaderPid,
99
+ process_group_id: started.ownership.leaderPid,
87
100
  parent_pid: process.pid,
88
101
  launcher: linuxDemo?.command ?? this.options.launcherPath,
89
102
  created_at: new Date().toISOString(),
@@ -96,17 +109,50 @@ export class HopperApplicationLauncher {
96
109
  return err(new HopperStartError({ cause }));
97
110
  }
98
111
  return ok({
99
- process: child,
112
+ process: started.process,
100
113
  ownsProcessLifetime: true,
101
114
  ownership: started.ownership,
102
115
  shutdownMode: ownsProcessLifetime
103
116
  ? "process-cleanup"
104
117
  : "bridge-request",
105
- cleanup: () => cleanupOwnedProcessGroup(started.ownership),
118
+ cleanup,
119
+ });
120
+ }
121
+ catch (cause) {
122
+ return err(hopperLaunchFailure(cause, signal));
123
+ }
124
+ }
125
+ async #acquireTargetLease(runId) {
126
+ if ((this.dependencies.platform ?? process.platform) !== "darwin")
127
+ return ok(undefined);
128
+ try {
129
+ const acquisition = await (this.dependencies.acquireTargetLease ?? acquireHopperTargetLease)({
130
+ targetPath: this.options.targetPath,
131
+ targetKind: this.options.targetKind,
132
+ loaderArgs: this.options.loaderArgs,
133
+ runId,
106
134
  });
135
+ if (!acquisition.acquired)
136
+ return err(new HopperStartError({
137
+ ownerRunId: acquisition.owner.runId,
138
+ userMessage: `This Hopper target is already open in REA session ${acquisition.owner.runId}. ` +
139
+ "Use that REA session or close it before opening this target again.",
140
+ }));
141
+ return ok(acquisition.lease);
142
+ }
143
+ catch (cause) {
144
+ return err(new HopperStartError({ cause }));
145
+ }
146
+ }
147
+ async #writeBootstrap(session, ownsProcessLifetime) {
148
+ const bootstrapPath = `${session.directory}/bootstrap.py`;
149
+ try {
150
+ await writeFile(bootstrapPath, bridgeBootstrapSource(session, this.options, ownsProcessLifetime), { encoding: "utf8", mode: 0o600 });
151
+ await chmod(bootstrapPath, 0o600);
152
+ return ok(bootstrapPath);
107
153
  }
108
154
  catch (cause) {
109
- return err(hopperLaunchFailure(cause, options.signal));
155
+ return err(new HopperStartError({ cause }));
110
156
  }
111
157
  }
112
158
  async #privateDisplay(signal) {
@@ -127,6 +173,32 @@ export class HopperApplicationLauncher {
127
173
  };
128
174
  }
129
175
  }
176
+ const bridgeBootstrapSource = (session, options, ownsProcessLifetime) => [
177
+ `REA_SOCKET = ${JSON.stringify(session.socketPath)}`,
178
+ `REA_TOKEN = ${JSON.stringify(session.token)}`,
179
+ `REA_RUN_ID = ${JSON.stringify(session.runId)}`,
180
+ `REA_TARGET_PATH = ${JSON.stringify(options.targetPath)}`,
181
+ `REA_OWNS_PROCESS_LIFETIME = ${ownsProcessLifetime ? "True" : "False"}`,
182
+ `exec(compile(open(${JSON.stringify(options.bridgeScriptPath)}, 'rb').read(), ${JSON.stringify(options.bridgeScriptPath)}, 'exec'))`,
183
+ "",
184
+ ].join("\n");
185
+ const launchHopperProcess = async (input) => {
186
+ const ownershipCommand = input.linuxDemo?.ownershipCommand ?? input.options.launcherPath;
187
+ const spawn = (arguments_) => spawnOwnedProviderProcess({
188
+ command: input.options.launcherPath,
189
+ arguments: arguments_,
190
+ runId: input.session.runId,
191
+ expectedCommand: ownershipCommand,
192
+ });
193
+ if (input.linuxDemo !== undefined)
194
+ return spawnOwnedProviderProcess({
195
+ command: input.linuxDemo.command,
196
+ arguments: input.linuxDemo.args,
197
+ runId: input.session.runId,
198
+ expectedCommand: ownershipCommand,
199
+ });
200
+ return spawn(input.argumentsForTarget);
201
+ };
130
202
  export const linuxDemoLaunch = (options, session, hopperArgs, strategy) => {
131
203
  if (!usesLinuxDemo(options) || options.demoHelperPath === undefined)
132
204
  return undefined;
@@ -194,7 +266,11 @@ const hopperApplicationBundle = (launcherPath) => {
194
266
  };
195
267
  const processIsRunning = async (executablePath) => {
196
268
  try {
197
- const processes = await execFileAsync("/bin/ps", ["-ax", "-o", "command="]);
269
+ const processes = await execFileOutput("/bin/ps", [
270
+ "-ax",
271
+ "-o",
272
+ "command=",
273
+ ]);
198
274
  return processes.stdout
199
275
  .split("\n")
200
276
  .some((command) => command.trim() === executablePath);
@@ -25,7 +25,7 @@ export const resolveHopperAnalysisProfile = async (target, options) => {
25
25
  version: `launcher-sha256:${launcherDigest.value}`,
26
26
  };
27
27
  return ok({
28
- profile: createAnalysisProfile(provider, 1, {
28
+ profile: createAnalysisProfile(provider, {
29
29
  target_kind: target.kind,
30
30
  target_format: target.format,
31
31
  architecture: target.architecture ?? null,
@@ -11,7 +11,9 @@ export const cleanupHopperSession = async (input) => {
11
11
  cleanupResult: undefined,
12
12
  shutdownConfirmed: false,
13
13
  };
14
- 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");
15
17
  await requestShutdown(input, state);
16
18
  await report(input.progress, 0.35, "releasing Hopper bridge transport");
17
19
  input.releaseTransport(input.socket);
@@ -33,7 +35,9 @@ const requestShutdown = async (input, state) => {
33
35
  return;
34
36
  }
35
37
  const shutdown = await input
36
- .request("shutdown")
38
+ .request(input.retainDocument || input.launch?.shutdownMode === "process-cleanup"
39
+ ? "shutdown"
40
+ : "shutdown_document")
37
41
  .catch(() => err(new HopperProcessError(null)));
38
42
  if (shutdown.ok &&
39
43
  isHopperCleanupRequired(shutdown.value) &&
@@ -141,7 +145,6 @@ const activityDetails = (activity) => ({
141
145
  request_id: activity.requestId,
142
146
  operation: activity.operation,
143
147
  elapsed_ms: activity.elapsedMs,
144
- timeout_ms: activity.timeoutMs,
145
148
  caller_state: activity.callerState,
146
149
  queued_requests: activity.queuedRequests,
147
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
  });
@@ -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;
@@ -209,7 +194,6 @@ export class HopperProvider {
209
194
  requestId: activity.requestId,
210
195
  operation: activity.operation,
211
196
  elapsedMs: activity.elapsedMs,
212
- timeoutMs: activity.timeoutMs,
213
197
  callerState: activity.callerState,
214
198
  },
215
199
  queuedRequests: activity?.queuedRequests ?? 0,