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
@@ -96,7 +96,7 @@ export const analysisSnapshotSchema = z.object({
96
96
  target: targetSchema,
97
97
  binding: bindingSchema,
98
98
  entries: z.array(entrySchema),
99
- workflow_entries: z.array(workflowEntrySchema).optional(),
99
+ workflow_entries: z.array(workflowEntrySchema),
100
100
  evidence_bundle: evidenceBundleSchema,
101
101
  });
102
102
  const canonicalJson = (value) => {
@@ -139,7 +139,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
139
139
  const encodedParameters = canonicalJson(parameters);
140
140
  const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
141
141
  const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
142
- const workflowEntry = snapshot.workflow_entries?.find((candidate) => candidate.query_id === queryId);
142
+ const workflowEntry = snapshot.workflow_entries.find((candidate) => candidate.query_id === queryId);
143
143
  if (entry === undefined && workflowEntry === undefined)
144
144
  return undefined;
145
145
  return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
@@ -147,7 +147,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
147
147
  record.provider.id === provider.id &&
148
148
  record.provider.name === provider.name &&
149
149
  record.provider.version === provider.version &&
150
- "analysis_profile" in record &&
150
+ record.analysis_profile !== null &&
151
151
  analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
152
152
  canonicalJson(record.parameters) === encodedParameters &&
153
153
  ((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
@@ -233,11 +233,17 @@ export const createAnalysisSnapshotEntry = (input) => {
233
233
  export const parseAnalysisSnapshot = (input) => {
234
234
  const parsed = analysisSnapshotSchema.parse(input);
235
235
  parseEvidenceBundle(parsed.evidence_bundle);
236
- if (JSON.stringify(evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256)) !== JSON.stringify(parsed.evidence_bundle))
236
+ const scopedEvidence = evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256);
237
+ // The validated canonical bundle is filtered, never extended. Equal counts
238
+ // establish that no record or unknown was removed without serializing results.
239
+ if (scopedEvidence.records.length !== parsed.evidence_bundle.records.length ||
240
+ scopedEvidence.unknowns.length !== parsed.evidence_bundle.unknowns.length)
237
241
  throw new TypeError("Analysis snapshot evidence contains records for another target");
242
+ if (!hasCanonicalQueryOrder(parsed.entries))
243
+ throw new TypeError("Analysis snapshot entries are not canonical");
244
+ if (!hasCanonicalQueryOrder(parsed.workflow_entries))
245
+ throw new TypeError("Analysis snapshot workflow entries are not canonical");
238
246
  const ids = new Set();
239
- const boundEntries = [];
240
- const boundWorkflowEntries = [];
241
247
  const index = createEvidenceIndex(parsed);
242
248
  const workflowIndex = createWorkflowEvidenceIndex(parsed);
243
249
  for (const entry of parsed.entries) {
@@ -254,13 +260,10 @@ export const parseAnalysisSnapshot = (input) => {
254
260
  if (!entryHasMatchingEvidence(entry, parsed, index)) {
255
261
  if (entryHasCorrespondingEvidence(entry, parsed, index))
256
262
  throw new TypeError(`Analysis snapshot entry ${entry.operation} differs from its Evidence record`);
257
- // Older snapshots may contain cache entries without profile-bound Evidence.
258
- // Keep their Evidence bundle, but never replay those unbound values.
259
- continue;
263
+ throw new TypeError(`Analysis snapshot entry ${entry.operation} has no profile-bound Evidence record`);
260
264
  }
261
- boundEntries.push(entry);
262
265
  }
263
- for (const entry of parsed.workflow_entries ?? []) {
266
+ for (const entry of parsed.workflow_entries) {
264
267
  if (entry.execution.provider.id !==
265
268
  entry.execution.analysis_profile.provider.id ||
266
269
  entry.execution.provider.name !==
@@ -277,24 +280,19 @@ export const parseAnalysisSnapshot = (input) => {
277
280
  if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
278
281
  if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
279
282
  throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
280
- continue;
283
+ throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} has no profile-bound Evidence record`);
281
284
  }
282
- boundWorkflowEntries.push(entry);
283
285
  }
284
- const sorted = [...parsed.entries].sort((left, right) => left.query_id.localeCompare(right.query_id));
285
- if (JSON.stringify(parsed.entries) !== JSON.stringify(sorted))
286
- throw new TypeError("Analysis snapshot entries are not canonical");
287
- const sortedWorkflows = [...(parsed.workflow_entries ?? [])].sort((left, right) => left.query_id.localeCompare(right.query_id));
288
- if (parsed.workflow_entries !== undefined &&
289
- JSON.stringify(parsed.workflow_entries) !== JSON.stringify(sortedWorkflows))
290
- throw new TypeError("Analysis snapshot workflow entries are not canonical");
291
- return {
292
- ...parsed,
293
- entries: boundEntries,
294
- ...(parsed.workflow_entries === undefined
295
- ? {}
296
- : { workflow_entries: boundWorkflowEntries }),
297
- };
286
+ return parsed;
287
+ };
288
+ const hasCanonicalQueryOrder = (entries) => {
289
+ let previous;
290
+ for (const { query_id: queryId } of entries) {
291
+ if (previous !== undefined && previous.localeCompare(queryId) > 0)
292
+ return false;
293
+ previous = queryId;
294
+ }
295
+ return true;
298
296
  };
299
297
  const createEvidenceIndex = (snapshot) => {
300
298
  const matching = new Set();
@@ -329,13 +327,13 @@ const isCorrespondingEvidence = (evidence, snapshot) => evidence.predicate_type
329
327
  evidence.confidence === "observed" &&
330
328
  evidence.authority === "shipped-artifact" &&
331
329
  evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
332
- "analysis_profile" in evidence &&
330
+ evidence.analysis_profile !== null &&
333
331
  analysisProfilesEqual(evidence.analysis_profile, snapshot.binding.analysis_profile);
334
332
  const evidenceQueryKey = (evidence) => canonicalJson({
335
333
  operation: evidence.operation,
336
334
  parameters: evidence.parameters,
337
335
  provider: evidence.provider,
338
- analysis_profile: "analysis_profile" in evidence ? evidence.analysis_profile : null,
336
+ analysis_profile: evidence.analysis_profile,
339
337
  });
340
338
  const entryQueryKey = (entry, binding) => canonicalJson({
341
339
  operation: entry.operation,
@@ -383,7 +381,7 @@ const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_typ
383
381
  evidence.confidence === "derived" &&
384
382
  evidence.authority === "shipped-artifact" &&
385
383
  evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
386
- "analysis_profile" in evidence &&
384
+ evidence.analysis_profile !== null &&
387
385
  analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
388
386
  evidence.provider.id === entry.execution.provider.id &&
389
387
  evidence.provider.name === entry.execution.provider.name &&
@@ -396,7 +394,7 @@ const createWorkflowEvidenceIndex = (snapshot) => {
396
394
  evidence.confidence !== "derived" ||
397
395
  evidence.authority !== "shipped-artifact" ||
398
396
  evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
399
- !("analysis_profile" in evidence))
397
+ evidence.analysis_profile === null)
400
398
  continue;
401
399
  corresponding.add(evidenceQueryKey(evidence));
402
400
  matching.add(canonicalJson(evidenceContentProjection(evidence)));
@@ -0,0 +1,243 @@
1
+ import { z } from "zod";
2
+ import { AnalysisInputError, AnalysisUnsupportedTargetError, } from "../analysisErrorCore.js";
3
+ import { digestCanonicalValue } from "../canonicalDigest.js";
4
+ import { digestSchema, prefixedDigestSchema } from "../digests.js";
5
+ import { evidenceSchema } from "../evidence.js";
6
+ import { jsonObjectSchema, jsonValueSchema } from "../jsonValue.js";
7
+ import { err, ok } from "../result.js";
8
+ import { binaryLayoutSchema } from "../native/binaryLayout.js";
9
+ import { parseOwnedJavaScriptApplicationAnalysisSteps, } from "../javascript/javascriptApplicationAnalysis.js";
10
+ import { analysisInputErrorFromIssues } from "../inputIssueProjection.js";
11
+ import { projectBinaryLayoutView } from "./binaryLayoutView.js";
12
+ import { projectJavaScriptApplicationView } from "./javascriptApplicationView.js";
13
+ /** Public name of the selected-view workflow. */
14
+ export const INSPECT_ANALYSIS_VIEW_OPERATION = "inspect_analysis_view";
15
+ const summaryViewSchema = z.strictObject({ kind: z.literal("summary") });
16
+ const facetViewSchema = z.strictObject({
17
+ kind: z.literal("facet"),
18
+ facet: z.enum(["mitigations", "linkage"]),
19
+ });
20
+ const itemSelectorSchema = z.union([
21
+ z.strictObject({ index: z.number().int().nonnegative() }),
22
+ z.strictObject({ name: z.string() }),
23
+ z.strictObject({
24
+ path: z
25
+ .string()
26
+ .describe("Exact observed module path or original source-map reference from a module page; an empty reference is valid."),
27
+ }),
28
+ z.strictObject({ node_id: prefixedDigestSchema("jag_node") }),
29
+ ]);
30
+ const itemViewSchema = z
31
+ .strictObject({
32
+ kind: z.literal("item"),
33
+ collection: z.enum(["sections", "symbols", "modules"]),
34
+ selector: itemSelectorSchema,
35
+ })
36
+ .superRefine((value, context) => {
37
+ const selector = value.selector;
38
+ if (value.collection === "modules") {
39
+ if (!("path" in selector) && !("node_id" in selector))
40
+ context.addIssue({
41
+ code: "custom",
42
+ path: ["selector"],
43
+ message: "Module items are selected by exact path or node_id, not index or name.",
44
+ });
45
+ return;
46
+ }
47
+ if (!("index" in selector) && !("name" in selector))
48
+ context.addIssue({
49
+ code: "custom",
50
+ path: ["selector"],
51
+ message: "Section and symbol items are selected by index or exact name, not path or node_id.",
52
+ });
53
+ });
54
+ const pageViewSchema = z.strictObject({
55
+ kind: z.literal("page"),
56
+ collection: z.enum(["sections", "symbols", "modules"]),
57
+ offset: z.number().int().nonnegative(),
58
+ limit: z.number().int().positive(),
59
+ });
60
+ /** Caller-selected projection of already completed analysis Evidence. */
61
+ export const analysisViewRequestSchema = z.discriminatedUnion("kind", [
62
+ summaryViewSchema,
63
+ facetViewSchema,
64
+ itemViewSchema,
65
+ pageViewSchema,
66
+ ]);
67
+ /** Inline Evidence or an exact same-session retained reference. */
68
+ export const analysisViewSourceSchema = z.discriminatedUnion("kind", [
69
+ z.strictObject({
70
+ kind: z.literal("retained-evidence"),
71
+ evidence_id: prefixedDigestSchema("ev"),
72
+ }),
73
+ z.strictObject({
74
+ kind: z.literal("inline"),
75
+ evidence: evidenceSchema,
76
+ }),
77
+ ]);
78
+ /** Public inspect_analysis_view input. */
79
+ export const inspectAnalysisViewInputSchema = z.strictObject({
80
+ source: analysisViewSourceSchema,
81
+ view: analysisViewRequestSchema,
82
+ });
83
+ const coverageSchema = z.strictObject({
84
+ status: z.enum(["complete-within-view", "page", "empty"]),
85
+ examined: z.number().int().nonnegative(),
86
+ total: z.number().int().nonnegative(),
87
+ next_offset: z.number().int().nonnegative().nullable(),
88
+ exhausted: z.boolean(),
89
+ });
90
+ const artifactSchema = z.strictObject({
91
+ path: z.string().min(1),
92
+ sha256: digestSchema,
93
+ });
94
+ const layoutSummarySchema = z.strictObject({
95
+ bytes: z.number().int().nonnegative(),
96
+ format: z.literal("elf"),
97
+ architecture: z.strictObject({
98
+ machine: z.literal("EM_X86_64"),
99
+ bits: z.literal(64),
100
+ byte_order: z.literal("little"),
101
+ }),
102
+ image_type: z.enum(["ET_EXEC", "ET_DYN", "ET_REL"]),
103
+ entry: z.strictObject({
104
+ reported_value: z.string().min(1),
105
+ meaning: z.enum(["linked-virtual-address", "not-applicable", "absent"]),
106
+ execution_status: z.literal("unknown"),
107
+ }),
108
+ counts: z.strictObject({
109
+ sections: z.number().int().nonnegative(),
110
+ segments: z.number().int().nonnegative(),
111
+ symbols: z.number().int().nonnegative(),
112
+ relocations: z.number().int().nonnegative(),
113
+ }),
114
+ limitation_count: z.number().int().nonnegative(),
115
+ });
116
+ const javascriptSummarySchema = z.strictObject({
117
+ input_path: z.string().min(1),
118
+ format: z.enum(["asar", "directory"]),
119
+ root_artifact_sha256: digestSchema,
120
+ statistics: jsonObjectSchema,
121
+ electron: jsonObjectSchema,
122
+ coverage: jsonObjectSchema,
123
+ limitation_count: z.number().int().nonnegative(),
124
+ });
125
+ const viewResultBase = {
126
+ parent_evidence_id: prefixedDigestSchema("ev"),
127
+ parent_operation: z.enum([
128
+ "inspect_binary_layout",
129
+ "analyze_javascript_application",
130
+ ]),
131
+ parent_digest: digestSchema,
132
+ view_digest: digestSchema,
133
+ artifact: artifactSchema,
134
+ coverage: coverageSchema,
135
+ limitations: z.array(z.string()),
136
+ unknowns: z.array(z.string()),
137
+ };
138
+ /** Projected facts for one selected view of retained analysis Evidence. */
139
+ export const analysisViewResultSchema = z.discriminatedUnion("kind", [
140
+ z.strictObject({
141
+ kind: z.literal("summary"),
142
+ view: summaryViewSchema,
143
+ summary: z.union([layoutSummarySchema, javascriptSummarySchema]),
144
+ ...viewResultBase,
145
+ }),
146
+ z.strictObject({
147
+ kind: z.literal("facet"),
148
+ view: facetViewSchema,
149
+ facet: jsonValueSchema,
150
+ ...viewResultBase,
151
+ }),
152
+ z.strictObject({
153
+ kind: z.literal("item"),
154
+ view: itemViewSchema,
155
+ item: jsonValueSchema,
156
+ ...viewResultBase,
157
+ }),
158
+ z.strictObject({
159
+ kind: z.literal("page"),
160
+ view: pageViewSchema,
161
+ items: z.array(jsonValueSchema),
162
+ ...viewResultBase,
163
+ }),
164
+ ]);
165
+ /** Construct a typed input failure for one selected-view constraint. */
166
+ export const analysisViewInputError = (issues) => new AnalysisInputError(INSPECT_ANALYSIS_VIEW_OPERATION, undefined, issues);
167
+ /** SHA-256 of the canonical projected JSON, excluding this digest field. */
168
+ export const analysisViewDigest = (projection) => digestCanonicalValue(projection, "Analysis view");
169
+ /** Attach the content digest that must change when projected bytes change. */
170
+ export const sealAnalysisView = (projection) => analysisViewResultSchema.parse({
171
+ ...projection,
172
+ view_digest: analysisViewDigest(projection),
173
+ });
174
+ const parentDigest = (evidenceId) => evidenceId.slice(3);
175
+ const parseJavaScriptParent = (input) => {
176
+ try {
177
+ // Only the existing realm-private graph proofs permit reuse. Imported or
178
+ // merely frozen graphs still receive full canonical validation.
179
+ const steps = parseOwnedJavaScriptApplicationAnalysisSteps(input);
180
+ let step = steps.next();
181
+ while (!step.done)
182
+ step = steps.next();
183
+ return ok(step.value);
184
+ }
185
+ catch (cause) {
186
+ if (!(cause instanceof z.ZodError))
187
+ throw cause;
188
+ return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues.map((issue) => ({
189
+ ...issue,
190
+ path: ["source", "normalized_result", ...issue.path],
191
+ })), { source: { normalized_result: input } }, { cause }));
192
+ }
193
+ };
194
+ const unsupportedParent = (parent) => new AnalysisUnsupportedTargetError(INSPECT_ANALYSIS_VIEW_OPERATION, parentArtifactPath(parent), `Parent Evidence operation ${JSON.stringify(parent.operation)} is not inspect_binary_layout or analyze_javascript_application.`);
195
+ const parentArtifactPath = (parent) => {
196
+ if (typeof parent.normalizedResult === "object" &&
197
+ parent.normalizedResult !== null &&
198
+ "artifact" in parent.normalizedResult &&
199
+ typeof parent.normalizedResult.artifact === "object" &&
200
+ parent.normalizedResult.artifact !== null &&
201
+ "path" in parent.normalizedResult.artifact &&
202
+ typeof parent.normalizedResult.artifact.path === "string")
203
+ return parent.normalizedResult.artifact.path;
204
+ if (typeof parent.normalizedResult === "object" &&
205
+ parent.normalizedResult !== null &&
206
+ "input_path" in parent.normalizedResult &&
207
+ typeof parent.normalizedResult.input_path === "string")
208
+ return parent.normalizedResult.input_path;
209
+ return parent.evidenceId;
210
+ };
211
+ /** Project one selected view from authenticated parent analysis Evidence. */
212
+ export const projectAnalysisView = (parent, view) => {
213
+ const digest = parentDigest(parent.evidenceId);
214
+ if (!digestSchema.safeParse(digest).success)
215
+ return err(analysisViewInputError([
216
+ {
217
+ path: ["source"],
218
+ reason: "invalid_format",
219
+ message: "Parent Evidence ID is not a digest-backed identifier.",
220
+ },
221
+ ]));
222
+ if (parent.operation === "inspect_binary_layout") {
223
+ const layout = binaryLayoutSchema.safeParse(parent.normalizedResult);
224
+ if (!layout.success)
225
+ return err(analysisViewInputError([
226
+ {
227
+ path: ["source"],
228
+ reason: "invalid_value",
229
+ message: "Parent Evidence result does not match inspect_binary_layout.",
230
+ },
231
+ ]));
232
+ const projected = projectBinaryLayoutView(parent, layout.data, view);
233
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
234
+ }
235
+ if (parent.operation === "analyze_javascript_application") {
236
+ const analysis = parseJavaScriptParent(parent.normalizedResult);
237
+ if (!analysis.ok)
238
+ return analysis;
239
+ const projected = projectJavaScriptApplicationView(parent, analysis.value, view);
240
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
241
+ }
242
+ return err(unsupportedParent(parent));
243
+ };
@@ -0,0 +1,19 @@
1
+ /** Coverage for a summary, facet, or single selected object. */
2
+ export const completeWithinViewCoverage = (examined, total) => ({
3
+ status: "complete-within-view",
4
+ examined,
5
+ total,
6
+ next_offset: null,
7
+ exhausted: true,
8
+ });
9
+ /** Coverage for a stable page, including an offset past the collection. */
10
+ export const pageViewCoverage = (offset, examined, total) => {
11
+ const exhausted = offset >= total || offset + examined >= total;
12
+ return {
13
+ status: examined === 0 ? "empty" : "page",
14
+ examined,
15
+ total,
16
+ next_offset: exhausted ? null : offset + examined,
17
+ exhausted,
18
+ };
19
+ };
@@ -0,0 +1,159 @@
1
+ import { AnalysisInputError, } from "../analysisErrorCore.js";
2
+ import { uniqueSorted } from "../canonicalOrdering.js";
3
+ import { err, ok } from "../result.js";
4
+ import { completeWithinViewCoverage as completeCoverage, pageViewCoverage as pageCoverage, } from "./analysisViewCoverage.js";
5
+ const OPERATION = "inspect_analysis_view";
6
+ const inputError = (issues) => new AnalysisInputError(OPERATION, undefined, issues);
7
+ const layoutUnknowns = (layout) => {
8
+ const unknowns = [
9
+ "runtime_load_base is unknown",
10
+ "entry_point.execution_status is unknown",
11
+ "relocation_inventory_completeness is unknown",
12
+ "linkage.convenience_maps_completeness is unknown",
13
+ "linkage.runtime_library_paths are unknown",
14
+ ];
15
+ if (layout.mitigations.nx_indicator === null)
16
+ unknowns.push("mitigations.nx_indicator is unknown");
17
+ if (layout.mitigations.relro === null)
18
+ unknowns.push("mitigations.relro is unknown");
19
+ return unknowns;
20
+ };
21
+ const displayName = (name) => name.display;
22
+ const namedMatches = (rows, name) => rows.flatMap((row, index) => row.name.unknown_reason === null && displayName(row.name) === name
23
+ ? [{ index, row }]
24
+ : []);
25
+ const selectNamed = (collection, rows, name) => {
26
+ const matches = namedMatches(rows, name);
27
+ if (matches.length === 1) {
28
+ const selected = matches[0];
29
+ if (selected !== undefined)
30
+ return ok(selected.row);
31
+ }
32
+ if (matches.length === 0)
33
+ return err(inputError([
34
+ {
35
+ path: ["view", "selector", "name"],
36
+ reason: "invalid_value",
37
+ message: `No ${collection} named ${JSON.stringify(name)}. Collection has ${String(rows.length)} entries; page it to inspect exact indexes and names.`,
38
+ },
39
+ ]));
40
+ return err(inputError([
41
+ {
42
+ path: ["view", "selector", "name"],
43
+ reason: "invalid_value",
44
+ message: `Multiple ${collection} named ${JSON.stringify(name)}; select one by index.`,
45
+ expected: matches.map(({ index }) => ({ index })),
46
+ },
47
+ ]));
48
+ };
49
+ const selectIndexed = (collection, rows, index) => {
50
+ const row = rows[index];
51
+ if (row !== undefined)
52
+ return ok(row);
53
+ return err(inputError([
54
+ {
55
+ path: ["view", "selector", "index"],
56
+ reason: "out_of_range",
57
+ message: `${collection} index ${String(index)} is outside 0..${String(Math.max(0, rows.length - 1))} (${String(rows.length)} entries).`,
58
+ minimum: 0,
59
+ maximum: Math.max(0, rows.length - 1),
60
+ },
61
+ ]));
62
+ };
63
+ const pageRows = (rows, offset, limit) => rows.slice(offset, offset + limit);
64
+ const layoutIncompatible = (detail) => inputError([
65
+ {
66
+ path: ["view"],
67
+ reason: "invalid_value",
68
+ message: detail,
69
+ },
70
+ ]);
71
+ const parentFields = (parent, layout) => ({
72
+ parent_evidence_id: parent.evidenceId,
73
+ parent_operation: "inspect_binary_layout",
74
+ parent_digest: parent.evidenceId.slice(3),
75
+ artifact: {
76
+ path: layout.artifact.path,
77
+ sha256: layout.artifact.sha256,
78
+ },
79
+ limitations: uniqueSorted([...parent.limitations, ...layout.limitations]),
80
+ unknowns: uniqueSorted([...layoutUnknowns(layout)]),
81
+ });
82
+ const layoutSummary = (layout) => ({
83
+ bytes: layout.artifact.bytes,
84
+ format: layout.format,
85
+ architecture: layout.architecture,
86
+ image_type: layout.image_type,
87
+ entry: layout.entry_point,
88
+ counts: {
89
+ sections: layout.sections.length,
90
+ segments: layout.segments.length,
91
+ symbols: layout.symbols.length,
92
+ relocations: layout.relocations.length,
93
+ },
94
+ limitation_count: layout.limitations.length,
95
+ });
96
+ /** Project one layout view without re-running the decoder. */
97
+ export const projectBinaryLayoutView = (parent, layout, view) => {
98
+ const shared = parentFields(parent, layout);
99
+ if (view.kind === "summary")
100
+ return ok({
101
+ kind: "summary",
102
+ view,
103
+ summary: layoutSummary(layout),
104
+ coverage: completeCoverage(layout.sections.length +
105
+ layout.segments.length +
106
+ layout.symbols.length +
107
+ layout.relocations.length, layout.sections.length +
108
+ layout.segments.length +
109
+ layout.symbols.length +
110
+ layout.relocations.length),
111
+ ...shared,
112
+ });
113
+ if (view.kind === "facet")
114
+ return ok({
115
+ kind: "facet",
116
+ view,
117
+ facet: view.facet === "mitigations" ? layout.mitigations : layout.linkage,
118
+ coverage: completeCoverage(1, 1),
119
+ ...shared,
120
+ });
121
+ if (view.kind === "item") {
122
+ if (view.collection === "modules")
123
+ return err(layoutIncompatible("modules collection applies to analyze_javascript_application Evidence."));
124
+ const selected = view.collection === "sections"
125
+ ? selectLayoutItem(view.collection, layout.sections, view.selector)
126
+ : selectLayoutItem(view.collection, layout.symbols, view.selector);
127
+ if (!selected.ok)
128
+ return selected;
129
+ return ok({
130
+ kind: "item",
131
+ view,
132
+ item: selected.value,
133
+ coverage: completeCoverage(1, view.collection === "sections"
134
+ ? layout.sections.length
135
+ : layout.symbols.length),
136
+ ...shared,
137
+ });
138
+ }
139
+ if (view.collection === "modules")
140
+ return err(layoutIncompatible("modules collection applies to analyze_javascript_application Evidence."));
141
+ const rows = view.collection === "sections" ? layout.sections : layout.symbols;
142
+ const items = view.collection === "sections"
143
+ ? pageRows(layout.sections, view.offset, view.limit)
144
+ : pageRows(layout.symbols, view.offset, view.limit);
145
+ return ok({
146
+ kind: "page",
147
+ view,
148
+ items: [...items],
149
+ coverage: pageCoverage(view.offset, items.length, rows.length),
150
+ ...shared,
151
+ });
152
+ };
153
+ const selectLayoutItem = (collection, rows, selector) => {
154
+ if ("index" in selector)
155
+ return selectIndexed(collection, rows, selector.index);
156
+ if ("name" in selector)
157
+ return selectNamed(collection, rows, selector.name);
158
+ return err(layoutIncompatible("Section and symbol items are selected by index or exact name."));
159
+ };