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,9 +1,12 @@
1
1
  import { constants } from "node:fs";
2
2
  import { createHash } from "node:crypto";
3
- import { access, open, realpath, stat, } from "node:fs/promises";
3
+ import { access, lstat, realpath, stat, } from "node:fs/promises";
4
4
  import { extname, isAbsolute, resolve } from "node:path";
5
5
  import { BinaryTargetError } from "../domain/configurationErrors.js";
6
+ import { openRegularFile, sameRegularFileState, } from "../filesystem/RegularFile.js";
7
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
6
8
  import { err, ok } from "../domain/result.js";
9
+ import { readMipsElfAbiFlags } from "./MipsElfAbiFlags.js";
7
10
  import { resolveAppBundleExecutable, } from "./AppBundleExecutable.js";
8
11
  import { validateDosComLength, } from "../domain/dosCom.js";
9
12
  import { mzWindowsHeaderOffset } from "../domain/dosMz.js";
@@ -14,30 +17,41 @@ import { parseExecutableHeader, parsePeRecord, } from "../domain/binaryTarget.js
14
17
  * FAT Mach-O inputs select only a host-compatible architecture so setup remains
15
18
  * non-interactive; unsupported or ambiguous inputs are returned as typed errors.
16
19
  */
17
- export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitecture = process.arch, targetKind, formatHint) => {
20
+ export const parseBinaryTarget = async (input, options = {}) => {
21
+ const cwd = options.cwd ?? process.cwd();
22
+ const hostArchitecture = options.hostArchitecture ?? process.arch;
23
+ const { targetKind, formatHint, signal } = options;
18
24
  const candidate = isAbsolute(input) ? input : resolve(cwd, input);
19
25
  try {
26
+ throwIfTargetResolutionCancelled(signal);
20
27
  await access(candidate, constants.R_OK);
28
+ throwIfTargetResolutionCancelled(signal);
21
29
  const canonical = await realpath(candidate);
30
+ throwIfTargetResolutionCancelled(signal);
22
31
  const resolved = await resolveAppBundle(canonical);
32
+ throwIfTargetResolutionCancelled(signal);
23
33
  if (!resolved.ok)
24
34
  return err(resolved.error);
25
35
  const { executable: path, infoPlist } = resolved.value;
26
36
  const bundle = infoPlist === undefined ? {} : { bundleInfoPlist: infoPlist };
27
- const handle = await open(path, "r");
37
+ const handle = await openRegularFile(path, {
38
+ symlinks: "reject",
39
+ signal,
40
+ });
28
41
  try {
29
- if (!(await handle.stat()).isFile())
30
- return err(new BinaryTargetError(path, "target is not a regular file"));
42
+ throwIfTargetResolutionCancelled(signal);
43
+ const metadata = await handle.stat();
44
+ throwIfTargetResolutionCancelled(signal);
31
45
  if (formatHint === "dos-com") {
32
46
  if (targetKind !== undefined && targetKind !== "executable")
33
47
  return err(new BinaryTargetError(path, "DOS COM format requires an executable target kind"));
34
- const length = validateDosComLength((await handle.stat()).size);
48
+ const length = validateDosComLength(metadata.size);
35
49
  if (!length.ok)
36
50
  return err(new BinaryTargetError(path, length.error));
37
51
  return ok({
38
52
  path,
39
53
  sourcePath: canonical,
40
- sha256: await sha256Handle(handle),
54
+ sha256: await sha256Handle(handle, path, metadata, signal),
41
55
  kind: "executable",
42
56
  format: "dos-com",
43
57
  architecture: "x86",
@@ -49,29 +63,29 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
49
63
  return ok({
50
64
  path,
51
65
  sourcePath: process.platform === "win32" ? candidate : canonical,
52
- sha256: await sha256Handle(handle),
66
+ sha256: await sha256Handle(handle, path, metadata, signal),
53
67
  kind: "database",
54
68
  format: "analysis-database",
55
69
  });
56
- const artifactFormat = await detectArtifactFormat(path, handle);
70
+ const artifactFormat = await detectArtifactFormat(path, handle, signal);
57
71
  if (artifactFormat !== undefined) {
58
72
  const identity = {
59
73
  path,
60
74
  sourcePath: process.platform === "win32" ? candidate : canonical,
61
- sha256: await sha256Handle(handle),
75
+ sha256: await sha256Handle(handle, path, metadata, signal),
62
76
  };
63
77
  return isArchiveFormat(artifactFormat)
64
78
  ? ok({ ...identity, kind: "archive", format: artifactFormat })
65
79
  : ok({ ...identity, kind: "artifact", format: artifactFormat });
66
80
  }
67
- const detected = await readExecutableMetadata(handle, hostArchitecture);
81
+ const detected = await readExecutableMetadata(handle, hostArchitecture, signal);
68
82
  if (!detected.ok)
69
83
  return err(new BinaryTargetError(path, detected.error));
70
84
  return ok({
71
85
  path,
72
86
  sourcePath: process.platform === "win32" ? candidate : canonical,
73
87
  ...bundle,
74
- sha256: await sha256Handle(handle),
88
+ sha256: await sha256Handle(handle, path, metadata, signal),
75
89
  kind: "executable",
76
90
  ...detected.value,
77
91
  });
@@ -81,6 +95,10 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
81
95
  }
82
96
  }
83
97
  catch (cause) {
98
+ if (cause instanceof AnalysisCancelledError)
99
+ return err(cause);
100
+ if (cause instanceof BinaryTargetError)
101
+ return err(cause);
84
102
  if (!(cause instanceof Error))
85
103
  throw cause;
86
104
  const code = filesystemErrorCode(cause);
@@ -103,14 +121,24 @@ const targetFailureReason = (code, detail) => {
103
121
  return `permission denied while reading target: ${detail}`;
104
122
  case "EISDIR":
105
123
  return `target is a directory, not a readable file: ${detail}`;
124
+ case "ENOTFILE":
125
+ return "target is not a regular file";
126
+ case "ELOOP":
127
+ return `target changed while being opened: ${detail}`;
106
128
  default:
107
129
  return `target could not be read (${code}): ${detail}`;
108
130
  }
109
131
  };
110
- const detectArtifactFormat = async (path, handle) => {
132
+ const throwIfTargetResolutionCancelled = (signal) => {
133
+ if (signal?.aborted === true)
134
+ throw new AnalysisCancelledError("resolve_binary_target");
135
+ };
136
+ const detectArtifactFormat = async (path, handle, signal) => {
137
+ throwIfTargetResolutionCancelled(signal);
111
138
  const lower = path.toLowerCase();
112
139
  const magic = Buffer.alloc(8);
113
140
  const observed = await handle.read(magic, 0, magic.length, 0);
141
+ throwIfTargetResolutionCancelled(signal);
114
142
  if (hasZipSignature(magic.subarray(0, observed.bytesRead))) {
115
143
  return zipPackageFormatForPath(lower) ?? "zip";
116
144
  }
@@ -122,10 +150,13 @@ const detectArtifactFormat = async (path, handle) => {
122
150
  magic.subarray(0, 4).toString("ascii") === "xar!")
123
151
  return "pkg";
124
152
  if (lower.endsWith(".dmg")) {
153
+ throwIfTargetResolutionCancelled(signal);
125
154
  const size = (await handle.stat()).size;
155
+ throwIfTargetResolutionCancelled(signal);
126
156
  if (size >= 512) {
127
157
  const trailer = Buffer.alloc(4);
128
158
  const read = await handle.read(trailer, 0, trailer.length, size - 512);
159
+ throwIfTargetResolutionCancelled(signal);
129
160
  if (read.bytesRead === 4 && trailer.toString("ascii") === "koly")
130
161
  return "dmg";
131
162
  }
@@ -142,17 +173,27 @@ const namedArtifactFormat = (lowerPath) => {
142
173
  return /\.(?:m?js|cjs)$/u.test(lowerPath) ? "javascript" : undefined;
143
174
  };
144
175
  const isArchiveFormat = (format) => ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(format);
145
- const sha256Handle = async (handle) => {
176
+ const sha256Handle = async (handle, path, initial, signal) => {
146
177
  const hash = createHash("sha256");
147
178
  const chunk = Buffer.allocUnsafe(64 * 1024);
148
179
  let position = 0;
149
180
  while (true) {
150
- const observed = await handle.read(chunk, 0, chunk.length, position);
181
+ throwIfTargetResolutionCancelled(signal);
182
+ const observed = await handle.read(chunk, 0, Math.min(chunk.length, initial.size - position + 1), position);
183
+ throwIfTargetResolutionCancelled(signal);
151
184
  if (observed.bytesRead === 0)
152
185
  break;
153
186
  hash.update(chunk.subarray(0, observed.bytesRead));
154
187
  position += observed.bytesRead;
188
+ if (position > initial.size)
189
+ throw new BinaryTargetError(path, "target grew while being read");
155
190
  }
191
+ throwIfTargetResolutionCancelled(signal);
192
+ const [opened, currentPath] = await Promise.all([handle.stat(), lstat(path)]);
193
+ if (!sameRegularFileState(initial, opened) ||
194
+ !sameRegularFileState(initial, currentPath) ||
195
+ position !== initial.size)
196
+ throw new BinaryTargetError(path, "target changed while being read");
156
197
  return hash.digest("hex");
157
198
  };
158
199
  const resolveAppBundle = async (path) => {
@@ -165,19 +206,22 @@ const resolveAppBundle = async (path) => {
165
206
  }));
166
207
  return resolveAppBundleExecutable(path);
167
208
  };
168
- const readExecutableMetadata = async (handle, hostArchitecture) => {
209
+ const readExecutableMetadata = async (handle, hostArchitecture, signal) => {
210
+ throwIfTargetResolutionCancelled(signal);
169
211
  const prefix = Buffer.alloc(4096);
170
212
  const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
213
+ throwIfTargetResolutionCancelled(signal);
171
214
  const bytes = prefix.subarray(0, prefixRead.bytesRead);
172
215
  // Header commitments such as Mach-O load commands and FAT slices are
173
216
  // checked against the whole file, not the probed prefix.
174
217
  const fileSize = (await handle.stat()).size;
218
+ throwIfTargetResolutionCancelled(signal);
175
219
  if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
176
220
  const offset = mzWindowsHeaderOffset(bytes);
177
221
  if (offset !== null) {
178
222
  if (offset < 64)
179
223
  return err("invalid Windows new-header offset in MZ image");
180
- return readPeMetadata(handle, offset);
224
+ return readPeMetadata(handle, offset, signal);
181
225
  }
182
226
  // MZ relocation records may extend past the initial probe; their format
183
227
  // bounds are at most 65535 records inside a 65535-paragraph header.
@@ -190,6 +234,7 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
190
234
  tableEnd <= fileSize) {
191
235
  const table = Buffer.alloc(tableEnd);
192
236
  const observed = await handle.read(table, 0, table.length, 0);
237
+ throwIfTargetResolutionCancelled(signal);
193
238
  return parseExecutableHeader(table.subarray(0, observed.bytesRead), hostArchitecture, fileSize);
194
239
  }
195
240
  return parseExecutableHeader(bytes, hostArchitecture, fileSize);
@@ -203,15 +248,35 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
203
248
  if (count <= 128 && required > bytes.length) {
204
249
  const header = Buffer.alloc(required);
205
250
  const headerRead = await handle.read(header, 0, header.length, 0);
251
+ throwIfTargetResolutionCancelled(signal);
206
252
  return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture, fileSize);
207
253
  }
208
254
  }
209
255
  }
210
- return parseExecutableHeader(bytes, hostArchitecture, fileSize);
256
+ const parsed = parseExecutableHeader(bytes, hostArchitecture, fileSize);
257
+ if (!parsed.ok ||
258
+ parsed.value.architecture !== "mips" ||
259
+ parsed.value.mips.elfClass !== 32)
260
+ return parsed;
261
+ const abiFlags = await readMipsElfAbiFlags(handle, parsed.value.mips, () => throwIfTargetResolutionCancelled(signal));
262
+ if (!abiFlags.ok)
263
+ return abiFlags;
264
+ return ok({
265
+ ...parsed.value,
266
+ mips: {
267
+ ...parsed.value.mips,
268
+ abiFlags: abiFlags.value.abiFlags,
269
+ ...(abiFlags.value.limitations.length === 0
270
+ ? {}
271
+ : { limitations: abiFlags.value.limitations }),
272
+ },
273
+ });
211
274
  };
212
- const readPeMetadata = async (handle, offset) => {
275
+ const readPeMetadata = async (handle, offset, signal) => {
276
+ throwIfTargetResolutionCancelled(signal);
213
277
  const fileHeader = Buffer.alloc(24);
214
278
  const fileHeaderRead = await handle.read(fileHeader, 0, fileHeader.length, offset);
279
+ throwIfTargetResolutionCancelled(signal);
215
280
  if (fileHeaderRead.bytesRead !== fileHeader.length)
216
281
  return err("invalid or truncated PE header");
217
282
  const signature = fileHeader.toString("ascii", 0, 2);
@@ -222,6 +287,7 @@ const readPeMetadata = async (handle, offset) => {
222
287
  return err("invalid PE optional header size");
223
288
  const record = Buffer.alloc(24 + optionalHeaderSize);
224
289
  const recordRead = await handle.read(record, 0, record.length, offset);
290
+ throwIfTargetResolutionCancelled(signal);
225
291
  return recordRead.bytesRead === record.length
226
292
  ? parsePeRecord(record)
227
293
  : err("invalid or truncated PE header");
@@ -1,9 +1,9 @@
1
- import { canonicalDigest } from "../domain/comparisonSemantics.js";
1
+ import { digestCanonicalValue } from "../domain/canonicalDigest.js";
2
2
  import { createEvidence, } from "../domain/evidence.js";
3
3
  import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
4
4
  const browserScenarioParameters = (scenario) => ({
5
5
  ...jsonObjectSchema.parse(scenario),
6
- scenario_sha256: canonicalDigest(scenario, "Browser scenario"),
6
+ scenario_sha256: digestCanonicalValue(scenario, "Browser scenario"),
7
7
  });
8
8
  /** Create Evidence without retaining resolved scenario secret values. */
9
9
  export const createBrowserScenarioEvidence = (scenario, capture, provider) => createEvidence(undefined, provider, {
@@ -203,7 +203,7 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
203
203
  ? { reason: "available", remediation: null }
204
204
  : {
205
205
  reason: "provider_missing",
206
- remediation: "On Linux x64, provide an absolute REA_WAKARU_COMMAND for Wakaru 1.13.0 and util-linux prlimit. No binary target is required.",
206
+ remediation: "On Linux x64, provide an absolute REA_WAKARU_COMMAND for Wakaru ^1.13.0 (verified with 1.14.0) and util-linux prlimit; see docs/javascript-recovery.md#install-wakaru. No binary target is required.",
207
207
  };
208
208
  if (name === "inspect_binary_layout")
209
209
  return policy.binaryLayoutEnabled === true
@@ -212,6 +212,8 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
212
212
  reason: "provider_missing",
213
213
  remediation: "On Linux x64, set absolute REA_PWNTOOLS_PYTHON to caller-supplied Python with pwntools 4.15.0. No active binary target is required.",
214
214
  };
215
+ if (name === "inspect_pe_resources")
216
+ return { reason: "available", remediation: null };
215
217
  if (name === "inspect_evm_interface")
216
218
  return policy.evmInterfaceEnabled === true
217
219
  ? { reason: "available", remediation: null }
@@ -247,6 +249,14 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
247
249
  remediation: policy.androidAnalysisAvailability?.reason ??
248
250
  "Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux, macOS, or Windows x64 with its matching bundled native controls.",
249
251
  };
252
+ if (kind === "jeb-provider")
253
+ return policy.jebAnalysisAvailability?.status === "available"
254
+ ? { reason: "available", remediation: null }
255
+ : {
256
+ reason: "provider_missing",
257
+ remediation: policy.jebAnalysisAvailability?.reason ??
258
+ "Start a JEB client serving MCP (GUI client, or headless via its programmatic launcher) and point REA_JEB_MCP_URL at it (default http://127.0.0.1:8425/mcp). REA does not install or launch JEB.",
259
+ };
250
260
  const browser = browserProviderAvailability(name, kind, policy);
251
261
  if (browser !== null)
252
262
  return browser;
@@ -1,4 +1,5 @@
1
1
  import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
2
+ import { parse as parseYaml, parseDocument as parseYamlDocument, stringify as stringifyYaml, } from "yaml";
2
3
  import { isDeepStrictEqual } from "node:util";
3
4
  import { applyEdits, findNodeAtLocation, modify, parse as parseJsonc, parseTree, printParseErrorCode, } from "jsonc-parser";
4
5
  import { z } from "zod";
@@ -20,6 +21,7 @@ export const clientConfigurationServersKey = (format) => {
20
21
  switch (format) {
21
22
  case "toml":
22
23
  case "grok":
24
+ case "hermes":
23
25
  return "mcp_servers";
24
26
  case "opencode":
25
27
  return "mcp";
@@ -37,6 +39,14 @@ const isEmptyClientConfigurationText = (text) => text.replace(/^\uFEFF/, "").tri
37
39
  const parseDocument = (text, format) => {
38
40
  if (format === "toml" || format === "grok")
39
41
  return objectSchema.parse(parseToml(text));
42
+ // Pi loads `mcp.json` with a strict `JSON.parse` and no BOM tolerance, so
43
+ // comments, trailing commas, a BOM, or an empty existing file must be
44
+ // rejected instead of registering into a document Pi cannot load.
45
+ if (format === "pi")
46
+ return objectSchema.parse(JSON.parse(text));
47
+ // Hermes stores MCP servers in `mcp_servers` inside a YAML document.
48
+ if (format === "hermes")
49
+ return objectSchema.parse(parseYaml(text));
40
50
  // An empty file, which some clients create before any server is added,
41
51
  // holds no settings to preserve.
42
52
  if (isEmptyClientConfigurationText(text))
@@ -858,6 +868,33 @@ const tomlServerEntry = (document, serverKey) => {
858
868
  /** Whether Grok Build's root disable list names `serverKey`. */
859
869
  export const grokServerListedDisabled = (document, serverKey) => Array.isArray(document.disabled_mcp_servers) &&
860
870
  document.disabled_mcp_servers.includes(serverKey);
871
+ /**
872
+ * OMP's user `disabledServers` denylist hides a server by name regardless of
873
+ * its entry, so a listed REA registration is not loaded.
874
+ */
875
+ export const OMP_DISABLED_SERVERS_KEY = "disabledServers";
876
+ /** Whether OMP's root `disabledServers` denylist names `serverKey`. */
877
+ export const ompServerListedDisabled = (document, serverKey) => {
878
+ const listed = document[OMP_DISABLED_SERVERS_KEY];
879
+ return Array.isArray(listed) && listed.includes(serverKey);
880
+ };
881
+ /** OMP's user `enabledServers` allowlist overrides an entry's `enabled: false`. */
882
+ const OMP_ENABLED_SERVERS_KEY = "enabledServers";
883
+ /**
884
+ * Whether OMP's allowlist forces `serverKey` on despite its entry's
885
+ * `enabled: false`. The `disabledServers` denylist still wins over it.
886
+ */
887
+ export const clientServerForcedEnabled = (parsed, serverKey) => {
888
+ if (parsed.dialect !== "omp")
889
+ return false;
890
+ const listed = parsed.document[OMP_ENABLED_SERVERS_KEY];
891
+ return Array.isArray(listed) && listed.includes(serverKey);
892
+ };
893
+ /** Whether a client's own disable list suppresses `serverKey`. */
894
+ export const clientServerListedDisabled = (parsed, serverKey) => (parsed.dialect === "grok" &&
895
+ grokServerListedDisabled(parsed.document, serverKey)) ||
896
+ (parsed.dialect === "omp" &&
897
+ ompServerListedDisabled(parsed.document, serverKey));
861
898
  /** Keep an existing Grok document intact aside from the REA server tables. */
862
899
  const serializeGrokConfiguration = (document, originalText) => {
863
900
  const entry = tomlServerEntry(document, PRODUCT_IDENTITY.mcpServerKey);
@@ -1004,6 +1041,8 @@ export const serializeClientConfiguration = (document, format, originalText, edi
1004
1041
  return serializeCodexConfiguration(document, originalText);
1005
1042
  if (format === "grok")
1006
1043
  return serializeGrokConfiguration(document, originalText);
1044
+ if (format === "hermes")
1045
+ return serializeHermesConfiguration(document, originalText);
1007
1046
  // An empty original holds no comments or settings to preserve. Writing a
1008
1047
  // fresh document also keeps a lone BOM from shifting past the closing brace.
1009
1048
  if (originalText !== undefined &&
@@ -1028,6 +1067,28 @@ export const clientServerPath = (parsed, name) => [...parsed.serversPath, name];
1028
1067
  export const legacyClientServerPath = (parsed, name) => Object.hasOwn(parsed.legacyServers, name)
1029
1068
  ? [parsed.serversPath[0] ?? "mcp", name]
1030
1069
  : undefined;
1070
+ /**
1071
+ * Keep an existing Hermes `config.yaml` intact aside from the REA server entry.
1072
+ * Hermes config files carry user comments and unrelated settings, so the rea
1073
+ * entry is upserted into the parsed YAML document (which retains formatting and
1074
+ * comments) rather than re-serializing the whole object.
1075
+ */
1076
+ const serializeHermesConfiguration = (document, originalText) => {
1077
+ if (originalText === undefined ||
1078
+ isEmptyClientConfigurationText(originalText))
1079
+ return stringifyYaml(document);
1080
+ const serversKey = clientConfigurationServersKey("hermes");
1081
+ const servers = document[serversKey];
1082
+ const entry = typeof servers === "object" && servers !== null
1083
+ ? servers[PRODUCT_IDENTITY.mcpServerKey]
1084
+ : undefined;
1085
+ const yamlDocument = parseYamlDocument(originalText);
1086
+ if (entry === undefined)
1087
+ yamlDocument.deleteIn([serversKey, PRODUCT_IDENTITY.mcpServerKey]);
1088
+ else
1089
+ yamlDocument.setIn([serversKey, PRODUCT_IDENTITY.mcpServerKey], entry);
1090
+ return yamlDocument.toString();
1091
+ };
1031
1092
  /** Build the stdio entry shape expected by one client's configuration dialect. */
1032
1093
  export const clientRegistrationEntry = (format, command, environment) => {
1033
1094
  const [executable = "rea", ...args] = command;
@@ -1051,6 +1112,8 @@ export const clientRegistrationEntry = (format, command, environment) => {
1051
1112
  : { environment: { ...environment } }),
1052
1113
  };
1053
1114
  case "vscode":
1115
+ case "omp":
1116
+ case "pi":
1054
1117
  return {
1055
1118
  type: "stdio",
1056
1119
  command: executable,
@@ -1073,6 +1136,15 @@ export const clientRegistrationEntry = (format, command, environment) => {
1073
1136
  args,
1074
1137
  ...(Object.keys(environment).length === 0 ? {} : { env: environment }),
1075
1138
  };
1139
+ case "hermes":
1140
+ // Hermes reads stdio servers from `mcp_servers.<name>` and connects them
1141
+ // unless `enabled` is false, so the entry states it explicitly.
1142
+ return {
1143
+ command: executable,
1144
+ args,
1145
+ ...(Object.keys(environment).length === 0 ? {} : { env: environment }),
1146
+ enabled: true,
1147
+ };
1076
1148
  default:
1077
1149
  return {
1078
1150
  command: executable,
@@ -1081,3 +1153,29 @@ export const clientRegistrationEntry = (format, command, environment) => {
1081
1153
  };
1082
1154
  }
1083
1155
  };
1156
+ /** Parse one Gemini policy at its source boundary before consolidating scopes. */
1157
+ export const parseGeminiMcpPolicy = (parsed) => z
1158
+ .object({
1159
+ allowed: z.array(z.string()).optional(),
1160
+ excluded: z.array(z.string()).optional(),
1161
+ })
1162
+ .passthrough()
1163
+ .parse(parsed.document.mcp ?? {});
1164
+ /** Gemini consolidates excludes by union and allowlists by normalized intersection. */
1165
+ export const geminiServerPolicyBlock = (policies, serverKey) => {
1166
+ if (policies.some(({ excluded }) => excluded?.includes(serverKey)))
1167
+ return `Gemini mcp.excluded blocks ${serverKey}. Review the selected settings policies before rerunning setup.`;
1168
+ const allowlists = policies.flatMap(({ allowed }) => allowed === undefined ? [] : [allowed]);
1169
+ const allowed = allowlists.reduce((previous, current) => {
1170
+ if (previous === undefined)
1171
+ return current;
1172
+ const normalized = new Set(current.map((name) => name.toLowerCase().trim()));
1173
+ return previous.filter((name) => normalized.has(name.toLowerCase().trim()));
1174
+ }, undefined);
1175
+ // Gemini's manager applies the consolidated allowlist only when nonempty.
1176
+ if (allowed !== undefined &&
1177
+ allowed.length > 0 &&
1178
+ !allowed.includes(serverKey))
1179
+ return `Gemini mcp.allowed does not include ${serverKey}. Review the selected settings policies before rerunning setup.`;
1180
+ return undefined;
1181
+ };
@@ -0,0 +1,91 @@
1
+ import { err, ok } from "../domain/result.js";
2
+ import { RegularFileCleanupFailure, readRegularFileText, } from "./RegularFileRead.js";
3
+ import { effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
4
+ import { clientRegistrationEnvironment } from "./ClientRegistrationEnvironment.js";
5
+ /** Preserve named read failures and distinguish a missing source from an empty file. */
6
+ export const readConfigurationText = async (path) => {
7
+ try {
8
+ return ok(await readRegularFileText(path));
9
+ }
10
+ catch (cause) {
11
+ if (cause instanceof Error && "code" in cause && cause.code === "ENOENT")
12
+ return ok(undefined);
13
+ return err({
14
+ kind: "unreadable",
15
+ path,
16
+ detail: `Configuration ${path} could not be read: ${cause instanceof Error ? cause.message : String(cause)}`,
17
+ ...(cause instanceof RegularFileCleanupFailure
18
+ ? { cleanupFailure: cause }
19
+ : {}),
20
+ });
21
+ }
22
+ };
23
+ /** Read and parse one configuration at its source boundary. */
24
+ export const readConfigurationFile = async (path, format) => {
25
+ const source = await readConfigurationText(path);
26
+ if (!source.ok)
27
+ return source;
28
+ const content = source.value;
29
+ if (content === undefined)
30
+ return ok(undefined);
31
+ try {
32
+ return ok(parseClientConfiguration(content, format));
33
+ }
34
+ catch (cause) {
35
+ return err({
36
+ kind: "malformed",
37
+ path,
38
+ detail: `Configuration ${path} is malformed: ${cause instanceof Error ? cause.message : String(cause)}`,
39
+ });
40
+ }
41
+ };
42
+ /** Read every applicable user file; malformed lower-priority files also stop setup. */
43
+ export const readClientConfigurationFiles = async (client) => {
44
+ const documents = [];
45
+ for (const path of client.configPaths ?? [client.configPath]) {
46
+ const document = await readConfigurationFile(path, client.format);
47
+ if (!document.ok)
48
+ return document;
49
+ if (document.value !== undefined) {
50
+ const environment = clientRegistrationEnvironment(document.value);
51
+ if (!environment.ok)
52
+ return err({
53
+ kind: "malformed",
54
+ path,
55
+ detail: `Configuration ${path} has an invalid REA server environment: ${environment.error.settings.map(({ setting, constraint }) => `${setting}: ${constraint}`).join("; ")}. Repair it before rerunning setup.`,
56
+ });
57
+ documents.push(document.value);
58
+ }
59
+ }
60
+ return ok(documents);
61
+ };
62
+ /** OpenCode merges server objects in file order, replacing arrays and scalar values. */
63
+ const mergeConfigurationValue = (previous, next) => {
64
+ if (!isObject(previous) || !isObject(next))
65
+ return next;
66
+ return Object.fromEntries([...new Set([...Object.keys(previous), ...Object.keys(next)])].map((key) => [
67
+ key,
68
+ Object.hasOwn(next, key)
69
+ ? mergeConfigurationValue(previous[key], next[key])
70
+ : previous[key],
71
+ ]));
72
+ };
73
+ const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
74
+ /** Project a client's effective user registration without modifying its source files. */
75
+ export const effectiveClientConfiguration = (documents) => {
76
+ const last = documents.at(-1);
77
+ if (last === undefined)
78
+ return undefined;
79
+ if (documents.length === 1)
80
+ return last;
81
+ const servers = {};
82
+ for (const document of documents) {
83
+ const names = new Set([
84
+ ...Object.keys(document.legacyServers),
85
+ ...Object.keys(document.servers),
86
+ ]);
87
+ for (const name of names)
88
+ servers[name] = mergeConfigurationValue(servers[name], effectiveClientServer(document, name));
89
+ }
90
+ return { ...last, servers, legacyServers: {} };
91
+ };
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ import { parseEnvironment } from "../config/environment.js";
3
+ import { ConfigurationError } from "../domain/configurationErrors.js";
4
+ import { err, ok } from "../domain/result.js";
5
+ import { effectiveClientServer, } from "./ClientConfigurationDocument.js";
6
+ import { PRODUCT_IDENTITY } from "../identity.js";
7
+ /** Read explicit REA overrides without dropping peers when one value is invalid. */
8
+ export const clientRegistrationEnvironment = (parsed, overrides = {}) => {
9
+ const key = parsed?.dialect === "opencode" || parsed?.dialect === "opencode_v2"
10
+ ? "environment"
11
+ : "env";
12
+ const registration = parsed === undefined
13
+ ? undefined
14
+ : effectiveClientServer(parsed, PRODUCT_IDENTITY.mcpServerKey);
15
+ const raw = typeof registration === "object" && registration !== null
16
+ ? Reflect.get(registration, key)
17
+ : undefined;
18
+ const existing = z
19
+ .record(z.string(), z.string())
20
+ .safeParse(raw === undefined ? {} : raw);
21
+ if (!existing.success)
22
+ return err(new ConfigurationError("Invalid REA server environment", {
23
+ settings: existing.error.issues.map((issue) => ({
24
+ setting: [key, ...issue.path].join("."),
25
+ constraint: "Server environment must be an object containing only string values",
26
+ })),
27
+ }));
28
+ // Validate known settings with the runtime's parser, but retain the original
29
+ // string overrides, including unknown client-specific keys and no defaults.
30
+ const environment = { ...existing.data, ...overrides };
31
+ const validated = parseEnvironment(environment);
32
+ if (!validated.ok)
33
+ return validated;
34
+ return ok(Object.fromEntries(Object.entries(environment).sort(([left], [right]) => left.localeCompare(right))));
35
+ };