rea-agents 3.2.1 → 4.0.1

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 (434) hide show
  1. package/README.md +183 -332
  2. package/bridge/ghidra/ReaGhidraBridge.java +561 -74
  3. package/bridge/hopper_bridge.py +70 -27
  4. package/bridge/native/ReaNativeUI.swift +157 -0
  5. package/dist/application/AnalysisContextQueries.js +19 -5
  6. package/dist/application/AnalysisSnapshotCache.js +30 -11
  7. package/dist/application/AppleAssetCatalogAnalysis.js +171 -0
  8. package/dist/application/ArtifactExtractionDestination.js +0 -12
  9. package/dist/application/ArtifactGraphConstruction.js +44 -11
  10. package/dist/application/ArtifactInventory/classify.js +7 -15
  11. package/dist/application/ArtifactInventory/hash.js +4 -2
  12. package/dist/application/ArtifactInventory/policy.js +2 -17
  13. package/dist/application/ArtifactInventory/reader.js +3 -3
  14. package/dist/application/ArtifactInventory/scanCanonical.js +2 -2
  15. package/dist/application/ArtifactInventory/scanReader.js +12 -4
  16. package/dist/application/ArtifactInventory/types.js +0 -3
  17. package/dist/application/BinarySession.js +28 -43
  18. package/dist/application/BinarySessionExecution.js +37 -1
  19. package/dist/application/BinaryTargetResolver.js +50 -4
  20. package/dist/application/BrowserEvidence.js +36 -7
  21. package/dist/application/BrowserObservationService.js +17 -44
  22. package/dist/application/BrowserScenarioCaptureService.js +2 -35
  23. package/dist/application/BrowserScenarioEvidence.js +13 -9
  24. package/dist/application/CapabilityClientRequirements.js +2 -11
  25. package/dist/application/CapabilityInventory.js +21 -35
  26. package/dist/application/ClientConfigurationDocument.js +84 -7
  27. package/dist/application/ClientRegistrationIdentity.js +32 -0
  28. package/dist/application/ClientRegistrationStatus.js +59 -6
  29. package/dist/application/DirectAnalysis.js +37 -58
  30. package/dist/application/DirectAnalysisStatus.js +4 -4
  31. package/dist/application/Doctor.js +89 -80
  32. package/dist/application/DoctorDiagnostics.js +2 -26
  33. package/dist/application/DoctorScope.js +8 -14
  34. package/dist/application/ElectronActiveEvidence.js +10 -27
  35. package/dist/application/ElectronActiveObservationService.js +9 -36
  36. package/dist/application/ElectronBoundaryAnalysis.js +2 -0
  37. package/dist/application/ElectronBoundaryGraphNative.js +1 -1
  38. package/dist/application/ElectronEvidence.js +8 -3
  39. package/dist/application/ElectronObservationService.js +9 -25
  40. package/dist/application/EnhancedLiteralTracing.js +4 -8
  41. package/dist/application/EnhancedTools.js +15 -35
  42. package/dist/application/FilesystemSnapshot.js +7 -8
  43. package/dist/application/JavaScriptApplicationEvidenceGraph.js +2 -1
  44. package/dist/application/JavaScriptApplicationWorkflowService.js +31 -7
  45. package/dist/application/JavaScriptArtifactAnalysis.js +6 -4
  46. package/dist/application/JavaScriptArtifactFiles.js +5 -0
  47. package/dist/application/JavaScriptArtifactPathResolution.js +179 -47
  48. package/dist/application/JavaScriptRuntimeObservationEvidence.js +6 -3
  49. package/dist/application/JavaScriptRuntimeObservationService.js +9 -25
  50. package/dist/application/JavaScriptRuntimeReconciliationService.js +45 -4
  51. package/dist/application/JavaScriptSemanticGraphAsyncProjection.js +11 -0
  52. package/dist/application/JavaScriptSemanticGraphChildProcessProjection.js +11 -0
  53. package/dist/application/JavaScriptSemanticGraphDataProjection.js +11 -0
  54. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +14 -5
  55. package/dist/application/JsonFiles.js +1 -1
  56. package/dist/application/LazyAnalysisProvider.js +27 -6
  57. package/dist/application/ManagedMemberComparisonService.js +19 -6
  58. package/dist/application/NativeApiInspection.js +2 -0
  59. package/dist/application/NativeCallRoutes.js +72 -0
  60. package/dist/application/NativeDispatchMetadataInspection.js +33 -0
  61. package/dist/application/NativeUiActionTrace.js +73 -49
  62. package/dist/application/NativeValueTrace.js +320 -0
  63. package/dist/application/ProcessCaptureCapability.js +32 -5
  64. package/dist/application/ProcessCaptureEnvironment.js +9 -26
  65. package/dist/application/ProcessCaptureError.js +1 -5
  66. package/dist/application/ProcessCaptureJournal.js +3 -40
  67. package/dist/application/ProcessCaptureLifecycle.js +102 -111
  68. package/dist/application/ProcessCli.js +18 -25
  69. package/dist/application/ProcessEvidence.js +5 -7
  70. package/dist/application/ProcessFilesystemEffects.js +36 -0
  71. package/dist/application/ProcessHarness.js +41 -120
  72. package/dist/application/ProcessNormalization.js +2 -17
  73. package/dist/application/ProcessScenarioRuntimeValidation.js +76 -0
  74. package/dist/application/ReferenceSourceImport.js +3 -4
  75. package/dist/application/Setup.js +236 -84
  76. package/dist/application/SetupClientConfiguration.js +14 -9
  77. package/dist/application/SetupPlan.js +138 -86
  78. package/dist/application/SetupSkill.js +0 -1
  79. package/dist/application/SupportedClients.js +102 -21
  80. package/dist/application/Uninstall.js +31 -20
  81. package/dist/application/Update.js +93 -0
  82. package/dist/application/UpdateMaintenance.js +108 -0
  83. package/dist/application/UpdateRuntime.js +126 -0
  84. package/dist/application/runtime.js +13 -2
  85. package/dist/artifacts/ArtifactPaths.js +6 -8
  86. package/dist/artifacts/ArtifactProvider.js +94 -41
  87. package/dist/artifacts/AsarArtifactReader.js +19 -4
  88. package/dist/artifacts/KeyedArchiveReader.js +110 -0
  89. package/dist/artifacts/MachOSliceArtifactReader.js +53 -5
  90. package/dist/artifacts/ZipArtifactReader.js +18 -1
  91. package/dist/browser/BrowserScenarioSecrets.js +28 -1
  92. package/dist/browser/CdpBrowserProvider.js +36 -15
  93. package/dist/browser/CdpCaptureDocuments.js +22 -8
  94. package/dist/browser/CdpCaptureEventHandlers.js +14 -5
  95. package/dist/browser/CdpCaptureEventHelpers.js +13 -0
  96. package/dist/browser/CdpCaptureEvents.js +10 -1
  97. package/dist/browser/CdpElectronInspection.js +5 -10
  98. package/dist/browser/CdpElectronProvider.js +1 -5
  99. package/dist/browser/CdpElectronScripts.js +1 -1
  100. package/dist/browser/CdpEndpoint.js +3 -2
  101. package/dist/browser/CdpObservationSession.js +14 -10
  102. package/dist/browser/CdpPageCapture.js +1 -1
  103. package/dist/browser/CdpPageCaptureScripts.js +1 -1
  104. package/dist/browser/CdpSafeMetadata.js +5 -4
  105. package/dist/browser/CdpScreenshot.js +16 -5
  106. package/dist/browser/CdpTargetSession.js +25 -4
  107. package/dist/browser/CdpWebMcpDiscovery.js +93 -20
  108. package/dist/browser/JavaScriptRuntimeScope.js +28 -2
  109. package/dist/browser/PlaywrightBrowserScenarioProvider.js +9 -8
  110. package/dist/browser/PlaywrightElectronActiveActions.js +3 -10
  111. package/dist/browser/PlaywrightElectronActiveProvider.js +5 -5
  112. package/dist/browser/PlaywrightScenarioActions.js +1 -1
  113. package/dist/browser/PlaywrightScenarioArtifacts.js +13 -25
  114. package/dist/browser/PlaywrightScenarioBrowser.js +28 -25
  115. package/dist/browser/PlaywrightScenarioEvents.js +82 -93
  116. package/dist/browser/PlaywrightScenarioSession.js +27 -123
  117. package/dist/browser/PngVisualDiff.js +22 -3
  118. package/dist/browser/V8InspectorCaptureProjection.js +7 -1
  119. package/dist/browser/V8InspectorProvider.js +60 -7
  120. package/dist/browser/WebSourceMapFetcher.js +99 -53
  121. package/dist/cli/artifactCommands.js +56 -12
  122. package/dist/cli/coreAnalysisCommands.js +110 -0
  123. package/dist/cli/managedCommands.js +1 -31
  124. package/dist/cli/setupCommands.js +16 -14
  125. package/dist/cli/utilityCommands.js +61 -4
  126. package/dist/cli.js +5 -7
  127. package/dist/cliApplicationCommands.js +0 -83
  128. package/dist/cliBrowserAdvancedCommands.js +7 -11
  129. package/dist/cliBrowserCommands.js +15 -23
  130. package/dist/cliBrowserContext.js +3 -24
  131. package/dist/cliBrowserScenarioCommands.js +2 -10
  132. package/dist/cliCommandNames.js +82 -7
  133. package/dist/cliElectronCommands.js +10 -36
  134. package/dist/cliJavaScriptRuntimeCommands.js +6 -30
  135. package/dist/cliJsonInput.js +4 -2
  136. package/dist/cliLogging.js +16 -7
  137. package/dist/cliObservationOptions.js +1 -1
  138. package/dist/cliOutput.js +2 -4
  139. package/dist/cliProcessCommands.js +6 -33
  140. package/dist/cliSetup.js +90 -160
  141. package/dist/config/environment.js +2 -78
  142. package/dist/config/parseConfig.js +18 -109
  143. package/dist/config/parsers.js +0 -23
  144. package/dist/contracts/applicationToolContracts.js +1 -118
  145. package/dist/contracts/artifactToolContracts.js +11 -19
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -5
  147. package/dist/contracts/browserToolContracts.js +9 -16
  148. package/dist/contracts/electronToolContracts.js +5 -6
  149. package/dist/contracts/enhancedInputs.js +3 -2
  150. package/dist/contracts/errorSchemas.js +16 -40
  151. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  152. package/dist/contracts/javascriptApplicationWorkflowExamples.js +2 -2
  153. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +4 -4
  154. package/dist/contracts/javascriptRuntimeReconciliationExample.js +1 -1
  155. package/dist/contracts/managedToolContracts.js +7 -4
  156. package/dist/contracts/managedWorkflowExamples.js +0 -22
  157. package/dist/contracts/managedWorkflowToolContracts.js +16 -31
  158. package/dist/contracts/nativeToolContracts.js +9 -0
  159. package/dist/contracts/promptContracts.js +6 -6
  160. package/dist/contracts/sessionToolSchemas.js +3 -3
  161. package/dist/contracts/toolContractExamples.js +4 -3
  162. package/dist/contracts/toolContracts.js +18 -7
  163. package/dist/contracts/toolEffects.js +34 -21
  164. package/dist/contracts/toolOutputSchemaGroups.js +18 -5
  165. package/dist/contracts/toolOutputSchemaPrimitives.js +9 -6
  166. package/dist/contracts/toolSchemaMetadata.js +5 -8
  167. package/dist/doctorRuntime.js +0 -41
  168. package/dist/domain/analysisErrorPresentation.js +4 -28
  169. package/dist/domain/analysisErrorProjection.js +33 -50
  170. package/dist/domain/analysisProfile.js +1 -1
  171. package/dist/domain/analysisSnapshot.js +77 -3
  172. package/dist/domain/androidApplication.js +5 -4
  173. package/dist/domain/appleApplication.js +5 -4
  174. package/dist/domain/appleAssetCatalog.js +127 -0
  175. package/dist/domain/artifactComparison.js +7 -11
  176. package/dist/domain/artifactGraph.js +8 -6
  177. package/dist/domain/artifactInspection.js +13 -12
  178. package/dist/domain/binaryTarget.js +23 -9
  179. package/dist/domain/browserObservation.js +43 -24
  180. package/dist/domain/browserObservationSchemas.js +2 -1
  181. package/dist/domain/browserScenario.js +7 -107
  182. package/dist/domain/browserScenarioCapture.js +0 -1
  183. package/dist/domain/browserScenarioCaptureValues.js +5 -4
  184. package/dist/domain/browserScenarioDiff.js +1 -3
  185. package/dist/domain/browserScenarioValues.js +16 -107
  186. package/dist/domain/bundleComparison.js +18 -17
  187. package/dist/domain/callPathSchemas.js +17 -7
  188. package/dist/domain/changedBehavior.js +2 -3
  189. package/dist/domain/comparisonSemantics.js +19 -0
  190. package/dist/domain/completionLedgerGeneration.js +3 -2
  191. package/dist/domain/conformancePackage.js +2 -1
  192. package/dist/domain/conformanceTrustGate.js +3 -5
  193. package/dist/domain/customProtocolCapture.js +2 -2
  194. package/dist/domain/digests.js +30 -0
  195. package/dist/domain/dosMz.js +83 -0
  196. package/dist/domain/electronActiveObservation.js +7 -5
  197. package/dist/domain/electronObservation.js +3 -2
  198. package/dist/domain/electronStaticAnalysisNative.js +15 -6
  199. package/dist/domain/emptyArraySchema.js +3 -0
  200. package/dist/domain/errors.js +10 -28
  201. package/dist/domain/evidence.js +5 -3
  202. package/dist/domain/evidenceCompletionLedger.js +3 -2
  203. package/dist/domain/functionComparisonNormalization.js +24 -18
  204. package/dist/domain/functionComparisonResults.js +3 -7
  205. package/dist/domain/functionComparisonSchemas.js +3 -2
  206. package/dist/domain/hopperValues.js +108 -8
  207. package/dist/domain/javascriptApplicationAnalysis.js +4 -7
  208. package/dist/domain/javascriptApplicationEvidenceSchemas.js +4 -3
  209. package/dist/domain/javascriptApplicationGraphSchemas.js +8 -7
  210. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +9 -7
  211. package/dist/domain/javascriptApplicationVersionItems.js +12 -18
  212. package/dist/domain/javascriptAstValues.js +4 -0
  213. package/dist/domain/javascriptExportShapeComparison.js +1 -6
  214. package/dist/domain/javascriptExportShapeComparisonSchemas.js +6 -10
  215. package/dist/domain/javascriptExportShapeVariants.js +15 -2
  216. package/dist/domain/javascriptFeatureTraceSchemas.js +8 -7
  217. package/dist/domain/javascriptRuntimeObservation.js +14 -2
  218. package/dist/domain/javascriptRuntimeReconciliationMatching.js +8 -0
  219. package/dist/domain/javascriptRuntimeReconciliationParsing.js +4 -2
  220. package/dist/domain/javascriptRuntimeReconciliationResult.js +6 -4
  221. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +15 -4
  222. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +19 -18
  223. package/dist/domain/javascriptRuntimeStaticCandidates.js +18 -6
  224. package/dist/domain/javascriptSemanticAnalysis.js +57 -19
  225. package/dist/domain/javascriptSemanticAsyncEffects.js +39 -40
  226. package/dist/domain/javascriptSemanticCalls.js +46 -27
  227. package/dist/domain/javascriptSemanticChildProcesses.js +43 -50
  228. package/dist/domain/javascriptSemanticDataEffectHelpers.js +91 -18
  229. package/dist/domain/javascriptSemanticDataEffects.js +22 -10
  230. package/dist/domain/javascriptSemanticGraphSchemas.js +8 -6
  231. package/dist/domain/javascriptSemanticObjects.js +13 -3
  232. package/dist/domain/javascriptSemanticProjection.js +144 -38
  233. package/dist/domain/javascriptSemanticPromises.js +14 -27
  234. package/dist/domain/javascriptSemanticQuerySchemas.js +6 -9
  235. package/dist/domain/javascriptSemanticResources.js +2 -5
  236. package/dist/domain/javascriptSemanticState.js +4 -0
  237. package/dist/domain/javascriptSemanticTraceSchemas.js +2 -1
  238. package/dist/domain/javascriptSemanticTraversal.js +13 -5
  239. package/dist/domain/javascriptSemanticValues.js +10 -9
  240. package/dist/domain/javascriptSourceParser.js +5 -1
  241. package/dist/domain/javascriptStaticAnalysisCalls.js +8 -5
  242. package/dist/domain/javascriptStaticAnalysisHelpers.js +16 -7
  243. package/dist/domain/keyedArchive.js +181 -0
  244. package/dist/domain/managedApplicationGraph.js +4 -3
  245. package/dist/domain/managedArtifact.js +2 -1
  246. package/dist/domain/managedMemberComparison.js +18 -13
  247. package/dist/domain/managedMemberComparisonCoverage.js +2 -1
  248. package/dist/domain/managedMemberComparisonItems.js +27 -7
  249. package/dist/domain/managedMemberComparisonMatch.js +22 -6
  250. package/dist/domain/managedNativeVerificationMatch.js +2 -2
  251. package/dist/domain/managedNativeVerificationSchemas.js +7 -5
  252. package/dist/domain/managedReconstruction.js +6 -5
  253. package/dist/domain/nativeApiBoundary.js +7 -0
  254. package/dist/domain/nativeDataType.js +51 -0
  255. package/dist/domain/nativeInspection.js +0 -1
  256. package/dist/domain/nativeInstruction.js +82 -0
  257. package/dist/domain/nativeInvestigationGraph.js +9 -5
  258. package/dist/domain/nativeUiObservation.js +123 -0
  259. package/dist/domain/nativeValueFlow.js +17 -0
  260. package/dist/domain/nativeValueTrace.js +64 -0
  261. package/dist/domain/objcSwiftMetadata.js +39 -0
  262. package/dist/domain/peInspection.js +1 -0
  263. package/dist/domain/processCapture.js +5 -55
  264. package/dist/domain/processCaptureExample.js +0 -9
  265. package/dist/domain/processCaptureValidation.js +13 -144
  266. package/dist/domain/processComparison.js +3 -25
  267. package/dist/domain/processObservation.js +0 -29
  268. package/dist/domain/processScenario.js +28 -228
  269. package/dist/domain/processTraceDimensionProjection.js +0 -15
  270. package/dist/domain/processTraceEvaluation.js +0 -6
  271. package/dist/domain/protocolCapture.js +8 -36
  272. package/dist/domain/reconstructionCoverage.js +3 -2
  273. package/dist/domain/reconstructionObligationLedgerSchemas.js +4 -12
  274. package/dist/domain/reconstructionReadinessSchemas.js +4 -3
  275. package/dist/domain/reconstructionVerification.js +2 -1
  276. package/dist/domain/reconstructionVerificationSchemas.js +6 -13
  277. package/dist/domain/referenceSourceClassification.js +0 -110
  278. package/dist/domain/referenceSourceGraph.js +15 -5
  279. package/dist/domain/residualUnknown.js +3 -2
  280. package/dist/domain/runtimeIdentification.js +6 -5
  281. package/dist/domain/sourceMapContents.js +5 -0
  282. package/dist/domain/sourceToBundleComparison.js +3 -10
  283. package/dist/domain/sourceToBundleComparisonSchemas.js +7 -6
  284. package/dist/domain/sourceToBundleSignals.js +9 -3
  285. package/dist/domain/staticRuntimeCorrelation.js +5 -11
  286. package/dist/domain/webBundleAnalysis.js +17 -9
  287. package/dist/domain/webBundleAnalyzer.js +1 -1
  288. package/dist/domain/webCaptureDiff.js +5 -11
  289. package/dist/domain/webCaptureDiffSchemas.js +2 -1
  290. package/dist/domain/webMcpDiscovery.js +2 -1
  291. package/dist/dotnet/ManagedMemberInspectorCore.js +15 -7
  292. package/dist/dotnet/ManagedMemberInstructionDecoder.js +57 -40
  293. package/dist/dotnet/ManagedMemberRows.js +2 -0
  294. package/dist/dotnet/ManagedMethodBodyReader.js +15 -8
  295. package/dist/dotnet/ManagedPeReader.js +2 -0
  296. package/dist/generatedMcpToolCatalog.js +1 -1
  297. package/dist/generatedPackageMetadata.js +2 -2
  298. package/dist/ghidra/GhidraAnalysisProfile.js +15 -5
  299. package/dist/ghidra/GhidraClient.js +38 -8
  300. package/dist/ghidra/GhidraFunctionValues.js +56 -20
  301. package/dist/ghidra/GhidraInstallation.js +7 -4
  302. package/dist/ghidra/GhidraInventoryValues.js +44 -9
  303. package/dist/ghidra/GhidraLauncher.js +18 -3
  304. package/dist/ghidra/GhidraProvider.js +23 -2
  305. package/dist/ghidra/GhidraRequestQueue.js +45 -4
  306. package/dist/ghidra/GhidraSessionValues.js +5 -0
  307. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  308. package/dist/hopper/HopperProvider.js +29 -6
  309. package/dist/hopper/HopperTargetLease.js +18 -4
  310. package/dist/logger.js +0 -13
  311. package/dist/main/messages.js +0 -1
  312. package/dist/main/reload.js +3 -32
  313. package/dist/main/shutdown.js +1 -2
  314. package/dist/main/transport.js +0 -17
  315. package/dist/main.js +0 -10
  316. package/dist/native/AppleDispatchMetadata.js +582 -0
  317. package/dist/native/AppleObjcProtocols.js +88 -0
  318. package/dist/native/AppleSwiftVtables.js +86 -0
  319. package/dist/native/CommandRunner.js +1 -1
  320. package/dist/native/NativeHostCapabilities.js +23 -0
  321. package/dist/native/NativeMacOSProvider.js +61 -9
  322. package/dist/native/NativeMachoInspection.js +39 -6
  323. package/dist/native/NativeUiHelperRuntime.js +42 -0
  324. package/dist/native/NativeUiObservation.js +174 -0
  325. package/dist/native/parsers/codesign.js +4 -1
  326. package/dist/native/parsers/dyldInfo.js +51 -25
  327. package/dist/native/parsers/lipo.js +13 -4
  328. package/dist/native/parsers/otool.js +84 -39
  329. package/dist/native/parsers/plist.js +2 -1
  330. package/dist/process/ExecFileOutput.js +5 -1
  331. package/dist/process/ProcessOwnership.js +69 -33
  332. package/dist/process/ProcessOwnershipObservation.js +31 -12
  333. package/dist/process/ProviderProcess.js +4 -2
  334. package/dist/reference/ReferenceSourceReaderEntries.js +48 -31
  335. package/dist/reference/ReferenceSourceReaderErrors.js +24 -0
  336. package/dist/reference/ReferenceSourceReaderFile.js +11 -5
  337. package/dist/reference/ReferenceSourceReaderValidate.js +22 -8
  338. package/dist/server/createServer.js +7 -62
  339. package/dist/server/registerApplicationTools/helpers.js +2 -9
  340. package/dist/server/registerApplicationTools.js +0 -4
  341. package/dist/server/registerArtifactComparisonTool.js +1 -1
  342. package/dist/server/registerBrowserScenarioTool.js +4 -2
  343. package/dist/server/registerBrowserTools.js +7 -7
  344. package/dist/server/registerBundleComparisonTool.js +1 -1
  345. package/dist/server/registerCloseLifecycleTool.js +1 -1
  346. package/dist/server/registerElectronTools.js +10 -4
  347. package/dist/server/registerEnhancedTools.js +20 -12
  348. package/dist/server/registerEvidenceTools.js +4 -28
  349. package/dist/server/registerFunctionComparisonTool.js +1 -1
  350. package/dist/server/registerInvestigationTools.js +6 -6
  351. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -2
  352. package/dist/server/registerManagedTools.js +28 -14
  353. package/dist/server/registerManagedWorkflowTools.js +0 -2
  354. package/dist/server/registerProcessComparisonTool.js +1 -3
  355. package/dist/server/registerSessionRecordTools.js +9 -9
  356. package/dist/server/registerSessionStatusTool.js +1 -1
  357. package/dist/server/registerSessionTools.js +28 -57
  358. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  359. package/dist/server/sessionToolPolicies.js +0 -4
  360. package/dist/server/toolResult.js +8 -10
  361. package/package.json +32 -22
  362. package/skills/reverse-engineer-anything/SKILL.md +15 -11
  363. package/skills/reverse-engineer-anything/references/evidence-workflows.md +3 -2
  364. package/skills/reverse-engineer-anything/references/javascript-applications.md +3 -2
  365. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +8 -6
  366. package/skills/reverse-engineer-anything/references/runtime-observation.md +15 -11
  367. package/dist/application/CommandShimReplay.js +0 -152
  368. package/dist/application/ConfiguredRoots.js +0 -19
  369. package/dist/application/InstrumentedJavaScriptReplayHost.js +0 -36
  370. package/dist/application/JavaScriptReplayPermission.js +0 -16
  371. package/dist/application/JavaScriptReplayPlanning.js +0 -207
  372. package/dist/application/JavaScriptReplayService.js +0 -274
  373. package/dist/application/LoopbackReplay.js +0 -389
  374. package/dist/application/LoopbackReplayRecorder.js +0 -129
  375. package/dist/application/ManagedRuntimeCorrelationService.js +0 -104
  376. package/dist/application/NodeRuntimeCharacterizationService.js +0 -191
  377. package/dist/application/PermissionAuthority.js +0 -268
  378. package/dist/application/PermissionConfiguration.js +0 -26
  379. package/dist/application/PermissionFailure.js +0 -5
  380. package/dist/application/ProcessCaptureAuthority.js +0 -24
  381. package/dist/application/ProcessCapturePermission.js +0 -13
  382. package/dist/application/ProcessCheckpoints.js +0 -178
  383. package/dist/application/ProcessReactiveCoordinator.js +0 -223
  384. package/dist/application/ProcessReactiveEffects.js +0 -153
  385. package/dist/application/ProcessReactiveHarness.js +0 -106
  386. package/dist/application/ProcessReactiveObservations.js +0 -105
  387. package/dist/application/ProjectPermissionStore.js +0 -199
  388. package/dist/application/RuntimeExecutableDiagnostics.js +0 -198
  389. package/dist/application/Upgrade.js +0 -134
  390. package/dist/browser/SensitiveTextCapture.js +0 -8
  391. package/dist/cliPolicyCommands.js +0 -185
  392. package/dist/config/browserScenario.js +0 -77
  393. package/dist/config/electronAutomation.js +0 -35
  394. package/dist/config/javascriptReplay.js +0 -41
  395. package/dist/config/managedRuntime.js +0 -25
  396. package/dist/config/passiveObservation.js +0 -87
  397. package/dist/config/permissions.js +0 -23
  398. package/dist/config/processCapture.js +0 -47
  399. package/dist/contracts/replayMachineExample.js +0 -37
  400. package/dist/domain/javascriptExportInstrumentation.js +0 -95
  401. package/dist/domain/javascriptReplay.js +0 -360
  402. package/dist/domain/managedRuntimeCorrelation.js +0 -181
  403. package/dist/domain/nodeRuntimeCharacterization.js +0 -63
  404. package/dist/domain/permissionPolicy.js +0 -176
  405. package/dist/domain/processCaptureReactiveSchema.js +0 -68
  406. package/dist/domain/processCaptureReactiveValidation.js +0 -180
  407. package/dist/domain/processReactiveCheckpointDataflow.js +0 -32
  408. package/dist/domain/processReactiveMatching.js +0 -196
  409. package/dist/domain/processReactiveRuntime.js +0 -116
  410. package/dist/domain/processReactiveScenario.js +0 -296
  411. package/dist/domain/processReactiveScenarioPreflight.js +0 -95
  412. package/dist/domain/processReactiveTransition.js +0 -187
  413. package/dist/domain/replayMachine.js +0 -320
  414. package/dist/domain/replayMachineRun.js +0 -168
  415. package/dist/domain/replayMachineRuntime.js +0 -296
  416. package/dist/domain/replayMachineValues.js +0 -84
  417. package/dist/domain/runtimeCharacterization.js +0 -84
  418. package/dist/replay/JavaScriptReplayWorker.js +0 -382
  419. package/dist/replay/JavaScriptReplayWorkerTypes.js +0 -1
  420. package/dist/replay/LinuxJavaScriptReplayRunner.js +0 -216
  421. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -121
  422. package/dist/replay/LinuxRuntimeClosure.js +0 -44
  423. package/dist/replay/LinuxSeccompPolicy.js +0 -40
  424. package/dist/replay/ReplayOutcome.js +0 -104
  425. package/dist/replay/ReplayProcessLifecycle.js +0 -96
  426. package/dist/replay/ReplaySeccompFile.js +0 -29
  427. package/dist/replay/ReplayWorkerProtocol.js +0 -58
  428. package/dist/replay/SystemJavaScriptReplayHost.js +0 -153
  429. package/dist/server/ProcessCaptureElicitation.js +0 -153
  430. package/dist/server/registerApplicationTools/characterization.js +0 -46
  431. package/dist/server/registerApplicationTools/controlledReplay.js +0 -31
  432. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +0 -29
  433. package/dist/server/registerReplayMachineTool.js +0 -14
  434. package/skills/reverse-engineer-anything/references/controlled-replay.md +0 -12
@@ -9,71 +9,201 @@ import { installMacHopper } from "./MacHopper.js";
9
9
  import { configureDetectedClients } from "./SetupClients.js";
10
10
  import { supportedClients } from "./SupportedClients.js";
11
11
  import { canonicalSkillNeedsInstall, installCanonicalSkill, } from "./SetupSkill.js";
12
- import { discoverSetupActions } from "./SetupPlan.js";
13
- import { clientConfigurationAligned, configureJsonClient, configureTomlClient, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
12
+ import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
13
+ import { clientConfigurationAligned, configureClientConfiguration, configureJsonClient, configureTomlClient, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
14
14
  export { configureJsonClient, configureTomlClient };
15
15
  import { setupInstallFailure, } from "./SetupInstallFailure.js";
16
16
  import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
17
17
  export { canonicalSkillNeedsInstall, installCanonicalSkill };
18
- const registrationCommand = () => process.env.npm_command === "exec"
18
+ /** Resolve the executable and arguments used in a managed MCP registration. */
19
+ export const setupRegistrationCommand = (platform, useNpmRunner = process.env.npm_command === "exec") => useNpmRunner
19
20
  ? PRODUCT_IDENTITY.mcpCommand.split(" ")
20
- : [resolve(process.argv[1] ?? PRODUCT_IDENTITY.cliBinary), "mcp"];
21
+ : platform === "win32"
22
+ ? [
23
+ process.execPath,
24
+ resolve(process.argv[1] ?? PRODUCT_IDENTITY.cliBinary),
25
+ "mcp",
26
+ ]
27
+ : [resolve(process.argv[1] ?? PRODUCT_IDENTITY.cliBinary), "mcp"];
28
+ /** Whether the requested setup actions still need approval or human repair. */
29
+ export const isSetupFailure = (result) => {
30
+ const status = result.status;
31
+ switch (status) {
32
+ case "planned":
33
+ case "cancelled":
34
+ case "ready":
35
+ return false;
36
+ case "needs_confirmation":
37
+ case "needs_human":
38
+ return true;
39
+ default: {
40
+ const exhaustive = status;
41
+ throw new TypeError(`Unhandled setup result status: ${String(exhaustive)}`);
42
+ }
43
+ }
44
+ };
21
45
  /** Discover, approve, and apply setup actions idempotently. */
22
46
  export const runSetup = async (options, host = systemSetupHost(), confirm) => {
23
47
  const appliedActions = [];
24
48
  let plannedActions = [];
25
49
  const clients = {};
26
- const fail = (remediation) => setupFailure(remediation, [host, plannedActions, appliedActions, clients], options.readinessScope);
27
- const unsupported = await hostRemediation(host, options.installHopper);
50
+ let clientStates = [];
51
+ let readinessScope = options.readinessScope;
52
+ const fail = (remediation) => setupFailure(remediation, [host, plannedActions, appliedActions, clients, clientStates], readinessScope);
53
+ const unsupported = await hostRemediation(host, false);
28
54
  if (unsupported !== undefined)
29
55
  return fail(unsupported);
30
56
  let hopperPath = await host.hopperPath();
31
57
  let providerEnvironment = await initialProviderEnvironment(host, hopperPath);
32
- const discovery = await discoverSetupActions({
58
+ const discovery = await discoverSetupState({
33
59
  host,
34
60
  providerEnvironment,
35
- command: registrationCommand(),
36
61
  forceHopperInstall: options.installHopper,
37
- proposeHopper: options.proposeHopper ?? true,
38
- selectedClientIds: options.clientIds,
39
- installSkillSelection: options.installSkill,
62
+ proposeHopper: options.proposeHopper ?? (confirm !== undefined && !options.structured),
40
63
  doctorScope: options.readinessScope,
41
64
  });
42
- if (discovery.blocker !== undefined)
43
- return fail(discovery.blocker);
44
- const selection = await resolveSetupSelection(options, discovery, confirm);
45
- plannedActions = selection.plannedActions;
46
- if (!selection.approved)
65
+ clientStates = discovery.clientStates;
66
+ const clientSelectionAllowed = options.clientIds === undefined &&
67
+ options.readinessScope?.clients === undefined &&
68
+ options.allDetectedClients !== true &&
69
+ options.installHopper !== true &&
70
+ options.installSkill === undefined;
71
+ const interactiveSelection = confirm !== undefined && !options.structured && clientSelectionAllowed;
72
+ let selectedClientIds = options.allDetectedClients
73
+ ? discovery.detectedClientIds
74
+ : (options.clientIds ??
75
+ options.readinessScope?.clients ??
76
+ discovery.defaultClientIds);
77
+ let skillSelected = options.installSkill === true ||
78
+ (options.installSkill !== false && selectedClientIds.length > 0);
79
+ let installSkill = skillSelected && discovery.skillNeedsInstall;
80
+ let planDiscovery = discovery;
81
+ if (interactiveSelection) {
82
+ const offerSkillAction = options.installSkill !== false && discovery.skillNeedsInstall;
83
+ const selectionActions = await planSetupActions({
84
+ discovery,
85
+ host,
86
+ providerEnvironment,
87
+ command: setupRegistrationCommand(host.platform),
88
+ clientIds: [],
89
+ installSkill: offerSkillAction,
90
+ });
91
+ const decision = await confirm(selectionActions.plannedActions, {
92
+ stage: "select",
93
+ clientStates,
94
+ selectedClientIds: discovery.defaultClientIds,
95
+ clientSelectionAllowed,
96
+ });
97
+ if (isSetupDecisionCancelled(decision))
98
+ return setupCancelled(selectionActions.plannedActions, clients, clientStates, discovery.initialDoctor);
99
+ const selectedActionIds = new Set(typeof decision === "boolean"
100
+ ? decision
101
+ ? [
102
+ ...selectionActions.plannedActions.map(({ id }) => id),
103
+ ...discovery.defaultClientIds.map((id) => `configure_client:${id}`),
104
+ ]
105
+ : []
106
+ : decision.selectedActionIds);
107
+ selectedClientIds = [...selectedActionIds]
108
+ .filter((id) => id.startsWith("configure_client:"))
109
+ .map((id) => id.slice("configure_client:".length));
110
+ const proposedInstallAction = selectionActions.plannedActions.some(({ id }) => id === "install_hopper");
111
+ planDiscovery = {
112
+ ...discovery,
113
+ installHopper: options.installHopper ||
114
+ (proposedInstallAction && selectedActionIds.has("install_hopper")),
115
+ };
116
+ skillSelected =
117
+ options.installSkill === true ||
118
+ (selectedActionIds.has("install_skill") &&
119
+ selectedClientIds.length === 0) ||
120
+ (options.installSkill !== false && selectedClientIds.length > 0);
121
+ installSkill = skillSelected && discovery.skillNeedsInstall;
122
+ }
123
+ const planned = await planSetupActions({
124
+ discovery: planDiscovery,
125
+ host,
126
+ providerEnvironment,
127
+ command: setupRegistrationCommand(host.platform),
128
+ clientIds: selectedClientIds,
129
+ installSkill,
130
+ });
131
+ plannedActions = planned.plannedActions;
132
+ if (planned.blocker !== undefined)
133
+ return fail(planned.blocker);
134
+ const hopperBlocker = await hostRemediation(host, planDiscovery.installHopper);
135
+ if (hopperBlocker !== undefined)
136
+ return fail(hopperBlocker);
137
+ const planSelection = {
138
+ installHopper: planDiscovery.installHopper,
139
+ installSkill,
140
+ skillSelected,
141
+ selectedClients: planned.selectedClients,
142
+ clientsToConfigure: planned.clientsToConfigure,
143
+ };
144
+ readinessScope = resolvedReadinessScope(options.readinessScope, planSelection);
145
+ if (options.dryRun === true)
47
146
  return {
48
- status: confirm === undefined ? "needs_confirmation" : "planned",
147
+ status: "planned",
49
148
  plannedActions,
50
149
  appliedActions,
51
150
  clients,
52
- doctor: discovery.initialDoctor,
53
- remediation: "Review the setup plan, then rerun interactively or with --yes.",
151
+ doctor: summarizeDoctor(discovery.initialDoctor),
152
+ clientStates,
54
153
  };
55
- let detectedClients = selection.detectedClients;
56
- if (selection.installHopper &&
57
- (selection.interactiveApproval || options.installHopper)) {
154
+ let approved = options.approved || plannedActions.length === 0;
155
+ let interactiveApproval = false;
156
+ if (!approved && confirm !== undefined && !options.structured) {
157
+ const decision = await confirm?.(plannedActions, {
158
+ stage: "confirm",
159
+ clientStates,
160
+ selectedClientIds,
161
+ clientSelectionAllowed: false,
162
+ });
163
+ if (decision !== undefined) {
164
+ if (isSetupDecisionCancelled(decision))
165
+ return setupCancelled(plannedActions, clients, clientStates, discovery.initialDoctor);
166
+ approved = typeof decision === "boolean" ? decision : decision.approved;
167
+ interactiveApproval = approved;
168
+ }
169
+ }
170
+ if (!approved)
171
+ return {
172
+ status: confirm === undefined ? "needs_confirmation" : "cancelled",
173
+ plannedActions,
174
+ appliedActions,
175
+ clients,
176
+ doctor: summarizeDoctor(discovery.initialDoctor),
177
+ clientStates,
178
+ ...(confirm === undefined
179
+ ? {
180
+ remediation: "Review the setup plan, then rerun interactively or with --yes.",
181
+ }
182
+ : {}),
183
+ };
184
+ let selectedClients = planSelection.clientsToConfigure;
185
+ if (planSelection.installHopper &&
186
+ (interactiveApproval || options.installHopper)) {
58
187
  const install = await installHopperAction({
59
188
  host,
60
189
  options,
61
190
  plannedActions,
62
191
  appliedActions,
63
192
  clients,
64
- detectedClients,
193
+ selectedClients,
65
194
  providerEnvironment,
66
- doctorScope: options.readinessScope,
195
+ doctorScope: readinessScope,
196
+ clientStates,
67
197
  });
68
198
  if ("failure" in install)
69
199
  return install.failure;
70
- ({ hopperPath, providerEnvironment, detectedClients } = install);
200
+ ({ hopperPath, providerEnvironment, selectedClients } = install);
71
201
  }
72
202
  const clientFailure = await configureDetectedClients({
73
203
  host,
74
- detectedClients,
204
+ detectedClients: selectedClients,
75
205
  providerEnvironment,
76
- command: registrationCommand(),
206
+ command: setupRegistrationCommand(host.platform),
77
207
  clients,
78
208
  appliedActions,
79
209
  ...(options.onProgress === undefined
@@ -82,10 +212,10 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
82
212
  });
83
213
  if (clientFailure !== undefined)
84
214
  return fail(clientFailure);
85
- if (selection.installSkill &&
215
+ if (planSelection.installSkill &&
86
216
  !(await installSkillAction(host, options, appliedActions)))
87
217
  return fail("REA analysis skill could not be installed or verified. Check permissions for `~/.agents/skills`, then rerun setup.");
88
- const doctor = await host.doctor(options.readinessScope);
218
+ const doctor = summarizeDoctor(await host.doctor(readinessScope));
89
219
  const remediation = finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath);
90
220
  return {
91
221
  status: remediation === undefined ? "ready" : "needs_human",
@@ -93,38 +223,10 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
93
223
  appliedActions,
94
224
  clients,
95
225
  doctor,
226
+ clientStates,
96
227
  ...(remediation === undefined ? {} : { remediation }),
97
228
  };
98
229
  };
99
- const resolveSetupSelection = async (options, discovery, confirm) => {
100
- let { installHopper, installSkill, detectedClients, plannedActions } = discovery;
101
- let approved = options.approved || plannedActions.length === 0;
102
- let interactiveApproval = false;
103
- if (!approved && confirm !== undefined && !options.structured) {
104
- const decision = await confirm(plannedActions);
105
- if (typeof decision === "boolean") {
106
- interactiveApproval = decision;
107
- approved = decision;
108
- }
109
- else {
110
- const selected = new Set(decision.selectedActionIds);
111
- plannedActions = plannedActions.filter(({ id }) => selected.has(id));
112
- installHopper = plannedActions.some(({ kind }) => kind === "install_hopper");
113
- installSkill = plannedActions.some(({ kind }) => kind === "install_skill");
114
- detectedClients = detectedClients.filter((client) => selected.has(`configure_client:${client.name}`));
115
- interactiveApproval = decision.approved;
116
- approved = decision.approved;
117
- }
118
- }
119
- return {
120
- approved,
121
- interactiveApproval,
122
- installHopper,
123
- installSkill,
124
- detectedClients,
125
- plannedActions,
126
- };
127
- };
128
230
  const installHopperAction = async (input) => {
129
231
  const label = "Hopper deep-analysis provider";
130
232
  emitProgress(input.options, {
@@ -146,7 +248,8 @@ const installHopperAction = async (input) => {
146
248
  plannedActions: input.plannedActions,
147
249
  appliedActions: input.appliedActions,
148
250
  clients: input.clients,
149
- doctor: await input.host.doctor(input.doctorScope),
251
+ doctor: summarizeDoctor(await input.host.doctor(input.doctorScope)),
252
+ clientStates: input.clientStates,
150
253
  code: installed.code,
151
254
  remediation: installed.remediation,
152
255
  },
@@ -166,7 +269,7 @@ const installHopperAction = async (input) => {
166
269
  return {
167
270
  hopperPath: installed.launcherPath,
168
271
  providerEnvironment,
169
- detectedClients: await filterClientsNeedingConfigure(input.host, input.detectedClients, providerEnvironment, registrationCommand()),
272
+ selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, setupRegistrationCommand(input.host.platform)),
170
273
  };
171
274
  };
172
275
  const installSkillAction = async (host, options, appliedActions) => {
@@ -195,14 +298,17 @@ const installSkillAction = async (host, options, appliedActions) => {
195
298
  });
196
299
  return true;
197
300
  };
198
- const setupFailure = async (remediation, [host, plannedActions, appliedActions, clients], scope) => ({
199
- status: "needs_human",
200
- plannedActions,
201
- appliedActions,
202
- clients,
203
- doctor: await host.doctor(scope),
204
- remediation,
205
- });
301
+ const setupFailure = async (remediation, [host, plannedActions, appliedActions, clients, clientStates], scope) => {
302
+ return {
303
+ status: "needs_human",
304
+ plannedActions,
305
+ appliedActions,
306
+ clients,
307
+ doctor: summarizeDoctor(await host.doctor(scope)),
308
+ clientStates,
309
+ remediation,
310
+ };
311
+ };
206
312
  const emitProgress = (options, event) => options.onProgress?.(event);
207
313
  const filterClientsNeedingConfigure = async (host, detectedClients, providerEnvironment, command) => {
208
314
  const needs = await Promise.all(detectedClients.map((client) => host.clientNeedsConfigure(client, providerEnvironment, command)));
@@ -221,11 +327,57 @@ const finalSetupRemediation = (platform, installedHopper, healthy, hopperPath) =
221
327
  ? "Hopper is optional for non-Hopper providers. Rerun with --yes --install-hopper for deep native analysis."
222
328
  : "Run rea doctor and apply each reported remediation.";
223
329
  };
224
- const hostRemediation = async (host, forceHopperInstall) => {
225
- if (host.platform !== "darwin" && host.platform !== "linux")
226
- return "REA supports Hopper on macOS and selected 64-bit Linux distributions.";
330
+ const isSetupDecisionCancelled = (decision) => typeof decision === "boolean" ? !decision : decision.cancelled === true;
331
+ const setupCancelled = (plannedActions, clients, clientStates, doctor) => ({
332
+ status: "cancelled",
333
+ plannedActions,
334
+ appliedActions: [],
335
+ clients,
336
+ doctor: summarizeDoctor(doctor),
337
+ clientStates,
338
+ });
339
+ const resolvedReadinessScope = (requested, selection) => ({
340
+ clients: selection.selectedClients.map(({ name }) => name),
341
+ providers: selection.installHopper
342
+ ? ["hopper"]
343
+ : (requested?.providers ?? []),
344
+ skill: selection.skillSelected === true || requested?.skill === true,
345
+ });
346
+ const summarizeDoctor = (report) => ({
347
+ healthy: report.healthy,
348
+ environment_healthy: report.environment_healthy,
349
+ scope: report.scope,
350
+ availableProviders: [
351
+ ...(report.hopperPath !== undefined &&
352
+ report.checks
353
+ .filter(({ name }) => name.startsWith("hopper"))
354
+ .every(({ ok }) => ok)
355
+ ? ["hopper"]
356
+ : []),
357
+ ...(report.providerInspections ?? [])
358
+ .filter(({ available }) => available)
359
+ .map(({ id }) => id),
360
+ ],
361
+ ...(report.hopperPath === undefined ? {} : { hopperPath: report.hopperPath }),
362
+ ...(report.providerInspections === undefined
363
+ ? {}
364
+ : { providerInspections: report.providerInspections }),
365
+ ...(report.identity === undefined
366
+ ? {}
367
+ : {
368
+ identity: {
369
+ skill: report.identity.skill,
370
+ registrations: report.identity.registrations,
371
+ },
372
+ }),
373
+ });
374
+ const hostRemediation = async (host, installHopper) => {
227
375
  if (!supportsNodeVersion(host.nodeVersion))
228
376
  return "Install Node.js 22.19+ or 24.11+ and rerun setup.";
377
+ if (!installHopper)
378
+ return undefined;
379
+ if (host.platform !== "darwin" && host.platform !== "linux")
380
+ return "REA supports Hopper on macOS and selected 64-bit Linux distributions.";
229
381
  if (host.platform === "darwin") {
230
382
  const version = await host.macosVersion();
231
383
  return version === undefined || major(version) < 12
@@ -234,17 +386,13 @@ const hostRemediation = async (host, forceHopperInstall) => {
234
386
  }
235
387
  if ((await host.linuxDistribution())?.supported === true)
236
388
  return undefined;
237
- const providerEnvironment = await host.providerEnvironment?.();
238
- if (!forceHopperInstall &&
239
- providerEnvironment !== undefined &&
240
- Object.keys(providerEnvironment).length > 0)
241
- return undefined;
242
389
  return "Automated Hopper setup supports Ubuntu 24.04+, Fedora 41+, and 64-bit Arch Linux; configure an existing supported provider instead.";
243
390
  };
244
391
  /** Production setup effects for Hopper, agent configuration, and the canonical skill directory. */
245
392
  export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
393
+ const platform = doctorHost.platform;
246
394
  return {
247
- platform: process.platform,
395
+ platform,
248
396
  nodeVersion: process.versions.node,
249
397
  macosVersion: () => doctorHost.macosVersion(),
250
398
  linuxDistribution: readLinuxDistribution,
@@ -259,7 +407,7 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
259
407
  };
260
408
  },
261
409
  installHopper: async (replaceExisting) => {
262
- const result = process.platform === "linux"
410
+ const result = platform === "linux"
263
411
  ? await installLinuxHopper()
264
412
  : await installMacHopper({ replaceExisting });
265
413
  if (result.status === "installed")
@@ -267,11 +415,10 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
267
415
  return setupInstallFailure(result.reason);
268
416
  },
269
417
  detectedClients: () => detectClients(homedir()),
418
+ supportedClients: () => Promise.resolve(supportedClients(homedir())),
270
419
  configureClient: (client, providerEnvironment, command) => client.format === "unsupported"
271
420
  ? Promise.resolve({ status: "skipped" })
272
- : client.format === "toml"
273
- ? configureTomlClient(client, providerEnvironment, command)
274
- : configureJsonClient(client, providerEnvironment, command),
421
+ : configureClientConfiguration(client, providerEnvironment, command),
275
422
  clientNeedsConfigure: (client, providerEnvironment, command) => clientConfigurationAligned(client, providerEnvironment, command).then((aligned) => !aligned),
276
423
  inspectClientConfiguration: inspectClientConfiguration,
277
424
  skillNeedsInstall: () => canonicalSkillNeedsInstall(homedir()),
@@ -279,12 +426,17 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
279
426
  doctor: (scope) => runDoctor(undefined, doctorHost, scope),
280
427
  };
281
428
  };
282
- /** Detect supported agents from stable per-user installation markers. */
429
+ /** Detect supported agents from their config files or stable installation markers. */
283
430
  export const detectClients = async (home) => {
284
431
  const detected = [];
285
- for (const candidate of supportedClients(home))
286
- if (await exists(candidate.markerPath ?? candidate.configPath))
432
+ for (const candidate of supportedClients(home)) {
433
+ const [hasConfig, hasMarker] = await Promise.all([
434
+ exists(candidate.configPath),
435
+ candidate.markerPath === undefined ? false : exists(candidate.markerPath),
436
+ ]);
437
+ if (hasConfig || hasMarker)
287
438
  detected.push(candidate);
439
+ }
288
440
  return detected;
289
441
  };
290
442
  const major = (version) => Number.parseInt(version.split(".")[0] ?? "0", 10);
@@ -1,4 +1,4 @@
1
- import { clientConfigurationValuesEqual, parseClientConfiguration, serializeClientConfiguration, } from "./ClientConfigurationDocument.js";
1
+ import { clientRegistrationEntry, clientConfigurationValuesEqual, parseClientConfiguration, serializeClientConfiguration, } 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";
@@ -16,6 +16,12 @@ const defaultCommand = () => [
16
16
  export const configureJsonClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "json");
17
17
  /** Back up, atomically update, and semantically read back one TOML MCP configuration. */
18
18
  export const configureTomlClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "toml");
19
+ /** Configure one supported client's native stdio MCP registration shape. */
20
+ export const configureClientConfiguration = (client, environment = {}, command = defaultCommand()) => {
21
+ if (client.format === undefined || client.format === "unsupported")
22
+ return Promise.resolve({ status: "failed", reason: "readback" });
23
+ return configureClientDocument(client, environment, command, client.format);
24
+ };
19
25
  const configureClientDocument = async (client, environment, command, format) => {
20
26
  const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
21
27
  if (transactionPath === undefined)
@@ -36,7 +42,7 @@ const configureClientDocument = async (client, environment, command, format) =>
36
42
  return { status: "failed", reason: "readback" };
37
43
  }
38
44
  const { document, servers, serversKey } = parsed;
39
- const desired = clientConfigurationDesired(client, environment, command);
45
+ const desired = clientConfigurationDesired(client, environment, command, format);
40
46
  if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
41
47
  return { status: "unchanged" };
42
48
  const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
@@ -49,7 +55,7 @@ const configureClientDocument = async (client, environment, command, format) =>
49
55
  };
50
56
  try {
51
57
  await mkdir(dirname(client.configPath), { recursive: true });
52
- await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format), {
58
+ await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format, original, PRODUCT_IDENTITY.mcpServerKey), {
53
59
  encoding: "utf8",
54
60
  mode: 0o600,
55
61
  });
@@ -75,7 +81,7 @@ const configureClientDocument = async (client, environment, command, format) =>
75
81
  };
76
82
  /** Determine whether an existing client configuration matches the desired registration. */
77
83
  export const clientConfigurationAligned = async (client, providerEnvironment, command) => {
78
- const desired = clientConfigurationDesired(client, providerEnvironment, command);
84
+ const desired = clientConfigurationDesired(client, providerEnvironment, command, client.format);
79
85
  try {
80
86
  const original = await readFile(client.configPath, "utf8");
81
87
  const { servers } = parseClientConfiguration(original, client.format);
@@ -107,7 +113,7 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
107
113
  remediation: "The configuration file could not be read. Check its permissions before rerunning setup.",
108
114
  };
109
115
  }
110
- const desired = clientConfigurationDesired(client, providerEnvironment, command);
116
+ const desired = clientConfigurationDesired(client, providerEnvironment, command, client.format);
111
117
  try {
112
118
  const { servers } = parseClientConfiguration(original, client.format);
113
119
  if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
@@ -145,16 +151,15 @@ const restoreConfig = async (path, original) => {
145
151
  // The backup remains available for the remediation reported by setup.
146
152
  }
147
153
  };
148
- const clientConfigurationDesired = (client, providerEnvironment, command) => {
154
+ const clientConfigurationDesired = (client, providerEnvironment, command, format) => {
149
155
  const environment = Object.fromEntries(Object.entries(providerEnvironment).sort(([left], [right]) => left.localeCompare(right)));
156
+ const registration = clientRegistrationEntry(format ?? "json", command.length === 0 ? [PRODUCT_IDENTITY.cliBinary, "mcp"] : command, environment);
150
157
  return {
151
- command: command[0] ?? PRODUCT_IDENTITY.cliBinary,
152
- args: command.slice(1),
158
+ ...registration,
153
159
  ...(client.name === "codex"
154
160
  ? {
155
161
  startup_timeout_sec: MCP_STARTUP_POLICY.codexStartupTimeoutSeconds,
156
162
  }
157
163
  : {}),
158
- ...(Object.keys(environment).length === 0 ? {} : { env: environment }),
159
164
  };
160
165
  };