rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -13,7 +13,8 @@ export const analysisErrorRemediationAction = (error) => {
13
13
  if (error instanceof AnalysisSnapshotMismatchError)
14
14
  return "Run analysis without this snapshot, then save a fresh snapshot using the intended artifact, provider, and analysis profile.";
15
15
  if (error instanceof AnalysisUnsupportedTargetError)
16
- return "Select a target supported by this operation or choose an operation supporting the reported target format.";
16
+ return (error.remediationAction ??
17
+ "Select a target supported by this operation or choose an operation supporting the reported target format.");
17
18
  if (error instanceof AnalysisResourceConstraintError)
18
19
  return (error.remediationAction ??
19
20
  (error.resource === "transport"
@@ -44,10 +45,13 @@ export const analysisErrorRemediationAction = (error) => {
44
45
  if (error instanceof BinaryTargetError &&
45
46
  error.constraint === "directory_requires_file")
46
47
  return "For a JavaScript/Electron application directory, call analyze_javascript_application with input_path or run `rea analyze <directory>`. For binary analysis, select its executable file.";
47
- if (error instanceof AnalysisAccessDeniedError)
48
+ if (error instanceof AnalysisAccessDeniedError ||
49
+ (error instanceof BinaryTargetError && error.systemCode !== undefined))
48
50
  return "Check the current process's read access to the selected path. Retry with a readable local file.";
49
51
  if (error instanceof AnalysisArtifactChangedError)
50
52
  return "Wait until the selected file is stable. For an active binary session, reopen the target with open_binary before retrying so REA acquires its current identity; for a CLI command or target-free tool, rerun the operation.";
53
+ if (error instanceof ConfigurationError && error.settings.length > 0)
54
+ return `Correct ${[...new Set(error.settings.map(({ setting }) => setting))].join(", ")} in the environment that starts REA (your shell or the MCP client's registration), then rerun.`;
51
55
  if (error instanceof AnalysisInputError)
52
56
  return "Correct the listed arguments and retry.";
53
57
  if (error instanceof UnknownRegistryError && error.reason === "not-found")
@@ -72,6 +76,11 @@ export const analysisErrorCategory = (error) => {
72
76
  return "unavailable";
73
77
  if (error instanceof ArtifactOperationError)
74
78
  return artifactErrorCategory(error.reason);
79
+ if (error instanceof EvidenceFileError &&
80
+ (error.reason === "missing" ||
81
+ error.reason === "not-file" ||
82
+ error.reason === "exists"))
83
+ return "invalid_input";
75
84
  return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure";
76
85
  };
77
86
  const browserErrorCategory = (reason) => {
@@ -138,7 +147,7 @@ export const analysisErrorUserMessage = (error) => {
138
147
  if (standardMessage !== undefined)
139
148
  return standardMessage;
140
149
  if (error instanceof ArtifactOperationError)
141
- return artifactMessage(error.reason);
150
+ return artifactMessage(error.operation, error.reason);
142
151
  if (error instanceof EvidenceReferenceError)
143
152
  return error.reason === "missing"
144
153
  ? `Evidence ${error.evidenceId} is not retained in this session. Supply complete inline Evidence, re-run its producer, or import its bundle before using this reference.`
@@ -152,7 +161,13 @@ export const analysisErrorUserMessage = (error) => {
152
161
  if (error instanceof UnknownRegistryError)
153
162
  return "Evidence state changed before the update completed. Refresh the current state and try again.";
154
163
  if (error instanceof ConfigurationError)
155
- return "REA configuration is invalid. Run `rea doctor` and fix the reported setting.";
164
+ return error.settings.length === 0
165
+ ? "REA configuration is invalid. Run `rea doctor` and fix the reported setting."
166
+ : `REA configuration is invalid: ${error.settings
167
+ .map(({ setting, constraint }) => constraint.includes(setting)
168
+ ? constraint.replace(/\.$/u, "")
169
+ : `${setting}: ${constraint}`)
170
+ .join("; ")}.`;
156
171
  if (error instanceof NoBinaryOpenError)
157
172
  return error.message;
158
173
  if (error instanceof BinaryTargetError)
@@ -252,7 +267,7 @@ const START_FAILURE_TAGS = new Set([
252
267
  "HopperProcessError",
253
268
  "HopperStartError",
254
269
  ]);
255
- const artifactMessage = (reason) => {
270
+ const artifactMessage = (operation, reason) => {
256
271
  if (reason === "cancelled")
257
272
  return "Artifact operation was cancelled. Start it again when ready.";
258
273
  if (reason === "limit")
@@ -261,6 +276,8 @@ const artifactMessage = (reason) => {
261
276
  return "Artifact contains an unsafe or conflicting internal path. Inspect the reported path and correct the artifact before retrying.";
262
277
  if (reason === "unavailable")
263
278
  return "Artifact processing is unavailable for the current target or host. Check artifact support and required tools.";
279
+ if (reason === "integrity" && operation === "analyze_javascript_application")
280
+ return "Artifact bytes contradict declared integrity. If expected, rerun analyze_javascript_application with integrity_policy=record-and-continue (CLI: --integrity-policy record-and-continue) to retain observed bytes as untrusted; otherwise get a fresh copy.";
264
281
  if (reason === "format" || reason === "integrity")
265
282
  return "Artifact is invalid or has changed. Get a fresh copy and try again.";
266
283
  return "Artifact could not be read or written. Check file access and try again.";
@@ -2,7 +2,7 @@ import { jsonValueSchema } from "./jsonValue.js";
2
2
  import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
3
3
  import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisUnsupportedTargetError, AnalysisInputError, AnalysisOutputError, AnalysisTimeoutError, AnalysisResourceConstraintError, } from "./analysisErrorCore.js";
4
4
  import { ArtifactOperationError } from "./artifactOperationError.js";
5
- import { BinaryTargetError } from "./configurationErrors.js";
5
+ import { BinaryTargetError, ConfigurationError, } from "./configurationErrors.js";
6
6
  import { BrowserObservationError } from "./browserObservationError.js";
7
7
  import { EvidenceFileError, EvidenceIntegrityError, EvidenceReferenceError, } from "./evidenceErrors.js";
8
8
  import { HopperCancelledError, HopperProcessError, HopperRemoteError, HopperStartError, HopperTimeoutError, } from "./hopperErrors.js";
@@ -63,6 +63,10 @@ const underlyingErrorCode = (error) => {
63
63
  : browserErrorCode(error.reason);
64
64
  if (error instanceof ArtifactOperationError)
65
65
  return artifactOperationCode(error);
66
+ if (error instanceof BinaryTargetError)
67
+ return error.systemCode === undefined
68
+ ? "target_unavailable"
69
+ : "access_denied";
66
70
  if (error instanceof EvidenceFileError)
67
71
  return evidenceFileCode(error.reason);
68
72
  if (error instanceof UnknownRegistryError)
@@ -95,9 +99,14 @@ const artifactOperationCode = (error) => {
95
99
  return "cancelled";
96
100
  return "artifact_operation_failed";
97
101
  };
98
- const evidenceFileCode = (reason) => reason === "invalid-json"
99
- ? "evidence_integrity_mismatch"
100
- : "execution_failure";
102
+ const evidenceFileCode = (reason) => {
103
+ if (reason === "invalid-json")
104
+ return "evidence_integrity_mismatch";
105
+ // A missing, non-file or already-existing path is the caller's selection.
106
+ if (reason === "io")
107
+ return "execution_failure";
108
+ return "invalid_request";
109
+ };
101
110
  const unknownRegistryCode = (reason) => {
102
111
  if (reason === "revision-conflict" || reason === "already-exists")
103
112
  return "revision_conflict";
@@ -132,7 +141,6 @@ const STATIC_ERROR_CODES = {
132
141
  HopperStartError: "provider_unavailable",
133
142
  ConfigurationError: "configuration_invalid",
134
143
  NoBinaryOpenError: "target_unavailable",
135
- BinaryTargetError: "target_unavailable",
136
144
  EvidenceIntegrityError: "evidence_integrity_mismatch",
137
145
  ProviderAdapterError: "execution_failure",
138
146
  HopperRemoteError: "execution_failure",
@@ -140,6 +148,7 @@ const STATIC_ERROR_CODES = {
140
148
  const staticErrorCode = (tag) => {
141
149
  switch (tag) {
142
150
  case "ArtifactOperationError":
151
+ case "BinaryTargetError":
143
152
  case "BrowserObservationError":
144
153
  case "EvidenceFileError":
145
154
  case "ProcessCaptureError":
@@ -404,6 +413,13 @@ const lifecycleErrorDetails = (error) => {
404
413
  };
405
414
  return Object.keys(details).length === 0 ? undefined : details;
406
415
  }
416
+ if (error instanceof ConfigurationError && error.settings.length > 0)
417
+ return {
418
+ settings: error.settings.map(({ setting, constraint }) => ({
419
+ setting,
420
+ constraint,
421
+ })),
422
+ };
407
423
  if (error instanceof BinaryTargetError)
408
424
  return {
409
425
  path: error.path,
@@ -411,6 +427,9 @@ const lifecycleErrorDetails = (error) => {
411
427
  ...(error.constraint === undefined
412
428
  ? {}
413
429
  : { constraint: error.constraint }),
430
+ ...(error.systemCode === undefined
431
+ ? {}
432
+ : { system_code: error.systemCode, boundary: "filesystem-read" }),
414
433
  };
415
434
  return undefined;
416
435
  };
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
4
5
  import { analysisProfileSchema, analysisProfilesEqual, committedProviderSchema, } from "./analysisProfile.js";
5
6
  import { evidenceBundleForTarget, evidenceBundleSchema, parseEvidenceBundle, } from "./evidenceBundle.js";
6
7
  import { evidenceLocationSchema, } from "./evidence.js";
@@ -96,7 +97,7 @@ export const analysisSnapshotSchema = z.object({
96
97
  target: targetSchema,
97
98
  binding: bindingSchema,
98
99
  entries: z.array(entrySchema),
99
- workflow_entries: z.array(workflowEntrySchema).optional(),
100
+ workflow_entries: z.array(workflowEntrySchema),
100
101
  evidence_bundle: evidenceBundleSchema,
101
102
  });
102
103
  const canonicalJson = (value) => {
@@ -139,7 +140,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
139
140
  const encodedParameters = canonicalJson(parameters);
140
141
  const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
141
142
  const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
142
- const workflowEntry = snapshot.workflow_entries?.find((candidate) => candidate.query_id === queryId);
143
+ const workflowEntry = snapshot.workflow_entries.find((candidate) => candidate.query_id === queryId);
143
144
  if (entry === undefined && workflowEntry === undefined)
144
145
  return undefined;
145
146
  return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
@@ -147,7 +148,7 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
147
148
  record.provider.id === provider.id &&
148
149
  record.provider.name === provider.name &&
149
150
  record.provider.version === provider.version &&
150
- "analysis_profile" in record &&
151
+ record.analysis_profile !== null &&
151
152
  analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
152
153
  canonicalJson(record.parameters) === encodedParameters &&
153
154
  ((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
@@ -233,11 +234,17 @@ export const createAnalysisSnapshotEntry = (input) => {
233
234
  export const parseAnalysisSnapshot = (input) => {
234
235
  const parsed = analysisSnapshotSchema.parse(input);
235
236
  parseEvidenceBundle(parsed.evidence_bundle);
236
- if (JSON.stringify(evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256)) !== JSON.stringify(parsed.evidence_bundle))
237
+ const scopedEvidence = evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256);
238
+ // The validated canonical bundle is filtered, never extended. Equal counts
239
+ // establish that no record or unknown was removed without serializing results.
240
+ if (scopedEvidence.records.length !== parsed.evidence_bundle.records.length ||
241
+ scopedEvidence.unknowns.length !== parsed.evidence_bundle.unknowns.length)
237
242
  throw new TypeError("Analysis snapshot evidence contains records for another target");
243
+ if (!hasCanonicalQueryOrder(parsed.entries))
244
+ throw new TypeError("Analysis snapshot entries are not canonical");
245
+ if (!hasCanonicalQueryOrder(parsed.workflow_entries))
246
+ throw new TypeError("Analysis snapshot workflow entries are not canonical");
238
247
  const ids = new Set();
239
- const boundEntries = [];
240
- const boundWorkflowEntries = [];
241
248
  const index = createEvidenceIndex(parsed);
242
249
  const workflowIndex = createWorkflowEvidenceIndex(parsed);
243
250
  for (const entry of parsed.entries) {
@@ -254,13 +261,10 @@ export const parseAnalysisSnapshot = (input) => {
254
261
  if (!entryHasMatchingEvidence(entry, parsed, index)) {
255
262
  if (entryHasCorrespondingEvidence(entry, parsed, index))
256
263
  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;
264
+ throw new TypeError(`Analysis snapshot entry ${entry.operation} has no profile-bound Evidence record`);
260
265
  }
261
- boundEntries.push(entry);
262
266
  }
263
- for (const entry of parsed.workflow_entries ?? []) {
267
+ for (const entry of parsed.workflow_entries) {
264
268
  if (entry.execution.provider.id !==
265
269
  entry.execution.analysis_profile.provider.id ||
266
270
  entry.execution.provider.name !==
@@ -277,24 +281,20 @@ export const parseAnalysisSnapshot = (input) => {
277
281
  if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
278
282
  if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
279
283
  throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
280
- continue;
284
+ throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} has no profile-bound Evidence record`);
281
285
  }
282
- boundWorkflowEntries.push(entry);
283
286
  }
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
- };
287
+ return parsed;
288
+ };
289
+ const hasCanonicalQueryOrder = (entries) => {
290
+ let previous;
291
+ for (const { query_id: queryId } of entries) {
292
+ if (previous !== undefined &&
293
+ compareUnicodeCodePoints(previous, queryId) > 0)
294
+ return false;
295
+ previous = queryId;
296
+ }
297
+ return true;
298
298
  };
299
299
  const createEvidenceIndex = (snapshot) => {
300
300
  const matching = new Set();
@@ -329,13 +329,13 @@ const isCorrespondingEvidence = (evidence, snapshot) => evidence.predicate_type
329
329
  evidence.confidence === "observed" &&
330
330
  evidence.authority === "shipped-artifact" &&
331
331
  evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
332
- "analysis_profile" in evidence &&
332
+ evidence.analysis_profile !== null &&
333
333
  analysisProfilesEqual(evidence.analysis_profile, snapshot.binding.analysis_profile);
334
334
  const evidenceQueryKey = (evidence) => canonicalJson({
335
335
  operation: evidence.operation,
336
336
  parameters: evidence.parameters,
337
337
  provider: evidence.provider,
338
- analysis_profile: "analysis_profile" in evidence ? evidence.analysis_profile : null,
338
+ analysis_profile: evidence.analysis_profile,
339
339
  });
340
340
  const entryQueryKey = (entry, binding) => canonicalJson({
341
341
  operation: entry.operation,
@@ -383,7 +383,7 @@ const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_typ
383
383
  evidence.confidence === "derived" &&
384
384
  evidence.authority === "shipped-artifact" &&
385
385
  evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
386
- "analysis_profile" in evidence &&
386
+ evidence.analysis_profile !== null &&
387
387
  analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
388
388
  evidence.provider.id === entry.execution.provider.id &&
389
389
  evidence.provider.name === entry.execution.provider.name &&
@@ -396,7 +396,7 @@ const createWorkflowEvidenceIndex = (snapshot) => {
396
396
  evidence.confidence !== "derived" ||
397
397
  evidence.authority !== "shipped-artifact" ||
398
398
  evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
399
- !("analysis_profile" in evidence))
399
+ evidence.analysis_profile === null)
400
400
  continue;
401
401
  corresponding.add(evidenceQueryKey(evidence));
402
402
  matching.add(canonicalJson(evidenceContentProjection(evidence)));
@@ -0,0 +1,241 @@
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
+ /** Attach the content digest that must change when projected bytes change. */
168
+ export const sealAnalysisView = (projection) => analysisViewResultSchema.parse({
169
+ ...projection,
170
+ view_digest: digestCanonicalValue(projection, "Analysis view"),
171
+ });
172
+ const parentDigest = (evidenceId) => evidenceId.slice(3);
173
+ const parseJavaScriptParent = (input) => {
174
+ try {
175
+ // Only the existing realm-private graph proofs permit reuse. Imported or
176
+ // merely frozen graphs still receive full canonical validation.
177
+ const steps = parseOwnedJavaScriptApplicationAnalysisSteps(input);
178
+ let step = steps.next();
179
+ while (!step.done)
180
+ step = steps.next();
181
+ return ok(step.value);
182
+ }
183
+ catch (cause) {
184
+ if (!(cause instanceof z.ZodError))
185
+ throw cause;
186
+ return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues.map((issue) => ({
187
+ ...issue,
188
+ path: ["source", "normalized_result", ...issue.path],
189
+ })), { source: { normalized_result: input } }, { cause }));
190
+ }
191
+ };
192
+ 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.`);
193
+ const parentArtifactPath = (parent) => {
194
+ if (typeof parent.normalizedResult === "object" &&
195
+ parent.normalizedResult !== null &&
196
+ "artifact" in parent.normalizedResult &&
197
+ typeof parent.normalizedResult.artifact === "object" &&
198
+ parent.normalizedResult.artifact !== null &&
199
+ "path" in parent.normalizedResult.artifact &&
200
+ typeof parent.normalizedResult.artifact.path === "string")
201
+ return parent.normalizedResult.artifact.path;
202
+ if (typeof parent.normalizedResult === "object" &&
203
+ parent.normalizedResult !== null &&
204
+ "input_path" in parent.normalizedResult &&
205
+ typeof parent.normalizedResult.input_path === "string")
206
+ return parent.normalizedResult.input_path;
207
+ return parent.evidenceId;
208
+ };
209
+ /** Project one selected view from authenticated parent analysis Evidence. */
210
+ export const projectAnalysisView = (parent, view) => {
211
+ const digest = parentDigest(parent.evidenceId);
212
+ if (!digestSchema.safeParse(digest).success)
213
+ return err(analysisViewInputError([
214
+ {
215
+ path: ["source"],
216
+ reason: "invalid_format",
217
+ message: "Parent Evidence ID is not a digest-backed identifier.",
218
+ },
219
+ ]));
220
+ if (parent.operation === "inspect_binary_layout") {
221
+ const layout = binaryLayoutSchema.safeParse(parent.normalizedResult);
222
+ if (!layout.success)
223
+ return err(analysisViewInputError([
224
+ {
225
+ path: ["source"],
226
+ reason: "invalid_value",
227
+ message: "Parent Evidence result does not match inspect_binary_layout.",
228
+ },
229
+ ]));
230
+ const projected = projectBinaryLayoutView(parent, layout.data, view);
231
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
232
+ }
233
+ if (parent.operation === "analyze_javascript_application") {
234
+ const analysis = parseJavaScriptParent(parent.normalizedResult);
235
+ if (!analysis.ok)
236
+ return analysis;
237
+ const projected = projectJavaScriptApplicationView(parent, analysis.value, view);
238
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
239
+ }
240
+ return err(unsupportedParent(parent));
241
+ };
@@ -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
+ };