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,99 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { DOMParser, onWarningStopParsing } from "@xmldom/xmldom";
4
+ import { ConfigurationError } from "../domain/configurationErrors.js";
5
+ // Language definitions are small XML files; refuse anything implausibly large.
6
+ const MAX_LDEFS_BYTES = 4 * 1024 * 1024;
7
+ // Processor modules ship under Processors; installed extensions may add more.
8
+ const LANGUAGE_ROOTS = ["Ghidra/Processors", "Ghidra/Extensions"];
9
+ /** Parse the `<language>` elements of one `.ldefs` document. */
10
+ export const parseGhidraLanguageDefinitions = (text) => {
11
+ const definitions = [];
12
+ const document = new DOMParser({
13
+ onError: onWarningStopParsing,
14
+ }).parseFromString(text, "application/xml");
15
+ const root = document.documentElement;
16
+ if (root?.tagName !== "language_definitions")
17
+ throw new SyntaxError("Expected Ghidra language_definitions XML root");
18
+ for (const language of Array.from(root.getElementsByTagName("language"))) {
19
+ if (language.parentNode !== root)
20
+ continue;
21
+ const id = language.getAttribute("id");
22
+ if (id === null)
23
+ continue;
24
+ const compilerSpecIds = [];
25
+ for (const compiler of Array.from(language.getElementsByTagName("compiler"))) {
26
+ if (compiler.parentNode !== language)
27
+ continue;
28
+ const compilerId = compiler.getAttribute("id");
29
+ if (compilerId !== null)
30
+ compilerSpecIds.push(compilerId);
31
+ }
32
+ definitions.push({ id, compilerSpecIds });
33
+ }
34
+ return definitions;
35
+ };
36
+ const languageDirectories = async (installDir) => {
37
+ const directories = [];
38
+ for (const root of LANGUAGE_ROOTS) {
39
+ let modules;
40
+ try {
41
+ modules = await readdir(join(installDir, root));
42
+ }
43
+ catch {
44
+ continue;
45
+ }
46
+ for (const module of modules.sort())
47
+ directories.push(join(installDir, root, module, "data", "languages"));
48
+ }
49
+ return directories;
50
+ };
51
+ /** Read every language definition shipped by one Ghidra installation. */
52
+ export const readGhidraLanguageCatalog = async (installDir) => {
53
+ const definitions = [];
54
+ for (const directory of await languageDirectories(installDir)) {
55
+ let entries;
56
+ try {
57
+ entries = await readdir(directory);
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ for (const entry of entries.sort()) {
63
+ if (!entry.endsWith(".ldefs"))
64
+ continue;
65
+ const bytes = await readFile(join(directory, entry));
66
+ if (bytes.length > MAX_LDEFS_BYTES)
67
+ continue;
68
+ definitions.push(...parseGhidraLanguageDefinitions(bytes.toString("utf8")));
69
+ }
70
+ }
71
+ return definitions;
72
+ };
73
+ /**
74
+ * Check a configured import language against the installation before launch,
75
+ * so an unknown ID fails as configuration instead of as a failed import.
76
+ */
77
+ export const admitGhidraLanguageOverride = (override, catalog, providerVersion) => {
78
+ const language = catalog.find((value) => value.id === override.languageId);
79
+ if (language === undefined)
80
+ return new ConfigurationError("Invalid REA environment configuration", {
81
+ settings: [
82
+ {
83
+ setting: "REA_GHIDRA_LANGUAGE_ID",
84
+ constraint: `is not a language defined by Ghidra ${providerVersion}`,
85
+ },
86
+ ],
87
+ });
88
+ if (override.compilerSpecId !== undefined &&
89
+ !language.compilerSpecIds.includes(override.compilerSpecId))
90
+ return new ConfigurationError("Invalid REA environment configuration", {
91
+ settings: [
92
+ {
93
+ setting: "REA_GHIDRA_COMPILER_SPEC_ID",
94
+ constraint: `must be one of the selected language's compiler specs: ${language.compilerSpecIds.join(", ")}`,
95
+ },
96
+ ],
97
+ });
98
+ return null;
99
+ };
@@ -1,6 +1,7 @@
1
+ import { GHIDRA_SEED_SCRIPT, snapshotGhidraAnalysisSeeds, } from "./GhidraAnalysisSeeds.js";
1
2
  import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
3
  import { mkdir } from "node:fs/promises";
3
- import { basename, dirname, join, win32 } from "node:path";
4
+ import { basename, dirname, join, posix, win32 } from "node:path";
4
5
  import writeFileAtomic from "write-file-atomic";
5
6
  import { windowsPrivateRuntime } from "../windows/WindowsPrivateRuntime.js";
6
7
  import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
@@ -12,9 +13,16 @@ import { ghidraJavaLaunch } from "./GhidraJavaLaunch.js";
12
13
  import { snapshotGhidraExtensions, } from "./extensions/GhidraExtensions.js";
13
14
  /** Local launch failure retained as the cause of a provider-neutral error. */
14
15
  export class GhidraLaunchError extends Error {
16
+ #partialLaunch;
15
17
  constructor(message, options) {
16
- super(message, options);
18
+ const { partialLaunch, ...errorOptions } = options ?? {};
19
+ super(message, errorOptions);
17
20
  this.name = "GhidraLaunchError";
21
+ this.#partialLaunch = partialLaunch;
22
+ }
23
+ /** Process ownership retained for the client to retry an incomplete rollback. */
24
+ get partialLaunch() {
25
+ return this.#partialLaunch;
18
26
  }
19
27
  }
20
28
  /** Launch Ghidra without copying scripts into or modifying its installation. */
@@ -34,6 +42,9 @@ export class GhidraHeadlessLauncher {
34
42
  let started;
35
43
  try {
36
44
  await createGhidraRuntimeDirectories(paths, platform);
45
+ const seedPath = this.options.analysisSeeds === undefined
46
+ ? undefined
47
+ : await snapshotGhidraAnalysisSeeds(this.options.analysisSeeds, session.runtimeRoot);
37
48
  const extensions = await snapshotGhidraExtensions(this.options.analysisExtensions ?? [], session.runtimeRoot);
38
49
  await writeGhidraRuntimeFile(paths.descriptorPath, `${JSON.stringify({
39
50
  transport: session.transport,
@@ -50,6 +61,7 @@ export class GhidraHeadlessLauncher {
50
61
  if (isAborted(options.signal))
51
62
  return err(new AnalysisCancelledError("open_binary"));
52
63
  const headlessArguments = ghidraHeadlessArguments({
64
+ platform,
53
65
  projectRoot: paths.projectRoot,
54
66
  targetPath: session.targetPath,
55
67
  bridgeScriptPath: this.options.bridgeScriptPath,
@@ -62,6 +74,10 @@ export class GhidraHeadlessLauncher {
62
74
  ...(this.options.dosMz === undefined
63
75
  ? {}
64
76
  : { dosMz: this.options.dosMz }),
77
+ ...(this.options.languageOverride === undefined
78
+ ? {}
79
+ : { languageOverride: this.options.languageOverride }),
80
+ ...(seedPath === undefined ? {} : { seedPath }),
65
81
  });
66
82
  const scriptCommand = ghidraHeadlessCommand({
67
83
  environment: this.options.environment,
@@ -89,7 +105,7 @@ export class GhidraHeadlessLauncher {
89
105
  : { signal: options.signal }),
90
106
  })
91
107
  : { ...scriptCommand, environment };
92
- started = await spawnOwnedProviderProcess({
108
+ started = await (this.options.spawnProcess ?? spawnOwnedProviderProcess)({
93
109
  command: command.command,
94
110
  arguments: command.arguments,
95
111
  runId: session.runId,
@@ -102,6 +118,7 @@ export class GhidraHeadlessLauncher {
102
118
  hostEnvironment: {},
103
119
  ...(options.signal === undefined ? {} : { signal: options.signal }),
104
120
  });
121
+ const partialLaunch = ownedGhidraLaunch(started, paths, platform);
105
122
  await writeGhidraRuntimeFile(paths.ownershipPath, `${JSON.stringify({
106
123
  run_id: session.runId,
107
124
  transport: session.transport,
@@ -115,29 +132,45 @@ export class GhidraHeadlessLauncher {
115
132
  created_at: new Date().toISOString(),
116
133
  })}\n`, platform);
117
134
  if (isAborted(options.signal)) {
118
- await cleanupStartedProcess(started, platform);
119
- return err(new AnalysisCancelledError("open_binary"));
135
+ throw new AnalysisCancelledError("open_binary");
120
136
  }
121
- const spawned = started;
122
- return ok({
123
- ...ownedGhidraProcess(spawned, platform),
124
- projectRoot: paths.projectRoot,
125
- ghidraLogPath: paths.ghidraLogPath,
126
- scriptLogPath: paths.scriptLogPath,
127
- });
137
+ return ok(partialLaunch);
128
138
  }
129
139
  catch (cause) {
130
- if (started !== undefined)
131
- await cleanupStartedProcess(started, platform).catch((cause) => {
132
- // best-effort cleanup: started-process cleanup must not mask the launch failure.
133
- void cause;
134
- });
135
- return isAborted(options.signal)
136
- ? err(new AnalysisCancelledError("open_binary"))
137
- : err(new GhidraLaunchError("Ghidra headless launch failed", { cause }));
140
+ const primary = isAborted(options.signal)
141
+ ? new AnalysisCancelledError("open_binary", { cause })
142
+ : new GhidraLaunchError("Ghidra headless launch failed", { cause });
143
+ if (started === undefined)
144
+ return err(primary);
145
+ let cleanupFailure;
146
+ try {
147
+ const cleanup = await cleanupStartedProcess(started, platform);
148
+ if (!cleanup.cleaned)
149
+ cleanupFailure = new Error(`Ghidra process cleanup was incomplete: ${cleanup.reason}`);
150
+ }
151
+ catch (failure) {
152
+ cleanupFailure = failure;
153
+ }
154
+ if (cleanupFailure !== undefined) {
155
+ const partialLaunch = ownedGhidraLaunch(started, paths, platform);
156
+ const primaryMessage = isAborted(options.signal)
157
+ ? primary.message
158
+ : `Ghidra headless launch failed: ${cause instanceof Error ? cause.message : String(cause)}`;
159
+ return err(new GhidraLaunchError(`${primaryMessage}; process cleanup remains incomplete`, {
160
+ cause: new AggregateError([primary, cleanupFailure], "Ghidra launch rollback did not release its process", { cause: primary }),
161
+ partialLaunch,
162
+ }));
163
+ }
164
+ return err(primary);
138
165
  }
139
166
  }
140
167
  }
168
+ const ownedGhidraLaunch = (spawned, paths, platform) => ({
169
+ ...ownedGhidraProcess(spawned, platform),
170
+ projectRoot: paths.projectRoot,
171
+ ghidraLogPath: paths.ghidraLogPath,
172
+ scriptLogPath: paths.scriptLogPath,
173
+ });
141
174
  const ownedGhidraProcess = (spawned, platform) => ({
142
175
  process: spawned.process,
143
176
  ownsProcessLifetime: true,
@@ -185,52 +218,84 @@ const cleanupStartedProcess = (started, platform) => started.cleanup !== undefin
185
218
  ? cleanupWindowsProcessTree(started.ownership.leaderPid)
186
219
  : cleanupOwnedProcessGroup(started.ownership);
187
220
  /** Build the complete read-only headless invocation in deterministic order. */
188
- export const ghidraHeadlessArguments = (options) => [
189
- options.projectRoot,
190
- "rea-project",
191
- "-import",
192
- options.targetPath,
193
- ...(options.dosMz === true
194
- ? [
195
- "-loader",
196
- "MzLoader",
197
- "-processor",
198
- "x86:LE:16:Real Mode",
199
- "-cspec",
200
- "default",
201
- ]
202
- : options.dosCom === true
221
+ export const ghidraHeadlessArguments = (options) => {
222
+ // Bridge script paths use the target platform's syntax, which differs from
223
+ // the host when building a cross-platform invocation.
224
+ const scriptPath = (options.platform ?? process.platform) === "win32" ? win32 : posix;
225
+ const bridgeDirectory = scriptPath.dirname(options.bridgeScriptPath);
226
+ const override = options.languageOverride;
227
+ if (override !== undefined &&
228
+ (options.dosMz === true || options.dosCom === true))
229
+ throw new Error("A Ghidra language override cannot be combined with a DOS import.");
230
+ return [
231
+ options.projectRoot,
232
+ "rea-project",
233
+ "-import",
234
+ options.targetPath,
235
+ ...(options.dosMz === true
203
236
  ? [
204
237
  "-loader",
205
- "BinaryLoader",
206
- "-loader-baseAddr",
207
- "1000:0100",
238
+ "MzLoader",
208
239
  "-processor",
209
240
  "x86:LE:16:Real Mode",
210
241
  "-cspec",
211
242
  "default",
212
243
  ]
244
+ : options.dosCom === true
245
+ ? [
246
+ "-loader",
247
+ "BinaryLoader",
248
+ "-loader-baseAddr",
249
+ "1000:0100",
250
+ "-processor",
251
+ "x86:LE:16:Real Mode",
252
+ "-cspec",
253
+ "default",
254
+ ]
255
+ : override !== undefined
256
+ ? [
257
+ "-processor",
258
+ override.languageId,
259
+ ...(override.compilerSpecId === undefined
260
+ ? []
261
+ : ["-cspec", override.compilerSpecId]),
262
+ ]
263
+ : []),
264
+ "-readOnly",
265
+ "-deleteProject",
266
+ "-log",
267
+ options.ghidraLogPath,
268
+ "-scriptlog",
269
+ options.scriptLogPath,
270
+ "-scriptPath",
271
+ bridgeDirectory,
272
+ ...(options.dosCom === true
273
+ ? [
274
+ "-preScript",
275
+ scriptPath.join(bridgeDirectory, "ReaGhidraPrepareCom.java"),
276
+ ]
213
277
  : []),
214
- "-readOnly",
215
- "-deleteProject",
216
- "-log",
217
- options.ghidraLogPath,
218
- "-scriptlog",
219
- options.scriptLogPath,
220
- "-scriptPath",
221
- dirname(options.bridgeScriptPath),
222
- ...(options.dosCom === true
223
- ? [
224
- "-preScript",
225
- join(dirname(options.bridgeScriptPath), "ReaGhidraPrepareCom.java"),
226
- ]
227
- : []),
228
- "-postScript",
229
- // Ghidra checks the caller's cwd before scriptPath for a basename. Select
230
- // the packaged source explicitly so unrelated entries cannot shadow it.
231
- options.bridgeScriptPath,
232
- options.descriptorPath,
233
- ];
278
+ // Seeds follow any loader preparation and precede default auto-analysis.
279
+ ...(options.seedPath === undefined
280
+ ? []
281
+ : [
282
+ "-preScript",
283
+ scriptPath.join(bridgeDirectory, GHIDRA_SEED_SCRIPT),
284
+ options.seedPath,
285
+ ]),
286
+ ...((options.platform ?? process.platform) === "win32"
287
+ ? []
288
+ : [
289
+ "-postScript",
290
+ scriptPath.join(bridgeDirectory, "ReaGhidraNoReturnFix.java"),
291
+ ]),
292
+ "-postScript",
293
+ // Ghidra checks the caller's cwd before scriptPath for a basename. Select
294
+ // the packaged source explicitly so unrelated entries cannot shadow it.
295
+ options.bridgeScriptPath,
296
+ options.descriptorPath,
297
+ ];
298
+ };
234
299
  const ghidraRuntimePaths = (runtimeRoot) => ({
235
300
  projectRoot: join(runtimeRoot, "project"),
236
301
  homeRoot: join(runtimeRoot, "home"),
@@ -1,11 +1,52 @@
1
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
1
2
  import { jsonValueSchema } from "../domain/jsonValue.js";
2
3
  import { nativeLoadImageObservationSchema, nativeLoadImageSchema, } from "../domain/native/nativeLoadImage.js";
3
4
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
4
5
  import { err, ok } from "../domain/result.js";
5
6
  import { attestGhidraDosComLoadImage, attestGhidraDosLoadImage, } from "./GhidraLoadImageValues.js";
7
+ import {} from "../domain/native/nativeAotPe.js";
8
+ const isSignalAborted = (signal) => signal?.aborted === true;
6
9
  /** Independently verify measured load-image observations for admitted DOS targets. */
7
- export const attestGhidraNativeLoadImage = async (target, operation, measured, client, mapSessionError) => {
10
+ export const attestGhidraNativeLoadImage = async (input) => {
11
+ const { target, operation, measured, client, mapSessionError, nativeAotResult, signal, } = input;
12
+ if (isSignalAborted(signal))
13
+ return err(new AnalysisCancelledError(operation));
8
14
  const observations = nativeLoadImageObservationSchema.parse(measured);
15
+ if (target.format === "pe") {
16
+ if (nativeAotResult === undefined)
17
+ return err(new ProviderAdapterError("ghidra", operation, {
18
+ diagnostics: {
19
+ reason: "The Ghidra provider did not produce read-only NativeAOT metadata for this admitted PE snapshot.",
20
+ },
21
+ }));
22
+ if (isSignalAborted(signal))
23
+ return err(new AnalysisCancelledError(operation));
24
+ try {
25
+ return ok(jsonValueSchema.parse(nativeLoadImageSchema.parse({
26
+ status: "unsupported",
27
+ reason: "Independent load-image verification currently supports DOS MZ and explicit DOS COM targets only.",
28
+ observations: {
29
+ ...observations,
30
+ metadata_recovery: [
31
+ ...(observations.metadata_recovery ?? []),
32
+ nativeAotResult.summary,
33
+ ],
34
+ },
35
+ limitations: [
36
+ "Load-image verification is not performed for PE targets; NativeAOT metadata observations are derived separately from the exact admitted snapshot.",
37
+ ],
38
+ })));
39
+ }
40
+ catch (cause) {
41
+ return err(new ProviderAdapterError("ghidra", operation, {
42
+ diagnostics: {
43
+ reason: cause instanceof Error
44
+ ? cause.message
45
+ : "NativeAOT metadata could not be represented in the load-image result",
46
+ },
47
+ }));
48
+ }
49
+ }
9
50
  if (target.format !== "dos-mz" && target.format !== "dos-com") {
10
51
  return ok(jsonValueSchema.parse(nativeLoadImageSchema.parse({
11
52
  status: "unsupported",
@@ -25,9 +66,15 @@ export const attestGhidraNativeLoadImage = async (target, operation, measured, c
25
66
  const snapshot = await client.readTargetSnapshot();
26
67
  if (!snapshot.ok)
27
68
  return err(mapSessionError(snapshot.error));
69
+ if (snapshot.value.kind !== "captured")
70
+ return err(new ProviderAdapterError("ghidra", operation, {
71
+ diagnostics: {
72
+ reason: "The uncapped DOS load-image snapshot was unexpectedly not captured.",
73
+ },
74
+ }));
28
75
  const attested = (target.format === "dos-com"
29
76
  ? attestGhidraDosComLoadImage
30
- : attestGhidraDosLoadImage)(snapshot.value, target.sha256 ?? "", observations);
77
+ : attestGhidraDosLoadImage)(snapshot.value.bytes, target.sha256 ?? "", observations);
31
78
  if (!attested.ok)
32
79
  return err(new ProviderAdapterError("ghidra", operation, {
33
80
  diagnostics: { reason: attested.error },
@@ -0,0 +1,79 @@
1
+ /** Keep family recognition separate from the deliberately bounded Ghidra lane. */
2
+ export const ghidraMipsUnsupportedReason = (target) => {
3
+ if (target.kind !== "executable" || target.architecture !== "mips")
4
+ return null;
5
+ const metadata = target.mips;
6
+ if (target.format !== "elf" || metadata === undefined)
7
+ return "MIPS analysis requires ELF header metadata; a family name alone does not select an ISA or ABI.";
8
+ if (metadata.elfClass !== 32)
9
+ return "This Ghidra MIPS lane supports ELF32 only; MIPS64 and n64 remain unsupported.";
10
+ if (metadata.type !== 2)
11
+ return "This Ghidra MIPS lane supports ET_EXEC only; relocatable objects, shared images and PSP PRX need separate load verification.";
12
+ if ((metadata.flags & 0x0f000000) !== 0)
13
+ return "MIPS16, microMIPS and other ASE encodings are outside this standard-instruction MIPS lane.";
14
+ if ((metadata.flags & 0x00ff0000) !== 0)
15
+ return "Machine-specific MIPS variants, including PSP Allegrex, need a separately supported processor profile.";
16
+ if ((metadata.flags & 0xf0000000) !== 0x70000000)
17
+ return "This Ghidra MIPS lane requires EF_MIPS_ARCH_32R2; other ISA revisions need separate verification.";
18
+ if ((metadata.flags & 0x0000f000) !== 0x00001000 ||
19
+ (metadata.flags & 0x20) !== 0)
20
+ return "This Ghidra MIPS lane requires an explicit o32 ABI; unspecified, n32 and EABI targets remain unsupported.";
21
+ if ((metadata.flags & 0x00000200) !== 0)
22
+ return "EF_MIPS_FP64 requires separate verification of 64-bit floating-point register semantics in this Ghidra lane.";
23
+ if ((metadata.flags & 0x00000400) !== 0)
24
+ return "EF_MIPS_NAN2008 requires separate verification of NaN encoding semantics in this Ghidra lane.";
25
+ const abi = metadata.abiFlags;
26
+ if (abi === undefined || abi === null)
27
+ return [
28
+ "This Ghidra MIPS lane requires an inspected ABI flags record; header flags alone do not establish the floating-point ABI.",
29
+ ...(metadata.limitations ?? []),
30
+ ].join(" ");
31
+ if (abi.version !== 0)
32
+ return "This Ghidra MIPS lane requires ABI flags version 0; newer record semantics are unsupported.";
33
+ if (abi.isaLevel !== 32 || abi.isaRevision !== 2)
34
+ return "MIPS ABI flags must agree with the declared MIPS32r2 ISA.";
35
+ if (abi.gprSize !== 1 || abi.cpr1Size !== 1 || abi.cpr2Size !== 0)
36
+ return "This Ghidra MIPS lane requires 32-bit GPR/CPR1 and no CPR2; other register modes need separate verification.";
37
+ if (abi.fpAbi !== 1 && abi.fpAbi !== 5)
38
+ return "This Ghidra MIPS lane admits double-precision or FPXX ABI declarations only; soft-float, FP64 and unspecified modes need separate verification.";
39
+ if (abi.isaExtension !== 0 || abi.ases !== 0)
40
+ return "MIPS ABI flags declare an ISA extension or ASE outside this standard-instruction lane.";
41
+ if ((abi.flags1 & ~1) !== 0 || abi.flags2 !== 0)
42
+ return "MIPS ABI flags contain unsupported general flags.";
43
+ return null;
44
+ };
45
+ /** Commit source ELF interpretation without confusing target ISA with host CPU. */
46
+ export const ghidraMipsProfileParameters = (target) => {
47
+ if (target.kind !== "executable" ||
48
+ target.architecture !== "mips" ||
49
+ target.mips === undefined)
50
+ return {};
51
+ const abi = target.mips.abiFlags;
52
+ return {
53
+ mips_elf: {
54
+ elf_class: target.mips.elfClass,
55
+ byte_order: target.mips.byteOrder,
56
+ type: target.mips.type,
57
+ flags: target.mips.flags,
58
+ ...(target.mips.limitations === undefined
59
+ ? {}
60
+ : { abi_flags_limitations: [...target.mips.limitations] }),
61
+ abi_flags: abi === undefined || abi === null
62
+ ? null
63
+ : {
64
+ version: abi.version,
65
+ isa_level: abi.isaLevel,
66
+ isa_revision: abi.isaRevision,
67
+ gpr_size: abi.gprSize,
68
+ cpr1_size: abi.cpr1Size,
69
+ cpr2_size: abi.cpr2Size,
70
+ fp_abi: abi.fpAbi,
71
+ isa_extension: abi.isaExtension,
72
+ ases: abi.ases,
73
+ flags1: abi.flags1,
74
+ flags2: abi.flags2,
75
+ },
76
+ },
77
+ mips_support_lane: "elf32-exec-o32-arch32r2-standard-v3",
78
+ };
79
+ };
@@ -2,15 +2,26 @@ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
2
  import {} from "../application/AnalysisProvider.js";
3
3
  import { createAnalysisProfile, } from "../domain/analysisProfile.js";
4
4
  import { jsonObjectSchema, jsonValueSchema, } from "../domain/jsonValue.js";
5
- import { ok } from "../domain/result.js";
5
+ import { err, ok } from "../domain/result.js";
6
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
7
  import { GhidraClient } from "./GhidraClient.js";
7
8
  import { ghidraInstallationDiagnostics, inspectGhidraInstallation, } from "./GhidraInstallation.js";
8
9
  import { resolveGhidraAnalysisProfile } from "./GhidraAnalysisProfile.js";
10
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
11
+ import { resolveGhidraAnalysisSeeds } from "./GhidraAnalysisSeeds.js";
12
+ import { admitGhidraLanguageOverride, readGhidraLanguageCatalog, } from "./GhidraLanguageCatalog.js";
13
+ import { ghidraMipsUnsupportedReason } from "./GhidraMipsProfile.js";
9
14
  import { resolveGhidraExtensions } from "./extensions/GhidraExtensions.js";
10
15
  import { CAPABILITIES, windowsP0Capabilities, GHIDRA_PROVIDER_IDENTITY, GHIDRA_OPERATIONS, } from "./GhidraProviderCapabilities.js";
11
16
  import { createGhidraProviderClient, } from "./GhidraProviderClient.js";
12
17
  import { windowsNativeAuthorityUnavailableReason, hasWindowsNativeAuthority, windowsNativeCapabilities, } from "../process/WindowsAuthority.js";
13
- const SUPPORTED_ARCHITECTURES = new Set(["x86", "x86_64", "arm", "arm64"]);
18
+ const SUPPORTED_ARCHITECTURES = new Set([
19
+ "x86",
20
+ "x86_64",
21
+ "arm",
22
+ "arm64",
23
+ "mips",
24
+ ]);
14
25
  /** Ghidra candidate backed by an isolated ephemeral headless import. */
15
26
  export class GhidraProvider {
16
27
  config;
@@ -85,6 +96,14 @@ export class GhidraProvider {
85
96
  };
86
97
  if (hostPlatform === "win32")
87
98
  return inspectWindowsP0TargetSupport(target, diagnostics);
99
+ const mipsReason = ghidraMipsUnsupportedReason(target);
100
+ if (mipsReason !== null)
101
+ return {
102
+ status: "unsupported",
103
+ code: "architecture_unsupported",
104
+ reason: mipsReason,
105
+ diagnostics,
106
+ };
88
107
  if (target.format === "mach-o" && target.availableArchitectures.length > 1)
89
108
  return {
90
109
  status: "unsupported",
@@ -96,7 +115,7 @@ export class GhidraProvider {
96
115
  return {
97
116
  status: "unsupported",
98
117
  code: "architecture_unsupported",
99
- reason: "Ghidra v1 requires a concrete x86, x86_64, arm, or arm64 target architecture.",
118
+ reason: "Ghidra v1 requires a supported x86, x86_64, arm, arm64, or MIPS target profile.",
100
119
  diagnostics,
101
120
  };
102
121
  return {
@@ -108,19 +127,47 @@ export class GhidraProvider {
108
127
  }
109
128
  async resolveAnalysisProfile(target, options) {
110
129
  const installation = this.#inspectInstallation();
111
- const resolved = await resolveGhidraAnalysisProfile(target, GHIDRA_PROVIDER_IDENTITY, installation, options?.signal);
130
+ const resolved = await resolveGhidraAnalysisProfile(target, GHIDRA_PROVIDER_IDENTITY, installation, options?.signal, this.config.ghidraLanguageOverride);
112
131
  if (!resolved.ok || resolved.value.profile === null)
113
132
  return resolved;
133
+ const override = this.config.ghidraLanguageOverride;
134
+ if (override !== undefined && installation.status === "available") {
135
+ let catalog;
136
+ try {
137
+ catalog = await readGhidraLanguageCatalog(installation.installDir);
138
+ }
139
+ catch (cause) {
140
+ return err(new ProviderAdapterError("ghidra", "resolve_analysis_profile", {
141
+ cause,
142
+ diagnostics: {
143
+ reason: "Could not read the installed Ghidra language definitions.",
144
+ },
145
+ }));
146
+ }
147
+ const refused = admitGhidraLanguageOverride(override, catalog, installation.providerVersion);
148
+ if (refused !== null)
149
+ return err(refused);
150
+ }
114
151
  const extensions = await resolveGhidraExtensions(this.config, target, installation.platform, options?.signal);
115
152
  if (!extensions.ok)
116
153
  return extensions;
117
- if (extensions.value.length === 0)
154
+ if (options?.signal?.aborted === true)
155
+ return err(new AnalysisCancelledError("open_binary"));
156
+ const seeds = await resolveGhidraAnalysisSeeds(this.config.ghidraSeedFile);
157
+ if (!seeds.ok)
158
+ return seeds;
159
+ if (extensions.value.length === 0 && seeds.value === undefined)
118
160
  return resolved;
119
161
  return ok({
120
162
  ...resolved.value,
121
163
  profile: createAnalysisProfile(resolved.value.profile.provider, {
122
164
  ...resolved.value.profile.parameters,
123
- analysis_extensions: jsonValueSchema.parse(extensions.value),
165
+ ...(extensions.value.length === 0
166
+ ? {}
167
+ : { analysis_extensions: jsonValueSchema.parse(extensions.value) }),
168
+ ...(seeds.value === undefined
169
+ ? {}
170
+ : { analysis_seeds: jsonValueSchema.parse(seeds.value) }),
124
171
  }),
125
172
  });
126
173
  }
@@ -174,18 +221,19 @@ const inspectWindowsP0TargetSupport = (target, diagnostics) => {
174
221
  reason: "Windows Ghidra P0 accepts x86 and x86-64 PE targets only.",
175
222
  diagnostics,
176
223
  };
177
- if (target.executableRole !== "application")
224
+ if (target.executableRole !== "application" &&
225
+ target.executableRole !== "shared-library")
178
226
  return {
179
227
  status: "unsupported",
180
228
  code: "target_role_unsupported",
181
- reason: "Windows Ghidra P0 accepts PE applications, not DLL or non-executable images.",
229
+ reason: "Windows Ghidra P0 accepts PE applications and DLLs, not non-executable or unclassified images.",
182
230
  diagnostics,
183
231
  };
184
232
  if (target.managed !== false)
185
233
  return {
186
234
  status: "unsupported",
187
235
  code: "managed_target_unsupported",
188
- reason: "Windows Ghidra P0 accepts native PE applications; managed or unclassified PE targets are unsupported.",
236
+ reason: "Windows Ghidra P0 accepts native PE applications and DLLs; managed or unclassified PE targets are unsupported.",
189
237
  diagnostics,
190
238
  };
191
239
  return {