rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -6,10 +6,11 @@ import { AnalysisError } from "../domain/analysisErrorBase.js";
6
6
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, AnalysisInputError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
7
7
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
8
8
  import { ProviderCleanupError } from "../domain/providerCleanupError.js";
9
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
9
10
  import { err, ok } from "../domain/result.js";
10
11
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
11
12
  import { snapshotAndroidEngine, hashAndroidFile, snapshotAndroidTarget, } from "./AndroidTargetSnapshot.js";
12
- import { resolveJadxConfiguration } from "./JadxConfiguration.js";
13
+ import { inspectJadxAvailability, resolveJadxConfiguration, } from "./JadxConfiguration.js";
13
14
  import { JadxSession } from "./JadxSession.js";
14
15
  const OPERATION_TIMEOUT_MS = 120_000;
15
16
  const BRIDGE_SOURCE = fileURLToPath(new URL("../../bridge/android/ReaJadxBridge.java", import.meta.url));
@@ -38,6 +39,19 @@ const executionError = (context) => {
38
39
  });
39
40
  if (cause instanceof z.ZodError)
40
41
  return new AnalysisOutputError(request.operation, "JADX response violated the pinned upstream protocol", { cause });
42
+ if (session !== undefined && !session.initialized()) {
43
+ const stderr = session.transport.diagnostics();
44
+ const reason = `Java could not start REA's Android bridge using ${session.transport.options.command}: ${cause instanceof Error ? cause.message : String(cause)}.${stderr.length === 0 ? "" : ` Java diagnostics: ${stderr}`} Select a full JDK including jdk.compiler via JAVA_HOME, or a working java on PATH; verify it with java --list-modules. A JRE cannot compile REA's source bridge. If the JDK works, verify the REA bridge and configured JADX JAR installation.`;
45
+ return new AnalysisCapabilityUnavailableError("jadx", request.operation, reason, {
46
+ cause,
47
+ userMessage: reason,
48
+ capturedOutput: {
49
+ stdout: "",
50
+ stderr,
51
+ truncated: session.transport.diagnosticsTruncated(),
52
+ },
53
+ });
54
+ }
41
55
  return new ProviderAdapterError("jadx", request.operation, {
42
56
  cause,
43
57
  diagnostics: {
@@ -46,14 +60,14 @@ const executionError = (context) => {
46
60
  },
47
61
  });
48
62
  };
49
- const cleanup = async (session, root, previous) => {
63
+ const cleanup = async (resources) => {
64
+ const { session, root, previousError } = resources;
50
65
  const diagnostics = {
51
- previous_error: previous.ok
52
- ? null
53
- : { tag: previous.error._tag, message: previous.error.message },
66
+ previous_error: previousError === undefined ? null : projectAnalysisError(previousError),
54
67
  };
55
68
  try {
56
69
  await session?.close();
70
+ resources.session = undefined;
57
71
  }
58
72
  catch (cause) {
59
73
  // Retain an uncertain workspace until the caller can resolve process ownership.
@@ -66,33 +80,38 @@ const cleanup = async (session, root, previous) => {
66
80
  provider_cleanup: cause instanceof ProviderCleanupError
67
81
  ? (cause.diagnostics ?? null)
68
82
  : null,
69
- }, { cause }));
83
+ }, { cause: previousError ?? cause }));
70
84
  }
71
85
  try {
72
86
  await root?.close();
87
+ resources.root = undefined;
73
88
  }
74
89
  catch (cause) {
75
90
  return err(new ProviderCleanupError("jadx", [root?.path ?? "unknown"], {
76
91
  ...diagnostics,
77
92
  reason: cause instanceof Error ? cause.message : String(cause),
78
- }, { cause }));
93
+ }, { cause: previousError ?? cause }));
79
94
  }
80
- return previous;
95
+ return ok(undefined);
81
96
  };
82
97
  /** One serialized, immutable APK session per REA instance, retired on idle or shutdown. */
83
98
  export class JadxProvider {
84
99
  environment;
85
100
  launcher;
86
101
  #tail = Promise.resolve();
87
- #cleanupFailure;
102
+ #pendingCleanup;
88
103
  #retained;
89
104
  #idle;
90
105
  #shutdown = new AbortController();
91
106
  #closePromise;
92
- constructor(environment = process.env, launcher) {
107
+ constructor(environment, launcher) {
93
108
  this.environment = environment;
94
109
  this.launcher = launcher;
95
110
  }
111
+ /** Report actual local prerequisites without starting JADX or opening a target. */
112
+ inspectAvailability(signal) {
113
+ return inspectJadxAvailability(this.environment, signal);
114
+ }
96
115
  /** Serialize expensive work and bind both raw and normalized results to the APK. */
97
116
  async execute(target, request, options) {
98
117
  if (this.#shutdown.signal.aborted)
@@ -115,12 +134,13 @@ export class JadxProvider {
115
134
  try {
116
135
  if (signal.aborted)
117
136
  return err(new AnalysisCancelledError(request.operation));
118
- if (this.#cleanupFailure !== undefined)
119
- return err(this.#cleanupFailure);
120
137
  clearTimeout(this.#idle);
138
+ if (this.#pendingCleanup !== undefined) {
139
+ const retired = await this.#retire();
140
+ if (!retired.ok)
141
+ return retired;
142
+ }
121
143
  const outcome = await this.#execute(target, request, { signal });
122
- if (!outcome.ok && outcome.error.cleanupIncomplete)
123
- this.#cleanupFailure = outcome.error;
124
144
  if (outcome.ok)
125
145
  this.#scheduleIdle();
126
146
  return outcome;
@@ -133,24 +153,39 @@ export class JadxProvider {
133
153
  close() {
134
154
  this.#shutdown.abort();
135
155
  clearTimeout(this.#idle);
136
- this.#closePromise ??= this.#tail.then(() => this.#retire());
156
+ this.#closePromise ??= this.#tail
157
+ .then(async () => {
158
+ const retired = await this.#retire();
159
+ if (!retired.ok)
160
+ throw retired.error;
161
+ })
162
+ .catch((cause) => {
163
+ this.#closePromise = undefined;
164
+ throw cause;
165
+ });
137
166
  return this.#closePromise;
138
167
  }
139
168
  async #retire() {
140
- if (this.#cleanupFailure !== undefined)
141
- throw this.#cleanupFailure;
142
- const retained = this.#retained;
143
- this.#retained = undefined;
144
- const result = await cleanup(retained?.session, retained?.root, ok(undefined));
145
- if (!result.ok) {
146
- this.#cleanupFailure = result.error;
147
- throw result.error;
169
+ if (this.#pendingCleanup === undefined && this.#retained !== undefined) {
170
+ this.#pendingCleanup = {
171
+ session: this.#retained.session,
172
+ root: this.#retained.root,
173
+ previousError: undefined,
174
+ };
175
+ this.#retained = undefined;
148
176
  }
177
+ if (this.#pendingCleanup === undefined)
178
+ return ok(undefined);
179
+ const result = await cleanup(this.#pendingCleanup);
180
+ if (result.ok)
181
+ this.#pendingCleanup = undefined;
182
+ return result;
149
183
  }
150
184
  #scheduleIdle() {
151
185
  this.#idle = setTimeout(() => {
152
- const retirement = this.#tail.then(() => this.#retire());
153
- this.#tail = retirement.catch(() => undefined);
186
+ this.#tail = this.#tail.then(async () => {
187
+ await this.#retire();
188
+ });
154
189
  }, 60_000);
155
190
  this.#idle.unref();
156
191
  }
@@ -161,11 +196,10 @@ export class JadxProvider {
161
196
  : AbortSignal.any([options.signal, timeout]);
162
197
  let root;
163
198
  let session;
164
- let outcome;
165
199
  try {
166
200
  if (target.format !== "apk")
167
201
  throw new AnalysisCapabilityUnavailableError("jadx", request.operation, `Target ${target.path} is ${target.format}; provide one standalone APK.`);
168
- const configuration = await resolveJadxConfiguration(this.environment, request.operation);
202
+ const configuration = await resolveJadxConfiguration(this.environment, request.operation, signal);
169
203
  signal.throwIfAborted();
170
204
  const jarHash = await hashAndroidFile(configuration.jar);
171
205
  const bridgeHash = await hashAndroidFile(BRIDGE_SOURCE);
@@ -193,8 +227,11 @@ export class JadxProvider {
193
227
  this.environment.JAVA_HOME,
194
228
  ],
195
229
  });
196
- if (this.#retained !== undefined && this.#retained.key !== key)
197
- await this.#retire();
230
+ if (this.#retained !== undefined && this.#retained.key !== key) {
231
+ const retired = await this.#retire();
232
+ if (!retired.ok)
233
+ return retired;
234
+ }
198
235
  let retained = this.#retained;
199
236
  if (retained === undefined) {
200
237
  root = await PrivateRuntimeRoot.create({ prefix: "rea-android-" });
@@ -230,7 +267,7 @@ export class JadxProvider {
230
267
  root = retained.root;
231
268
  session = retained.session;
232
269
  const { snapshot } = retained;
233
- outcome = ok(await session.execute({
270
+ const outcome = ok(await session.execute({
234
271
  request,
235
272
  target,
236
273
  snapshot,
@@ -243,18 +280,20 @@ export class JadxProvider {
243
280
  return outcome;
244
281
  }
245
282
  catch (cause) {
246
- outcome = err(executionError({
283
+ const previousError = executionError({
247
284
  cause,
248
285
  request,
249
286
  timeout,
250
287
  signal: options?.signal,
251
288
  session,
252
- }));
289
+ });
290
+ // Admission can fail before selecting an existing session for execution.
291
+ root ??= this.#retained?.root;
292
+ session ??= this.#retained?.session;
293
+ this.#retained = undefined;
294
+ this.#pendingCleanup = { session, root, previousError };
295
+ const retired = await this.#retire();
296
+ return retired.ok ? err(previousError) : retired;
253
297
  }
254
- // An existing session also needs retirement when admission fails before selection.
255
- root ??= this.#retained?.root;
256
- session ??= this.#retained?.session;
257
- this.#retained = undefined;
258
- return cleanup(session, root, outcome);
259
298
  }
260
299
  }
@@ -1,17 +1,18 @@
1
1
  import { Client } from "@modelcontextprotocol/client";
2
2
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
3
- import { AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
3
+ import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
4
4
  import { jsonValueSchema } from "../domain/jsonValue.js";
5
5
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
6
  import { analyzeJadxRequest } from "./JadxAnalysis.js";
7
7
  import { JadxMcpTransport } from "./JadxMcpTransport.js";
8
- import { jadxLoadSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
8
+ import { jadxLoadSchema, jadxInputFailureSchema, jadxRuntimeSchema, parseJadxEnvelope, parseJadxJson, } from "./JadxProtocol.js";
9
9
  import { JADX_BRIDGE_IDENTITY, JADX_RELEASE, JADX_PROVIDER_IDENTITY, JADX_LIMITATIONS, } from "./JadxRelease.js";
10
10
  /** One owned engine connection; its wire protocol stays inside the Android adapter. */
11
11
  export class JadxSession {
12
12
  transport;
13
13
  #client = new Client({ name: "rea-android-adapter", version: "1" });
14
14
  #loaded;
15
+ #connected = false;
15
16
  constructor(options, launcher) {
16
17
  this.transport = new JadxMcpTransport(options, launcher);
17
18
  }
@@ -26,8 +27,10 @@ export class JadxSession {
26
27
  signal.throwIfAborted();
27
28
  this.transport.beginOperation();
28
29
  const raw = [];
29
- if (this.#loaded === undefined)
30
+ if (!this.#connected) {
30
31
  await this.#client.connect(this.transport, { timeout: 30_000 });
32
+ this.#connected = true;
33
+ }
31
34
  const server = this.#client.getServerVersion();
32
35
  if (server?.name !== JADX_BRIDGE_IDENTITY.name ||
33
36
  server.version !== JADX_BRIDGE_IDENTITY.version)
@@ -73,6 +76,10 @@ export class JadxSession {
73
76
  signal.removeEventListener("abort", abort);
74
77
  }
75
78
  }
79
+ /** Whether the selected Java runtime established the REA bridge protocol. */
80
+ initialized() {
81
+ return this.#connected;
82
+ }
76
83
  /** Join owned cleanup even if SDK connection teardown itself fails. */
77
84
  async close() {
78
85
  try {
@@ -92,7 +99,18 @@ export class JadxSession {
92
99
  input,
93
100
  response: jsonValueSchema.parse(response),
94
101
  });
95
- if (envelope.failed)
102
+ if (envelope.failed) {
103
+ if (envelope.text.startsWith("{")) {
104
+ const failure = jadxInputFailureSchema.safeParse(parseJadxJson(envelope.text, request.operation));
105
+ if (failure.success)
106
+ throw new AnalysisInputError(request.operation, undefined, [
107
+ {
108
+ path: [failure.data.field],
109
+ reason: "invalid_value",
110
+ message: failure.data.message,
111
+ },
112
+ ]);
113
+ }
96
114
  throw new ProviderAdapterError("jadx", request.operation, {
97
115
  diagnostics: {
98
116
  upstream_operation: name,
@@ -101,6 +119,7 @@ export class JadxSession {
101
119
  target_sha256: target.sha256,
102
120
  },
103
121
  });
122
+ }
104
123
  return envelope.text;
105
124
  };
106
125
  return {
@@ -1,6 +1,7 @@
1
- import { AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
1
+ import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
2
2
  import {} from "../domain/analysisErrorBase.js";
3
- import { parseDocuments } from "../domain/hopperValues.js";
3
+ import { analysisBookmarkSchema } from "../domain/hopperValues.js";
4
+ import { resolveAnalysisDocument } from "./AnalysisDocument.js";
4
5
  import { err, ok } from "../domain/result.js";
5
6
  const parameters = (document, address) => ({
6
7
  ...(document === undefined ? {} : { document }),
@@ -42,7 +43,7 @@ export const getNavigationContext = async (analysis, input, signal) => {
42
43
  };
43
44
  /** Inspect bounded provider-neutral facets at one explicit reproducible address. */
44
45
  export const inspectAddressContext = async (analysis, input, signal) => {
45
- const document = await resolveDocument(analysis, input.document, signal);
46
+ const document = await resolveAnalysisDocument(analysis, input.document, signal);
46
47
  if (!document.ok)
47
48
  return document;
48
49
  const args = parameters(document.value, input.address);
@@ -75,30 +76,6 @@ export const inspectAddressContext = async (analysis, input, signal) => {
75
76
  : bookmarks,
76
77
  });
77
78
  };
78
- const resolveDocument = async (analysis, document, signal) => {
79
- if (document !== undefined)
80
- return ok(document);
81
- const current = await analysis.execute("current_document", {}, executionOptions(signal));
82
- if (!current.ok) {
83
- if (!(current.error instanceof AnalysisCapabilityUnavailableError))
84
- return current;
85
- const listed = await analysis.execute("list_documents", {}, executionOptions(signal));
86
- if (!listed.ok)
87
- return listed;
88
- const parsed = parseDocuments(listed.value.result);
89
- if (!parsed.ok)
90
- return err(new AnalysisOutputError("list_documents", "expected one document identity when resolving a headless provider", { cause: parsed.error }));
91
- if (parsed.value.length !== 1)
92
- return err(new AnalysisOutputError("list_documents", `expected exactly one document identity for a provider without current-document selection, received ${parsed.value.length}`));
93
- const [documentName] = parsed.value;
94
- if (documentName === undefined)
95
- return err(new AnalysisOutputError("list_documents", "provider returned no document identity"));
96
- return ok(documentName);
97
- }
98
- return typeof current.value.result === "string"
99
- ? ok(current.value.result)
100
- : err(new AnalysisOutputError("current_document", "expected a document identity string"));
101
- };
102
79
  const facet = (result, operation) => result?.ok === true
103
80
  ? { state: "available", value: result.value.result }
104
81
  : {
@@ -139,19 +116,15 @@ const matchingBookmarks = (value, address) => {
139
116
  reason: "list_bookmarks returned malformed output; expected an array.",
140
117
  remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
141
118
  };
142
- if (!value.every(isBookmark))
119
+ const parsed = analysisBookmarkSchema.array().safeParse(value);
120
+ if (!parsed.success)
143
121
  return {
144
122
  state: "unavailable",
145
- reason: "list_bookmarks returned malformed entries; expected address and name strings.",
123
+ reason: "list_bookmarks returned malformed entries; expected an address string and a string or null name.",
146
124
  remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
147
125
  };
148
126
  return {
149
127
  state: "available",
150
- value: value.filter((bookmark) => bookmark.address === address),
128
+ value: parsed.data.filter((bookmark) => bookmark.address === address),
151
129
  };
152
130
  };
153
- const isBookmark = (value) => typeof value === "object" &&
154
- value !== null &&
155
- !Array.isArray(value) &&
156
- typeof value.address === "string" &&
157
- typeof value.name === "string";
@@ -0,0 +1,32 @@
1
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
2
+ import { parseDocuments } from "../domain/hopperValues.js";
3
+ import { err, ok } from "../domain/result.js";
4
+ const executionOptions = (signal) => signal === undefined ? undefined : { signal };
5
+ /** Resolve an explicit or provider-selected document without guessing among candidates. */
6
+ export const resolveAnalysisDocument = async (analysis, document, signal) => {
7
+ if (document !== undefined)
8
+ return ok(document);
9
+ if (signal?.aborted === true)
10
+ return err(new AnalysisCancelledError("current_document"));
11
+ const current = await analysis.execute("current_document", {}, executionOptions(signal));
12
+ if (!current.ok) {
13
+ if (!(current.error instanceof AnalysisCapabilityUnavailableError))
14
+ return current;
15
+ const listed = await analysis.execute("list_documents", {}, executionOptions(signal));
16
+ if (!listed.ok)
17
+ return listed;
18
+ const parsed = parseDocuments(listed.value.result);
19
+ if (!parsed.ok)
20
+ return err(new AnalysisOutputError("list_documents", "expected one document identity when resolving a headless provider", { cause: parsed.error }));
21
+ if (parsed.value.length !== 1)
22
+ return err(new AnalysisOutputError("list_documents", `expected exactly one document identity for a provider without current-document selection, received ${parsed.value.length}`));
23
+ const [documentName] = parsed.value;
24
+ if (documentName === undefined || documentName.length === 0)
25
+ return err(new AnalysisOutputError("list_documents", "provider returned no document identity"));
26
+ return ok(documentName);
27
+ }
28
+ return typeof current.value.result === "string" &&
29
+ current.value.result.length > 0
30
+ ? ok(current.value.result)
31
+ : err(new AnalysisOutputError("current_document", "expected a nonempty document identity string"));
32
+ };
@@ -6,6 +6,7 @@ import { z } from "zod";
6
6
  import { BinaryTargetError } from "../domain/configurationErrors.js";
7
7
  import { isPathWithinRoot } from "../domain/localPath.js";
8
8
  import { parseXmlPropertyList } from "../domain/propertyListKeys.js";
9
+ import { decodeXmlPlistText } from "../domain/propertyListXmlText.js";
9
10
  import { err, ok } from "../domain/result.js";
10
11
  const execFileAsync = promisify(execFile);
11
12
  const BUNDLE_LAYOUTS = [
@@ -18,23 +19,31 @@ const BUNDLE_LAYOUTS = [
18
19
  // iOS-style bundles, as extracted from an IPA, keep both at the root.
19
20
  { plist: ["Info.plist"], programs: [], programsLabel: "the bundle root" },
20
21
  ];
22
+ const defaultFileSystem = { readFile, realpath };
21
23
  /**
22
24
  * Resolve an app bundle directory to its declared program file. macOS and
23
25
  * flat iOS-style layouts are read directly. An iOS app installed on a Mac is
24
26
  * a wrapper whose `Wrapper` directory holds the iOS bundle; that bundle is
25
27
  * found by listing `Wrapper`, never by following the `WrappedBundle` link.
26
28
  */
27
- export const resolveAppBundleExecutable = async (path) => {
28
- const layout = await presentLayout(path);
29
- if (layout !== undefined)
30
- return resolveLayoutExecutable(path, layout);
31
- const wrapped = await wrappedBundle(path);
32
- if (wrapped !== undefined) {
33
- const wrappedLayout = await presentLayout(wrapped);
34
- if (wrappedLayout !== undefined)
35
- return resolveLayoutExecutable(wrapped, wrappedLayout);
29
+ export const resolveAppBundleExecutable = async (path, fileSystem = defaultFileSystem) => {
30
+ try {
31
+ const layout = await presentLayout(path);
32
+ if (layout !== undefined)
33
+ return resolveLayoutExecutable(path, layout, fileSystem);
34
+ const wrapped = await wrappedBundle(path);
35
+ if (wrapped !== undefined) {
36
+ const wrappedLayout = await presentLayout(wrapped);
37
+ if (wrappedLayout !== undefined)
38
+ return resolveLayoutExecutable(wrapped, wrappedLayout, fileSystem);
39
+ }
40
+ }
41
+ catch (cause) {
42
+ if (cause instanceof BinaryTargetError)
43
+ return err(cause);
44
+ return err(new BinaryTargetError(path, errorReason(cause, path), { cause }));
36
45
  }
37
- return err(new BinaryTargetError(path, "app has no readable CFBundleExecutable", {
46
+ return err(new BinaryTargetError(path, `app Info.plist is missing or no supported bundle layout was found: ${path}`, {
38
47
  cause: new Error("No Contents/Info.plist, root Info.plist, or single Wrapper/*.app bundle was found"),
39
48
  }));
40
49
  };
@@ -56,13 +65,34 @@ const layoutPlistPresent = async (path) => {
56
65
  catch (cause) {
57
66
  if (isAbsence(cause))
58
67
  return false;
68
+ if (isPermissionDenied(cause))
69
+ throw new BinaryTargetError(path, `permission denied inspecting app Info.plist ${path}`, { cause });
59
70
  throw cause;
60
71
  }
61
72
  };
62
73
  const isAbsence = (cause) => {
63
- const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
74
+ const code = errorCode(cause);
64
75
  return code === "ENOENT" || code === "ENOTDIR";
65
76
  };
77
+ const errorCode = (cause) => cause instanceof Error ? Reflect.get(cause, "code") : undefined;
78
+ const codeDescription = (cause) => {
79
+ const code = errorCode(cause);
80
+ return typeof code === "string" || typeof code === "number"
81
+ ? ` (${String(code)})`
82
+ : "";
83
+ };
84
+ const isSystemErrorCode = (cause) => {
85
+ const code = errorCode(cause);
86
+ return (typeof code === "string" &&
87
+ /^[A-Z][A-Z0-9_]+$/u.test(code) &&
88
+ !code.startsWith("ERR_"));
89
+ };
90
+ const isPermissionDenied = (cause) => errorCode(cause) === "EACCES" || errorCode(cause) === "EPERM";
91
+ const errorReason = (cause, path) => isPermissionDenied(cause)
92
+ ? `permission denied accessing app bundle path ${path}`
93
+ : isAbsence(cause)
94
+ ? `app bundle path is missing: ${path}`
95
+ : `could not inspect app bundle path ${path}`;
66
96
  /** The single real `.app` directory inside an iOS-on-Mac `Wrapper`. */
67
97
  const wrappedBundle = async (bundle) => {
68
98
  const wrapper = join(bundle, "Wrapper");
@@ -81,20 +111,32 @@ const wrappedBundle = async (bundle) => {
81
111
  ? join(wrapper, app.name)
82
112
  : undefined;
83
113
  };
84
- const resolveLayoutExecutable = async (bundle, layout) => {
114
+ const resolveLayoutExecutable = async (bundle, layout, fileSystem) => {
85
115
  const plistPath = join(bundle, ...layout.plist);
116
+ let plist;
117
+ try {
118
+ plist = await fileSystem.readFile(plistPath);
119
+ }
120
+ catch (cause) {
121
+ return err(new BinaryTargetError(plistPath, isPermissionDenied(cause)
122
+ ? `permission denied reading app Info.plist ${plistPath}`
123
+ : isAbsence(cause)
124
+ ? `app Info.plist is missing: ${plistPath}`
125
+ : `could not read app Info.plist ${plistPath}${codeDescription(cause)}`, { cause }));
126
+ }
86
127
  let name;
87
128
  try {
88
- const plist = await readFile(plistPath);
89
129
  name =
90
130
  plist.subarray(0, 6).toString("ascii") === "bplist"
91
- ? await readBinaryPlistExecutable(plistPath)
92
- : parseXmlPlistExecutable(plist.toString("utf8"));
131
+ ? await (fileSystem.decodeBinaryPlist ?? readBinaryPlistExecutable)(plistPath)
132
+ : parseXmlPlistExecutable(decodeXmlPlistText(plist));
93
133
  }
94
134
  catch (cause) {
95
- return err(new BinaryTargetError(bundle, "app has no readable CFBundleExecutable", {
96
- cause,
97
- }));
135
+ return err(new BinaryTargetError(plistPath, isPermissionDenied(cause)
136
+ ? `permission denied decoding app Info.plist ${plistPath}${codeDescription(cause)}`
137
+ : isSystemErrorCode(cause)
138
+ ? `could not decode app Info.plist ${plistPath}${codeDescription(cause)}`
139
+ : `app Info.plist is malformed, unsupported, or lacks CFBundleExecutable: ${plistPath}${cause instanceof Error ? ` (${cause.message})` : ""}`, { cause }));
98
140
  }
99
141
  if (!isSafeExecutableName(name))
100
142
  return err(new BinaryTargetError(bundle, "app has an unsafe CFBundleExecutable"));
@@ -102,15 +144,19 @@ const resolveLayoutExecutable = async (bundle, layout) => {
102
144
  const executable = join(programs, name);
103
145
  try {
104
146
  const [canonicalPrograms, canonicalExecutable] = await Promise.all([
105
- realpath(programs),
106
- realpath(executable),
147
+ fileSystem.realpath(programs),
148
+ fileSystem.realpath(executable),
107
149
  ]);
108
150
  if (!isPathWithinRoot(canonicalPrograms, canonicalExecutable))
109
151
  return err(new BinaryTargetError(bundle, `app program file leaves ${layout.programsLabel}`));
110
152
  return ok({ executable: canonicalExecutable, infoPlist: plistPath });
111
153
  }
112
154
  catch (cause) {
113
- return err(new BinaryTargetError(bundle, "app program file is missing", { cause }));
155
+ return err(new BinaryTargetError(executable, isPermissionDenied(cause)
156
+ ? `permission denied resolving app program file ${executable}`
157
+ : isAbsence(cause)
158
+ ? `app program file is missing: ${executable}`
159
+ : `could not resolve app program file ${executable}`, { cause }));
114
160
  }
115
161
  };
116
162
  /** Decode the top-level executable name with an XML parser, not a pattern. */
@@ -169,6 +169,9 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
169
169
  const prefix = Buffer.alloc(4096);
170
170
  const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
171
171
  const bytes = prefix.subarray(0, prefixRead.bytesRead);
172
+ // Header commitments such as Mach-O load commands and FAT slices are
173
+ // checked against the whole file, not the probed prefix.
174
+ const fileSize = (await handle.stat()).size;
172
175
  if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
173
176
  const offset = mzWindowsHeaderOffset(bytes);
174
177
  if (offset !== null) {
@@ -182,7 +185,6 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
182
185
  ? bytes.readUInt16LE(24) + bytes.readUInt16LE(6) * 4
183
186
  : 0;
184
187
  const headerBytes = bytes.length >= 28 ? bytes.readUInt16LE(8) * 16 : 0;
185
- const fileSize = (await handle.stat()).size;
186
188
  if (tableEnd > bytes.length &&
187
189
  tableEnd <= headerBytes &&
188
190
  tableEnd <= fileSize) {
@@ -201,11 +203,11 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
201
203
  if (count <= 128 && required > bytes.length) {
202
204
  const header = Buffer.alloc(required);
203
205
  const headerRead = await handle.read(header, 0, header.length, 0);
204
- return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture);
206
+ return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture, fileSize);
205
207
  }
206
208
  }
207
209
  }
208
- return parseExecutableHeader(bytes, hostArchitecture);
210
+ return parseExecutableHeader(bytes, hostArchitecture, fileSize);
209
211
  };
210
212
  const readPeMetadata = async (handle, offset) => {
211
213
  const fileHeader = Buffer.alloc(24);
@@ -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
1
  import { canonicalDigest } from "../domain/comparisonSemantics.js";
2
- import { sanitizeBrowserUrl } from "../domain/browserObservation.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) => ({
5
+ ...jsonObjectSchema.parse(scenario),
6
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,
23
7
  });
24
8
  /** Create Evidence without retaining resolved scenario secret values. */
25
9
  export const createBrowserScenarioEvidence = (scenario, capture, provider) => createEvidence(undefined, provider, {