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
@@ -79,6 +79,7 @@ const evidenceBaseSchema = z
79
79
  evidence_id: prefixedDigestSchema("ev"),
80
80
  subject: subjectSchema.nullable(),
81
81
  provider: providerSchema,
82
+ analysis_profile: analysisProfileSchema.nullable(),
82
83
  predicate_type: z.string().min(1),
83
84
  operation: z.string().min(1),
84
85
  parameters: jsonObjectSchema,
@@ -92,13 +93,10 @@ const evidenceBaseSchema = z
92
93
  evidence_links: z.array(prefixedDigestSchema("ev")),
93
94
  })
94
95
  .strict();
95
- /** Object envelope used to specialize caller-visible Evidence result schemas. */
96
- export const evidenceEnvelopeSchema = evidenceBaseSchema.extend({
97
- analysis_profile: analysisProfileSchema.optional(),
98
- });
99
- const validateAnalysisProfileProvider = (evidence, context) => {
96
+ /** Require a reported analysis profile to identify the observation provider. */
97
+ export const validateAnalysisProfileProvider = (evidence, context) => {
100
98
  const profile = evidence.analysis_profile;
101
- if (profile !== undefined &&
99
+ if (profile !== null &&
102
100
  (profile.provider.id !== evidence.provider.id ||
103
101
  profile.provider.name !== evidence.provider.name ||
104
102
  profile.provider.version !== evidence.provider.version))
@@ -109,15 +107,7 @@ const validateAnalysisProfileProvider = (evidence, context) => {
109
107
  });
110
108
  };
111
109
  /** Strict, provider-neutral record for one successful public observation. */
112
- export const evidenceSchema = evidenceEnvelopeSchema.superRefine(validateAnalysisProfileProvider);
113
- const profiledEvidenceSchema = evidenceBaseSchema
114
- .extend({ analysis_profile: analysisProfileSchema })
115
- .superRefine(validateAnalysisProfileProvider);
116
- /** JSON-exact union used where Evidence participates in larger schemas. */
117
- export const evidenceRecordSchema = z.union([
118
- profiledEvidenceSchema,
119
- evidenceBaseSchema,
120
- ]);
110
+ export const evidenceSchema = evidenceBaseSchema.superRefine(validateAnalysisProfileProvider);
121
111
  const immutableEvidenceSnapshots = new WeakMap();
122
112
  const immutableResultSchema = z
123
113
  .custom(isImmutableJsonSnapshot)
@@ -135,9 +125,7 @@ const semanticProjection = (evidence) => ({
135
125
  architecture: evidence.subject.architecture,
136
126
  },
137
127
  provider: evidence.provider,
138
- ...(!("analysis_profile" in evidence)
139
- ? {}
140
- : { analysis_profile: evidence.analysis_profile }),
128
+ analysis_profile: evidence.analysis_profile,
141
129
  predicate_type: evidence.predicate_type,
142
130
  operation: evidence.operation,
143
131
  parameters: evidence.parameters,
@@ -159,13 +147,7 @@ export const parseEvidence = (input) => {
159
147
  : undefined;
160
148
  if (immutable !== undefined)
161
149
  return immutable;
162
- // Select the producer's envelope before traversing its payload. A legacy
163
- // record cannot satisfy the required-profile branch, whose failed parse
164
- // would otherwise clone the entire normalized result before trying legacy.
165
- const schema = typeof input === "object" && input !== null && "analysis_profile" in input
166
- ? profiledEvidenceSchema
167
- : evidenceBaseSchema;
168
- const evidence = schema.parse(input);
150
+ const evidence = evidenceSchema.parse(input);
169
151
  const { evidence_id: evidenceId, ...withoutId } = evidence;
170
152
  if (computeEvidenceId(withoutId) !== evidenceId)
171
153
  throw new TypeError("Evidence semantic identifier does not match its record");
@@ -226,9 +208,7 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
226
208
  name: provider.name,
227
209
  version: provider.version,
228
210
  },
229
- ...(observation.analysisProfile === undefined
230
- ? {}
231
- : { analysis_profile: observation.analysisProfile }),
211
+ analysis_profile: observation.analysisProfile ?? null,
232
212
  predicate_type: observation.predicateType ?? "rea.analysis",
233
213
  operation: observation.operation,
234
214
  parameters: observation.parameters,
@@ -249,18 +229,12 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
249
229
  locations: [...(observation.locations ?? [])],
250
230
  evidence_links: [...(observation.evidenceLinks ?? [])],
251
231
  };
252
- // Select the known envelope before parsing. A union otherwise traverses and
253
- // clones a legacy result for the profiled branch before rejecting its absent
254
- // profile and trying the legacy branch.
255
- const schema = observation.analysisProfile === undefined
256
- ? evidenceBaseSchema
257
- : profiledEvidenceSchema;
258
232
  const sharedResult = typeof observation.result === "object" &&
259
233
  observation.result !== null &&
260
234
  isImmutableJsonSnapshot(observation.result);
261
235
  const selectedSchema = sharedResult
262
- ? schema.safeExtend({ normalized_result: immutableResultSchema })
263
- : schema;
236
+ ? evidenceSchema.safeExtend({ normalized_result: immutableResultSchema })
237
+ : evidenceSchema;
264
238
  const normalized = selectedSchema.parse({
265
239
  ...semantic,
266
240
  evidence_id: `ev_${"0".repeat(64)}`,
@@ -1,24 +1,22 @@
1
1
  import { z } from "zod";
2
2
  import canonicalize from "canonicalize";
3
- import { evidenceEnvelopeSchema, evidenceRecordSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
3
+ import { evidenceSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
4
4
  import { residualUnknownSchema, } from "./residualUnknown.js";
5
5
  import { freezeJsonSnapshot } from "./immutableJson.js";
6
- const artifactManifestSchema = evidenceEnvelopeSchema.shape.subject
7
- .unwrap()
8
- .pick({
6
+ const artifactManifestSchema = evidenceSchema.shape.subject.unwrap().pick({
9
7
  digest: true,
10
8
  format: true,
11
9
  architecture: true,
12
10
  });
13
11
  const providerManifestSchema = providerSchema;
14
- const environmentManifestSchema = evidenceEnvelopeSchema.shape.environment.unwrap();
12
+ const environmentManifestSchema = evidenceSchema.shape.environment.unwrap();
15
13
  const scenarioManifestSchema = z.object({
16
- evidence_id: evidenceEnvelopeSchema.shape.evidence_id,
14
+ evidence_id: evidenceSchema.shape.evidence_id,
17
15
  operation: z.string().min(1),
18
16
  authority: z.literal("controlled-replay"),
19
17
  });
20
18
  const captureManifestSchema = z.object({
21
- evidence_id: evidenceEnvelopeSchema.shape.evidence_id,
19
+ evidence_id: evidenceSchema.shape.evidence_id,
22
20
  predicate_type: z.string().min(1),
23
21
  });
24
22
  export const evidenceBundleSchema = z.object({
@@ -28,7 +26,7 @@ export const evidenceBundleSchema = z.object({
28
26
  scenarios: z.array(scenarioManifestSchema),
29
27
  captures: z.array(captureManifestSchema),
30
28
  unknowns: z.array(residualUnknownSchema),
31
- records: z.array(evidenceRecordSchema),
29
+ records: z.array(evidenceSchema),
32
30
  });
33
31
  const immutableBundles = new WeakMap();
34
32
  /** Build and authenticate a sealed bundle while reusing immutable Evidence records. */
@@ -139,7 +137,7 @@ const referencedEvidenceIds = (unknown) => [
139
137
  * Evidence record, such as one command result, is not a bundle.
140
138
  */
141
139
  export const describeEvidenceBundleFailure = (input, cause) => {
142
- const record = evidenceRecordSchema.safeParse(input);
140
+ const record = evidenceSchema.safeParse(input);
143
141
  if (record.success)
144
142
  return `Expected an Evidence bundle with records and manifest arrays, but this JSON is one Evidence record (${record.data.evidence_id}). Export a session bundle with the MCP export_evidence_bundle tool and supply that file.`;
145
143
  return cause instanceof z.ZodError
@@ -1,9 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
4
5
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
6
  const evidenceIdSchema = prefixedDigestSchema("ev");
6
- const claimIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
7
+ const claimIdSchema = z.string().regex(IDENTIFIER_PATTERN);
7
8
  /** Terminal outcome recorded for one verifier claim. */
8
9
  export const evidenceCompletionStatusSchema = z.enum([
9
10
  "pass",
@@ -4,15 +4,14 @@ import { functionMatch } from "./functionComparisonNormalization.js";
4
4
  import { functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
5
5
  import { overallStatus, summarize } from "./functionComparisonResults.js";
6
6
  import { compareDimensions } from "./functionComparisonDimensions.js";
7
- export { functionComparisonInputSchema, functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
8
7
  /** Compare two complete function Evidence records without fuzzy matching. */
9
8
  export const compareFunctions = (leftInput, rightInput) => {
10
9
  const left = parseFunctionEvidence(leftInput);
11
10
  const right = parseFunctionEvidence(rightInput);
12
- const links = [left.evidence[0].evidence_id, right.evidence[0].evidence_id];
13
- const providersDiffer = canonicalJson(left.provider, "Function comparison") !==
14
- canonicalJson(right.provider, "Function comparison");
15
- const dimensions = compareDimensions(left, right, links, providersDiffer);
11
+ const links = [left.evidence.evidence_id, right.evidence.evidence_id];
12
+ const providersDiffer = canonicalJson(left.evidence.provider, "Function comparison") !==
13
+ canonicalJson(right.evidence.provider, "Function comparison");
14
+ const dimensions = compareDimensions(left, right, { links, providersDiffer });
16
15
  const match = functionMatch(left, right);
17
16
  const changes = dimensions.filter(({ status }) => status !== "unchanged");
18
17
  return functionComparisonResultSchema.parse({
@@ -1,40 +1,50 @@
1
1
  import { canonicalJson } from "./comparisonSemantics.js";
2
2
  import { diffLines } from "diff";
3
- import { commentProjection, combineCoverage, identityProjection, isAutoName, normalizeCfg, project, referenceKindProjection, referenceProjection, sorted, stringAndNameProjection, } from "./functionComparisonNormalization.js";
4
- import { dimensionResult, unresolvedDimension as buildUnresolvedDimension, } from "./functionComparisonResults.js";
5
- const unresolvedDimension = (...[dimension, status, links, leftCount, rightCount, limitations]) => buildUnresolvedDimension({
6
- dimension,
7
- status,
8
- links,
9
- leftCount,
10
- rightCount,
11
- limitations,
12
- });
13
- export const compareDimensions = (left, right, links, providersDiffer) => [
14
- compareIdentity(left, right, links, providersDiffer),
15
- compareText("pseudocode", left.pseudocode.text, right.pseudocode.text, left.pseudocode.complete, right.pseudocode.complete, links, providersDiffer),
16
- compareText("assembly", left.collections.assembly.items.join("\n"), right.collections.assembly.items.join("\n"), left.collections.assembly.complete, right.collections.assembly.complete, links, providersDiffer, left.collections.assembly.truncated || right.collections.assembly.truncated, "Assembly is opaque provider text; relocation normalization is unavailable."),
17
- compareComments(left, right, links, providersDiffer),
18
- compareCalls(left, right, links, providersDiffer),
19
- compareReferences(left, right, links, providersDiffer),
20
- compareStringsAndNames(left, right, links, providersDiffer),
21
- compareCfg(left, right, links, providersDiffer),
22
- ];
23
- const compareText = (...[dimension, left, right, leftComplete, rightComplete, links, providersDiffer, explicitTruncation, limitation,]) => {
24
- const truncated = explicitTruncation ?? (!leftComplete || !rightComplete);
25
- if (!leftComplete || !rightComplete || providersDiffer)
26
- return unresolvedDimension(dimension, truncated ? "truncated" : "unknown", links, left.length, right.length, [
27
- ...(limitation === undefined ? [] : [limitation]),
28
- ...(providersDiffer
29
- ? ["Exact text comparison requires one provider identity."]
30
- : []),
31
- ]);
3
+ import { commentProjection, identityProjection, isAutoName, normalizeCfg, referenceKindProjection, referenceProjection, sorted, stringAndNameProjection, } from "./functionComparisonNormalization.js";
4
+ import { dimensionResult, unresolvedDimension, } from "./functionComparisonResults.js";
5
+ export const compareDimensions = (left, right, context) => {
6
+ return [
7
+ compareIdentity(left, right, context),
8
+ compareText("pseudocode", left.dossier.pseudocode, right.dossier.pseudocode, context),
9
+ compareText("assembly", left.dossier.assembly.join("\n"), right.dossier.assembly.join("\n"), context),
10
+ compareComments(left, right, context),
11
+ compareCalls(left, right, context),
12
+ compareReferences(left, right, context),
13
+ compareStringsAndNames(left, right, context),
14
+ compareCfg(left, right, context),
15
+ ];
16
+ };
17
+ const compareText = (dimension, left, right, context) => {
18
+ const limitations = dimension === "assembly"
19
+ ? [
20
+ "Assembly is opaque provider text; relocation normalization is unavailable.",
21
+ ]
22
+ : [];
23
+ if (context.providersDiffer)
24
+ return unresolvedDimension({
25
+ dimension,
26
+ links: context.links,
27
+ leftCount: [...left].length,
28
+ rightCount: [...right].length,
29
+ limitations: [
30
+ ...limitations,
31
+ "Exact text comparison requires one provider identity.",
32
+ ],
33
+ });
32
34
  const changes = diffLines(left, right, {
33
35
  timeout: 100,
34
36
  maxEditLength: 10_000,
35
37
  });
36
38
  if (changes === undefined)
37
- return unresolvedDimension(dimension, "unknown", links, left.length, right.length, ["Bounded line diff exceeded its time or edit-distance limit."]);
39
+ return unresolvedDimension({
40
+ dimension,
41
+ links: context.links,
42
+ leftCount: [...left].length,
43
+ rightCount: [...right].length,
44
+ limitations: [
45
+ "Bounded line diff exceeded its time or edit-distance limit.",
46
+ ],
47
+ });
38
48
  const delta = changes.reduce((summary, change) => ({
39
49
  added_lines: summary.added_lines + (change.added ? (change.count ?? 0) : 0),
40
50
  removed_lines: summary.removed_lines + (change.removed ? (change.count ?? 0) : 0),
@@ -45,48 +55,48 @@ const compareText = (...[dimension, left, right, leftComplete, rightComplete, li
45
55
  status: delta.hunks === 0 ? "unchanged" : "changed",
46
56
  left,
47
57
  right,
48
- links,
49
- providersDiffer,
58
+ ...context,
50
59
  leftCount: [...left].length,
51
60
  rightCount: [...right].length,
52
61
  textDelta: delta,
53
- limitations: limitation === undefined ? [] : [limitation],
62
+ limitations,
54
63
  });
55
64
  };
56
- const compareCollections = (...[dimension, left, right, leftCoverage, rightCoverage, links, providersDiffer,]) => {
57
- if (!leftCoverage.complete || !rightCoverage.complete)
58
- return unresolvedDimension(dimension, leftCoverage.truncated || rightCoverage.truncated
59
- ? "truncated"
60
- : "unknown", links, left.length, right.length, []);
61
- return compareValues(dimension, sorted(left), sorted(right), links, true, true, providersDiffer);
62
- };
63
- const compareComments = (left, right, links, providersDiffer) => {
65
+ const compareComments = (left, right, context) => {
64
66
  const leftValues = commentProjection(left);
65
67
  const rightValues = commentProjection(right);
66
68
  if (leftValues === null || rightValues === null)
67
- return unresolvedDimension("comments", "unknown", links, left.collections.comments.items.length, right.collections.comments.items.length, ["Comment locations could not be normalized relative to the function."]);
68
- return compareCollections("comments", leftValues, rightValues, left.collections.comments, right.collections.comments, links, providersDiffer);
69
+ return unresolvedDimension({
70
+ dimension: "comments",
71
+ links: context.links,
72
+ leftCount: left.dossier.comments.length,
73
+ rightCount: right.dossier.comments.length,
74
+ limitations: [
75
+ "Comment locations could not be normalized relative to the function.",
76
+ ],
77
+ });
78
+ return compareValues("comments", leftValues, rightValues, context);
69
79
  };
70
- const compareStringsAndNames = (left, right, links, providersDiffer) => {
80
+ const compareStringsAndNames = (left, right, context) => {
71
81
  const leftValues = stringAndNameProjection(left);
72
82
  const rightValues = stringAndNameProjection(right);
73
83
  if (leftValues === null || rightValues === null)
74
- return unresolvedDimension("strings_names", "unknown", links, null, null, [
75
- "Reference source locations could not be normalized to function offsets.",
76
- ]);
77
- return compareCollections("strings_names", leftValues, rightValues, combineCoverage(left.collections.referenced_strings, left.collections.referenced_names), combineCoverage(right.collections.referenced_strings, right.collections.referenced_names), links, providersDiffer);
84
+ return unresolvedDimension({
85
+ dimension: "strings_names",
86
+ links: context.links,
87
+ leftCount: null,
88
+ rightCount: null,
89
+ limitations: [
90
+ "Reference source locations could not be normalized to function offsets.",
91
+ ],
92
+ });
93
+ return compareValues("strings_names", leftValues, rightValues, context);
78
94
  };
79
- const compareReferences = (left, right, links, providersDiffer) => {
80
- const leftCoverage = combineCoverage(left.collections.incoming_references, left.collections.outgoing_references);
81
- const rightCoverage = combineCoverage(right.collections.incoming_references, right.collections.outgoing_references);
82
- if (!leftCoverage.complete || !rightCoverage.complete)
83
- return unresolvedDimension("references", leftCoverage.truncated || rightCoverage.truncated
84
- ? "truncated"
85
- : "unknown", links, leftCoverage.items.length, rightCoverage.items.length, []);
95
+ const compareReferences = (left, right, context) => {
86
96
  const leftProjection = referenceProjection(left);
87
97
  const rightProjection = referenceProjection(right);
88
98
  if (leftProjection.length === 0 && rightProjection.length === 0)
89
- return compareValues("references", leftProjection, rightProjection, links, true, true, providersDiffer);
99
+ return compareValues("references", leftProjection, rightProjection, context);
90
100
  if (canonicalJson(leftProjection, "Function comparison") !==
91
101
  canonicalJson(rightProjection, "Function comparison"))
92
102
  return dimensionResult({
@@ -94,8 +104,7 @@ const compareReferences = (left, right, links, providersDiffer) => {
94
104
  status: "changed",
95
105
  left: leftProjection,
96
106
  right: rightProjection,
97
- links,
98
- providersDiffer,
107
+ ...context,
99
108
  leftCount: leftProjection.length,
100
109
  rightCount: rightProjection.length,
101
110
  textDelta: null,
@@ -106,49 +115,74 @@ const compareReferences = (left, right, links, providersDiffer) => {
106
115
  const leftKinds = referenceKindProjection(left);
107
116
  const rightKinds = referenceKindProjection(right);
108
117
  if (leftKinds !== null && rightKinds !== null)
109
- return compareValues("references", leftKinds, rightKinds, links, true, true, providersDiffer);
110
- return unresolvedDimension("references", "unknown", links, leftProjection.length, rightProjection.length, [
111
- "At least one provider did not expose reference kinds, so equal endpoints do not prove equal edge semantics.",
112
- ]);
118
+ return compareValues("references", leftKinds, rightKinds, context);
119
+ return unresolvedDimension({
120
+ dimension: "references",
121
+ links: context.links,
122
+ leftCount: leftProjection.length,
123
+ rightCount: rightProjection.length,
124
+ limitations: [
125
+ "At least one provider did not expose reference kinds, so equal endpoints do not prove equal edge semantics.",
126
+ ],
127
+ });
113
128
  };
114
- const compareIdentity = (left, right, links, providersDiffer) => {
115
- if (isAutoName(left.procedure.name) || isAutoName(right.procedure.name))
116
- return unresolvedDimension("identity", "unknown", links, null, null, [
117
- "Address-derived function names are not stable cross-version identity.",
118
- ]);
119
- return compareValues("identity", identityProjection(left), identityProjection(right), links, true, true, providersDiffer);
129
+ const compareIdentity = (left, right, context) => {
130
+ if (isAutoName(left.dossier.procedure.name) ||
131
+ isAutoName(right.dossier.procedure.name))
132
+ return unresolvedDimension({
133
+ dimension: "identity",
134
+ links: context.links,
135
+ leftCount: null,
136
+ rightCount: null,
137
+ limitations: [
138
+ "Address-derived function names are not stable cross-version identity.",
139
+ ],
140
+ });
141
+ return compareValues("identity", identityProjection(left), identityProjection(right), context);
120
142
  };
121
- const compareCalls = (left, right, links, providersDiffer) => {
143
+ const compareCalls = (left, right, context) => {
122
144
  const leftValues = callProjection(left);
123
145
  const rightValues = callProjection(right);
124
146
  if ([...leftValues, ...rightValues].some(({ name }) => isAutoName(name)))
125
- return unresolvedDimension("calls", "unknown", links, leftValues.length, rightValues.length, ["Address-derived callee or caller names cannot be matched safely."]);
126
- return compareCollections("calls", leftValues, rightValues, combineCoverage(left.collections.callers, left.collections.callees), combineCoverage(right.collections.callers, right.collections.callees), links, providersDiffer);
147
+ return unresolvedDimension({
148
+ dimension: "calls",
149
+ links: context.links,
150
+ leftCount: leftValues.length,
151
+ rightCount: rightValues.length,
152
+ limitations: [
153
+ "Address-derived callee or caller names cannot be matched safely.",
154
+ ],
155
+ });
156
+ return compareValues("calls", sorted(leftValues), sorted(rightValues), context);
127
157
  };
128
158
  const callProjection = (snapshot) => [
129
- ...project(snapshot.collections.callers, ({ name }) => ({
159
+ ...snapshot.dossier.callers.map(({ name }) => ({
130
160
  direction: "in",
131
161
  name,
132
162
  })),
133
- ...project(snapshot.collections.callees, ({ name }) => ({
163
+ ...snapshot.dossier.callees.map(({ name }) => ({
134
164
  direction: "out",
135
165
  name,
136
166
  })),
137
167
  ];
138
- const compareCfg = (left, right, links, providersDiffer) => {
139
- const leftBlocks = left.collections.basic_blocks;
140
- const rightBlocks = right.collections.basic_blocks;
141
- if (!leftBlocks.complete || !rightBlocks.complete)
142
- return unresolvedDimension("cfg", leftBlocks.truncated || rightBlocks.truncated ? "truncated" : "unknown", links, leftBlocks.items.length, rightBlocks.items.length, []);
143
- const leftGraph = normalizeCfg(leftBlocks.items);
144
- const rightGraph = normalizeCfg(rightBlocks.items);
168
+ const compareCfg = (left, right, context) => {
169
+ const leftBlocks = left.dossier.basic_blocks;
170
+ const rightBlocks = right.dossier.basic_blocks;
171
+ const leftGraph = normalizeCfg(leftBlocks);
172
+ const rightGraph = normalizeCfg(rightBlocks);
145
173
  if (leftGraph === null || rightGraph === null)
146
- return unresolvedDimension("cfg", "unknown", links, leftBlocks.items.length, rightBlocks.items.length, ["CFG addresses could not be normalized to local block indices."]);
147
- return compareValues("cfg", leftGraph, rightGraph, links, true, true, providersDiffer);
174
+ return unresolvedDimension({
175
+ dimension: "cfg",
176
+ links: context.links,
177
+ leftCount: leftBlocks.length,
178
+ rightCount: rightBlocks.length,
179
+ limitations: [
180
+ "CFG addresses could not be normalized to local block indices.",
181
+ ],
182
+ });
183
+ return compareValues("cfg", leftGraph, rightGraph, context);
148
184
  };
149
- const compareValues = (...[dimension, left, right, links, leftComplete, rightComplete, providersDiffer,]) => {
150
- if (!leftComplete || !rightComplete)
151
- return unresolvedDimension(dimension, "unknown", links, null, null, []);
185
+ const compareValues = (dimension, left, right, context) => {
152
186
  const leftJson = canonicalJson(left, "Function comparison");
153
187
  const rightJson = canonicalJson(right, "Function comparison");
154
188
  return dimensionResult({
@@ -156,8 +190,7 @@ const compareValues = (...[dimension, left, right, links, leftComplete, rightCom
156
190
  status: leftJson === rightJson ? "unchanged" : "changed",
157
191
  left,
158
192
  right,
159
- links,
160
- providersDiffer,
193
+ ...context,
161
194
  leftCount: Array.isArray(left) ? left.length : null,
162
195
  rightCount: Array.isArray(right) ? right.length : null,
163
196
  textDelta: null,
@@ -1,26 +1,28 @@
1
1
  import { canonicalJson } from "./comparisonSemantics.js";
2
2
  import { compareCodePoints } from "./canonicalOrdering.js";
3
3
  export const identityProjection = (snapshot) => ({
4
- name: snapshot.procedure.name,
5
- signature: snapshot.procedure.signature,
6
- locals: snapshot.procedure.locals
4
+ name: snapshot.dossier.procedure.name,
5
+ signature: snapshot.dossier.procedure.signature,
6
+ locals: snapshot.dossier.procedure.locals
7
7
  .map(({ description }) => description)
8
8
  .sort(),
9
9
  });
10
10
  export const functionMatch = (left, right) => {
11
- if (!isAutoName(left.procedure.name) &&
12
- left.procedure.name === right.procedure.name)
11
+ if (!isAutoName(left.dossier.procedure.name) &&
12
+ left.dossier.procedure.name === right.dossier.procedure.name)
13
13
  return {
14
14
  status: "matched",
15
15
  method: "symbol",
16
- left_name: left.procedure.name,
17
- right_name: right.procedure.name,
16
+ left_name: left.dossier.procedure.name,
17
+ right_name: right.dossier.procedure.name,
18
18
  };
19
19
  return {
20
- status: left.procedure.name === right.procedure.name ? "ambiguous" : "mismatched",
20
+ status: left.dossier.procedure.name === right.dossier.procedure.name
21
+ ? "ambiguous"
22
+ : "mismatched",
21
23
  method: "explicit",
22
- left_name: left.procedure.name,
23
- right_name: right.procedure.name,
24
+ left_name: left.dossier.procedure.name,
25
+ right_name: right.dossier.procedure.name,
24
26
  };
25
27
  };
26
28
  export const normalizeCfg = (blocks) => {
@@ -56,12 +58,12 @@ export const normalizeCfg = (blocks) => {
56
58
  return graph;
57
59
  };
58
60
  export const referenceProjection = (snapshot) => sorted([
59
- ...snapshot.collections.incoming_references.items.map((item) => ({
61
+ ...snapshot.dossier.incoming_references.map((item) => ({
60
62
  direction: "in",
61
63
  source: item.source_procedure?.name ?? null,
62
64
  target: item.target_procedure?.name ?? null,
63
65
  })),
64
- ...snapshot.collections.outgoing_references.items.map((item) => ({
66
+ ...snapshot.dossier.outgoing_references.map((item) => ({
65
67
  direction: "out",
66
68
  source: item.source_procedure?.name ?? null,
67
69
  target: item.target_procedure?.name ?? null,
@@ -69,11 +71,11 @@ export const referenceProjection = (snapshot) => sorted([
69
71
  ]);
70
72
  export const referenceKindProjection = (snapshot) => {
71
73
  const edges = [
72
- ...snapshot.collections.incoming_references.items.map((edge) => ({
74
+ ...snapshot.dossier.incoming_references.map((edge) => ({
73
75
  direction: "in",
74
76
  edge,
75
77
  })),
76
- ...snapshot.collections.outgoing_references.items.map((edge) => ({
78
+ ...snapshot.dossier.outgoing_references.map((edge) => ({
77
79
  direction: "out",
78
80
  edge,
79
81
  })),
@@ -105,8 +107,8 @@ export const referenceKindProjection = (snapshot) => {
105
107
  }));
106
108
  };
107
109
  export const commentProjection = (snapshot) => {
108
- const values = snapshot.collections.comments.items.map(({ address, kind, text }) => ({
109
- offset: relativeAddress(address, snapshot.procedure.address),
110
+ const values = snapshot.dossier.comments.map(({ address, kind, text }) => ({
111
+ offset: relativeAddress(address, snapshot.dossier.procedure.address),
110
112
  kind,
111
113
  text,
112
114
  }));
@@ -114,14 +116,14 @@ export const commentProjection = (snapshot) => {
114
116
  };
115
117
  export const stringAndNameProjection = (snapshot) => {
116
118
  const values = [
117
- ...snapshot.collections.referenced_strings.items.map(({ source_address: sourceAddress, value }) => ({
119
+ ...snapshot.dossier.referenced_strings.map(({ source_address: sourceAddress, value }) => ({
118
120
  kind: "string",
119
- source_offset: relativeAddress(sourceAddress, snapshot.procedure.address),
121
+ source_offset: relativeAddress(sourceAddress, snapshot.dossier.procedure.address),
120
122
  value,
121
123
  })),
122
- ...snapshot.collections.referenced_names.items.map(({ source_address: sourceAddress, value }) => ({
124
+ ...snapshot.dossier.referenced_names.map(({ source_address: sourceAddress, value }) => ({
123
125
  kind: "name",
124
- source_offset: relativeAddress(sourceAddress, snapshot.procedure.address),
126
+ source_offset: relativeAddress(sourceAddress, snapshot.dossier.procedure.address),
125
127
  value,
126
128
  })),
127
129
  ];
@@ -134,21 +136,8 @@ export const sorted = (values) => values
134
136
  value,
135
137
  json: canonicalJson(value, "Function normalization"),
136
138
  }))
137
- .sort((left, right) => {
138
- // Preserve existing collation while ordering distinct values within a tie.
139
- return (left.json.localeCompare(right.json) ||
140
- compareCodePoints(left.json, right.json));
141
- })
139
+ .sort((left, right) => compareCodePoints(left.json, right.json))
142
140
  .map(({ value }) => value);
143
- export const combineCoverage = (left, right) => {
144
- return {
145
- items: [...left.items, ...right.items],
146
- total: left.total + right.total,
147
- complete: true,
148
- truncated: false,
149
- };
150
- };
151
- export const project = (collection, mapper) => collection.items.map(mapper);
152
141
  export const isAutoName = (name) => /^(?:sub_[0-9a-f]+|fcn\.[0-9a-f]+)$/iu.test(name);
153
142
  const parseAddress = (value) => /^0x[0-9a-f]+$/iu.test(value) ? BigInt(value) : null;
154
143
  const relativeAddress = (value, base) => {
@@ -26,7 +26,7 @@ export const dimensionResult = (input) => {
26
26
  };
27
27
  export const unresolvedDimension = (input) => ({
28
28
  dimension: input.dimension,
29
- status: input.status,
29
+ status: "unknown",
30
30
  left_digest: null,
31
31
  right_digest: null,
32
32
  left_count: input.leftCount,
@@ -37,8 +37,6 @@ export const unresolvedDimension = (input) => ({
37
37
  limitations: [...input.limitations],
38
38
  });
39
39
  export const overallStatus = (dimensions, match) => {
40
- if (dimensions.some(({ status }) => status === "truncated"))
41
- return "truncated";
42
40
  if (match === "ambiguous" ||
43
41
  dimensions.some(({ status }) => status === "unknown"))
44
42
  return "unknown";
@@ -51,7 +49,6 @@ export const overallStatus = (dimensions, match) => {
51
49
  export const summarize = (dimensions) => ({
52
50
  unchanged: dimensions.filter(({ status }) => status === "unchanged").length,
53
51
  changed: dimensions.filter(({ status }) => status === "changed").length,
54
- truncated: dimensions.filter(({ status }) => status === "truncated").length,
55
52
  unknown: dimensions.filter(({ status }) => status === "unknown").length,
56
53
  });
57
54
  const digest = (value) => canonicalDigest(value, "Function comparison");
@@ -2,12 +2,7 @@ import { z } from "zod";
2
2
  import { evidenceSchema } from "./evidence.js";
3
3
  import { digestSchema } from "./../domain/digests.js";
4
4
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
- const comparisonStatusSchema = z.enum([
6
- "unchanged",
7
- "changed",
8
- "truncated",
9
- "unknown",
10
- ]);
5
+ const comparisonStatusSchema = z.enum(["unchanged", "changed", "unknown"]);
11
6
  const dimensionNameSchema = z.enum([
12
7
  "identity",
13
8
  "pseudocode",
@@ -55,7 +50,7 @@ const functionDimensionSchema = z.union([
55
50
  }),
56
51
  z.object({
57
52
  ...functionDimensionContextShape,
58
- status: z.enum(["truncated", "unknown"]),
53
+ status: z.literal("unknown"),
59
54
  left_digest: z.null(),
60
55
  right_digest: z.null(),
61
56
  text_delta: z.null(),
@@ -85,7 +80,6 @@ export const functionComparisonResultSchema = z.object({
85
80
  summary: z.object({
86
81
  unchanged: z.number().int().min(0),
87
82
  changed: z.number().int().min(0),
88
- truncated: z.number().int().min(0),
89
83
  unknown: z.number().int().min(0),
90
84
  }),
91
85
  dimensions: z.array(functionDimensionSchema).length(8),