rea-agents 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,3 +1,6 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
1
4
  /** Standard executable names and locations used to discover Homebrew. */
2
5
  const HOMEBREW_COMMANDS = [
3
6
  "brew",
@@ -17,3 +20,48 @@ export const probeHomebrew = async (probe) => {
17
20
  }
18
21
  return undefined;
19
22
  };
23
+ const caskDirectoriesSchema = z
24
+ .object({ appdir: z.string().min(1).optional() })
25
+ .loose();
26
+ const caskConfigSchema = z
27
+ .object({
28
+ default: caskDirectoriesSchema.optional(),
29
+ env: caskDirectoriesSchema.optional(),
30
+ explicit: caskDirectoriesSchema.optional(),
31
+ })
32
+ .loose();
33
+ /**
34
+ * Read the application directory Homebrew recorded when it installed a cask,
35
+ * in Homebrew's precedence: explicit option, then environment, then default.
36
+ * Reading the Caskroom avoids `brew` cask commands, which refresh Homebrew's
37
+ * API and bootsnap caches.
38
+ */
39
+ export const installedCaskAppdir = async (caskroom, token, home) => {
40
+ let text;
41
+ try {
42
+ text = await readFile(join(caskroom, token, ".metadata", "config.json"), "utf8");
43
+ }
44
+ catch (cause) {
45
+ // An absent or unreadable receipt means the cask is not installed here.
46
+ void cause;
47
+ return undefined;
48
+ }
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(text);
52
+ }
53
+ catch (cause) {
54
+ // A malformed receipt does not identify an application directory.
55
+ void cause;
56
+ return undefined;
57
+ }
58
+ const config = caskConfigSchema.safeParse(parsed);
59
+ if (!config.success)
60
+ return undefined;
61
+ const appdir = config.data.explicit?.appdir ??
62
+ config.data.env?.appdir ??
63
+ config.data.default?.appdir;
64
+ if (appdir === undefined)
65
+ return undefined;
66
+ return appdir.startsWith("~/") ? join(home, appdir.slice(2)) : appdir;
67
+ };
@@ -1,7 +1,7 @@
1
1
  import { canonicalDigest } from "../../domain/comparisonSemantics.js";
2
2
  import { createEvidence } from "../../domain/evidence.js";
3
- import { jsonValueSchema } from "../../domain/jsonValue.js";
4
- /** Create Evidence without retaining arbitrary runtime argument values. */
3
+ import { jsonObjectSchema, jsonValueSchema } from "../../domain/jsonValue.js";
4
+ /** Commit the selected Electron experiment and its observed result. */
5
5
  export const createElectronActiveEvidence = (input, result, provider) => createEvidence(undefined, provider, {
6
6
  predicateType: "rea.electron-active-scenario",
7
7
  operation: "capture_electron_scenario",
@@ -20,14 +20,10 @@ export const createElectronActiveEvidence = (input, result, provider) => createE
20
20
  "Application host platform and architecture were not observed.",
21
21
  ],
22
22
  });
23
- const scenarioProjection = (input) => ({
24
- executable_path: input.executable_path,
25
- application_path: input.application_path,
26
- application_root: input.application_root,
27
- args: [...input.args],
28
- actions: input.actions.map(({ step_id, kind }) => ({ step_id, kind })),
29
- });
30
- const parameters = (input) => ({
31
- ...scenarioProjection(input),
32
- scenario_sha256: canonicalDigest(scenarioProjection(input), "Browser scenario"),
33
- });
23
+ const parameters = (input) => {
24
+ const scenario = jsonObjectSchema.parse(input);
25
+ return {
26
+ ...scenario,
27
+ scenario_sha256: canonicalDigest(scenario, "Electron scenario"),
28
+ };
29
+ };
@@ -1,11 +1,9 @@
1
- import { createEvidence, createImmutableEvidenceSteps, } from "../../domain/evidence.js";
1
+ import { createImmutableEvidenceSteps, } from "../../domain/evidence.js";
2
2
  import { JAVASCRIPT_APPLICATION_PROVIDER } from "../InvestigationProviders.js";
3
- import { freezeJsonSnapshot, freezeOwnedJsonSnapshotSteps, } from "../../domain/immutableJson.js";
3
+ import { freezeOwnedJsonSnapshotSteps } from "../../domain/immutableJson.js";
4
4
  import { rememberOwnedApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
5
5
  import { completeJavaScriptAnalysisSteps } from "./JavaScriptAnalysisControl.js";
6
6
  import { jsonValueValidationSteps } from "../../domain/jsonValue.js";
7
- /** Transfer an already validated, application-owned result into immutable analysis Evidence. */
8
- export const createOwnedJavaScriptApplicationEvidence = (input, result) => rememberOwnedApplicationGraphEvidence(createJavaScriptApplicationEvidence(input, freezeJsonSnapshot(result)), result);
9
7
  /** Create owned analysis Evidence while allowing request cancellation during sealing and hashing. */
10
8
  export const createOwnedJavaScriptApplicationEvidenceCooperatively = async (input, result, signal, progress) => {
11
9
  await reportEvidencePhase(progress, "seal_javascript_application_result", "Sealing the complete application analysis result");
@@ -19,8 +17,6 @@ export const createOwnedJavaScriptApplicationEvidenceCooperatively = async (inpu
19
17
  };
20
18
  const reportEvidencePhase = (progress, phase, message) => progress?.report({ phase, completed: 0, total: 1, message }) ??
21
19
  Promise.resolve();
22
- /** Create Evidence for one deterministic local JavaScript application graph. */
23
- export const createJavaScriptApplicationEvidence = (input, result) => createEvidence(applicationSubject(result), JAVASCRIPT_APPLICATION_PROVIDER, applicationObservation(input, result));
24
20
  const applicationSubject = (result) => ({
25
21
  path: result.input_path,
26
22
  sha256: result.root_artifact_sha256,
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
3
3
  import { analyzeJavaScriptApplicationInputSchema, parseOwnedJavaScriptApplicationAnalysisSteps, } from "../../domain/javascript/javascriptApplicationAnalysis.js";
4
- import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
4
+ import { AnalysisAccessDeniedError, AnalysisInputError, AnalysisOutputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
5
5
  import { ArtifactOperationError } from "../../domain/artifactOperationError.js";
6
6
  import {} from "../../domain/analysisErrorBase.js";
7
7
  import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
@@ -67,6 +67,11 @@ export const analyzeJavaScriptApplicationValidated = async (input, options = {})
67
67
  return ok(evidence);
68
68
  }
69
69
  catch (cause) {
70
+ // Input selection failures are already typed by their cause.
71
+ if (cause instanceof AnalysisInputError ||
72
+ cause instanceof AnalysisUnsupportedTargetError ||
73
+ cause instanceof AnalysisAccessDeniedError)
74
+ return err(cause);
70
75
  if (cause instanceof ArtifactReaderFailure)
71
76
  return err(new ArtifactOperationError(OPERATION, cause.reason, cause.details, cause.message));
72
77
  if (cause instanceof z.ZodError)
@@ -1,5 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { setImmediate } from "node:timers/promises";
3
+ import { resolveJavaScriptSourceMapReference } from "../../domain/javascript/javascriptSourceMapPaths.js";
3
4
  import { analyzeParsedJavaScriptStaticSource } from "../../domain/javascript/javascriptStaticAnalysis.js";
4
5
  import { analyzeParsedJavaScriptSemantics, classifyParsedJavaScriptOpenReceivers, } from "../../domain/javascript/javascriptSemanticAnalysis.js";
5
6
  import { parseJavaScriptSource } from "../../domain/javascript/javascriptSourceParser.js";
@@ -203,14 +204,16 @@ const collectSourceMapOriginals = (file, maps) => {
203
204
  const contents = map.sourcesContent;
204
205
  if (!hasValidSourceMapContents(names.length, contents))
205
206
  return invalidSourceMap(file, "Source map sourcesContent must contain one string or null entry per source.");
206
- const root = typeof map.sourceRoot === "string" ? map.sourceRoot : "";
207
+ if (map.sourceRoot != null && typeof map.sourceRoot !== "string")
208
+ return invalidSourceMap(file, "Source map sourceRoot must be a string or null.");
209
+ const root = typeof map.sourceRoot === "string" ? map.sourceRoot : null;
207
210
  for (const [index, raw] of names.entries()) {
208
211
  if (typeof raw !== "string")
209
212
  return invalidSourceMap(file, "Source map contains a non-string source name.");
210
213
  const rawContent = Array.isArray(contents) ? contents[index] : undefined;
211
214
  const content = typeof rawContent === "string" ? rawContent : null;
212
215
  sources.push({
213
- source: resolveSourceName(root, raw),
216
+ reference: resolveJavaScriptSourceMapReference(raw, root, file.path),
214
217
  content,
215
218
  content_sha256: content === null ? null : sha256(content),
216
219
  });
@@ -266,7 +269,6 @@ const pointForOffset = (text, offset) => {
266
269
  const lines = text.slice(0, offset).split(/\r\n|\r|\n/u);
267
270
  return { line: lines.length, column: lines.at(-1)?.length ?? 0 };
268
271
  };
269
- const resolveSourceName = (root, source) => `${root}${root !== "" && !root.endsWith("/") ? "/" : ""}${source}`;
270
272
  const optionalString = (value) => typeof value === "string" && value.length > 0 ? value : null;
271
273
  const sha256 = (value) => createHash("sha256").update(value).digest("hex");
272
274
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -1,12 +1,14 @@
1
1
  import { createJavaScriptApplicationGraph, createImmutableJavaScriptApplicationGraphSteps, } from "../../domain/javascript/javascriptApplicationGraph.js";
2
2
  import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js";
3
+ import { selfReferenceOmissions, } from "./JavaScriptArtifactGraphContext.js";
3
4
  import { addJavaScriptHtmlRoles, addJavaScriptSourceMapOriginals, } from "./JavaScriptArtifactGraphDocuments.js";
4
5
  import { addJavaScriptStaticFindings } from "./JavaScriptArtifactGraphFindings.js";
5
6
  import { addJavaScriptModuleRelationships, addJavaScriptSourceModules, } from "./JavaScriptModuleRelationships.js";
6
7
  import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
7
8
  import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
8
9
  import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
9
- import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptBundlerNodes, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
10
+ import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
11
+ import { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
10
12
  import { addElectronBoundaries } from "./ElectronBoundaryGraph.js";
11
13
  import { classifyElectronIpcPairings, collectElectronIpcRecords, } from "./ElectronBoundaryAnalysis.js";
12
14
  /** Project artifact and AST facts into JavaScript Application Graph. */
@@ -34,9 +36,9 @@ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
34
36
  addJavaScriptArtifactFiles(context);
35
37
  const packageRoots = addJavaScriptPackageNodes(context);
36
38
  addJavaScriptSourceModules(context);
37
- addJavaScriptBundlerNodes(context);
39
+ const bundlerLimitations = addJavaScriptBundlerNodes(context);
38
40
  const relationshipOmissions = addJavaScriptModuleRelationships(context);
39
- addJavaScriptStaticFindings(context);
41
+ const findingLimitations = addJavaScriptStaticFindings(context);
40
42
  addElectronBoundaries(context);
41
43
  addJavaScriptHtmlRoles(context);
42
44
  addJavaScriptSourceMapOriginals(context);
@@ -49,7 +51,11 @@ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
49
51
  nodes: accumulator.nodes(),
50
52
  edges: accumulator.edges(),
51
53
  coverage,
52
- limitations: graphLimitations(context, coverage.status, relationshipOmissions),
54
+ limitations: [
55
+ ...bundlerLimitations,
56
+ ...findingLimitations,
57
+ ...graphLimitations(context, coverage.status, relationshipOmissions),
58
+ ],
53
59
  };
54
60
  };
55
61
  const graphCoverage = (context) => {
@@ -104,11 +110,7 @@ const graphLimitations = (context, coverage, relationshipOmissions) => {
104
110
  javascript.electron.native_addon_bindings.length), 0);
105
111
  return [
106
112
  ...context.analysis.limitations,
107
- ...(relationshipOmissions.selfImports > 0
108
- ? [
109
- `${String(relationshipOmissions.selfImports)} import ${relationshipOmissions.selfImports === 1 ? "specifier" : "specifiers"} resolved back to the importing module itself and ${relationshipOmissions.selfImports === 1 ? "was" : "were"} omitted; application graph edges cannot be self-referential.`,
110
- ]
111
- : []),
113
+ ...selfReferenceOmissions(relationshipOmissions.selfImports, ["import specifier", "import specifiers"], "the importing module"),
112
114
  "CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.",
113
115
  "Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.",
114
116
  "Static imports, entrypoints, workers, endpoints, and storage relationships do not prove runtime execution.",
@@ -1,7 +1,8 @@
1
- import { addAstContainsEdge, artifactLocalIdentity, chunkLookupKey, javascriptAnalysisCoverage, moduleLookupKey, } from "./JavaScriptArtifactGraphContext.js";
1
+ import { addAstContainsEdge, artifactLocalIdentity, chunkLookupKey, javascriptAnalysisCoverage, moduleLookupKey, selfReferenceOmissions, } from "./JavaScriptArtifactGraphContext.js";
2
2
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
3
- /** Project Webpack/Rspack chunk and factory literals recovered from AST. */
3
+ /** Project Webpack/Rspack AST literals and disclose unrepresentable relationships. */
4
4
  export const addJavaScriptBundlerNodes = (context) => {
5
+ let selfAsyncChunks = 0;
5
6
  for (const analyzed of context.analysis.files) {
6
7
  const { file, javascript } = analyzed;
7
8
  const asset = context.assetNodes.get(file.path);
@@ -31,8 +32,9 @@ export const addJavaScriptBundlerNodes = (context) => {
31
32
  addBundlerModuleNodes(context, { ...input, chunk });
32
33
  }
33
34
  for (const record of records)
34
- addBundlerRuntimeEdges(context, record);
35
+ selfAsyncChunks += addBundlerRuntimeEdges(context, record);
35
36
  }
37
+ return selfReferenceOmissions(selfAsyncChunks, ["bundler async-chunk reference", "bundler async-chunk references"], "the requesting chunk");
36
38
  };
37
39
  const createBundlerChunkNode = (context, input) => {
38
40
  const { file, registration, coverage, limitations } = input;
@@ -119,6 +121,7 @@ const addBundlerModuleNodes = (context, input) => {
119
121
  }
120
122
  };
121
123
  const addBundlerRuntimeEdges = (context, record) => {
124
+ let selfAsyncChunks = 0;
122
125
  const { file, registration, chunk, coverage } = record;
123
126
  for (const moduleKey of registration.entry_module_keys) {
124
127
  const resolved = context.moduleNodes.get(moduleLookupKey(file.path, moduleKey));
@@ -147,6 +150,10 @@ const addBundlerRuntimeEdges = (context, record) => {
147
150
  for (const chunkKey of registration.async_chunk_keys) {
148
151
  const lookup = chunkLookupKey(file.path, registration.runtime, chunkKey);
149
152
  const resolved = context.chunkNodes.get(lookup);
153
+ if (resolved?.node_id === chunk.node_id) {
154
+ selfAsyncChunks++;
155
+ continue;
156
+ }
150
157
  const target = resolved ?? unresolvedBundlerChunkNode(context, record, chunkKey);
151
158
  context.accumulator.addEdge({
152
159
  source_node_id: chunk.node_id,
@@ -169,6 +176,7 @@ const addBundlerRuntimeEdges = (context, record) => {
169
176
  }),
170
177
  });
171
178
  }
179
+ return selfAsyncChunks;
172
180
  };
173
181
  const unresolvedBundlerModuleNode = (context, record, moduleKey) => context.accumulator.addNode({
174
182
  kind: "javascript-module",
@@ -161,6 +161,15 @@ export const linkElectronRoleToAsset = (context, input) => {
161
161
  }),
162
162
  });
163
163
  };
164
+ /**
165
+ * Disclose relationships omitted because they resolved to their own source;
166
+ * the application graph forbids self-referential edges.
167
+ */
168
+ export const selfReferenceOmissions = (count, noun, owner) => count === 0
169
+ ? []
170
+ : [
171
+ `${String(count)} ${count === 1 ? noun[0] : noun[1]} resolved back to ${owner} itself and ${count === 1 ? "was" : "were"} omitted; application graph edges cannot be self-referential.`,
172
+ ];
164
173
  /** Deterministic key for one recovered module inside a bundle asset. */
165
174
  export const moduleLookupKey = (path, moduleKey) => `${path}\0${moduleKey}`;
166
175
  /** Deterministic key for one recovered bundler chunk inside a bundle asset. */
@@ -109,16 +109,16 @@ export const addJavaScriptSourceMapOriginals = (context) => {
109
109
  strategy: "source-map-original",
110
110
  stability: "source-map-exact",
111
111
  source_map_sha256: mapFile.sha256,
112
- original_source: original.source,
112
+ original_source: original.reference.source_name,
113
+ source_root: original.reference.source_root,
113
114
  source_sha256: original.content_sha256,
114
115
  },
115
116
  observations: [
116
117
  {
117
- label: original.source,
118
+ label: original.reference.source_name || null,
119
+ source_map_reference: original.reference,
118
120
  properties: {
119
- source: original.source,
120
121
  content_available: original.content !== null,
121
- source_sha256: original.content_sha256,
122
122
  },
123
123
  evidence: artifactObservationEvidence({
124
124
  sha256: mapFile.sha256,
@@ -134,7 +134,10 @@ export const addJavaScriptSourceMapOriginals = (context) => {
134
134
  source_node_id: mapNode.node_id,
135
135
  target_node_id: node.node_id,
136
136
  relation: "contains",
137
- properties: { original_source: original.source },
137
+ properties: {
138
+ original_source: original.reference.source_name,
139
+ source_root: original.reference.source_root,
140
+ },
138
141
  evidence: artifactObservationEvidence({
139
142
  sha256: mapFile.sha256,
140
143
  path: mapFile.path,
@@ -1,8 +1,9 @@
1
- import { addStaticInferenceEdge, artifactLocalIdentity, chunkLookupKey, createElectronRoleNode, javascriptAnalysisCoverage, linkElectronRoleToAsset, moduleLookupKey, resolveArtifactPath, sourceNodeFor, } from "./JavaScriptArtifactGraphContext.js";
1
+ import { addStaticInferenceEdge, artifactLocalIdentity, chunkLookupKey, createElectronRoleNode, javascriptAnalysisCoverage, linkElectronRoleToAsset, moduleLookupKey, resolveArtifactPath, selfReferenceOmissions, sourceNodeFor, } from "./JavaScriptArtifactGraphContext.js";
2
2
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
3
3
  import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
4
4
  /** Project imports, workers, roles, endpoints, storage, and source-map links. */
5
5
  export const addJavaScriptStaticFindings = (context) => {
6
+ const omissions = { selfReferences: 0 };
6
7
  for (const analyzed of context.analysis.files) {
7
8
  const { file, javascript } = analyzed;
8
9
  const asset = context.assetNodes.get(file.path);
@@ -10,7 +11,7 @@ export const addJavaScriptStaticFindings = (context) => {
10
11
  continue;
11
12
  const coverage = javascriptAnalysisCoverage(javascript);
12
13
  for (const value of javascript.references)
13
- addReference(context, { file, asset, value, coverage });
14
+ addReference(context, { file, asset, value, coverage }, omissions);
14
15
  for (const value of javascript.endpoints)
15
16
  addEndpoint(context, { file, asset, value, coverage });
16
17
  for (const value of javascript.storage)
@@ -20,8 +21,9 @@ export const addJavaScriptStaticFindings = (context) => {
20
21
  for (const value of javascript.source_map_urls)
21
22
  addSourceMapEdge(context, { file, asset, value, coverage });
22
23
  }
24
+ return selfReferenceOmissions(omissions.selfReferences, ["static reference", "static references"], "the referencing module");
23
25
  };
24
- const addReference = (context, input) => {
26
+ const addReference = (context, input, omissions) => {
25
27
  const source = sourceNodeFor(context, input.file.path, input.value.module_key) ??
26
28
  input.asset;
27
29
  const resolved = input.value.specifier === null
@@ -70,6 +72,13 @@ const addReference = (context, input) => {
70
72
  });
71
73
  return;
72
74
  }
75
+ // A reference that resolves to its own source, such as a bundled module
76
+ // requiring its own key, cannot become an edge: the application graph
77
+ // forbids self-referential edges and one would fail the whole analysis.
78
+ if (resolved?.node.node_id === source.node_id) {
79
+ omissions.selfReferences += 1;
80
+ return;
81
+ }
73
82
  const target = resolved?.node ??
74
83
  unresolvedReferenceNode(context, input.file, input.value, input.coverage);
75
84
  addStaticInferenceEdge(context, {
@@ -2,7 +2,6 @@ import { completeApplicationCoverage } from "../../domain/javascript/javascriptA
2
2
  import { addArtifactContainsEdge, addUnavailableStaticParseScope, artifactFileNodeKind, artifactLocalIdentity, createElectronRoleNode, linkElectronRoleToAsset, } from "./JavaScriptArtifactGraphContext.js";
3
3
  import { artifactObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
4
4
  import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
5
- export { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
6
5
  /** Create the exact root artifact node from the inventory manifest. */
7
6
  export const createJavaScriptArtifactRootNode = (accumulator, snapshot) => {
8
7
  const root = snapshot.nodes.find(({ artifact_id: id }) => id === snapshot.manifest.root_artifact_id);
@@ -1,6 +1,6 @@
1
1
  import { builtinModules } from "node:module";
2
2
  import { posix } from "node:path";
3
- import { admitsCanonicalPathSyntax, hasScheme, looksExternal, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
3
+ import { admitsCanonicalPathSyntax, hasScheme, htmlUrlText, looksExternal, percentDecodeUrlPath, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
4
4
  const EXTENSIONS = [
5
5
  ".js",
6
6
  ".cjs",
@@ -32,12 +32,16 @@ const resolvePackagePath = (input, packageChain, mode = "full", exportsTargetUrl
32
32
  `The exact HTML resource ${confined} was not found among the selected application files.`,
33
33
  ],
34
34
  });
35
- const resolved = mode === "files-and-index"
36
- ? (resolveFileCandidates(input, [
37
- ...fileCandidates(confined),
38
- ...indexCandidates(confined),
39
- ]) ?? notFoundCandidate())
40
- : resolveCandidate(input, confined, packageChain);
35
+ // An exports target names one exact file; Node tries no extension or index.
36
+ const resolved = exportsTargetUrl
37
+ ? (resolveFileCandidates(input, [confined]) ??
38
+ exactExportsTargetNotFound(confined))
39
+ : mode === "files-and-index"
40
+ ? (resolveFileCandidates(input, [
41
+ ...fileCandidates(confined),
42
+ ...indexCandidates(confined),
43
+ ]) ?? notFoundCandidate())
44
+ : resolveCandidate(input, confined, packageChain);
41
45
  return outcome(input, resolved);
42
46
  };
43
47
  const rejectDeclaration = (input) => {
@@ -148,7 +152,7 @@ const hasContainerCandidate = (files, candidate, containerSha256) => [
148
152
  file.container_sha256 === containerSha256));
149
153
  });
150
154
  const htmlCandidate = (input) => {
151
- const declared = stripQueryAndFragment(input.declaredPath);
155
+ const declared = stripQueryAndFragment(htmlUrlText(input.declaredPath));
152
156
  if (looksExternal(declared))
153
157
  return unresolvedOutcome(input, "external", [
154
158
  "External HTML references are not mapped to local artifact assets.",
@@ -156,15 +160,26 @@ const htmlCandidate = (input) => {
156
160
  const rawBase = input.htmlBaseHref;
157
161
  const base = rawBase === undefined || rawBase === null
158
162
  ? rawBase
159
- : stripQueryAndFragment(rawBase);
163
+ : stripQueryAndFragment(htmlUrlText(rawBase));
160
164
  if (base !== undefined && base !== null && looksExternal(base))
161
165
  return unresolvedOutcome(input, "external", [
162
166
  "The document base href is external, so its script reference is not a local artifact path.",
163
167
  ]);
164
- if (declared.startsWith("/"))
165
- return declared.slice(1);
168
+ // Removing URL tabs and newlines can join an encoded dot or separator that
169
+ // the raw declaration split, so admit the parsed URL text again.
170
+ if (!admitsCanonicalPathSyntax(declared))
171
+ return unresolvedOutcome(input, "rejected", [
172
+ "Encoded dot or separator bytes are rejected before artifact path resolution.",
173
+ ]);
174
+ const declaredPath = percentDecodeUrlPath(declared);
175
+ if (declaredPath === null)
176
+ return unresolvedOutcome(input, "rejected", [
177
+ "The HTML reference path percent-decodes to NUL or to bytes that are not UTF-8.",
178
+ ]);
179
+ if (declaredPath.startsWith("/"))
180
+ return declaredPath.slice(1);
166
181
  if (base === undefined || base === null || base === "")
167
- return posix.join(posix.dirname(input.sourcePath), declared);
182
+ return posix.join(posix.dirname(input.sourcePath), declaredPath);
168
183
  // A local base href is a second untrusted path input; apply the same
169
184
  // admission rules a declared path gets so it cannot smuggle traversal or
170
185
  // separator syntax past canonicalization.
@@ -172,10 +187,15 @@ const htmlCandidate = (input) => {
172
187
  return unresolvedOutcome(input, "rejected", [
173
188
  "The document base href uses NUL, backslash, or encoded dot and separator bytes that are not admitted for canonical artifact paths.",
174
189
  ]);
175
- const basePath = base.startsWith("/")
176
- ? base.slice(1)
177
- : posix.join(posix.dirname(input.sourcePath), base);
178
- return posix.join(htmlBaseDirectory(base, basePath), declared);
190
+ const decodedBase = percentDecodeUrlPath(base);
191
+ if (decodedBase === null)
192
+ return unresolvedOutcome(input, "rejected", [
193
+ "The document base href path percent-decodes to NUL or to bytes that are not UTF-8.",
194
+ ]);
195
+ const basePath = decodedBase.startsWith("/")
196
+ ? decodedBase.slice(1)
197
+ : posix.join(posix.dirname(input.sourcePath), decodedBase);
198
+ return posix.join(htmlBaseDirectory(decodedBase, basePath), declaredPath);
179
199
  };
180
200
  /**
181
201
  * The directory a relative HTML reference resolves against. A base path
@@ -431,6 +451,13 @@ const notFoundCandidate = () => ({
431
451
  "No extension, directory package, or index candidate exists in the inventoried artifact container.",
432
452
  ],
433
453
  });
454
+ const exactExportsTargetNotFound = (path) => ({
455
+ resolvedPath: null,
456
+ status: "not-found",
457
+ limitations: [
458
+ `The selected package exports target ${path} does not exist in the inventoried artifact container; exports targets are exact files, so no extension or directory index was tried.`,
459
+ ],
460
+ });
434
461
  const fileUrlPath = (value) => {
435
462
  if (!value.startsWith("file://"))
436
463
  return undefined;
@@ -1,11 +1,13 @@
1
- import { lstat, realpath } from "node:fs/promises";
1
+ import { constants } from "node:fs";
2
+ import { access, lstat, realpath } from "node:fs/promises";
2
3
  import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
4
+ import { AnalysisAccessDeniedError, AnalysisInputError, AnalysisUnsupportedTargetError, } from "../../domain/analysisErrorCore.js";
3
5
  import { createJavaScriptArtifactReader as createReader } from "../../artifacts/javascript/JavaScriptArtifactReader.js";
4
6
  import { analyzeAndProjectJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js";
5
7
  import { readJavaScriptArtifactFiles } from "../../artifacts/javascript/JavaScriptArtifactFiles.js";
6
8
  import { buildImmutableJavaScriptArtifactGraphSteps } from "./JavaScriptArtifactGraphBuilder.js";
7
9
  import { javascriptArtifactReconstructionInputSchema, } from "./JavaScriptArtifactReconstructionInput.js";
8
- import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/ArtifactInventory.js";
10
+ import { scanCanonicalArtifactInventory } from "../../artifacts/inventory/scanCanonical.js";
9
11
  import { summarizeElectronBoundaries } from "./ElectronBoundaryAnalysis.js";
10
12
  import { createJavaScriptSemanticGraphProjection } from "./JavaScriptSemanticGraphBuilder.js";
11
13
  import { checkpointJavaScriptAnalysis, completeJavaScriptAnalysisSteps, } from "./JavaScriptAnalysisControl.js";
@@ -17,7 +19,7 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
17
19
  };
18
20
  const input = javascriptArtifactReconstructionInputSchema.parse(rawInput);
19
21
  abortIfNeeded(signal);
20
- const path = await realpath(input.input_path);
22
+ const path = await resolveSelectedInput(input.input_path);
21
23
  const format = await resolveFormat(path, input);
22
24
  const snapshot = await scanCanonicalArtifactInventory(path, { signal });
23
25
  if (snapshot.manifest.root_format !== format)
@@ -46,7 +48,7 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
46
48
  const graph = await completeJavaScriptAnalysisSteps(applicationGraphSteps, signal);
47
49
  await reportPhase("build_javascript_semantic_graph", "Binding and validating static semantic relationships");
48
50
  const semanticGraphSteps = semanticProjection.finishImmutableSteps(snapshot.manifest.root_sha256, graph, analysis);
49
- await reportPhase("seal_javascript_semantic_graph", "Sealing the validated semantic graph");
51
+ await reportPhase("seal_javascript_semantic_graph", "Validating and sealing the semantic graph");
50
52
  const semanticGraph = await completeJavaScriptAnalysisSteps(semanticGraphSteps, signal);
51
53
  await checkpointJavaScriptAnalysis(signal);
52
54
  return {
@@ -77,6 +79,35 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal, progress)
77
79
  await reader.close();
78
80
  }
79
81
  };
82
+ const OPERATION = "analyze_javascript_application";
83
+ /**
84
+ * Resolve the caller-selected input. A missing or unreadable selection is a
85
+ * caller or host-permission failure, not a damaged artifact.
86
+ */
87
+ const resolveSelectedInput = async (inputPath) => {
88
+ try {
89
+ const path = await realpath(inputPath);
90
+ await access(path, constants.R_OK);
91
+ return path;
92
+ }
93
+ catch (cause) {
94
+ const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
95
+ if (code === "EACCES" || code === "EPERM")
96
+ throw new AnalysisAccessDeniedError(OPERATION, inputPath, code, {
97
+ cause,
98
+ });
99
+ if (code === "ENOENT" || code === "ENOTDIR")
100
+ throw new AnalysisInputError(OPERATION, { cause }, [
101
+ {
102
+ path: ["input_path"],
103
+ reason: "invalid_value",
104
+ message: `No file or directory exists at the selected input path (${code}): ${inputPath}`,
105
+ },
106
+ ]);
107
+ throw cause;
108
+ }
109
+ };
110
+ /** The selected input's kind, checked against the caller's requested format. */
80
111
  const resolveFormat = async (path, input) => {
81
112
  const metadata = await lstat(path);
82
113
  const observed = metadata.isDirectory()
@@ -85,9 +116,18 @@ const resolveFormat = async (path, input) => {
85
116
  ? "asar"
86
117
  : undefined;
87
118
  if (observed === undefined)
88
- throw new ArtifactReaderFailure("format", `JavaScript artifact reconstruction accepts only a directory or .asar file: ${path}`);
119
+ throw new AnalysisUnsupportedTargetError(OPERATION, input.input_path, "JavaScript application analysis accepts only a directory or an .asar file", {
120
+ remediationAction: "Select an extracted application directory, an app bundle, or an .asar file such as Contents/Resources/app.asar.",
121
+ });
89
122
  if (input.format !== "auto" && input.format !== observed)
90
- throw new ArtifactReaderFailure("format", `Requested ${input.format} input but observed ${observed}: ${path}`);
123
+ throw new AnalysisInputError(OPERATION, undefined, [
124
+ {
125
+ path: ["format"],
126
+ reason: "invalid_value",
127
+ message: `Requested ${input.format} input, but the selected input is ${observed === "asar" ? "an .asar file" : "a directory"}: ${input.input_path}`,
128
+ expected: ["auto", observed],
129
+ },
130
+ ]);
91
131
  return observed;
92
132
  };
93
133
  const abortIfNeeded = (signal) => {
@@ -6,7 +6,7 @@ import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SE
6
6
  import { addAstContainsEdge, artifactLocalIdentity, } from "./JavaScriptArtifactGraphContext.js";
7
7
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
8
8
  import { resolveArtifactPathByContext, } from "./JavaScriptArtifactPathResolution.js";
9
- import { projectJavaScriptExportReturnShapes } from "./JavaScriptReturnShapeProjection.js";
9
+ import { projectJavaScriptExportReturnShapes } from "../../domain/javascript/javascriptExportReturnShapeProjection.js";
10
10
  /** Create one path-scoped source-module identity for every analyzed source file. */
11
11
  export const addJavaScriptSourceModules = (context) => {
12
12
  for (const analyzed of context.analysis.files) {
@@ -18,11 +18,11 @@ export const observeJavaScriptRuntime = async (provider, input, options = {}) =>
18
18
  if (!ready.ok)
19
19
  return ready;
20
20
  const result = await ready.value.observe(input, options);
21
+ if (!result.ok)
22
+ return result;
21
23
  if (options.signal?.aborted === true)
22
24
  return err(new AnalysisCancelledError("observe_javascript_runtime"));
23
- return result.ok
24
- ? ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()))
25
- : result;
25
+ return ok(createJavaScriptRuntimeObservationEvidence("observe_javascript_runtime", input, result.value, ready.value.identity()));
26
26
  };
27
27
  const requireProvider = (provider, operation) => provider === undefined
28
28
  ? err(new AnalysisCapabilityUnavailableError("rea-v8-inspector", operation, "V8 Inspector observation provider is not configured"))
@@ -1,7 +1,6 @@
1
1
  import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
2
2
  import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
3
3
  import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
4
- import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
5
4
  /** Project literal EventEmitter registrations, removals, and dispatches. */
6
5
  export const projectSemanticEvents = (context) => {
7
6
  const eventNodes = new Map();
@@ -116,7 +115,7 @@ export const projectSemanticTimers = (context) => {
116
115
  };
117
116
  const projectTimerSchedule = (context, operation, timerNodes) => {
118
117
  addSemanticGraphRelation(context.state, {
119
- source: semanticCallSiteAt(context, operation.location),
118
+ source: context.callSiteAt(operation.location),
120
119
  target: timerNodes.get(operation.timerId),
121
120
  relation: "schedules-timer",
122
121
  resolution: "resolved",
@@ -134,7 +133,7 @@ const projectTimerSchedule = (context, operation, timerNodes) => {
134
133
  });
135
134
  };
136
135
  const projectTimerCancellation = (context, operation, timerNodes) => {
137
- const callSite = semanticCallSiteAt(context, operation.location);
136
+ const callSite = context.callSiteAt(operation.location);
138
137
  const target = operation.linkedTimerId === null
139
138
  ? undefined
140
139
  : timerNodes.get(operation.linkedTimerId);