rea-agents 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/README.md +72 -95
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -2,40 +2,18 @@ import { readFile, realpath, stat } from "node:fs/promises";
2
2
  import { join, resolve } from "node:path";
3
3
  import ignore from "ignore";
4
4
  import { err, ok } from "../domain/result.js";
5
- import { withinRoot } from "../reference/ReferenceSourceReaderPaths.js";
6
- import { DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS, DEFAULT_REFERENCE_SOURCE_LIMITS, } from "./ReferenceSourceImportTypes.js";
7
- import { canonicalizeConfiguredRoots } from "./ConfiguredRoots.js";
5
+ import { DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS, } from "./ReferenceSourceImportTypes.js";
8
6
  const failure = (code, message) => ({
9
7
  tag: "reference-source-import",
10
8
  code,
11
9
  message,
12
10
  });
13
- const validLimits = (limits) => Object.values(limits).every((value) => Number.isSafeInteger(value) && value > 0);
14
- const maximumLimits = (options) => ({
15
- maxBytes: options.policy.maxBytes,
16
- maxEntries: options.policy.maxEntries,
17
- maxDepth: options.policy.maxDepth,
18
- maxPathBytes: options.policy.maxPathBytes,
19
- });
20
- const clampLimits = (requested, maximum) => ({
21
- maxBytes: Math.min(requested.maxBytes, maximum.maxBytes),
22
- maxEntries: Math.min(requested.maxEntries, maximum.maxEntries),
23
- maxDepth: Math.min(requested.maxDepth, maximum.maxDepth),
24
- maxPathBytes: Math.min(requested.maxPathBytes, maximum.maxPathBytes),
25
- });
26
- const authorizeRoot = async (requestedRoot, approvedRoots) => {
27
- if (approvedRoots.length === 0)
28
- return err(failure("policy", "No approved reference source roots"));
11
+ const resolveRoot = async (requestedRoot) => {
29
12
  try {
30
13
  if (!(await stat(requestedRoot)).isDirectory())
31
14
  return err(failure("invalid-root", "Reference source root is not a directory"));
32
15
  const canonicalRoot = await realpath(resolve(requestedRoot));
33
- const canonicalApprovedRoots = await canonicalizeConfiguredRoots(approvedRoots.map((approvedRoot) => resolve(approvedRoot)));
34
- for (const canonicalApproved of canonicalApprovedRoots) {
35
- if (withinRoot(canonicalApproved, canonicalRoot))
36
- return ok(canonicalRoot);
37
- }
38
- return err(failure("policy", "Reference source root is outside approved roots"));
16
+ return ok(canonicalRoot);
39
17
  }
40
18
  catch {
41
19
  return err(failure("invalid-root", "Reference source root could not be resolved"));
@@ -56,18 +34,13 @@ const buildIgnored = async (root, excludePaths) => {
56
34
  }
57
35
  return ignored;
58
36
  };
59
- /** Validate limits, authorize root, and build non-executing path filters. */
37
+ /** Resolve the caller-selected directory and build path filters. */
60
38
  export const prepareReferenceSourceImport = async (options) => {
61
- const requested = options.limits ?? DEFAULT_REFERENCE_SOURCE_LIMITS;
62
- const maximum = maximumLimits(options);
63
- if (!validLimits(requested) || !validLimits(maximum))
64
- return err(failure("invalid-limits", "Import limits must be positive integers"));
65
- const root = await authorizeRoot(options.root, options.policy.roots);
39
+ const root = await resolveRoot(options.root);
66
40
  if (!root.ok)
67
41
  return root;
68
42
  return ok({
69
43
  root: root.value,
70
- limits: clampLimits(requested, maximum),
71
44
  ignored: await buildIgnored(root.value, options.excludePaths ?? []),
72
45
  secrets: ignore().add([...options.policy.secretPatterns]),
73
46
  });
@@ -5,21 +5,11 @@ export const projectReferenceSourceImportError = (error) => {
5
5
  category: "cancelled",
6
6
  message: "Reference source import was cancelled. Start it again when ready.",
7
7
  };
8
- if (error.code === "invalid-limits")
9
- return {
10
- category: "invalid_input",
11
- message: "Reference source limits are invalid. Use positive integer limits, then try again.",
12
- };
13
8
  if (error.code === "invalid-root")
14
9
  return {
15
10
  category: "invalid_input",
16
11
  message: "Reference source directory could not be opened. Check that the path exists, is readable, and points to a directory.",
17
12
  };
18
- if (error.code === "policy")
19
- return {
20
- category: "permission_required",
21
- message: "Reference source directory is not approved. Add its directory to `REA_REFERENCE_ROOTS_JSON`, restart REA, then try again.",
22
- };
23
13
  if (error.code === "io")
24
14
  return {
25
15
  category: "execution_failure",
@@ -41,10 +31,4 @@ export const DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS = [
41
31
  ".coverage",
42
32
  "*.log",
43
33
  ];
44
- export const DEFAULT_REFERENCE_SOURCE_LIMITS = {
45
- maxBytes: 16 * 1024 * 1024,
46
- maxEntries: 10_000,
47
- maxDepth: 32,
48
- maxPathBytes: 4_096,
49
- };
50
34
  export const PARSEABLE_REFERENCE_SOURCE_LANGUAGES = new Set(["JavaScript", "TypeScript", "JSX", "TSX"]);
@@ -1,13 +1,10 @@
1
- import { execFile } from "node:child_process";
1
+ import { spawn } from "node:child_process";
2
2
  import { constants } from "node:fs";
3
3
  import { access, realpath } from "node:fs/promises";
4
4
  import { delimiter, join } from "node:path";
5
5
  const TOOL_NAMES = ["node", "npm", "npx"];
6
- const MAX_CANDIDATES_PER_TOOL = 16;
7
- const MAX_OUTPUT_BYTES = 65_536;
8
- const MAX_DIAGNOSTIC_BYTES = 4_096;
9
6
  const PROBE_CONCURRENCY = 4;
10
- /** Inventory and bounded-probe Node toolchain candidates under one exact PATH. */
7
+ /** Inventory and probe Node toolchain candidates under one exact PATH. */
11
8
  export const inspectRuntimeExecutables = async (options) => {
12
9
  const pathEntries = unique(options.path.split(delimiter).filter(Boolean));
13
10
  const candidates = [
@@ -37,7 +34,7 @@ export const inspectRuntimeExecutables = async (options) => {
37
34
  seen.add(key);
38
35
  uniqueCandidates.push(candidate);
39
36
  }
40
- const diagnostics = await mapConcurrentBounded(uniqueCandidates, PROBE_CONCURRENCY, (candidate) => probeCandidate(candidate, options.timeoutMs ?? 5_000, options.path));
37
+ const diagnostics = await mapConcurrentBounded(uniqueCandidates, PROBE_CONCURRENCY, (candidate) => probeCandidate(candidate, options.timeoutMs, options.path));
41
38
  return {
42
39
  launcher_node: await canonicalPath(options.launcherNode),
43
40
  candidates: diagnostics,
@@ -56,47 +53,79 @@ const discoverToolCandidates = async (tool, pathEntries, platform, configuredExt
56
53
  break;
57
54
  }
58
55
  }
59
- if (candidates.length >= MAX_CANDIDATES_PER_TOOL)
60
- break;
61
56
  }
62
57
  return candidates;
63
58
  };
64
59
  const probeCandidate = async (candidate, timeoutMs, effectivePath) => {
65
60
  const canonical = await canonicalPath(candidate.path);
66
61
  const result = await executeVersion(candidate.path, timeoutMs, effectivePath);
67
- return {
62
+ const identity = {
68
63
  tool: candidate.tool,
69
64
  lexical_path: candidate.path,
70
65
  canonical_path: canonical,
71
66
  path_index: candidate.pathIndex,
72
67
  selection: candidate.selection,
73
- version: result.ok ? result.version : null,
74
- healthy: result.ok,
75
- failure: result.ok ? null : result.failure,
76
68
  };
69
+ return result.ok
70
+ ? { ...identity, version: result.version, healthy: true, failure: null }
71
+ : {
72
+ ...identity,
73
+ version: null,
74
+ healthy: false,
75
+ failure: result.failure,
76
+ };
77
77
  };
78
78
  const executeVersion = (path, timeoutMs, effectivePath) => new Promise((resolve) => {
79
- const child = execFile(path, ["--version"], {
80
- encoding: "utf8",
81
- timeout: timeoutMs,
82
- maxBuffer: MAX_OUTPUT_BYTES,
79
+ const child = spawn(path, ["--version"], {
83
80
  windowsHide: true,
84
81
  env: environmentWithPath(effectivePath),
85
- }, (cause, stdout, stderr) => {
86
- if (cause === null) {
82
+ stdio: ["ignore", "pipe", "pipe"],
83
+ });
84
+ let stdout = "";
85
+ let stderr = "";
86
+ let spawnError;
87
+ let timeout;
88
+ let timedOut = false;
89
+ child.stdout?.setEncoding("utf8");
90
+ child.stderr?.setEncoding("utf8");
91
+ child.stdout?.on("data", (chunk) => {
92
+ stdout += chunk;
93
+ });
94
+ child.stderr?.on("data", (chunk) => {
95
+ stderr += chunk;
96
+ });
97
+ child.once("error", (cause) => {
98
+ spawnError = cause;
99
+ });
100
+ if (timeoutMs !== undefined && timeoutMs > 0) {
101
+ timeout = setTimeout(() => {
102
+ timedOut = true;
103
+ child.kill();
104
+ }, timeoutMs);
105
+ timeout.unref();
106
+ }
107
+ child.once("close", () => {
108
+ if (timeout !== undefined)
109
+ clearTimeout(timeout);
110
+ if (spawnError === undefined && child.exitCode === 0) {
87
111
  const version = firstNonemptyLine(stdout) ?? firstNonemptyLine(stderr);
88
- if (version !== undefined)
112
+ if (version !== undefined) {
89
113
  resolve({ ok: true, version });
90
- else
91
- resolve({
92
- ok: false,
93
- failure: failure("runtime_invalid_version_output", child, stderr),
94
- });
114
+ return;
115
+ }
116
+ resolve({
117
+ ok: false,
118
+ failure: failure("runtime_invalid_version_output", child, stderr),
119
+ });
95
120
  return;
96
121
  }
122
+ const cause = spawnError ??
123
+ new Error("Runtime version probe did not exit successfully");
97
124
  resolve({
98
125
  ok: false,
99
- failure: classifyProbeFailure(cause, child, stderr),
126
+ failure: timedOut
127
+ ? failure("runtime_timeout", child, stderr)
128
+ : classifyProbeFailure(cause, child, stderr),
100
129
  });
101
130
  });
102
131
  });
@@ -117,7 +146,7 @@ const failure = (code, child, stderr, dependency = null) => ({
117
146
  exit_code: child.exitCode,
118
147
  signal: child.signalCode,
119
148
  dependency,
120
- stderr: bounded(stderr.trim()),
149
+ stderr: stderr.trim(),
121
150
  });
122
151
  const missingDynamicLibrary = (stderr) => /(?:dyld(?:\[[^\]]+\])?: )?Library not loaded:\s*([^\r\n]+)/u
123
152
  .exec(stderr)?.[1]
@@ -143,9 +172,6 @@ const firstNonemptyLine = (value) => value
143
172
  .split(/\r?\n/u)
144
173
  .find((line) => line.trim().length > 0)
145
174
  ?.trim();
146
- const bounded = (value) => value.length <= MAX_DIAGNOSTIC_BYTES
147
- ? value
148
- : value.slice(-MAX_DIAGNOSTIC_BYTES);
149
175
  const unique = (values) => [...new Set(values)];
150
176
  const environmentWithPath = (path) => {
151
177
  const environment = {};
@@ -11,8 +11,8 @@ export class SessionProviderRouter {
11
11
  constructor(runtime) {
12
12
  this.runtime = runtime;
13
13
  }
14
- /** Preserve the existing provider/factory seam used by focused embedders. */
15
- static legacy(provider, options = {}) {
14
+ /** Create routing for an embedding backed by one fixed provider or factory. */
15
+ static single(provider, options = {}) {
16
16
  const identity = typeof provider === "function"
17
17
  ? { id: "unidentified", name: "Unidentified provider", version: null }
18
18
  : provider.identity();
@@ -13,8 +13,7 @@ import { discoverSetupActions } from "./SetupPlan.js";
13
13
  import { clientConfigurationAligned, configureJsonClient, configureTomlClient, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
14
14
  export { configureJsonClient, configureTomlClient };
15
15
  import { setupInstallFailure, } from "./SetupInstallFailure.js";
16
- import { providerRegistrationEnvironment, registrationPermissionEnvironment, } from "./SetupRegistrationEnvironment.js";
17
- export { registrationPermissionEnvironment } from "./SetupRegistrationEnvironment.js";
16
+ import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
18
17
  export { canonicalSkillNeedsInstall, installCanonicalSkill };
19
18
  const registrationCommand = () => process.env.npm_command === "exec"
20
19
  ? PRODUCT_IDENTITY.mcpCommand.split(" ")
@@ -254,7 +253,6 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
254
253
  const diagnosis = await runDoctor(undefined, doctorHost);
255
254
  return {
256
255
  ...providerRegistrationEnvironment(diagnosis.providerInspections ?? []),
257
- ...registrationPermissionEnvironment(process.env),
258
256
  ...(diagnosis.hopperPath === undefined
259
257
  ? {}
260
258
  : { HOPPER_LAUNCHER_PATH: diagnosis.hopperPath }),
@@ -1,10 +1,8 @@
1
+ import { clientConfigurationValuesEqual, parseClientConfiguration, serializeClientConfiguration, } from "./ClientConfigurationDocument.js";
1
2
  import { constants as fsConstants } from "node:fs";
2
3
  import { copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
4
  import { dirname } from "node:path";
4
- import canonicalize from "canonicalize";
5
- import { z } from "zod";
6
5
  import writeFileAtomic from "write-file-atomic";
7
- import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
8
6
  import { PRODUCT_IDENTITY } from "../identity.js";
9
7
  import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
10
8
  import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
@@ -15,43 +13,43 @@ const defaultCommand = () => [
15
13
  "mcp",
16
14
  ];
17
15
  /** Back up, atomically update, and semantically read back one JSON MCP configuration. */
18
- export const configureJsonClient = async (client, environment = {}, command = defaultCommand()) => {
16
+ export const configureJsonClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "json");
17
+ /** Back up, atomically update, and semantically read back one TOML MCP configuration. */
18
+ export const configureTomlClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "toml");
19
+ const configureClientDocument = async (client, environment, command, format) => {
19
20
  const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
20
21
  if (transactionPath === undefined)
21
22
  return { status: "failed", reason: "path" };
22
- let document = {};
23
23
  let original;
24
24
  try {
25
25
  original = await readFile(transactionPath, "utf8");
26
- document = parseObject(original);
27
26
  }
28
27
  catch (cause) {
29
28
  if (!isMissing(cause))
30
29
  return { status: "failed", reason: "readback" };
31
30
  }
32
- let servers;
31
+ let parsed;
33
32
  try {
34
- servers = parseOptionalObject(document.mcpServers);
33
+ parsed = parseClientConfiguration(original ?? (format === "toml" ? "" : "{}"), format);
35
34
  }
36
35
  catch {
37
36
  return { status: "failed", reason: "readback" };
38
37
  }
39
- const desired = clientConfigurationDesired(client, normalizeProviderEnvironment(environment), command);
40
- if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
38
+ const { document, servers, serversKey } = parsed;
39
+ const desired = clientConfigurationDesired(client, environment, command);
40
+ if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
41
41
  return { status: "unchanged" };
42
- let backupPath;
43
- if (original !== undefined) {
44
- backupPath = `${client.configPath}.rea.backup`;
45
- if (!(await preserveConfigBackup(transactionPath, backupPath)))
46
- return { status: "failed", reason: "backup" };
47
- }
48
- document.mcpServers = {
42
+ const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
43
+ if (backupPath !== undefined &&
44
+ !(await preserveConfigBackup(transactionPath, backupPath)))
45
+ return { status: "failed", reason: "backup" };
46
+ document[serversKey] = {
49
47
  ...servers,
50
48
  [PRODUCT_IDENTITY.mcpServerKey]: desired,
51
49
  };
52
50
  try {
53
51
  await mkdir(dirname(client.configPath), { recursive: true });
54
- await writeFileAtomic(transactionPath, `${JSON.stringify(document, null, 2)}\n`, {
52
+ await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format), {
55
53
  encoding: "utf8",
56
54
  mode: 0o600,
57
55
  });
@@ -60,8 +58,8 @@ export const configureJsonClient = async (client, environment = {}, command = de
60
58
  return { status: "failed", reason: "write" };
61
59
  }
62
60
  try {
63
- const readback = parseObject(await readFile(transactionPath, "utf8"));
64
- if (!sameConfiguration(parseOptionalObject(readback.mcpServers)[PRODUCT_IDENTITY.mcpServerKey], desired)) {
61
+ const readback = parseClientConfiguration(await readFile(transactionPath, "utf8"), format);
62
+ if (!clientConfigurationValuesEqual(readback.servers[PRODUCT_IDENTITY.mcpServerKey], desired)) {
65
63
  await restoreConfig(transactionPath, original);
66
64
  return { status: "failed", reason: "readback" };
67
65
  }
@@ -75,68 +73,13 @@ export const configureJsonClient = async (client, environment = {}, command = de
75
73
  ...(backupPath === undefined ? {} : { backupPath }),
76
74
  };
77
75
  };
78
- /** Back up, atomically update, and semantically read back Codex TOML configuration. */
79
- export const configureTomlClient = async (client, environment = {}, command = defaultCommand()) => {
80
- const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
81
- if (transactionPath === undefined)
82
- return { status: "failed", reason: "path" };
83
- let document = {};
84
- let original;
85
- try {
86
- original = await readFile(transactionPath, "utf8");
87
- document = objectSchema.parse(parseToml(original));
88
- }
89
- catch (cause) {
90
- if (!isMissing(cause))
91
- return { status: "failed", reason: "readback" };
92
- }
93
- let servers;
94
- try {
95
- servers = parseOptionalObject(document.mcp_servers);
96
- }
97
- catch {
98
- return { status: "failed", reason: "readback" };
99
- }
100
- const desired = clientConfigurationDesired(client, normalizeProviderEnvironment(environment), command);
101
- if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
102
- return { status: "unchanged" };
103
- const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
104
- if (backupPath !== undefined &&
105
- !(await preserveConfigBackup(transactionPath, backupPath)))
106
- return { status: "failed", reason: "backup" };
107
- document.mcp_servers = {
108
- ...servers,
109
- [PRODUCT_IDENTITY.mcpServerKey]: desired,
110
- };
111
- try {
112
- await mkdir(dirname(client.configPath), { recursive: true });
113
- await writeFileAtomic(transactionPath, stringifyToml(document), {
114
- encoding: "utf8",
115
- mode: 0o600,
116
- });
117
- const readback = objectSchema.parse(parseToml(await readFile(transactionPath, "utf8")));
118
- if (!sameConfiguration(parseOptionalObject(readback.mcp_servers)[PRODUCT_IDENTITY.mcpServerKey], desired))
119
- throw new Error("TOML readback mismatch");
120
- }
121
- catch {
122
- await restoreConfig(transactionPath, original);
123
- return { status: "failed", reason: "readback" };
124
- }
125
- return {
126
- status: "configured",
127
- ...(backupPath === undefined ? {} : { backupPath }),
128
- };
129
- };
130
76
  /** Determine whether an existing client configuration matches the desired registration. */
131
77
  export const clientConfigurationAligned = async (client, providerEnvironment, command) => {
132
78
  const desired = clientConfigurationDesired(client, providerEnvironment, command);
133
79
  try {
134
80
  const original = await readFile(client.configPath, "utf8");
135
- const document = client.format === "toml"
136
- ? objectSchema.parse(parseToml(original))
137
- : parseObject(original);
138
- const servers = parseOptionalObject(client.format === "toml" ? document.mcp_servers : document.mcpServers);
139
- return sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired);
81
+ const { servers } = parseClientConfiguration(original, client.format);
82
+ return clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired);
140
83
  }
141
84
  catch {
142
85
  return false;
@@ -166,11 +109,8 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
166
109
  }
167
110
  const desired = clientConfigurationDesired(client, providerEnvironment, command);
168
111
  try {
169
- const document = client.format === "toml"
170
- ? objectSchema.parse(parseToml(original))
171
- : parseObject(original);
172
- const servers = parseOptionalObject(client.format === "toml" ? document.mcp_servers : document.mcpServers);
173
- if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
112
+ const { servers } = parseClientConfiguration(original, client.format);
113
+ if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
174
114
  return { status: "already_current" };
175
115
  }
176
116
  catch {
@@ -184,15 +124,7 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
184
124
  backupPath: `${client.configPath}.rea.backup`,
185
125
  };
186
126
  };
187
- const objectSchema = z.record(z.string(), z.unknown());
188
- const parseOptionalObject = (value) => value === undefined ? {} : objectSchema.parse(value);
189
- const parseObject = (text) => objectSchema.parse(JSON.parse(text));
190
127
  const isMissing = (cause) => cause instanceof Error && "code" in cause && cause.code === "ENOENT";
191
- const sameConfiguration = (left, right) => {
192
- const encodedLeft = canonicalize(left);
193
- const encodedRight = canonicalize(right);
194
- return encodedLeft !== undefined && encodedLeft === encodedRight;
195
- };
196
128
  const preserveConfigBackup = async (source, destination) => {
197
129
  try {
198
130
  await copyFile(source, destination, fsConstants.COPYFILE_EXCL);
@@ -226,6 +158,3 @@ const clientConfigurationDesired = (client, providerEnvironment, command) => {
226
158
  ...(Object.keys(environment).length === 0 ? {} : { env: environment }),
227
159
  };
228
160
  };
229
- const normalizeProviderEnvironment = (environment) => typeof environment === "string"
230
- ? { HOPPER_LAUNCHER_PATH: environment }
231
- : environment;
@@ -1,10 +1,3 @@
1
- /** Select explicit non-secret permission settings safe for managed MCP registrations. */
2
- export const registrationPermissionEnvironment = (environment) => {
3
- const investigationRoots = environment.REA_INVESTIGATION_INPUT_ROOTS_JSON;
4
- return investigationRoots === undefined
5
- ? {}
6
- : { REA_INVESTIGATION_INPUT_ROOTS_JSON: investigationRoots };
7
- };
8
1
  /** Select exact non-secret settings published by available providers. */
9
2
  export const providerRegistrationEnvironment = (inspections) => Object.fromEntries(inspections
10
3
  .filter(({ available }) => available)
@@ -0,0 +1,119 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, mkdtemp, open, readdir, rename, rm, rmdir, unlink, } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { readBoundedFileBytes } from "../process/BoundedFileBytes.js";
5
+ class StoreFileLockOccupied extends Error {
6
+ code = "EEXIST";
7
+ constructor(cause) {
8
+ super("Store transaction lock is occupied", { cause });
9
+ }
10
+ }
11
+ /** Atomically publish a populated directory so another owner cannot replace a live lock. */
12
+ export const createStoreFileLock = async (path) => {
13
+ if (await exists(path))
14
+ throw new StoreFileLockOccupied();
15
+ const staged = await mkdtemp(join(dirname(path), ".rea-store-lock-"));
16
+ const owner = `owner-${randomUUID()}`;
17
+ try {
18
+ const handle = await open(join(staged, owner), "wx", 0o600);
19
+ try {
20
+ await handle.writeFile(`${String(process.pid)}\n`, "utf8");
21
+ await handle.sync();
22
+ }
23
+ finally {
24
+ await handle.close();
25
+ }
26
+ try {
27
+ // Rename cannot replace a nonempty directory: the owner entry is present before publication.
28
+ await rename(staged, path);
29
+ }
30
+ catch (cause) {
31
+ if (await exists(path))
32
+ throw new StoreFileLockOccupied(cause);
33
+ throw cause;
34
+ }
35
+ return {
36
+ release: async () => {
37
+ await removeOwner(path, owner).catch(() => undefined);
38
+ },
39
+ };
40
+ }
41
+ finally {
42
+ await rm(staged, { recursive: true, force: true });
43
+ }
44
+ };
45
+ /** Recover a dead owner's directory lock or a legacy PID file; leave live and unknown owners intact. */
46
+ export const removeStaleStoreFileLock = async (path) => {
47
+ try {
48
+ const stats = await lstat(path);
49
+ if (stats.isFile()) {
50
+ if (!(await ownerIsDead(path)))
51
+ return false;
52
+ await unlink(path);
53
+ return true;
54
+ }
55
+ if (!stats.isDirectory())
56
+ return false;
57
+ const entries = await readdir(path);
58
+ if (entries.length === 0) {
59
+ await rmdir(path);
60
+ return true;
61
+ }
62
+ const owner = entries[0];
63
+ if (entries.length !== 1 ||
64
+ owner === undefined ||
65
+ !/^owner-[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/u.test(owner) ||
66
+ !(await ownerIsDead(join(path, owner))))
67
+ return false;
68
+ await removeOwner(path, owner);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ };
75
+ const removeOwner = async (path, owner) => {
76
+ // A successor has a different entry, so stale cleanup cannot make its directory empty.
77
+ await unlink(join(path, owner));
78
+ await rmdir(path);
79
+ };
80
+ const ownerIsDead = async (path) => {
81
+ const stats = await lstat(path);
82
+ if (!stats.isFile() || stats.size > 32)
83
+ return false;
84
+ const handle = await open(path, "r");
85
+ let bytes;
86
+ try {
87
+ bytes = await readBoundedFileBytes(handle, 32);
88
+ }
89
+ finally {
90
+ await handle.close();
91
+ }
92
+ const encoded = bytes?.toString("utf8").trim();
93
+ return (encoded !== undefined &&
94
+ /^[1-9][0-9]{0,9}$/u.test(encoded) &&
95
+ !processIsAlive(Number(encoded)));
96
+ };
97
+ const exists = async (path) => {
98
+ try {
99
+ await lstat(path);
100
+ return true;
101
+ }
102
+ catch (cause) {
103
+ if (errorCode(cause) === "ENOENT")
104
+ return false;
105
+ throw cause;
106
+ }
107
+ };
108
+ const processIsAlive = (pid) => {
109
+ try {
110
+ process.kill(pid, 0);
111
+ return true;
112
+ }
113
+ catch (cause) {
114
+ return errorCode(cause) !== "ESRCH";
115
+ }
116
+ };
117
+ const errorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
118
+ ? cause.code
119
+ : undefined;
@@ -4,8 +4,8 @@ const require = createRequire(import.meta.url);
4
4
  const HeadlessPackage = require("@xterm/headless");
5
5
  // SAFETY: the addon package is pinned with the compatible headless xterm release.
6
6
  const SerializePackage = require("@xterm/addon-serialize");
7
- /** Owns one headless terminal and serializes writes into deterministic frames. */
8
7
  /**
8
+ * Owns one headless terminal and serializes writes into deterministic frames.
9
9
  * Reconstructs bounded terminal states while raw PTY chunks remain authoritative.
10
10
  *
11
11
  * Rendered frames answer what an operator saw after control-sequence handling;
@@ -71,8 +71,7 @@ export class TerminalRenderer {
71
71
  const serializedState = this.options.normalize(this.#serializeAddon.serialize());
72
72
  const bytes = Buffer.byteLength(serializedState) +
73
73
  lines.reduce((total, line) => total + Buffer.byteLength(line), 0);
74
- if (this.#frames.length >= this.options.maxFrames ||
75
- this.#capturedBytes + bytes > this.options.maxBytes) {
74
+ if (this.#capturedBytes + bytes > this.options.maxBytes) {
76
75
  this.#truncated = true;
77
76
  return;
78
77
  }
@@ -1,7 +1,7 @@
1
+ import { parseClientConfiguration, serializeClientConfiguration, } from "./ClientConfigurationDocument.js";
1
2
  import { copyFile, lstat, readFile, realpath, rm } from "node:fs/promises";
2
3
  import { homedir } from "node:os";
3
4
  import { basename, isAbsolute, join } from "node:path";
4
- import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
5
5
  import writeFileAtomic from "write-file-atomic";
6
6
  import { z } from "zod";
7
7
  import { PRODUCT_IDENTITY } from "../identity.js";
@@ -65,9 +65,11 @@ const removeClient = async (client, fileSystem) => {
65
65
  let key;
66
66
  let servers;
67
67
  try {
68
- document = objectSchema.parse(client.format === "toml" ? parseToml(original) : JSON.parse(original));
69
- key = client.format === "toml" ? "mcp_servers" : "mcpServers";
70
- servers = optionalObject(document[key]);
68
+ ({
69
+ document,
70
+ servers,
71
+ serversKey: key,
72
+ } = parseClientConfiguration(original, client.format));
71
73
  }
72
74
  catch {
73
75
  return item(client.name, "failed", `Configuration is not valid ${client.format === "toml" ? "TOML" : "JSON"} and was not changed. Repair it, then rerun uninstall.`);
@@ -88,14 +90,9 @@ const removeClient = async (client, fileSystem) => {
88
90
  return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
89
91
  }
90
92
  try {
91
- const encoded = client.format === "toml"
92
- ? stringifyToml(document)
93
- : `${JSON.stringify(document, null, 2)}\n`;
94
- await fileSystem.writeText(transactionPath, encoded);
95
- const readback = objectSchema.parse(client.format === "toml"
96
- ? parseToml(await fileSystem.readText(transactionPath))
97
- : JSON.parse(await fileSystem.readText(transactionPath)));
98
- if (PRODUCT_IDENTITY.mcpServerKey in optionalObject(readback[key]))
93
+ await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format));
94
+ const readback = parseClientConfiguration(await fileSystem.readText(transactionPath), client.format);
95
+ if (PRODUCT_IDENTITY.mcpServerKey in readback.servers)
99
96
  throw new Error("registration readback mismatch");
100
97
  return item(client.name, "removed", `Removed registration from ${client.configPath}.`);
101
98
  }
@@ -154,8 +151,6 @@ const removeManagedPath = async (path, name, fileSystem) => {
154
151
  };
155
152
  const removeManagedSkills = async (home, fileSystem) => removeManagedPath(join(home, ".agents/skills", PRODUCT_IDENTITY.skillName), "skill", fileSystem);
156
153
  const item = (name, status, detail) => ({ name, status, detail });
157
- const objectSchema = z.record(z.string(), z.unknown());
158
- const optionalObject = (value) => value === undefined ? {} : objectSchema.parse(value);
159
154
  const registrationSchema = z
160
155
  .object({ command: z.string(), args: z.array(z.string()) })
161
156
  .passthrough();