rea-agents 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -13,7 +13,8 @@ export const analysisErrorRemediationAction = (error) => {
13
13
  if (error instanceof AnalysisSnapshotMismatchError)
14
14
  return "Run analysis without this snapshot, then save a fresh snapshot using the intended artifact, provider, and analysis profile.";
15
15
  if (error instanceof AnalysisUnsupportedTargetError)
16
- return "Select a target supported by this operation or choose an operation supporting the reported target format.";
16
+ return (error.remediationAction ??
17
+ "Select a target supported by this operation or choose an operation supporting the reported target format.");
17
18
  if (error instanceof AnalysisResourceConstraintError)
18
19
  return (error.remediationAction ??
19
20
  (error.resource === "transport"
@@ -44,10 +45,13 @@ export const analysisErrorRemediationAction = (error) => {
44
45
  if (error instanceof BinaryTargetError &&
45
46
  error.constraint === "directory_requires_file")
46
47
  return "For a JavaScript/Electron application directory, call analyze_javascript_application with input_path or run `rea analyze <directory>`. For binary analysis, select its executable file.";
47
- if (error instanceof AnalysisAccessDeniedError)
48
+ if (error instanceof AnalysisAccessDeniedError ||
49
+ (error instanceof BinaryTargetError && error.systemCode !== undefined))
48
50
  return "Check the current process's read access to the selected path. Retry with a readable local file.";
49
51
  if (error instanceof AnalysisArtifactChangedError)
50
52
  return "Wait until the selected file is stable. For an active binary session, reopen the target with open_binary before retrying so REA acquires its current identity; for a CLI command or target-free tool, rerun the operation.";
53
+ if (error instanceof ConfigurationError && error.settings.length > 0)
54
+ return `Correct ${[...new Set(error.settings.map(({ setting }) => setting))].join(", ")} in the environment that starts REA (your shell or the MCP client's registration), then rerun.`;
51
55
  if (error instanceof AnalysisInputError)
52
56
  return "Correct the listed arguments and retry.";
53
57
  if (error instanceof UnknownRegistryError && error.reason === "not-found")
@@ -72,6 +76,11 @@ export const analysisErrorCategory = (error) => {
72
76
  return "unavailable";
73
77
  if (error instanceof ArtifactOperationError)
74
78
  return artifactErrorCategory(error.reason);
79
+ if (error instanceof EvidenceFileError &&
80
+ (error.reason === "missing" ||
81
+ error.reason === "not-file" ||
82
+ error.reason === "exists"))
83
+ return "invalid_input";
75
84
  return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure";
76
85
  };
77
86
  const browserErrorCategory = (reason) => {
@@ -152,7 +161,13 @@ export const analysisErrorUserMessage = (error) => {
152
161
  if (error instanceof UnknownRegistryError)
153
162
  return "Evidence state changed before the update completed. Refresh the current state and try again.";
154
163
  if (error instanceof ConfigurationError)
155
- return "REA configuration is invalid. Run `rea doctor` and fix the reported setting.";
164
+ return error.settings.length === 0
165
+ ? "REA configuration is invalid. Run `rea doctor` and fix the reported setting."
166
+ : `REA configuration is invalid: ${error.settings
167
+ .map(({ setting, constraint }) => constraint.includes(setting)
168
+ ? constraint.replace(/\.$/u, "")
169
+ : `${setting}: ${constraint}`)
170
+ .join("; ")}.`;
156
171
  if (error instanceof NoBinaryOpenError)
157
172
  return error.message;
158
173
  if (error instanceof BinaryTargetError)
@@ -2,7 +2,7 @@ import { jsonValueSchema } from "./jsonValue.js";
2
2
  import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
3
3
  import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisUnsupportedTargetError, AnalysisInputError, AnalysisOutputError, AnalysisTimeoutError, AnalysisResourceConstraintError, } from "./analysisErrorCore.js";
4
4
  import { ArtifactOperationError } from "./artifactOperationError.js";
5
- import { BinaryTargetError } from "./configurationErrors.js";
5
+ import { BinaryTargetError, ConfigurationError, } from "./configurationErrors.js";
6
6
  import { BrowserObservationError } from "./browserObservationError.js";
7
7
  import { EvidenceFileError, EvidenceIntegrityError, EvidenceReferenceError, } from "./evidenceErrors.js";
8
8
  import { HopperCancelledError, HopperProcessError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "./hopperErrors.js";
@@ -63,6 +63,10 @@ const underlyingErrorCode = (error) => {
63
63
  : browserErrorCode(error.reason);
64
64
  if (error instanceof ArtifactOperationError)
65
65
  return artifactOperationCode(error);
66
+ if (error instanceof BinaryTargetError)
67
+ return error.systemCode === undefined
68
+ ? "target_unavailable"
69
+ : "access_denied";
66
70
  if (error instanceof EvidenceFileError)
67
71
  return evidenceFileCode(error.reason);
68
72
  if (error instanceof UnknownRegistryError)
@@ -95,9 +99,14 @@ const artifactOperationCode = (error) => {
95
99
  return "cancelled";
96
100
  return "artifact_operation_failed";
97
101
  };
98
- const evidenceFileCode = (reason) => reason === "invalid-json"
99
- ? "evidence_integrity_mismatch"
100
- : "execution_failure";
102
+ const evidenceFileCode = (reason) => {
103
+ if (reason === "invalid-json")
104
+ return "evidence_integrity_mismatch";
105
+ // A missing, non-file or already-existing path is the caller's selection.
106
+ if (reason === "io")
107
+ return "execution_failure";
108
+ return "invalid_request";
109
+ };
101
110
  const unknownRegistryCode = (reason) => {
102
111
  if (reason === "revision-conflict" || reason === "already-exists")
103
112
  return "revision_conflict";
@@ -132,7 +141,6 @@ const STATIC_ERROR_CODES = {
132
141
  HopperStartError: "provider_unavailable",
133
142
  ConfigurationError: "configuration_invalid",
134
143
  NoBinaryOpenError: "target_unavailable",
135
- BinaryTargetError: "target_unavailable",
136
144
  EvidenceIntegrityError: "evidence_integrity_mismatch",
137
145
  ProviderAdapterError: "execution_failure",
138
146
  HopperRemoteError: "execution_failure",
@@ -140,6 +148,7 @@ const STATIC_ERROR_CODES = {
140
148
  const staticErrorCode = (tag) => {
141
149
  switch (tag) {
142
150
  case "ArtifactOperationError":
151
+ case "BinaryTargetError":
143
152
  case "BrowserObservationError":
144
153
  case "EvidenceFileError":
145
154
  case "ProcessCaptureError":
@@ -404,6 +413,13 @@ const lifecycleErrorDetails = (error) => {
404
413
  };
405
414
  return Object.keys(details).length === 0 ? undefined : details;
406
415
  }
416
+ if (error instanceof ConfigurationError && error.settings.length > 0)
417
+ return {
418
+ settings: error.settings.map(({ setting, constraint }) => ({
419
+ setting,
420
+ constraint,
421
+ })),
422
+ };
407
423
  if (error instanceof BinaryTargetError)
408
424
  return {
409
425
  path: error.path,
@@ -411,6 +427,9 @@ const lifecycleErrorDetails = (error) => {
411
427
  ...(error.constraint === undefined
412
428
  ? {}
413
429
  : { constraint: error.constraint }),
430
+ ...(error.systemCode === undefined
431
+ ? {}
432
+ : { system_code: error.systemCode, boundary: "filesystem-read" }),
414
433
  };
415
434
  return undefined;
416
435
  };
@@ -96,7 +96,7 @@ export const analysisSnapshotSchema = z.object({
96
96
  target: targetSchema,
97
97
  binding: bindingSchema,
98
98
  entries: z.array(entrySchema),
99
- workflow_entries: z.array(workflowEntrySchema).optional(),
99
+ workflow_entries: z.array(workflowEntrySchema),
100
100
  evidence_bundle: evidenceBundleSchema,
101
101
  });
102
102
  const canonicalJson = (value) => {
@@ -139,7 +139,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
139
139
  const encodedParameters = canonicalJson(parameters);
140
140
  const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
141
141
  const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
142
- const workflowEntry = snapshot.workflow_entries?.find((candidate) => candidate.query_id === queryId);
142
+ const workflowEntry = snapshot.workflow_entries.find((candidate) => candidate.query_id === queryId);
143
143
  if (entry === undefined && workflowEntry === undefined)
144
144
  return undefined;
145
145
  return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
@@ -147,7 +147,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
147
147
  record.provider.id === provider.id &&
148
148
  record.provider.name === provider.name &&
149
149
  record.provider.version === provider.version &&
150
- "analysis_profile" in record &&
150
+ record.analysis_profile !== null &&
151
151
  analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
152
152
  canonicalJson(record.parameters) === encodedParameters &&
153
153
  ((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
@@ -233,11 +233,17 @@ export const createAnalysisSnapshotEntry = (input) => {
233
233
  export const parseAnalysisSnapshot = (input) => {
234
234
  const parsed = analysisSnapshotSchema.parse(input);
235
235
  parseEvidenceBundle(parsed.evidence_bundle);
236
- if (JSON.stringify(evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256)) !== JSON.stringify(parsed.evidence_bundle))
236
+ const scopedEvidence = evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256);
237
+ // The validated canonical bundle is filtered, never extended. Equal counts
238
+ // establish that no record or unknown was removed without serializing results.
239
+ if (scopedEvidence.records.length !== parsed.evidence_bundle.records.length ||
240
+ scopedEvidence.unknowns.length !== parsed.evidence_bundle.unknowns.length)
237
241
  throw new TypeError("Analysis snapshot evidence contains records for another target");
242
+ if (!hasCanonicalQueryOrder(parsed.entries))
243
+ throw new TypeError("Analysis snapshot entries are not canonical");
244
+ if (!hasCanonicalQueryOrder(parsed.workflow_entries))
245
+ throw new TypeError("Analysis snapshot workflow entries are not canonical");
238
246
  const ids = new Set();
239
- const boundEntries = [];
240
- const boundWorkflowEntries = [];
241
247
  const index = createEvidenceIndex(parsed);
242
248
  const workflowIndex = createWorkflowEvidenceIndex(parsed);
243
249
  for (const entry of parsed.entries) {
@@ -254,13 +260,10 @@ export const parseAnalysisSnapshot = (input) => {
254
260
  if (!entryHasMatchingEvidence(entry, parsed, index)) {
255
261
  if (entryHasCorrespondingEvidence(entry, parsed, index))
256
262
  throw new TypeError(`Analysis snapshot entry ${entry.operation} differs from its Evidence record`);
257
- // Older snapshots may contain cache entries without profile-bound Evidence.
258
- // Keep their Evidence bundle, but never replay those unbound values.
259
- continue;
263
+ throw new TypeError(`Analysis snapshot entry ${entry.operation} has no profile-bound Evidence record`);
260
264
  }
261
- boundEntries.push(entry);
262
265
  }
263
- for (const entry of parsed.workflow_entries ?? []) {
266
+ for (const entry of parsed.workflow_entries) {
264
267
  if (entry.execution.provider.id !==
265
268
  entry.execution.analysis_profile.provider.id ||
266
269
  entry.execution.provider.name !==
@@ -277,24 +280,19 @@ export const parseAnalysisSnapshot = (input) => {
277
280
  if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
278
281
  if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
279
282
  throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
280
- continue;
283
+ throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} has no profile-bound Evidence record`);
281
284
  }
282
- boundWorkflowEntries.push(entry);
283
285
  }
284
- const sorted = [...parsed.entries].sort((left, right) => left.query_id.localeCompare(right.query_id));
285
- if (JSON.stringify(parsed.entries) !== JSON.stringify(sorted))
286
- throw new TypeError("Analysis snapshot entries are not canonical");
287
- const sortedWorkflows = [...(parsed.workflow_entries ?? [])].sort((left, right) => left.query_id.localeCompare(right.query_id));
288
- if (parsed.workflow_entries !== undefined &&
289
- JSON.stringify(parsed.workflow_entries) !== JSON.stringify(sortedWorkflows))
290
- throw new TypeError("Analysis snapshot workflow entries are not canonical");
291
- return {
292
- ...parsed,
293
- entries: boundEntries,
294
- ...(parsed.workflow_entries === undefined
295
- ? {}
296
- : { workflow_entries: boundWorkflowEntries }),
297
- };
286
+ return parsed;
287
+ };
288
+ const hasCanonicalQueryOrder = (entries) => {
289
+ let previous;
290
+ for (const { query_id: queryId } of entries) {
291
+ if (previous !== undefined && previous.localeCompare(queryId) > 0)
292
+ return false;
293
+ previous = queryId;
294
+ }
295
+ return true;
298
296
  };
299
297
  const createEvidenceIndex = (snapshot) => {
300
298
  const matching = new Set();
@@ -329,13 +327,13 @@ const isCorrespondingEvidence = (evidence, snapshot) => evidence.predicate_type
329
327
  evidence.confidence === "observed" &&
330
328
  evidence.authority === "shipped-artifact" &&
331
329
  evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
332
- "analysis_profile" in evidence &&
330
+ evidence.analysis_profile !== null &&
333
331
  analysisProfilesEqual(evidence.analysis_profile, snapshot.binding.analysis_profile);
334
332
  const evidenceQueryKey = (evidence) => canonicalJson({
335
333
  operation: evidence.operation,
336
334
  parameters: evidence.parameters,
337
335
  provider: evidence.provider,
338
- analysis_profile: "analysis_profile" in evidence ? evidence.analysis_profile : null,
336
+ analysis_profile: evidence.analysis_profile,
339
337
  });
340
338
  const entryQueryKey = (entry, binding) => canonicalJson({
341
339
  operation: entry.operation,
@@ -383,7 +381,7 @@ const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_typ
383
381
  evidence.confidence === "derived" &&
384
382
  evidence.authority === "shipped-artifact" &&
385
383
  evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
386
- "analysis_profile" in evidence &&
384
+ evidence.analysis_profile !== null &&
387
385
  analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
388
386
  evidence.provider.id === entry.execution.provider.id &&
389
387
  evidence.provider.name === entry.execution.provider.name &&
@@ -396,7 +394,7 @@ const createWorkflowEvidenceIndex = (snapshot) => {
396
394
  evidence.confidence !== "derived" ||
397
395
  evidence.authority !== "shipped-artifact" ||
398
396
  evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
399
- !("analysis_profile" in evidence))
397
+ evidence.analysis_profile === null)
400
398
  continue;
401
399
  corresponding.add(evidenceQueryKey(evidence));
402
400
  matching.add(canonicalJson(evidenceContentProjection(evidence)));
@@ -0,0 +1,243 @@
1
+ import { z } from "zod";
2
+ import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../analysisErrorCore.js";
3
+ import { digestCanonicalValue } from "../canonicalDigest.js";
4
+ import { digestSchema, prefixedDigestSchema } from "../digests.js";
5
+ import { evidenceSchema } from "../evidence.js";
6
+ import { jsonObjectSchema, jsonValueSchema } from "../jsonValue.js";
7
+ import { err, ok } from "../result.js";
8
+ import { binaryLayoutSchema } from "../native/binaryLayout.js";
9
+ import { parseOwnedJavaScriptApplicationAnalysisSteps, } from "../javascript/javascriptApplicationAnalysis.js";
10
+ import { analysisInputErrorFromIssues } from "../inputIssueProjection.js";
11
+ import { projectBinaryLayoutView } from "./binaryLayoutView.js";
12
+ import { projectJavaScriptApplicationView } from "./javascriptApplicationView.js";
13
+ /** Public name of the selected-view workflow. */
14
+ export const INSPECT_ANALYSIS_VIEW_OPERATION = "inspect_analysis_view";
15
+ const summaryViewSchema = z.strictObject({ kind: z.literal("summary") });
16
+ const facetViewSchema = z.strictObject({
17
+ kind: z.literal("facet"),
18
+ facet: z.enum(["mitigations", "linkage"]),
19
+ });
20
+ const itemSelectorSchema = z.union([
21
+ z.strictObject({ index: z.number().int().nonnegative() }),
22
+ z.strictObject({ name: z.string() }),
23
+ z.strictObject({
24
+ path: z
25
+ .string()
26
+ .describe("Exact observed module path or original source-map reference from a module page; an empty reference is valid."),
27
+ }),
28
+ z.strictObject({ node_id: prefixedDigestSchema("jag_node") }),
29
+ ]);
30
+ const itemViewSchema = z
31
+ .strictObject({
32
+ kind: z.literal("item"),
33
+ collection: z.enum(["sections", "symbols", "modules"]),
34
+ selector: itemSelectorSchema,
35
+ })
36
+ .superRefine((value, context) => {
37
+ const selector = value.selector;
38
+ if (value.collection === "modules") {
39
+ if (!("path" in selector) && !("node_id" in selector))
40
+ context.addIssue({
41
+ code: "custom",
42
+ path: ["selector"],
43
+ message: "Module items are selected by exact path or node_id, not index or name.",
44
+ });
45
+ return;
46
+ }
47
+ if (!("index" in selector) && !("name" in selector))
48
+ context.addIssue({
49
+ code: "custom",
50
+ path: ["selector"],
51
+ message: "Section and symbol items are selected by index or exact name, not path or node_id.",
52
+ });
53
+ });
54
+ const pageViewSchema = z.strictObject({
55
+ kind: z.literal("page"),
56
+ collection: z.enum(["sections", "symbols", "modules"]),
57
+ offset: z.number().int().nonnegative(),
58
+ limit: z.number().int().positive(),
59
+ });
60
+ /** Caller-selected projection of already completed analysis Evidence. */
61
+ export const analysisViewRequestSchema = z.discriminatedUnion("kind", [
62
+ summaryViewSchema,
63
+ facetViewSchema,
64
+ itemViewSchema,
65
+ pageViewSchema,
66
+ ]);
67
+ /** Inline Evidence or an exact same-session retained reference. */
68
+ export const analysisViewSourceSchema = z.discriminatedUnion("kind", [
69
+ z.strictObject({
70
+ kind: z.literal("retained-evidence"),
71
+ evidence_id: prefixedDigestSchema("ev"),
72
+ }),
73
+ z.strictObject({
74
+ kind: z.literal("inline"),
75
+ evidence: evidenceSchema,
76
+ }),
77
+ ]);
78
+ /** Public inspect_analysis_view input. */
79
+ export const inspectAnalysisViewInputSchema = z.strictObject({
80
+ source: analysisViewSourceSchema,
81
+ view: analysisViewRequestSchema,
82
+ });
83
+ const coverageSchema = z.strictObject({
84
+ status: z.enum(["complete-within-view", "page", "empty"]),
85
+ examined: z.number().int().nonnegative(),
86
+ total: z.number().int().nonnegative(),
87
+ next_offset: z.number().int().nonnegative().nullable(),
88
+ exhausted: z.boolean(),
89
+ });
90
+ const artifactSchema = z.strictObject({
91
+ path: z.string().min(1),
92
+ sha256: digestSchema,
93
+ });
94
+ const layoutSummarySchema = z.strictObject({
95
+ bytes: z.number().int().nonnegative(),
96
+ format: z.literal("elf"),
97
+ architecture: z.strictObject({
98
+ machine: z.literal("EM_X86_64"),
99
+ bits: z.literal(64),
100
+ byte_order: z.literal("little"),
101
+ }),
102
+ image_type: z.enum(["ET_EXEC", "ET_DYN", "ET_REL"]),
103
+ entry: z.strictObject({
104
+ reported_value: z.string().min(1),
105
+ meaning: z.enum(["linked-virtual-address", "not-applicable", "absent"]),
106
+ execution_status: z.literal("unknown"),
107
+ }),
108
+ counts: z.strictObject({
109
+ sections: z.number().int().nonnegative(),
110
+ segments: z.number().int().nonnegative(),
111
+ symbols: z.number().int().nonnegative(),
112
+ relocations: z.number().int().nonnegative(),
113
+ }),
114
+ limitation_count: z.number().int().nonnegative(),
115
+ });
116
+ const javascriptSummarySchema = z.strictObject({
117
+ input_path: z.string().min(1),
118
+ format: z.enum(["asar", "directory"]),
119
+ root_artifact_sha256: digestSchema,
120
+ statistics: jsonObjectSchema,
121
+ electron: jsonObjectSchema,
122
+ coverage: jsonObjectSchema,
123
+ limitation_count: z.number().int().nonnegative(),
124
+ });
125
+ const viewResultBase = {
126
+ parent_evidence_id: prefixedDigestSchema("ev"),
127
+ parent_operation: z.enum([
128
+ "inspect_binary_layout",
129
+ "analyze_javascript_application",
130
+ ]),
131
+ parent_digest: digestSchema,
132
+ view_digest: digestSchema,
133
+ artifact: artifactSchema,
134
+ coverage: coverageSchema,
135
+ limitations: z.array(z.string()),
136
+ unknowns: z.array(z.string()),
137
+ };
138
+ /** Projected facts for one selected view of retained analysis Evidence. */
139
+ export const analysisViewResultSchema = z.discriminatedUnion("kind", [
140
+ z.strictObject({
141
+ kind: z.literal("summary"),
142
+ view: summaryViewSchema,
143
+ summary: z.union([layoutSummarySchema, javascriptSummarySchema]),
144
+ ...viewResultBase,
145
+ }),
146
+ z.strictObject({
147
+ kind: z.literal("facet"),
148
+ view: facetViewSchema,
149
+ facet: jsonValueSchema,
150
+ ...viewResultBase,
151
+ }),
152
+ z.strictObject({
153
+ kind: z.literal("item"),
154
+ view: itemViewSchema,
155
+ item: jsonValueSchema,
156
+ ...viewResultBase,
157
+ }),
158
+ z.strictObject({
159
+ kind: z.literal("page"),
160
+ view: pageViewSchema,
161
+ items: z.array(jsonValueSchema),
162
+ ...viewResultBase,
163
+ }),
164
+ ]);
165
+ /** Construct a typed input failure for one selected-view constraint. */
166
+ export const analysisViewInputError = (issues) => new AnalysisInputError(INSPECT_ANALYSIS_VIEW_OPERATION, undefined, issues);
167
+ /** SHA-256 of the canonical projected JSON, excluding this digest field. */
168
+ export const analysisViewDigest = (projection) => digestCanonicalValue(projection, "Analysis view");
169
+ /** Attach the content digest that must change when projected bytes change. */
170
+ export const sealAnalysisView = (projection) => analysisViewResultSchema.parse({
171
+ ...projection,
172
+ view_digest: analysisViewDigest(projection),
173
+ });
174
+ const parentDigest = (evidenceId) => evidenceId.slice(3);
175
+ const parseJavaScriptParent = (input) => {
176
+ try {
177
+ // Only the existing realm-private graph proofs permit reuse. Imported or
178
+ // merely frozen graphs still receive full canonical validation.
179
+ const steps = parseOwnedJavaScriptApplicationAnalysisSteps(input);
180
+ let step = steps.next();
181
+ while (!step.done)
182
+ step = steps.next();
183
+ return ok(step.value);
184
+ }
185
+ catch (cause) {
186
+ if (!(cause instanceof z.ZodError))
187
+ throw cause;
188
+ return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues.map((issue) => ({
189
+ ...issue,
190
+ path: ["source", "normalized_result", ...issue.path],
191
+ })), { source: { normalized_result: input } }, { cause }));
192
+ }
193
+ };
194
+ const unsupportedParent = (parent) => new AnalysisUnsupportedTargetError(INSPECT_ANALYSIS_VIEW_OPERATION, parentArtifactPath(parent), `Parent Evidence operation ${JSON.stringify(parent.operation)} is not inspect_binary_layout or analyze_javascript_application.`);
195
+ const parentArtifactPath = (parent) => {
196
+ if (typeof parent.normalizedResult === "object" &&
197
+ parent.normalizedResult !== null &&
198
+ "artifact" in parent.normalizedResult &&
199
+ typeof parent.normalizedResult.artifact === "object" &&
200
+ parent.normalizedResult.artifact !== null &&
201
+ "path" in parent.normalizedResult.artifact &&
202
+ typeof parent.normalizedResult.artifact.path === "string")
203
+ return parent.normalizedResult.artifact.path;
204
+ if (typeof parent.normalizedResult === "object" &&
205
+ parent.normalizedResult !== null &&
206
+ "input_path" in parent.normalizedResult &&
207
+ typeof parent.normalizedResult.input_path === "string")
208
+ return parent.normalizedResult.input_path;
209
+ return parent.evidenceId;
210
+ };
211
+ /** Project one selected view from authenticated parent analysis Evidence. */
212
+ export const projectAnalysisView = (parent, view) => {
213
+ const digest = parentDigest(parent.evidenceId);
214
+ if (!digestSchema.safeParse(digest).success)
215
+ return err(analysisViewInputError([
216
+ {
217
+ path: ["source"],
218
+ reason: "invalid_format",
219
+ message: "Parent Evidence ID is not a digest-backed identifier.",
220
+ },
221
+ ]));
222
+ if (parent.operation === "inspect_binary_layout") {
223
+ const layout = binaryLayoutSchema.safeParse(parent.normalizedResult);
224
+ if (!layout.success)
225
+ return err(analysisViewInputError([
226
+ {
227
+ path: ["source"],
228
+ reason: "invalid_value",
229
+ message: "Parent Evidence result does not match inspect_binary_layout.",
230
+ },
231
+ ]));
232
+ const projected = projectBinaryLayoutView(parent, layout.data, view);
233
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
234
+ }
235
+ if (parent.operation === "analyze_javascript_application") {
236
+ const analysis = parseJavaScriptParent(parent.normalizedResult);
237
+ if (!analysis.ok)
238
+ return analysis;
239
+ const projected = projectJavaScriptApplicationView(parent, analysis.value, view);
240
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
241
+ }
242
+ return err(unsupportedParent(parent));
243
+ };
@@ -0,0 +1,19 @@
1
+ /** Coverage for a summary, facet, or single selected object. */
2
+ export const completeWithinViewCoverage = (examined, total) => ({
3
+ status: "complete-within-view",
4
+ examined,
5
+ total,
6
+ next_offset: null,
7
+ exhausted: true,
8
+ });
9
+ /** Coverage for a stable page, including an offset past the collection. */
10
+ export const pageViewCoverage = (offset, examined, total) => {
11
+ const exhausted = offset >= total || offset + examined >= total;
12
+ return {
13
+ status: examined === 0 ? "empty" : "page",
14
+ examined,
15
+ total,
16
+ next_offset: exhausted ? null : offset + examined,
17
+ exhausted,
18
+ };
19
+ };