rea-agents 4.0.1 → 5.0.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 (740) hide show
  1. package/README.md +257 -96
  2. package/bridge/android/ReaJadxBridge.java +247 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +358 -15
  4. package/bridge/ghidra/ReaGhidraExtensions.java +113 -0
  5. package/bridge/ghidra/ReaGhidraPrepareCom.java +32 -0
  6. package/bridge/native/NativeUIChildren.swift +27 -0
  7. package/bridge/native/ReaNativeUI.swift +30 -16
  8. package/dist/android/AndroidTargetSnapshot.js +36 -0
  9. package/dist/android/JadxAnalysis.js +193 -0
  10. package/dist/android/JadxConfiguration.js +57 -0
  11. package/dist/android/JadxMcpTransport.js +172 -0
  12. package/dist/android/JadxProtocol.js +109 -0
  13. package/dist/android/JadxProvider.js +259 -0
  14. package/dist/android/JadxRelease.js +27 -0
  15. package/dist/android/JadxSession.js +111 -0
  16. package/dist/application/AnalysisContextQueries.js +2 -1
  17. package/dist/application/AppBundleExecutable.js +141 -0
  18. package/dist/application/ArtifactExtraction.js +7 -4
  19. package/dist/application/ArtifactGraphConstruction.js +10 -17
  20. package/dist/application/ArtifactInventory/classify.js +1 -1
  21. package/dist/application/ArtifactInventory/scanCanonical.js +9 -8
  22. package/dist/application/ArtifactInventory/scanReader.js +1 -1
  23. package/dist/application/ArtifactInventory.js +1 -1
  24. package/dist/application/BinaryTargetResolver.js +32 -68
  25. package/dist/application/BrowserObservationService.js +2 -1
  26. package/dist/application/BrowserScenarioCaptureService.js +2 -1
  27. package/dist/application/BrowserScenarioEvidence.js +2 -2
  28. package/dist/application/CallPathTracing.js +2 -1
  29. package/dist/application/CapabilityInventory.js +78 -2
  30. package/dist/application/ClientConfigPath.js +3 -1
  31. package/dist/application/ClientConfigurationDocument.js +83 -13
  32. package/dist/application/ClientRegistrationStatus.js +15 -9
  33. package/dist/application/DirectAnalysis.js +35 -21
  34. package/dist/application/DirectAnalysisStatus.js +7 -8
  35. package/dist/application/Doctor.js +48 -8
  36. package/dist/application/DoctorDiagnostics.js +9 -7
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/EnhancedLiteralTracing.js +2 -1
  39. package/dist/application/EnhancedToolTypes.js +2 -1
  40. package/dist/application/EnhancedTools.js +7 -5
  41. package/dist/application/EvidenceBundleCommands.js +3 -2
  42. package/dist/application/EvidenceBundleFiles.js +1 -1
  43. package/dist/application/EvidenceInputResolver.js +30 -0
  44. package/dist/application/FilesystemSnapshot.js +20 -5
  45. package/dist/application/FunctionAnalysisEvidence.js +32 -0
  46. package/dist/application/InventoryProjectionEvidence.js +2 -1
  47. package/dist/application/InvestigationProviders.js +6 -0
  48. package/dist/application/JsonFiles.js +1 -1
  49. package/dist/application/LinuxHopper.js +20 -6
  50. package/dist/application/MacHopper.js +20 -7
  51. package/dist/application/OptionalObservationProviders.js +3 -0
  52. package/dist/application/ProcessCaptureCapability.js +1 -1
  53. package/dist/application/ProcessCaptureError.js +1 -1
  54. package/dist/application/ProcessCaptureJournal.js +3 -1
  55. package/dist/application/ProcessCaptureLifecycle.js +8 -5
  56. package/dist/application/ProcessCli.js +14 -6
  57. package/dist/application/ProcessEvidence.js +2 -6
  58. package/dist/application/ProcessHarness.js +23 -11
  59. package/dist/application/ProcessNormalization.js +12 -5
  60. package/dist/application/ProcessSampling.js +3 -1
  61. package/dist/application/ReconstructionCoverageService.js +4 -7
  62. package/dist/application/ReconstructionObligationCandidates.js +5 -2
  63. package/dist/application/ReconstructionObligationLedgerService.js +2 -1
  64. package/dist/application/ReferenceSourceImport.js +2 -0
  65. package/dist/application/ReferenceSourceImportEntries.js +22 -3
  66. package/dist/application/ReferenceSourceImportPolicy.js +4 -2
  67. package/dist/application/ReferenceSourceImportTypes.js +5 -0
  68. package/dist/application/ReferenceSourceVcsAdapter.js +35 -4
  69. package/dist/application/Setup.js +11 -130
  70. package/dist/application/SetupClientConfiguration.js +36 -22
  71. package/dist/application/SetupHost.js +126 -0
  72. package/dist/application/SetupPlan.js +1 -1
  73. package/dist/application/SetupRegistrationEnvironment.js +1 -2
  74. package/dist/application/SetupSkill.js +9 -3
  75. package/dist/application/SetupTypes.js +17 -0
  76. package/dist/application/StoreFileLock.js +7 -2
  77. package/dist/application/SupportedClients.js +8 -0
  78. package/dist/application/Uninstall.js +32 -21
  79. package/dist/application/UpdateMaintenance.js +3 -3
  80. package/dist/application/UpdateRuntime.js +5 -2
  81. package/dist/application/ValidateSelectedWebScript.js +27 -0
  82. package/dist/application/WebModuleTraceService.js +209 -0
  83. package/dist/application/WebRuntimeService.js +73 -0
  84. package/dist/application/WebScriptExportService.js +115 -0
  85. package/dist/application/WebSourceLocationService.js +160 -0
  86. package/dist/application/WindowsCapabilities.js +7 -7
  87. package/dist/application/android/AndroidAnalysisService.js +37 -0
  88. package/dist/application/{AndroidApplicationService.js → android/AndroidApplicationService.js} +3 -3
  89. package/dist/application/{AppleApplicationService.js → apple/AppleApplicationService.js} +5 -5
  90. package/dist/application/{AnalysisClientCleanup.js → binary/AnalysisClientCleanup.js} +2 -2
  91. package/dist/application/{AnalysisProviderEvaluation.js → binary/AnalysisProviderEvaluation.js} +8 -6
  92. package/dist/application/{AnalysisProviderRegistry.js → binary/AnalysisProviderRegistry.js} +5 -4
  93. package/dist/application/{AnalysisSnapshotCache.js → binary/AnalysisSnapshotCache.js} +8 -7
  94. package/dist/application/{AnalysisSnapshotFiles.js → binary/AnalysisSnapshotFiles.js} +4 -4
  95. package/dist/application/{BinarySession.js → binary/BinarySession.js} +26 -11
  96. package/dist/application/{BinarySessionComposition.js → binary/BinarySessionComposition.js} +2 -1
  97. package/dist/application/{BinarySessionExecution.js → binary/BinarySessionExecution.js} +9 -4
  98. package/dist/application/{BinarySessionOpen.js → binary/BinarySessionOpen.js} +7 -6
  99. package/dist/application/{BinarySessionRecords.js → binary/BinarySessionRecords.js} +34 -40
  100. package/dist/application/{CompositeProvider.js → binary/CompositeProvider.js} +2 -2
  101. package/dist/application/{LazyAnalysisProvider.js → binary/LazyAnalysisProvider.js} +6 -4
  102. package/dist/application/{SessionProviderRouter.js → binary/SessionProviderRouter.js} +7 -4
  103. package/dist/application/firmware/FirmwareAnalysisPort.js +1 -0
  104. package/dist/application/firmware/FirmwareAnalysisService.js +35 -0
  105. package/dist/application/{EvidenceLedger.js → investigation/EvidenceLedger.js} +44 -6
  106. package/dist/application/investigation/InvestigationRecordPort.js +1 -0
  107. package/dist/application/investigation/InvestigationRecords.js +69 -0
  108. package/dist/application/{UnknownEvidence.js → investigation/UnknownEvidence.js} +1 -1
  109. package/dist/application/{ElectronActiveEvidence.js → javascript/ElectronActiveEvidence.js} +4 -4
  110. package/dist/application/javascript/ElectronActiveObservationPort.js +1 -0
  111. package/dist/application/{ElectronActiveObservationService.js → javascript/ElectronActiveObservationService.js} +3 -2
  112. package/dist/application/{ElectronBoundaryAnalysis.js → javascript/ElectronBoundaryAnalysis.js} +1 -1
  113. package/dist/application/{ElectronBoundaryGraphContext.js → javascript/ElectronBoundaryGraphContext.js} +1 -1
  114. package/dist/application/{ElectronEvidence.js → javascript/ElectronEvidence.js} +2 -2
  115. package/dist/application/javascript/ElectronObservationPort.js +1 -0
  116. package/dist/application/{ElectronObservationService.js → javascript/ElectronObservationService.js} +3 -2
  117. package/dist/application/{JavaScriptApplicationEvidence.js → javascript/JavaScriptApplicationEvidence.js} +3 -3
  118. package/dist/application/{JavaScriptApplicationEvidenceGraph.js → javascript/JavaScriptApplicationEvidenceGraph.js} +5 -5
  119. package/dist/application/javascript/JavaScriptApplicationService.js +99 -0
  120. package/dist/application/{JavaScriptApplicationWorkflowEvidence.js → javascript/JavaScriptApplicationWorkflowEvidence.js} +3 -3
  121. package/dist/application/{JavaScriptApplicationWorkflowService.js → javascript/JavaScriptApplicationWorkflowService.js} +12 -11
  122. package/dist/application/{JavaScriptArtifactAnalysis.js → javascript/JavaScriptArtifactAnalysis.js} +12 -26
  123. package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +1 -0
  124. package/dist/application/{JavaScriptArtifactGraphAccumulator.js → javascript/JavaScriptArtifactGraphAccumulator.js} +16 -2
  125. package/dist/application/{JavaScriptArtifactGraphBuilder.js → javascript/JavaScriptArtifactGraphBuilder.js} +2 -2
  126. package/dist/application/{JavaScriptArtifactGraphContext.js → javascript/JavaScriptArtifactGraphContext.js} +1 -1
  127. package/dist/application/{JavaScriptArtifactGraphDocuments.js → javascript/JavaScriptArtifactGraphDocuments.js} +1 -1
  128. package/dist/application/{JavaScriptArtifactGraphFindings.js → javascript/JavaScriptArtifactGraphFindings.js} +20 -7
  129. package/dist/application/{JavaScriptArtifactGraphStructure.js → javascript/JavaScriptArtifactGraphStructure.js} +1 -1
  130. package/dist/application/{JavaScriptArtifactPathResolution.js → javascript/JavaScriptArtifactPathResolution.js} +12 -14
  131. package/dist/application/{JavaScriptArtifactReconstruction.js → javascript/JavaScriptArtifactReconstruction.js} +4 -8
  132. package/dist/application/{JavaScriptJsonModules.js → javascript/JavaScriptJsonModules.js} +3 -2
  133. package/dist/application/{JavaScriptModuleRelationships.js → javascript/JavaScriptModuleRelationships.js} +5 -3
  134. package/dist/application/javascript/JavaScriptRecoveryPort.js +1 -0
  135. package/dist/application/javascript/JavaScriptRecoveryService.js +52 -0
  136. package/dist/application/{JavaScriptReturnShapeProjection.js → javascript/JavaScriptReturnShapeProjection.js} +3 -3
  137. package/dist/application/{JavaScriptRuntimeObservationEvidence.js → javascript/JavaScriptRuntimeObservationEvidence.js} +2 -2
  138. package/dist/application/javascript/JavaScriptRuntimeObservationPort.js +1 -0
  139. package/dist/application/{JavaScriptRuntimeObservationService.js → javascript/JavaScriptRuntimeObservationService.js} +3 -2
  140. package/dist/application/{JavaScriptRuntimeReconciliationEvidence.js → javascript/JavaScriptRuntimeReconciliationEvidence.js} +3 -3
  141. package/dist/application/{JavaScriptRuntimeReconciliationService.js → javascript/JavaScriptRuntimeReconciliationService.js} +6 -5
  142. package/dist/application/{JavaScriptSemanticGraphAsyncProjection.js → javascript/JavaScriptSemanticGraphAsyncProjection.js} +1 -1
  143. package/dist/application/{JavaScriptSemanticGraphBuilder.js → javascript/JavaScriptSemanticGraphBuilder.js} +5 -3
  144. package/dist/application/{JavaScriptSemanticGraphChildProcessProjection.js → javascript/JavaScriptSemanticGraphChildProcessProjection.js} +1 -1
  145. package/dist/application/{JavaScriptSemanticGraphConstruction.js → javascript/JavaScriptSemanticGraphConstruction.js} +3 -2
  146. package/dist/application/{JavaScriptSemanticGraphDataProjection.js → javascript/JavaScriptSemanticGraphDataProjection.js} +1 -1
  147. package/dist/application/{JavaScriptSemanticGraphFingerprintProjection.js → javascript/JavaScriptSemanticGraphFingerprintProjection.js} +1 -1
  148. package/dist/application/{JavaScriptSemanticGraphFlowProjection.js → javascript/JavaScriptSemanticGraphFlowProjection.js} +2 -2
  149. package/dist/application/{JavaScriptSemanticGraphObjectProjection.js → javascript/JavaScriptSemanticGraphObjectProjection.js} +1 -1
  150. package/dist/application/{JavaScriptSemanticGraphProjection.js → javascript/JavaScriptSemanticGraphProjection.js} +2 -2
  151. package/dist/application/{JavaScriptSemanticGraphResourceProjection.js → javascript/JavaScriptSemanticGraphResourceProjection.js} +1 -1
  152. package/dist/application/{JavaScriptSemanticTraceService.js → javascript/JavaScriptSemanticTraceService.js} +6 -5
  153. package/dist/application/{ManagedApplicationGraphService.js → managed/ManagedApplicationGraphService.js} +7 -6
  154. package/dist/application/{ManagedMemberComparisonService.js → managed/ManagedMemberComparisonService.js} +10 -8
  155. package/dist/application/{ManagedNativeVerificationService.js → managed/ManagedNativeVerificationService.js} +7 -6
  156. package/dist/application/{ManagedReconstructionService.js → managed/ManagedReconstructionService.js} +7 -6
  157. package/dist/application/{NativeApiInspection.js → native/NativeApiInspection.js} +1 -1
  158. package/dist/application/{NativeCallRoutes.js → native/NativeCallRoutes.js} +3 -3
  159. package/dist/application/{NativeDispatchMetadataInspection.js → native/NativeDispatchMetadataInspection.js} +4 -4
  160. package/dist/application/{NativeUiActionTrace.js → native/NativeUiActionTrace.js} +7 -6
  161. package/dist/application/{NativeValueTrace.js → native/NativeValueTrace.js} +6 -6
  162. package/dist/{application/ArtifactInventory/hash.js → artifacts/ArtifactHash.js} +4 -2
  163. package/dist/artifacts/ArtifactPaths.js +3 -3
  164. package/dist/artifacts/ArtifactProvider.js +10 -38
  165. package/dist/artifacts/ArtifactProviderMetadata.js +36 -0
  166. package/dist/artifacts/AsarArtifactReader.js +195 -23
  167. package/dist/artifacts/AsarEntryStream.js +76 -0
  168. package/dist/artifacts/DirectoryArtifactReader.js +43 -7
  169. package/dist/artifacts/NativeDmgArtifactReader.js +171 -12
  170. package/dist/artifacts/SafeOutputTree.js +26 -10
  171. package/dist/artifacts/ZipArtifactReader.js +1 -0
  172. package/dist/{application → artifacts/apple}/AppleAssetCatalogAnalysis.js +4 -4
  173. package/dist/{application → artifacts/apple}/InterfaceBuilderAnalysis.js +125 -51
  174. package/dist/artifacts/{KeyedArchiveReader.js → apple/KeyedArchiveReader.js} +21 -27
  175. package/dist/artifacts/{NibArchive.js → apple/NibArchive.js} +4 -2
  176. package/dist/artifacts/apple/NibViewHierarchy.js +150 -0
  177. package/dist/{application → artifacts/javascript}/JavaScriptArtifactFiles.js +30 -7
  178. package/dist/artifacts/javascript/JavaScriptArtifactReader.js +6 -0
  179. package/dist/artifacts/readStableArtifact.js +52 -0
  180. package/dist/browser/BrowserProcessStartup.js +3 -1
  181. package/dist/browser/BrowserScenarioSecrets.js +50 -8
  182. package/dist/browser/CdpAuthorizedMainFrame.js +5 -5
  183. package/dist/browser/CdpAuthorizedTarget.js +22 -0
  184. package/dist/browser/CdpBrowserProvider.js +8 -16
  185. package/dist/browser/CdpCaptureDocuments.js +36 -22
  186. package/dist/browser/CdpCaptureEventBodyShapes.js +3 -3
  187. package/dist/browser/CdpCaptureEventHandlers.js +32 -28
  188. package/dist/browser/CdpCaptureEventHelpers.js +6 -6
  189. package/dist/browser/CdpCaptureStorage.js +10 -8
  190. package/dist/browser/CdpCaptureStorageFingerprints.js +25 -23
  191. package/dist/browser/CdpCaptureValues.js +8 -4
  192. package/dist/browser/CdpCommandRejection.js +17 -0
  193. package/dist/browser/CdpConnection.js +59 -17
  194. package/dist/browser/CdpElectronInspection.js +13 -13
  195. package/dist/browser/CdpElectronProvider.js +7 -7
  196. package/dist/browser/CdpElectronScriptEvents.js +6 -6
  197. package/dist/browser/CdpElectronScripts.js +4 -4
  198. package/dist/browser/CdpElectronWorkers.js +4 -4
  199. package/dist/browser/CdpEndpoint.js +22 -10
  200. package/dist/browser/CdpObservationSession.js +20 -24
  201. package/dist/browser/CdpOptionalCommand.js +1 -1
  202. package/dist/browser/CdpPageCapture.js +6 -5
  203. package/dist/browser/CdpPageCaptureScripts.js +2 -2
  204. package/dist/browser/CdpPageCaptureWorkers.js +9 -9
  205. package/dist/browser/CdpSafeMetadata.js +101 -18
  206. package/dist/browser/CdpScreenshot.js +6 -6
  207. package/dist/browser/CdpTargetEvents.js +8 -0
  208. package/dist/browser/CdpTargetSession.js +10 -7
  209. package/dist/browser/CdpWebMcpDiscovery.js +23 -17
  210. package/dist/browser/ElectronFileScope.js +9 -3
  211. package/dist/browser/PlaywrightBrowserScenarioProvider.js +10 -7
  212. package/dist/browser/PlaywrightElectronActiveActions.js +1 -1
  213. package/dist/browser/PlaywrightElectronActiveProvider.js +9 -8
  214. package/dist/browser/PlaywrightExecutionBoundary.js +1 -1
  215. package/dist/browser/PlaywrightScenarioArtifacts.js +10 -5
  216. package/dist/browser/PlaywrightScenarioBrowser.js +3 -1
  217. package/dist/browser/PlaywrightScenarioEvents.js +65 -53
  218. package/dist/browser/PlaywrightScenarioSession.js +13 -3
  219. package/dist/browser/WebSourceMapFetcher.js +55 -58
  220. package/dist/browser/assets/LocalWebScriptArtifacts.js +87 -0
  221. package/dist/browser/assets/PageScriptCapture.js +32 -0
  222. package/dist/browser/assets/PublishWebScripts.js +74 -0
  223. package/dist/browser/assets/ScenarioScriptCapture.js +76 -0
  224. package/dist/browser/assets/ScriptCaptureAdapters.js +57 -0
  225. package/dist/browser/assets/WebArtifactReads.js +56 -0
  226. package/dist/browser/assets/WebSourceLocationArtifacts.js +40 -0
  227. package/dist/browser/execution/CdpEventListeners.js +79 -0
  228. package/dist/browser/execution/CdpExecutionCapture.js +135 -0
  229. package/dist/browser/execution/CdpExecutionCollection.js +57 -0
  230. package/dist/browser/execution/CdpExecutionWindow.js +100 -0
  231. package/dist/browser/execution/CdpListenerSelector.js +22 -0
  232. package/dist/browser/execution/CdpPreciseCoverage.js +48 -0
  233. package/dist/browser/execution/CdpRuntimeInitiator.js +18 -0
  234. package/dist/browser/execution/CdpRuntimeProtocol.js +106 -0
  235. package/dist/browser/execution/CdpRuntimeRequests.js +81 -0
  236. package/dist/browser/execution/CdpRuntimeSession.js +163 -0
  237. package/dist/browser/execution/CdpRuntimeSources.js +223 -0
  238. package/dist/browser/execution/CdpWebRuntimeProvider.js +51 -0
  239. package/dist/browser/modules/NativeModuleResolver.js +210 -0
  240. package/dist/browser/modules/WebModuleArtifacts.js +40 -0
  241. package/dist/browser/network/PlaywrightNetworkContent.js +71 -0
  242. package/dist/browser/network/PlaywrightScenarioNetwork.js +180 -0
  243. package/dist/browser/providerIdentities.js +24 -0
  244. package/dist/catalogIdentity.js +23 -15
  245. package/dist/cli/androidCommands.js +91 -0
  246. package/dist/{cliApplicationCommands.js → cli/applicationCommands.js} +49 -16
  247. package/dist/cli/artifactCommands.js +1 -1
  248. package/dist/{cliBrowserAdvancedCommands.js → cli/browserAdvancedCommands.js} +39 -24
  249. package/dist/{cliBrowserCommands.js → cli/browserCommands.js} +9 -9
  250. package/dist/cli/commandCancellation.js +24 -0
  251. package/dist/cli/coreAnalysisCommands.js +5 -400
  252. package/dist/cli/coreBinaryCommands.js +211 -0
  253. package/dist/cli/coreNativeCommands.js +293 -0
  254. package/dist/{cliElectronCommands.js → cli/electronCommands.js} +20 -24
  255. package/dist/cli/firmwareCommands.js +75 -0
  256. package/dist/{cliSetup.js → cli/interactiveSetup.js} +1 -1
  257. package/dist/cli/javascriptApplicationAnalysis.js +2 -2
  258. package/dist/cli/javascriptRecoveryCommands.js +45 -0
  259. package/dist/cli/managedCommands.js +5 -5
  260. package/dist/cli/managedProjectGraphCommand.js +2 -2
  261. package/dist/cli/options.js +7 -1
  262. package/dist/{cliProcessCommands.js → cli/processCommands.js} +3 -3
  263. package/dist/cli/referenceSourceImportStatus.js +15 -0
  264. package/dist/cli/setupCommands.js +4 -2
  265. package/dist/cli/utilityCommands.js +50 -25
  266. package/dist/cli/webModuleCommands.js +56 -0
  267. package/dist/cli/webRuntimeCommands.js +60 -0
  268. package/dist/cli/webScriptCommands.js +31 -0
  269. package/dist/cli/webSourceLocationCommands.js +42 -0
  270. package/dist/cli.js +20 -15
  271. package/dist/cliBrowserContext.js +5 -3
  272. package/dist/cliBrowserScenarioCommands.js +6 -4
  273. package/dist/cliCommandNames.js +19 -2
  274. package/dist/cliEvidenceCommands.js +2 -1
  275. package/dist/cliJavaScriptRuntimeCommands.js +8 -5
  276. package/dist/cliJsonInput.js +35 -13
  277. package/dist/cliLogging.js +2 -1
  278. package/dist/cliOutput.js +52 -27
  279. package/dist/composition/android.js +3 -0
  280. package/dist/composition/auxiliaryAnalysisProviders.js +30 -0
  281. package/dist/composition/binary.js +25 -0
  282. package/dist/composition/browserObservation.js +3 -0
  283. package/dist/composition/browserScenario.js +3 -0
  284. package/dist/composition/directAnalysis.js +17 -0
  285. package/dist/composition/electronObservation.js +3 -0
  286. package/dist/composition/electronScenario.js +3 -0
  287. package/dist/composition/firmware.js +3 -0
  288. package/dist/composition/javascriptRecovery.js +3 -0
  289. package/dist/composition/javascriptRuntimeObservation.js +3 -0
  290. package/dist/composition/optionalObservationProviders.js +49 -0
  291. package/dist/composition/webModules.js +5 -0
  292. package/dist/composition/webRuntime.js +4 -0
  293. package/dist/composition/webSourceLocations.js +5 -0
  294. package/dist/config/environment.js +11 -1
  295. package/dist/config/parseConfig.js +29 -4
  296. package/dist/config/parsers.js +1 -1
  297. package/dist/contracts/android/androidToolContracts.js +77 -0
  298. package/dist/contracts/applicationToolContracts.js +75 -13
  299. package/dist/contracts/artifactComparisonExample.js +7 -14
  300. package/dist/contracts/artifactToolContracts.js +2 -2
  301. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  302. package/dist/contracts/enhancedInputs.js +1 -1
  303. package/dist/contracts/enhancedToolContracts.js +31 -0
  304. package/dist/contracts/errorSchemas.js +4 -2
  305. package/dist/contracts/evidenceInputContracts.js +13 -0
  306. package/dist/contracts/firmware/firmwareToolContracts.js +38 -0
  307. package/dist/contracts/{applicationWorkflowInputContracts.js → javascript/applicationWorkflowInputContracts.js} +18 -18
  308. package/dist/contracts/{electronToolContracts.js → javascript/electronToolContracts.js} +6 -6
  309. package/dist/contracts/{javascriptApplicationWorkflowExamples.js → javascript/javascriptApplicationWorkflowExamples.js} +3 -3
  310. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +23 -0
  311. package/dist/contracts/{javascriptRuntimeObservationToolContracts.js → javascript/javascriptRuntimeObservationToolContracts.js} +3 -3
  312. package/dist/contracts/{javascriptRuntimeReconciliationExample.js → javascript/javascriptRuntimeReconciliationExample.js} +5 -5
  313. package/dist/contracts/{managedToolContracts.js → managed/managedToolContracts.js} +3 -3
  314. package/dist/contracts/{managedWorkflowExamples.js → managed/managedWorkflowExamples.js} +1 -1
  315. package/dist/contracts/{managedWorkflowToolContracts.js → managed/managedWorkflowToolContracts.js} +6 -6
  316. package/dist/contracts/mobileApplicationGraphExamples.js +105 -0
  317. package/dist/contracts/{nativeToolContracts.js → native/nativeToolContracts.js} +14 -7
  318. package/dist/contracts/officialToolContracts.js +66 -0
  319. package/dist/contracts/promptContracts.js +1 -1
  320. package/dist/contracts/sessionLifecycleInputs.js +4 -0
  321. package/dist/contracts/sessionToolContracts.js +43 -0
  322. package/dist/contracts/sessionToolSchemas.js +1 -1
  323. package/dist/contracts/toolContractExamples.js +5 -0
  324. package/dist/contracts/toolContractTypes.js +2 -0
  325. package/dist/contracts/toolContracts.js +18 -135
  326. package/dist/contracts/toolEffects.js +75 -0
  327. package/dist/contracts/toolOutputSchemaGroups.js +20 -16
  328. package/dist/contracts/toolOutputSchemaPrimitives.js +1 -0
  329. package/dist/contracts/webRuntimeToolContracts.js +43 -0
  330. package/dist/contracts/webScriptToolContracts.js +68 -0
  331. package/dist/doctorRuntime.js +5 -1
  332. package/dist/domain/analysisErrorBase.js +33 -0
  333. package/dist/domain/analysisErrorCore.js +62 -0
  334. package/dist/domain/analysisErrorPresentation.js +22 -2
  335. package/dist/domain/analysisErrorProjection.js +25 -3
  336. package/dist/domain/analysisSnapshot.js +1 -0
  337. package/dist/domain/android/androidAnalysis.js +141 -0
  338. package/dist/domain/{androidApplication.js → android/androidApplication.js} +7 -6
  339. package/dist/domain/apple/appleApplication.js +277 -0
  340. package/dist/domain/{appleAssetCatalog.js → apple/appleAssetCatalog.js} +2 -2
  341. package/dist/domain/apple/appleBundleAnatomy.js +236 -0
  342. package/dist/domain/{interfaceBuilderGraph.js → apple/interfaceBuilderGraph.js} +47 -312
  343. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +411 -0
  344. package/dist/domain/{keyedArchive.js → apple/keyedArchive.js} +10 -9
  345. package/dist/domain/apple/plistValue.js +35 -0
  346. package/dist/domain/artifactGraph.js +1 -0
  347. package/dist/domain/artifactInspection.js +19 -17
  348. package/dist/domain/artifactInventoryEvidence.js +32 -27
  349. package/dist/domain/artifactInventorySnapshot.js +1 -0
  350. package/dist/domain/artifactOperationError.js +20 -0
  351. package/dist/domain/artifactPathSyntax.js +26 -0
  352. package/dist/domain/browserNetworkEvidence.js +82 -0
  353. package/dist/domain/browserObservation.js +12 -4
  354. package/dist/domain/browserObservationError.js +25 -0
  355. package/dist/domain/browserObservationSchemas.js +2 -1
  356. package/dist/domain/browserScenario.js +1 -1
  357. package/dist/domain/browserScenarioCapture.js +23 -1
  358. package/dist/domain/browserScenarioCaptureValues.js +25 -0
  359. package/dist/domain/browserScenarioDiff.js +7 -4
  360. package/dist/domain/browserScenarioDiffEvidence.js +35 -1
  361. package/dist/domain/browserScenarioNormalization.js +6 -11
  362. package/dist/domain/browserScenarioValues.js +15 -2
  363. package/dist/domain/browserSession.js +2 -7
  364. package/dist/domain/bundleComparison.js +2 -1
  365. package/dist/domain/callPath.js +86 -38
  366. package/dist/domain/canonicalDigest.js +65 -0
  367. package/dist/domain/canonicalOrdering.js +11 -0
  368. package/dist/domain/changedBehavior.js +8 -7
  369. package/dist/domain/comparisonSemantics.js +2 -4
  370. package/dist/domain/comparisonStatus.js +39 -0
  371. package/dist/domain/configurationErrors.js +25 -0
  372. package/dist/domain/dosCom.js +8 -0
  373. package/dist/domain/evidence.js +3 -11
  374. package/dist/domain/evidenceBundle.js +98 -35
  375. package/dist/domain/evidenceErrors.js +30 -0
  376. package/dist/domain/firmware/firmwareAnalysis.js +121 -0
  377. package/dist/domain/functionComparison.js +4 -2
  378. package/dist/domain/functionComparisonDimensions.js +6 -4
  379. package/dist/domain/functionComparisonNormalization.js +13 -8
  380. package/dist/domain/functionComparisonResults.js +1 -4
  381. package/dist/domain/hopperErrors.js +78 -0
  382. package/dist/domain/hopperValues.js +4 -3
  383. package/dist/domain/inputIssueProjection.js +17 -2
  384. package/dist/domain/{electronActiveObservation.js → javascript/electronActiveObservation.js} +3 -1
  385. package/dist/domain/{electronObservation.js → javascript/electronObservation.js} +5 -11
  386. package/dist/domain/{electronStaticAnalysisBrowser.js → javascript/electronStaticAnalysisBrowser.js} +15 -24
  387. package/dist/domain/{electronStaticAnalysisIpc.js → javascript/electronStaticAnalysisIpc.js} +2 -2
  388. package/dist/domain/{electronStaticAnalysisNative.js → javascript/electronStaticAnalysisNative.js} +12 -12
  389. package/dist/domain/javascript/electronStaticAnalysisTypes.js +1 -0
  390. package/dist/domain/{electronStaticAnalysisValues.js → javascript/electronStaticAnalysisValues.js} +24 -4
  391. package/dist/domain/{javascriptApplicationAnalysis.js → javascript/javascriptApplicationAnalysis.js} +2 -2
  392. package/dist/domain/{javascriptApplicationChangeGraph.js → javascript/javascriptApplicationChangeGraph.js} +2 -2
  393. package/dist/domain/{javascriptApplicationEvidenceSchemas.js → javascript/javascriptApplicationEvidenceSchemas.js} +6 -4
  394. package/dist/domain/{javascriptApplicationGraph.js → javascript/javascriptApplicationGraph.js} +13 -22
  395. package/dist/domain/{javascriptApplicationGraphSchemas.js → javascript/javascriptApplicationGraphSchemas.js} +2 -2
  396. package/dist/domain/{javascriptApplicationVersionComparison.js → javascript/javascriptApplicationVersionComparison.js} +3 -11
  397. package/dist/domain/{javascriptApplicationVersionComparisonSchemas.js → javascript/javascriptApplicationVersionComparisonSchemas.js} +3 -3
  398. package/dist/domain/{javascriptApplicationVersionItems.js → javascript/javascriptApplicationVersionItems.js} +4 -4
  399. package/dist/domain/{javascriptApplicationVersionKeys.js → javascript/javascriptApplicationVersionKeys.js} +16 -9
  400. package/dist/domain/javascript/javascriptArtifactFiles.js +1 -0
  401. package/dist/domain/{javascriptAstFingerprint.js → javascript/javascriptAstFingerprint.js} +38 -22
  402. package/dist/domain/javascript/javascriptAstValues.js +23 -0
  403. package/dist/domain/{javascriptExportShapeComparison.js → javascript/javascriptExportShapeComparison.js} +1 -2
  404. package/dist/domain/{javascriptExportShapeComparisonSchemas.js → javascript/javascriptExportShapeComparisonSchemas.js} +2 -2
  405. package/dist/domain/{javascriptExportShapeSelection.js → javascript/javascriptExportShapeSelection.js} +1 -1
  406. package/dist/domain/{javascriptExportShapeVariants.js → javascript/javascriptExportShapeVariants.js} +7 -3
  407. package/dist/domain/{javascriptFeatureSeed.js → javascript/javascriptFeatureSeed.js} +32 -11
  408. package/dist/domain/{javascriptFeatureTrace.js → javascript/javascriptFeatureTrace.js} +9 -13
  409. package/dist/domain/{javascriptFeatureTraceSchemas.js → javascript/javascriptFeatureTraceSchemas.js} +32 -18
  410. package/dist/domain/{javascriptFeatureTraversal.js → javascript/javascriptFeatureTraversal.js} +7 -2
  411. package/dist/domain/{javascriptNativeHandoff.js → javascript/javascriptNativeHandoff.js} +2 -1
  412. package/dist/domain/javascript/javascriptRecovery.js +88 -0
  413. package/dist/domain/{javascriptRuntimeLoadState.js → javascript/javascriptRuntimeLoadState.js} +2 -2
  414. package/dist/domain/{javascriptRuntimeObservation.js → javascript/javascriptRuntimeObservation.js} +2 -2
  415. package/dist/domain/{javascriptRuntimeReconciliationActive.js → javascript/javascriptRuntimeReconciliationActive.js} +5 -12
  416. package/dist/domain/{javascriptRuntimeReconciliationGraph.js → javascript/javascriptRuntimeReconciliationGraph.js} +2 -2
  417. package/dist/domain/{javascriptRuntimeReconciliationMatching.js → javascript/javascriptRuntimeReconciliationMatching.js} +4 -3
  418. package/dist/domain/{javascriptRuntimeReconciliationParsing.js → javascript/javascriptRuntimeReconciliationParsing.js} +11 -17
  419. package/dist/domain/{javascriptRuntimeReconciliationResult.js → javascript/javascriptRuntimeReconciliationResult.js} +4 -4
  420. package/dist/domain/{javascriptRuntimeReconciliationSchemas.js → javascript/javascriptRuntimeReconciliationSchemas.js} +8 -5
  421. package/dist/domain/{javascriptRuntimeStaticCandidates.js → javascript/javascriptRuntimeStaticCandidates.js} +8 -4
  422. package/dist/domain/{javascriptSemanticAnalysis.js → javascript/javascriptSemanticAnalysis.js} +80 -17
  423. package/dist/domain/{javascriptSemanticAsyncEffects.js → javascript/javascriptSemanticAsyncEffects.js} +2 -1
  424. package/dist/domain/{javascriptSemanticCallResolution.js → javascript/javascriptSemanticCallResolution.js} +11 -5
  425. package/dist/domain/{javascriptSemanticCalls.js → javascript/javascriptSemanticCalls.js} +7 -4
  426. package/dist/domain/{javascriptSemanticChildProcesses.js → javascript/javascriptSemanticChildProcesses.js} +5 -2
  427. package/dist/domain/{javascriptSemanticDataEffectHelpers.js → javascript/javascriptSemanticDataEffectHelpers.js} +7 -6
  428. package/dist/domain/{javascriptSemanticDataEffects.js → javascript/javascriptSemanticDataEffects.js} +9 -6
  429. package/dist/domain/{javascriptSemanticFingerprints.js → javascript/javascriptSemanticFingerprints.js} +40 -16
  430. package/dist/domain/{javascriptSemanticGraph.js → javascript/javascriptSemanticGraph.js} +23 -28
  431. package/dist/domain/{javascriptSemanticGraphSchemas.js → javascript/javascriptSemanticGraphSchemas.js} +3 -3
  432. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +116 -0
  433. package/dist/domain/javascript/javascriptSemanticMutationValues.js +53 -0
  434. package/dist/domain/{javascriptSemanticObjects.js → javascript/javascriptSemanticObjects.js} +5 -5
  435. package/dist/domain/{javascriptSemanticPrimitives.js → javascript/javascriptSemanticPrimitives.js} +9 -2
  436. package/dist/domain/{javascriptSemanticProjection.js → javascript/javascriptSemanticProjection.js} +32 -44
  437. package/dist/domain/{javascriptSemanticPromises.js → javascript/javascriptSemanticPromises.js} +77 -21
  438. package/dist/domain/{javascriptSemanticProvenance.js → javascript/javascriptSemanticProvenance.js} +4 -1
  439. package/dist/domain/{javascriptSemanticQuery.js → javascript/javascriptSemanticQuery.js} +7 -8
  440. package/dist/domain/{javascriptSemanticQueryAssessment.js → javascript/javascriptSemanticQueryAssessment.js} +1 -2
  441. package/dist/domain/{javascriptSemanticQueryIdentity.js → javascript/javascriptSemanticQueryIdentity.js} +1 -2
  442. package/dist/domain/{javascriptSemanticQuerySchemas.js → javascript/javascriptSemanticQuerySchemas.js} +3 -3
  443. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +25 -0
  444. package/dist/domain/{javascriptSemanticResources.js → javascript/javascriptSemanticResources.js} +2 -1
  445. package/dist/domain/{javascriptSemanticReturns.js → javascript/javascriptSemanticReturns.js} +2 -1
  446. package/dist/domain/{javascriptSemanticTraceSchemas.js → javascript/javascriptSemanticTraceSchemas.js} +2 -2
  447. package/dist/domain/javascript/javascriptSemanticTraversal.js +55 -0
  448. package/dist/domain/javascript/javascriptSemanticValueTypes.js +1 -0
  449. package/dist/domain/{javascriptSemanticValues.js → javascript/javascriptSemanticValues.js} +118 -60
  450. package/dist/domain/{javascriptSourceParser.js → javascript/javascriptSourceParser.js} +4 -2
  451. package/dist/domain/{javascriptStaticAnalysis.js → javascript/javascriptStaticAnalysis.js} +8 -5
  452. package/dist/domain/{javascriptStaticAnalysisBundler.js → javascript/javascriptStaticAnalysisBundler.js} +15 -11
  453. package/dist/domain/{javascriptStaticAnalysisCalls.js → javascript/javascriptStaticAnalysisCalls.js} +16 -8
  454. package/dist/domain/{javascriptStaticAnalysisHelpers.js → javascript/javascriptStaticAnalysisHelpers.js} +261 -43
  455. package/dist/domain/{sourceToBundleComparison.js → javascript/sourceToBundleComparison.js} +6 -8
  456. package/dist/domain/{sourceToBundleComparisonSchemas.js → javascript/sourceToBundleComparisonSchemas.js} +4 -4
  457. package/dist/domain/{sourceToBundleSignals.js → javascript/sourceToBundleSignals.js} +7 -7
  458. package/dist/domain/jsonShape.js +6 -2
  459. package/dist/domain/{managedApplicationGraph.js → managed/managedApplicationGraph.js} +4 -4
  460. package/dist/domain/{managedApplicationGraphNodes.js → managed/managedApplicationGraphNodes.js} +1 -1
  461. package/dist/domain/{managedArtifact.js → managed/managedArtifact.js} +1 -1
  462. package/dist/domain/{managedMemberComparison.js → managed/managedMemberComparison.js} +5 -4
  463. package/dist/domain/{managedMemberComparisonCoverage.js → managed/managedMemberComparisonCoverage.js} +2 -1
  464. package/dist/domain/{managedMemberComparisonItems.js → managed/managedMemberComparisonItems.js} +99 -40
  465. package/dist/domain/{managedMemberComparisonMatch.js → managed/managedMemberComparisonMatch.js} +22 -11
  466. package/dist/domain/{managedNativeVerification.js → managed/managedNativeVerification.js} +1 -1
  467. package/dist/domain/{managedNativeVerificationMatch.js → managed/managedNativeVerificationMatch.js} +8 -6
  468. package/dist/domain/{managedNativeVerificationSchemas.js → managed/managedNativeVerificationSchemas.js} +6 -5
  469. package/dist/domain/{managedReconstruction.js → managed/managedReconstruction.js} +3 -3
  470. package/dist/domain/{nativeDataType.js → native/nativeDataType.js} +2 -0
  471. package/dist/domain/native/nativeFunctionAnnotations.js +43 -0
  472. package/dist/domain/{nativeInspection.js → native/nativeInspection.js} +1 -1
  473. package/dist/domain/{nativeInvestigationGraph.js → native/nativeInvestigationGraph.js} +13 -4
  474. package/dist/domain/native/nativeLoadImage.js +95 -0
  475. package/dist/domain/native/nativeMetadataRecovery.js +55 -0
  476. package/dist/domain/{nativeUiObservation.js → native/nativeUiObservation.js} +20 -6
  477. package/dist/domain/{objcSwiftMetadata.js → native/objcSwiftMetadata.js} +17 -0
  478. package/dist/domain/processCapture.js +4 -3
  479. package/dist/domain/processEvidenceProvider.js +11 -0
  480. package/dist/domain/processScenario.js +17 -17
  481. package/dist/domain/processTraceComparison.js +1 -1
  482. package/dist/domain/propertyListKeys.js +69 -0
  483. package/dist/domain/providerAdapterError.js +17 -0
  484. package/dist/domain/providerCleanupError.js +6 -3
  485. package/dist/domain/providerSelectionError.js +44 -0
  486. package/dist/domain/reconstructionCoverageEvaluation.js +46 -24
  487. package/dist/domain/reconstructionCoverageInput.js +7 -0
  488. package/dist/domain/reconstructionUnknowns.js +1 -1
  489. package/dist/domain/reconstructionVerification.js +22 -8
  490. package/dist/domain/referenceSourceClassification.js +5 -6
  491. package/dist/domain/referenceSourceGraph.js +9 -17
  492. package/dist/domain/referenceSourceImportParsing.js +38 -23
  493. package/dist/domain/runtimeIdentification.js +1 -1
  494. package/dist/domain/runtimeVersion.js +6 -7
  495. package/dist/domain/safeJson.js +13 -0
  496. package/dist/domain/sourceMapEnvelope.js +38 -0
  497. package/dist/domain/staticRuntimeCorrelation.js +9 -7
  498. package/dist/domain/unicodeCodePointOrder.js +11 -6
  499. package/dist/domain/unknownRegistryError.js +10 -0
  500. package/dist/domain/webBundleAnalyzerAst.js +23 -38
  501. package/dist/domain/webBundleAnalyzerInspection.js +29 -20
  502. package/dist/domain/webEventListeners.js +28 -0
  503. package/dist/domain/webExecution.js +74 -0
  504. package/dist/domain/webMcpDiscovery.js +1 -7
  505. package/dist/domain/webModuleImports.js +104 -0
  506. package/dist/domain/webModuleTrace.js +106 -0
  507. package/dist/domain/webRuntime.js +69 -0
  508. package/dist/domain/webScreenshot.js +1 -7
  509. package/dist/domain/webScriptArtifacts.js +39 -0
  510. package/dist/domain/webScriptExport.js +86 -0
  511. package/dist/domain/webScriptExportError.js +13 -0
  512. package/dist/domain/webScriptExportPlan.js +108 -0
  513. package/dist/domain/webSourceLocation.js +106 -0
  514. package/dist/domain/webSourcePosition.js +21 -0
  515. package/dist/dotnet/ManagedArtifactInspector.js +1 -1
  516. package/dist/dotnet/ManagedMemberInspector.js +1 -1
  517. package/dist/dotnet/ManagedMemberInspectorCore.js +34 -0
  518. package/dist/dotnet/ManagedMemberRows.js +6 -4
  519. package/dist/dotnet/ManagedMetadataHeaps.js +3 -2
  520. package/dist/dotnet/ManagedMetadataInventoryRows.js +4 -2
  521. package/dist/dotnet/ManagedMethodBodyReader.js +8 -1
  522. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +22 -16
  523. package/dist/dotnet/ManagedNativeBoundaryInspector.js +56 -50
  524. package/dist/dotnet/ManagedStaticProvider.js +6 -34
  525. package/dist/dotnet/ManagedStaticProviderMetadata.js +36 -0
  526. package/dist/evaluation/CodexAgentEval.js +2 -1
  527. package/dist/firmware/FirmwareCommand.js +163 -0
  528. package/dist/firmware/FirmwareFiles.js +190 -0
  529. package/dist/firmware/FirmwareProvider.js +264 -0
  530. package/dist/firmware/FirmwarePublication.js +84 -0
  531. package/dist/firmware/FirmwareRelease.js +32 -0
  532. package/dist/firmware/FirmwareReports.js +235 -0
  533. package/dist/firmware/FirmwareVersion.js +80 -0
  534. package/dist/generatedMcpToolCatalog.js +1 -1
  535. package/dist/generatedPackageMetadata.js +5 -5
  536. package/dist/ghidra/GhidraAnalysisProfile.js +37 -8
  537. package/dist/ghidra/GhidraClient.js +52 -6
  538. package/dist/ghidra/GhidraDiagnostics.js +3 -0
  539. package/dist/ghidra/GhidraDoctor.js +38 -14
  540. package/dist/ghidra/GhidraFunctionValues.js +14 -8
  541. package/dist/ghidra/GhidraInstallation.js +48 -38
  542. package/dist/ghidra/GhidraInstallationPolicy.js +140 -0
  543. package/dist/ghidra/GhidraInventoryValues.js +39 -2
  544. package/dist/ghidra/GhidraLauncher.js +102 -29
  545. package/dist/ghidra/GhidraLoadImageAttest.js +36 -0
  546. package/dist/ghidra/GhidraLoadImageValues.js +199 -0
  547. package/dist/ghidra/GhidraProvider.js +47 -149
  548. package/dist/ghidra/GhidraProviderCapabilities.js +58 -28
  549. package/dist/ghidra/GhidraProviderClient.js +209 -0
  550. package/dist/ghidra/GhidraRequestQueue.js +2 -2
  551. package/dist/ghidra/GhidraResponseBuffer.js +7 -1
  552. package/dist/ghidra/GhidraSessionError.js +31 -4
  553. package/dist/ghidra/GhidraSessionValues.js +10 -7
  554. package/dist/ghidra/GhidraTargetSnapshot.js +16 -2
  555. package/dist/ghidra/GhidraTransport.js +12 -0
  556. package/dist/ghidra/extensions/GhidraExtensionFailures.js +20 -0
  557. package/dist/ghidra/extensions/GhidraExtensions.js +170 -0
  558. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +21 -0
  559. package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +100 -0
  560. package/dist/hopper/BridgeLauncher.js +4 -2
  561. package/dist/hopper/HopperAnalysisProfile.js +7 -2
  562. package/dist/hopper/HopperCleanup.js +55 -9
  563. package/dist/hopper/HopperClient.js +14 -4
  564. package/dist/hopper/HopperProcessDiagnostic.js +1 -1
  565. package/dist/hopper/HopperProvider.js +8 -50
  566. package/dist/hopper/HopperProviderCapabilities.js +73 -0
  567. package/dist/hopper/HopperRequestQueue.js +7 -3
  568. package/dist/hopper/HopperResponseStream.js +7 -1
  569. package/dist/hopper/HopperSessionValues.js +1 -1
  570. package/dist/hopper/HopperSocketConnection.js +1 -1
  571. package/dist/hopper/HopperTargetLease.js +23 -15
  572. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +7 -8
  573. package/dist/hopper/LinuxPrivateDisplayProbe.js +10 -6
  574. package/dist/hopper/protocol.js +8 -8
  575. package/dist/ida/IdaConfiguration.js +56 -0
  576. package/dist/ida/IdaDoctor.js +53 -0
  577. package/dist/ida/IdaInput.js +62 -0
  578. package/dist/ida/IdaMcpConnection.js +111 -0
  579. package/dist/ida/IdaOperationRunner.js +299 -0
  580. package/dist/ida/IdaProtocolValues.js +178 -0
  581. package/dist/ida/IdaProvider.js +126 -0
  582. package/dist/ida/IdaProviderCapabilities.js +52 -0
  583. package/dist/ida/IdaSessionClient.js +318 -0
  584. package/dist/ida/IdaWorkspace.js +54 -0
  585. package/dist/{browser → inspector}/JavaScriptRuntimeScope.js +19 -6
  586. package/dist/{browser → inspector}/V8InspectorCaptureProjection.js +46 -8
  587. package/dist/{browser → inspector}/V8InspectorEndpoint.js +3 -2
  588. package/dist/{browser → inspector}/V8InspectorProvider.js +16 -14
  589. package/dist/inspector/providerIdentity.js +6 -0
  590. package/dist/javascript/recovery/RecoveryFiles.js +122 -0
  591. package/dist/javascript/recovery/WakaruCommand.js +116 -0
  592. package/dist/javascript/recovery/WakaruExecution.js +100 -0
  593. package/dist/javascript/recovery/WakaruProvider.js +96 -0
  594. package/dist/javascript/recovery/WakaruPublication.js +102 -0
  595. package/dist/javascript/recovery/WakaruRelease.js +29 -0
  596. package/dist/javascript/recovery/WakaruReport.js +134 -0
  597. package/dist/javascript/sourceMaps/SourceMapCodecProcess.js +37 -0
  598. package/dist/javascript/sourceMaps/SourceMapCodecProtocol.js +20 -0
  599. package/dist/javascript/sourceMaps/SourceMapCommand.js +176 -0
  600. package/dist/javascript/sourceMaps/SourceMapDecoder.js +61 -0
  601. package/dist/javascript/sourceMaps/SourceMapFormat.js +185 -0
  602. package/dist/javascript/sourceMaps/TraceSourceMap.js +138 -0
  603. package/dist/main/shutdown.js +29 -3
  604. package/dist/main/startup.js +1 -1
  605. package/dist/main/transport.js +32 -11
  606. package/dist/main.js +9 -20
  607. package/dist/native/AppleDispatchCoverage.js +58 -0
  608. package/dist/native/AppleDispatchMetadata.js +73 -490
  609. package/dist/native/AppleMachoFixups.js +292 -0
  610. package/dist/native/AppleMachoSelection.js +188 -0
  611. package/dist/native/AppleObjcCategories.js +59 -0
  612. package/dist/native/AppleObjcDispatchFacets.js +257 -0
  613. package/dist/native/AppleObjcProperties.js +68 -0
  614. package/dist/native/AppleObjcProtocols.js +2 -1
  615. package/dist/native/AppleSwiftDispatchFacets.js +150 -0
  616. package/dist/native/NativeMacOSProvider.js +204 -72
  617. package/dist/native/NativeMacOSProviderMetadata.js +42 -0
  618. package/dist/native/NativeMachoInspection.js +87 -26
  619. package/dist/native/NativeUiHelperRuntime.js +14 -4
  620. package/dist/native/NativeUiObservation.js +14 -6
  621. package/dist/native/NativeUiOutputBudget.js +8 -0
  622. package/dist/native/parsers/codesign.js +40 -5
  623. package/dist/native/parsers/demangle.js +6 -2
  624. package/dist/native/parsers/dyldInfo.js +16 -7
  625. package/dist/native/parsers/echoedPath.js +14 -0
  626. package/dist/native/parsers/lipo.js +14 -0
  627. package/dist/native/parsers/otool.js +5 -2
  628. package/dist/native/parsers/plist.js +174 -11
  629. package/dist/process/ExecFileOutput.js +2 -0
  630. package/dist/process/PrivateRuntimeRoot.js +13 -3
  631. package/dist/process/ProcessOwnership.js +5 -73
  632. package/dist/process/ProcessOwnershipObservation.js +62 -2
  633. package/dist/process/ProcessOwnershipProcessTree.js +13 -0
  634. package/dist/process/ProviderProcess.js +62 -24
  635. package/dist/process/ProviderRunLineage.js +1 -1
  636. package/dist/process/WindowsAuthority.js +20 -1
  637. package/dist/reference/ReferenceSourceReaderEntries.js +11 -2
  638. package/dist/reference/ReferenceSourceReaderFile.js +1 -0
  639. package/dist/server/createServer.js +67 -2
  640. package/dist/server/mcpClientMetadata.js +6 -3
  641. package/dist/server/mcpProgress.js +2 -1
  642. package/dist/server/promptCompletion.js +3 -3
  643. package/dist/server/registerAndroidTools.js +30 -0
  644. package/dist/server/registerApplicationTools/compareExportShapes.js +7 -3
  645. package/dist/server/registerApplicationTools/compareSourceToBundle.js +9 -4
  646. package/dist/server/registerApplicationTools/compareVersions.js +7 -3
  647. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +43 -0
  648. package/dist/server/registerApplicationTools/traceFeature.js +8 -3
  649. package/dist/server/registerApplicationTools/traceSemantics.js +8 -3
  650. package/dist/server/registerApplicationTools.js +2 -0
  651. package/dist/server/registerBrowserScenarioTool.js +6 -2
  652. package/dist/server/registerBrowserTools.js +13 -2
  653. package/dist/server/registerCloseLifecycleTool.js +1 -1
  654. package/dist/server/registerElectronTools.js +21 -7
  655. package/dist/server/registerEnhancedTools.js +28 -1
  656. package/dist/server/registerFirmwareTools.js +22 -0
  657. package/dist/server/registerFunctionComparisonTool.js +1 -1
  658. package/dist/server/registerInvestigationTools/helpers.js +2 -1
  659. package/dist/server/registerJavaScriptRecoveryTool.js +17 -0
  660. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -4
  661. package/dist/server/registerManagedTools.js +4 -4
  662. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -2
  663. package/dist/server/registerManagedWorkflowTools/contract.js +1 -1
  664. package/dist/server/registerManagedWorkflowTools/evidence.js +1 -1
  665. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +1 -1
  666. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +1 -1
  667. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -2
  668. package/dist/server/registerNativeTools.js +1 -1
  669. package/dist/server/registerOfficialTools.js +4 -1
  670. package/dist/server/registerProcessComparisonTool.js +5 -2
  671. package/dist/server/registerPrompts.js +5 -1
  672. package/dist/server/registerSessionTools.js +4 -2
  673. package/dist/server/registerWebModuleTool.js +17 -0
  674. package/dist/server/registerWebRuntimeTools.js +31 -0
  675. package/dist/server/registerWebScriptTool.js +18 -0
  676. package/dist/server/registerWebSourceLocationTool.js +17 -0
  677. package/dist/server/runDerivedOperation.js +1 -1
  678. package/dist/server/sessionAvailabilityPolicy.js +24 -9
  679. package/dist/server/sessionEvidence.js +1 -1
  680. package/dist/server/toolResult.js +2 -1
  681. package/dist/windows/WindowsNativeLoader.js +108 -0
  682. package/dist/windows/WindowsOwnedProcess.js +170 -0
  683. package/dist/windows/WindowsPrivateRuntime.js +137 -0
  684. package/install.sh +16 -8
  685. package/native/windows/README.md +107 -0
  686. package/native/windows/build/manifest.json +9 -0
  687. package/native/windows/build/rea-windows-x64.node +0 -0
  688. package/package.json +70 -35
  689. package/scripts/hopper-demo-x11.py +67 -8
  690. package/scripts/rea.mjs +10 -2
  691. package/scripts/verify-windows-native-artifact.mjs +39 -0
  692. package/skills/reverse-engineer-anything/SKILL.md +92 -24
  693. package/skills/reverse-engineer-anything/references/android-applications.md +31 -0
  694. package/skills/reverse-engineer-anything/references/javascript-applications.md +19 -2
  695. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +61 -4
  696. package/dist/application/JavaScriptApplicationService.js +0 -52
  697. package/dist/application/runtime.js +0 -51
  698. package/dist/browser/CdpCanonicalJsonDigest.js +0 -9
  699. package/dist/domain/appleApplication.js +0 -181
  700. package/dist/domain/errors.js +0 -324
  701. package/dist/domain/javascriptAstValues.js +0 -13
  702. package/dist/domain/javascriptSemanticTraversal.js +0 -30
  703. package/dist/native/NativeHostCapabilities.js +0 -23
  704. /package/dist/application/{BinarySessionPort.js → DirectAnalysisDependencies.js} +0 -0
  705. /package/dist/application/{ElectronActiveObservationPort.js → WebModulePorts.js} +0 -0
  706. /package/dist/application/{ElectronObservationPort.js → WebRuntimePort.js} +0 -0
  707. /package/dist/application/{JavaScriptArtifactAnalysisTypes.js → WebScriptArtifactPort.js} +0 -0
  708. /package/dist/application/{JavaScriptRuntimeObservationPort.js → WebSourceLocationPorts.js} +0 -0
  709. /package/dist/{domain/electronStaticAnalysisTypes.js → application/android/AndroidAnalysisPort.js} +0 -0
  710. /package/dist/application/{AbortablePromise.js → binary/AbortablePromise.js} +0 -0
  711. /package/dist/{domain/javascriptSemanticValueTypes.js → application/binary/BinarySessionPort.js} +0 -0
  712. /package/dist/application/{BinarySessionStatus.js → binary/BinarySessionStatus.js} +0 -0
  713. /package/dist/application/{ElectronBoundaryGraph.js → javascript/ElectronBoundaryGraph.js} +0 -0
  714. /package/dist/application/{ElectronBoundaryGraphIpc.js → javascript/ElectronBoundaryGraphIpc.js} +0 -0
  715. /package/dist/application/{ElectronBoundaryGraphNative.js → javascript/ElectronBoundaryGraphNative.js} +0 -0
  716. /package/dist/application/{ElectronBoundaryGraphWindows.js → javascript/ElectronBoundaryGraphWindows.js} +0 -0
  717. /package/dist/application/{JavaScriptArtifactGraphBundlers.js → javascript/JavaScriptArtifactGraphBundlers.js} +0 -0
  718. /package/dist/application/{JavaScriptArtifactGraphEvidence.js → javascript/JavaScriptArtifactGraphEvidence.js} +0 -0
  719. /package/dist/application/{JavaScriptArtifactReconstructionInput.js → javascript/JavaScriptArtifactReconstructionInput.js} +0 -0
  720. /package/dist/application/{JavaScriptSemanticGraphEvidence.js → javascript/JavaScriptSemanticGraphEvidence.js} +0 -0
  721. /package/dist/application/{JavaScriptSemanticGraphValueProjection.js → javascript/JavaScriptSemanticGraphValueProjection.js} +0 -0
  722. /package/dist/domain/{electronStaticAnalysis.js → javascript/electronStaticAnalysis.js} +0 -0
  723. /package/dist/domain/{javascriptExportShapeComparisonIdentity.js → javascript/javascriptExportShapeComparisonIdentity.js} +0 -0
  724. /package/dist/domain/{javascriptRuntimeReconciliation.js → javascript/javascriptRuntimeReconciliation.js} +0 -0
  725. /package/dist/domain/{javascriptRuntimeReconciliationRuntime.js → javascript/javascriptRuntimeReconciliationRuntime.js} +0 -0
  726. /package/dist/domain/{javascriptSemanticCoverage.js → javascript/javascriptSemanticCoverage.js} +0 -0
  727. /package/dist/domain/{javascriptSemanticDerivedAnalysis.js → javascript/javascriptSemanticDerivedAnalysis.js} +0 -0
  728. /package/dist/domain/{javascriptSemanticGraphSerialization.js → javascript/javascriptSemanticGraphSerialization.js} +0 -0
  729. /package/dist/domain/{javascriptSemanticIr.js → javascript/javascriptSemanticIr.js} +0 -0
  730. /package/dist/domain/{javascriptSemanticQueryRelations.js → javascript/javascriptSemanticQueryRelations.js} +0 -0
  731. /package/dist/domain/{javascriptSemanticState.js → javascript/javascriptSemanticState.js} +0 -0
  732. /package/dist/domain/{javascriptStaticAnalysisFindings.js → javascript/javascriptStaticAnalysisFindings.js} +0 -0
  733. /package/dist/domain/{javascriptStaticAnalysisState.js → javascript/javascriptStaticAnalysisState.js} +0 -0
  734. /package/dist/domain/{javascriptStaticAnalysisTypes.js → javascript/javascriptStaticAnalysisTypes.js} +0 -0
  735. /package/dist/domain/{managedApplicationGraphCoverage.js → managed/managedApplicationGraphCoverage.js} +0 -0
  736. /package/dist/domain/{managedApplicationGraphNodeCoverage.js → managed/managedApplicationGraphNodeCoverage.js} +0 -0
  737. /package/dist/domain/{nativeApiBoundary.js → native/nativeApiBoundary.js} +0 -0
  738. /package/dist/domain/{nativeInstruction.js → native/nativeInstruction.js} +0 -0
  739. /package/dist/domain/{nativeValueFlow.js → native/nativeValueFlow.js} +0 -0
  740. /package/dist/domain/{nativeValueTrace.js → native/nativeValueTrace.js} +0 -0
@@ -18,7 +18,7 @@ const createGhidraSessionError = (failure) => new GhidraSessionError(failure.kin
18
18
  ? failure.diagnostics
19
19
  : {
20
20
  ...failure.diagnostics,
21
- remote_code: failure.remoteCode,
21
+ remote_code: failure.redact(failure.remoteCode),
22
22
  remote_message: failure.message,
23
23
  }, {
24
24
  ...(failure.cause === undefined ? {} : { cause: failure.cause }),
@@ -30,10 +30,37 @@ const createGhidraSessionError = (failure) => new GhidraSessionError(failure.kin
30
30
  : { remoteCode: failure.remoteCode }),
31
31
  });
32
32
  /** Bind session-failure construction to a live, token-redacted diagnostic view. */
33
- export const bindGhidraSessionFailure = (diagnostics) => (kind, message, cause, options = {}) => createGhidraSessionError({
33
+ export const bindGhidraSessionFailure = (diagnostics, redact = (value) => value) => (kind, message, cause, options = {}) => createGhidraSessionError({
34
34
  kind,
35
- message,
36
- diagnostics: diagnostics(),
35
+ message: redact(message),
36
+ diagnostics: {
37
+ ...diagnostics(),
38
+ ...(cause === undefined
39
+ ? {}
40
+ : { failure_cause: describeCause(cause, redact) }),
41
+ },
42
+ redact,
37
43
  ...(cause === undefined ? {} : { cause }),
38
44
  ...options,
39
45
  });
46
+ const describeCause = (cause, redact) => {
47
+ if (cause instanceof Error) {
48
+ const code = "code" in cause ? cause.code : undefined;
49
+ return {
50
+ name: redact(cause.name),
51
+ message: redact(cause.message),
52
+ ...(typeof code === "string"
53
+ ? { code: redact(code) }
54
+ : typeof code === "number" && Number.isFinite(code)
55
+ ? { code }
56
+ : {}),
57
+ };
58
+ }
59
+ if (typeof cause === "string")
60
+ return { type: "string", message: redact(cause) };
61
+ if (cause === null || typeof cause === "boolean")
62
+ return { type: cause === null ? "null" : "boolean", value: cause };
63
+ if (typeof cause === "number" && Number.isFinite(cause))
64
+ return { type: "number", value: cause };
65
+ return { type: typeof cause };
66
+ };
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  import { err, ok } from "../domain/result.js";
3
3
  import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
4
4
  import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
5
+ import { ghidraExtensionResultSchema } from "./extensions/GhidraExtensions.js";
5
6
  /** Exact methods proved by the bridge handshake after auto-analysis. */
6
7
  export const GHIDRA_SESSION_CAPABILITIES = [
7
8
  "ping",
@@ -21,12 +22,11 @@ const sessionInfoSchema = z
21
22
  version: z.string().min(1),
22
23
  })
23
24
  .strict(),
24
- read_only: z.literal(true),
25
+ read_only: z.boolean(),
25
26
  analysis_complete: z.boolean(),
26
27
  analysis_timed_out: z.boolean(),
27
- capabilities: z
28
- .array(capabilitySchema)
29
- .length(GHIDRA_SESSION_CAPABILITIES.length),
28
+ analysis_extensions: z.array(ghidraExtensionResultSchema).optional(),
29
+ capabilities: z.array(capabilitySchema),
30
30
  target: z
31
31
  .object({
32
32
  name: z.string().min(1),
@@ -42,8 +42,12 @@ const sessionInfoSchema = z
42
42
  /** Require exact run, provider, and profile identity from the Java bridge. */
43
43
  export const parseGhidraSessionInfo = (value, expected) => {
44
44
  const parsed = sessionInfoSchema.safeParse(value);
45
+ const readOnly = expected.expectedReadOnly ?? false;
46
+ const expectedCapabilities = GHIDRA_SESSION_CAPABILITIES.filter((capability) => !readOnly || capability !== "annotate_native_function");
45
47
  if (!parsed.success ||
46
48
  parsed.data.run_id !== expected.runId ||
49
+ parsed.data.read_only !== readOnly ||
50
+ parsed.data.capabilities.length !== expectedCapabilities.length ||
47
51
  parsed.data.provider.version !== expected.providerVersion ||
48
52
  parsed.data.profile_digest !== expected.profileDigest ||
49
53
  parsed.data.target.sha256 !== expected.targetSha256 ||
@@ -52,9 +56,8 @@ export const parseGhidraSessionInfo = (value, expected) => {
52
56
  (expected.expectedCompilerSpecId !== undefined &&
53
57
  parsed.data.target.compiler_spec_id !==
54
58
  expected.expectedCompilerSpecId) ||
55
- new Set(parsed.data.capabilities).size !==
56
- GHIDRA_SESSION_CAPABILITIES.length ||
57
- GHIDRA_SESSION_CAPABILITIES.some((capability) => !parsed.data.capabilities.includes(capability)) ||
59
+ new Set(parsed.data.capabilities).size !== expectedCapabilities.length ||
60
+ expectedCapabilities.some((capability) => !parsed.data.capabilities.includes(capability)) ||
58
61
  parsed.data.analysis_complete === parsed.data.analysis_timed_out)
59
62
  return err(new Error("Ghidra bridge handshake identity is invalid"));
60
63
  return ok(parsed.data);
@@ -2,12 +2,23 @@ import { createHash } from "node:crypto";
2
2
  import { constants, createReadStream } from "node:fs";
3
3
  import { chmod, copyFile, rm } from "node:fs/promises";
4
4
  import { extname, join } from "node:path";
5
+ import { windowsPrivateRuntime } from "../windows/WindowsPrivateRuntime.js";
5
6
  /** Copy one target and require its bytes to match the parsed target identity. */
6
- export const createGhidraTargetSnapshot = async (sourcePath, runtimeRoot, expectedSha256) => {
7
+ export const createGhidraTargetSnapshot = async (sourcePath, runtimeRoot, expectedSha256, options = {}) => {
7
8
  if (!/^[a-f0-9]{64}$/u.test(expectedSha256))
8
9
  throw new TypeError("Ghidra target SHA-256 commitment is invalid");
9
10
  const suffix = safeExtension(sourcePath);
10
11
  const snapshotPath = join(runtimeRoot, `target-${expectedSha256.slice(0, 12)}${suffix}`);
12
+ if ((options.platform ?? process.platform) === "win32") {
13
+ const observed = await windowsPrivateRuntime(runtimeRoot).snapshot(sourcePath, `target-${expectedSha256.slice(0, 12)}${suffix}`, options.signal);
14
+ if (observed.sha256 !== expectedSha256)
15
+ throw new Error(`Ghidra target snapshot digest mismatch: expected ${expectedSha256}, observed ${observed.sha256}`);
16
+ return {
17
+ path: snapshotPath,
18
+ sha256: observed.sha256,
19
+ admission: { source: observed.source, snapshot: observed.snapshot },
20
+ };
21
+ }
11
22
  try {
12
23
  await copyFile(sourcePath, snapshotPath, constants.COPYFILE_EXCL);
13
24
  await chmod(snapshotPath, 0o600);
@@ -20,7 +31,10 @@ export const createGhidraTargetSnapshot = async (sourcePath, runtimeRoot, expect
20
31
  return { path: snapshotPath, sha256: observedSha256 };
21
32
  }
22
33
  catch (cause) {
23
- await rm(snapshotPath, { force: true }).catch(() => undefined);
34
+ await rm(snapshotPath, { force: true }).catch((cause) => {
35
+ // best-effort cleanup: snapshot removal must not mask the copy failure.
36
+ void cause;
37
+ });
24
38
  throw cause;
25
39
  }
26
40
  };
@@ -1,4 +1,5 @@
1
1
  import { access, open } from "node:fs/promises";
2
+ import { readWindowsPrivateRuntimeFile } from "../windows/WindowsPrivateRuntime.js";
2
3
  import { err, ok } from "../domain/result.js";
3
4
  import { GhidraSessionError } from "./GhidraSessionError.js";
4
5
  /** Observe a ready endpoint, returning null while its bridge is not listening. */
@@ -14,6 +15,16 @@ export const observeGhidraEndpoint = async (endpoint) => {
14
15
  : err(endpointFailure(endpoint, "Ghidra socket observation failed", cause));
15
16
  }
16
17
  }
18
+ if (process.platform === "win32") {
19
+ try {
20
+ return parseTcpEndpoint(endpoint, readWindowsPrivateRuntimeFile(endpoint.path));
21
+ }
22
+ catch (cause) {
23
+ return isMissing(cause) || isWindowsEndpointWriterBusy(cause)
24
+ ? ok(null)
25
+ : err(endpointFailure(endpoint, "Ghidra endpoint observation failed", cause));
26
+ }
27
+ }
17
28
  let handle;
18
29
  try {
19
30
  handle = await open(endpoint.path, "r");
@@ -66,3 +77,4 @@ const endpointFailure = (endpoint, message, cause) => new GhidraSessionError("st
66
77
  ...(cause instanceof Error ? { error: cause.message } : {}),
67
78
  }, cause instanceof Error ? { cause } : undefined);
68
79
  const isMissing = (cause) => cause instanceof Error && "code" in cause && cause.code === "ENOENT";
80
+ const isWindowsEndpointWriterBusy = (cause) => cause instanceof Error && "win32Code" in cause && cause.win32Code === 32;
@@ -0,0 +1,20 @@
1
+ import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
2
+ import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
3
+ import { jsonValueSchema } from "../../domain/jsonValue.js";
4
+ import { validateGhidraExtensionResults, } from "./GhidraExtensions.js";
5
+ /** Preserve unsupported recovery separately from malformed or failed producers. */
6
+ export const ghidraExtensionFailure = (extensions, results, operation) => {
7
+ const reports = results;
8
+ const invalid = validateGhidraExtensionResults(extensions, reports);
9
+ const failed = reports.find((value) => value.status === "unsupported" || value.status === "failed");
10
+ if (invalid === null && failed === undefined)
11
+ return undefined;
12
+ return invalid === null && failed?.status === "unsupported"
13
+ ? new AnalysisCapabilityUnavailableError("ghidra", operation, `${failed.id}: ${failed.reason}. Omit REA_GHIDRA_NATIVEAOT_JAR to continue ordinary native analysis.`)
14
+ : new ProviderAdapterError("ghidra", operation, {
15
+ diagnostics: {
16
+ reason: invalid ?? failed?.reason ?? "Ghidra extension failed",
17
+ analysis_extensions: jsonValueSchema.parse(reports),
18
+ },
19
+ });
20
+ };
@@ -0,0 +1,170 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { open, realpath, writeFile, mkdir } from "node:fs/promises";
4
+ import { isAbsolute, join } from "node:path";
5
+ import { z } from "zod";
6
+ import { AnalysisCancelledError } from "../../domain/analysisErrorCore.js";
7
+ import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
8
+ import { jsonObjectSchema } from "../../domain/jsonValue.js";
9
+ import { err, ok } from "../../domain/result.js";
10
+ import { nativeAotAdapter } from "./nativeaot/NativeAotAdapter.js";
11
+ const digest = z.string().regex(/^[a-f0-9]{64}$/u);
12
+ /** Exact executable extension artifact committed before the session starts. */
13
+ export const ghidraExtensionSchema = z.strictObject({
14
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/u),
15
+ path: z.string().refine(isAbsolute, "Extension path must be absolute"),
16
+ configured_path: z
17
+ .string()
18
+ .refine(isAbsolute, "Extension path must be absolute"),
19
+ sha256: digest,
20
+ entry_class: z.string().min(1),
21
+ integration_api: z.literal(1),
22
+ });
23
+ /** Shared extension envelope; each adapter validates its own producer result. */
24
+ export const ghidraExtensionResultSchema = z.strictObject({
25
+ id: z.string().min(1),
26
+ sha256: digest,
27
+ status: z.enum([
28
+ "complete",
29
+ "partial",
30
+ "not_applicable",
31
+ "unsupported",
32
+ "failed",
33
+ ]),
34
+ reason: z.string().nullable(),
35
+ result: jsonObjectSchema,
36
+ });
37
+ const adapters = [nativeAotAdapter];
38
+ const MAX_EXTENSION_BYTES = 8 * 1024 * 1024;
39
+ /** Read a bounded regular artifact through its open handle, without ambient state changes. */
40
+ const readJar = async (path) => {
41
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
42
+ try {
43
+ const stat = await file.stat();
44
+ if (!stat.isFile() || stat.size < 4 || stat.size > MAX_EXTENSION_BYTES)
45
+ throw new Error(`Ghidra extension must be a regular JAR of 4..${MAX_EXTENSION_BYTES} bytes: ${path}`);
46
+ const bytes = Buffer.alloc(stat.size);
47
+ let offset = 0;
48
+ while (offset < bytes.length) {
49
+ const read = await file.read(bytes, offset, bytes.length - offset, offset);
50
+ if (read.bytesRead === 0)
51
+ throw new Error(`Incomplete Ghidra extension read: ${path}`);
52
+ offset += read.bytesRead;
53
+ }
54
+ const extra = Buffer.alloc(1);
55
+ if ((await file.read(extra, 0, 1, offset)).bytesRead !== 0 ||
56
+ bytes.readUInt32LE(0) !== 0x04034b50)
57
+ throw new Error(`Ghidra extension changed during read or is not a JAR: ${path}`);
58
+ return bytes;
59
+ }
60
+ finally {
61
+ await file.close();
62
+ }
63
+ };
64
+ /** Resolve explicitly configured optional extensions into the immutable analysis profile. */
65
+ export const resolveGhidraExtensions = async (config, target, platform, signal) => {
66
+ const extensions = [];
67
+ for (const adapter of adapters) {
68
+ if (signal?.aborted)
69
+ return err(new AnalysisCancelledError("open_binary"));
70
+ const configured = adapter.configuredPath(config);
71
+ if (configured === undefined)
72
+ continue;
73
+ const reason = adapter.unsupportedReason(target, platform);
74
+ if (reason !== null)
75
+ return err(new ProviderAdapterError("ghidra", "resolve_analysis_profile", {
76
+ diagnostics: { extension: adapter.id, reason, path: configured },
77
+ }));
78
+ try {
79
+ const path = await realpath(configured);
80
+ const bytes = await readJar(path);
81
+ extensions.push({
82
+ id: adapter.id,
83
+ path,
84
+ configured_path: configured,
85
+ sha256: createHash("sha256").update(bytes).digest("hex"),
86
+ entry_class: adapter.entryClass,
87
+ integration_api: 1,
88
+ });
89
+ }
90
+ catch (cause) {
91
+ return err(new ProviderAdapterError("ghidra", "resolve_analysis_profile", {
92
+ cause,
93
+ diagnostics: {
94
+ extension: adapter.id,
95
+ path: configured,
96
+ reason: cause instanceof Error ? cause.message : String(cause),
97
+ },
98
+ }));
99
+ }
100
+ }
101
+ if (signal?.aborted)
102
+ return err(new AnalysisCancelledError("open_binary"));
103
+ return ok(extensions);
104
+ };
105
+ /** Require explicit local configuration before admitting executable code from a profile. */
106
+ export const validateGhidraExtensionProfile = (extensions, config, target, platform) => {
107
+ const enabled = adapters.filter((adapter) => adapter.configuredPath(config) !== undefined);
108
+ if (enabled.length !== extensions.length ||
109
+ new Set(extensions.map((extension) => extension.id)).size !==
110
+ extensions.length)
111
+ return "Configured Ghidra extension inventory differs from the resolved analysis profile.";
112
+ for (const extension of extensions) {
113
+ const adapter = enabled.find((value) => value.id === extension.id);
114
+ if (adapter === undefined ||
115
+ adapter.entryClass !== extension.entry_class ||
116
+ adapter.configuredPath(config) !== extension.configured_path)
117
+ return `Ghidra extension profile lacks matching explicit local configuration: ${extension.id}`;
118
+ const reason = adapter.unsupportedReason(target, platform);
119
+ if (reason !== null)
120
+ return reason;
121
+ }
122
+ return null;
123
+ };
124
+ /** Snapshot committed extension bytes into the private runtime before Java loads them. */
125
+ export const snapshotGhidraExtensions = async (extensions, runtimeRoot) => {
126
+ if (extensions.length === 0)
127
+ return [];
128
+ for (const extension of extensions) {
129
+ ghidraExtensionSchema.parse(extension);
130
+ const adapter = adapters.find((value) => value.id === extension.id);
131
+ if (adapter === undefined || adapter.entryClass !== extension.entry_class)
132
+ throw new Error(`Unregistered Ghidra extension identity: ${extension.id}`);
133
+ if ((await realpath(extension.configured_path)) !== extension.path)
134
+ throw new Error(`Ghidra extension resolved path differs from explicit configuration: ${extension.id}`);
135
+ }
136
+ const directory = join(runtimeRoot, "extensions");
137
+ await mkdir(directory, { mode: 0o700 });
138
+ const result = [];
139
+ for (const extension of extensions) {
140
+ const bytes = await readJar(extension.path);
141
+ if (createHash("sha256").update(bytes).digest("hex") !== extension.sha256)
142
+ throw new Error(`Ghidra extension digest differs from committed profile: ${extension.id} (${extension.path})`);
143
+ const path = join(directory, `${extension.id}.jar`);
144
+ await writeFile(path, bytes, { flag: "wx", mode: 0o600 });
145
+ result.push({ ...extension, path });
146
+ }
147
+ return result;
148
+ };
149
+ /** Require every configured producer result to match its artifact and registered ABI. */
150
+ export const validateGhidraExtensionResults = (expected, results) => {
151
+ if (results.length !== expected.length ||
152
+ new Set(results.map((result) => result.id)).size !== results.length)
153
+ return "Ghidra extension result inventory differs from its committed profile.";
154
+ for (const extension of expected) {
155
+ const result = results.find((value) => value.id === extension.id);
156
+ const adapter = adapters.find((value) => value.id === extension.id);
157
+ if (result === undefined ||
158
+ adapter === undefined ||
159
+ result.sha256 !== extension.sha256)
160
+ return `Ghidra extension identity mismatch: ${extension.id}`;
161
+ const invalid = adapter.validate(result);
162
+ if (invalid !== null)
163
+ return invalid;
164
+ }
165
+ return null;
166
+ };
167
+ /** Exact adapter limitations for explicitly configured session extensions. */
168
+ export const ghidraExtensionLimitations = (extensions) => adapters
169
+ .filter((adapter) => extensions.some((extension) => extension.id === adapter.id))
170
+ .flatMap((adapter) => adapter.limitations);
@@ -0,0 +1,21 @@
1
+ import { validateNativeAotReport } from "./NativeAotReport.js";
2
+ /** NativeAOT-specific prerequisites and report interpretation behind the extension boundary. */
3
+ export const nativeAotAdapter = {
4
+ id: "nativeaot",
5
+ entryClass: "rea.extensions.nativeaot.NativeAotExtension",
6
+ configuredPath: (config) => config.ghidraNativeAotJar,
7
+ unsupportedReason: (target, platform) => platform !== "linux"
8
+ ? "NativeAOT recovery is verified on Linux only; omit REA_GHIDRA_NATIVEAOT_JAR for ordinary native analysis."
9
+ : !["elf", "pe"].includes(target.format) ||
10
+ target.architecture !== "x86_64" ||
11
+ target.managed === true
12
+ ? "NativeAOT recovery requires an x86-64 ELF or native PE target on Linux; PE/CLI and ReadyToRun assemblies use inspect_managed_artifact; omit REA_GHIDRA_NATIVEAOT_JAR for ordinary native analysis."
13
+ : null,
14
+ validate: validateNativeAotReport,
15
+ limitations: [
16
+ "Optional NativeAOT recovery is verified for .NET 8.0.22 RTR 9.1 Linux x64 ELF and Windows x64 PE targets on a Linux host. Other runtime layouts, target architectures and hosts are unsupported.",
17
+ "Type names and relationships use recovery heuristics; original C# source and custom field layouts are not recovered. Rehydrated analysis-memory bytes are derived, without original file offsets or runtime observations.",
18
+ "Method prototypes are Ghidra inferences, not original signatures. Pre-recovery conventions are retained; new functions use the loaded compiler default. Verify parameter roles against instructions and call sites.",
19
+ "The configured extension retains its actual JAR digest. Its reported source revision is not an attestation of caller-supplied build bytes.",
20
+ ],
21
+ };
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+ const report = z
3
+ .object({
4
+ id: z.literal("nativeaot"),
5
+ integration_api: z.literal(1),
6
+ source_revision: z.literal("effeb734fc570c32650f88b159608979dc7b423e"),
7
+ source_revision_authority: z.literal("build-reported-unattested"),
8
+ status: z.enum([
9
+ "complete",
10
+ "partial",
11
+ "not_applicable",
12
+ "unsupported",
13
+ "failed",
14
+ ]),
15
+ reason: z.string().nullable(),
16
+ method_tables: z.number().int().nonnegative(),
17
+ diagnostics: z.array(z.string()),
18
+ header_address: z
19
+ .string()
20
+ .regex(/^0x[0-9a-f]+$/u)
21
+ .optional(),
22
+ discovery: z.enum(["symbol", "signature-heuristic"]).optional(),
23
+ format_major: z.number().int().optional(),
24
+ format_minor: z.number().int().optional(),
25
+ derived_memory: z
26
+ .object({
27
+ address: z.string().regex(/^0x[0-9a-f]+$/u),
28
+ size_bytes: z.number().int().nonnegative(),
29
+ sha256: z.string().regex(/^[a-f0-9]{64}$/u),
30
+ file_offset: z.null(),
31
+ })
32
+ .optional(),
33
+ coverage: z
34
+ .strictObject({
35
+ frozen_object_candidates: z.number().int().nonnegative(),
36
+ frozen_objects_annotated: z.number().int().nonnegative(),
37
+ basis: z.literal("rehydrated-pointer-candidates-and-committed-instance-types"),
38
+ })
39
+ .optional(),
40
+ types: z
41
+ .array(z.object({
42
+ address: z.string().regex(/^0x[0-9a-f]+$/u),
43
+ type: z.string().min(1),
44
+ }))
45
+ .optional(),
46
+ })
47
+ .strict();
48
+ const validateNonRecoveryMetadata = (value, recovered) => {
49
+ if (recovered)
50
+ return null;
51
+ if (value.reason === null || value.reason.trim().length === 0)
52
+ return "NativeAOT non-recovery status omits its required reason.";
53
+ return value.method_tables !== 0 ||
54
+ value.types !== undefined ||
55
+ value.derived_memory !== undefined ||
56
+ value.coverage !== undefined
57
+ ? "NativeAOT non-recovery status carries recovered metadata."
58
+ : null;
59
+ };
60
+ /** Validate the pinned producer representation before its result enters Evidence. */
61
+ export const validateNativeAotReport = (value) => {
62
+ if (value.status === "failed" &&
63
+ typeof value.result.loader_failure === "string" &&
64
+ value.result.loader_failure === value.reason)
65
+ return null;
66
+ const parsed = report.safeParse(value.result);
67
+ if (!parsed.success ||
68
+ parsed.data.status !== value.status ||
69
+ parsed.data.reason !== value.reason)
70
+ return "NativeAOT extension returned a malformed or inconsistent producer report.";
71
+ return validateRecoveredMetadata(parsed.data);
72
+ };
73
+ const validateRecoveredMetadata = (value) => {
74
+ const recovered = ["complete", "partial"].includes(value.status);
75
+ if (recovered &&
76
+ (value.method_tables === 0 ||
77
+ value.format_major !== 9 ||
78
+ value.format_minor !== 1 ||
79
+ value.types?.length !== value.method_tables ||
80
+ value.derived_memory === undefined ||
81
+ value.header_address === undefined ||
82
+ value.discovery === undefined ||
83
+ value.coverage === undefined ||
84
+ value.reason !== null))
85
+ return "NativeAOT recovery omitted its supported format, method-table inventory or derived-memory identity.";
86
+ const nonRecoveryInvalid = validateNonRecoveryMetadata(value, recovered);
87
+ if (nonRecoveryInvalid !== null)
88
+ return nonRecoveryInvalid;
89
+ const coverage = value.coverage;
90
+ if (coverage !== undefined &&
91
+ (coverage.frozen_objects_annotated > coverage.frozen_object_candidates ||
92
+ (value.status === "complete" &&
93
+ coverage.frozen_objects_annotated !==
94
+ coverage.frozen_object_candidates)))
95
+ return "NativeAOT recovery coverage contradicts its reported completion status.";
96
+ const types = value.types ?? [];
97
+ if (new Set(types.map((type) => type.address)).size !== types.length)
98
+ return "NativeAOT recovery repeated a method-table identity.";
99
+ return null;
100
+ };
@@ -2,7 +2,7 @@ import { execFile } from "node:child_process";
2
2
  import { chmod, writeFile } from "node:fs/promises";
3
3
  import { basename, dirname, extname, join } from "node:path";
4
4
  import { promisify } from "node:util";
5
- import { HopperCancelledError, HopperProcessError, HopperStartError, } from "../domain/errors.js";
5
+ import { HopperCancelledError, HopperProcessError, HopperStartError, } from "../domain/hopperErrors.js";
6
6
  import { err, ok } from "../domain/result.js";
7
7
  import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
8
8
  import { execFileOutput } from "../process/ExecFileOutput.js";
@@ -275,7 +275,9 @@ const processIsRunning = async (executablePath) => {
275
275
  .split("\n")
276
276
  .some((command) => command.trim() === executablePath);
277
277
  }
278
- catch {
278
+ catch (cause) {
279
+ // best-effort cleanup: optional process probing; failure means not running.
280
+ void cause;
279
281
  return false;
280
282
  }
281
283
  };
@@ -1,7 +1,9 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { createReadStream } from "node:fs";
3
3
  import { createAnalysisProfile } from "../domain/analysisProfile.js";
4
- import { AnalysisCancelledError, ProviderAdapterError, } from "../domain/errors.js";
4
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
5
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
+ import {} from "../domain/analysisErrorBase.js";
5
7
  import { err, ok } from "../domain/result.js";
6
8
  /** Resolve Hopper open semantics without placing its CLI flags in BinaryTarget. */
7
9
  export const resolveHopperAnalysisProfile = async (target, options) => {
@@ -63,6 +65,7 @@ export const hopperLoaderArgsForTarget = (target) => {
63
65
  case "pe":
64
66
  return ok(["-l", "WinPE", flag]);
65
67
  case "dos-mz":
68
+ case "dos-com":
66
69
  return err(new ProviderAdapterError("hopper", "resolve_analysis_profile"));
67
70
  }
68
71
  };
@@ -94,7 +97,9 @@ const sha256File = async (path, signal) => {
94
97
  ? err(new AnalysisCancelledError("open_binary"))
95
98
  : ok(hash.digest("hex"));
96
99
  }
97
- catch {
100
+ catch (cause) {
101
+ // best-effort cleanup: unreadable targets mean no digest; abort still cancels.
102
+ void cause;
98
103
  return signalIsAborted(signal)
99
104
  ? err(new AnalysisCancelledError("open_binary"))
100
105
  : ok(undefined);
@@ -1,4 +1,4 @@
1
- import { HopperProcessError } from "../domain/errors.js";
1
+ import { HopperProcessError } from "../domain/hopperErrors.js";
2
2
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
3
3
  import { err, ok } from "../domain/result.js";
4
4
  import { createOwnedHopperShutdownDiagnostic, providerCleanupFailure, } from "./HopperDiagnostics.js";
@@ -34,11 +34,12 @@ const requestShutdown = async (input, state) => {
34
34
  }, "Hopper shutdown skipped because a bridge operation remained active");
35
35
  return;
36
36
  }
37
- const shutdown = await input
38
- .request(input.retainDocument || input.launch?.shutdownMode === "process-cleanup"
37
+ const method = input.retainDocument || input.launch?.shutdownMode === "process-cleanup"
39
38
  ? "shutdown"
40
- : "shutdown_document")
41
- .catch(() => err(new HopperProcessError(null)));
39
+ : "shutdown_document";
40
+ const shutdown = await input
41
+ .request(method)
42
+ .catch((cause) => err(shutdownRequestFailure(method, cause)));
42
43
  if (shutdown.ok &&
43
44
  isHopperCleanupRequired(shutdown.value) &&
44
45
  input.launch?.shutdownMode === "process-cleanup") {
@@ -57,17 +58,60 @@ const requestShutdown = async (input, state) => {
57
58
  }
58
59
  if (!shutdown.ok ||
59
60
  (!state.shutdownConfirmed && state.cleanupResult === undefined))
60
- input.logger.warn({ status: shutdown.ok ? "invalid-acknowledgement" : "failed" }, "Hopper document shutdown was not confirmed");
61
+ input.logger.warn({
62
+ status: shutdown.ok ? "invalid-acknowledgement" : "failed",
63
+ ...(shutdown.ok ? {} : shutdownFailureDetails(shutdown.error)),
64
+ }, "Hopper document shutdown was not confirmed");
61
65
  };
62
66
  const fallbackDocumentShutdown = async (input) => {
63
67
  const fallback = await input
64
68
  .request("shutdown_document")
65
- .catch(() => err(new HopperProcessError(null)));
69
+ .catch((cause) => err(shutdownRequestFailure("shutdown_document", cause)));
66
70
  const confirmed = fallback.ok && isHopperShutdownAcknowledgement(fallback.value);
67
71
  if (!confirmed)
68
- input.logger.warn({ status: fallback.ok ? "invalid-acknowledgement" : "failed" }, "Hopper document shutdown fallback was not confirmed");
72
+ input.logger.warn({
73
+ status: fallback.ok ? "invalid-acknowledgement" : "failed",
74
+ ...(fallback.ok ? {} : shutdownFailureDetails(fallback.error)),
75
+ }, "Hopper document shutdown fallback was not confirmed");
69
76
  return confirmed;
70
77
  };
78
+ const shutdownRequestFailure = (operation, cause) => {
79
+ const failure = new HopperProcessError(null, undefined, operation);
80
+ failure.cause = cause;
81
+ return failure;
82
+ };
83
+ const shutdownFailureDetails = (error) => ({
84
+ errorTag: error._tag,
85
+ ...(error instanceof HopperProcessError && error.operation !== undefined
86
+ ? { operation: error.operation }
87
+ : {}),
88
+ ...(error instanceof HopperProcessError && error.requestId !== undefined
89
+ ? { requestId: error.requestId }
90
+ : {}),
91
+ ...(error.cause === undefined
92
+ ? {}
93
+ : { failure_cause: describeFailureCause(error.cause) }),
94
+ });
95
+ const describeFailureCause = (cause) => {
96
+ if (cause instanceof Error) {
97
+ const code = "code" in cause ? cause.code : undefined;
98
+ return {
99
+ name: cause.name,
100
+ message: cause.message,
101
+ ...(typeof code === "string" ||
102
+ (typeof code === "number" && Number.isFinite(code))
103
+ ? { code }
104
+ : {}),
105
+ };
106
+ }
107
+ if (typeof cause === "string")
108
+ return { type: "string", message: cause };
109
+ if (cause === null ||
110
+ typeof cause === "boolean" ||
111
+ (typeof cause === "number" && Number.isFinite(cause)))
112
+ return { type: cause === null ? "null" : typeof cause, value: cause };
113
+ return { type: typeof cause };
114
+ };
71
115
  const stopProcess = async (input, state) => {
72
116
  const supervisor = input.processSupervisor;
73
117
  if (supervisor === undefined)
@@ -79,8 +123,9 @@ const stopProcess = async (input, state) => {
79
123
  try {
80
124
  input.onDiagnostic?.(diagnostic);
81
125
  }
82
- catch {
126
+ catch (cause) {
83
127
  // Diagnostic consumers cannot change the already-observed cleanup result.
128
+ void cause;
84
129
  }
85
130
  input.logger.info(diagnostic, "Owned Hopper launcher shutdown completed");
86
131
  if (stopped.status !== "incomplete") {
@@ -149,6 +194,7 @@ const activityDetails = (activity) => ({
149
194
  queued_requests: activity.queuedRequests,
150
195
  });
151
196
  const report = async (progress, completed, message) => {
197
+ // best-effort cleanup: progress reporting must not fail session cleanup.
152
198
  await progress
153
199
  ?.report({
154
200
  phase: "hopper_cleanup",