rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -13,12 +13,28 @@ export class JadxSession {
13
13
  #client = new Client({ name: "rea-android-adapter", version: "1" });
14
14
  #loaded;
15
15
  #connected = false;
16
+ #partialContext;
17
+ #observedCalls = [];
18
+ #serverName = null;
19
+ #serverVersion = null;
20
+ #engineVersion = null;
16
21
  constructor(options, launcher) {
17
22
  this.transport = new JadxMcpTransport(options, launcher);
18
23
  }
19
24
  /** Analyze one admitted immutable APK, checking producer identity and selectors. */
20
25
  async execute(context) {
21
26
  const { request, target, snapshot, jarHash, signal } = context;
27
+ this.#partialContext = {
28
+ operation: request.operation,
29
+ selectedPath: request.input.path,
30
+ target,
31
+ jarHash,
32
+ bridgeHash: context.bridgeHash,
33
+ };
34
+ this.#observedCalls = [];
35
+ this.#serverName = null;
36
+ this.#serverVersion = null;
37
+ this.#engineVersion = null;
22
38
  const abort = () => {
23
39
  void this.transport.close().catch(() => undefined);
24
40
  };
@@ -26,17 +42,19 @@ export class JadxSession {
26
42
  try {
27
43
  signal.throwIfAborted();
28
44
  this.transport.beginOperation();
29
- const raw = [];
30
45
  if (!this.#connected) {
31
46
  await this.#client.connect(this.transport, { timeout: 30_000 });
32
47
  this.#connected = true;
33
48
  }
34
49
  const server = this.#client.getServerVersion();
50
+ this.#serverName = server?.name ?? null;
51
+ this.#serverVersion = server?.version ?? null;
35
52
  if (server?.name !== JADX_BRIDGE_IDENTITY.name ||
36
53
  server.version !== JADX_BRIDGE_IDENTITY.version)
37
54
  throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected ${JADX_BRIDGE_IDENTITY.name} ${JADX_BRIDGE_IDENTITY.version}; server reported ${server?.name ?? "unknown"} ${server?.version ?? "unknown"}.`);
38
- const tools = this.#tools(request, target, signal, raw);
55
+ const tools = this.#tools(request, target, signal);
39
56
  const runtime = jadxRuntimeSchema.parse(await tools.json("rea_jvm_status", {}));
57
+ this.#engineVersion = runtime.engine_reported_version;
40
58
  if (runtime.engine_reported_version !== JADX_RELEASE.version)
41
59
  throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Expected engine ${JADX_RELEASE.version}; JAR reported ${runtime.engine_reported_version}.`);
42
60
  const loaded = this.#loaded ??
@@ -63,7 +81,7 @@ export class JadxSession {
63
81
  bridge_sha256: context.bridgeHash,
64
82
  jar_sha256: jarHash,
65
83
  loaded,
66
- calls: raw,
84
+ calls: this.#observedCalls,
67
85
  },
68
86
  subject: target,
69
87
  limitations: JADX_LIMITATIONS,
@@ -76,6 +94,32 @@ export class JadxSession {
76
94
  signal.removeEventListener("abort", abort);
77
95
  }
78
96
  }
97
+ /** Facts and upstream replies retained if a later request step fails. */
98
+ partialObservation() {
99
+ const context = this.#partialContext;
100
+ if (context === undefined)
101
+ return undefined;
102
+ return {
103
+ provider_id: "jadx",
104
+ operation: context.operation,
105
+ target: {
106
+ selected_path: context.selectedPath,
107
+ path: context.target.path,
108
+ sha256: context.target.sha256,
109
+ format: "apk",
110
+ },
111
+ provider_facts: {
112
+ jar_sha256: context.jarHash,
113
+ bridge_sha256: context.bridgeHash,
114
+ bridge_name: JADX_BRIDGE_IDENTITY.name,
115
+ bridge_version: JADX_BRIDGE_IDENTITY.version,
116
+ server_name: this.#serverName,
117
+ server_version: this.#serverVersion,
118
+ engine_version: this.#engineVersion,
119
+ },
120
+ calls: this.#observedCalls,
121
+ };
122
+ }
79
123
  /** Whether the selected Java runtime established the REA bridge protocol. */
80
124
  initialized() {
81
125
  return this.#connected;
@@ -89,16 +133,14 @@ export class JadxSession {
89
133
  await this.transport.close();
90
134
  }
91
135
  }
92
- #tools(request, target, signal, raw) {
136
+ #tools(request, target, signal) {
93
137
  const call = async (name, input) => {
94
138
  signal.throwIfAborted();
95
139
  const response = await this.#client.callTool({ name, arguments: input }, { timeout: 120_000, signal });
140
+ const observedResponse = jsonValueSchema.parse(response);
141
+ const call = { operation: name, input, response: observedResponse };
142
+ this.#observedCalls.push(call);
96
143
  const envelope = parseJadxEnvelope(response, request.operation);
97
- raw.push({
98
- operation: name,
99
- input,
100
- response: jsonValueSchema.parse(response),
101
- });
102
144
  if (envelope.failed) {
103
145
  if (envelope.text.startsWith("{")) {
104
146
  const failure = jadxInputFailureSchema.safeParse(parseJadxJson(envelope.text, request.operation));
@@ -1,8 +1,10 @@
1
1
  import { constants } from "node:fs";
2
2
  import { createHash } from "node:crypto";
3
- import { access, open, realpath, stat, } from "node:fs/promises";
3
+ import { access, lstat, realpath, stat, } from "node:fs/promises";
4
4
  import { extname, isAbsolute, resolve } from "node:path";
5
5
  import { BinaryTargetError } from "../domain/configurationErrors.js";
6
+ import { openRegularFile, sameRegularFileState, } from "../filesystem/RegularFile.js";
7
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
6
8
  import { err, ok } from "../domain/result.js";
7
9
  import { resolveAppBundleExecutable, } from "./AppBundleExecutable.js";
8
10
  import { validateDosComLength, } from "../domain/dosCom.js";
@@ -14,30 +16,41 @@ import { parseExecutableHeader, parsePeRecord, } from "../domain/binaryTarget.js
14
16
  * FAT Mach-O inputs select only a host-compatible architecture so setup remains
15
17
  * non-interactive; unsupported or ambiguous inputs are returned as typed errors.
16
18
  */
17
- export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitecture = process.arch, targetKind, formatHint) => {
19
+ export const parseBinaryTarget = async (input, options = {}) => {
20
+ const cwd = options.cwd ?? process.cwd();
21
+ const hostArchitecture = options.hostArchitecture ?? process.arch;
22
+ const { targetKind, formatHint, signal } = options;
18
23
  const candidate = isAbsolute(input) ? input : resolve(cwd, input);
19
24
  try {
25
+ throwIfTargetResolutionCancelled(signal);
20
26
  await access(candidate, constants.R_OK);
27
+ throwIfTargetResolutionCancelled(signal);
21
28
  const canonical = await realpath(candidate);
29
+ throwIfTargetResolutionCancelled(signal);
22
30
  const resolved = await resolveAppBundle(canonical);
31
+ throwIfTargetResolutionCancelled(signal);
23
32
  if (!resolved.ok)
24
33
  return err(resolved.error);
25
34
  const { executable: path, infoPlist } = resolved.value;
26
35
  const bundle = infoPlist === undefined ? {} : { bundleInfoPlist: infoPlist };
27
- const handle = await open(path, "r");
36
+ const handle = await openRegularFile(path, {
37
+ symlinks: "reject",
38
+ signal,
39
+ });
28
40
  try {
29
- if (!(await handle.stat()).isFile())
30
- return err(new BinaryTargetError(path, "target is not a regular file"));
41
+ throwIfTargetResolutionCancelled(signal);
42
+ const metadata = await handle.stat();
43
+ throwIfTargetResolutionCancelled(signal);
31
44
  if (formatHint === "dos-com") {
32
45
  if (targetKind !== undefined && targetKind !== "executable")
33
46
  return err(new BinaryTargetError(path, "DOS COM format requires an executable target kind"));
34
- const length = validateDosComLength((await handle.stat()).size);
47
+ const length = validateDosComLength(metadata.size);
35
48
  if (!length.ok)
36
49
  return err(new BinaryTargetError(path, length.error));
37
50
  return ok({
38
51
  path,
39
52
  sourcePath: canonical,
40
- sha256: await sha256Handle(handle),
53
+ sha256: await sha256Handle(handle, path, metadata, signal),
41
54
  kind: "executable",
42
55
  format: "dos-com",
43
56
  architecture: "x86",
@@ -49,29 +62,29 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
49
62
  return ok({
50
63
  path,
51
64
  sourcePath: process.platform === "win32" ? candidate : canonical,
52
- sha256: await sha256Handle(handle),
65
+ sha256: await sha256Handle(handle, path, metadata, signal),
53
66
  kind: "database",
54
67
  format: "analysis-database",
55
68
  });
56
- const artifactFormat = await detectArtifactFormat(path, handle);
69
+ const artifactFormat = await detectArtifactFormat(path, handle, signal);
57
70
  if (artifactFormat !== undefined) {
58
71
  const identity = {
59
72
  path,
60
73
  sourcePath: process.platform === "win32" ? candidate : canonical,
61
- sha256: await sha256Handle(handle),
74
+ sha256: await sha256Handle(handle, path, metadata, signal),
62
75
  };
63
76
  return isArchiveFormat(artifactFormat)
64
77
  ? ok({ ...identity, kind: "archive", format: artifactFormat })
65
78
  : ok({ ...identity, kind: "artifact", format: artifactFormat });
66
79
  }
67
- const detected = await readExecutableMetadata(handle, hostArchitecture);
80
+ const detected = await readExecutableMetadata(handle, hostArchitecture, signal);
68
81
  if (!detected.ok)
69
82
  return err(new BinaryTargetError(path, detected.error));
70
83
  return ok({
71
84
  path,
72
85
  sourcePath: process.platform === "win32" ? candidate : canonical,
73
86
  ...bundle,
74
- sha256: await sha256Handle(handle),
87
+ sha256: await sha256Handle(handle, path, metadata, signal),
75
88
  kind: "executable",
76
89
  ...detected.value,
77
90
  });
@@ -81,6 +94,10 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
81
94
  }
82
95
  }
83
96
  catch (cause) {
97
+ if (cause instanceof AnalysisCancelledError)
98
+ return err(cause);
99
+ if (cause instanceof BinaryTargetError)
100
+ return err(cause);
84
101
  if (!(cause instanceof Error))
85
102
  throw cause;
86
103
  const code = filesystemErrorCode(cause);
@@ -103,14 +120,24 @@ const targetFailureReason = (code, detail) => {
103
120
  return `permission denied while reading target: ${detail}`;
104
121
  case "EISDIR":
105
122
  return `target is a directory, not a readable file: ${detail}`;
123
+ case "ENOTFILE":
124
+ return "target is not a regular file";
125
+ case "ELOOP":
126
+ return `target changed while being opened: ${detail}`;
106
127
  default:
107
128
  return `target could not be read (${code}): ${detail}`;
108
129
  }
109
130
  };
110
- const detectArtifactFormat = async (path, handle) => {
131
+ const throwIfTargetResolutionCancelled = (signal) => {
132
+ if (signal?.aborted === true)
133
+ throw new AnalysisCancelledError("resolve_binary_target");
134
+ };
135
+ const detectArtifactFormat = async (path, handle, signal) => {
136
+ throwIfTargetResolutionCancelled(signal);
111
137
  const lower = path.toLowerCase();
112
138
  const magic = Buffer.alloc(8);
113
139
  const observed = await handle.read(magic, 0, magic.length, 0);
140
+ throwIfTargetResolutionCancelled(signal);
114
141
  if (hasZipSignature(magic.subarray(0, observed.bytesRead))) {
115
142
  return zipPackageFormatForPath(lower) ?? "zip";
116
143
  }
@@ -122,10 +149,13 @@ const detectArtifactFormat = async (path, handle) => {
122
149
  magic.subarray(0, 4).toString("ascii") === "xar!")
123
150
  return "pkg";
124
151
  if (lower.endsWith(".dmg")) {
152
+ throwIfTargetResolutionCancelled(signal);
125
153
  const size = (await handle.stat()).size;
154
+ throwIfTargetResolutionCancelled(signal);
126
155
  if (size >= 512) {
127
156
  const trailer = Buffer.alloc(4);
128
157
  const read = await handle.read(trailer, 0, trailer.length, size - 512);
158
+ throwIfTargetResolutionCancelled(signal);
129
159
  if (read.bytesRead === 4 && trailer.toString("ascii") === "koly")
130
160
  return "dmg";
131
161
  }
@@ -142,17 +172,25 @@ const namedArtifactFormat = (lowerPath) => {
142
172
  return /\.(?:m?js|cjs)$/u.test(lowerPath) ? "javascript" : undefined;
143
173
  };
144
174
  const isArchiveFormat = (format) => ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(format);
145
- const sha256Handle = async (handle) => {
175
+ const sha256Handle = async (handle, path, initial, signal) => {
146
176
  const hash = createHash("sha256");
147
177
  const chunk = Buffer.allocUnsafe(64 * 1024);
148
178
  let position = 0;
149
179
  while (true) {
180
+ throwIfTargetResolutionCancelled(signal);
150
181
  const observed = await handle.read(chunk, 0, chunk.length, position);
182
+ throwIfTargetResolutionCancelled(signal);
151
183
  if (observed.bytesRead === 0)
152
184
  break;
153
185
  hash.update(chunk.subarray(0, observed.bytesRead));
154
186
  position += observed.bytesRead;
155
187
  }
188
+ throwIfTargetResolutionCancelled(signal);
189
+ const [opened, currentPath] = await Promise.all([handle.stat(), lstat(path)]);
190
+ if (!sameRegularFileState(initial, opened) ||
191
+ !sameRegularFileState(initial, currentPath) ||
192
+ position !== initial.size)
193
+ throw new BinaryTargetError(path, "target changed while being read");
156
194
  return hash.digest("hex");
157
195
  };
158
196
  const resolveAppBundle = async (path) => {
@@ -165,16 +203,22 @@ const resolveAppBundle = async (path) => {
165
203
  }));
166
204
  return resolveAppBundleExecutable(path);
167
205
  };
168
- const readExecutableMetadata = async (handle, hostArchitecture) => {
206
+ const readExecutableMetadata = async (handle, hostArchitecture, signal) => {
207
+ throwIfTargetResolutionCancelled(signal);
169
208
  const prefix = Buffer.alloc(4096);
170
209
  const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
210
+ throwIfTargetResolutionCancelled(signal);
171
211
  const bytes = prefix.subarray(0, prefixRead.bytesRead);
212
+ // Header commitments such as Mach-O load commands and FAT slices are
213
+ // checked against the whole file, not the probed prefix.
214
+ const fileSize = (await handle.stat()).size;
215
+ throwIfTargetResolutionCancelled(signal);
172
216
  if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
173
217
  const offset = mzWindowsHeaderOffset(bytes);
174
218
  if (offset !== null) {
175
219
  if (offset < 64)
176
220
  return err("invalid Windows new-header offset in MZ image");
177
- return readPeMetadata(handle, offset);
221
+ return readPeMetadata(handle, offset, signal);
178
222
  }
179
223
  // MZ relocation records may extend past the initial probe; their format
180
224
  // bounds are at most 65535 records inside a 65535-paragraph header.
@@ -182,12 +226,12 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
182
226
  ? bytes.readUInt16LE(24) + bytes.readUInt16LE(6) * 4
183
227
  : 0;
184
228
  const headerBytes = bytes.length >= 28 ? bytes.readUInt16LE(8) * 16 : 0;
185
- const fileSize = (await handle.stat()).size;
186
229
  if (tableEnd > bytes.length &&
187
230
  tableEnd <= headerBytes &&
188
231
  tableEnd <= fileSize) {
189
232
  const table = Buffer.alloc(tableEnd);
190
233
  const observed = await handle.read(table, 0, table.length, 0);
234
+ throwIfTargetResolutionCancelled(signal);
191
235
  return parseExecutableHeader(table.subarray(0, observed.bytesRead), hostArchitecture, fileSize);
192
236
  }
193
237
  return parseExecutableHeader(bytes, hostArchitecture, fileSize);
@@ -201,15 +245,18 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
201
245
  if (count <= 128 && required > bytes.length) {
202
246
  const header = Buffer.alloc(required);
203
247
  const headerRead = await handle.read(header, 0, header.length, 0);
204
- return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture);
248
+ throwIfTargetResolutionCancelled(signal);
249
+ return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture, fileSize);
205
250
  }
206
251
  }
207
252
  }
208
- return parseExecutableHeader(bytes, hostArchitecture);
253
+ return parseExecutableHeader(bytes, hostArchitecture, fileSize);
209
254
  };
210
- const readPeMetadata = async (handle, offset) => {
255
+ const readPeMetadata = async (handle, offset, signal) => {
256
+ throwIfTargetResolutionCancelled(signal);
211
257
  const fileHeader = Buffer.alloc(24);
212
258
  const fileHeaderRead = await handle.read(fileHeader, 0, fileHeader.length, offset);
259
+ throwIfTargetResolutionCancelled(signal);
213
260
  if (fileHeaderRead.bytesRead !== fileHeader.length)
214
261
  return err("invalid or truncated PE header");
215
262
  const signature = fileHeader.toString("ascii", 0, 2);
@@ -220,6 +267,7 @@ const readPeMetadata = async (handle, offset) => {
220
267
  return err("invalid PE optional header size");
221
268
  const record = Buffer.alloc(24 + optionalHeaderSize);
222
269
  const recordRead = await handle.read(record, 0, record.length, offset);
270
+ throwIfTargetResolutionCancelled(signal);
223
271
  return recordRead.bytesRead === record.length
224
272
  ? parsePeRecord(record)
225
273
  : err("invalid or truncated PE header");
@@ -27,21 +27,16 @@ export const createBrowserEvidence = (operation, input, result, provider) => cre
27
27
  });
28
28
  const browserParameters = (input, result) => {
29
29
  if (!("cdp_endpoint" in input)) {
30
- if ("before_scenario" in input &&
31
- input.before_scenario !== undefined &&
32
- input.after_scenario !== undefined)
30
+ if ("before_scenario" in input)
33
31
  return {
34
32
  comparison_kind: "browser_scenario",
35
33
  before_browser: input.before_scenario.browser,
36
34
  after_browser: input.after_scenario.browser,
37
35
  before_start_origin: input.before_scenario.scenario.start_origin,
38
36
  after_start_origin: input.after_scenario.scenario.start_origin,
39
- normalization_sha256: commitBrowserScenarioNormalization(input.normalization ?? { rules: [] }).sha256,
37
+ normalization_sha256: commitBrowserScenarioNormalization(input.normalization).sha256,
40
38
  };
41
- if (input.before !== undefined &&
42
- input.after !== undefined &&
43
- "inspection" in input.before &&
44
- "inspection" in input.after)
39
+ if ("inspection" in input.before && "inspection" in input.after)
45
40
  return {
46
41
  before_target_id: input.before.inspection.target.target_id,
47
42
  before_capture_ended_at: input.before.inspection.capture_window.ended_at,
@@ -1,25 +1,9 @@
1
- import { canonicalDigest } from "../domain/comparisonSemantics.js";
2
- import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
1
+ import { digestCanonicalValue } from "../domain/canonicalDigest.js";
3
2
  import { createEvidence, } from "../domain/evidence.js";
4
- import { jsonValueSchema } from "../domain/jsonValue.js";
3
+ import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
5
4
  const browserScenarioParameters = (scenario) => ({
6
- scenario_sha256: canonicalDigest(scenario, "Browser scenario"),
7
- browser_mode: scenario.browser.mode,
8
- ...(scenario.browser.mode === "launch"
9
- ? { browser_headless: scenario.browser.headless }
10
- : {}),
11
- start_url: sanitizeBrowserUrl(scenario.start_url.url),
12
- environment: scenario.environment,
13
- actions: scenario.actions.map(({ step_id, action }) => ({
14
- step_id,
15
- action,
16
- })),
17
- action_timeouts_ms: scenario.actions.map((item) => "timeout_ms" in item ? (item.timeout_ms ?? null) : null),
18
- secret_declarations: scenario.secrets.map(({ secret_id, environment_variable }) => ({
19
- secret_id,
20
- environment_variable,
21
- })),
22
- capture: scenario.capture,
5
+ ...jsonObjectSchema.parse(scenario),
6
+ scenario_sha256: digestCanonicalValue(scenario, "Browser scenario"),
23
7
  });
24
8
  /** Create Evidence without retaining resolved scenario secret values. */
25
9
  export const createBrowserScenarioEvidence = (scenario, capture, provider) => createEvidence(undefined, provider, {
@@ -37,6 +37,21 @@ const ENHANCED_REQUIREMENTS = {
37
37
  "resolve_containing_procedure",
38
38
  ],
39
39
  };
40
+ /** Contract kinds whose operations run on the active session target. */
41
+ const ACTIVE_TARGET_KINDS = new Set([
42
+ "official-proxy",
43
+ "enhanced",
44
+ "native-provider",
45
+ "artifact-provider",
46
+ ]);
47
+ /** Native contracts defined only for an active Mach-O executable. */
48
+ const MACHO_TARGET_OPERATIONS = new Set([
49
+ "inspect_macho",
50
+ "list_architectures",
51
+ "observe_native_calls",
52
+ "observe_native_ui",
53
+ "capture_native_ui_scenario",
54
+ ]);
40
55
  const NAVIGATION_CONTEXT_MODES = [
41
56
  {
42
57
  name: "current_selection",
@@ -61,6 +76,7 @@ export const buildCapabilityInventory = (sessionStatus, policy, clientFeatures =
61
76
  kind: contract.kind,
62
77
  targetOpen: status.open,
63
78
  targetKind: status.kind,
79
+ targetFormat: status.format,
64
80
  descriptors,
65
81
  policy,
66
82
  });
@@ -125,6 +141,9 @@ const availabilityFor = (context) => {
125
141
  const workflowAvailability = workflowAvailabilityFor(context);
126
142
  if (workflowAvailability !== null)
127
143
  return workflowAvailability;
144
+ const hostDecision = hostAvailability(context);
145
+ if (hostDecision !== null)
146
+ return hostDecision;
128
147
  const targetDecision = targetAvailability(context);
129
148
  if (targetDecision !== null)
130
149
  return targetDecision;
@@ -226,7 +245,7 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
226
245
  ? "unsupported_host"
227
246
  : "provider_missing",
228
247
  remediation: policy.androidAnalysisAvailability?.reason ??
229
- "Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux or macOS.",
248
+ "Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux, macOS, or Windows x64 with its matching bundled native controls.",
230
249
  };
231
250
  const browser = browserProviderAvailability(name, kind, policy);
232
251
  if (browser !== null)
@@ -286,8 +305,22 @@ const browserProviderAvailability = (name, kind, policy) => {
286
305
  remediation: "Start REA with its browser observation provider available.",
287
306
  };
288
307
  };
289
- const targetAvailability = ({ kind, targetKind, targetOpen, }) => {
290
- if (!targetOpen && (kind === "official-proxy" || kind === "enhanced"))
308
+ /**
309
+ * Opening another target cannot make an operation run on an unsupported host.
310
+ * Composed operations are decided by their requirements, which another
311
+ * provider may satisfy.
312
+ */
313
+ const hostAvailability = ({ descriptors, kind, name, }) => {
314
+ if (kind === "enhanced")
315
+ return null;
316
+ const descriptor = descriptors.get(name);
317
+ return descriptor?.available === false &&
318
+ descriptor.availability_code === "unsupported_host"
319
+ ? { reason: "unsupported_host", remediation: descriptor.reason }
320
+ : null;
321
+ };
322
+ const targetAvailability = ({ name, kind, targetKind, targetFormat, targetOpen, }) => {
323
+ if (!targetOpen && ACTIVE_TARGET_KINDS.has(kind))
291
324
  return {
292
325
  reason: "target_required",
293
326
  remediation: "Call open_binary with a supported local target.",
@@ -300,6 +333,13 @@ const targetAvailability = ({ kind, targetKind, targetOpen, }) => {
300
333
  reason: "target_unsupported",
301
334
  remediation: "Inventory or extract a native executable, then call open_binary on that executable.",
302
335
  };
336
+ if (targetOpen &&
337
+ MACHO_TARGET_OPERATIONS.has(name) &&
338
+ (targetKind !== "executable" || targetFormat !== "mach-o"))
339
+ return {
340
+ reason: "target_unsupported",
341
+ remediation: "Call open_binary with a Mach-O executable or an app bundle whose main executable is Mach-O.",
342
+ };
303
343
  return null;
304
344
  };
305
345
  const providerAvailability = ({ descriptors, kind, name, }) => {
@@ -316,12 +356,6 @@ const providerAvailability = ({ descriptors, kind, name, }) => {
316
356
  reason: "provider_missing",
317
357
  remediation: "Install or configure a provider that declares this operation.",
318
358
  };
319
- if (!descriptor.available &&
320
- descriptor.availability_code === "unsupported_host")
321
- return {
322
- reason: "unsupported_host",
323
- remediation: descriptor.reason,
324
- };
325
359
  return descriptor.available
326
360
  ? { reason: "available", remediation: null }
327
361
  : {