rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -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
+ };
@@ -0,0 +1,28 @@
1
+ /** Require configured facts to pass while preserving workflow and execution gates. */
2
+ export const agentEvaluationPassed = (result) => result.exitCode === 0 &&
3
+ result.naturalUse &&
4
+ result.correctFirstTool &&
5
+ result.repeatedCallCount === 0 &&
6
+ result.inputValidationFailureCount === 0 &&
7
+ result.requiredToolSubsequenceMet &&
8
+ result.inputTokens > 0 &&
9
+ (result.factualCorrectness === "passed" ||
10
+ (result.factualCorrectness === "not_assessed" &&
11
+ result.answerHeuristicsMet &&
12
+ result.epistemicCuePresent));
13
+ /** Keep assessed fixture outcomes and scenarios without truth oracles distinct. */
14
+ export const summarizeFactualCorrectness = (results) => {
15
+ const passed = results.filter(({ factualCorrectness }) => factualCorrectness === "passed").length;
16
+ const failed = results.filter(({ factualCorrectness }) => factualCorrectness === "failed").length;
17
+ const status = failed > 0 ? "failed" : passed > 0 ? "passed" : "not_assessed";
18
+ return {
19
+ status,
20
+ scope: "configured_fixture_claims",
21
+ counts: {
22
+ assessed: passed + failed,
23
+ passed,
24
+ failed,
25
+ notAssessed: results.length - passed - failed,
26
+ },
27
+ };
28
+ };
@@ -1,3 +1,4 @@
1
+ import { evaluateKnownAnswers, } from "./KnownAnswerEvaluation.js";
1
2
  import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
2
3
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3
4
  const record = (value) => isRecord(value) ? value : undefined;
@@ -91,7 +92,7 @@ const consumeEvent = (state, value) => {
91
92
  state.cachedInputTokens = Math.max(state.cachedInputTokens, numberValue(usage?.cached_input_tokens));
92
93
  state.outputTokens = Math.max(state.outputTokens, numberValue(usage?.output_tokens));
93
94
  };
94
- /** Score agent routing, repetition, model usage, and epistemic completion. */
95
+ /** Measure agent routing, repetition, model usage, and explicitly limited answer heuristics. */
95
96
  export const evaluateCodexEvents = (events, expectedFirstTool, options = {}) => {
96
97
  const state = {
97
98
  calls: [],
@@ -118,8 +119,9 @@ export const evaluateCodexEvents = (events, expectedFirstTool, options = {}) =>
118
119
  ];
119
120
  const finalCitesEvidence = evidenceIds.some((evidenceId) => finalMessage.includes(evidenceId));
120
121
  const normalizedFinalMessage = finalMessage.toLocaleLowerCase("en-US");
121
- const contentCriteriaMet = (options.requiredAnswerTermGroups ?? []).every((terms) => terms.some((term) => normalizedFinalMessage.includes(term.toLocaleLowerCase("en-US"))));
122
- const authorityHonesty = /\b(evidence|observed|inferred|unknown|unavailable|limitation|authority|not configured|could not|requires approval)\b/iu.test(finalMessage);
122
+ const answerTermCoverageMet = (options.requiredAnswerTermGroups ?? []).every((terms) => terms.some((term) => normalizedFinalMessage.includes(term.toLocaleLowerCase("en-US"))));
123
+ const epistemicCuePresent = /\b(evidence|observed|inferred|unknown|unavailable|limitation|authority|not configured|could not|requires approval)\b/iu.test(finalMessage);
124
+ const factualAssessment = evaluateKnownAnswers(events, finalMessage, options.fixtureClaims);
123
125
  return {
124
126
  naturalUse: reaCalls.length > 0,
125
127
  correctFirstTool: reaCalls[0]?.tool === expectedFirstTool,
@@ -134,15 +136,17 @@ export const evaluateCodexEvents = (events, expectedFirstTool, options = {}) =>
134
136
  finalMessage,
135
137
  evidenceIds,
136
138
  finalCitesEvidence,
137
- contentCriteriaMet,
138
- completionQuality: finalMessage.trim().length >= 80 &&
139
- authorityHonesty &&
140
- contentCriteriaMet &&
139
+ answerTermCoverageMet,
140
+ answerHeuristicsMet: finalMessage.trim().length >= 80 &&
141
+ epistemicCuePresent &&
142
+ answerTermCoverageMet &&
141
143
  requiredToolSubsequenceMet &&
142
144
  (options.forbidInputValidationFailures !== true ||
143
145
  inputValidationFailureCount === 0) &&
144
146
  (options.requireEvidence !== true || finalCitesEvidence),
145
- authorityHonesty,
147
+ epistemicCuePresent,
148
+ factualCorrectness: factualAssessment.status,
149
+ factualAssessment,
146
150
  };
147
151
  };
148
152
  const containsOrderedSubsequence = (values, required) => {
@@ -0,0 +1,281 @@
1
+ import { visit } from "jsonc-parser";
2
+ import { z } from "zod";
3
+ import { parseEvidence } from "../domain/evidence.js";
4
+ import { jsonValueSchema } from "../domain/jsonValue.js";
5
+ import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
6
+ const authoritySchema = z.enum([
7
+ "shipped-artifact",
8
+ "controlled-replay",
9
+ "historical-reference",
10
+ "external-service",
11
+ "analyst-inference",
12
+ ]);
13
+ const confidenceSchema = z.enum(["observed", "derived", "inferred"]);
14
+ const subjectSchema = z.strictObject({
15
+ path: z.string().min(1),
16
+ sha256: z
17
+ .string()
18
+ .regex(/^[a-f0-9]{64}$/u)
19
+ .optional(),
20
+ });
21
+ const expectationSchema = z.strictObject({
22
+ id: z.string().min(1),
23
+ expectedValue: jsonValueSchema,
24
+ source: z.strictObject({
25
+ operation: z.string().min(1),
26
+ authority: authoritySchema,
27
+ confidence: confidenceSchema,
28
+ subject: subjectSchema.optional(),
29
+ parameters: z.record(z.string(), jsonValueSchema).optional(),
30
+ linkedSubjects: z
31
+ .array(subjectSchema.extend({ operation: z.string().min(1) }))
32
+ .optional(),
33
+ select: z.custom((value) => typeof value === "function"),
34
+ }),
35
+ });
36
+ const finalAnswerSchema = z.strictObject({
37
+ claims: z.array(z.strictObject({
38
+ id: z.string().min(1),
39
+ value: jsonValueSchema,
40
+ evidence_id: z.string().regex(/^ev_[a-f0-9]{64}$/u),
41
+ confidence: confidenceSchema,
42
+ authority: authoritySchema,
43
+ })),
44
+ });
45
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
46
+ const record = (value) => isRecord(value) ? value : undefined;
47
+ const canonicalValue = (value) => {
48
+ if (Array.isArray(value))
49
+ return value.map(canonicalValue);
50
+ if (value === null || typeof value !== "object")
51
+ return value;
52
+ return Object.fromEntries(Object.entries(value)
53
+ .sort(([left], [right]) => compareUnicodeCodePoints(left, right))
54
+ .map(([key, child]) => [key, canonicalValue(child)]));
55
+ };
56
+ const sameJson = (left, right) => {
57
+ const parsedLeft = jsonValueSchema.safeParse(left);
58
+ const parsedRight = jsonValueSchema.safeParse(right);
59
+ return (parsedLeft.success &&
60
+ parsedRight.success &&
61
+ JSON.stringify(canonicalValue(parsedLeft.data)) ===
62
+ JSON.stringify(canonicalValue(parsedRight.data)));
63
+ };
64
+ const parseClosedAnswer = (text) => {
65
+ const objects = [];
66
+ let invalid = false;
67
+ try {
68
+ visit(text, {
69
+ onObjectBegin: () => {
70
+ objects.push(new Set());
71
+ },
72
+ onObjectProperty: (key) => {
73
+ const keys = objects.at(-1);
74
+ if (keys === undefined || keys.has(key))
75
+ invalid = true;
76
+ keys?.add(key);
77
+ },
78
+ onObjectEnd: () => {
79
+ objects.pop();
80
+ },
81
+ onError: () => {
82
+ invalid = true;
83
+ },
84
+ }, {
85
+ disallowComments: true,
86
+ allowTrailingComma: false,
87
+ allowEmptyContent: false,
88
+ });
89
+ if (invalid)
90
+ return undefined;
91
+ // The JSON visitor checked syntax and duplicate members before JSON.parse can fold them.
92
+ return JSON.parse(text);
93
+ }
94
+ catch (error) {
95
+ // Syntax and nesting failures are malformed final-answer input, not an evaluation crash.
96
+ if (error instanceof SyntaxError || error instanceof RangeError)
97
+ return undefined;
98
+ throw error;
99
+ }
100
+ };
101
+ const consistentAliases = (value, left, right) => value[left] === undefined ||
102
+ value[right] === undefined ||
103
+ value[left] === value[right];
104
+ const completedCall = (event) => {
105
+ const value = record(event);
106
+ const item = value?.type === "item.completed"
107
+ ? record(value.item)
108
+ : value?.type === "mcp_tool_call" && value.status === "completed"
109
+ ? value
110
+ : undefined;
111
+ if (item?.type !== "mcp_tool_call")
112
+ return undefined;
113
+ const server = item.server ?? item.server_name;
114
+ if (typeof server !== "string" ||
115
+ server.toLowerCase() !== "rea" ||
116
+ (item.status !== undefined && item.status !== "completed") ||
117
+ (item.error !== undefined && item.error !== null))
118
+ return undefined;
119
+ if (!consistentAliases(item, "server", "server_name") ||
120
+ !consistentAliases(item, "tool", "name"))
121
+ return undefined;
122
+ return item;
123
+ };
124
+ const consistentJsonAliases = (value, left, right) => value[left] === undefined ||
125
+ value[left] === null ||
126
+ value[right] === undefined ||
127
+ value[right] === null ||
128
+ sameJson(value[left], value[right]);
129
+ const evidenceFromCall = (item) => {
130
+ if (!consistentJsonAliases(item, "result", "output"))
131
+ return undefined;
132
+ const result = record(item.result ?? item.output);
133
+ if (result === undefined ||
134
+ result.isError === true ||
135
+ (result.error !== undefined && result.error !== null))
136
+ return undefined;
137
+ const structured = record(result.structuredContent ?? result.structured_content);
138
+ if (structured === undefined ||
139
+ (structured.error !== undefined && structured.error !== null))
140
+ return undefined;
141
+ if (result.structuredContent !== undefined &&
142
+ result.structured_content !== undefined &&
143
+ !sameJson(result.structuredContent, result.structured_content))
144
+ return undefined;
145
+ let evidence;
146
+ try {
147
+ evidence = parseEvidence(structured);
148
+ }
149
+ catch {
150
+ // Transcript output is untrusted; invalid Evidence cannot support a claim.
151
+ return undefined;
152
+ }
153
+ if ((item.tool ?? item.name) !== evidence.operation)
154
+ return undefined;
155
+ return evidence;
156
+ };
157
+ const collectDeliveredEvidence = (events) => {
158
+ const records = new Map();
159
+ const conflicts = new Set();
160
+ for (const event of events) {
161
+ const item = completedCall(event);
162
+ if (item === undefined)
163
+ continue;
164
+ const evidence = evidenceFromCall(item);
165
+ if (evidence === undefined)
166
+ continue;
167
+ const previous = records.get(evidence.evidence_id);
168
+ if (previous !== undefined && !sameJson(previous, evidence))
169
+ conflicts.add(evidence.evidence_id);
170
+ else
171
+ records.set(evidence.evidence_id, evidence);
172
+ }
173
+ return { records, conflicts };
174
+ };
175
+ const matchesSubject = (evidence, expected) => evidence.subject?.local_path === expected.path &&
176
+ (expected.sha256 === undefined ||
177
+ evidence.subject.digest.sha256 === expected.sha256);
178
+ const matchesParameters = (evidence, expected) => expected === undefined ||
179
+ Object.entries(expected).every(([key, value]) => Object.hasOwn(evidence.parameters, key) &&
180
+ sameJson(evidence.parameters[key], value));
181
+ const matchesLinks = (evidence, source, delivered) => (source.linkedSubjects ?? []).every((expected) => evidence.evidence_links.some((id) => {
182
+ const linked = delivered.records.get(id);
183
+ return (linked !== undefined &&
184
+ !delivered.conflicts.has(id) &&
185
+ linked.operation === expected.operation &&
186
+ matchesSubject(linked, expected));
187
+ }));
188
+ const assessClaim = (expected, claim, delivered) => {
189
+ const failures = [];
190
+ if (claim === undefined)
191
+ return { id: expected.id, status: "failed", failures: ["claim_missing"] };
192
+ if (!sameJson(claim.value, expected.expectedValue))
193
+ failures.push("value_mismatch");
194
+ if (claim.confidence !== expected.source.confidence)
195
+ failures.push("claim_confidence_mismatch");
196
+ if (claim.authority !== expected.source.authority)
197
+ failures.push("claim_authority_mismatch");
198
+ const evidence = delivered.records.get(claim.evidence_id);
199
+ if (evidence === undefined)
200
+ failures.push("unknown_evidence");
201
+ else if (delivered.conflicts.has(claim.evidence_id))
202
+ failures.push("conflicting_evidence");
203
+ else {
204
+ if (evidence.operation !== expected.source.operation)
205
+ failures.push("source_operation_mismatch");
206
+ if (evidence.confidence !== expected.source.confidence)
207
+ failures.push("source_confidence_mismatch");
208
+ if (evidence.authority !== expected.source.authority)
209
+ failures.push("source_authority_mismatch");
210
+ if (expected.source.subject !== undefined &&
211
+ !matchesSubject(evidence, expected.source.subject))
212
+ failures.push("source_subject_mismatch");
213
+ if (!matchesParameters(evidence, expected.source.parameters))
214
+ failures.push("source_parameters_mismatch");
215
+ if (!matchesLinks(evidence, expected.source, delivered))
216
+ failures.push("source_links_mismatch");
217
+ try {
218
+ if (!sameJson(expected.source.select(evidence.normalized_result), expected.expectedValue))
219
+ failures.push("source_assertion_mismatch");
220
+ }
221
+ catch {
222
+ // Producer-specific selectors may reject malformed representations; preserve a failed assessment.
223
+ failures.push("selector_failed");
224
+ }
225
+ }
226
+ return {
227
+ id: expected.id,
228
+ status: failures.length === 0 ? "passed" : "failed",
229
+ failures,
230
+ };
231
+ };
232
+ /** Grade closed answers only against configured fixture truth and delivered authenticated Evidence. */
233
+ export const evaluateKnownAnswers = (events, finalMessage, expectations) => {
234
+ const scope = "configured_fixture_claims";
235
+ if (expectations === undefined)
236
+ return { scope, status: "not_assessed", manifestFailures: [], claims: [] };
237
+ const rubric = z.array(expectationSchema).min(1).safeParse(expectations);
238
+ if (!rubric.success)
239
+ return {
240
+ scope,
241
+ status: "failed",
242
+ manifestFailures: ["invalid_fixture_rubric"],
243
+ claims: [],
244
+ };
245
+ const expectedIds = new Set(expectations.map(({ id }) => id));
246
+ if (expectedIds.size !== expectations.length)
247
+ return {
248
+ scope,
249
+ status: "failed",
250
+ manifestFailures: ["duplicate_fixture_claim_ids"],
251
+ claims: [],
252
+ };
253
+ const manifest = finalAnswerSchema.safeParse(parseClosedAnswer(finalMessage));
254
+ if (!manifest.success)
255
+ return {
256
+ scope,
257
+ status: "failed",
258
+ manifestFailures: ["invalid_final_claim_manifest"],
259
+ claims: [],
260
+ };
261
+ const manifestFailures = [];
262
+ const submitted = new Map();
263
+ for (const claim of manifest.data.claims) {
264
+ if (submitted.has(claim.id))
265
+ manifestFailures.push(`duplicate_claim:${claim.id}`);
266
+ if (!expectedIds.has(claim.id))
267
+ manifestFailures.push(`unknown_claim:${claim.id}`);
268
+ submitted.set(claim.id, claim);
269
+ }
270
+ const delivered = collectDeliveredEvidence(events);
271
+ const claims = expectations.map((expected) => assessClaim(expected, submitted.get(expected.id), delivered));
272
+ return {
273
+ scope,
274
+ status: manifestFailures.length === 0 &&
275
+ claims.every(({ status }) => status === "passed")
276
+ ? "passed"
277
+ : "failed",
278
+ manifestFailures,
279
+ claims,
280
+ };
281
+ };
@@ -21,6 +21,7 @@ import { EVMOLE_PROVIDER_IDENTITY, EVM_INTERFACE_LIMITS, EVM_FILE_SIZE_FAILURE_E
21
21
  import { decodeEvmBytecodeCarrier } from "./EvmBytecodeCarrier.js";
22
22
  import { selectEvmWorkerLimits, } from "./EvmWorkerLimits.js";
23
23
  const OPERATION = "inspect_evm_interface";
24
+ const HOST_REQUIREMENT = "Initial real-verified offline EVM interface profile supports Linux x64 only.";
24
25
  const replySchema = z.discriminatedUnion("ok", [
25
26
  z.strictObject({
26
27
  ok: z.literal(true),
@@ -60,7 +61,7 @@ export class EvmoleInterfaceProvider {
60
61
  if (options?.signal?.aborted)
61
62
  throw new AnalysisCancelledError(OPERATION);
62
63
  if (process.platform !== "linux" || process.arch !== "x64")
63
- throw new AnalysisCapabilityUnavailableError(EVMOLE_PROVIDER_IDENTITY.id, OPERATION, "Initial real-verified offline EVM interface profile supports Linux x64 only.");
64
+ throw new AnalysisCapabilityUnavailableError(EVMOLE_PROVIDER_IDENTITY.id, OPERATION, HOST_REQUIREMENT, { userMessage: HOST_REQUIREMENT });
64
65
  try {
65
66
  if (!isAbsolute(limiter))
66
67
  throw new Error("REA_EVM_PRLIMIT_COMMAND must be an absolute executable path.");
@@ -9,6 +9,10 @@ import { spawnOwnedProviderProcess, ProviderProcessSupervisor, } from "../proces
9
9
  import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
10
10
  import { FIRMWARE_LIMITS } from "./FirmwareRelease.js";
11
11
  import { hashFirmwareFile, inventoryFirmwareOutput, readFirmwareReport, } from "./FirmwareFiles.js";
12
+ /** Refuse an unmet host or tool requirement, which another target cannot satisfy. */
13
+ export const firmwareToolUnavailable = (engine, operation, reason) => new AnalysisCapabilityUnavailableError(engine, operation, reason, {
14
+ userMessage: reason,
15
+ });
12
16
  /** Resolve explicitly supplied executable paths; never install or search for engines. */
13
17
  export const resolveFirmwareCommand = async (environment, engine, operation) => {
14
18
  const variable = engine === "binwalk" ? "REA_BINWALK_COMMAND" : "REA_UNBLOB_COMMAND";
@@ -16,9 +20,9 @@ export const resolveFirmwareCommand = async (environment, engine, operation) =>
16
20
  if (process.platform !== "linux" ||
17
21
  configured === undefined ||
18
22
  !isAbsolute(configured))
19
- throw new AnalysisCapabilityUnavailableError(engine, operation, `This integration requires Linux and an absolute ${variable} path to the caller-supplied tool`);
23
+ throw firmwareToolUnavailable(engine, operation, `This integration requires Linux and an absolute ${variable} path to the caller-supplied tool`);
20
24
  const command = await realpath(configured).catch((cause) => {
21
- throw new AnalysisCapabilityUnavailableError(engine, operation, `${variable} is unavailable: ${cause instanceof Error ? cause.message : String(cause)}`);
25
+ throw firmwareToolUnavailable(engine, operation, `${variable} is unavailable: ${cause instanceof Error ? cause.message : String(cause)}`);
22
26
  });
23
27
  let sha256;
24
28
  try {
@@ -28,18 +32,18 @@ export const resolveFirmwareCommand = async (environment, engine, operation) =>
28
32
  sha256 = await hashFirmwareFile(command);
29
33
  }
30
34
  catch (cause) {
31
- throw new AnalysisCapabilityUnavailableError(engine, operation, `${variable} is not a readable executable regular file: ${command}: ${cause instanceof Error ? cause.message : String(cause)}`);
35
+ throw firmwareToolUnavailable(engine, operation, `${variable} is not a readable executable regular file: ${command}: ${cause instanceof Error ? cause.message : String(cause)}`);
32
36
  }
33
37
  const limiter = environment.REA_FIRMWARE_PRLIMIT_COMMAND ?? "/usr/bin/prlimit";
34
38
  if (!isAbsolute(limiter))
35
- throw new AnalysisCapabilityUnavailableError(engine, operation, "REA_FIRMWARE_PRLIMIT_COMMAND must be absolute");
39
+ throw firmwareToolUnavailable(engine, operation, "REA_FIRMWARE_PRLIMIT_COMMAND must be absolute");
36
40
  try {
37
41
  await access(limiter, constants.X_OK);
38
42
  if (!(await stat(limiter)).isFile())
39
43
  throw new TypeError("Configured path is not a regular file");
40
44
  }
41
45
  catch (cause) {
42
- throw new AnalysisCapabilityUnavailableError(engine, operation, `Resource limiter is not an executable regular file: ${limiter}: ${cause instanceof Error ? cause.message : String(cause)}; provide util-linux prlimit`);
46
+ throw firmwareToolUnavailable(engine, operation, `Resource limiter is not an executable regular file: ${limiter}: ${cause instanceof Error ? cause.message : String(cause)}; provide util-linux prlimit`);
43
47
  }
44
48
  return { command, limiter, sha256 };
45
49
  };