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
@@ -1,5 +1,5 @@
1
+ import { WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON } from "../process/WindowsAuthority.js";
1
2
  import { GENERATED_MCP_TOOL_CATALOG } from "../generatedMcpToolCatalog.js";
2
- import { GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS, GHIDRA_MAX_LINE_BYTES, GHIDRA_REQUEST_TIMEOUT_MS, } from "./GhidraDefaults.js";
3
3
  import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
4
4
  import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
5
5
  /** Public identity committed by every Ghidra-backed observation. */
@@ -16,34 +16,16 @@ export const GHIDRA_PROVIDER_TOOL_CONTRACTS = Object.freeze([...GHIDRA_INVENTORY
16
16
  throw new TypeError(`Missing provider-neutral contract for ${operation}`);
17
17
  return contract;
18
18
  }));
19
- const PAGINATED_OPERATIONS = new Set([
20
- "list_names",
21
- "list_procedures",
22
- "list_strings",
23
- "search_procedures",
24
- "search_strings",
25
- "procedure_references",
26
- "read_function_instructions",
27
- "analyze_function",
28
- ]);
29
- const SEARCH_OPERATIONS = new Set([
30
- "search_procedures",
31
- "search_strings",
32
- ]);
33
- const DECOMPILE_OPERATIONS = new Set([
34
- "procedure_pseudo_code",
35
- "analyze_function",
36
- ]);
37
19
  /** Health limitations shared by every Ghidra-backed capability. */
38
20
  export const healthLimitations = Object.freeze([
39
- "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.",
40
22
  "The imported Program and temporary project are ephemeral, read-only to REA, and deleted on close.",
41
23
  ]);
42
24
  /** Additional limitations applied to the experimental Windows x64 P0 boundary. */
43
25
  export const windowsP0Limitations = Object.freeze([
44
26
  "Windows Ghidra P0 accepts approved native x86-64 PE applications only; DLL, managed, hostile, sensitive, and mutable-path targets are unsupported.",
45
27
  "The Windows bridge uses authenticated IPv4 loopback because Node path-based IPC does not expose Java AF_UNIX sockets; the endpoint file contains no bearer token.",
46
- "Windows P0 process-tree cleanup uses bounded taskkill termination and does not claim Job Object ownership, private DACL enforcement, or reparse-point-safe path authority.",
28
+ "Windows P0 is not admitted until a native authority proves Job Object ownership, private DACL enforcement, and reparse-safe path admission; bounded taskkill cleanup and chmod(0700) do not prove those controls.",
47
29
  ]);
48
30
  /** Limitation text for one admitted operation, including the common base. */
49
31
  export const limitationsFor = (operation) => {
@@ -72,7 +54,6 @@ export const limitationsFor = (operation) => {
72
54
  return [
73
55
  ...common,
74
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.",
75
- "Returned values are bounded to 1,024 Unicode code points and mark value_truncated instead of silently crossing the wire budget.",
76
57
  ];
77
58
  case "list_segments":
78
59
  return [
@@ -81,26 +62,23 @@ export const limitationsFor = (operation) => {
81
62
  ];
82
63
  case "search_procedures":
83
64
  case "search_strings":
84
- return [
85
- ...common,
86
- "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.",
87
- ];
65
+ return common;
88
66
  case "procedure_pseudo_code":
89
67
  return [
90
68
  ...common,
91
- "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.",
92
70
  "External functions and functions without an analyzable body return null; other decompiler failures remain explicit.",
93
71
  ];
94
72
  case "read_function_instructions":
95
73
  return [
96
74
  ...common,
97
- "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.",
98
76
  "Instruction text is Ghidra-specific and does not claim textual equivalence with Hopper output.",
99
77
  ];
100
78
  case "procedure_assembly":
101
79
  return [
102
80
  ...common,
103
- "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.",
104
82
  ];
105
83
  case "procedure_callers":
106
84
  case "procedure_callees":
@@ -119,7 +97,6 @@ export const limitationsFor = (operation) => {
119
97
  ...common,
120
98
  "Reference kinds are direct Ghidra ReferenceManager observations; unresolved computed flows without a target are absent and remain unknown.",
121
99
  "Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
122
- "Instruction scans stop at max_instructions; a truncated scan reports an unknown total and no false continuation.",
123
100
  ];
124
101
  case "analyze_function":
125
102
  return [
@@ -127,7 +104,7 @@ export const limitationsFor = (operation) => {
127
104
  "The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.",
128
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.",
129
106
  "Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
130
- "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.",
131
108
  ];
132
109
  default:
133
110
  return common;
@@ -141,14 +118,8 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
141
118
  return Object.freeze({
142
119
  provider: GHIDRA_PROVIDER_IDENTITY,
143
120
  operation,
144
- inputContractVersion: 1,
145
- outputContractVersion: 1,
146
121
  available: true,
147
122
  reason: null,
148
- pagination: PAGINATED_OPERATIONS.has(contract.name)
149
- ? "offset"
150
- : "none",
151
- exhaustive: !PAGINATED_OPERATIONS.has(contract.name),
152
123
  effects: Object.freeze({
153
124
  mutatesArtifact: false,
154
125
  launchesProcess: true,
@@ -158,23 +129,15 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
158
129
  changesPermissions: false,
159
130
  requiresRoot: false,
160
131
  }),
161
- limits: Object.freeze({
162
- maxResults: PAGINATED_OPERATIONS.has(contract.name)
163
- ? SEARCH_OPERATIONS.has(contract.name)
164
- ? 100
165
- : 500
166
- : null,
167
- maxPayloadBytes: GHIDRA_MAX_LINE_BYTES,
168
- timeoutMs: DECOMPILE_OPERATIONS.has(contract.name)
169
- ? GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS
170
- : GHIDRA_REQUEST_TIMEOUT_MS,
171
- }),
172
132
  limitations: Object.freeze(limitationsFor(contract.name)),
173
133
  });
174
134
  }));
175
135
  /** Capabilities advertised for the experimental Windows x64 P0 boundary. */
176
136
  export const WINDOWS_P0_CAPABILITIES = Object.freeze(CAPABILITIES.map((capability) => Object.freeze({
177
137
  ...capability,
138
+ available: false,
139
+ reason: WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON,
140
+ availabilityCode: "unsupported_host",
178
141
  limitations: Object.freeze([
179
142
  ...capability.limitations,
180
143
  ...windowsP0Limitations,
@@ -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
@@ -76,7 +76,7 @@ const connectGhidraSocketOnce = (target, signal) => new Promise((resolve) => {
76
76
  if (signal.aborted)
77
77
  onAbort();
78
78
  });
79
- const interruptionFailure = (options) => options.deadline.cancelled
79
+ const interruptionFailure = (options) => options.deadline.interruption === "cancelled"
80
80
  ? options.failure("cancelled", "Ghidra startup was cancelled")
81
81
  : options.failure("timeout", "Ghidra startup deadline elapsed", undefined, {
82
82
  timeoutMs: options.startupTimeoutMs,
@@ -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" ||
@@ -1,46 +1,23 @@
1
1
  import { z } from "zod";
2
2
  import { jsonValueSchema } from "../domain/jsonValue.js";
3
3
  import { err, ok } from "../domain/result.js";
4
- const responseSchema = z
5
- .object({
6
- id: z.number().int().positive(),
7
- ok: z.boolean(),
8
- result: jsonValueSchema.optional(),
9
- error: z
10
- .object({
11
- code: z.string().min(1).max(128),
12
- message: z.string().min(1).max(4_096),
13
- })
14
- .strict()
15
- .optional(),
16
- })
17
- .strict()
18
- .superRefine((value, context) => {
19
- if (value.ok && value.result === undefined)
20
- context.addIssue({
21
- code: "custom",
22
- path: ["result"],
23
- message: "Successful Ghidra response requires a result",
24
- });
25
- if (!value.ok && value.error === undefined)
26
- context.addIssue({
27
- code: "custom",
28
- path: ["error"],
29
- message: "Failed Ghidra response requires an error",
30
- });
31
- if (!value.ok && value.result !== undefined)
32
- context.addIssue({
33
- code: "custom",
34
- path: ["result"],
35
- message: "Failed Ghidra response cannot include a result",
36
- });
37
- if (value.ok && value.error !== undefined)
38
- context.addIssue({
39
- code: "custom",
40
- path: ["error"],
41
- message: "Successful Ghidra response cannot include an error",
42
- });
43
- });
4
+ const responseSchema = z.discriminatedUnion("ok", [
5
+ z.strictObject({
6
+ id: z.number().int().positive(),
7
+ ok: z.literal(true),
8
+ result: jsonValueSchema,
9
+ }),
10
+ z.strictObject({
11
+ id: z.number().int().positive(),
12
+ ok: z.literal(false),
13
+ error: z
14
+ .object({
15
+ code: z.string().min(1),
16
+ message: z.string().min(1),
17
+ })
18
+ .strict(),
19
+ }),
20
+ ]);
44
21
  /** Expected operation failure returned by the authenticated Java bridge. */
45
22
  export class GhidraRemoteError extends Error {
46
23
  code;
@@ -65,5 +42,5 @@ export const parseGhidraResponseLine = (line) => {
65
42
  };
66
43
  /** Project one validated response into its result or remote failure. */
67
44
  export const ghidraResponseResult = (response) => response.ok
68
- ? ok(response.result ?? null)
69
- : err(new GhidraRemoteError(response.error?.code ?? "bridge_error", response.error?.message ?? "Ghidra bridge request failed"));
45
+ ? ok(response.result)
46
+ : err(new GhidraRemoteError(response.error.code, response.error.message));
@@ -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,15 +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
- shutdownByCleanup: ownsProcessLifetime,
103
- cleanup: () => cleanupOwnedProcessGroup(started.ownership),
115
+ shutdownMode: ownsProcessLifetime
116
+ ? "process-cleanup"
117
+ : "bridge-request",
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,
104
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);
105
153
  }
106
154
  catch (cause) {
107
- return err(hopperLaunchFailure(cause, options.signal));
155
+ return err(new HopperStartError({ cause }));
108
156
  }
109
157
  }
110
158
  async #privateDisplay(signal) {
@@ -125,6 +173,32 @@ export class HopperApplicationLauncher {
125
173
  };
126
174
  }
127
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
+ };
128
202
  export const linuxDemoLaunch = (options, session, hopperArgs, strategy) => {
129
203
  if (!usesLinuxDemo(options) || options.demoHelperPath === undefined)
130
204
  return undefined;
@@ -192,7 +266,11 @@ const hopperApplicationBundle = (launcherPath) => {
192
266
  };
193
267
  const processIsRunning = async (executablePath) => {
194
268
  try {
195
- const processes = await execFileAsync("/bin/ps", ["-ax", "-o", "command="]);
269
+ const processes = await execFileOutput("/bin/ps", [
270
+ "-ax",
271
+ "-o",
272
+ "command=",
273
+ ]);
196
274
  return processes.stdout
197
275
  .split("\n")
198
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,
@@ -49,9 +49,9 @@ export const resolveHopperAnalysisProfile = async (target, options) => {
49
49
  export const hopperLoaderArgsForTarget = (target) => {
50
50
  if (target.kind === "database")
51
51
  return ok([]);
52
- const architecture = target.architecture;
53
- if (architecture === undefined)
52
+ if (target.kind !== "executable")
54
53
  return err(new ProviderAdapterError("hopper", "resolve_analysis_profile"));
54
+ const architecture = target.architecture;
55
55
  const flag = hopperArchitectureFlag(architecture);
56
56
  switch (target.format) {
57
57
  case "mach-o":
@@ -62,8 +62,6 @@ export const hopperLoaderArgsForTarget = (target) => {
62
62
  return ok(["-l", "ELF", flag]);
63
63
  case "pe":
64
64
  return ok(["-l", "WinPE", flag]);
65
- default:
66
- return err(new ProviderAdapterError("hopper", "resolve_analysis_profile"));
67
65
  }
68
66
  };
69
67
  const hopperArchitectureFlag = (architecture) => {