rea-agents 6.2.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -0,0 +1,115 @@
1
+ import { lstatSync, readFileSync, realpathSync, statSync } from "node:fs";
2
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep, } from "node:path";
3
+ /** An unresolved Hermes profile must not be configured as the default home. */
4
+ export class HermesClientPathError extends Error {
5
+ path;
6
+ constructor(path, message) {
7
+ super(message);
8
+ this.path = path;
9
+ this.name = "HermesClientPathError";
10
+ }
11
+ }
12
+ const defaultDirectory = (home, platform, env) => {
13
+ const suffix = env.HERMES_DATA_DIR_SUFFIX ?? "";
14
+ return platform === "win32"
15
+ ? join(env.LOCALAPPDATA?.trim() || join(home, "AppData", "Local"), `hermes${suffix}`)
16
+ : join(home, `.hermes${suffix}`);
17
+ };
18
+ const expandedDirectory = (home, platform, env) => {
19
+ const override = env.HERMES_HOME?.trim();
20
+ if (!override)
21
+ return undefined;
22
+ const variables = override.replace(/\$(\w+|\{[^}]*\})/gu, (match, variable) => {
23
+ const key = variable.startsWith("{") ? variable.slice(1, -1) : variable;
24
+ return env[key] ?? match;
25
+ });
26
+ const expanded = platform === "win32"
27
+ ? variables.replace(/%([^%]+)%/gu, (match, variable) => env[variable] ?? match)
28
+ : variables;
29
+ if (expanded === "~")
30
+ return home;
31
+ if (expanded.startsWith("~/") ||
32
+ (platform === "win32" && expanded.startsWith("~\\")))
33
+ return join(home, expanded.slice(2));
34
+ return resolve(expanded);
35
+ };
36
+ const physicalPath = (path) => {
37
+ try {
38
+ return realpathSync(path);
39
+ }
40
+ catch {
41
+ return resolve(path);
42
+ }
43
+ };
44
+ const within = (root, path) => {
45
+ const difference = relative(physicalPath(root), physicalPath(path));
46
+ return (difference === "" ||
47
+ (!isAbsolute(difference) &&
48
+ difference !== ".." &&
49
+ !difference.startsWith(`..${sep}`)));
50
+ };
51
+ const PROFILE_MARKERS = [
52
+ "config.yaml",
53
+ ".env",
54
+ "SOUL.md",
55
+ "profile.yaml",
56
+ "auth.json",
57
+ "state.db",
58
+ ];
59
+ const RESERVED_PROFILES = new Set(["hermes", "test", "tmp", "root", "sudo"]);
60
+ const liveProfile = (path) => {
61
+ try {
62
+ if (!statSync(path).isDirectory())
63
+ return false;
64
+ try {
65
+ statSync(join(dirname(path), ".deleted", basename(path)));
66
+ return false;
67
+ }
68
+ catch {
69
+ /* No tombstone. */
70
+ }
71
+ return PROFILE_MARKERS.some((marker) => {
72
+ try {
73
+ const status = lstatSync(join(path, marker));
74
+ return status.isFile() || status.isSymbolicLink();
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ });
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ };
85
+ /** Match Hermes CLI sticky-profile selection while retaining the configured path spelling. */
86
+ export const resolveHermesClientHome = (home, platform, env) => {
87
+ const native = defaultDirectory(home, platform, env);
88
+ const root = expandedDirectory(home, platform, env) ?? native;
89
+ // An explicit named profile bypasses the root's sticky selection in Hermes CLI.
90
+ if (basename(dirname(root)) === "profiles")
91
+ return root;
92
+ const stickyRoot = within(native, root) ? native : root;
93
+ let name;
94
+ try {
95
+ // Python uses utf-8-sig and ignores unreadable / invalid-UTF8 active_profile files.
96
+ name = new TextDecoder("utf-8", { fatal: true })
97
+ .decode(readFileSync(join(stickyRoot, "active_profile")))
98
+ .trim();
99
+ }
100
+ catch {
101
+ return root;
102
+ }
103
+ if (name === "" || name === "default")
104
+ return root;
105
+ const canonical = name.toLowerCase();
106
+ if (canonical === "default")
107
+ return root;
108
+ if (!/^[a-z0-9][a-z0-9_-]{0,63}$/u.test(canonical) ||
109
+ RESERVED_PROFILES.has(canonical))
110
+ throw new HermesClientPathError(join(stickyRoot, "active_profile"), `Invalid saved Hermes profile ${JSON.stringify(name)}. Run 'hermes profile use default' or repair active_profile.`);
111
+ const selected = join(root, "profiles", canonical);
112
+ if (!liveProfile(selected))
113
+ throw new HermesClientPathError(selected, `Saved Hermes profile ${JSON.stringify(name)} is missing, deleted, or has no profile identity. Run 'hermes profile use default' or restore that profile before configuring it.`);
114
+ return selected;
115
+ };
@@ -0,0 +1,39 @@
1
+ /** Maximum admitted vendor response bytes, shared by Hopper setup adapters. */
2
+ export const HOPPER_DOWNLOAD_BYTES = 100_000_000;
3
+ /** Bound observed response bytes before retaining them, including chunked bodies. */
4
+ export const downloadHopperPackage = async (url, options = {}) => {
5
+ const deadline = AbortSignal.timeout(120_000);
6
+ const response = await fetch(url, {
7
+ headers: { accept: "application/json", "user-agent": "rea-installer" },
8
+ signal: options.signal === undefined
9
+ ? deadline
10
+ : AbortSignal.any([options.signal, deadline]),
11
+ });
12
+ const refused = { ok: false, bytes: new Uint8Array() };
13
+ if (!response.ok ||
14
+ Number(response.headers.get("content-length")) > HOPPER_DOWNLOAD_BYTES) {
15
+ await response.body?.cancel();
16
+ return refused;
17
+ }
18
+ if (response.body === null)
19
+ return { ok: true, bytes: new Uint8Array() };
20
+ const reader = response.body.getReader();
21
+ const chunks = [];
22
+ let bytes = 0;
23
+ try {
24
+ while (true) {
25
+ const chunk = await reader.read();
26
+ if (chunk.done)
27
+ return { ok: true, bytes: Buffer.concat(chunks, bytes) };
28
+ if (chunk.value.byteLength > HOPPER_DOWNLOAD_BYTES - bytes) {
29
+ await reader.cancel();
30
+ return refused;
31
+ }
32
+ chunks.push(chunk.value);
33
+ bytes += chunk.value.byteLength;
34
+ }
35
+ }
36
+ finally {
37
+ reader.releaseLock();
38
+ }
39
+ };
@@ -13,17 +13,23 @@ export const workflowAnalysisProfile = (upstream, operation) => createAnalysisPr
13
13
  : {}),
14
14
  });
15
15
  /** Provider identity for deterministic artifact inventories. */
16
- export const ARTIFACT_GRAPH_PROVIDER = {
16
+ export const ARTIFACT_GRAPH_PROVIDER = Object.freeze({
17
17
  id: "rea-artifact-graph",
18
18
  name: "REA safe artifact graph provider",
19
19
  version: "1",
20
- };
20
+ });
21
21
  /** Provider identity for execution-free managed PE/CLI analysis. */
22
- export const MANAGED_STATIC_PROVIDER = {
22
+ export const MANAGED_STATIC_PROVIDER = Object.freeze({
23
23
  id: "rea-dotnet-static",
24
24
  name: "REA managed static analysis provider",
25
25
  version: "1",
26
- };
26
+ });
27
+ /** Provider identity for portable, execution-free PE resource decoding. */
28
+ export const PE_RESOURCES_PROVIDER = Object.freeze({
29
+ id: "rea-pe-resources",
30
+ name: "REA PE resource parser",
31
+ version: "1",
32
+ });
27
33
  /** Provider identity for deterministic managed-code comparison workflows. */
28
34
  export const MANAGED_WORKFLOW_PROVIDER = {
29
35
  id: "rea-dotnet-workflows",
@@ -1,31 +1,32 @@
1
- import { link, lstat, mkdtemp, open, readFile, realpath, rename, rm, } from "node:fs/promises";
1
+ import { link, lstat, mkdtemp, open, realpath, rename, rm, } from "node:fs/promises";
2
2
  import { basename, dirname, resolve } from "node:path";
3
3
  import { EvidenceFileError } from "../domain/evidenceErrors.js";
4
- import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
4
+ import { AnalysisCancelledError, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
5
5
  import { err, ok } from "../domain/result.js";
6
+ import { readJsonInputFile } from "./JsonInputFile.js";
7
+ import { NonRegularFileReadError } from "../filesystem/RegularFile.js";
6
8
  /** Read JSON data from a regular file at the caller-supplied path. */
7
9
  export const readJsonFile = async (path) => {
8
10
  const requestedPath = resolve(path);
9
11
  try {
10
- const canonicalPath = await realpath(requestedPath);
11
- const stats = await lstat(canonicalPath);
12
- if (!stats.isFile())
13
- return err(new EvidenceFileError("read", "not-file", { path: requestedPath }));
14
- const encoded = await readFile(canonicalPath);
15
- let decoded;
16
- try {
17
- decoded = JSON.parse(new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(encoded));
18
- }
19
- catch (cause) {
12
+ const decoded = await readJsonInputFile(requestedPath, "read_evidence_file");
13
+ if (!decoded.ok) {
14
+ if (decoded.error instanceof AnalysisResourceConstraintError)
15
+ return err(decoded.error);
20
16
  return err(new EvidenceFileError("read", "invalid-json", {
21
- cause,
17
+ cause: decoded.error.cause ??
18
+ new SyntaxError(decoded.error.issues[0]?.message ?? decoded.error.message),
22
19
  path: requestedPath,
23
20
  }));
24
21
  }
25
- return ok(decoded);
22
+ return ok(decoded.value);
26
23
  }
27
24
  catch (cause) {
28
- return err(new EvidenceFileError("read", missingOrIo(cause), {
25
+ if (cause instanceof AnalysisResourceConstraintError)
26
+ return err(cause);
27
+ return err(new EvidenceFileError("read", cause instanceof NonRegularFileReadError
28
+ ? "not-file"
29
+ : missingOrIo(cause), {
29
30
  cause,
30
31
  path: requestedPath,
31
32
  }));
@@ -0,0 +1,252 @@
1
+ import { constants } from "node:buffer";
2
+ import { pipeline } from "node:stream/promises";
3
+ import { getHeapStatistics } from "node:v8";
4
+ import parser from "stream-json/parser.js";
5
+ import streamValues from "stream-json/streamers/stream-values.js";
6
+ import { RegularFileChangedError } from "../filesystem/RegularFile.js";
7
+ import { withRegularFile } from "./RegularFileRead.js";
8
+ import { JSON_BYTE_ORDER_MARK_MESSAGE, JSON_INPUT_RESOURCE_REMEDIATION, parseUtf8Json, } from "./Utf8JsonInput.js";
9
+ import { AnalysisInputError, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
10
+ import { err, ok } from "../domain/result.js";
11
+ const READ_CHUNK_BYTES = 64 * 1024;
12
+ const PACKED_TOKEN_PART_CODE_UNITS = 64 * 1024;
13
+ // Retain native-parser speed for modest inputs while bounding its extra copies.
14
+ // This selects an implementation; larger files remain accepted through streaming.
15
+ const NATIVE_PARSE_READ_BUDGET = 8 * 1024 * 1024;
16
+ /** Keep native parsing only when input copies and value expansion fit live headroom. */
17
+ const nativeParseFits = (inputBytes) => inputBytes <= NATIVE_PARSE_READ_BUDGET &&
18
+ // The assembler estimate reserves up to 128 bytes per two-byte container.
19
+ // Allow that 64x expansion plus byte/text copies before native JSON.parse,
20
+ // whose individual container allocations cannot be intercepted.
21
+ inputBytes * 72 + READ_CHUNK_BYTES <=
22
+ getHeapStatistics().total_available_size;
23
+ /** Parse strict UTF-8 JSON without requiring a whole-document string. */
24
+ export const readJsonInputFile = (path, operation, signal) => withRegularFile(path, async (handle, stats) => {
25
+ let found = false;
26
+ let value;
27
+ try {
28
+ const prefix = nativeParseFits(stats.size)
29
+ ? await readPrefix(handle, stats.size + 1, signal)
30
+ : undefined;
31
+ if (prefix !== undefined) {
32
+ if (!prefix.complete || prefix.bytes.length !== stats.size)
33
+ throw new RegularFileChangedError(path);
34
+ const parsed = parseUtf8Json(prefix.bytes, operation, path, "json-file-input");
35
+ return parsed.ok
36
+ ? ok(parsed.value)
37
+ : err(invalidJson(operation, parsed.error, parsed.cause));
38
+ }
39
+ await pipeline(decodedChunks(handle, stats.size, path, signal), parser.asStream({
40
+ jsonStreaming: false,
41
+ streamValues: false,
42
+ packKeys: false,
43
+ packStrings: false,
44
+ packNumbers: false,
45
+ }), packJsonScalars(operation, stats.size, path), admitJsonAssembly(operation, stats.size, path), streamValues.asStream(), async (rows) => {
46
+ for await (const row of rows) {
47
+ if (found ||
48
+ typeof row !== "object" ||
49
+ row === null ||
50
+ !("key" in row) ||
51
+ row.key !== 0 ||
52
+ !("value" in row))
53
+ throw new Error("Unexpected JSON parser result");
54
+ found = true;
55
+ value = row.value;
56
+ }
57
+ }, signal === undefined ? {} : { signal });
58
+ return found
59
+ ? ok(value)
60
+ : err(invalidJson(operation, "JSON document is empty"));
61
+ }
62
+ catch (cause) {
63
+ if (cause instanceof AnalysisResourceConstraintError)
64
+ return err(cause);
65
+ if (cause instanceof TypeError &&
66
+ "code" in cause &&
67
+ cause.code === "ERR_ENCODING_INVALID_ENCODED_DATA")
68
+ return err(invalidJson(operation, "JSON input is not valid UTF-8", cause));
69
+ if (cause instanceof SyntaxError ||
70
+ (cause instanceof Error && cause.message.startsWith("Parser ")))
71
+ return err(invalidJson(operation, cause.message, cause));
72
+ if (cause instanceof Error &&
73
+ ((cause instanceof RangeError &&
74
+ cause.message === "Invalid string length") ||
75
+ ("code" in cause && cause.code === "ERR_STRING_TOO_LONG")))
76
+ return err(new AnalysisResourceConstraintError(operation, "memory", "An individual JSON string or number token exceeds the runtime string limit", {
77
+ input_path: path,
78
+ input_file_bytes: stats.size,
79
+ max_string_code_units: constants.MAX_STRING_LENGTH,
80
+ }, {
81
+ cause,
82
+ remediationAction: JSON_INPUT_RESOURCE_REMEDIATION,
83
+ }));
84
+ throw cause;
85
+ }
86
+ }, { signal });
87
+ const packJsonScalars = (operation, inputFileBytes, path) => async function* (tokens) {
88
+ let kind;
89
+ let length = 0;
90
+ let value = "";
91
+ let parts = [];
92
+ let partLength = 0;
93
+ for await (const token of tokens) {
94
+ if (typeof token !== "object" || token === null || !("name" in token))
95
+ throw new Error("Unexpected JSON parser token");
96
+ switch (token.name) {
97
+ case "startKey":
98
+ case "startString":
99
+ kind = token.name === "startKey" ? "keyValue" : "stringValue";
100
+ break;
101
+ case "startNumber":
102
+ kind = "numberValue";
103
+ break;
104
+ case "numberChunk":
105
+ case "stringChunk":
106
+ if (kind === undefined ||
107
+ !("value" in token) ||
108
+ typeof token.value !== "string")
109
+ throw new Error("Unexpected JSON scalar fragment");
110
+ length += token.value.length;
111
+ if (length > constants.MAX_STRING_LENGTH)
112
+ throw new RangeError("Invalid string length");
113
+ parts.push(token.value);
114
+ partLength += token.value.length;
115
+ if (partLength >= PACKED_TOKEN_PART_CODE_UNITS) {
116
+ // The tokenizer emits short fragments. Coalesce them before retaining
117
+ // a scalar so millions of substring/rope nodes cannot exhaust the heap
118
+ // before the native string-length constraint can be reported.
119
+ requireStringAssemblyHeadroom(operation, inputFileBytes, path, length);
120
+ value += parts.join("");
121
+ parts = [];
122
+ partLength = 0;
123
+ }
124
+ break;
125
+ case "endKey":
126
+ case "endString":
127
+ case "endNumber":
128
+ if (kind === undefined)
129
+ throw new Error("Unexpected JSON scalar end");
130
+ requireStringAssemblyHeadroom(operation, inputFileBytes, path, length);
131
+ yield { name: kind, value: value + parts.join("") };
132
+ kind = undefined;
133
+ length = 0;
134
+ value = "";
135
+ parts = [];
136
+ partLength = 0;
137
+ break;
138
+ default:
139
+ yield token;
140
+ }
141
+ }
142
+ };
143
+ /** Admit the retained value graph before the upstream assembler grows it. */
144
+ const admitJsonAssembly = (operation, inputFileBytes, path) => async function* (tokens) {
145
+ let projectedBytes = 0;
146
+ let nextCheck = 0;
147
+ for await (const token of tokens) {
148
+ if (typeof token !== "object" || token === null || !("name" in token))
149
+ throw new Error("Unexpected JSON assembly token");
150
+ if (token.name === "startObject" || token.name === "startArray") {
151
+ projectedBytes += 128;
152
+ }
153
+ else if (token.name === "keyValue" || token.name === "stringValue") {
154
+ if (!("value" in token) || typeof token.value !== "string")
155
+ throw new Error("Unexpected packed JSON string");
156
+ projectedBytes += 64 + token.value.length * 2;
157
+ }
158
+ else if (token.name === "numberValue" ||
159
+ token.name === "nullValue" ||
160
+ token.name === "trueValue" ||
161
+ token.name === "falseValue") {
162
+ projectedBytes += 64;
163
+ }
164
+ if (projectedBytes >= nextCheck) {
165
+ const heap = getHeapStatistics();
166
+ // Conservative capacity for containers, property/array slots and UTF-16
167
+ // values. Keep another whole projection available for container growth,
168
+ // plus the next chunk of estimates between samples. This is admission
169
+ // against live runtime headroom, not a fixed document-size policy.
170
+ const requiredBytes = projectedBytes + READ_CHUNK_BYTES;
171
+ if (requiredBytes > heap.total_available_size)
172
+ throw new AnalysisResourceConstraintError(operation, "memory", "Insufficient heap headroom to materialize the complete JSON value", {
173
+ input_path: path,
174
+ input_file_bytes: inputFileBytes,
175
+ projected_value_bytes: projectedBytes,
176
+ assembly_headroom_bytes: requiredBytes,
177
+ available_heap_bytes: heap.total_available_size,
178
+ heap_size_limit_bytes: heap.heap_size_limit,
179
+ }, { remediationAction: JSON_INPUT_RESOURCE_REMEDIATION });
180
+ nextCheck = projectedBytes + READ_CHUNK_BYTES;
181
+ }
182
+ yield token;
183
+ }
184
+ };
185
+ const requireStringAssemblyHeadroom = (operation, inputFileBytes, path, stringCodeUnits) => {
186
+ if (stringCodeUnits < PACKED_TOKEN_PART_CODE_UNITS)
187
+ return;
188
+ const heap = getHeapStatistics();
189
+ // Concatenation or key interning may flatten the retained rope. Reserve its
190
+ // UTF-16 representation and the next coalesced part before that allocation.
191
+ const requiredBytes = 2 * (stringCodeUnits + PACKED_TOKEN_PART_CODE_UNITS);
192
+ if (requiredBytes > heap.total_available_size)
193
+ throw new AnalysisResourceConstraintError(operation, "memory", "Insufficient heap headroom to assemble a complete JSON string", {
194
+ input_path: path,
195
+ input_file_bytes: inputFileBytes,
196
+ string_code_units: stringCodeUnits,
197
+ string_assembly_headroom_bytes: requiredBytes,
198
+ available_heap_bytes: heap.total_available_size,
199
+ heap_size_limit_bytes: heap.heap_size_limit,
200
+ }, {
201
+ remediationAction: JSON_INPUT_RESOURCE_REMEDIATION,
202
+ });
203
+ };
204
+ async function* decodedChunks(handle, admittedBytes, path, signal) {
205
+ const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
206
+ let leading = true;
207
+ const checked = (text) => {
208
+ if (leading && text.length > 0) {
209
+ leading = false;
210
+ if (text.startsWith("\uFEFF"))
211
+ throw new JsonByteOrderMarkError();
212
+ }
213
+ return text;
214
+ };
215
+ const bytes = Buffer.allocUnsafe(READ_CHUNK_BYTES);
216
+ let observedBytes = 0;
217
+ while (true) {
218
+ signal?.throwIfAborted();
219
+ const read = await handle.read(bytes, 0, Math.min(bytes.length, admittedBytes - observedBytes + 1), null);
220
+ signal?.throwIfAborted();
221
+ if (read.bytesRead === 0)
222
+ break;
223
+ observedBytes += read.bytesRead;
224
+ if (observedBytes > admittedBytes)
225
+ throw new RegularFileChangedError(path);
226
+ yield checked(decoder.decode(bytes.subarray(0, read.bytesRead), { stream: true }));
227
+ }
228
+ if (observedBytes !== admittedBytes)
229
+ throw new RegularFileChangedError(path);
230
+ yield checked(decoder.decode());
231
+ }
232
+ /** A streamed JSON file begins with a byte-order mark; reported as invalid JSON. */
233
+ class JsonByteOrderMarkError extends SyntaxError {
234
+ constructor() {
235
+ super(JSON_BYTE_ORDER_MARK_MESSAGE);
236
+ }
237
+ }
238
+ const readPrefix = async (handle, size, signal) => {
239
+ const bytes = Buffer.allocUnsafe(size);
240
+ let offset = 0;
241
+ while (offset < bytes.length) {
242
+ signal?.throwIfAborted();
243
+ const read = await handle.read(bytes, offset, bytes.length - offset, null);
244
+ signal?.throwIfAborted();
245
+ if (read.bytesRead === 0)
246
+ return { bytes: bytes.subarray(0, offset), complete: true };
247
+ offset += read.bytesRead;
248
+ }
249
+ // One byte beyond the admitted extent proves the selected file changed.
250
+ return { bytes, complete: false };
251
+ };
252
+ const invalidJson = (operation, message, cause) => new AnalysisInputError(operation, cause === undefined ? undefined : { cause }, [{ path: [], reason: "invalid_format", expected: "JSON", message }]);
@@ -6,9 +6,9 @@ import { tmpdir } from "node:os";
6
6
  import { join } from "node:path";
7
7
  import { promisify } from "node:util";
8
8
  import { execFileOutput } from "../process/ExecFileOutput.js";
9
+ import { downloadHopperPackage, HOPPER_DOWNLOAD_BYTES, } from "./HopperDownload.js";
9
10
  const execFileAsync = promisify(execFile);
10
11
  const DOWNLOAD_PREFIX = "https://www.hopperapp.com:443/downloader/public/";
11
- const MAX_PACKAGE_BYTES = 100_000_000;
12
12
  const SUPPORTED_HOPPER_SHA256 = new Set([
13
13
  "0294ced141cc373468ee22d8343e7dac41980cb05a937994ca81c9f09afe7ded",
14
14
  "1339f9e58377442b0c6fcb0dfc3cec20d593cc557408521fad9a00dbc6b8da13",
@@ -62,8 +62,10 @@ export const parseLinuxDistribution = (text) => {
62
62
  const supported = packageFamily !== undefined &&
63
63
  (id === "arch" ||
64
64
  id === "cachyos" ||
65
+ (id === "omarchy" && packageFamily === "arch") ||
65
66
  (id === "ubuntu" && versionAtLeast(versionId, 24)) ||
66
- (id === "fedora" && versionAtLeast(versionId, 41)));
67
+ (id === "fedora" && versionAtLeast(versionId, 41)) ||
68
+ (id === "nobara" && versionAtLeast(versionId, 44)));
67
69
  const identity = {
68
70
  id,
69
71
  ...(versionId === undefined ? {} : { versionId }),
@@ -127,16 +129,7 @@ export const linuxHopperLauncherPath = (home) => join(home, ".local/share/rea/ho
127
129
  /** Compose package-manager and linker checks from the selected caller environment. */
128
130
  export const systemLinuxHopperInstallHost = (environment) => ({
129
131
  distribution: readLinuxDistribution,
130
- async download(url, options) {
131
- const response = await fetch(url, {
132
- headers: { accept: "application/json", "user-agent": "rea-installer" },
133
- ...(options.signal === undefined ? {} : { signal: options.signal }),
134
- });
135
- return {
136
- ok: response.ok,
137
- bytes: new Uint8Array(await response.arrayBuffer()),
138
- };
139
- },
132
+ download: downloadHopperPackage,
140
133
  createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-")),
141
134
  writeArchive: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
142
135
  installPackage: (family, archive) => installSystemPackage(family, archive, environment),
@@ -219,7 +212,7 @@ export const linuxPackageManagerCommands = (family, archive, isRoot) => {
219
212
  });
220
213
  };
221
214
  const packageIntegrityMatches = (bytes, release) => bytes.byteLength === Number(release.file_length) &&
222
- bytes.byteLength <= MAX_PACKAGE_BYTES &&
215
+ bytes.byteLength <= HOPPER_DOWNLOAD_BYTES &&
223
216
  createHash("sha1").update(bytes).digest("hex") === release.file_hash;
224
217
  const packageFamilyFor = (id, idLike) => {
225
218
  const identities = new Set([