rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -2,17 +2,21 @@ import { randomBytes, randomUUID } from "node:crypto";
2
2
  import { access } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
+ import writeFileAtomic from "write-file-atomic";
6
+ import { analysisErrorWithCleanupFailure } from "../application/binary/AnalysisClientCleanup.js";
5
7
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
6
8
  import { HopperCancelledError, HopperProcessError, HopperProtocolError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "../domain/hopperErrors.js";
7
9
  import {} from "../domain/analysisErrorBase.js";
8
10
  import { hopperStartupFailure, } from "../domain/hopperStartupFailure.js";
11
+ import { providerRetryAction, sharedProviderFailureStage, } from "../domain/providerOperationHealth.js";
9
12
  import { err, ok } from "../domain/result.js";
10
13
  import { silentLogger } from "../logger.js";
11
14
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
12
15
  import { ProviderStartupDeadline } from "../process/ProviderDeadline.js";
13
16
  import { ProviderRunLineage } from "../process/ProviderRunLineage.js";
14
17
  import { ProviderProcessSupervisor, } from "../process/ProviderProcess.js";
15
- import { cleanupHopperSession } from "./HopperCleanup.js";
18
+ import { hopperOperationStage } from "./HopperOperationStage.js";
19
+ import { cleanupHopperSession, } from "./HopperCleanup.js";
16
20
  import { parseHopperServerInfo, } from "./HopperSessionValues.js";
17
21
  import { connectHopperSocketOnce } from "./HopperSocketConnection.js";
18
22
  import { hopperLauncherFailureDiagnostic } from "./HopperProcessDiagnostic.js";
@@ -21,7 +25,6 @@ import { HopperResponseStream } from "./HopperResponseStream.js";
21
25
  import { responseResult, } from "./protocol.js";
22
26
  const SHUTDOWN_TIMEOUT_MS = 30_000;
23
27
  const SESSION_ROOT = process.platform === "darwin" ? "/tmp" : tmpdir();
24
- /** Safe launcher telemetry; stderr content is intentionally never exposed. */
25
28
  /**
26
29
  * Owns one authenticated NDJSON-over-Unix-socket bridge session.
27
30
  *
@@ -36,15 +39,19 @@ export class HopperClient {
36
39
  #responses;
37
40
  #logger;
38
41
  #socket;
39
- #launch;
40
- #process;
41
- #runtimeRoot;
42
+ #resources = {
43
+ launch: undefined,
44
+ processSupervisor: undefined,
45
+ runtimeRoot: undefined,
46
+ shutdownConfirmed: false,
47
+ };
42
48
  #token;
43
49
  #lineage = new ProviderRunLineage();
44
50
  #nextId = 1;
45
51
  #closing = false;
46
52
  #launcherExitCode;
47
53
  #launcherFailureDiagnostic;
54
+ #operationFailure;
48
55
  #startupController;
49
56
  #startPromise;
50
57
  #closePromise;
@@ -52,11 +59,31 @@ export class HopperClient {
52
59
  this.#responses.push(chunk);
53
60
  };
54
61
  #onSocketError = () => {
55
- this.#failAll(new HopperProcessError(null));
62
+ const error = new HopperProcessError(null, undefined, undefined, undefined, "unreachable");
63
+ this.#failAll(error);
64
+ this.#rememberProcessFailure(error, []);
56
65
  };
57
66
  #onSocketClose = () => {
58
- if (!this.#closing)
59
- this.#failAll(new HopperProcessError(null));
67
+ if (this.#closing)
68
+ return;
69
+ const launch = this.#resources.launch;
70
+ if (launch?.providerLifetime === "launcher-process" &&
71
+ this.#launcherExitCode !== undefined)
72
+ return;
73
+ if (launch?.providerLifetime === "launcher-process") {
74
+ setImmediate(() => {
75
+ if (this.#closing || this.#launcherExitCode !== undefined)
76
+ return;
77
+ const exitCode = launch.process.exitCode ?? null;
78
+ const error = new HopperProcessError(exitCode, this.#launcherFailureDiagnostic, undefined, undefined, exitCode !== null ? "exited" : "unreachable");
79
+ this.#failAll(error);
80
+ this.#rememberProcessFailure(error, []);
81
+ });
82
+ return;
83
+ }
84
+ const error = new HopperProcessError(null, undefined, undefined, undefined, "unreachable");
85
+ this.#failAll(error);
86
+ this.#rememberProcessFailure(error, []);
60
87
  };
61
88
  constructor(options) {
62
89
  this.#logger = options.logger ?? silentLogger;
@@ -91,10 +118,60 @@ export class HopperClient {
91
118
  requestActivity() {
92
119
  return this.#requests.activity();
93
120
  }
121
+ /**
122
+ * Latest operational health for this owned bridge.
123
+ * A recorded exit remains visible after request activity returns to idle.
124
+ */
125
+ operationHealth() {
126
+ const failure = this.#operationFailure;
127
+ if (failure !== undefined) {
128
+ const requests = failure.requests.map((request) => ({
129
+ ...request,
130
+ stage: failure.startupFailure
131
+ ? "launch"
132
+ : hopperOperationStage(request.operation),
133
+ }));
134
+ return {
135
+ state: failure.state,
136
+ stage: requests.length === 0
137
+ ? failure.startupFailure
138
+ ? "launch"
139
+ : "connection"
140
+ : sharedProviderFailureStage(requests),
141
+ retryAction: providerRetryAction(failure.state, failure.startupFailure),
142
+ exitCode: failure.exitCode,
143
+ requests,
144
+ };
145
+ }
146
+ const activity = this.requestActivity();
147
+ if (activity !== null) {
148
+ const stage = hopperOperationStage(activity.operation);
149
+ return {
150
+ state: "busy",
151
+ stage,
152
+ retryAction: "wait",
153
+ exitCode: null,
154
+ requests: [
155
+ {
156
+ requestId: activity.requestId,
157
+ operation: activity.operation,
158
+ stage,
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ return {
164
+ state: "idle",
165
+ stage: null,
166
+ retryAction: null,
167
+ exitCode: null,
168
+ requests: [],
169
+ };
170
+ }
94
171
  /** Launch the bridge once and complete its authenticated health handshake. */
95
172
  start(signal) {
96
173
  if (this.#closePromise !== undefined) {
97
- return this.#closePromise.then(() => this.start(signal));
174
+ return this.#closePromise.then((closed) => closed.ok ? this.start(signal) : closed);
98
175
  }
99
176
  if (this.#startPromise !== undefined)
100
177
  return this.#startPromise;
@@ -120,8 +197,10 @@ export class HopperClient {
120
197
  };
121
198
  void started.then((result) => {
122
199
  release();
123
- if (!result.ok)
200
+ if (!result.ok) {
201
+ this.#rememberStartupFailure(result.error);
124
202
  reset();
203
+ }
125
204
  }, (cause) => {
126
205
  this.#logger.debug({ error: cause instanceof Error ? cause.message : String(cause) }, "Hopper startup promise rejected during bookkeeping");
127
206
  release();
@@ -132,9 +211,13 @@ export class HopperClient {
132
211
  async #start(signal) {
133
212
  if (isAborted(signal))
134
213
  return err(new HopperCancelledError());
135
- if (this.#socket !== undefined || this.#runtimeRoot !== undefined) {
214
+ this.#operationFailure = undefined;
215
+ if (this.#socket !== undefined ||
216
+ this.#resources.launch !== undefined ||
217
+ this.#resources.runtimeRoot !== undefined) {
136
218
  return err(new HopperProtocolError("Hopper client is already started"));
137
219
  }
220
+ this.#resources.shutdownConfirmed = false;
138
221
  const deadline = new ProviderStartupDeadline(this.#options.startupTimeoutMs, signal);
139
222
  try {
140
223
  return await this.#startWithin(deadline);
@@ -145,7 +228,7 @@ export class HopperClient {
145
228
  }
146
229
  async #startWithin(deadline) {
147
230
  try {
148
- this.#runtimeRoot = await PrivateRuntimeRoot.create({
231
+ this.#resources.runtimeRoot = await PrivateRuntimeRoot.create({
149
232
  parent: SESSION_ROOT,
150
233
  prefix: "rea-",
151
234
  });
@@ -154,10 +237,9 @@ export class HopperClient {
154
237
  return err(new HopperStartError({ cause }));
155
238
  }
156
239
  if (deadline.signal.aborted) {
157
- await this.#cleanup();
158
- return err(startupInterruption(deadline));
240
+ return this.#startupFailure(startupInterruption(deadline));
159
241
  }
160
- const socketPath = join(this.#runtimeRoot.path, "bridge.sock");
242
+ const socketPath = join(this.#resources.runtimeRoot.path, "bridge.sock");
161
243
  this.#token = randomBytes(32).toString("hex");
162
244
  this.#lineage.reset();
163
245
  this.#launcherExitCode = undefined;
@@ -165,47 +247,76 @@ export class HopperClient {
165
247
  const runId = this.#options.runId ?? randomUUID();
166
248
  const launched = await this.#options.launcher
167
249
  .launch({
168
- directory: this.#runtimeRoot.path,
250
+ directory: this.#resources.runtimeRoot.path,
169
251
  socketPath,
170
252
  token: this.#token,
171
253
  runId,
172
254
  }, { signal: deadline.signal })
173
255
  .catch((cause) => err(new HopperStartError({ cause })));
174
256
  if (!launched.ok) {
175
- await this.#cleanup();
176
- return deadline.signal.aborted
177
- ? err(startupInterruption(deadline))
178
- : launched;
257
+ return this.#startupFailure(deadline.signal.aborted
258
+ ? startupInterruption(deadline)
259
+ : launched.error);
179
260
  }
180
- this.#launch = launched.value;
261
+ this.#resources.launch = launched.value;
181
262
  this.#attachLauncher(launched.value);
263
+ const ownership = launched.value.ownership;
264
+ if (ownership !== undefined) {
265
+ try {
266
+ await writeFileAtomic(join(this.#resources.runtimeRoot.path, "ownership.json"), `${JSON.stringify({
267
+ run_id: runId,
268
+ pid: ownership.leaderPid,
269
+ process_group_id: ownership.processGroupId,
270
+ parent_pid: process.pid,
271
+ launcher: launched.value.launcherCommand ?? null,
272
+ created_at: new Date().toISOString(),
273
+ })}\n`, { encoding: "utf8", mode: 0o600 });
274
+ }
275
+ catch (cause) {
276
+ return this.#startupFailure(new HopperStartError({ cause }));
277
+ }
278
+ }
182
279
  const connected = await this.#connect(socketPath, deadline);
183
280
  if (!connected.ok) {
184
- await this.#cleanup();
185
- return connected;
281
+ return this.#startupFailure(connected.error);
186
282
  }
187
283
  const remainingMs = deadline.remainingMs();
188
284
  if (remainingMs <= 0) {
189
- await this.#cleanup();
190
- return err(new HopperTimeoutError(this.#options.startupTimeoutMs));
285
+ return this.#startupFailure(new HopperTimeoutError(this.#options.startupTimeoutMs));
191
286
  }
192
287
  const health = await this.#request("health", {}, {
193
288
  timeoutMs: remainingMs,
194
289
  signal: deadline.signal,
195
290
  });
196
291
  if (!health.ok) {
197
- await this.#cleanup();
198
- return deadline.signal.aborted
199
- ? err(startupInterruption(deadline))
200
- : health;
292
+ return this.#startupFailure(deadline.signal.aborted ? startupInterruption(deadline) : health.error);
201
293
  }
202
294
  const parsed = parseHopperServerInfo(health.value, runId);
203
- if (parsed.ok)
204
- await this.#lineage.observe(this.#launch);
205
- else
206
- await this.#cleanup();
295
+ if (!parsed.ok)
296
+ return this.#startupFailure(parsed.error);
297
+ await this.#lineage.observe(this.#resources.launch);
207
298
  return parsed;
208
299
  }
300
+ async #startupFailure(primary) {
301
+ this.#rememberStartupFailure(primary);
302
+ const closed = await this.#cleanup();
303
+ return err(closed.ok
304
+ ? primary
305
+ : analysisErrorWithCleanupFailure(primary, closed.error, "open_binary"));
306
+ }
307
+ #rememberStartupFailure(failure) {
308
+ if (failure instanceof HopperProcessError)
309
+ this.#rememberProcessFailure(failure, []);
310
+ else if (this.#operationFailure === undefined &&
311
+ (failure instanceof HopperTimeoutError ||
312
+ failure instanceof HopperStartError))
313
+ this.#operationFailure = {
314
+ state: failure instanceof HopperTimeoutError ? "not_started" : "unknown",
315
+ exitCode: null,
316
+ startupFailure: true,
317
+ requests: [],
318
+ };
319
+ }
209
320
  /** Invoke one declared operation, returning timeout and cancellation as values. */
210
321
  async callTool(name, arguments_ = {}, options = {}) {
211
322
  const started = await this.start(options.signal);
@@ -218,12 +329,8 @@ export class HopperClient {
218
329
  ? err(new AnalysisCapabilityUnavailableError("hopper", name, result.error.safeMessage))
219
330
  : result;
220
331
  }
221
- /** Stop the bridge, settle outstanding requests, and remove session artifacts. */
222
- close() {
223
- return this.closeWithOutcome().then(() => undefined);
224
- }
225
332
  /** Stop the bridge and report whether every owned resource was verified clean. */
226
- closeWithOutcome(options = {}) {
333
+ close(options = {}) {
227
334
  const starting = this.#startPromise;
228
335
  const controller = this.#startupController;
229
336
  controller?.abort();
@@ -251,9 +358,7 @@ export class HopperClient {
251
358
  try {
252
359
  return await cleanupHopperSession({
253
360
  socket: this.#socket,
254
- launch: this.#launch,
255
- processSupervisor: this.#process,
256
- runtimeRoot: this.#runtimeRoot,
361
+ resources: this.#resources,
257
362
  activeRequest: this.#requests.activity(),
258
363
  progress: options.progress,
259
364
  logger: this.#logger,
@@ -269,26 +374,34 @@ export class HopperClient {
269
374
  });
270
375
  }
271
376
  finally {
272
- this.#socket = undefined;
273
- this.#process = undefined;
274
- this.#launch = undefined;
275
- this.#runtimeRoot = undefined;
276
- this.#token = undefined;
277
- this.#responses.reset();
278
- this.#launcherExitCode = undefined;
279
- this.#launcherFailureDiagnostic = undefined;
377
+ if (this.#socket?.destroyed === true)
378
+ this.#socket = undefined;
379
+ if (this.#socket === undefined)
380
+ this.#token = undefined;
381
+ if (this.#socket === undefined)
382
+ this.#responses.reset();
383
+ if (this.#resources.processSupervisor === undefined) {
384
+ this.#launcherExitCode = undefined;
385
+ this.#launcherFailureDiagnostic = undefined;
386
+ }
280
387
  this.#closing = false;
281
388
  }
282
389
  }
283
390
  async #connect(socketPath, deadline) {
284
391
  while (deadline.remainingMs() > 0) {
285
392
  if (deadline.signal.aborted)
286
- return err(startupInterruption(deadline));
393
+ return err(await this.#startupInterruption(deadline));
287
394
  if (this.#closing)
288
395
  return err(new HopperProcessError(null));
289
396
  if (this.#launcherExitCode !== undefined &&
290
- hopperStartupFailure(this.#launcherExitCode) !== undefined)
291
- return err(new HopperProcessError(this.#launcherExitCode, this.#launcherFailureDiagnostic));
397
+ this.#resources.launch !== undefined &&
398
+ (this.#resources.launch.providerLifetime === "launcher-process" ||
399
+ this.#launcherExitCode !== 0)) {
400
+ const failure = await this.#launcherStartupFailure(this.#resources.launch.providerLifetime === "launcher-process", this.#launcherExitCode, deadline);
401
+ return deadline.interruption === "cancelled"
402
+ ? err(await this.#startupInterruption(deadline))
403
+ : err(failure);
404
+ }
292
405
  try {
293
406
  await access(socketPath);
294
407
  }
@@ -296,7 +409,7 @@ export class HopperClient {
296
409
  // best-effort cleanup: socket polling; absence means keep waiting.
297
410
  void cause;
298
411
  if ((await deadline.wait(50)) === "aborted")
299
- return err(startupInterruption(deadline));
412
+ return err(await this.#startupInterruption(deadline));
300
413
  continue;
301
414
  }
302
415
  const attempt = await connectHopperSocketOnce(socketPath, deadline.signal);
@@ -306,24 +419,64 @@ export class HopperClient {
306
419
  return ok(undefined);
307
420
  }
308
421
  if ((await deadline.wait(50)) === "aborted")
309
- return err(startupInterruption(deadline));
422
+ return err(await this.#startupInterruption(deadline));
310
423
  }
311
- return err(new HopperTimeoutError(this.#options.startupTimeoutMs));
424
+ return err(await this.#startupInterruption(deadline));
425
+ }
426
+ async #startupInterruption(deadline) {
427
+ if (deadline.interruption === "cancelled")
428
+ return new HopperCancelledError();
429
+ return new HopperTimeoutError(deadline.timeoutMs, undefined, undefined, "not_started", "launch", this.#launcherOutcome((await this.#resources.processSupervisor?.waitForOutputClose(0)) ??
430
+ false));
431
+ }
432
+ #launcherOutcome(outputClosed) {
433
+ const snapshot = this.#resources.processSupervisor?.snapshot();
434
+ const token = this.#token;
435
+ if (snapshot === undefined)
436
+ return undefined;
437
+ const redact = (text) => token === undefined
438
+ ? text
439
+ : text.replaceAll(token, "[redacted transport credential]");
440
+ return {
441
+ exit_code: snapshot.exitCode ?? null,
442
+ signal: snapshot.signal ?? null,
443
+ stdout: { ...snapshot.stdout, text: redact(snapshot.stdout.text) },
444
+ stderr: { ...snapshot.stderr, text: redact(snapshot.stderr.text) },
445
+ output_closed: outputClosed,
446
+ diagnostic_truncated: snapshot.diagnosticTruncated === true,
447
+ };
448
+ }
449
+ async #launcherStartupFailure(ownsProviderLifetime, exitCode, deadline) {
450
+ const process = this.#resources.processSupervisor;
451
+ // Descendants may inherit the helper's pipes. Bound drainage independently
452
+ // from readiness, and report whether producer output actually closed.
453
+ const outputClosed = (await process?.waitForOutputClose(Math.min(1_000, deadline.remainingMs()))) ?? false;
454
+ const launcherFailure = this.#launcherOutcome(outputClosed);
455
+ if (ownsProviderLifetime)
456
+ return new HopperProcessError(exitCode, this.#launcherFailureDiagnostic, undefined, undefined, "exited", "launch", launcherFailure);
457
+ return new HopperStartError({
458
+ userMessage: "Hopper's launcher helper failed before bridge readiness. Review details.launcher and complete Hopper setup before retrying.",
459
+ ...(launcherFailure === undefined ? {} : { launcherFailure }),
460
+ });
312
461
  }
313
462
  async #request(method, params, options) {
314
463
  const id = this.#nextId++;
315
464
  const socket = this.#socket;
316
465
  const token = this.#token;
317
466
  if (socket === undefined || socket.destroyed || token === undefined) {
318
- return err(new HopperProcessError(null, undefined, method, id));
467
+ return this.#unavailableRequest(new HopperProcessError(null, undefined, method, id, "unreachable", hopperOperationStage(method)));
319
468
  }
320
469
  if (options.signal?.aborted === true)
321
470
  return err(new HopperCancelledError());
322
471
  const startedAt = performance.now();
323
472
  const result = await this.#requests.run(id, method, params, {
324
473
  ...(options.signal === undefined ? {} : { signal: options.signal }),
474
+ ...(options.timeoutMs === undefined
475
+ ? {}
476
+ : { timeoutMs: options.timeoutMs }),
325
477
  ...(options.progress !== undefined ? { progress: options.progress } : {}),
326
478
  });
479
+ this.#retainRequestHealth(result, id, method);
327
480
  this.#logger[result.ok ? "debug" : "warn"]({
328
481
  method,
329
482
  durationMs: Math.round((performance.now() - startedAt) * 100) / 100,
@@ -370,7 +523,7 @@ export class HopperClient {
370
523
  socket.off("close", this.#onSocketClose);
371
524
  }
372
525
  #attachLauncher(launch) {
373
- this.#process = new ProviderProcessSupervisor(launch, {
526
+ this.#resources.processSupervisor = new ProviderProcessSupervisor(launch, {
374
527
  onDiagnostic: (event) => this.#onLauncherDiagnostic(launch, event),
375
528
  });
376
529
  }
@@ -394,8 +547,10 @@ export class HopperClient {
394
547
  type: "launcher-exit",
395
548
  code: event.code,
396
549
  });
397
- if (launch.ownsProcessLifetime && !this.#closing)
398
- this.#failAll(new HopperProcessError(event.code, this.#launcherFailureDiagnostic));
550
+ if (launch.providerLifetime === "launcher-process" && !this.#closing) {
551
+ this.#rememberExit(event.code);
552
+ this.#failAll(new HopperProcessError(event.code, this.#launcherFailureDiagnostic, undefined, undefined, "exited"));
553
+ }
399
554
  }
400
555
  #abortProtocol(message, cause) {
401
556
  this.#failAll(new HopperProtocolError(message, { cause }));
@@ -404,7 +559,81 @@ export class HopperClient {
404
559
  #failAll(error) {
405
560
  this.#requests.failAll(error);
406
561
  }
562
+ #unavailableRequest(error) {
563
+ this.#rememberProcessFailure(error, error.requestId === undefined || error.operation === undefined
564
+ ? []
565
+ : [{ requestId: error.requestId, operation: error.operation }]);
566
+ return err(error);
567
+ }
568
+ #retainRequestHealth(result, requestId, operation) {
569
+ if (this.#closing)
570
+ return;
571
+ if (result.ok)
572
+ return;
573
+ if (!(result.error instanceof HopperProcessError))
574
+ return;
575
+ this.#rememberProcessFailure(result.error, [
576
+ {
577
+ requestId: result.error.requestId ?? requestId,
578
+ operation: result.error.operation ?? operation,
579
+ },
580
+ ]);
581
+ }
582
+ #rememberExit(code) {
583
+ if (this.#closing)
584
+ return;
585
+ const previous = this.#operationFailure;
586
+ this.#operationFailure = {
587
+ state: "exited",
588
+ exitCode: code ?? previous?.exitCode ?? null,
589
+ startupFailure: hopperStartupFailure(code) !== undefined ||
590
+ previous?.startupFailure === true,
591
+ requests: previous?.requests ?? [],
592
+ };
593
+ }
594
+ #rememberProcessFailure(error, requests) {
595
+ if (this.#closing)
596
+ return;
597
+ const previous = this.#operationFailure;
598
+ const state = processFailureState(error);
599
+ const startupFailure = error.stage === "launch" ||
600
+ error.failureCode !== undefined ||
601
+ previous?.startupFailure === true;
602
+ const merged = mergeFailedRequests(previous?.requests ?? [], requests);
603
+ if (previous !== undefined &&
604
+ PROCESS_FAILURE_RANK[previous.state] > PROCESS_FAILURE_RANK[state]) {
605
+ this.#operationFailure = {
606
+ ...previous,
607
+ startupFailure,
608
+ requests: merged,
609
+ };
610
+ return;
611
+ }
612
+ this.#operationFailure = {
613
+ state,
614
+ exitCode: state === "exited"
615
+ ? (error.exitCode ?? previous?.exitCode ?? null)
616
+ : null,
617
+ startupFailure,
618
+ requests: merged,
619
+ };
620
+ }
407
621
  }
622
+ const PROCESS_FAILURE_RANK = {
623
+ not_started: 0,
624
+ unknown: 0,
625
+ unreachable: 1,
626
+ exited: 2,
627
+ };
628
+ const processFailureState = (error) => error.providerState === "exited" || error.exitCode !== null
629
+ ? "exited"
630
+ : error.providerState;
631
+ const mergeFailedRequests = (current, added) => {
632
+ const byId = new Map();
633
+ for (const request of [...current, ...added])
634
+ byId.set(request.requestId, request);
635
+ return [...byId.values()].sort((left, right) => left.requestId - right.requestId);
636
+ };
408
637
  const isAborted = (signal) => signal?.aborted === true;
409
638
  const startupInterruption = (deadline) => deadline.interruption === "cancelled"
410
639
  ? new HopperCancelledError()