rea-agents 6.2.0 → 6.4.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 (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -0,0 +1,103 @@
1
+ import { lstat, stat } from "node:fs/promises";
2
+ import { RegularFileAdmissionFailure, openRegularFile, sameRegularFileState, RegularFileChangedError, } from "../filesystem/RegularFile.js";
3
+ import { OwnedFileHandle } from "../filesystem/OwnedFileHandle.js";
4
+ import { readBoundedFileBytes } from "../process/BoundedFileBytes.js";
5
+ /** A close failed after reading; this error transfers the exact handle owner. */
6
+ export class RegularFileCleanupFailure extends Error {
7
+ path;
8
+ owner;
9
+ outcome;
10
+ cleanupCause;
11
+ constructor(path, owner, outcome, cleanupCause) {
12
+ super(`Regular file cleanup failed: ${path}`, {
13
+ cause: outcome.kind === "failed" ? outcome.cause : cleanupCause,
14
+ });
15
+ this.path = path;
16
+ this.owner = owner;
17
+ this.outcome = outcome;
18
+ this.cleanupCause = cleanupCause;
19
+ this.name = "RegularFileCleanupFailure";
20
+ }
21
+ }
22
+ /** Retry a failed close through its retained owner and report any remaining cleanup. */
23
+ export const retryRegularFileCleanup = async (failure, resources) => {
24
+ const released = await resources.release({
25
+ kind: "file-handle",
26
+ handle: failure.owner,
27
+ resource: failure.path,
28
+ });
29
+ if (released.kind === "released")
30
+ return { outcome: failure.outcome };
31
+ return {
32
+ outcome: failure.outcome,
33
+ cleanup: {
34
+ reason: `${failureMessage(failure.cleanupCause)}; retry: ${failureMessage(released.cause)}`,
35
+ resources: [failure.path],
36
+ },
37
+ };
38
+ };
39
+ const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
40
+ /** Admit one regular-file handle, retain it through the consumer, and always close it. */
41
+ export const withRegularFile = async (path, read, options = {}) => {
42
+ const { signal } = options;
43
+ let handle;
44
+ try {
45
+ handle = await openRegularFile(path, {
46
+ symlinks: options.symlinks ?? "follow",
47
+ signal,
48
+ });
49
+ }
50
+ catch (cause) {
51
+ if (!(cause instanceof RegularFileAdmissionFailure))
52
+ throw cause;
53
+ throw new RegularFileCleanupFailure(path, cause.owner, { kind: "failed", cause: cause.cause }, cause.cleanupCause);
54
+ }
55
+ const owner = new OwnedFileHandle(handle);
56
+ let outcome;
57
+ try {
58
+ const stats = await handle.stat();
59
+ signal?.throwIfAborted();
60
+ const value = await read(handle, stats);
61
+ signal?.throwIfAborted();
62
+ const [opened, currentPath] = await Promise.all([
63
+ handle.stat(),
64
+ options.symlinks === "reject" ? lstat(path) : stat(path),
65
+ ]);
66
+ if (!sameRegularFileState(stats, opened) ||
67
+ !sameRegularFileState(stats, currentPath))
68
+ throw new RegularFileChangedError(path);
69
+ outcome = { kind: "completed", value };
70
+ }
71
+ catch (cause) {
72
+ outcome = { kind: "failed", cause };
73
+ }
74
+ try {
75
+ await owner.close();
76
+ }
77
+ catch (cleanupCause) {
78
+ throw new RegularFileCleanupFailure(path, owner, outcome, cleanupCause);
79
+ }
80
+ if (outcome.kind === "failed")
81
+ throw outcome.cause;
82
+ return outcome.value;
83
+ };
84
+ /** Admit a regular file without waiting for a pipe, then read its verified handle. */
85
+ export const readRegularFile = (path, options = {}) => withRegularFile(path, async (handle, stats) => {
86
+ const bytes = await readBoundedFileBytes(handle, stats.size, options.signal);
87
+ if (bytes === undefined || bytes.length !== stats.size)
88
+ throw new RegularFileChangedError(path);
89
+ return bytes;
90
+ }, options);
91
+ /** Read one admitted regular file as UTF-8 without waiting on a pipe. */
92
+ export const readRegularFileText = async (path, options = {}) => {
93
+ try {
94
+ return (await readRegularFile(path, options)).toString("utf8");
95
+ }
96
+ catch (cause) {
97
+ if (cause instanceof RegularFileCleanupFailure &&
98
+ cause.outcome.kind === "completed" &&
99
+ Buffer.isBuffer(cause.outcome.value))
100
+ throw new RegularFileCleanupFailure(cause.path, cause.owner, { kind: "completed", value: cause.outcome.value.toString("utf8") }, cause.cleanupCause);
101
+ throw cause;
102
+ }
103
+ };
@@ -2,8 +2,49 @@ import { manualRegistrationRemediation, } from "./SupportedClients.js";
2
2
  import { configureDetectedClients } from "./SetupClients.js";
3
3
  import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
4
4
  import { filterClientsNeedingConfigure, hostRemediation, systemSetupHost, } from "./SetupHost.js";
5
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
6
+ import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
7
+ import { ProviderCleanupError } from "../domain/providerCleanupError.js";
5
8
  /** Discover, approve, and apply setup actions idempotently. */
6
9
  export const runSetup = async (options, host = systemSetupHost(), confirm) => {
10
+ let result;
11
+ let primaryFailure;
12
+ let threw = false;
13
+ try {
14
+ result = await runSetupWorkflow(options, host, confirm);
15
+ }
16
+ catch (cause) {
17
+ threw = true;
18
+ primaryFailure = cause;
19
+ }
20
+ let cleanupFailure;
21
+ try {
22
+ cleanupFailure = await host.close?.();
23
+ }
24
+ catch (cause) {
25
+ cleanupFailure = `Setup resource cleanup failed: ${failureMessage(cause)}`;
26
+ }
27
+ if (threw) {
28
+ if (cleanupFailure !== undefined && primaryFailure instanceof AnalysisError)
29
+ throw analysisErrorWithCleanupFailure(primaryFailure, new ProviderCleanupError("setup", primaryFailure.cleanupResources, { reason: cleanupFailure }, { operation: "setup" }), "setup");
30
+ if (cleanupFailure !== undefined)
31
+ throw new AggregateError([primaryFailure, new Error(cleanupFailure)], "Setup and resource cleanup failed.", { cause: primaryFailure });
32
+ throw primaryFailure;
33
+ }
34
+ if (result === undefined)
35
+ throw new Error("Setup returned no result.");
36
+ if (cleanupFailure === undefined)
37
+ return result;
38
+ return {
39
+ ...result,
40
+ status: "needs_human",
41
+ code: result.code ?? "cleanup_failed",
42
+ remediation: result.remediation
43
+ ? `${result.remediation} ${cleanupFailure}`
44
+ : cleanupFailure,
45
+ };
46
+ };
47
+ const runSetupWorkflow = async (options, host, confirm) => {
7
48
  const appliedActions = [];
8
49
  let plannedActions = [];
9
50
  const clients = {};
@@ -27,6 +68,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
27
68
  options.readinessScope?.clients === undefined &&
28
69
  options.allDetectedClients !== true &&
29
70
  options.installHopper !== true &&
71
+ options.skillClientIds === undefined &&
30
72
  options.installSkill === undefined;
31
73
  const interactiveSelection = confirm !== undefined && !options.structured && clientSelectionAllowed;
32
74
  let selectedClientIds = options.allDetectedClients
@@ -34,18 +76,29 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
34
76
  : (options.clientIds ??
35
77
  options.readinessScope?.clients ??
36
78
  discovery.defaultClientIds);
79
+ let selectedSkillClientIds = options.skillClientIds ?? selectedClientIds;
80
+ let skillNeedsInstall = await host.skillNeedsInstall(selectedSkillClientIds);
37
81
  let skillSelected = options.installSkill === true ||
38
- (options.installSkill !== false && selectedClientIds.length > 0);
39
- let installSkill = skillSelected && discovery.skillNeedsInstall;
82
+ (options.installSkill !== false &&
83
+ (selectedClientIds.length > 0 || selectedSkillClientIds.length > 0));
84
+ let installSkill = skillSelected && skillNeedsInstall;
40
85
  let planDiscovery = discovery;
41
86
  if (interactiveSelection) {
42
- const offerSkillAction = options.installSkill !== false && discovery.skillNeedsInstall;
87
+ const selectionSkillClientIds = [
88
+ ...new Set([
89
+ ...discovery.defaultClientIds,
90
+ ...discovery.detectedClientIds,
91
+ ]),
92
+ ];
93
+ const selectionSkillNeedsInstall = await host.skillNeedsInstall(selectionSkillClientIds);
94
+ const offerSkillAction = options.installSkill !== false && selectionSkillNeedsInstall;
43
95
  const selectionActions = await planSetupActions({
44
96
  discovery,
45
97
  host,
46
98
  providerEnvironment,
47
99
  command: host.registrationCommand,
48
100
  clientIds: [],
101
+ skillClientIds: selectionSkillClientIds,
49
102
  installSkill: offerSkillAction,
50
103
  });
51
104
  const decision = await confirm(selectionActions.plannedActions, {
@@ -67,6 +120,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
67
120
  selectedClientIds = [...selectedActionIds]
68
121
  .filter((id) => id.startsWith("configure_client:"))
69
122
  .map((id) => id.slice("configure_client:".length));
123
+ skillNeedsInstall = await host.skillNeedsInstall(selectedClientIds);
70
124
  const proposedInstallAction = selectionActions.plannedActions.some(({ id }) => id === "install_hopper");
71
125
  planDiscovery = {
72
126
  ...discovery,
@@ -78,7 +132,8 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
78
132
  (selectedActionIds.has("install_skill") &&
79
133
  selectedClientIds.length === 0) ||
80
134
  (options.installSkill !== false && selectedClientIds.length > 0);
81
- installSkill = skillSelected && discovery.skillNeedsInstall;
135
+ installSkill = skillSelected && skillNeedsInstall;
136
+ selectedSkillClientIds = selectedClientIds;
82
137
  }
83
138
  const planned = await planSetupActions({
84
139
  discovery: planDiscovery,
@@ -86,6 +141,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
86
141
  providerEnvironment,
87
142
  command: host.registrationCommand,
88
143
  clientIds: selectedClientIds,
144
+ skillClientIds: selectedSkillClientIds,
89
145
  installSkill,
90
146
  });
91
147
  plannedActions = planned.plannedActions;
@@ -177,8 +233,8 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
177
233
  if (clientFailure !== undefined)
178
234
  return fail(clientFailure);
179
235
  if (planSelection.installSkill &&
180
- !(await installSkillAction(host, options, appliedActions)))
181
- return fail("REA analysis skill could not be installed or verified. Check permissions for `~/.agents/skills`, then rerun setup.");
236
+ !(await installSkillAction(host, options, appliedActions, selectedSkillClientIds)))
237
+ return fail("REA analysis skill could not be installed or verified. Check permissions for its planned skill directories, then rerun setup.");
182
238
  const doctor = summarizeDoctor(await host.doctor(readinessScope));
183
239
  const remediation = combineRemediation(finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath), manualRemediation);
184
240
  return {
@@ -223,8 +279,10 @@ const installHopperAction = async (input) => {
223
279
  emitProgress(input.options, {
224
280
  actionId: "install_hopper",
225
281
  label,
226
- state: "completed",
227
- detail: installed.launcherPath,
282
+ state: installed.cleanupFailure === undefined ? "completed" : "warning",
283
+ detail: installed.cleanupFailure === undefined
284
+ ? installed.launcherPath
285
+ : `${installed.launcherPath}; ${installed.cleanupFailure}`,
228
286
  });
229
287
  const providerEnvironment = {
230
288
  ...input.providerEnvironment,
@@ -236,14 +294,14 @@ const installHopperAction = async (input) => {
236
294
  selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, input.host.registrationCommand),
237
295
  };
238
296
  };
239
- const installSkillAction = async (host, options, appliedActions) => {
297
+ const installSkillAction = async (host, options, appliedActions, skillClientIds) => {
240
298
  const label = "REA reverse-engineering skill";
241
299
  emitProgress(options, {
242
300
  actionId: "install_skill",
243
301
  label,
244
302
  state: "started",
245
303
  });
246
- const skill = await host.installSkill();
304
+ const skill = await host.installSkill(skillClientIds);
247
305
  if (skill === "failed") {
248
306
  emitProgress(options, {
249
307
  actionId: "install_skill",
@@ -334,3 +392,4 @@ const summarizeDoctor = (report) => ({
334
392
  },
335
393
  }),
336
394
  });
395
+ const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
@@ -1,43 +1,82 @@
1
- import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerPath, grokServerListedDisabled, legacyClientServerPath, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
1
+ import { readClientPolicyBlock } from "./GeminiClientSettings.js";
2
+ import { readClientConfigurationFiles } from "./ClientConfigurationFiles.js";
3
+ import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerListedDisabled, clientServerPath, legacyClientServerPath, OMP_DISABLED_SERVERS_KEY, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
2
4
  import { constants as fsConstants } from "node:fs";
3
- import { copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises";
5
+ import { copyFile, mkdir, rm, writeFile } from "node:fs/promises";
4
6
  import { dirname } from "node:path";
5
7
  import writeFileAtomic from "write-file-atomic";
8
+ import { clientRegistrationEnvironment } from "./ClientRegistrationEnvironment.js";
6
9
  import { PRODUCT_IDENTITY } from "../identity.js";
7
10
  import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
8
11
  import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
9
12
  import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
10
- const defaultCommand = () => npxRegistrationCommand();
13
+ import { readRegularFileText, RegularFileCleanupFailure, } from "./RegularFileRead.js";
11
14
  /** Configure one supported client's native stdio MCP registration shape. */
12
- export const configureClientConfiguration = (client, environment = {}, command = defaultCommand()) => {
13
- if (client.format === undefined || client.format === "unsupported")
14
- return Promise.resolve({ status: "failed", reason: "readback" });
15
- return configureClientDocument(client, environment, command, client.format);
15
+ export const configureClientConfiguration = (client, environment = {}, command = npxRegistrationCommand()) => {
16
+ if (client.configPathError !== undefined)
17
+ return Promise.resolve({ status: "failed", reason: "path" });
18
+ return configureClientDocument(client, environment, command);
16
19
  };
17
- const configureClientDocument = async (client, environment, command, format) => {
20
+ const configureClientDocument = async (client, environment, command) => {
21
+ const format = client.format;
22
+ if (format === undefined || format === "unsupported")
23
+ return { status: "failed", reason: "readback" };
24
+ const files = await readClientConfigurationFiles(client);
25
+ if (!files.ok) {
26
+ throwCleanupFailure(files.error);
27
+ return { status: "failed", reason: "readback" };
28
+ }
29
+ const policy = await readClientPolicyBlock(client, undefined, clientConfigurationDesired(client, environment, command, files.value.at(-1)));
30
+ if (!policy.ok) {
31
+ throwCleanupFailure(policy.error);
32
+ return { status: "failed", reason: "readback" };
33
+ }
34
+ if (policy.value !== undefined)
35
+ return { status: "failed", reason: "readback" };
18
36
  const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
19
37
  if (transactionPath === undefined)
20
38
  return { status: "failed", reason: "path" };
21
39
  let original;
22
40
  try {
23
- original = await readFile(transactionPath, "utf8");
41
+ original = await readRegularFileText(transactionPath);
24
42
  }
25
43
  catch (cause) {
44
+ if (cause instanceof RegularFileCleanupFailure)
45
+ throw cause;
26
46
  if (!isMissing(cause))
27
47
  return { status: "failed", reason: "readback" };
28
48
  }
29
49
  let parsed;
30
50
  try {
31
51
  parsed = parseClientConfiguration(original ?? (format === "toml" || format === "grok" ? "" : "{}"), format);
52
+ const policy = await readClientPolicyBlock(client, parsed, clientConfigurationDesired(client, environment, command, parsed));
53
+ if (!policy.ok) {
54
+ throwCleanupFailure(policy.error);
55
+ return { status: "failed", reason: "readback" };
56
+ }
57
+ if (policy.value !== undefined)
58
+ return { status: "failed", reason: "readback" };
32
59
  }
33
60
  catch (cause) {
61
+ if (cause instanceof RegularFileCleanupFailure)
62
+ throw cause;
34
63
  // Malformed existing configuration fails the readback gate.
35
64
  void cause;
36
65
  return { status: "failed", reason: "readback" };
37
66
  }
38
- const desired = clientConfigurationDesired(client, environment, command, parsed.dialect);
67
+ const desired = clientConfigurationDesired(client, environment, command, parsed);
39
68
  if (registrationCurrent(parsed, desired))
40
69
  return { status: "unchanged" };
70
+ return persistClientConfiguration({
71
+ client,
72
+ transactionPath,
73
+ format,
74
+ original,
75
+ parsed,
76
+ desired,
77
+ });
78
+ };
79
+ const persistClientConfiguration = async ({ client, transactionPath, format, original, parsed, desired, }) => {
41
80
  const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
42
81
  if (backupPath !== undefined &&
43
82
  !(await preserveConfigBackup(transactionPath, backupPath)))
@@ -45,12 +84,25 @@ const configureClientDocument = async (client, environment, command, format) =>
45
84
  // A native OpenCode V2 entry replaces REA's legacy V1 entry, which would
46
85
  // otherwise conflict with it.
47
86
  const legacyPath = legacyClientServerPath(parsed, PRODUCT_IDENTITY.mcpServerKey);
48
- const document = withClientServers(parsed, { ...parsed.servers, [PRODUCT_IDENTITY.mcpServerKey]: desired }, PRODUCT_IDENTITY.mcpServerKey);
87
+ const registered = withClientServers(parsed, { ...parsed.servers, [PRODUCT_IDENTITY.mcpServerKey]: desired }, PRODUCT_IDENTITY.mcpServerKey);
88
+ // OMP's denylist would hide the registration; keep every other listed name.
89
+ const ompDisabled = parsed.dialect === "omp"
90
+ ? parsed.document[OMP_DISABLED_SERVERS_KEY]
91
+ : undefined;
92
+ const enableOmp = Array.isArray(ompDisabled) &&
93
+ ompDisabled.includes(PRODUCT_IDENTITY.mcpServerKey);
94
+ const document = enableOmp && Array.isArray(ompDisabled)
95
+ ? {
96
+ ...registered,
97
+ [OMP_DISABLED_SERVERS_KEY]: ompDisabled.filter((name) => name !== PRODUCT_IDENTITY.mcpServerKey),
98
+ }
99
+ : registered;
49
100
  try {
50
101
  await mkdir(dirname(client.configPath), { recursive: true });
51
102
  await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format, original, [
52
103
  clientServerPath(parsed, PRODUCT_IDENTITY.mcpServerKey),
53
104
  ...(legacyPath === undefined ? [] : [legacyPath]),
105
+ ...(enableOmp ? [[OMP_DISABLED_SERVERS_KEY]] : []),
54
106
  ]), {
55
107
  encoding: "utf8",
56
108
  mode: 0o600,
@@ -62,13 +114,15 @@ const configureClientDocument = async (client, environment, command, format) =>
62
114
  return { status: "failed", reason: "write" };
63
115
  }
64
116
  try {
65
- const readback = parseClientConfiguration(await readFile(transactionPath, "utf8"), format);
117
+ const readback = parseClientConfiguration(await readRegularFileText(transactionPath), format);
66
118
  if (!registrationCurrent(readback, desired)) {
67
119
  await restoreConfig(transactionPath, original);
68
120
  return { status: "failed", reason: "readback" };
69
121
  }
70
122
  }
71
123
  catch (cause) {
124
+ if (cause instanceof RegularFileCleanupFailure)
125
+ throw cause;
72
126
  // Readback failure restores the transaction before reporting.
73
127
  void cause;
74
128
  await restoreConfig(transactionPath, original);
@@ -81,12 +135,27 @@ const configureClientDocument = async (client, environment, command, format) =>
81
135
  };
82
136
  /** Determine whether an existing client configuration matches the desired registration. */
83
137
  export const clientConfigurationAligned = async (client, providerEnvironment, command) => {
138
+ if (client.configPathError !== undefined)
139
+ return false;
84
140
  try {
85
- const original = await readFile(client.configPath, "utf8");
141
+ const files = await readClientConfigurationFiles(client);
142
+ if (!files.ok) {
143
+ throwCleanupFailure(files.error);
144
+ return false;
145
+ }
146
+ const original = await readRegularFileText(client.configPath);
86
147
  const parsed = parseClientConfiguration(original, client.format);
87
- return registrationCurrent(parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed.dialect));
148
+ const policy = await readClientPolicyBlock(client, parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed));
149
+ if (!policy.ok) {
150
+ throwCleanupFailure(policy.error);
151
+ return false;
152
+ }
153
+ return (policy.value === undefined &&
154
+ registrationCurrent(parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed)));
88
155
  }
89
156
  catch (cause) {
157
+ if (cause instanceof RegularFileCleanupFailure)
158
+ throw cause;
90
159
  // Unreadable configuration is treated as not aligned so setup repairs it.
91
160
  void cause;
92
161
  return false;
@@ -94,8 +163,28 @@ export const clientConfigurationAligned = async (client, providerEnvironment, co
94
163
  };
95
164
  /** Preflight one client configuration before setup presents any mutations. */
96
165
  export const inspectClientConfiguration = async (client, providerEnvironment, command) => {
166
+ if (client.configPathError !== undefined)
167
+ return { status: "invalid", remediation: client.configPathError };
97
168
  if (client.format === "unsupported")
98
169
  return { status: "already_current" };
170
+ const files = await readClientConfigurationFiles(client);
171
+ if (!files.ok) {
172
+ throwCleanupFailure(files.error);
173
+ return {
174
+ status: "invalid",
175
+ remediation: files.error.detail,
176
+ };
177
+ }
178
+ const policy = await readClientPolicyBlock(client, undefined, clientConfigurationDesired(client, providerEnvironment, command, files.value.at(-1)));
179
+ if (!policy.ok) {
180
+ throwCleanupFailure(policy.error);
181
+ return {
182
+ status: "invalid",
183
+ remediation: policy.error.detail,
184
+ };
185
+ }
186
+ if (policy.value !== undefined)
187
+ return { status: "invalid", remediation: policy.value };
99
188
  const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
100
189
  if (transactionPath === undefined)
101
190
  return {
@@ -104,23 +193,37 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
104
193
  };
105
194
  let original;
106
195
  try {
107
- original = await readFile(transactionPath, "utf8");
196
+ original = await readRegularFileText(transactionPath);
108
197
  }
109
198
  catch (cause) {
199
+ if (cause instanceof RegularFileCleanupFailure)
200
+ throw cause;
110
201
  if (isMissing(cause))
111
202
  return { status: "create" };
112
203
  return {
113
204
  status: "invalid",
114
- remediation: "The configuration file could not be read. Check its permissions before rerunning setup.",
205
+ remediation: `The configuration file could not be read. Check its permissions before rerunning setup. ${cause instanceof Error ? cause.message : String(cause)}`,
115
206
  };
116
207
  }
117
208
  try {
118
209
  const parsed = parseClientConfiguration(original, client.format);
119
- const desired = clientConfigurationDesired(client, providerEnvironment, command, parsed.dialect);
210
+ const policy = await readClientPolicyBlock(client, parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed));
211
+ if (!policy.ok) {
212
+ throwCleanupFailure(policy.error);
213
+ return {
214
+ status: "invalid",
215
+ remediation: policy.error.detail,
216
+ };
217
+ }
218
+ if (policy.value !== undefined)
219
+ return { status: "invalid", remediation: policy.value };
220
+ const desired = clientConfigurationDesired(client, providerEnvironment, command, parsed);
120
221
  if (registrationCurrent(parsed, desired))
121
222
  return { status: "already_current" };
122
223
  }
123
224
  catch (cause) {
225
+ if (cause instanceof RegularFileCleanupFailure)
226
+ throw cause;
124
227
  // Malformed configuration is reported with the invalid remediation.
125
228
  void cause;
126
229
  return {
@@ -134,6 +237,10 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
134
237
  };
135
238
  };
136
239
  const isMissing = (cause) => cause instanceof Error && "code" in cause && cause.code === "ENOENT";
240
+ const throwCleanupFailure = (error) => {
241
+ if (error.cleanupFailure !== undefined)
242
+ throw error.cleanupFailure;
243
+ };
137
244
  const preserveConfigBackup = async (source, destination) => {
138
245
  try {
139
246
  await copyFile(source, destination, fsConstants.COPYFILE_EXCL);
@@ -155,14 +262,18 @@ const restoreConfig = async (path, original) => {
155
262
  void cause;
156
263
  }
157
264
  };
158
- /** Whether REA's entry matches, no legacy entry remains, and Grok is not suppressing it. */
265
+ /** Whether REA's entry matches, no legacy entry remains, and no client disable list suppresses it. */
159
266
  const registrationCurrent = (parsed, desired) => clientConfigurationValuesEqual(parsed.servers[PRODUCT_IDENTITY.mcpServerKey], desired) &&
160
267
  !Object.hasOwn(parsed.legacyServers, PRODUCT_IDENTITY.mcpServerKey) &&
161
- !(parsed.dialect === "grok" &&
162
- grokServerListedDisabled(parsed.document, PRODUCT_IDENTITY.mcpServerKey));
163
- const clientConfigurationDesired = (client, providerEnvironment, command, format) => {
164
- const environment = Object.fromEntries(Object.entries(providerEnvironment).sort(([left], [right]) => left.localeCompare(right)));
165
- const registration = clientRegistrationEntry(format ?? "json", command.length === 0 ? [PRODUCT_IDENTITY.cliBinary, "mcp"] : command, environment);
268
+ !clientServerListedDisabled(parsed, PRODUCT_IDENTITY.mcpServerKey);
269
+ const clientConfigurationDesired = (client, providerEnvironment, command, parsed) => {
270
+ const format = parsed?.dialect ?? client.format ?? "json";
271
+ // Preserve explicitly configured server settings, never the ambient process
272
+ // environment. Newly discovered provider paths win only for their own keys.
273
+ const environment = clientRegistrationEnvironment(parsed, providerEnvironment);
274
+ if (!environment.ok)
275
+ throw environment.error;
276
+ const registration = clientRegistrationEntry(format, command.length === 0 ? [PRODUCT_IDENTITY.cliBinary, "mcp"] : command, environment.value);
166
277
  return {
167
278
  ...registration,
168
279
  ...(client.name === "codex" || client.name === "grok_build"