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
@@ -2,62 +2,69 @@ import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/manage
2
2
  import {} from "./ManagedMetadataLayout.js";
3
3
  import { metadataRowCursor, metadataCodedToken, metadataCodedTokenInvalidReason, metadataToken, readMetadataString, } from "./ManagedMetadataHeaps.js";
4
4
  import { managedTableRowCounts } from "./ManagedMetadataInventory.js";
5
+ import { readManagedValue } from "./ManagedReaderFailure.js";
5
6
  const flagsHex = (value) => `0x${value.toString(16).padStart(4, "0")}`;
6
- export const parseModuleRefs = (bytes, layout, heapExtent) => {
7
+ export const parseModuleRefs = (bytes, layout, heapExtent, issues) => {
7
8
  const refs = [];
8
9
  const table = layout.table(26);
9
10
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
10
- const cursor = metadataRowCursor(bytes, layout, 26, row);
11
- refs.push({
12
- token: metadataToken(26, row),
13
- row_offset: cursor.start,
14
- name: readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent),
15
- });
11
+ readManagedValue(() => {
12
+ const cursor = metadataRowCursor(bytes, layout, 26, row);
13
+ refs.push({
14
+ token: metadataToken(26, row),
15
+ row_offset: cursor.start,
16
+ name: readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent),
17
+ });
18
+ }, issues);
16
19
  }
17
20
  return refs;
18
21
  };
19
- export const parseFields = (bytes, layout, heapExtent) => {
22
+ export const parseFields = (bytes, layout, heapExtent, issues) => {
20
23
  const fields = new Map();
21
24
  const table = layout.table(4);
22
25
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
23
- const cursor = metadataRowCursor(bytes, layout, 4, row);
24
- const flags = cursor.readUInt16();
25
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
26
- cursor.readIndex(layout.blobIndexSize);
27
- const token = metadataToken(4, row);
28
- fields.set(token, {
29
- token,
30
- rowOffset: cursor.start,
31
- kind: "field",
32
- name,
33
- flags,
34
- implFlags: null,
35
- rva: null,
36
- });
26
+ readManagedValue(() => {
27
+ const cursor = metadataRowCursor(bytes, layout, 4, row);
28
+ const flags = cursor.readUInt16();
29
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
30
+ cursor.readIndex(layout.blobIndexSize);
31
+ const token = metadataToken(4, row);
32
+ fields.set(token, {
33
+ token,
34
+ rowOffset: cursor.start,
35
+ kind: "field",
36
+ name,
37
+ flags,
38
+ implFlags: null,
39
+ rva: null,
40
+ });
41
+ }, issues);
37
42
  }
38
43
  return fields;
39
44
  };
40
- export const parseMethods = (bytes, layout, heapExtent) => {
45
+ export const parseMethods = (bytes, layout, heapExtent, issues) => {
41
46
  const methods = new Map();
42
47
  const table = layout.table(6);
43
48
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
44
- const cursor = metadataRowCursor(bytes, layout, 6, row);
45
- const rva = cursor.readUInt32();
46
- const implFlags = cursor.readUInt16();
47
- const flags = cursor.readUInt16();
48
- const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
49
- cursor.readIndex(layout.blobIndexSize);
50
- cursor.readIndex(layout.tableIndexSize(8));
51
- const token = metadataToken(6, row);
52
- methods.set(token, {
53
- token,
54
- rowOffset: cursor.start,
55
- kind: "method",
56
- name,
57
- flags,
58
- implFlags,
59
- rva,
60
- });
49
+ readManagedValue(() => {
50
+ const cursor = metadataRowCursor(bytes, layout, 6, row);
51
+ const rva = cursor.readUInt32();
52
+ const implFlags = cursor.readUInt16();
53
+ const flags = cursor.readUInt16();
54
+ const name = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
55
+ cursor.readIndex(layout.blobIndexSize);
56
+ cursor.readIndex(layout.tableIndexSize(8));
57
+ const token = metadataToken(6, row);
58
+ methods.set(token, {
59
+ token,
60
+ rowOffset: cursor.start,
61
+ kind: "method",
62
+ name,
63
+ flags,
64
+ implFlags,
65
+ rva,
66
+ });
67
+ }, issues);
61
68
  }
62
69
  return methods;
63
70
  };
@@ -66,46 +73,60 @@ export const parseImplMaps = ({ bytes, layout, heapExtent, modules, members, iss
66
73
  const imports = [];
67
74
  const table = layout.table(28);
68
75
  for (let row = 1; row <= (table?.rowCount ?? 0); row += 1) {
69
- const cursor = metadataRowCursor(bytes, layout, 28, row);
70
- const mappingFlags = cursor.readUInt16();
71
- const memberForwardedOffset = cursor.offset;
72
- const memberForwardedRaw = cursor.readIndex(layout.codedIndexSize("MemberForwarded"));
73
- const memberForwardedReason = metadataCodedTokenInvalidReason(memberForwardedRaw, 1, [4, 6], layout.rowCounts);
74
- if (memberForwardedReason !== null || memberForwardedRaw === 0)
75
- issues.push({
76
- code: "invalid-row",
77
- scope: `metadata.ImplMap:${metadataToken(28, row)}`,
78
- offset: memberForwardedOffset,
79
- detail: memberForwardedReason === null
80
- ? "ImplMap MemberForwarded coded index 0x0 is null, but the column must reference a Field or MethodDef row"
81
- : `ImplMap MemberForwarded coded index 0x${memberForwardedRaw.toString(16)} is invalid: ${memberForwardedReason}`,
76
+ readManagedValue(() => {
77
+ const cursor = metadataRowCursor(bytes, layout, 28, row);
78
+ const mappingFlags = cursor.readUInt16();
79
+ const memberForwardedOffset = cursor.offset;
80
+ const memberForwardedRaw = cursor.readIndex(layout.codedIndexSize("MemberForwarded"));
81
+ const memberForwardedReason = metadataCodedTokenInvalidReason(memberForwardedRaw, 1, [4, 6], layout.rowCounts);
82
+ if (memberForwardedReason !== null || memberForwardedRaw === 0)
83
+ issues.push({
84
+ code: "invalid-row",
85
+ scope: `metadata.ImplMap:${metadataToken(28, row)}`,
86
+ offset: memberForwardedOffset,
87
+ detail: memberForwardedReason === null
88
+ ? "ImplMap MemberForwarded coded index 0x0 is null, but the column must reference a Field or MethodDef row"
89
+ : `ImplMap MemberForwarded coded index 0x${memberForwardedRaw.toString(16)} is invalid: ${memberForwardedReason}`,
90
+ });
91
+ const memberToken = metadataCodedToken(memberForwardedRaw, 1, [4, 6], layout.rowCounts);
92
+ const importName = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
93
+ const importScopeOffset = cursor.offset;
94
+ const importScopeRow = cursor.readIndex(layout.tableIndexSize(26));
95
+ const moduleCount = layout.table(26)?.rowCount ?? 0;
96
+ const validImportScope = importScopeRow > 0 && importScopeRow <= moduleCount;
97
+ if (!validImportScope)
98
+ issues.push({
99
+ code: "invalid-row",
100
+ scope: `metadata.ImplMap:${metadataToken(28, row)}`,
101
+ offset: importScopeOffset,
102
+ detail: `ImplMap ImportScope row ${String(importScopeRow)} must reference a ModuleRef row between 1 and ${String(moduleCount)}`,
103
+ });
104
+ const importScopeToken = validImportScope
105
+ ? metadataToken(26, importScopeRow)
106
+ : null;
107
+ const member = memberToken === null ? undefined : members.get(memberToken);
108
+ imports.push({
109
+ token: metadataToken(28, row),
110
+ row_offset: cursor.start,
111
+ mapping_flags: mappingFlags,
112
+ mapping_flags_hex: flagsHex(mappingFlags),
113
+ member_token: memberToken,
114
+ member_kind: member?.kind ?? "unknown",
115
+ member_name: member?.name ?? null,
116
+ import_name: importName,
117
+ import_scope_token: importScopeToken,
118
+ import_scope_name: importScopeToken === null
119
+ ? null
120
+ : (moduleNames.get(importScopeToken)?.name ?? null),
121
+ no_mangle: (mappingFlags & 0x0001) !== 0,
122
+ char_set: charSet(mappingFlags),
123
+ call_convention: callConvention(mappingFlags),
124
+ supports_last_error: (mappingFlags & 0x0040) !== 0,
125
+ best_fit: bestFit(mappingFlags),
126
+ throw_on_unmappable_char: throwOnUnmappable(mappingFlags),
127
+ verification: "managed-declaration-only",
82
128
  });
83
- const memberToken = metadataCodedToken(memberForwardedRaw, 1, [4, 6], layout.rowCounts);
84
- const importName = readMetadataString(bytes, layout, cursor.readIndex(layout.stringIndexSize), heapExtent);
85
- const importScopeRow = cursor.readIndex(layout.tableIndexSize(26));
86
- const importScopeToken = importScopeRow === 0 ? null : metadataToken(26, importScopeRow);
87
- const member = memberToken === null ? undefined : members.get(memberToken);
88
- imports.push({
89
- token: metadataToken(28, row),
90
- row_offset: cursor.start,
91
- mapping_flags: mappingFlags,
92
- mapping_flags_hex: flagsHex(mappingFlags),
93
- member_token: memberToken,
94
- member_kind: member?.kind ?? "unknown",
95
- member_name: member?.name ?? null,
96
- import_name: importName,
97
- import_scope_token: importScopeToken,
98
- import_scope_name: importScopeToken === null
99
- ? null
100
- : (moduleNames.get(importScopeToken)?.name ?? null),
101
- no_mangle: (mappingFlags & 0x0001) !== 0,
102
- char_set: charSet(mappingFlags),
103
- call_convention: callConvention(mappingFlags),
104
- supports_last_error: (mappingFlags & 0x0040) !== 0,
105
- best_fit: bestFit(mappingFlags),
106
- throw_on_unmappable_char: throwOnUnmappable(mappingFlags),
107
- verification: "managed-declaration-only",
108
- });
129
+ }, issues);
109
130
  }
110
131
  return imports;
111
132
  };
@@ -168,6 +189,8 @@ const throwOnUnmappable = (flags) => {
168
189
  export const nativeImplementations = (methods, pinvokeTokens) => {
169
190
  const implementations = [];
170
191
  for (const method of methods) {
192
+ if (method.kind !== "method")
193
+ continue;
171
194
  const implFlags = method.implFlags ?? 0;
172
195
  const codeType = codeTypeFor(implFlags);
173
196
  const managedKind = managedKindFor(implFlags);
@@ -229,19 +252,9 @@ const boundaryKind = (pinvokeDeclared, codeType, managedKind) => {
229
252
  return "unmanaged-method";
230
253
  return "mixed-or-unknown";
231
254
  };
232
- /** CLI header facets of a PE without an admitted CLI header. */
233
- export const NO_CLI_NATIVE = {
234
- il_only: false,
235
- requires_32bit: false,
236
- strong_name_signed: false,
237
- native_entry_point: false,
238
- ready_to_run_signature: false,
239
- managed_native_header_rva: 0,
240
- managed_native_header_size: 0,
241
- };
242
255
  export const cliNative = (pe) => {
243
256
  if (pe.cli === null)
244
- return NO_CLI_NATIVE;
257
+ return null;
245
258
  return {
246
259
  il_only: (pe.cli.flags & 0x0000_0001) !== 0,
247
260
  requires_32bit: (pe.cli.flags & 0x0000_0002) !== 0,
@@ -255,10 +268,12 @@ export const cliNative = (pe) => {
255
268
  /** Summarize declaration counts with the native facets of the CLI header. */
256
269
  export const nativeBoundarySummary = (native, counts) => ({
257
270
  ...counts,
258
- ready_to_run: native.ready_to_run_signature,
259
- mixed_mode_or_native_header: native.managed_native_header_rva !== 0 ||
260
- native.managed_native_header_size !== 0 ||
261
- native.native_entry_point,
271
+ ready_to_run: native?.ready_to_run_signature ?? null,
272
+ mixed_mode_or_native_header: native === null
273
+ ? null
274
+ : native.managed_native_header_rva !== 0 ||
275
+ native.managed_native_header_size !== 0 ||
276
+ native.native_entry_point,
262
277
  });
263
278
  export const buildNativeBoundaryInspection = ({ target, bytes, layout, inventory, moduleRefs, imports, implementations, native, issues, }) => managedNativeBoundaryInspectionSchema.parse({
264
279
  artifact: {
@@ -1,16 +1,15 @@
1
1
  import { managedNativeBoundaryInspectionSchema, } from "../domain/managed/managedArtifact.js";
2
- import { readManagedMetadataInventory, } from "./ManagedMetadataInventory.js";
2
+ import { readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
3
3
  import { readManagedMetadataLayout, } from "./ManagedMetadataLayout.js";
4
4
  import { readManagedPeLayout, } from "./ManagedPeReader.js";
5
5
  import { ManagedReaderFailure } from "./ManagedReaderFailure.js";
6
- import { buildNativeBoundaryInspection, cliNative, NO_CLI_NATIVE, nativeBoundarySummary, nativeImplementations, parseFields, parseImplMaps, parseMethods, parseModuleRefs, } from "./ManagedNativeBoundaryHelpers.js";
6
+ import { buildNativeBoundaryInspection, cliNative, nativeBoundarySummary, nativeImplementations, parseFields, parseImplMaps, parseMethods, parseModuleRefs, } from "./ManagedNativeBoundaryHelpers.js";
7
7
  /**
8
8
  * Report a PE whose CLI metadata is absent or cannot be admitted. `native`
9
9
  * holds the CLI header facts when the header itself was admitted; otherwise
10
10
  * the header is absent (`not-managed`) or unreadable (`malformed`).
11
11
  */
12
12
  const emptyInspection = (target, bytes, classification, { native = null, issues = [], } = {}) => {
13
- const header = native ?? NO_CLI_NATIVE;
14
13
  return managedNativeBoundaryInspectionSchema.parse({
15
14
  artifact: {
16
15
  path: target.path,
@@ -29,11 +28,11 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
29
28
  requires_artifact_sha256: target.sha256,
30
29
  requires_mvid: null,
31
30
  },
32
- cli_native: header,
31
+ cli_native: native,
33
32
  module_refs: [],
34
33
  pinvoke_imports: [],
35
34
  native_implementations: [],
36
- summary: nativeBoundarySummary(header, {
35
+ summary: nativeBoundarySummary(native, {
37
36
  module_ref_count: 0,
38
37
  pinvoke_import_count: 0,
39
38
  native_implementation_count: 0,
@@ -41,23 +40,14 @@ const emptyInspection = (target, bytes, classification, { native = null, issues
41
40
  coverage: { state: "unavailable", issues },
42
41
  limitations: [
43
42
  "No CLI metadata was admitted; native boundary declarations are unavailable.",
44
- ...(native === null && classification === "malformed"
45
- ? [
46
- "The CLI header was not admitted, so cli_native and the summary's ready_to_run and mixed_mode_or_native_header values are defaults, not observations.",
47
- ]
48
- : []),
49
43
  "Static inspection does not load or execute target code, so native export resolution is not performed.",
50
44
  ],
51
45
  });
52
46
  };
53
- const readBoundaryInventory = (bytes, pe, cli) => {
47
+ const readBoundaryInventory = (bytes, pe, cli, issues) => {
54
48
  const metadataOffset = pe.rvaToOffset(cli.metadata.rva, cli.metadata.size, "cli.metadata");
55
49
  const layout = readManagedMetadataLayout(bytes, metadataOffset, cli.metadata.size);
56
- const resourceDirectory = {
57
- offset: pe.rvaToOffset(cli.resources.rva, cli.resources.size, "cli.resources"),
58
- size: cli.resources.size,
59
- };
60
- const inventory = readManagedMetadataInventory(bytes, layout, resourceDirectory);
50
+ const inventory = readManagedMetadataInventory(bytes, layout, readManagedResourceDirectory(pe, issues));
61
51
  return { layout, inventory };
62
52
  };
63
53
  /** Inspect managed/native boundary declarations from PE metadata without execution. */
@@ -75,10 +65,11 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
75
65
  }
76
66
  if (pe.cli === null)
77
67
  return emptyInspection(target, bytes, pe.cliDirectoryPresent ? "malformed" : "not-managed", { issues: pe.cliIssue === null ? [] : [pe.cliIssue] });
68
+ const issues = [];
78
69
  let layout;
79
70
  let inventory;
80
71
  try {
81
- ({ layout, inventory } = readBoundaryInventory(bytes, pe, pe.cli));
72
+ ({ layout, inventory } = readBoundaryInventory(bytes, pe, pe.cli, issues));
82
73
  }
83
74
  catch (cause) {
84
75
  if (!(cause instanceof ManagedReaderFailure))
@@ -89,11 +80,11 @@ export const inspectManagedNativeBoundariesBytes = (bytes, target) => {
89
80
  });
90
81
  }
91
82
  const heapExtent = Math.max(layout.strings.size, layout.blob.size);
92
- const issues = [...inventory.issues];
93
- const moduleRefs = parseModuleRefs(bytes, layout, heapExtent);
83
+ issues.push(...inventory.issues);
84
+ const moduleRefs = parseModuleRefs(bytes, layout, heapExtent, issues);
94
85
  const members = new Map([
95
- ...parseFields(bytes, layout, heapExtent),
96
- ...parseMethods(bytes, layout, heapExtent),
86
+ ...parseFields(bytes, layout, heapExtent, issues),
87
+ ...parseMethods(bytes, layout, heapExtent, issues),
97
88
  ]);
98
89
  const imports = parseImplMaps({
99
90
  bytes,
@@ -8,3 +8,19 @@ export class ManagedReaderFailure extends Error {
8
8
  }
9
9
  /** Construct a typed managed parse failure at an exact byte location. */
10
10
  export const managedFailure = (code, scope, detail, offset = null) => new ManagedReaderFailure({ code, scope, offset, detail });
11
+ /** Retain one malformed item's location while allowing independent items to be read. */
12
+ export const readManagedValue = (operation, issues) => {
13
+ try {
14
+ return operation();
15
+ }
16
+ catch (cause) {
17
+ if (!(cause instanceof ManagedReaderFailure))
18
+ throw cause;
19
+ issues.push(cause.issue);
20
+ return undefined;
21
+ }
22
+ };
23
+ /** Preserve issue order while collapsing the same malformed producer fact across facets. */
24
+ export const uniqueManagedParseIssues = (issues) => [
25
+ ...new Map(issues.map((issue) => [JSON.stringify(issue), issue])).values(),
26
+ ];
@@ -3,7 +3,7 @@ import { createReadStream } from "node:fs";
3
3
  import { readFile } from "node:fs/promises";
4
4
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
5
5
  import { MANAGED_STATIC_PROVIDER_IDENTITY as IDENTITY, managedStaticCapabilities, } from "./ManagedStaticProviderMetadata.js";
6
- import { MANAGED_TOOL_CONTRACTS, managedArtifactInputSchema, managedMemberInputSchema, managedNativeBoundaryInputSchema, } from "../contracts/managed/managedToolContracts.js";
6
+ import { MANAGED_TOOL_CONTRACTS, managedTargetInputSchema, } from "../contracts/managed/managedToolContracts.js";
7
7
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../domain/analysisErrorCore.js";
8
8
  import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
9
9
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
@@ -66,7 +66,7 @@ class ManagedStaticClient {
66
66
  }
67
67
  close() {
68
68
  this.#snapshotBytes = undefined;
69
- return Promise.resolve();
69
+ return Promise.resolve(ok(null));
70
70
  }
71
71
  }
72
72
  const readManagedSnapshot = async (path, signal) => {
@@ -93,15 +93,13 @@ const hashManagedSource = async (path, signal) => {
93
93
  };
94
94
  const isManagedOperation = (operation) => MANAGED_TOOL_CONTRACTS.some(({ name }) => name === operation);
95
95
  const inspectManagedOperation = (operation, parameters, bytes, target) => {
96
+ managedTargetInputSchema.parse(parameters);
96
97
  if (operation === "inspect_managed_artifact") {
97
- managedArtifactInputSchema.parse(parameters);
98
98
  return inspectManagedArtifactBytes(bytes, target);
99
99
  }
100
100
  if (operation === "inspect_managed_native_boundaries") {
101
- managedNativeBoundaryInputSchema.parse(parameters);
102
101
  return inspectManagedNativeBoundariesBytes(bytes, target);
103
102
  }
104
- managedMemberInputSchema.parse(parameters);
105
103
  return inspectManagedMembersBytes(bytes, target);
106
104
  };
107
105
  const managedLocations = (result) => {
@@ -0,0 +1,250 @@
1
+ import { createHash } from "node:crypto";
2
+ import { cp, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { createPackage } from "@electron/asar";
5
+ import { javascriptApplicationAnalysisResultSchema } from "../domain/javascript/javascriptApplicationAnalysis.js";
6
+ import { javaScriptExportShapeComparisonResultSchema } from "../domain/javascript/javascriptExportShapeComparisonSchemas.js";
7
+ const desktopFixtureFiles = {
8
+ "package.json": `${JSON.stringify({ name: "desktop-fixture", version: "1.0.0", main: "main.js" }, null, 2)}\n`,
9
+ "main.js": 'const { BrowserWindow, ipcMain } = require("electron");\nnew BrowserWindow({ webPreferences: { preload: require("node:path").join(__dirname, "preload.js"), contextIsolation: true, sandbox: true } });\nipcMain.handle("profile:read", (_event, id) => ({ id }));\n',
10
+ "preload.js": 'const { contextBridge, ipcRenderer } = require("electron");\ncontextBridge.exposeInMainWorld("profileApi", { read: (id) => ipcRenderer.invoke("profile:read", id) });\n',
11
+ "renderer/app.js": 'globalThis.profileApi.read("fixture");\n',
12
+ };
13
+ /** Materialize the exact packaged and source-owned parser targets used by the runner. */
14
+ export const createAgentEvaluationFixtures = async (root, repositoryRoot) => {
15
+ const desktop = join(root, "desktop-app");
16
+ const javascript = join(root, "desktop-app.asar");
17
+ const javascriptShapeLeft = join(root, "parser-v1");
18
+ const javascriptShapeRight = join(root, "parser-v2");
19
+ await Promise.all([
20
+ mkdir(join(desktop, "renderer"), { recursive: true }),
21
+ mkdir(javascriptShapeLeft, { recursive: true }),
22
+ mkdir(javascriptShapeRight, { recursive: true }),
23
+ ]);
24
+ await Promise.all([
25
+ ...Object.entries(desktopFixtureFiles).map(([path, source]) => writeFile(join(desktop, path), source)),
26
+ cp(join(repositoryRoot, "tests/fixtures/replay/parser.mjs"), join(javascriptShapeLeft, "parser.mjs")),
27
+ cp(join(repositoryRoot, "tests/fixtures/replay/parser-v2.mjs"), join(javascriptShapeRight, "parser.mjs")),
28
+ ]);
29
+ await createPackage(desktop, javascript);
30
+ return {
31
+ javascript,
32
+ javascriptSha256: createHash("sha256")
33
+ .update(await readFile(javascript))
34
+ .digest("hex"),
35
+ javascriptShapeLeft,
36
+ javascriptShapeRight,
37
+ };
38
+ };
39
+ const singleObservation = (value, kind, include = () => true) => {
40
+ const result = javascriptApplicationAnalysisResultSchema.safeParse(value);
41
+ if (!result.success)
42
+ return undefined;
43
+ const candidates = result.data.graph.nodes
44
+ .filter((node) => node.kind === kind)
45
+ .flatMap((node) => node.observations)
46
+ .filter(include);
47
+ return candidates.length === 1 ? candidates[0] : undefined;
48
+ };
49
+ const observationSource = (observation) => {
50
+ const location = observation.evidence.location;
51
+ return location.available && location.value.kind === "source-range"
52
+ ? location.value.source
53
+ : undefined;
54
+ };
55
+ const rendererApi = (value) => {
56
+ const observation = singleObservation(value, "context-bridge-api");
57
+ if (observation === undefined)
58
+ return undefined;
59
+ const { api_key: key, members, world } = observation.properties;
60
+ const source = observationSource(observation);
61
+ if (key === undefined ||
62
+ members === undefined ||
63
+ world === undefined ||
64
+ source === undefined)
65
+ return undefined;
66
+ return { key, members, world, source };
67
+ };
68
+ const ipcOperation = (side) => (value) => {
69
+ const observation = singleObservation(value, "ipc-channel", (candidate) => candidate.properties.side === side);
70
+ if (observation === undefined)
71
+ return undefined;
72
+ const { channel, operation } = observation.properties;
73
+ const source = observationSource(observation);
74
+ if (channel === undefined ||
75
+ operation === undefined ||
76
+ source === undefined)
77
+ return undefined;
78
+ return { channel, operation, source };
79
+ };
80
+ const preload = (value) => {
81
+ const observation = singleObservation(value, "electron-preload", (candidate) => candidate.properties.mechanism === "BrowserWindow:webPreferences.preload");
82
+ const path = observation?.properties.resolved_path;
83
+ const resolutionStatus = observation?.properties.resolution_status;
84
+ if (path === undefined || resolutionStatus === undefined)
85
+ return undefined;
86
+ return { path, resolution_status: resolutionStatus };
87
+ };
88
+ const headingChange = (value) => {
89
+ const result = javaScriptExportShapeComparisonResultSchema.safeParse(value);
90
+ if (!result.success)
91
+ return undefined;
92
+ const changes = result.data.changes.filter((change) => change.path === "/depth");
93
+ const change = changes.length === 1 ? changes[0] : undefined;
94
+ if (change === undefined)
95
+ return undefined;
96
+ return {
97
+ status: change.status,
98
+ path: change.path,
99
+ discriminant: change.discriminant,
100
+ left: change.left,
101
+ right: change.right,
102
+ };
103
+ };
104
+ const comparisonCoverage = (value) => {
105
+ const result = javaScriptExportShapeComparisonResultSchema.safeParse(value);
106
+ if (!result.success)
107
+ return undefined;
108
+ return {
109
+ status: result.data.coverage.status,
110
+ paired_variants: result.data.coverage.paired_variants,
111
+ ...result.data.summary,
112
+ };
113
+ };
114
+ const runtimeSemantics = (value) => {
115
+ const result = javaScriptExportShapeComparisonResultSchema.safeParse(value);
116
+ return result.success &&
117
+ result.data.limitations.includes("Return shapes are inferred from inert syntax and do not prove runtime behavior.")
118
+ ? "not_established"
119
+ : undefined;
120
+ };
121
+ const asarClaims = (targets) => {
122
+ const source = {
123
+ operation: "analyze_javascript_application",
124
+ authority: "shipped-artifact",
125
+ confidence: "derived",
126
+ subject: { path: targets.javascript, sha256: targets.javascriptSha256 },
127
+ };
128
+ return [
129
+ {
130
+ id: "renderer_api",
131
+ expectedValue: {
132
+ key: "profileApi",
133
+ members: ["read"],
134
+ world: "main",
135
+ source: "preload.js",
136
+ },
137
+ source: { ...source, select: rendererApi },
138
+ },
139
+ {
140
+ id: "renderer_ipc",
141
+ expectedValue: {
142
+ channel: "profile:read",
143
+ operation: "invoke",
144
+ source: "preload.js",
145
+ },
146
+ source: { ...source, select: ipcOperation("renderer") },
147
+ },
148
+ {
149
+ id: "main_ipc",
150
+ expectedValue: {
151
+ channel: "profile:read",
152
+ operation: "handle",
153
+ source: "main.js",
154
+ },
155
+ source: { ...source, select: ipcOperation("main") },
156
+ },
157
+ {
158
+ id: "preload",
159
+ expectedValue: { path: "preload.js", resolution_status: "resolved" },
160
+ source: { ...source, select: preload },
161
+ },
162
+ ];
163
+ };
164
+ const parserClaims = (targets) => {
165
+ const source = {
166
+ operation: "compare_javascript_export_shapes",
167
+ authority: "analyst-inference",
168
+ confidence: "inferred",
169
+ parameters: {
170
+ left_module_path: "parser.mjs",
171
+ left_export_name: "default",
172
+ right_module_path: "parser.mjs",
173
+ right_export_name: "default",
174
+ },
175
+ linkedSubjects: [
176
+ {
177
+ operation: "analyze_javascript_application",
178
+ path: targets.javascriptShapeLeft,
179
+ },
180
+ {
181
+ operation: "analyze_javascript_application",
182
+ path: targets.javascriptShapeRight,
183
+ },
184
+ ],
185
+ };
186
+ return [
187
+ {
188
+ id: "heading_change",
189
+ expectedValue: {
190
+ status: "added",
191
+ path: "/depth",
192
+ discriminant: { path: "/type", value: "heading" },
193
+ left: { availability: "absent" },
194
+ right: { availability: "literal", value: 1 },
195
+ },
196
+ source: { ...source, select: headingChange },
197
+ },
198
+ {
199
+ id: "comparison_coverage",
200
+ expectedValue: {
201
+ status: "complete-within-inputs",
202
+ paired_variants: 3,
203
+ added: 1,
204
+ removed: 0,
205
+ changed: 0,
206
+ unknown: 0,
207
+ },
208
+ source: { ...source, select: comparisonCoverage },
209
+ },
210
+ {
211
+ id: "runtime_semantics",
212
+ expectedValue: "not_established",
213
+ source: { ...source, select: runtimeSemantics },
214
+ },
215
+ ];
216
+ };
217
+ /** Return the closed known-answer rubric, or undefined for routing-only scenarios. */
218
+ export const agentFixtureClaims = (scenarioId, targets) => {
219
+ if (scenarioId === "asar")
220
+ return asarClaims(targets);
221
+ if (scenarioId === "javascript-export-shape")
222
+ return parserClaims(targets);
223
+ return undefined;
224
+ };
225
+ const answerValueDescriptions = {
226
+ asar: [
227
+ 'renderer_api: {"key": string, "members": string[], "world": string, "source": string}, describing the exposed bridge API, its members, world, and source file.',
228
+ 'renderer_ipc: {"channel": string, "operation": string, "source": string}, describing the renderer-side IPC operation and its source file.',
229
+ 'main_ipc: {"channel": string, "operation": string, "source": string}, describing the main-side IPC operation and its source file.',
230
+ 'preload: {"path": string, "resolution_status": string}, describing the BrowserWindow-declared preload resolved within the shipped artifact.',
231
+ ],
232
+ "javascript-export-shape": [
233
+ 'heading_change: {"status": string, "path": string, "discriminant": object or null, "left": object, "right": object}, copying the exact heading-change fields from the comparison result.',
234
+ 'comparison_coverage: {"status": string, "paired_variants": number, "added": number, "removed": number, "changed": number, "unknown": number}, copying comparison coverage and summary counts.',
235
+ 'runtime_semantics: "established" or "not_established", stating whether the cited comparison establishes runtime behavior.',
236
+ ],
237
+ };
238
+ /** Describe the strict answer contract without revealing any golden fixture values. */
239
+ export const agentFixtureAnswerInstructions = (scenarioId) => {
240
+ const descriptions = answerValueDescriptions[scenarioId];
241
+ if (descriptions === undefined)
242
+ return "";
243
+ return [
244
+ "For this benchmark, return only one JSON object, without Markdown fences or surrounding prose.",
245
+ 'The exact shape is {"claims": [{"id": string, "value": JSON value, "evidence_id": string, "confidence": string, "authority": string}]}.',
246
+ "Include exactly one claim per ID below, without additional fields or claims. Infer values only from REA tool results; do not read target files directly.",
247
+ "Each evidence_id must identify the successful REA result that supports its claim. Copy confidence and authority from that result's Evidence envelope.",
248
+ ...descriptions,
249
+ ].join("\n");
250
+ };