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,10 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { execFile } from "node:child_process";
3
3
  import { access, mkdir, mkdtemp, readdir, rename, rm, writeFile, } from "node:fs/promises";
4
- import { homedir, tmpdir } from "node:os";
4
+ import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { promisify } from "node:util";
7
7
  import { z } from "zod";
8
+ import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
8
9
  const execFileAsync = promisify(execFile);
9
10
  const RELEASES_URL = "https://www.hopperapp.com/include/files-api.php?request=releases&public=true";
10
11
  const DOWNLOAD_PREFIX = "https://www.hopperapp.com:443/downloader/public/";
@@ -21,7 +22,7 @@ export const macHopperInstallDisclosure = {
21
22
  ],
22
23
  };
23
24
  /** Download, verify, and install Hopper into the current user's Applications directory. */
24
- export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost()) => {
25
+ export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost(homeDirectoryFromEnvironment(process.env, process.platform), process.env)) => {
25
26
  let temporary;
26
27
  let mounted = false;
27
28
  try {
@@ -77,7 +78,8 @@ export const installMacHopper = async (options = {}, host = systemMacHopperInsta
77
78
  }
78
79
  }
79
80
  };
80
- const systemMacHopperInstallHost = () => ({
81
+ /** Compose installer paths and subprocesses from one selected caller context. */
82
+ export const systemMacHopperInstallHost = (homeDirectory, environment) => ({
81
83
  download: downloadPackage,
82
84
  createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-mac-")),
83
85
  createMountDirectory: (path) => mkdir(path),
@@ -90,10 +92,10 @@ const systemMacHopperInstallHost = () => ({
90
92
  "-mountpoint",
91
93
  mountPath,
92
94
  packagePath,
93
- ]);
95
+ ], environment);
94
96
  },
95
97
  async unmount(mountPath) {
96
- await commandSucceeds("hdiutil", ["detach", mountPath, "-force"]);
98
+ await commandSucceeds("hdiutil", ["detach", mountPath, "-force"], environment);
97
99
  },
98
100
  async appBundle(mountPath) {
99
101
  const entries = await readdir(mountPath, { withFileTypes: true });
@@ -101,19 +103,14 @@ const systemMacHopperInstallHost = () => ({
101
103
  return app === undefined ? undefined : join(mountPath, app.name);
102
104
  },
103
105
  async validBundle(appPath) {
104
- if (!(await commandSucceeds("codesign", [
105
- "--verify",
106
- "--deep",
107
- "--strict",
108
- appPath,
109
- ])))
106
+ if (!(await commandSucceeds("codesign", ["--verify", "--deep", "--strict", appPath], environment)))
110
107
  return false;
111
108
  try {
112
109
  const identifier = (await execFileAsync("/usr/libexec/PlistBuddy", [
113
110
  "-c",
114
111
  "Print :CFBundleIdentifier",
115
112
  join(appPath, "Contents/Info.plist"),
116
- ])).stdout.trim();
113
+ ], { env: environment })).stdout.trim();
117
114
  return identifier === BUNDLE_IDENTIFIER;
118
115
  }
119
116
  catch (cause) {
@@ -136,10 +133,10 @@ const systemMacHopperInstallHost = () => ({
136
133
  async installBundle(source, destination, stage, replaceExisting) {
137
134
  const previous = `${stage}-previous`;
138
135
  try {
139
- await mkdir(join(homedir(), "Applications"), { recursive: true });
136
+ await mkdir(join(homeDirectory, "Applications"), { recursive: true });
140
137
  await rm(stage, { recursive: true, force: true });
141
138
  await rm(previous, { recursive: true, force: true });
142
- await execFileAsync("ditto", [source, stage]);
139
+ await execFileAsync("ditto", [source, stage], { env: environment });
143
140
  await access(join(stage, "Contents/MacOS/hopper"));
144
141
  if (replaceExisting)
145
142
  await rename(destination, previous);
@@ -176,10 +173,10 @@ const systemMacHopperInstallHost = () => ({
176
173
  }
177
174
  },
178
175
  async openApplication(path) {
179
- await execFileAsync("open", [path]);
176
+ await execFileAsync("open", [path], { env: environment });
180
177
  },
181
178
  cleanup: (path) => rm(path, { recursive: true, force: true }),
182
- destination: () => join(homedir(), "Applications/Hopper Disassembler.app"),
179
+ destination: () => join(homeDirectory, "Applications/Hopper Disassembler.app"),
183
180
  });
184
181
  const downloadPackage = async (url) => {
185
182
  const response = await fetch(url, {
@@ -196,9 +193,9 @@ const parseJson = (bytes) => JSON.parse(new TextDecoder().decode(bytes));
196
193
  const integrityMatches = (bytes, release) => bytes.byteLength === Number(release.file_length) &&
197
194
  bytes.byteLength <= MAX_PACKAGE_BYTES &&
198
195
  createHash("sha1").update(bytes).digest("hex") === release.file_hash;
199
- const commandSucceeds = async (command, args) => {
196
+ const commandSucceeds = async (command, args, environment) => {
200
197
  try {
201
- await execFileAsync(command, args);
198
+ await execFileAsync(command, args, { env: environment });
202
199
  return true;
203
200
  }
204
201
  catch (cause) {
@@ -0,0 +1,11 @@
1
+ import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
2
+ import { err, ok } from "../domain/result.js";
3
+ /** Resolve a caller selector to an observed provider procedure identity. */
4
+ export const resolveProcedureAddress = async (call, procedure, signal) => {
5
+ const result = await call("procedure_address", { procedure }, signal);
6
+ if (!result.ok)
7
+ return result;
8
+ return typeof result.value === "string" && result.value.length > 0
9
+ ? ok(result.value)
10
+ : err(new AnalysisOutputError("procedure_address", "provider returned no canonical procedure address"));
11
+ };
@@ -11,17 +11,6 @@ export const firstProcedureAddress = (input) => {
11
11
  throw new TypeError("Procedure inventory was empty");
12
12
  return first.address;
13
13
  };
14
- /** Reject two target paths that resolve to the same binary content. */
15
- export const requireDistinctTargetHashes = (firstHash, secondHash) => {
16
- if (typeof firstHash !== "string" ||
17
- typeof secondHash !== "string" ||
18
- firstHash.length === 0 ||
19
- secondHash.length === 0) {
20
- throw new TypeError("Target hashes must be non-empty strings");
21
- }
22
- if (firstHash === secondHash)
23
- throw new TypeError("Real-Hopper verification requires distinct binaries");
24
- };
25
14
  /** Reject empty and success-shaped embedded decompilation failures. */
26
15
  export const requirePseudocode = (input, operation) => {
27
16
  if (typeof input !== "string" || input.trim().length === 0)
@@ -1,20 +1,23 @@
1
+ import { z } from "zod";
1
2
  import { reconstructionCoverageEvaluationInputSchema } from "../domain/reconstructionCoverageInput.js";
2
3
  import { AnalysisInputError } from "../domain/analysisErrorCore.js";
3
4
  import {} from "../domain/analysisErrorBase.js";
4
5
  import { evaluateReconstructionClosure } from "../domain/reconstructionCoverage.js";
5
6
  import { jsonValueSchema } from "../domain/jsonValue.js";
6
7
  import { err, ok } from "../domain/result.js";
8
+ import { requestInputError, workflowInputError } from "./workflowInputError.js";
9
+ const OPERATION = "evaluate_reconstruction_coverage";
7
10
  /** Evaluate inline reconstruction coverage against a named boundary. */
8
11
  export const evaluateReconstructionCoverage = (rawInput, nowEpochMs = Date.now()) => {
9
12
  const parsed = reconstructionCoverageEvaluationInputSchema.safeParse(rawInput);
10
13
  if (!parsed.success)
11
- return err(new AnalysisInputError("evaluate_reconstruction_coverage", {
12
- cause: parsed.error,
13
- }));
14
+ return err(requestInputError(OPERATION, parsed.error, rawInput));
14
15
  try {
15
16
  return ok(jsonValueSchema.parse(evaluateReconstructionClosure(parsed.data.coverage, parsed.data.boundary_id, nowEpochMs)));
16
17
  }
17
18
  catch (cause) {
18
- return err(new AnalysisInputError("evaluate_reconstruction_coverage", { cause }));
19
+ return err(cause instanceof TypeError || cause instanceof z.ZodError
20
+ ? workflowInputError(OPERATION, cause)
21
+ : new AnalysisInputError(OPERATION, { cause }));
19
22
  }
20
23
  };
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { parseEvidenceBundle, } from "../domain/evidenceBundle.js";
4
- import { parseProcessCapture } from "../domain/process/processCapture.js";
4
+ import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
5
5
  import { parseApplicationGraphEvidence } from "./javascript/JavaScriptApplicationEvidenceGraph.js";
6
6
  import { applicationObligationPolicy, semanticObligationPolicy, } from "./ReconstructionObligationPolicies.js";
7
7
  /** Derive conservative candidates from graph, process, and reviewed inputs. */
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
- import { AnalysisInputError, AnalysisProtocolError, } from "../domain/analysisErrorCore.js";
2
+ import { AnalysisProtocolError } from "../domain/analysisErrorCore.js";
3
3
  import {} from "../domain/analysisErrorBase.js";
4
4
  import { createEvidence } from "../domain/evidence.js";
5
5
  import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
6
6
  import { reconstructionObligationLedgerInputSchema, reconstructionObligationLedgerSchema, } from "../domain/reconstructionObligationLedgerSchemas.js";
7
7
  import { err, ok } from "../domain/result.js";
8
+ import { requestInputError, workflowInputError } from "./workflowInputError.js";
8
9
  import { JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER } from "./InvestigationProviders.js";
9
10
  import { deriveReconstructionObligationCandidates } from "./ReconstructionObligationCandidates.js";
10
11
  import { evaluateReconstructionObligationLedger } from "./ReconstructionObligationLedgerEvaluation.js";
@@ -14,7 +15,7 @@ export const resolveReconstructionObligationLedgerRequest = (input) => {
14
15
  const parsed = reconstructionObligationLedgerInputSchema.safeParse(input);
15
16
  return parsed.success
16
17
  ? ok(parsed.data)
17
- : err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
18
+ : err(requestInputError(OPERATION, parsed.error, input));
18
19
  };
19
20
  /** Build the complete deterministic ledger and wrap it in portable Evidence. */
20
21
  export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
@@ -30,7 +31,7 @@ export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
30
31
  }
31
32
  catch (cause) {
32
33
  if (cause instanceof z.ZodError)
33
- return err(new AnalysisInputError(OPERATION, { cause }));
34
+ return err(workflowInputError(OPERATION, cause));
34
35
  return err(new AnalysisProtocolError("Reconstruction obligation ledger generation failed", { cause }));
35
36
  }
36
37
  };
@@ -32,7 +32,7 @@ const failedEntry = (entry) => {
32
32
  return {
33
33
  path: entry.path,
34
34
  kind: "symlink",
35
- target: "<unreadable>",
35
+ target: null,
36
36
  target_state: "unreadable",
37
37
  classifications,
38
38
  limitations: [limitation],
@@ -1,6 +1,7 @@
1
+ import { manualRegistrationRemediation, } from "./SupportedClients.js";
1
2
  import { configureDetectedClients } from "./SetupClients.js";
2
3
  import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
3
- import { filterClientsNeedingConfigure, hostRemediation, initialProviderEnvironment, setupRegistrationCommand, systemSetupHost, } from "./SetupHost.js";
4
+ import { filterClientsNeedingConfigure, hostRemediation, systemSetupHost, } from "./SetupHost.js";
4
5
  /** Discover, approve, and apply setup actions idempotently. */
5
6
  export const runSetup = async (options, host = systemSetupHost(), confirm) => {
6
7
  const appliedActions = [];
@@ -12,22 +13,14 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
12
13
  const unsupported = await hostRemediation(host, false);
13
14
  if (unsupported !== undefined)
14
15
  return fail(unsupported);
15
- const initialState = await host.initialSetupState?.(options.readinessScope);
16
- let hopperPath = initialState === undefined
17
- ? await host.hopperPath()
18
- : initialState.hopperPath;
19
- let providerEnvironment = initialState === undefined
20
- ? await initialProviderEnvironment(host, hopperPath)
21
- : initialState.providerEnvironment;
16
+ const initialState = await host.initialSetupState(options.readinessScope);
17
+ let { hopperPath, providerEnvironment } = initialState;
22
18
  const discovery = await discoverSetupState({
23
19
  host,
24
20
  providerEnvironment,
25
21
  forceHopperInstall: options.installHopper,
26
22
  proposeHopper: options.proposeHopper ?? (confirm !== undefined && !options.structured),
27
- doctorScope: options.readinessScope,
28
- ...(initialState === undefined
29
- ? {}
30
- : { initialDoctor: initialState.doctor }),
23
+ initialDoctor: initialState.doctor,
31
24
  });
32
25
  clientStates = discovery.clientStates;
33
26
  const clientSelectionAllowed = options.clientIds === undefined &&
@@ -51,7 +44,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
51
44
  discovery,
52
45
  host,
53
46
  providerEnvironment,
54
- command: setupRegistrationCommand(host.platform),
47
+ command: host.registrationCommand,
55
48
  clientIds: [],
56
49
  installSkill: offerSkillAction,
57
50
  });
@@ -91,7 +84,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
91
84
  discovery: planDiscovery,
92
85
  host,
93
86
  providerEnvironment,
94
- command: setupRegistrationCommand(host.platform),
87
+ command: host.registrationCommand,
95
88
  clientIds: selectedClientIds,
96
89
  installSkill,
97
90
  });
@@ -109,6 +102,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
109
102
  clientsToConfigure: planned.clientsToConfigure,
110
103
  };
111
104
  readinessScope = resolvedReadinessScope(options.readinessScope, planSelection);
105
+ const manualRemediation = manualClientsRemediation(planned.selectedClients);
112
106
  if (options.dryRun === true)
113
107
  return {
114
108
  status: "planned",
@@ -117,6 +111,9 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
117
111
  clients,
118
112
  doctor: summarizeDoctor(discovery.initialDoctor),
119
113
  clientStates,
114
+ ...(manualRemediation === undefined
115
+ ? {}
116
+ : { remediation: manualRemediation }),
120
117
  };
121
118
  let approved = options.approved || plannedActions.length === 0;
122
119
  let interactiveApproval = false;
@@ -170,7 +167,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
170
167
  host,
171
168
  detectedClients: selectedClients,
172
169
  providerEnvironment,
173
- command: setupRegistrationCommand(host.platform),
170
+ command: host.registrationCommand,
174
171
  clients,
175
172
  appliedActions,
176
173
  ...(options.onProgress === undefined
@@ -183,7 +180,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
183
180
  !(await installSkillAction(host, options, appliedActions)))
184
181
  return fail("REA analysis skill could not be installed or verified. Check permissions for `~/.agents/skills`, then rerun setup.");
185
182
  const doctor = summarizeDoctor(await host.doctor(readinessScope));
186
- const remediation = finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath);
183
+ const remediation = combineRemediation(finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath), manualRemediation);
187
184
  return {
188
185
  status: remediation === undefined ? "ready" : "needs_human",
189
186
  plannedActions,
@@ -236,7 +233,7 @@ const installHopperAction = async (input) => {
236
233
  return {
237
234
  hopperPath: installed.launcherPath,
238
235
  providerEnvironment,
239
- selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, setupRegistrationCommand(input.host.platform)),
236
+ selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, input.host.registrationCommand),
240
237
  };
241
238
  };
242
239
  const installSkillAction = async (host, options, appliedActions) => {
@@ -277,6 +274,13 @@ const setupFailure = async (remediation, [host, plannedActions, appliedActions,
277
274
  };
278
275
  };
279
276
  const emitProgress = (options, event) => options.onProgress?.(event);
277
+ const manualClientsRemediation = (clients) => clients
278
+ .map((client) => manualRegistrationRemediation(client.name))
279
+ .find((remediation) => remediation !== undefined);
280
+ const combineRemediation = (...parts) => {
281
+ const present = parts.filter((part) => part !== undefined && part !== "");
282
+ return present.length === 0 ? undefined : present.join(" ");
283
+ };
280
284
  const finalSetupRemediation = (platform, installedHopper, healthy, hopperPath) => {
281
285
  if (platform === "darwin" && installedHopper)
282
286
  return "Open Hopper, choose its demo mode or activate a license, then rerun rea doctor --json.";
@@ -1,21 +1,13 @@
1
- import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerPath, legacyClientServerPath, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
1
+ import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerPath, grokServerListedDisabled, legacyClientServerPath, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
2
2
  import { constants as fsConstants } from "node:fs";
3
3
  import { copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises";
4
4
  import { dirname } from "node:path";
5
5
  import writeFileAtomic from "write-file-atomic";
6
6
  import { PRODUCT_IDENTITY } from "../identity.js";
7
+ import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
7
8
  import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
8
9
  import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
9
- const defaultCommand = () => [
10
- "npx",
11
- "-y",
12
- PRODUCT_IDENTITY.registrationPackageSpecifier,
13
- "mcp",
14
- ];
15
- /** Back up, atomically update, and semantically read back one JSON MCP configuration. */
16
- export const configureJsonClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "json");
17
- /** Back up, atomically update, and semantically read back one TOML MCP configuration. */
18
- export const configureTomlClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "toml");
10
+ const defaultCommand = () => npxRegistrationCommand();
19
11
  /** Configure one supported client's native stdio MCP registration shape. */
20
12
  export const configureClientConfiguration = (client, environment = {}, command = defaultCommand()) => {
21
13
  if (client.format === undefined || client.format === "unsupported")
@@ -36,7 +28,7 @@ const configureClientDocument = async (client, environment, command, format) =>
36
28
  }
37
29
  let parsed;
38
30
  try {
39
- parsed = parseClientConfiguration(original ?? (format === "toml" ? "" : "{}"), format);
31
+ parsed = parseClientConfiguration(original ?? (format === "toml" || format === "grok" ? "" : "{}"), format);
40
32
  }
41
33
  catch (cause) {
42
34
  // Malformed existing configuration fails the readback gate.
@@ -163,14 +155,17 @@ const restoreConfig = async (path, original) => {
163
155
  void cause;
164
156
  }
165
157
  };
166
- /** Whether REA's entry matches and no conflicting legacy entry remains. */
167
- const registrationCurrent = (parsed, desired) => clientConfigurationValuesEqual(parsed.servers[PRODUCT_IDENTITY.mcpServerKey], desired) && !Object.hasOwn(parsed.legacyServers, PRODUCT_IDENTITY.mcpServerKey);
158
+ /** Whether REA's entry matches, no legacy entry remains, and Grok is not suppressing it. */
159
+ const registrationCurrent = (parsed, desired) => clientConfigurationValuesEqual(parsed.servers[PRODUCT_IDENTITY.mcpServerKey], desired) &&
160
+ !Object.hasOwn(parsed.legacyServers, PRODUCT_IDENTITY.mcpServerKey) &&
161
+ !(parsed.dialect === "grok" &&
162
+ grokServerListedDisabled(parsed.document, PRODUCT_IDENTITY.mcpServerKey));
168
163
  const clientConfigurationDesired = (client, providerEnvironment, command, format) => {
169
164
  const environment = Object.fromEntries(Object.entries(providerEnvironment).sort(([left], [right]) => left.localeCompare(right)));
170
165
  const registration = clientRegistrationEntry(format ?? "json", command.length === 0 ? [PRODUCT_IDENTITY.cliBinary, "mcp"] : command, environment);
171
166
  return {
172
167
  ...registration,
173
- ...(client.name === "codex"
168
+ ...(client.name === "codex" || client.name === "grok_build"
174
169
  ? {
175
170
  startup_timeout_sec: MCP_STARTUP_POLICY.codexStartupTimeoutSeconds,
176
171
  }
@@ -1,19 +1,19 @@
1
1
  import { access } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
2
  import { resolve } from "node:path";
4
3
  import { PRODUCT_IDENTITY } from "../identity.js";
4
+ import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
5
5
  import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
6
6
  import { runDoctor, systemDoctorHost } from "./Doctor.js";
7
- import { installLinuxHopper, readLinuxDistribution } from "./LinuxHopper.js";
8
- import { installMacHopper } from "./MacHopper.js";
7
+ import { installLinuxHopper, readLinuxDistribution, systemLinuxHopperInstallHost, } from "./LinuxHopper.js";
8
+ import { installMacHopper, systemMacHopperInstallHost } from "./MacHopper.js";
9
9
  import { supportedClients } from "./SupportedClients.js";
10
10
  import { canonicalSkillNeedsInstall, installCanonicalSkill, } from "./SetupSkill.js";
11
11
  import { clientConfigurationAligned, configureClientConfiguration, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
12
12
  import { setupInstallFailure } from "./SetupInstallFailure.js";
13
13
  import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
14
14
  /** Resolve the executable and arguments used in a managed MCP registration. */
15
- export const setupRegistrationCommand = (platform, useNpmRunner = process.env.npm_command === "exec") => useNpmRunner
16
- ? PRODUCT_IDENTITY.mcpCommand.split(" ")
15
+ export const setupRegistrationCommand = (platform, useNpmRunner) => useNpmRunner
16
+ ? npxRegistrationCommand(platform)
17
17
  : platform === "win32"
18
18
  ? [
19
19
  process.execPath,
@@ -25,10 +25,6 @@ export const filterClientsNeedingConfigure = async (host, detectedClients, provi
25
25
  const needs = await Promise.all(detectedClients.map((client) => host.clientNeedsConfigure(client, providerEnvironment, command)));
26
26
  return detectedClients.filter((_, index) => needs[index]);
27
27
  };
28
- export const initialProviderEnvironment = async (host, hopperPath) => ({
29
- ...(await host.providerEnvironment?.()),
30
- ...(hopperPath === undefined ? {} : { HOPPER_LAUNCHER_PATH: hopperPath }),
31
- });
32
28
  export const hostRemediation = async (host, installHopper) => {
33
29
  if (!supportsNodeVersion(host.nodeVersion))
34
30
  return `Install ${SUPPORTED_NODE_VERSION_PROSE} and rerun setup.`;
@@ -47,14 +43,17 @@ export const hostRemediation = async (host, installHopper) => {
47
43
  return "Automated Hopper setup supports Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, and CachyOS; configure an existing supported provider instead.";
48
44
  };
49
45
  /** Production setup effects for Hopper, agent configuration, and the canonical skill directory. */
50
- export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
46
+ export const systemSetupHost = (selectedDoctorHost = undefined, environment = process.env) => {
47
+ const doctorHost = selectedDoctorHost ?? systemDoctorHost({ environment });
51
48
  const platform = doctorHost.platform;
49
+ const { homeDirectory } = doctorHost;
52
50
  return {
53
51
  platform,
52
+ homeDirectory,
53
+ registrationCommand: setupRegistrationCommand(platform, environment.npm_command === "exec"),
54
54
  nodeVersion: process.versions.node,
55
55
  macosVersion: () => doctorHost.macosVersion(),
56
56
  linuxDistribution: readLinuxDistribution,
57
- hopperPath: async () => (await runDoctor(undefined, doctorHost)).hopperPath,
58
57
  initialSetupState: async (scope) => {
59
58
  const diagnosis = await runDoctor(undefined, doctorHost, scope);
60
59
  return {
@@ -70,39 +69,32 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
70
69
  doctor: diagnosis,
71
70
  };
72
71
  },
73
- providerEnvironment: async () => {
74
- const diagnosis = await runDoctor(undefined, doctorHost);
75
- return {
76
- ...providerRegistrationEnvironment(diagnosis.providerInspections ?? []),
77
- ...(diagnosis.hopperPath === undefined
78
- ? {}
79
- : { HOPPER_LAUNCHER_PATH: diagnosis.hopperPath }),
80
- };
81
- },
82
72
  installHopper: async (replaceExisting) => {
83
73
  const result = platform === "linux"
84
- ? await installLinuxHopper()
85
- : await installMacHopper({ replaceExisting });
74
+ ? await installLinuxHopper(systemLinuxHopperInstallHost(environment))
75
+ : await installMacHopper({ replaceExisting }, systemMacHopperInstallHost(homeDirectory, environment));
86
76
  if (result.status === "installed")
87
77
  return result;
88
78
  return setupInstallFailure(result.reason);
89
79
  },
90
- detectedClients: () => detectClients(homedir()),
91
- supportedClients: () => Promise.resolve(supportedClients(homedir())),
80
+ detectedClients: () => detectClients(homeDirectory, platform, environment),
81
+ supportedClients: () => Promise.resolve(supportedClients(homeDirectory, platform, environment)),
92
82
  configureClient: (client, providerEnvironment, command) => client.format === "unsupported"
93
83
  ? Promise.resolve({ status: "skipped" })
94
84
  : configureClientConfiguration(client, providerEnvironment, command),
95
- clientNeedsConfigure: (client, providerEnvironment, command) => clientConfigurationAligned(client, providerEnvironment, command).then((aligned) => !aligned),
85
+ clientNeedsConfigure: (client, providerEnvironment, command) => client.format === "unsupported"
86
+ ? Promise.resolve(false)
87
+ : clientConfigurationAligned(client, providerEnvironment, command).then((aligned) => !aligned),
96
88
  inspectClientConfiguration: inspectClientConfiguration,
97
- skillNeedsInstall: () => canonicalSkillNeedsInstall(homedir()),
98
- installSkill: () => installCanonicalSkill(homedir()),
89
+ skillNeedsInstall: () => canonicalSkillNeedsInstall(homeDirectory),
90
+ installSkill: () => installCanonicalSkill(homeDirectory),
99
91
  doctor: (scope) => runDoctor(undefined, doctorHost, scope),
100
92
  };
101
93
  };
102
94
  /** Detect supported agents from their config files or stable installation markers. */
103
- export const detectClients = async (home) => {
95
+ export const detectClients = async (home, platform = process.platform, environment = process.env) => {
104
96
  const detected = [];
105
- for (const candidate of supportedClients(home)) {
97
+ for (const candidate of supportedClients(home, platform, environment)) {
106
98
  const [hasConfig, hasMarker] = await Promise.all([
107
99
  exists(candidate.configPath),
108
100
  candidate.markerPath === undefined ? false : exists(candidate.markerPath),
@@ -1,4 +1,3 @@
1
- import { homedir } from "node:os";
2
1
  import { join } from "node:path";
3
2
  import { PRODUCT_IDENTITY } from "../identity.js";
4
3
  import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
@@ -6,7 +5,7 @@ import { linuxHopperInstallDisclosure, } from "./LinuxHopper.js";
6
5
  import { macHopperInstallDisclosure } from "./MacHopper.js";
7
6
  /** Discover supported clients and current registrations without mutation. */
8
7
  export const discoverSetupState = async (input) => {
9
- const initialDoctor = input.initialDoctor ?? (await input.host.doctor(input.doctorScope));
8
+ const { initialDoctor } = input;
10
9
  const linuxHopperRepairNeeded = initialDoctor.checks.some(({ name, ok, detail }) => !ok &&
11
10
  (name === "hopper-demo-runtime" ||
12
11
  (name === "hopper-version" && detail === "/opt/hopper/bin/Hopper")));
@@ -22,7 +21,7 @@ export const discoverSetupState = async (input) => {
22
21
  (Object.keys(input.providerEnvironment).length === 0 ||
23
22
  linuxHopperRepairNeeded));
24
23
  const [clients, detectedClients, skillNeedsInstall] = await Promise.all([
25
- input.host.supportedClients?.() ?? input.host.detectedClients(),
24
+ input.host.supportedClients(),
26
25
  input.host.detectedClients(),
27
26
  input.host.skillNeedsInstall(),
28
27
  ]);
@@ -85,7 +84,7 @@ export const planSetupActions = async (input) => {
85
84
  });
86
85
  const inspections = await Promise.all(selectedClients.map(async (client) => ({
87
86
  client,
88
- inspection: (await input.host.inspectClientConfiguration?.(client, input.providerEnvironment, input.command)) ?? { status: "update" },
87
+ inspection: await input.host.inspectClientConfiguration(client, input.providerEnvironment, input.command),
89
88
  })));
90
89
  const invalid = inspections.find(({ inspection }) => inspection.status === "invalid");
91
90
  if (invalid?.inspection.status === "invalid") {
@@ -96,9 +95,11 @@ export const planSetupActions = async (input) => {
96
95
  blocker: `${invalid.client.displayName ?? invalid.client.name}: ${invalid.inspection.remediation}`,
97
96
  };
98
97
  }
99
- const clientPlans = inspections.flatMap(({ client, inspection }) => inspection.status === "create" ||
100
- inspection.status === "update" ||
101
- (input.discovery.installHopper && inspection.status === "already_current")
98
+ const clientPlans = inspections.flatMap(({ client, inspection }) => client.format !== "unsupported" &&
99
+ (inspection.status === "create" ||
100
+ inspection.status === "update" ||
101
+ (input.discovery.installHopper &&
102
+ inspection.status === "already_current"))
102
103
  ? [
103
104
  {
104
105
  client,
@@ -115,6 +116,7 @@ export const planSetupActions = async (input) => {
115
116
  return {
116
117
  plannedActions: setupPlan({
117
118
  platform: input.host.platform,
119
+ homeDirectory: input.host.homeDirectory,
118
120
  installHopper: input.discovery.installHopper,
119
121
  installSkill: input.installSkill,
120
122
  clients: clientPlans,
@@ -137,7 +139,7 @@ const setupPlan = (input) => [
137
139
  kind: "install_hopper",
138
140
  label: "Hopper deep-analysis provider",
139
141
  target: input.platform === "darwin"
140
- ? join(homedir(), "Applications/Hopper Disassembler.app")
142
+ ? join(input.homeDirectory, "Applications/Hopper Disassembler.app")
141
143
  : "system package manager",
142
144
  detail: input.platform === "linux"
143
145
  ? "Download, verify, and install Hopper plus its Xvfb demo-session dependencies. For the supported demo build, REA uses a private display and selects Hopper's offered demo mode for each analysis session."
@@ -173,7 +175,7 @@ const setupPlan = (input) => [
173
175
  id: "install_skill",
174
176
  kind: "install_skill",
175
177
  label: "REA reverse-engineering skill",
176
- target: join(homedir(), ".agents/skills", PRODUCT_IDENTITY.skillName),
178
+ target: join(input.homeDirectory, ".agents/skills", PRODUCT_IDENTITY.skillName),
177
179
  detail: "Install or update the bundled REA reverse-engineering skill and on-demand references.",
178
180
  external: false,
179
181
  operation: "install",
@@ -1,4 +1,4 @@
1
- import { join } from "node:path";
1
+ import { isAbsolute, join } from "node:path";
2
2
  import { lstatSync } from "node:fs";
3
3
  const vscodeUserDirectory = ({ home, platform, env, }) => {
4
4
  if (platform === "win32")
@@ -17,6 +17,23 @@ const claudeDesktopDirectory = ({ home, platform, env, }) => {
17
17
  const claudeCodeConfigDirectory = ({ home, env }) => env.CLAUDE_CONFIG_DIR ?? home;
18
18
  const claudeCodeMarkerDirectory = ({ home, env }) => env.CLAUDE_CONFIG_DIR ?? join(home, ".claude");
19
19
  const codexDirectory = ({ home, env }) => env.CODEX_HOME ?? join(home, ".codex");
20
+ const grokDirectory = ({ home, env }) => env.GROK_HOME ?? join(home, ".grok");
21
+ /** Grok Bot uses an absolute SAND_DATA_ROOT; anything else stays ~/.grokbot. */
22
+ const grokBotDirectory = ({ home, env }) => {
23
+ const root = env.SAND_DATA_ROOT;
24
+ return root !== undefined && root !== "" && isAbsolute(root)
25
+ ? root
26
+ : join(home, ".grokbot");
27
+ };
28
+ /**
29
+ * Grok Bot stores connectors in the signed-in account and runs them on its
30
+ * hosted computer. The data directory is only a detection marker.
31
+ */
32
+ export const GROK_BOT_MANUAL_REGISTRATION_REMEDIATION = "Grok Bot keeps connectors in the signed-in account and runs them on its hosted computer. Setup does not write that account store, and a data-directory mcp.json is not a registration. In the Grok Bot chat, add a custom MCP server named rea that runs on the Bot's computer with `npx -y rea-agents@<version> mcp`. Do not put credentials in the command or arguments. A stdio server on this machine is not attached.";
33
+ /** Remediation for a client whose connector is not a local configuration file. */
34
+ export const manualRegistrationRemediation = (clientName) => clientName === "grok_bot"
35
+ ? GROK_BOT_MANUAL_REGISTRATION_REMEDIATION
36
+ : undefined;
20
37
  const copilotDirectory = ({ home, env }) => env.COPILOT_HOME ?? join(home, ".copilot");
21
38
  const commandCodeDirectory = ({ home }) => join(home, ".commandcode");
22
39
  const opencodeDirectory = ({ home, env }) => join(env.XDG_CONFIG_HOME ?? join(home, ".config"), "opencode");
@@ -133,6 +150,20 @@ export const SUPPORTED_CLIENT_DEFINITIONS = [
133
150
  markerPath: vscodeUserDirectory,
134
151
  format: "vscode",
135
152
  },
153
+ {
154
+ name: "grok_build",
155
+ displayName: "Grok Build",
156
+ configPath: (context) => join(grokDirectory(context), "config.toml"),
157
+ markerPath: grokDirectory,
158
+ format: "grok",
159
+ },
160
+ {
161
+ name: "grok_bot",
162
+ displayName: "Grok Bot",
163
+ configPath: grokBotDirectory,
164
+ markerPath: grokBotDirectory,
165
+ format: "unsupported",
166
+ },
136
167
  ];
137
168
  const resolvePath = (path, context) => typeof path === "function" ? path(context) : join(context.home, ...path);
138
169
  /** Describe every client location that setup, doctor, or uninstall may inspect. */
@@ -141,7 +172,9 @@ export const supportedClients = (home, platform = process.platform, env = {
141
172
  CLAUDE_CONFIG_DIR: process.env.CLAUDE_CONFIG_DIR,
142
173
  CODEX_HOME: process.env.CODEX_HOME,
143
174
  COPILOT_HOME: process.env.COPILOT_HOME,
175
+ GROK_HOME: process.env.GROK_HOME,
144
176
  OPENCODE_CONFIG: process.env.OPENCODE_CONFIG,
177
+ SAND_DATA_ROOT: process.env.SAND_DATA_ROOT,
145
178
  XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
146
179
  }) => {
147
180
  const context = { home, platform, env };