rea-agents 6.1.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 (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,11 +1,12 @@
1
1
  import {} from "playwright-core";
2
2
  import { BrowserObservationError } from "../domain/browserObservationError.js";
3
3
  import { BrowserScenarioSecrets } from "./BrowserScenarioSecrets.js";
4
- import { closePlaywrightScenarioBrowser, openPlaywrightScenarioBrowser, } from "./PlaywrightScenarioBrowser.js";
4
+ import { failBrowserScenarioOperation, openPlaywrightScenarioBrowser, } from "./PlaywrightScenarioBrowser.js";
5
5
  import { performPlaywrightScenarioAction } from "./PlaywrightScenarioActions.js";
6
6
  import { capturePlaywrightStepArtifacts } from "./PlaywrightScenarioArtifacts.js";
7
7
  import { PlaywrightScenarioEvents } from "./PlaywrightScenarioEvents.js";
8
8
  import { withPlaywrightExecutionBoundary } from "./PlaywrightExecutionBoundary.js";
9
+ import { browserScenarioCaptureData, browserScenarioOperationFailure, } from "./BrowserScenarioPartialObservation.js";
9
10
  const OPERATION = "capture_browser_scenario";
10
11
  const storageSeeds = (blocks, secrets) => {
11
12
  const seeds = {};
@@ -66,10 +67,8 @@ export class PlaywrightScenarioSession {
66
67
  product = "Chromium";
67
68
  version;
68
69
  initialUrl;
69
- closed = false;
70
70
  secrets;
71
71
  eventCapture;
72
- signal;
73
72
  constructor(opened, options) {
74
73
  this.opened = opened;
75
74
  this.mode = options.mode;
@@ -77,7 +76,6 @@ export class PlaywrightScenarioSession {
77
76
  options.mode === "launch" ? "provider-owned" : "external";
78
77
  this.secrets = options.secrets;
79
78
  this.eventCapture = options.eventCapture;
80
- this.signal = options.signal;
81
79
  this.version = opened.browser.version();
82
80
  this.initialUrl = opened.page.url();
83
81
  }
@@ -87,23 +85,26 @@ export class PlaywrightScenarioSession {
87
85
  const secrets = BrowserScenarioSecrets.resolve(scenario, environment);
88
86
  if (secrets === undefined)
89
87
  throw new BrowserObservationError(OPERATION, "secret_unavailable");
88
+ const startedAt = Date.now();
90
89
  const opening = openPlaywrightScenarioBrowser(scenario, environment);
91
90
  let opened;
91
+ let events;
92
92
  try {
93
93
  opened = await withPlaywrightExecutionBoundary(() => opening, undefined, options.signal);
94
94
  }
95
95
  catch (cause) {
96
96
  void opening
97
- .then((lateOpened) => closePlaywrightScenarioBrowser(lateOpened, options.signal))
97
+ .then((lateOpened) => lateOpened.cleanup.close(undefined, options.signal))
98
98
  .catch((cause) => {
99
99
  // best-effort cleanup: late-open cleanup must not mask the boundary failure.
100
100
  void cause;
101
101
  });
102
102
  throw cause;
103
103
  }
104
+ let session;
104
105
  try {
105
106
  await withPlaywrightExecutionBoundary(() => initializePage(opened.context, opened.page, scenario, secrets), undefined, options.signal);
106
- const events = new PlaywrightScenarioEvents({
107
+ events = new PlaywrightScenarioEvents({
107
108
  page: opened.page,
108
109
  context: opened.context,
109
110
  ownsContext: scenario.browser.mode === "launch",
@@ -112,12 +113,18 @@ export class PlaywrightScenarioSession {
112
113
  network: scenario.capture.network,
113
114
  ...(options.signal === undefined ? {} : { signal: options.signal }),
114
115
  });
115
- const session = new PlaywrightScenarioSession(opened, {
116
+ session = new PlaywrightScenarioSession(opened, {
116
117
  mode: scenario.browser.mode,
117
118
  secrets,
118
119
  eventCapture: events,
119
- ...(options.signal === undefined ? {} : { signal: options.signal }),
120
120
  });
121
+ }
122
+ catch (cause) {
123
+ return failBrowserScenarioOperation(() => opened.cleanup.close(events === undefined
124
+ ? undefined
125
+ : () => events?.finish() ?? Promise.resolve(), options.signal), cause);
126
+ }
127
+ try {
121
128
  await withPlaywrightExecutionBoundary(() => opened.page.goto(secrets.url(scenario.start_url), {
122
129
  waitUntil: "load",
123
130
  timeout: 0,
@@ -125,8 +132,28 @@ export class PlaywrightScenarioSession {
125
132
  return session;
126
133
  }
127
134
  catch (cause) {
128
- await closePlaywrightScenarioBrowser(opened, options.signal);
129
- throw cause;
135
+ let cleanup;
136
+ let cleanupFailure;
137
+ try {
138
+ cleanup = await session.close();
139
+ }
140
+ catch (failure) {
141
+ cleanup = "incomplete";
142
+ cleanupFailure = { cause: failure };
143
+ }
144
+ throw browserScenarioOperationFailure(cause, {
145
+ kind: "browser-scenario-observation",
146
+ capture: browserScenarioCaptureData({
147
+ session,
148
+ scenario,
149
+ startedAt,
150
+ steps: [],
151
+ cleanup,
152
+ limitations: [
153
+ "Scenario navigation failed before the initial state was captured.",
154
+ ],
155
+ }),
156
+ }, cleanupFailure);
130
157
  }
131
158
  }
132
159
  currentUrl() {
@@ -167,17 +194,7 @@ export class PlaywrightScenarioSession {
167
194
  }), undefined, signal);
168
195
  }
169
196
  async close() {
170
- if (this.closed)
171
- return this.mode === "launch"
172
- ? "terminated-owned-process"
173
- : "disconnected-external";
174
- this.closed = true;
175
- try {
176
- await this.eventCapture.finish();
177
- }
178
- finally {
179
- await closePlaywrightScenarioBrowser(this.opened, this.signal);
180
- }
197
+ await this.opened.cleanup.close(() => this.eventCapture.finish());
181
198
  return this.mode === "launch"
182
199
  ? "terminated-owned-process"
183
200
  : "disconnected-external";
@@ -189,7 +206,7 @@ export class PlaywrightScenarioSession {
189
206
  /** Production Playwright/CDP session factory. */
190
207
  export class PlaywrightScenarioSessionFactory {
191
208
  environment;
192
- constructor(environment = process.env) {
209
+ constructor(environment) {
193
210
  this.environment = environment;
194
211
  }
195
212
  open(scenario, options = {}) {
@@ -1,4 +1,4 @@
1
- import { webPageInspectionSchema } from "../../domain/browserObservation.js";
1
+ import { webPageInspectionSchema } from "../../domain/browserObservationSchemas.js";
2
2
  import { browserScenarioCaptureSchema } from "../../domain/browserScenarioCapture.js";
3
3
  import { parseEvidence } from "../../domain/evidence.js";
4
4
  import { pageScripts } from "./PageScriptCapture.js";
@@ -34,7 +34,8 @@ export const historicalCaptureFailure = (input, cause, phase, options) => {
34
34
  if (phase === "decoder" &&
35
35
  input.format === "har" &&
36
36
  cause.reason === "process" &&
37
- cause.snapshot?.signal === "SIGABRT" &&
37
+ (cause.snapshot?.signal === "SIGABRT" ||
38
+ (cause.snapshot?.signal === null && cause.snapshot.exitCode === 134)) &&
38
39
  /FATAL ERROR:[^\r\n]*heap out of memory/u.test(cause.snapshot.stderr.text))
39
40
  return captureMemoryFailure(input, "The HAR decoder exhausted its fixed V8 heap", cause);
40
41
  }
@@ -120,7 +121,10 @@ export const captureMemoryFailure = (input, reason, cause) => new AnalysisResour
120
121
  }
121
122
  : {}),
122
123
  ...(cause instanceof OwnedCommandFailure
123
- ? { observed_signal: cause.snapshot?.signal ?? null }
124
+ ? {
125
+ observed_exit_code: cause.snapshot?.exitCode ?? null,
126
+ observed_signal: cause.snapshot?.signal ?? null,
127
+ }
124
128
  : {}),
125
129
  }, {
126
130
  cause,
@@ -5,6 +5,7 @@ import { fileURLToPath } from "node:url";
5
5
  import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
6
6
  import { MITMPROXY_CAPTURE_PROVIDER_IDENTITY } from "./CaptureRelease.js";
7
7
  const OPERATION = "inspect_web_network_capture";
8
+ const MITMDUMP_REQUIREMENT = "Native capture decoding requires Linux and an absolute REA_MITMDUMP_COMMAND path to caller-supplied mitmdump 12.2.3; HAR needs no external engine.";
8
9
  /** Native mitmproxy decoding is offline and uses only an explicitly configured Linux tool. */
9
10
  export class MitmproxyCaptureAdapter {
10
11
  environment;
@@ -18,12 +19,13 @@ export class MitmproxyCaptureAdapter {
18
19
  if (process.platform !== "linux" ||
19
20
  command === undefined ||
20
21
  !isAbsolute(command))
21
- throw new AnalysisCapabilityUnavailableError("mitmproxy", OPERATION, "Native capture decoding requires Linux and an absolute REA_MITMDUMP_COMMAND path to caller-supplied mitmdump 12.2.3; HAR needs no external engine.");
22
+ throw new AnalysisCapabilityUnavailableError("mitmproxy", OPERATION, MITMDUMP_REQUIREMENT, { userMessage: MITMDUMP_REQUIREMENT });
22
23
  try {
23
24
  await access(command, constants.R_OK | constants.X_OK);
24
25
  }
25
26
  catch (cause) {
26
- throw new AnalysisCapabilityUnavailableError("mitmproxy", OPERATION, `Configured mitmdump executable is unavailable: ${command}.`, { cause });
27
+ const reason = `Configured mitmdump executable is unavailable: ${command}.`;
28
+ throw new AnalysisCapabilityUnavailableError("mitmproxy", OPERATION, reason, { cause, userMessage: reason });
27
29
  }
28
30
  return {
29
31
  command,
@@ -4,7 +4,6 @@ import { z } from "zod";
4
4
  import { PROMPT_CONTRACTS } from "./contracts/promptContracts.js";
5
5
  import { TOOL_CONTRACTS } from "./contracts/toolContracts.js";
6
6
  import { CLI_COMMAND_NAMES } from "./cliCommandNames.js";
7
- export { CLI_COMMAND_NAMES } from "./cliCommandNames.js";
8
7
  const sortedToolContracts = [...TOOL_CONTRACTS].sort((left, right) => left.name.localeCompare(right.name));
9
8
  const createToolCatalog = () => sortedToolContracts.map((contract) => ({
10
9
  name: contract.name,
@@ -0,0 +1,36 @@
1
+ import { z } from "incur";
2
+ import { inspectAnalysisViewValidated } from "../application/analysisView/AnalysisViewService.js";
3
+ import { CLI_COMMANDS } from "../cliCommandNames.js";
4
+ import { parseCliJsonInput } from "../cliJsonInput.js";
5
+ import { logCliCommand } from "../cliLogging.js";
6
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
7
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
8
+ import { jsonValueSchema } from "../domain/jsonValue.js";
9
+ import { inspectAnalysisViewInputSchema } from "../domain/analysisView/analysisView.js";
10
+ /** Project selected views of completed analysis Evidence through the CLI. */
11
+ export const registerAnalysisViewCommands = (cli, logger) => {
12
+ cli.command(CLI_COMMANDS.inspectAnalysisView, {
13
+ description: "Project a selected view of completed layout or JavaScript application Evidence JSON",
14
+ args: z.object({
15
+ inputJson: z.string().describe("Inline workflow JSON or JSON file path"),
16
+ }),
17
+ run: ({ args }) => logCliCommand(logger, CLI_COMMANDS.inspectAnalysisView, async () => {
18
+ const input = await parseCliJsonInput(args.inputJson, CLI_COMMANDS.inspectAnalysisView);
19
+ if (!input.ok)
20
+ return input.error;
21
+ const parsed = inspectAnalysisViewInputSchema.safeParse(input.value);
22
+ if (!parsed.success)
23
+ return {
24
+ error: "Application workflow failed",
25
+ ...projectAnalysisError(analysisInputErrorFromIssues(CLI_COMMANDS.inspectAnalysisView, parsed.error.issues, input.value)),
26
+ };
27
+ const result = inspectAnalysisViewValidated(parsed.data);
28
+ return result.ok
29
+ ? jsonValueSchema.parse(result.value)
30
+ : {
31
+ error: "Application workflow failed",
32
+ ...projectAnalysisError(result.error),
33
+ };
34
+ }),
35
+ });
36
+ };
@@ -1,14 +1,13 @@
1
1
  import { z } from "incur";
2
- import { runProviderAnalysis } from "../composition/directAnalysis.js";
3
2
  import { createArtifactExtractionDestination } from "../application/artifacts/ArtifactExtractionDestination.js";
4
3
  import { logCliCommand } from "../cliLogging.js";
5
4
  import { CLI_COMMANDS } from "../cliCommandNames.js";
6
- export const registerArtifactCommands = (cli, logger) => {
7
- registerInspectionCommand(cli, logger);
8
- registerExtractionCommand(cli, logger);
9
- registerInterfaceBuilderCommand(cli, logger);
10
- registerAssetCatalogCommand(cli, logger);
11
- registerDylibResolutionCommand(cli, logger);
5
+ export const registerArtifactCommands = (cli, logger, runProviderAnalysis) => {
6
+ registerInspectionCommand(cli, logger, runProviderAnalysis);
7
+ registerExtractionCommand(cli, logger, runProviderAnalysis);
8
+ registerInterfaceBuilderCommand(cli, logger, runProviderAnalysis);
9
+ registerAssetCatalogCommand(cli, logger, runProviderAnalysis);
10
+ registerDylibResolutionCommand(cli, logger, runProviderAnalysis);
12
11
  cli.command(CLI_COMMANDS.inspectKeyedArchive, {
13
12
  description: "Inspect a Foundation keyed archive as an object-reference graph",
14
13
  args: z.object({
@@ -42,7 +41,7 @@ export const registerArtifactCommands = (cli, logger) => {
42
41
  }, logger)),
43
42
  });
44
43
  };
45
- const registerDylibResolutionCommand = (cli, logger) => {
44
+ const registerDylibResolutionCommand = (cli, logger, runProviderAnalysis) => {
46
45
  cli.command(CLI_COMMANDS.traceDylibResolution, {
47
46
  description: "Trace dyld load-path resolution for a Mach-O or every executable in an app bundle",
48
47
  args: z.object({
@@ -66,7 +65,7 @@ const registerDylibResolutionCommand = (cli, logger) => {
66
65
  }, logger)),
67
66
  });
68
67
  };
69
- const registerAssetCatalogCommand = (cli, logger) => {
68
+ const registerAssetCatalogCommand = (cli, logger, runProviderAnalysis) => {
70
69
  cli.command(CLI_COMMANDS.inspectAssetCatalog, {
71
70
  description: "Inspect compiled Apple asset catalog metadata",
72
71
  args: z.object({ path: z.string().describe("Apple .app bundle path") }),
@@ -89,7 +88,7 @@ const registerAssetCatalogCommand = (cli, logger) => {
89
88
  run: ({ args, options }) => logCliCommand(logger, CLI_COMMANDS.inspectAssetCatalog, () => runProviderAnalysis(args.path, "inspect_asset_catalog", { offset: options.offset, limit: options.limit }, logger)),
90
89
  });
91
90
  };
92
- const registerInterfaceBuilderCommand = (cli, logger) => {
91
+ const registerInterfaceBuilderCommand = (cli, logger, runProviderAnalysis) => {
93
92
  cli.command(CLI_COMMANDS.decodeInterfaceBuilder, {
94
93
  description: "Decode compiled storyboard and nib archives from an app bundle",
95
94
  args: z.object({
@@ -130,7 +129,7 @@ const registerInterfaceBuilderCommand = (cli, logger) => {
130
129
  }, logger)),
131
130
  });
132
131
  };
133
- const registerExtractionCommand = (cli, logger) => {
132
+ const registerExtractionCommand = (cli, logger, runProviderAnalysis) => {
134
133
  cli.command(CLI_COMMANDS.extractArtifact, {
135
134
  description: "Extract all regular artifact contents safely",
136
135
  args: z.object({
@@ -142,7 +141,7 @@ const registerExtractionCommand = (cli, logger) => {
142
141
  }, logger)),
143
142
  });
144
143
  };
145
- const registerInspectionCommand = (cli, logger) => {
144
+ const registerInspectionCommand = (cli, logger, runProviderAnalysis) => {
146
145
  cli.command(CLI_COMMANDS.inspectArtifact, {
147
146
  description: "Inspect one artifact and return all available observations and next probes",
148
147
  args: z.object({
@@ -1,7 +1,7 @@
1
1
  import { registerCoreBinaryCommands } from "./coreBinaryCommands.js";
2
2
  import { registerCoreNativeCommands } from "./coreNativeCommands.js";
3
3
  /** Register core binary and native deep-analysis CLI commands. */
4
- export const registerCoreAnalysisCommands = (cli, logger, resultOutput) => {
5
- registerCoreBinaryCommands(cli, logger, resultOutput);
6
- registerCoreNativeCommands(cli, logger);
4
+ export const registerCoreAnalysisCommands = (cli, logger, runDirectAnalysis, resultOutput) => {
5
+ registerCoreBinaryCommands(cli, logger, runDirectAnalysis, resultOutput);
6
+ registerCoreNativeCommands(cli, logger, runDirectAnalysis);
7
7
  };
@@ -2,22 +2,22 @@ import { z } from "incur";
2
2
  import { stat } from "node:fs/promises";
3
3
  import { resolve } from "node:path";
4
4
  import { resolveCliAnalysisSelector } from "./analysisSelector.js";
5
- import { runDirectAnalysis } from "../composition/directAnalysis.js";
6
5
  import { CLI_COMMANDS } from "../cliCommandNames.js";
7
6
  import { logCliCommand } from "../cliLogging.js";
8
7
  import { directAnalysisOptions, formatSelectionOption, providerSelectionOption, } from "./options.js";
9
8
  import { runCliJavaScriptApplicationAnalysis } from "./javascriptApplicationAnalysis.js";
9
+ import { withCommandCancellation } from "./commandCancellation.js";
10
10
  /** Register provider-neutral binary overview and procedure CLI commands. */
11
- export const registerCoreBinaryCommands = (cli, logger, resultOutput) => {
12
- registerOverviewCommands(cli, logger, resultOutput);
13
- registerDecompileCommand(cli, logger);
14
- registerFunctionCommand(cli, logger);
15
- registerInstructionsCommand(cli, logger);
16
- registerSearchCommand(cli, logger);
17
- registerXrefsCommand(cli, logger);
18
- registerTraceCommand(cli, logger);
11
+ export const registerCoreBinaryCommands = (cli, logger, runDirectAnalysis, resultOutput) => {
12
+ registerOverviewCommands(cli, logger, runDirectAnalysis, resultOutput);
13
+ registerDecompileCommand(cli, logger, runDirectAnalysis);
14
+ registerFunctionCommand(cli, logger, runDirectAnalysis);
15
+ registerInstructionsCommand(cli, logger, runDirectAnalysis);
16
+ registerSearchCommand(cli, logger, runDirectAnalysis);
17
+ registerXrefsCommand(cli, logger, runDirectAnalysis);
18
+ registerTraceCommand(cli, logger, runDirectAnalysis);
19
19
  };
20
- const registerOverviewCommands = (cli, logger, resultOutput) => {
20
+ const registerOverviewCommands = (cli, logger, runDirectAnalysis, resultOutput) => {
21
21
  const overviewOptions = z.object({
22
22
  snapshot: z
23
23
  .string()
@@ -33,9 +33,17 @@ const registerOverviewCommands = (cli, logger, resultOutput) => {
33
33
  path: z.string().describe("App, program, or analysis database path"),
34
34
  }),
35
35
  options: overviewOptions,
36
- run: ({ args, options, format }) => logCliCommand(logger, "analyze", () => runRoutedOverview(args.path, options, logger, resultOutput === undefined
37
- ? undefined
38
- : { output: resultOutput, command: CLI_COMMANDS.analyze, format })),
36
+ run: async ({ args, options, format }) => {
37
+ const output = resultOutput === undefined
38
+ ? undefined
39
+ : { output: resultOutput, command: CLI_COMMANDS.analyze, format };
40
+ // Route JavaScript targets exactly like analyze-javascript-application,
41
+ // including typed cancellation; cancellation wraps logging so its exit
42
+ // code is not replaced by the logged failure status.
43
+ if (await routesToJavaScriptAnalysis(args.path, options))
44
+ return withCommandCancellation((signal) => logCliCommand(logger, "analyze", () => runCliJavaScriptApplicationAnalysis({ input_path: resolve(args.path) }, output, signal)));
45
+ return logCliCommand(logger, "analyze", () => runDirectAnalysis(args.path, "binary_overview", {}, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"])));
46
+ },
39
47
  });
40
48
  cli.command(CLI_COMMANDS.inspect, {
41
49
  description: "Inspect an app overview with evidence",
@@ -46,7 +54,7 @@ const registerOverviewCommands = (cli, logger, resultOutput) => {
46
54
  run: ({ args, options }) => logCliCommand(logger, "inspect", () => runDirectAnalysis(args.path, "binary_overview", {}, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
47
55
  });
48
56
  };
49
- const registerDecompileCommand = (cli, logger) => {
57
+ const registerDecompileCommand = (cli, logger, runDirectAnalysis) => {
50
58
  cli.command(CLI_COMMANDS.decompile, {
51
59
  description: "Read one part of an app as code",
52
60
  args: z.object({
@@ -76,14 +84,11 @@ const registerDecompileCommand = (cli, logger) => {
76
84
  }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
77
85
  });
78
86
  };
79
- const runRoutedOverview = async (path, options, logger, output) => {
80
- if (options.provider === undefined &&
81
- options.snapshot === undefined &&
82
- options["target-format"] === undefined &&
83
- (await isJavaScriptApplicationPath(path)))
84
- return runCliJavaScriptApplicationAnalysis({ input_path: resolve(path) }, output);
85
- return runDirectAnalysis(path, "binary_overview", {}, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]));
86
- };
87
+ /** Select static JavaScript analysis only when no binary-analysis option applies. */
88
+ const routesToJavaScriptAnalysis = async (path, options) => options.provider === undefined &&
89
+ options.snapshot === undefined &&
90
+ options["target-format"] === undefined &&
91
+ (await isJavaScriptApplicationPath(path));
87
92
  const isJavaScriptApplicationPath = async (path) => {
88
93
  const lower = path.toLowerCase();
89
94
  if (lower.endsWith(".asar"))
@@ -100,7 +105,7 @@ const isJavaScriptApplicationPath = async (path) => {
100
105
  return false;
101
106
  }
102
107
  };
103
- const registerXrefsCommand = (cli, logger) => {
108
+ const registerXrefsCommand = (cli, logger, runDirectAnalysis) => {
104
109
  cli.command(CLI_COMMANDS.xrefs, {
105
110
  description: "List bounded references to an analyzed address",
106
111
  args: z.object({
@@ -126,7 +131,7 @@ const registerXrefsCommand = (cli, logger) => {
126
131
  }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
127
132
  });
128
133
  };
129
- const registerTraceCommand = (cli, logger) => {
134
+ const registerTraceCommand = (cli, logger, runDirectAnalysis) => {
130
135
  cli.command(CLI_COMMANDS.trace, {
131
136
  description: "Trace a literal feature through analyzed references",
132
137
  args: z.object({
@@ -160,7 +165,7 @@ const registerTraceCommand = (cli, logger) => {
160
165
  }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
161
166
  });
162
167
  };
163
- const registerFunctionCommand = (cli, logger) => {
168
+ const registerFunctionCommand = (cli, logger, runDirectAnalysis) => {
164
169
  cli.command(CLI_COMMANDS.function, {
165
170
  description: "Analyze one complete function with evidence",
166
171
  args: z.object({
@@ -190,7 +195,7 @@ const registerFunctionCommand = (cli, logger) => {
190
195
  }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
191
196
  });
192
197
  };
193
- const registerInstructionsCommand = (cli, logger) => {
198
+ const registerInstructionsCommand = (cli, logger, runDirectAnalysis) => {
194
199
  cli.command(CLI_COMMANDS.instructions, {
195
200
  description: "Read every raw instruction without decompiling",
196
201
  args: z.object({
@@ -220,7 +225,7 @@ const registerInstructionsCommand = (cli, logger) => {
220
225
  }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
221
226
  });
222
227
  };
223
- const registerSearchCommand = (cli, logger) => {
228
+ const registerSearchCommand = (cli, logger, runDirectAnalysis) => {
224
229
  cli.command(CLI_COMMANDS.search, {
225
230
  description: "Search every analyzed string or procedure name",
226
231
  args: z.object({
@@ -1,11 +1,10 @@
1
1
  import { z } from "incur";
2
- import { runDirectAnalysis } from "../composition/directAnalysis.js";
3
2
  import { CLI_COMMANDS } from "../cliCommandNames.js";
4
3
  import { logCliCommand } from "../cliLogging.js";
5
4
  import { directAnalysisOptions, formatSelectionOption, providerSelectionOption, } from "./options.js";
6
5
  /** Register native load-image, memory, and annotation CLI commands. */
7
- export const registerCoreNativeCommands = (cli, logger) => {
8
- registerAnnotationCommand(cli, logger);
6
+ export const registerCoreNativeCommands = (cli, logger, runDirectAnalysis) => {
7
+ registerAnnotationCommand(cli, logger, runDirectAnalysis);
9
8
  cli.command(CLI_COMMANDS.inspectNativeLoadImage, {
10
9
  description: "Verify loaded native bytes, source mappings, relocations and entry",
11
10
  args: z.object({ path: z.string().describe("Local executable path") }),
@@ -160,11 +159,11 @@ export const registerCoreNativeCommands = (cli, logger) => {
160
159
  run: ({ args, options }) => logCliCommand(logger, command, () => runDirectAnalysis(args.path, operation, { address: args.address }, directAnalysisOptions(logger, undefined, options.provider, options["target-format"]))),
161
160
  });
162
161
  }
163
- registerNativeApiCommand(cli, logger);
164
- registerNativeUiActionCommand(cli, logger);
165
- registerNativeDispatchMetadataCommand(cli, logger);
162
+ registerNativeApiCommand(cli, logger, runDirectAnalysis);
163
+ registerNativeUiActionCommand(cli, logger, runDirectAnalysis);
164
+ registerNativeDispatchMetadataCommand(cli, logger, runDirectAnalysis);
166
165
  };
167
- const registerNativeDispatchMetadataCommand = (cli, logger) => {
166
+ const registerNativeDispatchMetadataCommand = (cli, logger, runDirectAnalysis) => {
168
167
  cli.command(CLI_COMMANDS.inspectNativeDispatchMetadata, {
169
168
  description: "Inspect typed Objective-C and Swift dispatch metadata",
170
169
  args: z.object({
@@ -190,7 +189,7 @@ const registerNativeDispatchMetadataCommand = (cli, logger) => {
190
189
  run: async ({ args, options }) => logCliCommand(logger, "inspect-native-dispatch-metadata", () => runDirectAnalysis(args.path, "inspect_native_dispatch_metadata", { max_records: options.maxRecords }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
191
190
  });
192
191
  };
193
- const registerNativeUiActionCommand = (cli, logger) => {
192
+ const registerNativeUiActionCommand = (cli, logger, runDirectAnalysis) => {
194
193
  cli.command(CLI_COMMANDS.traceNativeUiAction, {
195
194
  description: "Trace a compiled UI action selector to its native handler and direct callees",
196
195
  args: z.object({
@@ -238,7 +237,7 @@ const registerNativeUiActionCommand = (cli, logger) => {
238
237
  }, directAnalysisOptions(logger, undefined, options.provider, options["target-format"]))),
239
238
  });
240
239
  };
241
- const registerNativeApiCommand = (cli, logger) => {
240
+ const registerNativeApiCommand = (cli, logger, runDirectAnalysis) => {
242
241
  cli.command(CLI_COMMANDS.inspectNativeApi, {
243
242
  description: "Reconstruct one native function API boundary with evidence",
244
243
  args: z.object({
@@ -257,7 +256,7 @@ const registerNativeApiCommand = (cli, logger) => {
257
256
  run: ({ args, options }) => logCliCommand(logger, "inspect-native-api", () => runDirectAnalysis(args.path, "inspect_native_api", { procedure: args.address }, directAnalysisOptions(logger, options.snapshot, options.provider, options["target-format"]))),
258
257
  });
259
258
  };
260
- const registerAnnotationCommand = (cli, logger) => {
259
+ const registerAnnotationCommand = (cli, logger, runDirectAnalysis) => {
261
260
  cli.command(CLI_COMMANDS.annotateNativeFunction, {
262
261
  description: "Edit function annotations and return refreshed analysis",
263
262
  args: z.object({
@@ -14,13 +14,13 @@ import { electronPageInspectionOptions, javascriptApplicationOptions, } from "..
14
14
  import { runCliJavaScriptApplicationAnalysis } from "./javascriptApplicationAnalysis.js";
15
15
  import { withCommandCancellation } from "./commandCancellation.js";
16
16
  /** Register CLI equivalents of the Electron MCP tools. */
17
- export const registerElectronCommands = (cli, logger, resultOutput) => {
17
+ export const registerElectronCommands = (cli, logger, environment, resultOutput) => {
18
18
  registerElectronObservationCommands(cli, logger);
19
- registerElectronActiveCommand(cli, logger);
19
+ registerElectronActiveCommand(cli, logger, environment);
20
20
  registerJavaScriptApplicationCommand(cli, logger, resultOutput);
21
21
  registerJavaScriptRuntimeReconciliationCommand(cli, logger);
22
22
  };
23
- const registerElectronActiveCommand = (cli, logger) => {
23
+ const registerElectronActiveCommand = (cli, logger, environment) => {
24
24
  cli.command(CLI_COMMANDS.captureElectronScenario, {
25
25
  description: "Run one owned Electron scenario with cancellable actions",
26
26
  args: z.object({
@@ -40,7 +40,7 @@ const registerElectronActiveCommand = (cli, logger) => {
40
40
  if (!parsed.success)
41
41
  return inputError("capture_electron_scenario", parsed.error.issues, input.value);
42
42
  const { createElectronScenarioProvider } = await import("../composition/electronScenario.js");
43
- const result = await captureElectronScenario(createElectronScenarioProvider(), parsed.data, { signal });
43
+ const result = await captureElectronScenario(createElectronScenarioProvider(environment), parsed.data, { signal });
44
44
  return result.ok ? result.value : cliError(result.error);
45
45
  })),
46
46
  });
@@ -53,13 +53,13 @@ export const renderSetupProgress = (event) => {
53
53
  writeLine(`${symbol} ${event.label}${suffix}`);
54
54
  };
55
55
  /** Finish an interactive setup journey without exposing the full doctor catalog. */
56
- export const renderInteractiveSetupResult = (result) => {
56
+ export const renderInteractiveSetupResult = (result, environment = process.env) => {
57
57
  if (result.status === "ready") {
58
58
  const changedClients = Object.entries(result.clients)
59
59
  .filter(([, client]) => client.status === "configured")
60
60
  .map(([client]) => clientDisplayNames.get(client) ?? client);
61
61
  const readyClients = readyAgentClients(result, changedClients);
62
- renderReadyCapabilities(result, readyClients);
62
+ renderReadyCapabilities(result, readyClients, environment);
63
63
  outro(changedClients.length === 0
64
64
  ? "REA is ready for local app analysis."
65
65
  : `Restart ${changedClients.join(", ")} to load REA.`, promptStreams);
@@ -68,7 +68,7 @@ export const renderInteractiveSetupResult = (result) => {
68
68
  if (result.status === "planned" || result.status === "cancelled")
69
69
  return;
70
70
  writeLine(`! ${result.remediation ?? "Setup needs attention."}`);
71
- outro(`Run \`${cliInvocation()} doctor\` for the remaining checks.`, promptStreams);
71
+ outro(`Run \`${cliInvocation(environment)} doctor\` for the remaining checks.`, promptStreams);
72
72
  };
73
73
  const selectSetupActions = async (actions, accessible, context) => {
74
74
  const clientStates = context.clientStates.filter(({ client }) => client.format !== "unsupported");
@@ -167,8 +167,8 @@ const renderKeyboardHelp = (accessible) => {
167
167
  ? "│ Keys: Enter answer · Ctrl-C cancel"
168
168
  : "│ Keys: ↑/↓ navigate · Space toggle · Enter confirm · Ctrl-C cancel");
169
169
  };
170
- const cliInvocation = () => process.env.npm_command === "exec" ? "npx rea-agents" : "rea";
171
- const renderReadyCapabilities = (result, readyClients) => {
170
+ const cliInvocation = (environment) => environment.npm_command === "exec" ? "npx rea-agents" : "rea";
171
+ const renderReadyCapabilities = (result, readyClients, environment) => {
172
172
  writeLine("◆ What you can do now");
173
173
  const providers = readyProviders(result);
174
174
  if (providers.length > 0)
@@ -177,7 +177,7 @@ const renderReadyCapabilities = (result, readyClients) => {
177
177
  writeLine(`│ Agent access: ${humanList(readyClients)}`);
178
178
  if (result.doctor.identity?.skill.state === "aligned")
179
179
  writeLine("│ Guided reverse-engineering workflows: installed");
180
- writeLine(`│ CLI: ${cliInvocation()} ${providers.length > 0 ? "analyze /path/to/app" : "capabilities"}`);
180
+ writeLine(`│ CLI: ${cliInvocation(environment)} ${providers.length > 0 ? "analyze /path/to/app" : "capabilities"}`);
181
181
  const firstClient = readyClients[0];
182
182
  if (firstClient !== undefined)
183
183
  writeLine(`│ Try in ${firstClient}: "Explain how a feature works in /path/to/app and show the evidence."`);
@@ -2,22 +2,21 @@ import { z } from "incur";
2
2
  import { compareManagedMemberPaths } from "../application/managed/ManagedMemberComparisonService.js";
3
3
  import { verifyManagedNativeBoundariesEvidence } from "../application/managed/ManagedNativeVerificationService.js";
4
4
  import { importManagedReconstructionEvidence } from "../application/managed/ManagedReconstructionService.js";
5
- import { runProviderAnalysis } from "../composition/directAnalysis.js";
6
5
  import { parseCliJsonInput } from "../cliJsonInput.js";
7
6
  import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
8
7
  import { CLI_COMMANDS } from "../cliCommandNames.js";
9
8
  import { logCliCommand } from "../cliLogging.js";
10
9
  import { registerProjectManagedApplicationGraph } from "./managedProjectGraphCommand.js";
11
- export const registerManagedCommands = (cli, logger) => {
12
- registerInspectManagedArtifact(cli, logger);
13
- registerInspectManagedMembers(cli, logger);
14
- registerInspectManagedNativeBoundaries(cli, logger);
10
+ export const registerManagedCommands = (cli, logger, runProviderAnalysis) => {
11
+ registerInspectManagedArtifact(cli, logger, runProviderAnalysis);
12
+ registerInspectManagedMembers(cli, logger, runProviderAnalysis);
13
+ registerInspectManagedNativeBoundaries(cli, logger, runProviderAnalysis);
15
14
  registerCompareManagedMembers(cli, logger);
16
15
  registerImportManagedReconstruction(cli, logger);
17
16
  registerVerifyManagedNativeBoundaries(cli, logger);
18
17
  registerProjectManagedApplicationGraph(cli, logger);
19
18
  };
20
- const registerInspectManagedArtifact = (cli, logger) => {
19
+ const registerInspectManagedArtifact = (cli, logger, runProviderAnalysis) => {
21
20
  cli.command(CLI_COMMANDS.inspectManagedArtifact, {
22
21
  description: "Inspect PE/CLI identity without loading target code",
23
22
  args: z.object({
@@ -26,7 +25,7 @@ const registerInspectManagedArtifact = (cli, logger) => {
26
25
  run: ({ args }) => logCliCommand(logger, "inspect-managed-artifact", () => runProviderAnalysis(args.path, "inspect_managed_artifact", {}, logger)),
27
26
  });
28
27
  };
29
- const registerInspectManagedMembers = (cli, logger) => {
28
+ const registerInspectManagedMembers = (cli, logger, runProviderAnalysis) => {
30
29
  cli.command(CLI_COMMANDS.inspectManagedMembers, {
31
30
  description: "Inspect PE/CLI metadata members, signatures, and CIL anchors without loading target code",
32
31
  args: z.object({
@@ -35,7 +34,7 @@ const registerInspectManagedMembers = (cli, logger) => {
35
34
  run: ({ args }) => logCliCommand(logger, "inspect-managed-members", () => runProviderAnalysis(args.path, "inspect_managed_members", {}, logger)),
36
35
  });
37
36
  };
38
- const registerInspectManagedNativeBoundaries = (cli, logger) => {
37
+ const registerInspectManagedNativeBoundaries = (cli, logger, runProviderAnalysis) => {
39
38
  cli.command(CLI_COMMANDS.inspectManagedNativeBoundaries, {
40
39
  description: "Inspect PE/CLI PInvoke and native implementation boundary declarations without loading target code",
41
40
  args: z.object({
@@ -1,5 +1,4 @@
1
1
  import { z } from "incur";
2
- import { runProviderAnalysis } from "../composition/directAnalysis.js";
3
2
  import { CLI_COMMANDS } from "../cliCommandNames.js";
4
3
  import { parseCliJsonInput } from "../cliJsonInput.js";
5
4
  import { logCliCommand } from "../cliLogging.js";
@@ -9,7 +8,7 @@ import { jsonValueSchema } from "../domain/jsonValue.js";
9
8
  import { nativeCallObservationInputSchema } from "../domain/native/nativeCallObservation.js";
10
9
  const OPERATION = "observe_native_calls";
11
10
  /** `observe-native-calls <path> <input-json>`: the MCP input object as JSON. */
12
- export const registerNativeCallCommands = (cli, logger) => {
11
+ export const registerNativeCallCommands = (cli, logger, runProviderAnalysis) => {
13
12
  cli.command(CLI_COMMANDS.observeNativeCalls, {
14
13
  description: "Launch a Mach-O under LLDB and record entries into selected functions or Objective-C methods",
15
14
  args: z.object({