rea-agents 6.0.0 → 6.2.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 (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,9 +1,14 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { spawnSync } from "node:child_process";
2
3
  import { constants } from "node:fs";
3
4
  import { accessSync, readFileSync } from "node:fs";
4
5
  import { posix, win32 } from "node:path";
5
6
  import { ghidraApplicationProperties, ghidraJavaMajorAccepted, ghidraJavaRangeLabel, ghidraJavaRequirement, ghidraReleaseAccepted, ghidraReleaseCompatibility, ghidraReleaseLine, ghidraVersionDetail, SUPPORTED_GHIDRA_JAVA_MAJOR, SUPPORTED_GHIDRA_VERSION, } from "./GhidraInstallationPolicy.js";
6
- export { SUPPORTED_GHIDRA_JAVA_MAJOR, SUPPORTED_GHIDRA_VERSION };
7
+ const NATIVE_PLATFORMS = {
8
+ linux: { x64: "linux_x86_64", arm64: "linux_arm_64" },
9
+ darwin: { x64: "mac_x86_64", arm64: "mac_arm_64" },
10
+ win32: { x64: "win_x86_64" },
11
+ };
7
12
  /** Inspect an installation without importing a target or modifying Ghidra. */
8
13
  export const inspectGhidraInstallation = (options, host = systemGhidraInstallationHost()) => {
9
14
  const platform = options.platform ?? process.platform;
@@ -67,16 +72,13 @@ const installationCoordinates = (options, platform, architecture, host) => {
67
72
  const analyzeHeadlessPath = installDir === null
68
73
  ? null
69
74
  : path.join(installDir, "support", platform === "win32" ? "analyzeHeadless.bat" : "analyzeHeadless");
70
- const decompilerPlatform = platform === "darwin"
71
- ? architecture === "arm64"
72
- ? "mac_arm_64"
73
- : "mac_x86_64"
74
- : null;
75
- const nativeDecompilerPath = installDir === null || decompilerPlatform === null
75
+ const decompilerPlatform = NATIVE_PLATFORMS[platform]?.[architecture];
76
+ const decompilerExecutable = platform === "win32" ? "decompile.exe" : "decompile";
77
+ const nativeDecompilerPath = installDir === null || decompilerPlatform === undefined
76
78
  ? null
77
79
  : ([
78
- path.join(installDir, "Ghidra", "Features", "Decompiler", "os", decompilerPlatform, "decompile"),
79
- path.join(installDir, "Ghidra", "Features", "Decompiler", "build", "os", decompilerPlatform, "decompile"),
80
+ path.join(installDir, "Ghidra", "Features", "Decompiler", "os", decompilerPlatform, decompilerExecutable),
81
+ path.join(installDir, "Ghidra", "Features", "Decompiler", "build", "os", decompilerPlatform, decompilerExecutable),
80
82
  ].find((candidate) => host.executable(candidate)) ?? null);
81
83
  const properties = applicationPropertiesPath === null
82
84
  ? undefined
@@ -95,33 +97,28 @@ const installationCoordinates = (options, platform, architecture, host) => {
95
97
  ? undefined
96
98
  : ghidraApplicationProperties(properties),
97
99
  javaCommand,
98
- java: host.probeJava(javaCommand, ghidraJavaEnvironment(options.javaHome, process.env, platform)),
100
+ // The configuration check rejects a relative JAVA_HOME. Probing it would
101
+ // run whatever `bin/java` the current directory holds.
102
+ java: options.javaHome === undefined || path.isAbsolute(options.javaHome)
103
+ ? host.probeJava(javaCommand, ghidraJavaEnvironment(options.javaHome, options.environment, platform))
104
+ : undefined,
99
105
  };
100
106
  };
101
107
  const installationChecks = ({ coordinates, platform, architecture, javaHome, host, }) => [
102
- installationCheck({
103
- name: "configuration",
104
- passed: coordinates.installDir !== null,
105
- code: "not_configured",
106
- detail: coordinates.installDir ?? "GHIDRA_INSTALL_DIR is not set",
107
- remediation: `Set GHIDRA_INSTALL_DIR to an extracted Ghidra ${ghidraReleaseLine()} release directory.`,
108
- }),
108
+ configurationCheck(coordinates.installDir, javaHome, platform),
109
109
  installationCheck({
110
110
  name: "platform",
111
- passed: platform === "linux" || platform === "win32" || platform === "darwin",
111
+ passed: NATIVE_PLATFORMS[platform] !== undefined,
112
112
  code: "unsupported_host",
113
113
  detail: platform,
114
- remediation: "Use Linux or Windows x64, or macOS x64/arm64 with matching native Ghidra tools.",
114
+ remediation: "Use Linux or macOS x64/arm64, or Windows x64 with matching native Ghidra tools.",
115
115
  }),
116
116
  installationCheck({
117
117
  name: "architecture",
118
- passed: ((platform === "linux" || platform === "win32") &&
119
- architecture === "x64") ||
120
- (platform === "darwin" &&
121
- (architecture === "x64" || architecture === "arm64")),
118
+ passed: NATIVE_PLATFORMS[platform]?.[architecture] !== undefined,
122
119
  code: "unsupported_host",
123
120
  detail: architecture,
124
- remediation: "Use x64 on Linux or Windows, or x64/arm64 on macOS.",
121
+ remediation: "Use x64/arm64 on Linux or macOS, or x64 on Windows.",
125
122
  }),
126
123
  installationCheck({
127
124
  name: "installation",
@@ -142,16 +139,43 @@ const installationChecks = ({ coordinates, platform, architecture, javaHome, hos
142
139
  }),
143
140
  installationCheck({
144
141
  name: "native_decompiler",
145
- passed: platform !== "darwin" || coordinates.nativeDecompilerPath !== null,
142
+ passed: coordinates.nativeDecompilerPath !== null,
146
143
  code: "executable_missing",
147
- detail: platform !== "darwin"
148
- ? "not required on this platform"
149
- : (coordinates.nativeDecompilerPath ??
150
- "matching macOS native decompiler was not found"),
151
- remediation: "REA does not build native tools. Build Ghidra's native components for this macOS architecture or provide an installation containing Ghidra/Features/Decompiler/os/<platform>/decompile.",
144
+ detail: coordinates.nativeDecompilerPath ??
145
+ `Matching native decompiler for ${platform}/${architecture} was not found`,
146
+ remediation: `Provide an executable Ghidra/Features/Decompiler/os/${NATIVE_PLATFORMS[platform]?.[architecture] ?? "<platform>"}/${platform === "win32" ? "decompile.exe" : "decompile"}, or its build/os equivalent. REA does not build or install native tools.`,
152
147
  }),
153
148
  javaCheck(coordinates.java, coordinates.javaCommand, javaHome, coordinates.properties),
154
149
  ];
150
+ /**
151
+ * REA's configuration parser, and so the MCP server and analysis, accept only
152
+ * absolute paths; a relative one that happens to resolve here must not pass.
153
+ */
154
+ const configurationCheck = (installDir, javaHome, platform) => {
155
+ const { isAbsolute } = platform === "win32" ? win32 : posix;
156
+ const relative = [
157
+ ...(installDir !== null && !isAbsolute(installDir)
158
+ ? ["GHIDRA_INSTALL_DIR"]
159
+ : []),
160
+ ...(javaHome !== undefined && !isAbsolute(javaHome) ? ["JAVA_HOME"] : []),
161
+ ];
162
+ if (installDir === null || relative.length === 0)
163
+ return installationCheck({
164
+ name: "configuration",
165
+ passed: installDir !== null,
166
+ code: "not_configured",
167
+ detail: installDir ?? "GHIDRA_INSTALL_DIR is not set",
168
+ remediation: `Set GHIDRA_INSTALL_DIR to an extracted Ghidra ${ghidraReleaseLine()} release directory.`,
169
+ });
170
+ const settings = relative.join(" and ");
171
+ return installationCheck({
172
+ name: "configuration",
173
+ passed: false,
174
+ code: "not_configured",
175
+ detail: `${settings} must be absolute`,
176
+ remediation: `Set ${settings} to ${relative.length === 1 ? "an absolute path" : "absolute paths"}. REA's analysis and MCP server reject relative paths even when they resolve from the current directory.`,
177
+ });
178
+ };
155
179
  /** Project an installation probe into caller-visible, secret-free diagnostics. */
156
180
  export const ghidraInstallationDiagnostics = (inspection) => ({
157
181
  install_dir: inspection.installDir,
@@ -172,9 +196,10 @@ export const ghidraInstallationDiagnostics = (inspection) => ({
172
196
  })),
173
197
  });
174
198
  /** Environment that makes an explicitly selected JDK win over PATH discovery. */
175
- export const ghidraJavaEnvironment = (javaHome, environment = process.env, platform = process.platform) => {
199
+ export const ghidraJavaEnvironment = (javaHome, environment, platform = process.platform) => {
200
+ const selectedEnvironment = snapshotEnvironment(environment, platform);
176
201
  const boundedEnvironment = {
177
- ...environment,
202
+ ...selectedEnvironment,
178
203
  _JAVA_OPTIONS: "",
179
204
  JAVA_TOOL_OPTIONS: "",
180
205
  JDK_JAVA_OPTIONS: "",
@@ -185,7 +210,7 @@ export const ghidraJavaEnvironment = (javaHome, environment = process.env, platf
185
210
  : {
186
211
  ...boundedEnvironment,
187
212
  JAVA_HOME: javaHome,
188
- PATH: `${(platform === "win32" ? win32 : posix).join(javaHome, "bin")}${platform === "win32" ? win32.delimiter : posix.delimiter}${environment.PATH ?? ""}`,
213
+ PATH: `${(platform === "win32" ? win32 : posix).join(javaHome, "bin")}${platform === "win32" ? win32.delimiter : posix.delimiter}${selectedEnvironment.PATH ?? ""}`,
189
214
  };
190
215
  };
191
216
  const installationCheck = (options) => options.passed
@@ -1,9 +1,10 @@
1
1
  import { z } from "zod";
2
2
  import { nativeLoadImageObservationSchema } from "../domain/native/nativeLoadImage.js";
3
- import { AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
+ import { AnalysisOutputError, } from "../domain/analysisErrorCore.js";
4
4
  import { functionBodySchema, functionBodyEntryAgrees, } from "../domain/hopperValues.js";
5
5
  import { jsonValueSchema } from "../domain/jsonValue.js";
6
6
  import { err, ok } from "../domain/result.js";
7
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
7
8
  /** Read-only direct inventory operations admitted by the Ghidra adapter. */
8
9
  export const GHIDRA_INVENTORY_OPERATIONS = [
9
10
  "inspect_native_load_image",
@@ -26,7 +27,11 @@ export const isGhidraInventoryOperation = (operation) => operationSet.has(operat
26
27
  export const ghidraIdentifierSchema = z.string().min(1);
27
28
  const identifier = ghidraIdentifierSchema;
28
29
  const document = identifier.nullable().default(null);
29
- const explicitAddress = identifier;
30
+ /** Caller address spelling; the bridge resolves its space and emits canonical output. */
31
+ export const ghidraInputAddressSchema = z
32
+ .string()
33
+ .regex(/^(?:(?:0[xX])?[0-9a-fA-F]+|(?:[A-Za-z0-9._~-]|%[0-9a-fA-F]{2})+:0[xX][0-9a-fA-F]+)$/u, "Use hexadecimal digits, optionally prefixed with 0x, or an encoded address-space name followed by :0x and hexadecimal digits");
34
+ const explicitAddress = ghidraInputAddressSchema;
30
35
  const filteredAddress = explicitAddress.nullable().default(null);
31
36
  const searchInput = {
32
37
  pattern: z.string().min(1),
@@ -62,7 +67,9 @@ const inputSchemas = {
62
67
  export const parseGhidraInventoryInput = (operation, value) => {
63
68
  const parsed = inputSchemas[operation].safeParse(value);
64
69
  if (!parsed.success)
65
- return err(new AnalysisInputError(operation, { cause: parsed.error }));
70
+ return err(analysisInputErrorFromIssues(operation, parsed.error.issues, value, {
71
+ cause: parsed.error,
72
+ }));
66
73
  return ok(parsed.data);
67
74
  };
68
75
  export const ghidraCanonicalAddressSchema = z
@@ -171,7 +178,10 @@ const containingProcedure = z.discriminatedUnion("found", [
171
178
  .strict()
172
179
  .superRefine((value, context) => {
173
180
  const body = value.procedure.body;
174
- if (body.available &&
181
+ const exactExternalEntry = value.procedure.classification.external &&
182
+ value.query_address === value.procedure.address;
183
+ if (!exactExternalEntry &&
184
+ body.available &&
175
185
  !functionBodyEntryAgrees({ ...body, contains_entry: true }, value.query_address))
176
186
  context.addIssue({
177
187
  code: "custom",
@@ -0,0 +1,66 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
+ import { dirname, join } from "node:path";
3
+ import { execFileOutput } from "../process/ExecFileOutput.js";
4
+ /** Launch coordinates obtained from Ghidra's own release configuration helper. */
5
+ export const ghidraJavaLaunch = async (options) => {
6
+ const supportRoot = dirname(options.analyzeHeadlessPath);
7
+ const installRoot = dirname(supportRoot);
8
+ const command = join(options.javaHome, "bin", "java");
9
+ const isolatedProperties = [
10
+ `-Duser.home=${options.homeRoot}`,
11
+ `-Djava.io.tmpdir=${options.tempRoot}`,
12
+ ];
13
+ const supportArguments = [
14
+ ...isolatedProperties,
15
+ "-cp",
16
+ join(supportRoot, "LaunchSupport.jar"),
17
+ "LaunchSupport",
18
+ installRoot,
19
+ ];
20
+ const environment = {
21
+ ...snapshotEnvironment(options.environment, options.platform),
22
+ };
23
+ const configuredEnvironment = await execFileOutput(command, [...supportArguments, "-envvars"], {
24
+ env: environment,
25
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
26
+ });
27
+ for (const line of configuredEnvironment.stdout.split(/\r?\n/u)) {
28
+ if (line === "")
29
+ continue;
30
+ const separator = line.indexOf("=");
31
+ const sourceKey = line.slice(0, separator);
32
+ const key = options.platform === "win32" ? sourceKey.toUpperCase() : sourceKey;
33
+ if (separator < 1 || !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key))
34
+ throw new Error(`Invalid Ghidra LaunchSupport environment entry: ${line}`);
35
+ if ((environment[key] ?? "") === "")
36
+ environment[key] = line.slice(separator + 1);
37
+ }
38
+ const configuredArguments = await execFileOutput(command, [...supportArguments, "-vmargs"], {
39
+ env: environment,
40
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
41
+ });
42
+ const vmArguments = configuredArguments.stdout
43
+ .split(/\r?\n/u)
44
+ .filter((line) => line !== "");
45
+ if (vmArguments.some((argument) => !argument.startsWith("-") || argument.includes("\0")))
46
+ throw new Error("Invalid Ghidra LaunchSupport JVM argument");
47
+ return {
48
+ command,
49
+ environment,
50
+ arguments: [
51
+ ...vmArguments,
52
+ ...(options.platform === "darwin" ? ["-Xdock:name=Ghidra-Headless"] : []),
53
+ `-Xmx${environment.GHIDRA_HEADLESS_MAXMEM || environment.GHIDRA_MAXMEM || "2G"}`,
54
+ "-XX:ParallelGCThreads=2",
55
+ "-XX:CICompilerCount=2",
56
+ "-Djava.awt.headless=true",
57
+ ...isolatedProperties,
58
+ "-showversion",
59
+ "-cp",
60
+ join(installRoot, "Ghidra", "Framework", "Utility", "lib", "Utility.jar"),
61
+ "ghidra.Ghidra",
62
+ "ghidra.app.util.headless.AnalyzeHeadless",
63
+ ...options.arguments,
64
+ ],
65
+ };
66
+ };
@@ -1,3 +1,4 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { mkdir } from "node:fs/promises";
2
3
  import { basename, dirname, join, win32 } from "node:path";
3
4
  import writeFileAtomic from "write-file-atomic";
@@ -7,6 +8,7 @@ import { err, ok } from "../domain/result.js";
7
8
  import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, } from "../process/ProcessOwnership.js";
8
9
  import { spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
9
10
  import { ghidraJavaEnvironment } from "./GhidraInstallation.js";
11
+ import { ghidraJavaLaunch } from "./GhidraJavaLaunch.js";
10
12
  import { snapshotGhidraExtensions, } from "./extensions/GhidraExtensions.js";
11
13
  /** Local launch failure retained as the cause of a provider-neutral error. */
12
14
  export class GhidraLaunchError extends Error {
@@ -19,7 +21,10 @@ export class GhidraLaunchError extends Error {
19
21
  export class GhidraHeadlessLauncher {
20
22
  options;
21
23
  constructor(options) {
22
- this.options = options;
24
+ this.options = {
25
+ ...options,
26
+ environment: snapshotEnvironment(options.environment, options.platform),
27
+ };
23
28
  }
24
29
  async launch(session, options = {}) {
25
30
  if (isAborted(options.signal))
@@ -58,7 +63,8 @@ export class GhidraHeadlessLauncher {
58
63
  ? {}
59
64
  : { dosMz: this.options.dosMz }),
60
65
  });
61
- const command = ghidraHeadlessCommand({
66
+ const scriptCommand = ghidraHeadlessCommand({
67
+ environment: this.options.environment,
62
68
  platform,
63
69
  analyzeHeadlessPath: this.options.analyzeHeadlessPath,
64
70
  arguments: headlessArguments,
@@ -66,25 +72,46 @@ export class GhidraHeadlessLauncher {
66
72
  ? {}
67
73
  : { comSpec: this.options.comSpec }),
68
74
  });
75
+ const environment = ghidraLaunchEnvironment(paths, this.options.javaHome, platform, scriptCommand.command, this.options.environment);
76
+ if (platform !== "win32" && this.options.javaHome === undefined)
77
+ throw new GhidraLaunchError("POSIX Ghidra requires its inspected JDK home");
78
+ const command = platform !== "win32" && this.options.javaHome !== undefined
79
+ ? await ghidraJavaLaunch({
80
+ platform,
81
+ analyzeHeadlessPath: this.options.analyzeHeadlessPath,
82
+ javaHome: this.options.javaHome,
83
+ homeRoot: paths.homeRoot,
84
+ tempRoot: paths.tempRoot,
85
+ arguments: headlessArguments,
86
+ environment,
87
+ ...(options.signal === undefined
88
+ ? {}
89
+ : { signal: options.signal }),
90
+ })
91
+ : { ...scriptCommand, environment };
69
92
  started = await spawnOwnedProviderProcess({
70
93
  command: command.command,
71
94
  arguments: command.arguments,
72
95
  runId: session.runId,
73
- // analyzeHeadless is an interpreter-driven script. Parent identity and
74
- // the per-process run token remain the cleanup authority.
75
- expectedCommand: null,
96
+ // POSIX launches the inspected JVM directly; script wrappers cannot
97
+ // preserve JVM property paths containing spaces as single arguments.
98
+ expectedCommand: platform !== "win32" ? command.command : null,
76
99
  windowsVerbatimArguments: platform === "win32",
77
100
  platform,
78
- env: ghidraLaunchEnvironment(paths, this.options.javaHome, platform, command.command),
101
+ env: command.environment,
102
+ hostEnvironment: {},
79
103
  ...(options.signal === undefined ? {} : { signal: options.signal }),
80
104
  });
81
105
  await writeGhidraRuntimeFile(paths.ownershipPath, `${JSON.stringify({
82
106
  run_id: session.runId,
107
+ transport: session.transport,
108
+ endpoint_path: session.endpointPath,
83
109
  pid: started.ownership.leaderPid,
84
110
  process_group_id: started.ownership.processGroupId,
85
111
  parent_pid: process.pid,
86
112
  ownership_kind: platform === "win32" ? "windows-job-object" : "posix-process-group",
87
- launcher: this.options.analyzeHeadlessPath,
113
+ launcher: command.command,
114
+ headless_script: this.options.analyzeHeadlessPath,
88
115
  created_at: new Date().toISOString(),
89
116
  })}\n`, platform);
90
117
  if (isAborted(options.signal)) {
@@ -124,11 +151,13 @@ export const ghidraHeadlessCommand = (options) => {
124
151
  command: options.analyzeHeadlessPath,
125
152
  arguments: [...options.arguments],
126
153
  };
154
+ const environment = snapshotEnvironment(options.environment, options.platform);
155
+ const systemRoot = environment.SYSTEMROOT;
127
156
  const comSpec = options.comSpec ??
128
- process.env.ComSpec ??
129
- (process.env.SystemRoot === undefined
157
+ environment.COMSPEC ??
158
+ (systemRoot === undefined
130
159
  ? "C:\\Windows\\System32\\cmd.exe"
131
- : win32.join(process.env.SystemRoot, "System32", "cmd.exe"));
160
+ : win32.join(systemRoot, "System32", "cmd.exe"));
132
161
  if (!win32.isAbsolute(comSpec) ||
133
162
  win32.basename(comSpec).toLowerCase() !== "cmd.exe")
134
163
  throw new GhidraLaunchError("Windows ComSpec must be an absolute cmd.exe path");
@@ -244,9 +273,9 @@ const writeGhidraRuntimeFile = async (path, content, platform) => {
244
273
  }
245
274
  await writeFileAtomic(path, content, { encoding: "utf8", mode: 0o600 });
246
275
  };
247
- const ghidraLaunchEnvironment = (paths, javaHome, platform, executable) => {
276
+ const ghidraLaunchEnvironment = (paths, javaHome, platform, executable, selectedEnvironment) => {
248
277
  return {
249
- ...ghidraJavaEnvironment(javaHome, process.env, platform),
278
+ ...ghidraJavaEnvironment(javaHome, selectedEnvironment, platform),
250
279
  ...ghidraHeadlessJavaOptions(paths.homeRoot, paths.tempRoot, platform),
251
280
  HOME: paths.homeRoot,
252
281
  TMPDIR: paths.tempRoot,
@@ -267,22 +296,18 @@ const ghidraLaunchEnvironment = (paths, javaHome, platform, executable) => {
267
296
  XDG_DATA_HOME: paths.dataRoot,
268
297
  };
269
298
  };
270
- /** Encode provider-owned JVM paths for the parser that actually consumes them. */
299
+ /** Encode provider-owned JVM paths for the platform launcher that consumes them. */
271
300
  export const ghidraHeadlessJavaOptions = (homeRoot, tempRoot, platform) => {
272
301
  const options = [`-Duser.home=${homeRoot}`, `-Djava.io.tmpdir=${tempRoot}`];
273
- // analyzeHeadless.bat quotes VMARG_LIST, then launch.bat expands it again.
274
- // Inner quotes fail in cmd.exe; unquoted paths with spaces split at the JVM.
275
- // JDK_JAVA_OPTIONS is parsed by Java itself, outside that batch expansion.
276
- return platform === "win32"
277
- ? {
302
+ if (platform === "win32")
303
+ return {
278
304
  JDK_JAVA_OPTIONS: [...options, "-XX:-UsePerfData"]
279
305
  .map(quoteWindowsBatchToken)
280
306
  .join(" "),
281
307
  GHIDRA_HEADLESS_JAVA_OPTIONS: "",
282
- }
283
- : {
284
- JDK_JAVA_OPTIONS: "",
285
- GHIDRA_HEADLESS_JAVA_OPTIONS: options.join(" "),
286
308
  };
309
+ // POSIX launches the JVM directly, so these properties travel as separate
310
+ // argv items instead of the shell-split analyzeHeadless option list.
311
+ return { JDK_JAVA_OPTIONS: "", GHIDRA_HEADLESS_JAVA_OPTIONS: "" };
287
312
  };
288
313
  const isAborted = (signal) => signal?.aborted === true;
@@ -1,3 +1,4 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import {} from "../application/AnalysisProvider.js";
2
3
  import { createAnalysisProfile, } from "../domain/analysisProfile.js";
3
4
  import { jsonObjectSchema, jsonValueSchema, } from "../domain/jsonValue.js";
@@ -9,7 +10,6 @@ import { resolveGhidraExtensions } from "./extensions/GhidraExtensions.js";
9
10
  import { CAPABILITIES, windowsP0Capabilities, GHIDRA_PROVIDER_IDENTITY, GHIDRA_OPERATIONS, } from "./GhidraProviderCapabilities.js";
10
11
  import { createGhidraProviderClient, } from "./GhidraProviderClient.js";
11
12
  import { windowsNativeAuthorityUnavailableReason, hasWindowsNativeAuthority, windowsNativeCapabilities, } from "../process/WindowsAuthority.js";
12
- export { GHIDRA_PROVIDER_IDENTITY, GHIDRA_OPERATIONS };
13
13
  const SUPPORTED_ARCHITECTURES = new Set(["x86", "x86_64", "arm", "arm64"]);
14
14
  /** Ghidra candidate backed by an isolated ephemeral headless import. */
15
15
  export class GhidraProvider {
@@ -18,11 +18,13 @@ export class GhidraProvider {
18
18
  installationHost;
19
19
  clientFactory;
20
20
  #installation;
21
- constructor(config, logger, installationHost, clientFactory = (options) => new GhidraClient(options)) {
21
+ environment;
22
+ constructor(config, logger, environment, installationHost, clientFactory = (options) => new GhidraClient(options)) {
22
23
  this.config = config;
23
24
  this.logger = logger;
24
25
  this.installationHost = installationHost;
25
26
  this.clientFactory = clientFactory;
27
+ this.environment = snapshotEnvironment(environment, installationHost?.platform);
26
28
  }
27
29
  identity() {
28
30
  return GHIDRA_PROVIDER_IDENTITY;
@@ -125,6 +127,7 @@ export class GhidraProvider {
125
127
  createClient(target, profile, context) {
126
128
  return createGhidraProviderClient({
127
129
  config: this.config,
130
+ environment: this.environment,
128
131
  logger: this.logger,
129
132
  clientFactory: this.clientFactory,
130
133
  target,
@@ -135,6 +138,7 @@ export class GhidraProvider {
135
138
  }
136
139
  #inspectInstallation() {
137
140
  const options = {
141
+ environment: this.environment,
138
142
  ...(this.config.ghidraInstallDir === undefined
139
143
  ? {}
140
144
  : { installDir: this.config.ghidraInstallDir }),
@@ -16,6 +16,7 @@ export const GHIDRA_OPERATIONS = Object.freeze([
16
16
  export const healthLimitations = Object.freeze([
17
17
  "The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.",
18
18
  "The imported Program and temporary project are ephemeral and deleted on close. Annotation operations edit session database metadata; original executable bytes are never written.",
19
+ "Cancelling an active Ghidra request terminates its ephemeral database and discards session annotations. The selected target remains open; the next provider query imports the original artifact again.",
19
20
  ]);
20
21
  /** Additional limitations applied to the experimental Windows x64 P0 boundary. */
21
22
  export const windowsP0Limitations = Object.freeze([
@@ -33,7 +34,8 @@ export const limitationsFor = (operation) => {
33
34
  case "annotate_native_function":
34
35
  return [
35
36
  ...common,
36
- "Names use Ghidra USER_DEFINED source. Name writes preserve the existing namespace; readback uses the fully qualified name. Regular comments map to PRE and inline comments to EOL at the exact function entry. Changes commit together after readback and refreshed analysis; failure rolls them all back.",
37
+ "Names use Ghidra USER_DEFINED source. Name writes accept a leaf name or a fully qualified name within the existing namespace; readback uses the fully qualified name and can be reused without adding namespace prefixes. Edits retain the current namespace; other namespace-like text remains literal leaf-name text. Regular comments map to PRE and inline comments to EOL at the exact function entry. Changes commit together after readback and refreshed analysis; failure rolls them all back.",
38
+ "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.",
37
39
  "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.",
38
40
  ];
39
41
  case "inspect_native_load_image":
@@ -72,6 +74,11 @@ export const limitationsFor = (operation) => {
72
74
  ...common,
73
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.",
74
76
  ];
77
+ case "resolve_containing_procedure":
78
+ return [
79
+ ...common,
80
+ "An exact external entry resolves to its observed function identity even when its body is empty. This does not establish mapped executable bytes or containment of nearby external addresses.",
81
+ ];
75
82
  case "list_segments":
76
83
  return [
77
84
  ...common,
@@ -79,7 +86,10 @@ export const limitationsFor = (operation) => {
79
86
  ];
80
87
  case "search_procedures":
81
88
  case "search_strings":
82
- return common;
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
+ ];
83
93
  case "procedure_pseudo_code":
84
94
  return [
85
95
  ...common,
@@ -112,12 +122,14 @@ export const limitationsFor = (operation) => {
112
122
  case "procedure_references":
113
123
  return [
114
124
  ...common,
125
+ "References cover the complete Ghidra function-body AddressSet and exact entry, including instruction-interior destinations and embedded-data sources; an enclosing address span does not establish function ownership.",
115
126
  "Reference kinds are direct Ghidra ReferenceManager observations; unresolved computed flows without a target are absent and remain unknown.",
116
127
  "Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
117
128
  ];
118
129
  case "analyze_function":
119
130
  return [
120
131
  ...common,
132
+ "References cover the complete Ghidra function-body AddressSet and exact entry. Dossier incoming edges omit sources owned by that function; procedure_references also retains those internal edges.",
121
133
  "The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.",
122
134
  "Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.",
123
135
  "Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
@@ -134,6 +146,12 @@ export const CAPABILITIES = Object.freeze(GHIDRA_OPERATIONS.map((operation) => {
134
146
  operation,
135
147
  available: true,
136
148
  reason: null,
149
+ // Project writes are private import machinery. Analysis reads are bound
150
+ // to the artifact/profile; session annotations disable snapshot replay.
151
+ ...(operation === "annotate_native_function" ||
152
+ operation === "list_documents"
153
+ ? {}
154
+ : { cachePolicy: "snapshot" }),
137
155
  effects: Object.freeze({
138
156
  mutatesArtifact: operation === "annotate_native_function",
139
157
  launchesProcess: true,