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
@@ -1,6 +1,26 @@
1
1
  import { basename, isAbsolute, resolve } from "node:path";
2
2
  import { valid } from "semver";
3
3
  import { PRODUCT_IDENTITY } from "../identity.js";
4
+ /** Resolve a pinned npx launcher that stdio clients can spawn on the host. */
5
+ export const npxRegistrationCommand = (platform = process.platform) => {
6
+ const command = [
7
+ "npx",
8
+ "-y",
9
+ PRODUCT_IDENTITY.registrationPackageSpecifier,
10
+ "mcp",
11
+ ];
12
+ return platform === "win32" ? ["cmd.exe", "/d", "/c", ...command] : command;
13
+ };
14
+ const unwrapNpxCommand = (command) => {
15
+ const executable = command[0]?.toLowerCase();
16
+ if (executable !== "cmd" && executable !== "cmd.exe")
17
+ return command;
18
+ if (command[1]?.toLowerCase() === "/c")
19
+ return command.slice(2);
20
+ if (command[1]?.toLowerCase() === "/d" && command[2]?.toLowerCase() === "/c")
21
+ return command.slice(3);
22
+ return [];
23
+ };
4
24
  /** Check that one parsed command points to REA's MCP entry point. */
5
25
  export const isOwnedClientRegistrationCommand = (command, currentCommandPath = resolve(process.argv[1] ?? "unknown")) => {
6
26
  if (command.length === 3 &&
@@ -16,12 +36,13 @@ export const isOwnedClientRegistrationCommand = (command, currentCommandPath = r
16
36
  resolve(executable) === currentCommandPath)
17
37
  return true;
18
38
  }
19
- if (command.length !== 4 ||
20
- command[0] !== "npx" ||
21
- command[1] !== "-y" ||
22
- command[3] !== "mcp")
39
+ const npxCommand = unwrapNpxCommand(command);
40
+ if (npxCommand.length !== 4 ||
41
+ npxCommand[0] !== "npx" ||
42
+ npxCommand[1] !== "-y" ||
43
+ npxCommand[3] !== "mcp")
23
44
  return false;
24
- const packageReference = command[2] ?? "";
45
+ const packageReference = npxCommand[2] ?? "";
25
46
  if (packageReference === PRODUCT_IDENTITY.packageName ||
26
47
  packageReference === PRODUCT_IDENTITY.packageSpecifier ||
27
48
  packageReference === PRODUCT_IDENTITY.registrationPackageSpecifier)
@@ -1,11 +1,11 @@
1
- import { effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
1
+ import { effectiveClientServer, grokServerListedDisabled, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
2
2
  import { access, readFile } from "node:fs/promises";
3
3
  import { resolve } from "node:path";
4
4
  import { z } from "zod";
5
5
  import { PRODUCT_IDENTITY } from "../identity.js";
6
6
  import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
7
- import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
8
- import { supportedClients } from "./SupportedClients.js";
7
+ import { isOwnedClientRegistrationCommand, npxRegistrationCommand, } from "./ClientRegistrationIdentity.js";
8
+ import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
9
9
  const registrationSchema = z
10
10
  .object({
11
11
  command: z.string().min(1),
@@ -28,15 +28,30 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
28
28
  CLAUDE_CONFIG_DIR: options.environment.CLAUDE_CONFIG_DIR,
29
29
  CODEX_HOME: options.environment.CODEX_HOME,
30
30
  COPILOT_HOME: options.environment.COPILOT_HOME,
31
+ GROK_HOME: options.environment.GROK_HOME,
31
32
  OPENCODE_CONFIG: options.environment.OPENCODE_CONFIG,
33
+ SAND_DATA_ROOT: options.environment.SAND_DATA_ROOT,
32
34
  XDG_CONFIG_HOME: options.environment.XDG_CONFIG_HOME,
33
35
  })) {
34
- if (client.format === "unsupported" ||
35
- (!(await exists(client.markerPath)) && !(await exists(client.configPath))))
36
+ if (!(await exists(client.markerPath)) &&
37
+ !(await exists(client.configPath)))
36
38
  continue;
39
+ const manualRemediation = manualRegistrationRemediation(client.name);
40
+ if (client.format === "unsupported") {
41
+ if (manualRemediation !== undefined)
42
+ statuses.push({
43
+ client: client.name,
44
+ config_path: client.markerPath ?? client.configPath,
45
+ command: [],
46
+ state: "manual",
47
+ remediation: manualRemediation,
48
+ });
49
+ continue;
50
+ }
37
51
  try {
38
52
  const content = await readFile(client.configPath, "utf8");
39
- const raw = effectiveClientServer(parseClientConfiguration(content, client.format), PRODUCT_IDENTITY.mcpServerKey);
53
+ const parsed = parseClientConfiguration(content, client.format);
54
+ const raw = effectiveClientServer(parsed, PRODUCT_IDENTITY.mcpServerKey);
40
55
  if (raw === undefined) {
41
56
  statuses.push(unavailableStatus(client.name, client.configPath, "missing"));
42
57
  continue;
@@ -46,7 +61,9 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
46
61
  registration.command,
47
62
  ...registration.args,
48
63
  ];
49
- statuses.push(configuredStatus(client.name, client.configPath, command, registrationAligned(registration, client, currentCommandPath)
64
+ statuses.push(configuredStatus(client.name, client.configPath, command, registrationAligned(registration, client, currentCommandPath, options.platform ?? process.platform) &&
65
+ !(client.format === "grok" &&
66
+ grokServerListedDisabled(parsed.document, PRODUCT_IDENTITY.mcpServerKey))
50
67
  ? "aligned"
51
68
  : "stale"));
52
69
  }
@@ -56,13 +73,13 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
56
73
  }
57
74
  return statuses.sort((left, right) => left.client.localeCompare(right.client));
58
75
  };
59
- const registrationAligned = (registration, client, currentCommandPath) => {
76
+ const registrationAligned = (registration, client, currentCommandPath, platform) => {
60
77
  const command = [registration.command, ...registration.args];
61
78
  if (registration.disabled === true || registration.enabled === false)
62
79
  return false;
63
80
  if (!isOwnedClientRegistrationCommand(command, currentCommandPath))
64
81
  return false;
65
- if (client.name === "codex" &&
82
+ if ((client.name === "codex" || client.name === "grok_build") &&
66
83
  registration.startup_timeout_sec !==
67
84
  MCP_STARTUP_POLICY.codexStartupTimeoutSeconds)
68
85
  return false;
@@ -79,11 +96,9 @@ const registrationAligned = (registration, client, currentCommandPath) => {
79
96
  resolve(command[0] ?? "") === resolve(process.execPath) &&
80
97
  resolve(command[1] ?? "") === currentCommandPath)
81
98
  return true;
82
- if (command.length === 4 &&
83
- command[0] === "npx" &&
84
- command[1] === "-y" &&
85
- command[2] === PRODUCT_IDENTITY.registrationPackageSpecifier &&
86
- command[3] === "mcp")
99
+ const npxCommand = npxRegistrationCommand(platform);
100
+ if (command.length === npxCommand.length &&
101
+ command.every((argument, index) => argument === npxCommand[index]))
87
102
  return true;
88
103
  return (command.length === 2 &&
89
104
  command[1] === "mcp" &&
@@ -1,4 +1,3 @@
1
- import { parseConfig } from "../config.js";
2
1
  import { EnhancedTools } from "./EnhancedTools.js";
3
2
  import { executeFunctionAnalysisEvidence } from "./FunctionAnalysisEvidence.js";
4
3
  import { silentLogger } from "../logger.js";
@@ -11,10 +10,13 @@ import { access } from "node:fs/promises";
11
10
  import { readAnalysisSnapshot, writeAnalysisSnapshot, } from "./binary/AnalysisSnapshotFiles.js";
12
11
  import { parseBinaryTarget } from "./BinaryTargetResolver.js";
13
12
  import { snapshotEvidenceForQuery, snapshotMatchesTarget, } from "../domain/analysisSnapshot.js";
14
- import { analysisProfileSchema, committedProviderSchema, } from "../domain/analysisProfile.js";
15
13
  import { err, ok } from "../domain/result.js";
16
14
  import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
15
+ import { createWorkflowEvidence, workflowSnapshotRecord, recordWorkflowUnknowns, } from "./WorkflowEvidence.js";
17
16
  import { artifactInspectionResultSchema } from "../domain/artifactInspection.js";
17
+ import { resolveXrefsAddress } from "./XrefsAddressResolution.js";
18
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
19
+ import { directAnalysisCleanupFailure, managedAnalysisCleanupFailure, withSessionCleanup, } from "./DirectAnalysisCleanup.js";
18
20
  /**
19
21
  * Open one binary, execute one tool, and always release provider resources.
20
22
  * Unlike MCP mode, every CLI invocation is intentionally isolated and does not
@@ -42,15 +44,12 @@ export const runProviderAnalysis = async (dependencies, ...[path, tool, argument
42
44
  /** Execute managed metadata inspection in an isolated managed-only session. */
43
45
  export const runManagedProviderExecution = async (dependencies, path, tool, signal) => withProcessCancellation(signal, async (operationSignal) => {
44
46
  const session = dependencies.createManagedBinarySession();
45
- try {
47
+ return withSessionCleanup(session, async () => {
46
48
  const opened = await session.open(path, { signal: operationSignal });
47
49
  if (!opened.ok)
48
50
  return opened;
49
51
  return await session.execute(tool, {}, { signal: operationSignal });
50
- }
51
- finally {
52
- await session.close();
53
- }
52
+ }, managedAnalysisCleanupFailure);
54
53
  });
55
54
  const runManagedProviderAnalysis = async (dependencies, path, tool, signal) => {
56
55
  const execution = await runManagedProviderExecution(dependencies, path, tool, signal);
@@ -68,11 +67,11 @@ const runManagedProviderAnalysis = async (dependencies, path, tool, signal) => {
68
67
  };
69
68
  const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
70
69
  const { logger, signal, snapshotPath } = options;
71
- const config = parseConfig(options.environment ?? process.env);
70
+ const config = dependencies.readConfiguration();
72
71
  if (!config.ok)
73
72
  return cliError(config.error);
74
73
  const session = dependencies.createBinarySession(config.value, logger);
75
- try {
74
+ return withSessionCleanup(session, async () => {
76
75
  const prepared = await prepareSnapshot({
77
76
  path,
78
77
  snapshotPath,
@@ -142,38 +141,32 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
142
141
  signal,
143
142
  evidenceProfile,
144
143
  });
145
- if (evidence !== undefined)
146
- session.recordEvidence(evidence);
144
+ if (evidence !== undefined) {
145
+ const recorded = session.recordEvidence(evidence);
146
+ if (!recorded.ok)
147
+ return cliError(recorded.error);
148
+ if (isWorkflowEvidenceTool(tool)) {
149
+ const unknowns = recordWorkflowUnknowns({
150
+ name: tool,
151
+ result: evidence.normalized_result,
152
+ evidenceId: evidence.evidence_id,
153
+ recordUnknown: (unknown) => session.recordUnknown(unknown),
154
+ });
155
+ if (!unknowns.ok)
156
+ return cliError(unknowns.error);
157
+ }
158
+ }
147
159
  if (isWorkflowEvidenceTool(tool) &&
148
160
  tool !== "trace_native_ui_action" &&
149
161
  snapshotPath !== undefined &&
150
162
  evidence !== undefined &&
151
- "analysis_profile" in evidence &&
152
163
  session.allowsSnapshotReplay(tool)) {
153
- const recorded = session.recordWorkflowSnapshot({
154
- operation: tool,
155
- parameters: arguments_,
156
- execution: {
157
- result: evidence.normalized_result,
158
- rawResult: evidence.raw_result,
159
- provider: committedProviderSchema.parse(evidence.provider),
160
- analysisProfile: analysisProfileSchema.parse(evidence.analysis_profile),
161
- limitations: evidence.limitations,
162
- locations: evidence.locations,
163
- subject: evidence.subject === null
164
- ? null
165
- : {
166
- path: evidence.subject.local_path,
167
- sha256: evidence.subject.digest.sha256,
168
- format: evidence.subject.format,
169
- ...(evidence.subject.architecture === null
170
- ? {}
171
- : { architecture: evidence.subject.architecture }),
172
- },
173
- },
174
- });
175
- if (!recorded.ok)
176
- return cliError(recorded.error);
164
+ const workflowRecord = workflowSnapshotRecord(evidence, tool);
165
+ if (workflowRecord !== undefined) {
166
+ const recorded = session.recordWorkflowSnapshot(workflowRecord);
167
+ if (!recorded.ok)
168
+ return cliError(recorded.error);
169
+ }
177
170
  }
178
171
  if (tool !== "trace_native_ui_action" &&
179
172
  snapshotPath !== undefined &&
@@ -186,10 +179,7 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
186
179
  return cliError(written.error);
187
180
  }
188
181
  return output;
189
- }
190
- finally {
191
- await session.close();
192
- }
182
+ }, directAnalysisCleanupFailure);
193
183
  };
194
184
  const executeAnalysisTool = async (input) => {
195
185
  const { session, tool, signal, evidenceProfile } = input;
@@ -208,19 +198,31 @@ const executeAnalysisTool = async (input) => {
208
198
  const result = await new EnhancedTools(session).execute(tool, input.arguments, signal);
209
199
  if (!result.ok)
210
200
  return { output: cliError(result.error) };
211
- const evidence = createEvidence(input.openedTarget, REA_WORKFLOW_PROVIDER, {
201
+ const evidence = createWorkflowEvidence({
202
+ target: input.openedTarget,
212
203
  operation: tool,
213
204
  parameters: input.arguments,
214
205
  result: result.value,
215
- ...(evidenceProfile === undefined
216
- ? {}
217
- : { analysisProfile: evidenceProfile }),
218
- confidence: "derived",
219
- limitations: ["Derived by an REA composed workflow."],
206
+ upstreamProfile: evidenceProfile,
220
207
  });
221
208
  return { output: evidence, evidence };
222
209
  }
223
- const result = await session.execute(tool, input.arguments, { signal });
210
+ let result = await session.execute(tool, input.arguments, { signal });
211
+ if (tool === "xrefs" &&
212
+ typeof input.arguments.address === "string" &&
213
+ !result.ok &&
214
+ result.error instanceof AnalysisInputError &&
215
+ !result.error.cleanupIncomplete &&
216
+ result.error.issues.length > 0 &&
217
+ result.error.issues.every(({ path, reason }) => path.length === 1 &&
218
+ path[0] === "address" &&
219
+ reason === "invalid_format")) {
220
+ const address = await resolveXrefsAddress(session, input.arguments.address, signal);
221
+ if (!address.ok)
222
+ return { output: cliError(address.error) };
223
+ if (address.value !== input.arguments.address)
224
+ result = await session.execute(tool, { ...input.arguments, address: address.value }, { signal });
225
+ }
224
226
  if (!result.ok)
225
227
  return { output: cliError(result.error) };
226
228
  const evidence = createEvidence(result.value.subject ?? input.openedTarget, result.value.provider, {
@@ -245,12 +247,16 @@ const withProcessCancellation = async (suppliedSignal, operation) => {
245
247
  return operation(suppliedSignal);
246
248
  const controller = new AbortController();
247
249
  const cancel = () => controller.abort();
248
- process.once("SIGINT", cancel);
250
+ // Package runners can forward a terminal interrupt after REA already received
251
+ // it directly. Keep both guards installed until provider cleanup has settled.
252
+ process.on("SIGINT", cancel);
253
+ process.on("SIGTERM", cancel);
249
254
  try {
250
255
  return await operation(controller.signal);
251
256
  }
252
257
  finally {
253
258
  process.off("SIGINT", cancel);
259
+ process.off("SIGTERM", cancel);
254
260
  }
255
261
  };
256
262
  const prepareSnapshot = async (options) => {
@@ -280,7 +286,7 @@ const analysisProfileForRoute = (route, tool) => {
280
286
  if (profile === null || profile === undefined)
281
287
  return undefined;
282
288
  if (isWorkflowEvidenceTool(tool))
283
- return workflowAnalysisProfile(profile);
289
+ return workflowAnalysisProfile(profile, tool);
284
290
  const provider = providerIdentityForRoute(route, tool);
285
291
  return provider.id === profile.provider.id ? profile : undefined;
286
292
  };
@@ -294,8 +300,7 @@ const providerIdentityForRoute = (route, operation) => {
294
300
  const analysisProfileForEvidence = (session, tool) => {
295
301
  if (!isWorkflowEvidenceTool(tool))
296
302
  return session.analysisProfile(tool);
297
- const upstream = session.analysisProfile();
298
- return upstream === undefined ? undefined : workflowAnalysisProfile(upstream);
303
+ return session.analysisProfile();
299
304
  };
300
305
  const isWorkflowEvidenceTool = (tool) => tool === "binary_overview" ||
301
306
  tool === "inspect_native_api" ||
@@ -0,0 +1,72 @@
1
+ import { analysisErrorProjectionSchema } from "../contracts/errorSchemas.js";
2
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
3
+ import { jsonValueSchema } from "../domain/jsonValue.js";
4
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
+ import { err } from "../domain/result.js";
6
+ import { analysisErrorWithCleanupFailure } from "./binary/AnalysisClientCleanup.js";
7
+ /** Await one-shot cleanup and retain either the outcome or both failures. */
8
+ export const withSessionCleanup = async (session, operation, onCleanupFailure) => {
9
+ let value;
10
+ try {
11
+ value = await operation();
12
+ }
13
+ catch (cause) {
14
+ const closed = await session.close();
15
+ if (!closed.ok)
16
+ throw new AggregateError([cause, closed.error], "Analysis and provider cleanup both failed", { cause });
17
+ throw cause;
18
+ }
19
+ const closed = await session.close();
20
+ return closed.ok ? value : onCleanupFailure(value, closed.error);
21
+ };
22
+ /** Keep the primary CLI failure or completed Evidence alongside cleanup failure. */
23
+ export const directAnalysisCleanupFailure = (output, error) => {
24
+ const cleanup = projectAnalysisError(error);
25
+ if (typeof output === "object" && output !== null && !Array.isArray(output)) {
26
+ const { error: label, ...projection } = output;
27
+ const primary = analysisErrorProjectionSchema.safeParse(projection);
28
+ if (typeof label === "string" && primary.success)
29
+ return {
30
+ error: label,
31
+ ...primary.data,
32
+ code: "cleanup_incomplete",
33
+ retryable: false,
34
+ details: {
35
+ ...primary.data.details,
36
+ cleanup: "incomplete",
37
+ resources: error.cleanupResources.slice(),
38
+ execution_failure: primary.data.details !== undefined &&
39
+ "execution_failure" in primary.data.details
40
+ ? (primary.data.details.execution_failure ?? primary.data.code)
41
+ : primary.data.code,
42
+ primary_error: projection,
43
+ cleanup_error: cleanup,
44
+ },
45
+ };
46
+ }
47
+ return {
48
+ error: "Analysis failed",
49
+ ...cleanup,
50
+ code: "cleanup_incomplete",
51
+ retryable: false,
52
+ details: {
53
+ ...cleanup.details,
54
+ cleanup: "incomplete",
55
+ partial_observation: output,
56
+ },
57
+ };
58
+ };
59
+ /** Preserve managed observations or the original typed failure in diagnostics. */
60
+ export const managedAnalysisCleanupFailure = (result, error) => {
61
+ if (!result.ok)
62
+ return err(analysisErrorWithCleanupFailure(result.error, error));
63
+ const cleanup = projectAnalysisError(error);
64
+ return err(new ProviderAdapterError(error instanceof ProviderAdapterError ? error.providerId : "rea", "close_binary", {
65
+ cause: error,
66
+ cleanup: { reason: cleanup.message, resources: error.cleanupResources },
67
+ diagnostics: {
68
+ cleanup_error: cleanup,
69
+ partial_observation: jsonValueSchema.parse(result.value),
70
+ },
71
+ }));
72
+ };
@@ -1,10 +1,9 @@
1
- import { parseConfig } from "../config.js";
2
1
  import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
3
2
  import { jsonObjectSchema } from "../domain/jsonValue.js";
4
3
  import { createServerIdentity } from "../serverIdentity.js";
5
4
  import { silentLogger } from "../logger.js";
6
- const runSessionStatus = async (dependencies, logger = silentLogger, environment = process.env) => {
7
- const config = parseConfig(environment);
5
+ const runSessionStatus = async (dependencies, logger = silentLogger) => {
6
+ const config = dependencies.readConfiguration();
8
7
  if (!config.ok)
9
8
  return { error: projectAnalysisError(config.error) };
10
9
  const session = dependencies.createBinarySession(config.value, logger);
@@ -21,6 +20,6 @@ const runSessionStatus = async (dependencies, logger = silentLogger, environment
21
20
  }
22
21
  };
23
22
  /** List binary-session provider candidates and auxiliary operation availability. */
24
- export const runProviderStatus = (dependencies, logger = silentLogger, environment = process.env) => runSessionStatus(dependencies, logger, environment);
23
+ export const runProviderStatus = (dependencies, logger = silentLogger) => runSessionStatus(dependencies, logger);
25
24
  /** List binary-session operation descriptors; this is not the full MCP catalog. */
26
- export const runCapabilityStatus = (dependencies, logger = silentLogger, environment = process.env) => runSessionStatus(dependencies, logger, environment);
25
+ export const runCapabilityStatus = (dependencies, logger = silentLogger) => runSessionStatus(dependencies, logger);
@@ -1,12 +1,13 @@
1
1
  import { constants } from "node:fs";
2
2
  import { access, readFile, readdir } from "node:fs/promises";
3
- import { homedir } from "node:os";
4
- import { delimiter, join } from "node:path";
3
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
4
+ import { join } from "node:path";
5
5
  import { analysisErrorRemediationAction } from "../domain/analysisErrorPresentation.js";
6
6
  import { parseBinaryTarget } from "./BinaryTargetResolver.js";
7
7
  import { execFileOutput } from "../process/ExecFileOutput.js";
8
- import { probeHomebrew } from "./homebrew.js";
8
+ import { installedCaskAppdir, probeHomebrew } from "./homebrew.js";
9
9
  import { linuxHopperBinarySupported, linuxSharedLibrariesAvailable, readLinuxDistribution, } from "./LinuxHopper.js";
10
+ import { canonicalSkillNeedsInstall } from "./SetupSkill.js";
10
11
  import { CATALOG_IDENTITY } from "../catalogIdentity.js";
11
12
  import { PRODUCT_IDENTITY, SDK_IDENTITY } from "../identity.js";
12
13
  import { readClientRegistrationStatuses, } from "./ClientRegistrationStatus.js";
@@ -61,7 +62,7 @@ const collectDoctorIdentity = async (host) => {
61
62
  checks: [
62
63
  ...(skillAligned ? [] : [skillIdentityCheck(installedSkillIdentity)]),
63
64
  ...registrations
64
- .filter((registration) => registration.state !== "aligned")
65
+ .filter((registration) => registration.state !== "aligned" && registration.state !== "manual")
65
66
  .map(registrationCheck),
66
67
  ],
67
68
  value: {
@@ -96,7 +97,7 @@ const collectDoctorIdentity = async (host) => {
96
97
  };
97
98
  const skillIdentityAligned = (identity) => identity?.version === PRODUCT_IDENTITY.skillVersion &&
98
99
  identity.toolCount === CATALOG_IDENTITY.counts.mcp_tools &&
99
- identity.catalogDigest === CATALOG_IDENTITY.digests.combined_sha256;
100
+ identity.canonical;
100
101
  const skillIdentityCheck = (identity) => ({
101
102
  name: "skill:identity",
102
103
  ok: false,
@@ -114,23 +115,13 @@ const registrationCheck = (registration) => ({
114
115
  remediation: registration.remediation,
115
116
  });
116
117
  const installationState = (paths) => paths.length === 0 ? "unknown" : paths.length === 1 ? "single" : "multiple";
117
- const homeFromEnvironment = (environment, platform) => {
118
- const selected = platform === "win32"
119
- ? (environment.USERPROFILE ??
120
- (environment.HOMEDRIVE !== undefined &&
121
- environment.HOMEPATH !== undefined
122
- ? `${environment.HOMEDRIVE}${environment.HOMEPATH}`
123
- : environment.HOME))
124
- : (environment.HOME ?? environment.USERPROFILE);
125
- return selected ?? homedir();
126
- };
127
118
  /** Create diagnostics backed by the current process and host commands. */
128
119
  export const systemDoctorHost = (options = {}) => {
129
120
  const platform = options.platform ?? process.platform;
130
121
  const architecture = options.architecture ?? process.arch;
131
122
  const environment = options.environment ?? process.env;
132
123
  const hostExecFileOutput = options.execFileOutput ?? execFileOutput;
133
- const homeDirectory = homeFromEnvironment(environment, platform);
124
+ const homeDirectory = homeDirectoryFromEnvironment(environment, platform);
134
125
  const commandEnvironment = { env: environment };
135
126
  return {
136
127
  platform,
@@ -179,15 +170,21 @@ export const systemDoctorHost = (options = {}) => {
179
170
  supportedLinuxHopper: linuxHopperBinarySupported,
180
171
  async brewHopperPath() {
181
172
  return probeHomebrew(async (command) => {
173
+ let caskroom;
182
174
  try {
183
- const prefix = (await hostExecFileOutput(command, ["--prefix", "--cask", "hopper-disassembler"], commandEnvironment)).stdout.trim();
184
- return `${prefix}/Hopper Disassembler.app/Contents/MacOS/hopper`;
175
+ // Without a cask argument, `--caskroom` does not load Homebrew's
176
+ // cask API, so doctor writes no Homebrew cache files.
177
+ caskroom = (await hostExecFileOutput(command, ["--caskroom"], commandEnvironment)).stdout.trim();
185
178
  }
186
179
  catch (cause) {
187
180
  // best-effort cleanup: optional Homebrew probing; absence means uninstalled.
188
181
  void cause;
189
182
  return undefined;
190
183
  }
184
+ const appdir = await installedCaskAppdir(caskroom, "hopper-disassembler", homeDirectory);
185
+ return appdir === undefined
186
+ ? undefined
187
+ : join(appdir, "Hopper Disassembler.app/Contents/MacOS/hopper");
191
188
  });
192
189
  },
193
190
  manualHopperPaths: () => manualHopperPaths(homeDirectory),
@@ -228,7 +225,7 @@ export const systemDoctorHost = (options = {}) => {
228
225
  }),
229
226
  };
230
227
  };
231
- const readMacosVersion = async (run = execFileOutput, options = { env: process.env }) => {
228
+ const readMacosVersion = async (run, options) => {
232
229
  try {
233
230
  return (await run("sw_vers", ["-productVersion"], options)).stdout.trim();
234
231
  }
@@ -238,7 +235,7 @@ const readMacosVersion = async (run = execFileOutput, options = { env: process.e
238
235
  return undefined;
239
236
  }
240
237
  };
241
- const executableAvailable = async (path, platform = process.platform, run = execFileOutput, options = { env: process.env }) => {
238
+ const executableAvailable = async (path, platform, run, options) => {
242
239
  try {
243
240
  await access(path, constants.X_OK);
244
241
  if (platform !== "linux")
@@ -259,7 +256,7 @@ const uncomposedLinuxDemoRuntimeCheck = () => Promise.resolve({
259
256
  detail: "Linux Hopper private-display diagnostics were not composed",
260
257
  remediation: "Run rea doctor through the production CLI adapter.",
261
258
  });
262
- const manualHopperPaths = async (home = homedir()) => {
259
+ const manualHopperPaths = async (home) => {
263
260
  const paths = [];
264
261
  for (const root of ["/Applications", join(home, "Applications")]) {
265
262
  try {
@@ -281,6 +278,7 @@ const installedSkillIdentity = async (home) => {
281
278
  const content = await readInstalledSkill(home);
282
279
  const countText = /^\s{2}tool_count:\s*(\d+)\s*$/mu.exec(content)?.[1];
283
280
  return {
281
+ canonical: !(await canonicalSkillNeedsInstall(home)),
284
282
  version: /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(content)?.[1] ?? null,
285
283
  toolCount: countText === undefined ? null : Number.parseInt(countText, 10),
286
284
  catalogDigest: /^\s{2}catalog_digest:\s*"([a-f0-9]{64})"\s*$/mu.exec(content)?.[1] ??
@@ -1,4 +1,3 @@
1
- import { homedir } from "node:os";
2
1
  import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
3
2
  import { linuxHopperLauncherPath } from "./LinuxHopper.js";
4
3
  const DEFAULT_HOPPER = "/Applications/Hopper Disassembler.app/Contents/MacOS/hopper";
@@ -75,7 +74,7 @@ const findHopper = async (host) => {
75
74
  ? [
76
75
  DEFAULT_HOPPER,
77
76
  SYSTEM_LINUX_HOPPER,
78
- linuxHopperLauncherPath(host.homeDirectory ?? homedir()),
77
+ linuxHopperLauncherPath(host.homeDirectory),
79
78
  ...(await host.manualHopperPaths()),
80
79
  ]
81
80
  : [host.configuredHopperPath];
@@ -1,4 +1,5 @@
1
1
  import { uniqueSorted } from "../domain/canonicalOrdering.js";
2
+ import { manualRegistrationRemediation } from "./SupportedClients.js";
2
3
  /** Normalize a caller-selected doctor readiness boundary. */
3
4
  export const normalizeDoctorScope = (requested, target) => ({
4
5
  mode: requested === undefined ? "audit-wide" : "explicit",
@@ -62,22 +63,33 @@ const selectedProviderChecksFor = (providerId, checks, providers) => {
62
63
  },
63
64
  ];
64
65
  };
65
- const selectedRegistrationCheck = (client, status) => status === undefined
66
- ? {
67
- name: `registration:${client}`,
68
- ok: false,
69
- classification: "config_drift",
70
- detail: `Requested client ${client} was not detected.`,
71
- remediation: `Install or select ${client}, then run rea setup --client ${client}.`,
72
- }
73
- : status.state === "aligned"
66
+ const selectedRegistrationCheck = (client, status) => {
67
+ const manual = manualRegistrationRemediation(client);
68
+ if (status === undefined && manual !== undefined)
69
+ return {
70
+ name: `registration:${client}`,
71
+ ok: false,
72
+ classification: "config_drift",
73
+ detail: `${client} is not registered through a local configuration file.`,
74
+ remediation: manual,
75
+ };
76
+ return status === undefined
74
77
  ? {
75
78
  name: `registration:${client}`,
76
- ok: true,
77
- classification: "healthy",
78
- detail: status.config_path,
79
+ ok: false,
80
+ classification: "config_drift",
81
+ detail: `Requested client ${client} was not detected.`,
82
+ remediation: `Install or select ${client}, then run rea setup --client ${client}.`,
79
83
  }
80
- : registrationCheck(status);
84
+ : status.state === "aligned"
85
+ ? {
86
+ name: `registration:${client}`,
87
+ ok: true,
88
+ classification: "healthy",
89
+ detail: status.config_path,
90
+ }
91
+ : registrationCheck(status);
92
+ };
81
93
  const registrationCheck = (status) => ({
82
94
  name: `registration:${status.client}`,
83
95
  ok: false,