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
@@ -1,11 +1,13 @@
1
- import { effectiveClientServer, grokServerListedDisabled, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
2
- import { access, readFile } from "node:fs/promises";
1
+ import { readClientPolicyBlock } from "./GeminiClientSettings.js";
2
+ import { effectiveClientConfiguration, readClientConfigurationFiles, } from "./ClientConfigurationFiles.js";
3
+ import { clientServerForcedEnabled, clientServerListedDisabled, effectiveClientServer, } from "./ClientConfigurationDocument.js";
4
+ import { access } from "node:fs/promises";
3
5
  import { resolve } from "node:path";
4
6
  import { z } from "zod";
5
7
  import { PRODUCT_IDENTITY } from "../identity.js";
6
8
  import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
7
9
  import { isOwnedClientRegistrationCommand, npxRegistrationCommand, } from "./ClientRegistrationIdentity.js";
8
- import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
10
+ import { clientEvidencePaths, manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
9
11
  const registrationSchema = z
10
12
  .object({
11
13
  command: z.string().min(1),
@@ -21,20 +23,18 @@ const registrationSchema = z
21
23
  /** Inspect supported client registrations without reading their environment. */
22
24
  export const readClientRegistrationStatuses = async (home, currentCommandPath = resolve(process.argv[1] ?? "unknown"), options = {}) => {
23
25
  const statuses = [];
24
- for (const client of supportedClients(home, options.platform, options.environment === undefined
25
- ? undefined
26
- : {
27
- APPDATA: options.environment.APPDATA,
28
- CLAUDE_CONFIG_DIR: options.environment.CLAUDE_CONFIG_DIR,
29
- CODEX_HOME: options.environment.CODEX_HOME,
30
- COPILOT_HOME: options.environment.COPILOT_HOME,
31
- GROK_HOME: options.environment.GROK_HOME,
32
- OPENCODE_CONFIG: options.environment.OPENCODE_CONFIG,
33
- SAND_DATA_ROOT: options.environment.SAND_DATA_ROOT,
34
- XDG_CONFIG_HOME: options.environment.XDG_CONFIG_HOME,
35
- })) {
36
- if (!(await exists(client.markerPath)) &&
37
- !(await exists(client.configPath)))
26
+ for (const client of supportedClients(home, options.platform, options.environment)) {
27
+ if (client.configPathError !== undefined) {
28
+ statuses.push({
29
+ client: client.name,
30
+ config_path: client.configPath,
31
+ command: [],
32
+ state: "invalid",
33
+ remediation: client.configPathError,
34
+ });
35
+ continue;
36
+ }
37
+ if (!(await clientEvidencePresent(client)))
38
38
  continue;
39
39
  const manualRemediation = manualRegistrationRemediation(client.name);
40
40
  if (client.format === "unsupported") {
@@ -49,8 +49,34 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
49
49
  continue;
50
50
  }
51
51
  try {
52
- const content = await readFile(client.configPath, "utf8");
53
- const parsed = parseClientConfiguration(content, client.format);
52
+ const files = await readClientConfigurationFiles(client);
53
+ if (!files.ok) {
54
+ statuses.push({
55
+ client: client.name,
56
+ config_path: client.configPath,
57
+ command: [],
58
+ state: "invalid",
59
+ remediation: files.error.detail,
60
+ });
61
+ continue;
62
+ }
63
+ const parsed = effectiveClientConfiguration(files.value);
64
+ if (parsed === undefined) {
65
+ statuses.push(unavailableStatus(client.name, client.configPath, "missing"));
66
+ continue;
67
+ }
68
+ const policy = await readClientPolicyBlock(client, parsed);
69
+ if (!policy.ok) {
70
+ statuses.push({
71
+ client: client.name,
72
+ config_path: client.configPath,
73
+ command: [],
74
+ state: "invalid",
75
+ remediation: policy.error.detail,
76
+ });
77
+ continue;
78
+ }
79
+ const policyBlock = policy.value;
54
80
  const raw = effectiveClientServer(parsed, PRODUCT_IDENTITY.mcpServerKey);
55
81
  if (raw === undefined) {
56
82
  statuses.push(unavailableStatus(client.name, client.configPath, "missing"));
@@ -61,11 +87,11 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
61
87
  registration.command,
62
88
  ...registration.args,
63
89
  ];
64
- statuses.push(configuredStatus(client.name, client.configPath, command, registrationAligned(registration, client, currentCommandPath, options.platform ?? process.platform) &&
65
- !(client.format === "grok" &&
66
- grokServerListedDisabled(parsed.document, PRODUCT_IDENTITY.mcpServerKey))
90
+ statuses.push(configuredStatus(client.name, client.configPath, command, registrationAligned(registration, client, currentCommandPath, options.platform ?? process.platform, clientServerForcedEnabled(parsed, PRODUCT_IDENTITY.mcpServerKey)) &&
91
+ !clientServerListedDisabled(parsed, PRODUCT_IDENTITY.mcpServerKey) &&
92
+ policyBlock === undefined
67
93
  ? "aligned"
68
- : "stale"));
94
+ : "stale", policyBlock));
69
95
  }
70
96
  catch (cause) {
71
97
  statuses.push(unavailableStatus(client.name, client.configPath, isMissing(cause) ? "missing" : "invalid"));
@@ -73,9 +99,10 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
73
99
  }
74
100
  return statuses.sort((left, right) => left.client.localeCompare(right.client));
75
101
  };
76
- const registrationAligned = (registration, client, currentCommandPath, platform) => {
102
+ const registrationAligned = (registration, client, currentCommandPath, platform, forcedEnabled = false) => {
77
103
  const command = [registration.command, ...registration.args];
78
- if (registration.disabled === true || registration.enabled === false)
104
+ if ((client.format !== "grok" && registration.disabled === true) ||
105
+ (registration.enabled === false && !forcedEnabled))
79
106
  return false;
80
107
  if (!isOwnedClientRegistrationCommand(command, currentCommandPath))
81
108
  return false;
@@ -85,6 +112,11 @@ const registrationAligned = (registration, client, currentCommandPath, platform)
85
112
  return false;
86
113
  if (client.format === "vscode" && registration.type !== "stdio")
87
114
  return false;
115
+ // OMP and Pi infer stdio for a command entry without an explicit type.
116
+ if ((client.format === "omp" || client.format === "pi") &&
117
+ registration.type !== undefined &&
118
+ registration.type !== "stdio")
119
+ return false;
88
120
  if (client.format === "copilot_cli" &&
89
121
  (registration.type !== "stdio" ||
90
122
  JSON.stringify(registration.tools) !== JSON.stringify(["*"])))
@@ -127,12 +159,22 @@ const parseRegistration = (value, client) => {
127
159
  throw new TypeError("Expected an stdio registration");
128
160
  if (client.format === "commandcode" && registration.transport !== "stdio")
129
161
  throw new TypeError("Expected an stdio registration");
162
+ if ((client.format === "omp" || client.format === "pi") &&
163
+ registration.type !== undefined &&
164
+ registration.type !== "stdio")
165
+ throw new TypeError("Expected an stdio registration");
130
166
  return registration;
131
167
  };
132
168
  const remediation = "Run rea setup to refresh this registration, then restart the client.";
133
- const configuredStatus = (client, configPath, command, state) => state === "aligned"
169
+ const configuredStatus = (client, configPath, command, state, policyRemediation) => state === "aligned"
134
170
  ? { client, config_path: configPath, command, state, remediation: null }
135
- : { client, config_path: configPath, command, state, remediation };
171
+ : {
172
+ client,
173
+ config_path: configPath,
174
+ command,
175
+ state,
176
+ remediation: policyRemediation ?? remediation,
177
+ };
136
178
  const unavailableStatus = (client, configPath, state) => ({
137
179
  client,
138
180
  config_path: configPath,
@@ -140,6 +182,12 @@ const unavailableStatus = (client, configPath, state) => ({
140
182
  state,
141
183
  remediation,
142
184
  });
185
+ const clientEvidencePresent = async (client) => {
186
+ for (const path of clientEvidencePaths(client))
187
+ if (await exists(path))
188
+ return true;
189
+ return false;
190
+ };
143
191
  const exists = async (path) => {
144
192
  if (path === undefined)
145
193
  return false;
@@ -43,7 +43,7 @@ export const runProviderAnalysis = async (dependencies, ...[path, tool, argument
43
43
  }));
44
44
  /** Execute managed metadata inspection in an isolated managed-only session. */
45
45
  export const runManagedProviderExecution = async (dependencies, path, tool, signal) => withProcessCancellation(signal, async (operationSignal) => {
46
- const session = dependencies.createManagedBinarySession();
46
+ const session = await dependencies.createManagedBinarySession();
47
47
  return withSessionCleanup(session, async () => {
48
48
  const opened = await session.open(path, { signal: operationSignal });
49
49
  if (!opened.ok)
@@ -70,11 +70,12 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
70
70
  const config = dependencies.readConfiguration();
71
71
  if (!config.ok)
72
72
  return cliError(config.error);
73
- const session = dependencies.createBinarySession(config.value, logger);
73
+ const session = await dependencies.createBinarySession(config.value, logger);
74
74
  return withSessionCleanup(session, async () => {
75
75
  const prepared = await prepareSnapshot({
76
76
  path,
77
77
  snapshotPath,
78
+ signal,
78
79
  ...(options.formatHint === undefined
79
80
  ? {}
80
81
  : { formatHint: options.formatHint }),
@@ -144,7 +145,7 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
144
145
  if (evidence !== undefined) {
145
146
  const recorded = session.recordEvidence(evidence);
146
147
  if (!recorded.ok)
147
- return cliError(recorded.error);
148
+ return cliError(recorded.error.retainPartialObservation(evidence));
148
149
  if (isWorkflowEvidenceTool(tool)) {
149
150
  const unknowns = recordWorkflowUnknowns({
150
151
  name: tool,
@@ -153,7 +154,7 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
153
154
  recordUnknown: (unknown) => session.recordUnknown(unknown),
154
155
  });
155
156
  if (!unknowns.ok)
156
- return cliError(unknowns.error);
157
+ return cliError(unknowns.error.retainPartialObservation(evidence));
157
158
  }
158
159
  }
159
160
  if (isWorkflowEvidenceTool(tool) &&
@@ -165,7 +166,7 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
165
166
  if (workflowRecord !== undefined) {
166
167
  const recorded = session.recordWorkflowSnapshot(workflowRecord);
167
168
  if (!recorded.ok)
168
- return cliError(recorded.error);
169
+ return cliError(recorded.error.retainPartialObservation(evidence));
169
170
  }
170
171
  }
171
172
  if (tool !== "trace_native_ui_action" &&
@@ -173,10 +174,10 @@ const runAnalysis = async (dependencies, path, tool, arguments_, options) => {
173
174
  evidence !== undefined) {
174
175
  const snapshot = session.exportAnalysisSnapshot();
175
176
  if (!snapshot.ok)
176
- return cliError(snapshot.error);
177
+ return cliError(snapshot.error.retainPartialObservation(evidence));
177
178
  const written = await writeAnalysisSnapshot(snapshot.value, snapshotPath, true);
178
179
  if (!written.ok)
179
- return cliError(written.error);
180
+ return cliError(written.error.retainPartialObservation(evidence));
180
181
  }
181
182
  return output;
182
183
  }, directAnalysisCleanupFailure);
@@ -266,7 +267,12 @@ const prepareSnapshot = async (options) => {
266
267
  const loaded = await readAnalysisSnapshot(snapshotPath);
267
268
  if (!loaded.ok)
268
269
  return loaded;
269
- const target = await parseBinaryTarget(path, process.cwd(), process.arch, undefined, options.formatHint);
270
+ const target = await parseBinaryTarget(path, {
271
+ signal: options.signal,
272
+ ...(options.formatHint === undefined
273
+ ? {}
274
+ : { formatHint: options.formatHint }),
275
+ });
270
276
  if (!target.ok)
271
277
  return target;
272
278
  if (!snapshotMatchesTarget(loaded.value.target, target.value))
@@ -3,7 +3,7 @@ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
3
3
  import { jsonValueSchema } from "../domain/jsonValue.js";
4
4
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
5
  import { err } from "../domain/result.js";
6
- import { analysisErrorWithCleanupFailure } from "./binary/AnalysisClientCleanup.js";
6
+ import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
7
7
  /** Await one-shot cleanup and retain either the outcome or both failures. */
8
8
  export const withSessionCleanup = async (session, operation, onCleanupFailure) => {
9
9
  let value;
@@ -39,7 +39,6 @@ export const directAnalysisCleanupFailure = (output, error) => {
39
39
  "execution_failure" in primary.data.details
40
40
  ? (primary.data.details.execution_failure ?? primary.data.code)
41
41
  : primary.data.code,
42
- primary_error: projection,
43
42
  cleanup_error: cleanup,
44
43
  },
45
44
  };
@@ -2,11 +2,12 @@ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
2
2
  import { jsonObjectSchema } from "../domain/jsonValue.js";
3
3
  import { createServerIdentity } from "../serverIdentity.js";
4
4
  import { silentLogger } from "../logger.js";
5
- const runSessionStatus = async (dependencies, logger = silentLogger) => {
5
+ /** Read target-free provider status and operation availability. */
6
+ export const runSessionStatus = async (dependencies, logger = silentLogger) => {
6
7
  const config = dependencies.readConfiguration();
7
8
  if (!config.ok)
8
9
  return { error: projectAnalysisError(config.error) };
9
- const session = dependencies.createBinarySession(config.value, logger);
10
+ const session = await dependencies.createBinarySession(config.value, logger);
10
11
  try {
11
12
  return {
12
13
  ...jsonObjectSchema.parse(session.status()),
@@ -19,7 +20,3 @@ const runSessionStatus = async (dependencies, logger = silentLogger) => {
19
20
  await session.close();
20
21
  }
21
22
  };
22
- /** List binary-session provider candidates and auxiliary operation availability. */
23
- export const runProviderStatus = (dependencies, logger = silentLogger) => runSessionStatus(dependencies, logger);
24
- /** List binary-session operation descriptors; this is not the full MCP catalog. */
25
- export const runCapabilityStatus = (dependencies, logger = silentLogger) => runSessionStatus(dependencies, logger);
@@ -1,13 +1,14 @@
1
1
  import { constants } from "node:fs";
2
- import { access, readFile, readdir } from "node:fs/promises";
2
+ import { access, readdir, stat } from "node:fs/promises";
3
3
  import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
4
4
  import { join } from "node:path";
5
5
  import { analysisErrorRemediationAction } from "../domain/analysisErrorPresentation.js";
6
+ import { BinaryTargetError } from "../domain/configurationErrors.js";
6
7
  import { parseBinaryTarget } from "./BinaryTargetResolver.js";
7
8
  import { execFileOutput } from "../process/ExecFileOutput.js";
8
9
  import { installedCaskAppdir, probeHomebrew } from "./homebrew.js";
9
10
  import { linuxHopperBinarySupported, linuxSharedLibrariesAvailable, readLinuxDistribution, } from "./LinuxHopper.js";
10
- import { canonicalSkillNeedsInstall } from "./SetupSkill.js";
11
+ import { readInstalledSkillIdentity, } from "./SetupSkill.js";
11
12
  import { CATALOG_IDENTITY } from "../catalogIdentity.js";
12
13
  import { PRODUCT_IDENTITY, SDK_IDENTITY } from "../identity.js";
13
14
  import { readClientRegistrationStatuses, } from "./ClientRegistrationStatus.js";
@@ -21,8 +22,9 @@ export const DOCTOR_PROVIDER_IDS = ["hopper", "ghidra", "ida"];
21
22
  * or an agent consuming the structured result.
22
23
  */
23
24
  export const runDoctor = async (target, host = systemDoctorHost(), requestedScope) => {
25
+ const scope = normalizeDoctorScope(requestedScope, target);
24
26
  const { checks: diagnosticChecks, hopperPath, providerInspections, } = await collectDoctorDiagnostics(target, host);
25
- const identity = await collectDoctorIdentity(host);
27
+ const identity = await collectDoctorIdentity(host, scope);
26
28
  const checks = [...diagnosticChecks, ...identity.checks];
27
29
  const providers = {
28
30
  hopperAvailable: hopperPath !== undefined &&
@@ -33,7 +35,6 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
33
35
  providerInspections,
34
36
  };
35
37
  const environmentHealthy = doctorHealthy(checks, providers);
36
- const scope = normalizeDoctorScope(requestedScope, target);
37
38
  const scoped = scopeDoctorChecks({
38
39
  checks,
39
40
  registrations: identity.value.registrations,
@@ -53,11 +54,14 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
53
54
  identity: identity.value,
54
55
  };
55
56
  };
56
- const collectDoctorIdentity = async (host) => {
57
+ const collectDoctorIdentity = async (host, scope) => {
57
58
  const installationPaths = (await host.installationPaths?.()) ?? [];
58
- const installedSkillIdentity = await host.installedSkillIdentity?.();
59
- const skillAligned = skillIdentityAligned(installedSkillIdentity);
60
59
  const registrations = (await host.clientRegistrations?.()) ?? [];
60
+ const skillClientIds = scope.mode === "audit-wide"
61
+ ? registrations.map(({ client }) => client)
62
+ : scope.clients;
63
+ const installedSkillIdentity = await host.installedSkillIdentity?.(skillClientIds);
64
+ const skillAligned = skillIdentityAligned(installedSkillIdentity);
61
65
  return {
62
66
  checks: [
63
67
  ...(skillAligned ? [] : [skillIdentityCheck(installedSkillIdentity)]),
@@ -81,7 +85,6 @@ const collectDoctorIdentity = async (host) => {
81
85
  skill: {
82
86
  installed_version: installedSkillIdentity?.version ?? null,
83
87
  installed_tool_count: installedSkillIdentity?.toolCount ?? null,
84
- installed_catalog_digest: installedSkillIdentity?.catalogDigest ?? null,
85
88
  state: installedSkillIdentity === undefined
86
89
  ? "missing"
87
90
  : skillAligned
@@ -137,10 +140,16 @@ export const systemDoctorHost = (options = {}) => {
137
140
  macosVersion: () => readMacosVersion(hostExecFileOutput, commandEnvironment),
138
141
  linuxDistribution: readLinuxDistribution,
139
142
  async validTarget(path) {
140
- return (await parseBinaryTarget(path, process.cwd(), architecture)).ok;
143
+ return (await parseBinaryTarget(path, {
144
+ cwd: process.cwd(),
145
+ hostArchitecture: architecture,
146
+ })).ok;
141
147
  },
142
148
  async inspectTarget(path) {
143
- const result = await parseBinaryTarget(path, process.cwd(), architecture);
149
+ const result = await parseBinaryTarget(path, {
150
+ cwd: process.cwd(),
151
+ hostArchitecture: architecture,
152
+ });
144
153
  if (result.ok)
145
154
  return {
146
155
  name: "target",
@@ -149,18 +158,19 @@ export const systemDoctorHost = (options = {}) => {
149
158
  detail: path,
150
159
  };
151
160
  const error = result.error;
161
+ const targetError = error instanceof BinaryTargetError ? error : undefined;
152
162
  return {
153
163
  name: "target",
154
164
  ok: false,
155
- classification: error.constraint === "directory_requires_file"
165
+ classification: targetError?.constraint === "directory_requires_file"
156
166
  ? "unsupported_target"
157
167
  : "config_drift",
158
168
  detail: path,
159
169
  details: {
160
- reason: error.reason,
161
- ...(error.constraint === undefined
170
+ reason: targetError?.reason ?? error.message,
171
+ ...(targetError?.constraint === undefined
162
172
  ? {}
163
- : { constraint: error.constraint }),
173
+ : { constraint: targetError.constraint }),
164
174
  },
165
175
  remediation: analysisErrorRemediationAction(error),
166
176
  };
@@ -218,7 +228,7 @@ export const systemDoctorHost = (options = {}) => {
218
228
  return [];
219
229
  }
220
230
  },
221
- installedSkillIdentity: () => installedSkillIdentity(homeDirectory),
231
+ installedSkillIdentity: (clientIds) => readInstalledSkillIdentity(homeDirectory, clientIds, environment, platform),
222
232
  clientRegistrations: () => readClientRegistrationStatuses(homeDirectory, undefined, {
223
233
  platform,
224
234
  environment,
@@ -238,6 +248,8 @@ const readMacosVersion = async (run, options) => {
238
248
  const executableAvailable = async (path, platform, run, options) => {
239
249
  try {
240
250
  await access(path, constants.X_OK);
251
+ if (!(await stat(path)).isFile())
252
+ return false;
241
253
  if (platform !== "linux")
242
254
  return true;
243
255
  const linked = await run("ldd", [path], options);
@@ -272,25 +284,6 @@ const manualHopperPaths = async (home) => {
272
284
  }
273
285
  return paths;
274
286
  };
275
- const readInstalledSkill = (home) => readFile(join(home, ".agents/skills", PRODUCT_IDENTITY.skillName, "SKILL.md"), "utf8");
276
- const installedSkillIdentity = async (home) => {
277
- try {
278
- const content = await readInstalledSkill(home);
279
- const countText = /^\s{2}tool_count:\s*(\d+)\s*$/mu.exec(content)?.[1];
280
- return {
281
- canonical: !(await canonicalSkillNeedsInstall(home)),
282
- version: /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(content)?.[1] ?? null,
283
- toolCount: countText === undefined ? null : Number.parseInt(countText, 10),
284
- catalogDigest: /^\s{2}catalog_digest:\s*"([a-f0-9]{64})"\s*$/mu.exec(content)?.[1] ??
285
- null,
286
- };
287
- }
288
- catch (cause) {
289
- // best-effort cleanup: optional skill probing; failure means unknown.
290
- void cause;
291
- return undefined;
292
- }
293
- };
294
287
  const uniqueLines = (value) => [
295
288
  ...new Set(value
296
289
  .split(/\r?\n/u)
@@ -65,7 +65,7 @@ const hostCheck = async (host) => {
65
65
  ? `${host.platform} ${host.architecture}`
66
66
  : `${linuxDistribution.id} ${linuxDistribution.versionId ?? "unknown"}`);
67
67
  return check("host", supported, detail, {
68
- remediation: "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, CachyOS, and the experimental Windows x64 Ghidra P0 boundary.",
68
+ remediation: "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, Nobara 44+, 64-bit Arch Linux, CachyOS, Omarchy, and the experimental Windows x64 Ghidra P0 boundary.",
69
69
  classification: "unsupported_host",
70
70
  });
71
71
  };
@@ -3,22 +3,17 @@ import {} from "../domain/analysisErrorBase.js";
3
3
  import { jsonValueSchema } from "../domain/jsonValue.js";
4
4
  import { err, ok } from "../domain/result.js";
5
5
  import { compareBundles } from "../domain/bundleComparison.js";
6
- import { EvidenceLedger } from "./investigation/EvidenceLedger.js";
7
6
  import { readEvidenceBundle, writeEvidenceBundle, } from "./EvidenceBundleFiles.js";
8
- /** Validate and merge one bundle using the session Evidence ledger. */
7
+ /** Validate a standalone bundle and report its complete record/revision counts. */
9
8
  export const importEvidenceBundleCommand = async (path) => {
10
9
  const loaded = await readEvidenceBundle(path);
11
10
  if (!loaded.ok)
12
11
  return loaded;
13
- const ledger = createLedger();
14
- const imported = ledger.import(loaded.value);
15
- return imported.ok
16
- ? ok({
17
- imported: imported.value.recordsAdded,
18
- unknowns_added: imported.value.unknownsAdded,
19
- total: ledger.export().records.length,
20
- })
21
- : imported;
12
+ return ok({
13
+ imported: loaded.value.records.length,
14
+ unknowns_added: loaded.value.unknowns.length,
15
+ total: loaded.value.records.length,
16
+ });
22
17
  };
23
18
  /** Validate a source bundle and atomically export canonical bytes. */
24
19
  export const exportEvidenceBundleCommand = async (sourcePath, outputPath, overwrite) => {
@@ -46,7 +41,6 @@ export const compareEvidenceBundlesCommand = async (input) => {
46
41
  }));
47
42
  }
48
43
  };
49
- const createLedger = () => new EvidenceLedger();
50
44
  const projectWrite = (bundle, written) => written.ok
51
45
  ? ok({
52
46
  path: written.value.path,
@@ -1,7 +1,7 @@
1
1
  import { describeEvidenceBundleFailure, describeValidationFailure, parseEvidenceBundle, } from "../domain/evidenceBundle.js";
2
2
  import { EvidenceFileError, EvidenceIntegrityError, } from "../domain/evidenceErrors.js";
3
3
  import { err, ok } from "../domain/result.js";
4
- import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
4
+ import { AnalysisCancelledError, } from "../domain/analysisErrorCore.js";
5
5
  import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
6
6
  import { bufferedJsonParts, canonicalJsonParts, } from "../domain/jsonSerialization.js";
7
7
  import { readJsonFile, writeTextParts } from "./JsonFiles.js";
@@ -0,0 +1,139 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { stripComments } from "jsonc-parser";
4
+ import { z } from "zod";
5
+ import { err, ok } from "../domain/result.js";
6
+ import { PRODUCT_IDENTITY } from "../identity.js";
7
+ import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
8
+ import { clientConfigurationValuesEqual, clientRegistrationEntry, geminiServerPolicyBlock, parseGeminiMcpPolicy, } from "./ClientConfigurationDocument.js";
9
+ import { readConfigurationFile, readConfigurationText, } from "./ClientConfigurationFiles.js";
10
+ const folderTrustSchema = z
11
+ .object({
12
+ security: z
13
+ .object({
14
+ folderTrust: z
15
+ .object({ enabled: z.boolean().optional() })
16
+ .passthrough()
17
+ .optional(),
18
+ })
19
+ .passthrough()
20
+ .optional(),
21
+ })
22
+ .passthrough();
23
+ const trustRulesSchema = z.record(z.string(), z.enum(["TRUST_FOLDER", "TRUST_PARENT", "DO_NOT_TRUST"]));
24
+ const sourceFailure = (path, cause) => ({
25
+ kind: "malformed",
26
+ path,
27
+ detail: `Gemini settings in ${path} are malformed: ${cause instanceof Error ? cause.message : String(cause)}`,
28
+ });
29
+ // Gemini resolves symlinks when possible and compares macOS/Windows paths without case.
30
+ const normalizedPath = async (path, platform) => {
31
+ const physical = await realpath(path).catch(() => path);
32
+ const absolute = resolve(physical).replaceAll("\\", "/");
33
+ return platform === "win32" || platform === "darwin"
34
+ ? absolute.toLowerCase()
35
+ : absolute;
36
+ };
37
+ const workspaceTrusted = async (settings, sources) => {
38
+ let enabled = true;
39
+ for (const { path, document } of sources) {
40
+ const parsed = folderTrustSchema.safeParse(document.document);
41
+ if (!parsed.success)
42
+ return err(sourceFailure(path, parsed.error));
43
+ enabled = parsed.data.security?.folderTrust?.enabled ?? enabled;
44
+ }
45
+ if (settings.trustOverride !== undefined)
46
+ return ok(settings.trustOverride);
47
+ if (!enabled)
48
+ return ok(true);
49
+ const text = await readConfigurationText(settings.trustedFoldersPath);
50
+ if (!text.ok)
51
+ return text;
52
+ if (text.value === undefined)
53
+ return ok(false);
54
+ let rules;
55
+ try {
56
+ // Gemini strips comments, but rejects trailing commas, BOMs and invalid trust levels.
57
+ rules = trustRulesSchema.parse(JSON.parse(stripComments(text.value)));
58
+ }
59
+ catch (cause) {
60
+ return err(sourceFailure(settings.trustedFoldersPath, cause));
61
+ }
62
+ const workspace = await normalizedPath(settings.workspaceDirectory, settings.platform);
63
+ let longest = -1;
64
+ let trusted = false;
65
+ for (const [path, level] of Object.entries(rules)) {
66
+ const effective = await normalizedPath(level === "TRUST_PARENT" ? dirname(path) : path, settings.platform);
67
+ if ((workspace === effective ||
68
+ workspace.startsWith(effective.endsWith("/") ? effective : `${effective}/`)) &&
69
+ path.length > longest) {
70
+ longest = path.length;
71
+ trusted = level !== "DO_NOT_TRUST";
72
+ }
73
+ }
74
+ return ok(trusted);
75
+ };
76
+ /** Check effective Gemini scopes while preserving their authority and source identity. */
77
+ export const readClientPolicyBlock = async (client, userDocument, desiredRegistration) => {
78
+ if (client.name !== "gemini_cli" || client.geminiSettings === undefined)
79
+ return ok(undefined);
80
+ const settings = client.geminiSettings;
81
+ const sources = [];
82
+ const higher = [];
83
+ for (const path of [
84
+ settings.defaultsPath,
85
+ client.configPath,
86
+ settings.systemPath,
87
+ ]) {
88
+ const parsed = path === client.configPath && userDocument !== undefined
89
+ ? ok(userDocument)
90
+ : await readConfigurationFile(path, "json");
91
+ if (!parsed.ok)
92
+ return parsed;
93
+ if (parsed.value !== undefined)
94
+ sources.push({ path, document: parsed.value });
95
+ }
96
+ const workspace = await normalizedPath(settings.workspaceDirectory, settings.platform);
97
+ const home = await normalizedPath(dirname(dirname(client.configPath)), settings.platform);
98
+ if (workspace !== home) {
99
+ const path = resolve(settings.workspaceDirectory, ".gemini", "settings.json");
100
+ const document = await readConfigurationFile(path, "json");
101
+ if (!document.ok)
102
+ return document;
103
+ if (document.value !== undefined) {
104
+ const trusted = await workspaceTrusted(settings, sources);
105
+ if (!trusted.ok)
106
+ return trusted;
107
+ if (trusted.value) {
108
+ const source = { path, document: document.value };
109
+ const systemIndex = sources.findIndex((item) => item.path === settings.systemPath);
110
+ sources.splice(systemIndex < 0 ? sources.length : systemIndex, 0, source);
111
+ higher.push(source);
112
+ }
113
+ }
114
+ }
115
+ const system = sources.find(({ path }) => path === settings.systemPath);
116
+ if (system !== undefined)
117
+ higher.push(system);
118
+ const policies = [];
119
+ for (const { path, document } of sources) {
120
+ try {
121
+ policies.push(parseGeminiMcpPolicy(document));
122
+ }
123
+ catch (cause) {
124
+ return err(sourceFailure(path, cause));
125
+ }
126
+ }
127
+ const policy = geminiServerPolicyBlock(policies, PRODUCT_IDENTITY.mcpServerKey);
128
+ if (policy !== undefined)
129
+ return ok(`${policy} Settings sources: ${sources.map(({ path }) => path).join(", ")}.`);
130
+ // mcpServers uses shallow merge: the entire same-name definition is replaced.
131
+ const override = higher.findLast(({ document }) => Object.hasOwn(document.servers, PRODUCT_IDENTITY.mcpServerKey));
132
+ const desired = desiredRegistration ??
133
+ userDocument?.servers[PRODUCT_IDENTITY.mcpServerKey] ??
134
+ clientRegistrationEntry("json", npxRegistrationCommand(), {});
135
+ if (override !== undefined &&
136
+ !clientConfigurationValuesEqual(override.document.servers[PRODUCT_IDENTITY.mcpServerKey], desired))
137
+ return ok(`Gemini mcpServers.${PRODUCT_IDENTITY.mcpServerKey} in ${override.path} overrides the user registration. Review that settings file before rerunning setup; REA does not modify system or workspace settings.`);
138
+ return ok(undefined);
139
+ };