rea-agents 6.2.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -1,6 +1,7 @@
1
1
  import { hasWindowsNativeAuthority, windowsNativeAuthorityUnavailableReason, } from "../process/WindowsAuthority.js";
2
2
  import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
3
3
  import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
4
+ import { GHIDRA_MUTATING_OPERATIONS } from "./GhidraSessionValues.js";
4
5
  /** Public identity committed by every Ghidra-backed observation. */
5
6
  export const GHIDRA_PROVIDER_IDENTITY = Object.freeze({
6
7
  id: "ghidra",
@@ -20,10 +21,12 @@ export const healthLimitations = Object.freeze([
20
21
  ]);
21
22
  /** Additional limitations applied to the experimental Windows x64 P0 boundary. */
22
23
  export const windowsP0Limitations = Object.freeze([
23
- "Windows Ghidra P0 accepts approved native x86 and x86-64 PE applications only; DLL, managed, hostile, sensitive, and mutable-path targets are unsupported.",
24
+ "Windows Ghidra P0 accepts approved native x86 and x86-64 PE applications and DLLs; managed, hostile, sensitive, and mutable-path targets are unsupported.",
24
25
  "The Windows bridge uses authenticated IPv4 loopback because Node path-based IPC does not expose Java AF_UNIX sockets; the endpoint file contains no bearer token.",
25
26
  "Windows sessions require the matching packaged Windows x64 native addon, local NTFS targets and runtimes, and Windows 10 or later. Native handles enforce path admission, private DACLs, and Job Object ownership automatically.",
26
27
  ]);
28
+ const stringInventoryLimitation = "Only Ghidra-defined string Data is observed; packed or undefined string bytes may be absent. Completeness applies to that inventory, and an empty search does not establish that text is absent from the artifact. If an address is known, use read_bytes and xrefs to inspect bytes and references.";
29
+ const searchLimitation = "Regex mode uses Java Pattern semantics. Matcher or compiler stack exhaustion returns a resource constraint without closing the session; literal mode avoids regex recursion and returns complete matching values.";
27
30
  /** Limitation text for one admitted operation, including the common base. */
28
31
  export const limitationsFor = (operation) => {
29
32
  const common = [
@@ -38,6 +41,14 @@ export const limitationsFor = (operation) => {
38
41
  "Annotation text rejects NUL and unpaired Unicode surrogates before mutation, with the field and UTF-16 index in the error. Supported Unicode and line endings are preserved.",
39
42
  "Metadata edits invalidate immutable analysis snapshots and are discarded on close. CLI returns the updated dossier before session cleanup; this is not a saved Ghidra project.",
40
43
  ];
44
+ case "set_address_name":
45
+ case "set_addresses_names":
46
+ return [
47
+ ...common,
48
+ "Names use Ghidra USER_DEFINED source. A local function entry renames that function; any other mapped address receives a new or renamed primary label. Existing symbols retain their namespace and accept leaf names or qualified names within that namespace; qualified readback can be reused without adding namespace prefixes. Readback compares the primary symbol name.",
49
+ "set_addresses_names applies each address in its own transaction and reports per-address success; invalid names, unmapped addresses, and readback mismatches roll back only that address.",
50
+ "Metadata edits invalidate immutable analysis snapshots and are discarded on close; this is not a saved Ghidra project.",
51
+ ];
41
52
  case "inspect_native_load_image":
42
53
  return [
43
54
  ...common,
@@ -72,7 +83,8 @@ export const limitationsFor = (operation) => {
72
83
  case "list_strings":
73
84
  return [
74
85
  ...common,
75
- "Only Ghidra-defined string Data is observed; charset is reported, while a non-missing terminator cannot distinguish a present terminator from a fixed or Pascal layout.",
86
+ stringInventoryLimitation,
87
+ "Charset is reported, while a non-missing terminator cannot distinguish a present terminator from a fixed or Pascal layout.",
76
88
  ];
77
89
  case "resolve_containing_procedure":
78
90
  return [
@@ -85,11 +97,9 @@ export const limitationsFor = (operation) => {
85
97
  "Memory-block end addresses are exclusive; permissions come from Ghidra MemoryBlock flags rather than inference from section names.",
86
98
  ];
87
99
  case "search_procedures":
100
+ return [...common, searchLimitation];
88
101
  case "search_strings":
89
- return [
90
- ...common,
91
- "Regex mode uses Java Pattern semantics. Matcher or compiler stack exhaustion returns a resource constraint without closing the session; literal mode avoids regex recursion and returns complete matching values.",
92
- ];
102
+ return [...common, stringInventoryLimitation, searchLimitation];
93
103
  case "procedure_pseudo_code":
94
104
  return [
95
105
  ...common,
@@ -148,12 +158,12 @@ export const CAPABILITIES = Object.freeze(GHIDRA_OPERATIONS.map((operation) => {
148
158
  reason: null,
149
159
  // Project writes are private import machinery. Analysis reads are bound
150
160
  // to the artifact/profile; session annotations disable snapshot replay.
151
- ...(operation === "annotate_native_function" ||
161
+ ...(GHIDRA_MUTATING_OPERATIONS.has(operation) ||
152
162
  operation === "list_documents"
153
163
  ? {}
154
164
  : { cachePolicy: "snapshot" }),
155
165
  effects: Object.freeze({
156
- mutatesArtifact: operation === "annotate_native_function",
166
+ mutatesArtifact: GHIDRA_MUTATING_OPERATIONS.has(operation),
157
167
  launchesProcess: true,
158
168
  mayShowUi: false,
159
169
  mayAccessNetwork: false,
@@ -1,8 +1,11 @@
1
- import { analysisErrorWithCleanupFailure } from "../application/binary/AnalysisClientCleanup.js";
1
+ import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
4
+ import { ghidraSeedCommitmentSchema, ghidraSeedFailure, ghidraSeedLimitations, } from "./GhidraAnalysisSeeds.js";
5
+ import { ghidraProfileLanguageOverride, sameGhidraLanguageOverride, } from "./GhidraAnalysisProfile.js";
4
6
  import { AnalysisCancelledError, AnalysisArtifactChangedError, AnalysisAccessDeniedError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
5
7
  import {} from "../domain/analysisErrorBase.js";
8
+ import { jsonValueSchema } from "../domain/jsonValue.js";
6
9
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
7
10
  import { err, ok } from "../domain/result.js";
8
11
  import { GhidraClient } from "./GhidraClient.js";
@@ -12,10 +15,159 @@ import { ghidraInstallationDiagnostics, } from "./GhidraInstallation.js";
12
15
  import { unverifiedGhidraBuildLimitation } from "./GhidraInstallationPolicy.js";
13
16
  import { GhidraHeadlessLauncher } from "./GhidraLauncher.js";
14
17
  import { attestGhidraNativeLoadImage } from "./GhidraLoadImageAttest.js";
18
+ import { NATIVE_AOT_MAX_REPORT_BYTES, NATIVE_AOT_MAX_SOURCE_BYTES, nativeAotSnapshotOverCapacity, parseNativeAotPe, } from "../domain/native/nativeAotPe.js";
19
+ import { ABORTED, waitForAbortable, } from "../application/binary/AbortablePromise.js";
20
+ import { nativeLoadImageObservationSchema } from "../domain/native/nativeLoadImage.js";
15
21
  import { GHIDRA_PROVIDER_IDENTITY, healthLimitations, windowsP0Limitations, limitationsFor, } from "./GhidraProviderCapabilities.js";
16
22
  import { ghidraExtensionFailure } from "./extensions/GhidraExtensionFailures.js";
17
23
  import { ghidraExtensionSchema, validateGhidraExtensionProfile, ghidraExtensionLimitations, } from "./extensions/GhidraExtensions.js";
18
24
  import { windowsNativeAuthorityUnavailableReason, hasWindowsNativeAuthority, } from "../process/WindowsAuthority.js";
25
+ /** Own one session's captured PE snapshot and immutable NativeAOT derivation. */
26
+ const createNativeAotSnapshotOwner = (input) => {
27
+ const { client, target, startupTimeoutMs } = input;
28
+ const controller = new AbortController();
29
+ let identity;
30
+ let result;
31
+ let pending;
32
+ let closed = false;
33
+ let identityConflict = false;
34
+ let identityConflictObservation;
35
+ const identityError = (operation, reason, observedBase, observations) => new ProviderAdapterError("ghidra", operation, {
36
+ diagnostics: {
37
+ reason,
38
+ artifact_sha256: target.sha256,
39
+ bound_image_base: identity === undefined
40
+ ? null
41
+ : `0x${identity.slice(target.sha256.length + 1)}`,
42
+ observed_image_base: observedBase,
43
+ measured_observation: observations,
44
+ conflicting_image_base: identityConflictObservation?.imageBase ?? null,
45
+ conflicting_observation: identityConflictObservation?.observations ?? null,
46
+ },
47
+ });
48
+ const identityConflictFailure = (operation, observedBase, observations) => {
49
+ return err(identityError(operation, "The Ghidra session reported conflicting loaded image bases; reopen the analysis session to establish a new identity.", observedBase, observations));
50
+ };
51
+ const derive = async (imageBase, operation, callerSignal, observations) => {
52
+ if (callerSignal?.aborted || closed)
53
+ return err(new AnalysisCancelledError(operation));
54
+ if (identityConflict)
55
+ return identityConflictFailure(operation, imageBase, observations);
56
+ if (controller.signal.aborted)
57
+ return err(new AnalysisCancelledError(operation));
58
+ let normalizedBase;
59
+ try {
60
+ normalizedBase = BigInt(imageBase).toString(16);
61
+ }
62
+ catch (cause) {
63
+ return err(new ProviderAdapterError("ghidra", operation, {
64
+ diagnostics: {
65
+ reason: "Ghidra returned an invalid loaded image base for NativeAOT identity binding.",
66
+ artifact_sha256: target.sha256,
67
+ observed_image_base: imageBase,
68
+ measured_observation: observations,
69
+ },
70
+ cause,
71
+ }));
72
+ }
73
+ const key = `${target.sha256}:${normalizedBase}`;
74
+ if (identity !== undefined && identity !== key) {
75
+ identityConflict = true;
76
+ identityConflictObservation = { imageBase, observations };
77
+ result = undefined;
78
+ controller.abort();
79
+ return err(identityError(operation, "The Ghidra session reported a different loaded image base after NativeAOT metadata was bound to its captured snapshot; reopen the analysis session to establish a new identity.", imageBase, observations));
80
+ }
81
+ identity ??= key;
82
+ if (result !== undefined) {
83
+ const settled = await waitForAbortable(Promise.resolve(ok(result)), callerSignal);
84
+ if (closed)
85
+ return err(new AnalysisCancelledError(operation));
86
+ if (identityConflict)
87
+ return identityConflictFailure(operation, imageBase, observations);
88
+ if (controller.signal.aborted)
89
+ return err(new AnalysisCancelledError(operation));
90
+ return settled === ABORTED
91
+ ? err(new AnalysisCancelledError(operation))
92
+ : settled;
93
+ }
94
+ if (pending !== undefined && pending.identity !== key)
95
+ return err(identityError(operation, "A NativeAOT snapshot derivation is already bound to a different loaded image base.", imageBase, observations));
96
+ if (pending === undefined) {
97
+ const promise = (async () => {
98
+ try {
99
+ if (client.readTargetSnapshot === undefined)
100
+ return err(new ProviderAdapterError("ghidra", operation, {
101
+ diagnostics: {
102
+ reason: "The Ghidra client does not expose its immutable target snapshot for NativeAOT metadata inspection.",
103
+ },
104
+ }));
105
+ const snapshot = await client.readTargetSnapshot(NATIVE_AOT_MAX_SOURCE_BYTES, controller.signal);
106
+ if (!snapshot.ok)
107
+ return err(projectSessionError(operation, snapshot.error, startupTimeoutMs));
108
+ if (closed)
109
+ return err(new AnalysisCancelledError(operation));
110
+ if (identityConflict)
111
+ return identityConflictFailure(operation, imageBase, observations);
112
+ if (controller.signal.aborted)
113
+ return err(new AnalysisCancelledError(operation));
114
+ const parsed = snapshot.value.kind === "over-capacity"
115
+ ? {
116
+ summary: nativeAotSnapshotOverCapacity(target.sha256, snapshot.value.sourceBytesAtLeast, NATIVE_AOT_MAX_REPORT_BYTES),
117
+ readTypeDetail: () => undefined,
118
+ }
119
+ : parseNativeAotPe(snapshot.value.bytes, target.sha256, NATIVE_AOT_MAX_REPORT_BYTES, imageBase);
120
+ if (closed)
121
+ return err(new AnalysisCancelledError(operation));
122
+ if (identityConflict)
123
+ return identityConflictFailure(operation, imageBase, observations);
124
+ if (controller.signal.aborted)
125
+ return err(new AnalysisCancelledError(operation));
126
+ return ok(parsed);
127
+ }
128
+ catch (cause) {
129
+ return err(new ProviderAdapterError("ghidra", operation, {
130
+ diagnostics: {
131
+ reason: cause instanceof Error
132
+ ? cause.message
133
+ : "NativeAOT metadata could not be derived from the captured target snapshot.",
134
+ },
135
+ cause,
136
+ }));
137
+ }
138
+ })();
139
+ const current = { identity: key, promise };
140
+ pending = current;
141
+ void promise.then((settled) => {
142
+ if (pending !== current)
143
+ return;
144
+ pending = undefined;
145
+ if (settled.ok && !closed && !identityConflict)
146
+ result = settled.value;
147
+ });
148
+ }
149
+ const settled = await waitForAbortable(pending.promise, callerSignal);
150
+ if (closed)
151
+ return err(new AnalysisCancelledError(operation));
152
+ if (identityConflict)
153
+ return identityConflictFailure(operation, imageBase, observations);
154
+ if (controller.signal.aborted)
155
+ return err(new AnalysisCancelledError(operation));
156
+ return settled === ABORTED
157
+ ? err(new AnalysisCancelledError(operation))
158
+ : settled;
159
+ };
160
+ return {
161
+ derive,
162
+ readTypeDetail: (address) => result?.readTypeDetail(address, NATIVE_AOT_MAX_REPORT_BYTES),
163
+ close: () => {
164
+ closed = true;
165
+ controller.abort();
166
+ result = undefined;
167
+ pending = undefined;
168
+ },
169
+ };
170
+ };
19
171
  /** Build one AnalysisClient for an admitted Ghidra target and profile. */
20
172
  export const createGhidraProviderClient = (input) => {
21
173
  const { config, logger, clientFactory, target, context, installation } = input;
@@ -35,18 +187,43 @@ export const createGhidraProviderClient = (input) => {
35
187
  },
36
188
  }));
37
189
  const extensions = extensionProfile.data;
190
+ const seedProfile = ghidraSeedCommitmentSchema
191
+ .optional()
192
+ .safeParse(committedProfile.parameters.analysis_seeds);
193
+ if (!seedProfile.success ||
194
+ (config.ghidraSeedFile === undefined) !== (seedProfile.data === undefined))
195
+ return unavailableClient(new ProviderAdapterError("ghidra", "open_binary", {
196
+ diagnostics: {
197
+ reason: "Resolve REA_GHIDRA_SEED_FILE into an analysis profile before opening the session.",
198
+ },
199
+ }));
200
+ const seeds = seedProfile.data;
201
+ const languageOverride = ghidraProfileLanguageOverride(committedProfile.parameters);
202
+ if (!sameGhidraLanguageOverride(languageOverride, config.ghidraLanguageOverride))
203
+ return unavailableClient(new ProviderAdapterError("ghidra", "open_binary", {
204
+ diagnostics: {
205
+ reason: "The committed analysis profile and REA_GHIDRA_LANGUAGE_ID/REA_GHIDRA_COMPILER_SPEC_ID differ; reopen the target to resolve a new profile.",
206
+ },
207
+ }));
38
208
  const invalidProfile = validateGhidraExtensionProfile(extensions, config, target, installation.platform);
39
209
  if (invalidProfile !== null)
40
210
  return unavailableClient(new ProviderAdapterError("ghidra", "open_binary", {
41
211
  diagnostics: { reason: invalidProfile },
42
212
  }));
43
213
  let extensionFailure;
44
- const targetLimitations = target.format === "dos-mz"
45
- ? [
46
- "DOS MZ uses 16-bit x86 real mode with the Ghidra load segment 0x1000. Returned addresses are linear byte coordinates; they do not identify a unique segment:offset alias.",
47
- "Static DOS analysis does not emulate BIOS, DOS interrupts, device ports, or self-modifying unpacking code. Packed targets require a separately identified unpacked artifact for original-program analysis; appended overlays are not the initialized load module.",
48
- ]
49
- : [];
214
+ // Replaced by the reported outcome once the session handshake is checked.
215
+ const seedLimitations = [...ghidraSeedLimitations(seeds)];
216
+ const targetLimitations = [
217
+ ...(target.format === "dos-mz"
218
+ ? [
219
+ "DOS MZ uses 16-bit x86 real mode with the Ghidra load segment 0x1000. Returned addresses are linear byte coordinates; they do not identify a unique segment:offset alias.",
220
+ "Static DOS analysis does not emulate BIOS, DOS interrupts, device ports, or self-modifying unpacking code. Packed targets require a separately identified unpacked artifact for original-program analysis; appended overlays are not the initialized load module.",
221
+ ]
222
+ : []),
223
+ ...(target.kind === "executable" && target.architecture === "mips"
224
+ ? (target.mips.limitations ?? [])
225
+ : []),
226
+ ];
50
227
  const providerLimitations = installation.platform === "win32"
51
228
  ? windowsP0Limitations
52
229
  : installation.platform === "darwin"
@@ -64,6 +241,8 @@ export const createGhidraProviderClient = (input) => {
64
241
  bridgeScriptPath: fileURLToPath(new URL("../../bridge/ghidra/ReaGhidraBridge.java", import.meta.url)),
65
242
  ...(target.format === "dos-mz" ? { dosMz: true } : {}),
66
243
  ...(target.format === "dos-com" ? { dosCom: true } : {}),
244
+ ...(languageOverride === undefined ? {} : { languageOverride }),
245
+ ...(seeds === undefined ? {} : { analysisSeeds: seeds }),
67
246
  platform: installation.platform,
68
247
  ...(extensions.length === 0 ? {} : { analysisExtensions: extensions }),
69
248
  }),
@@ -81,12 +260,22 @@ export const createGhidraProviderClient = (input) => {
81
260
  expectedLanguageId: "x86:LE:16:Real Mode",
82
261
  expectedCompilerSpecId: "default",
83
262
  }
84
- : {}),
263
+ : languageOverride === undefined
264
+ ? {}
265
+ : {
266
+ expectedLanguageId: languageOverride.languageId,
267
+ ...(languageOverride.compilerSpecId === undefined
268
+ ? {}
269
+ : { expectedCompilerSpecId: languageOverride.compilerSpecId }),
270
+ }),
85
271
  ...(context === undefined ? {} : { runId: context.runId }),
86
272
  logger: logger.child({ layer: "ghidra-bridge" }),
87
273
  });
88
274
  const checkExtensions = async (operation, info) => {
89
- extensionFailure = ghidraExtensionFailure(extensions, info.analysis_extensions ?? [], operation);
275
+ extensionFailure =
276
+ ghidraExtensionFailure(extensions, info.analysis_extensions ?? [], operation) ?? ghidraSeedFailure(seeds, info.analysis_seeds, operation);
277
+ if (extensionFailure === undefined && info.analysis_seeds !== undefined)
278
+ seedLimitations.splice(0, seedLimitations.length, ...ghidraSeedLimitations(seeds, info.analysis_seeds));
90
279
  if (extensionFailure === undefined)
91
280
  return undefined;
92
281
  const closed = await client.close();
@@ -95,12 +284,20 @@ export const createGhidraProviderClient = (input) => {
95
284
  : analysisErrorWithCleanupFailure(extensionFailure, closed.error, operation);
96
285
  };
97
286
  const releaseLimitation = unverifiedGhidraBuildLimitation(prerequisites.value.providerVersion);
98
- const sessionLimitations = [
287
+ const sessionLimitations = () => [
99
288
  ...providerLimitations,
100
289
  ...targetLimitations,
101
290
  ...ghidraExtensionLimitations(extensions),
291
+ ...seedLimitations,
102
292
  ...(releaseLimitation === undefined ? [] : [releaseLimitation]),
103
293
  ];
294
+ const nativeAotOwner = target.format === "pe"
295
+ ? createNativeAotSnapshotOwner({
296
+ client,
297
+ target,
298
+ startupTimeoutMs: config.ghidraStartupTimeoutMs,
299
+ })
300
+ : undefined;
104
301
  return {
105
302
  execute: async (operation, parameters, options) => {
106
303
  if (extensionFailure !== undefined)
@@ -118,7 +315,7 @@ export const createGhidraProviderClient = (input) => {
118
315
  return err(failed);
119
316
  return ok(createAnalysisExecution(started.value, committedProfile.provider, {
120
317
  analysisProfile: committedProfile,
121
- limitations: [...healthLimitations, ...sessionLimitations],
318
+ limitations: [...healthLimitations, ...sessionLimitations()],
122
319
  }));
123
320
  }
124
321
  const input = isGhidraFunctionOperation(operation)
@@ -126,7 +323,7 @@ export const createGhidraProviderClient = (input) => {
126
323
  : parseGhidraInventoryInput(operation, parameters);
127
324
  if (!input.ok)
128
325
  return input;
129
- if (extensions.length > 0) {
326
+ if (extensions.length > 0 || seeds !== undefined) {
130
327
  const started = await client.start(options?.signal);
131
328
  if (!started.ok)
132
329
  return err(projectSessionError(operation, started.error, config.ghidraStartupTimeoutMs));
@@ -137,14 +334,71 @@ export const createGhidraProviderClient = (input) => {
137
334
  const called = await client.callTool(operation, input.value, options?.signal === undefined ? {} : { signal: options.signal });
138
335
  if (!called.ok)
139
336
  return err(projectSessionError(operation, called.error, config.ghidraStartupTimeoutMs));
140
- const result = isGhidraFunctionOperation(operation)
141
- ? parseGhidraFunctionResult(operation, called.value)
142
- : parseGhidraInventoryResult(operation, called.value);
143
- if (!result.ok)
144
- return result;
145
- let normalized = result.value;
337
+ let normalized;
338
+ let observationLimitations = [];
339
+ if (isGhidraFunctionOperation(operation)) {
340
+ const result = parseGhidraFunctionResult(operation, called.value);
341
+ if (!result.ok)
342
+ return result;
343
+ normalized = result.value.value;
344
+ observationLimitations = result.value.limitations;
345
+ }
346
+ else {
347
+ const result = parseGhidraInventoryResult(operation, called.value);
348
+ if (!result.ok)
349
+ return result;
350
+ normalized = result.value;
351
+ }
352
+ if (operation === "inspect_native_data_type") {
353
+ const address = input.value.address;
354
+ if (typeof address === "string") {
355
+ if (target.format === "pe" && nativeAotOwner !== undefined) {
356
+ const started = await client.start(options?.signal);
357
+ if (!started.ok)
358
+ return err(projectSessionError(operation, started.error, config.ghidraStartupTimeoutMs));
359
+ const derived = await nativeAotOwner.derive(started.value.target.image_base, operation, options?.signal, normalized);
360
+ if (!derived.ok)
361
+ return derived;
362
+ }
363
+ let metadata;
364
+ metadata = nativeAotOwner?.readTypeDetail(address);
365
+ if (metadata !== undefined &&
366
+ normalized !== null &&
367
+ typeof normalized === "object" &&
368
+ !Array.isArray(normalized)) {
369
+ const nativeResult = normalized;
370
+ if (nativeResult.metadata_recovery === undefined)
371
+ normalized = jsonValueSchema.parse({
372
+ ...nativeResult,
373
+ metadata_recovery: metadata,
374
+ });
375
+ }
376
+ }
377
+ }
146
378
  if (operation === "inspect_native_load_image") {
147
- const attested = await attestGhidraNativeLoadImage(target, operation, result.value, client, (failure) => projectSessionError(operation, failure, config.ghidraStartupTimeoutMs));
379
+ let derived;
380
+ if (target.format === "pe") {
381
+ const observations = nativeLoadImageObservationSchema.parse(normalized);
382
+ if (nativeAotOwner === undefined)
383
+ return err(new ProviderAdapterError("ghidra", operation, {
384
+ diagnostics: {
385
+ reason: "The admitted PE session has no read-only NativeAOT snapshot owner.",
386
+ },
387
+ }));
388
+ const result = await nativeAotOwner.derive(observations.image_base, operation, options?.signal, normalized);
389
+ if (!result.ok)
390
+ return result;
391
+ derived = result.value;
392
+ }
393
+ const attested = await attestGhidraNativeLoadImage({
394
+ target,
395
+ operation,
396
+ measured: normalized,
397
+ client,
398
+ mapSessionError: (failure) => projectSessionError(operation, failure, config.ghidraStartupTimeoutMs),
399
+ nativeAotResult: derived,
400
+ signal: options?.signal,
401
+ });
148
402
  if (!attested.ok)
149
403
  return attested;
150
404
  normalized = attested.value;
@@ -152,7 +406,11 @@ export const createGhidraProviderClient = (input) => {
152
406
  return ok(createAnalysisExecution(normalized, committedProfile.provider, {
153
407
  rawResult: called.value,
154
408
  analysisProfile: committedProfile,
155
- limitations: [...limitationsFor(operation), ...sessionLimitations],
409
+ limitations: [
410
+ ...limitationsFor(operation),
411
+ ...observationLimitations,
412
+ ...sessionLimitations(),
413
+ ],
156
414
  }));
157
415
  },
158
416
  runtimeLineageSnapshots: () => {
@@ -161,7 +419,10 @@ export const createGhidraProviderClient = (input) => {
161
419
  ? []
162
420
  : [{ provider: committedProfile.provider, observation }];
163
421
  },
164
- close: () => client.close(),
422
+ close: async () => {
423
+ nativeAotOwner?.close();
424
+ return client.close();
425
+ },
165
426
  };
166
427
  };
167
428
  const ghidraClientPrerequisites = (target, profile, installation) => {
@@ -1,6 +1,7 @@
1
+ import { ghidraSeedReportSchema } from "./GhidraAnalysisSeeds.js";
1
2
  import { z } from "zod";
2
3
  import { err, ok } from "../domain/result.js";
3
- import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
4
+ import { GHIDRA_INVENTORY_OPERATIONS, GHIDRA_NAMING_OPERATIONS, } from "./GhidraInventoryValues.js";
4
5
  import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
5
6
  import { ghidraExtensionResultSchema } from "./extensions/GhidraExtensions.js";
6
7
  /** Exact methods proved by the bridge handshake after auto-analysis. */
@@ -10,6 +11,11 @@ export const GHIDRA_SESSION_CAPABILITIES = [
10
11
  ...GHIDRA_INVENTORY_OPERATIONS,
11
12
  ...GHIDRA_FUNCTION_OPERATIONS,
12
13
  ];
14
+ /** Methods that edit the session database; read-only bridges omit them. */
15
+ export const GHIDRA_MUTATING_OPERATIONS = new Set([
16
+ "annotate_native_function",
17
+ ...GHIDRA_NAMING_OPERATIONS,
18
+ ]);
13
19
  const capabilitySchema = z.enum(GHIDRA_SESSION_CAPABILITIES);
14
20
  const sessionInfoSchema = z
15
21
  .object({
@@ -26,6 +32,7 @@ const sessionInfoSchema = z
26
32
  analysis_complete: z.boolean(),
27
33
  analysis_timed_out: z.boolean(),
28
34
  analysis_extensions: z.array(ghidraExtensionResultSchema).optional(),
35
+ analysis_seeds: ghidraSeedReportSchema.optional(),
29
36
  capabilities: z.array(capabilitySchema),
30
37
  target: z
31
38
  .object({
@@ -43,7 +50,7 @@ const sessionInfoSchema = z
43
50
  export const parseGhidraSessionInfo = (value, expected) => {
44
51
  const parsed = sessionInfoSchema.safeParse(value);
45
52
  const readOnly = expected.expectedReadOnly ?? false;
46
- const expectedCapabilities = GHIDRA_SESSION_CAPABILITIES.filter((capability) => !readOnly || capability !== "annotate_native_function");
53
+ const expectedCapabilities = GHIDRA_SESSION_CAPABILITIES.filter((capability) => !readOnly || !GHIDRA_MUTATING_OPERATIONS.has(capability));
47
54
  if (!parsed.success ||
48
55
  parsed.data.run_id !== expected.runId ||
49
56
  parsed.data.read_only !== readOnly ||
@@ -77,6 +77,8 @@ export const hopperLoaderArgsForTarget = (target, machoContainer) => {
77
77
  if (target.kind !== "executable")
78
78
  return err(new ProviderAdapterError("hopper", "resolve_analysis_profile"));
79
79
  const architecture = target.architecture;
80
+ if (architecture === "mips")
81
+ return err(new AnalysisCapabilityUnavailableError("hopper", "resolve_analysis_profile", "REA's Hopper adapter does not admit MIPS targets. Select a verified Ghidra MIPS profile instead."));
80
82
  const flag = hopperArchitectureFlag(architecture);
81
83
  switch (target.format) {
82
84
  case "mach-o":
@@ -160,7 +160,7 @@ const stopProcess = async (input, state) => {
160
160
  }
161
161
  input.logger.info(diagnostic, "Owned Hopper launcher shutdown completed");
162
162
  if (stopped.status !== "incomplete") {
163
- if (input.resources.launch?.shutdownMode === "process-cleanup" &&
163
+ if (input.resources.launch?.providerLifetime === "launcher-process" &&
164
164
  stopped.status !== "not-owned")
165
165
  input.resources.shutdownConfirmed = true;
166
166
  state.processStopped = true;
@@ -3,7 +3,7 @@ import { access } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import writeFileAtomic from "write-file-atomic";
6
- import { analysisErrorWithCleanupFailure } from "../application/binary/AnalysisClientCleanup.js";
6
+ import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
7
7
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
8
8
  import { HopperCancelledError, HopperProcessError, HopperProtocolError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "../domain/hopperErrors.js";
9
9
  import {} from "../domain/analysisErrorBase.js";
@@ -13,6 +13,7 @@ import { err, ok } from "../domain/result.js";
13
13
  import { silentLogger } from "../logger.js";
14
14
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
15
15
  import { ProviderStartupDeadline } from "../process/ProviderDeadline.js";
16
+ import { redactCapturedTransportCredential } from "../process/ProviderDiagnosticRedaction.js";
16
17
  import { ProviderRunLineage } from "../process/ProviderRunLineage.js";
17
18
  import { ProviderProcessSupervisor, } from "../process/ProviderProcess.js";
18
19
  import { hopperOperationStage } from "./HopperOperationStage.js";
@@ -23,6 +24,8 @@ import { hopperLauncherFailureDiagnostic } from "./HopperProcessDiagnostic.js";
23
24
  import { HopperRequestQueue, } from "./HopperRequestQueue.js";
24
25
  import { HopperResponseStream } from "./HopperResponseStream.js";
25
26
  import { responseResult, } from "./protocol.js";
27
+ /** Aggregate in-memory retention budget for this provider's launcher output. */
28
+ export const HOPPER_PROCESS_DIAGNOSTIC_BYTES = 8 * 1024 * 1024;
26
29
  const SHUTDOWN_TIMEOUT_MS = 30_000;
27
30
  const SESSION_ROOT = process.platform === "darwin" ? "/tmp" : tmpdir();
28
31
  /**
@@ -434,14 +437,19 @@ export class HopperClient {
434
437
  const token = this.#token;
435
438
  if (snapshot === undefined)
436
439
  return undefined;
437
- const redact = (text) => token === undefined
438
- ? text
439
- : text.replaceAll(token, "[redacted transport credential]");
440
440
  return {
441
441
  exit_code: snapshot.exitCode ?? null,
442
442
  signal: snapshot.signal ?? null,
443
- stdout: { ...snapshot.stdout, text: redact(snapshot.stdout.text) },
444
- stderr: { ...snapshot.stderr, text: redact(snapshot.stderr.text) },
443
+ stdout: {
444
+ text: redactCapturedTransportCredential(snapshot.stdout, token, "[redacted transport credential]"),
445
+ bytes: snapshot.stdout.observedBytes,
446
+ retained_bytes: snapshot.stdout.bytes,
447
+ },
448
+ stderr: {
449
+ text: redactCapturedTransportCredential(snapshot.stderr, token, "[redacted transport credential]"),
450
+ bytes: snapshot.stderr.observedBytes,
451
+ retained_bytes: snapshot.stderr.bytes,
452
+ },
445
453
  output_closed: outputClosed,
446
454
  diagnostic_truncated: snapshot.diagnosticTruncated === true,
447
455
  };
@@ -524,6 +532,7 @@ export class HopperClient {
524
532
  }
525
533
  #attachLauncher(launch) {
526
534
  this.#resources.processSupervisor = new ProviderProcessSupervisor(launch, {
535
+ maxDiagnosticBytes: HOPPER_PROCESS_DIAGNOSTIC_BYTES,
527
536
  onDiagnostic: (event) => this.#onLauncherDiagnostic(launch, event),
528
537
  });
529
538
  }
@@ -21,6 +21,8 @@ export const resolveHopperMachOImage = async (target, signal) => {
21
21
  const invalid = (reason, cause) => err(new BinaryTargetError(target.path, reason, cause === undefined ? undefined : { cause }));
22
22
  if (signal?.aborted)
23
23
  return err(new AnalysisCancelledError("open_binary"));
24
+ if (target.format !== "mach-o")
25
+ return invalid("Hopper FAT64 image preparation requires a Mach-O target");
24
26
  let file;
25
27
  try {
26
28
  file = await open(target.path, "r");
@@ -1,6 +1,6 @@
1
1
  import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
2
  import { fileURLToPath } from "node:url";
3
- import { accessSync, constants } from "node:fs";
3
+ import { accessSync, constants, statSync } from "node:fs";
4
4
  import { createAnalysisExecution } from "../application/AnalysisProvider.js";
5
5
  import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
6
6
  import { err, ok } from "../domain/result.js";
@@ -49,6 +49,9 @@ export class HopperProvider {
49
49
  };
50
50
  try {
51
51
  accessSync(this.config.hopperLauncherPath, constants.X_OK);
52
+ // A searchable directory, such as an .app bundle, also passes X_OK.
53
+ if (!statSync(this.config.hopperLauncherPath).isFile())
54
+ throw new TypeError("Hopper launcher is not a regular file");
52
55
  return {
53
56
  status: "available",
54
57
  code: null,
@@ -87,6 +90,13 @@ export class HopperProvider {
87
90
  reason: null,
88
91
  diagnostics,
89
92
  };
93
+ if (target.architecture === "mips")
94
+ return {
95
+ status: "unsupported",
96
+ code: "architecture_unsupported",
97
+ reason: "REA's Hopper adapter does not admit MIPS targets.",
98
+ diagnostics,
99
+ };
90
100
  if (target.format === "dos-mz" || target.format === "dos-com")
91
101
  return {
92
102
  status: "unsupported",
@@ -183,7 +193,8 @@ export class HopperProvider {
183
193
  ? {
184
194
  ok: true,
185
195
  value: createAnalysisExecution(mapped.value, executionProvider, {
186
- rawResult: result.value,
196
+ // Only the file-offset mapping differs from Hopper's reply.
197
+ rawResult: mapped === result ? null : result.value,
187
198
  ...(profile === undefined ? {} : { analysisProfile: profile }),
188
199
  limitations: [
189
200
  ...(preparedImage === undefined