rea-agents 6.2.0 → 6.4.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 (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -1,21 +1,37 @@
1
- import { createJavaScriptApplicationGraph, createImmutableJavaScriptApplicationGraphSteps, } from "../../domain/javascript/javascriptApplicationGraph.js";
1
+ import { ELECTRON_IDENTITY_LIMITATION } from "../../domain/javascript/javascriptElectronMemberWrites.js";
2
+ import { createJavaScriptApplicationGraph, sealTransferredJavaScriptApplicationGraphSteps, } from "../../domain/javascript/javascriptApplicationGraph.js";
2
3
  import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js";
3
4
  import { selfReferenceOmissions, } from "./JavaScriptArtifactGraphContext.js";
4
5
  import { addJavaScriptHtmlRoles, addJavaScriptSourceMapOriginals, } from "./JavaScriptArtifactGraphDocuments.js";
5
- import { addJavaScriptStaticFindings } from "./JavaScriptArtifactGraphFindings.js";
6
- import { addJavaScriptModuleRelationships, addJavaScriptSourceModules, } from "./JavaScriptModuleRelationships.js";
6
+ import { addJavaScriptStaticFindingsSteps } from "./JavaScriptArtifactGraphFindings.js";
7
+ import { addJavaScriptModuleRelationshipsSteps, addJavaScriptSourceModules, } from "./JavaScriptModuleRelationships.js";
7
8
  import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
8
- import { semanticCoverageResourceLimits } from "../../domain/javascript/javascriptSemanticCoverage.js";
9
- import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT, semanticResourceLimitReason, } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
9
+ import { semanticCoverageResourceLimits, semanticResourceLimitCoverage, } from "../../domain/javascript/javascriptSemanticCoverage.js";
10
+ import { semanticResourceLimitReason } from "../../domain/javascript/javascriptSemanticResourceLimits.js";
10
11
  import { addJavaScriptArtifactContainers, addJavaScriptArtifactFiles, addJavaScriptPackageNodes, createJavaScriptArtifactRootNode, } from "./JavaScriptArtifactGraphStructure.js";
11
12
  import { addJavaScriptBundlerNodes } from "./JavaScriptArtifactGraphBundlers.js";
12
13
  import { addElectronBoundaries } from "./ElectronBoundaryGraph.js";
13
14
  import { classifyElectronIpcPairings, collectElectronIpcRecords, } from "./ElectronBoundaryAnalysis.js";
14
15
  /** Project artifact and AST facts into JavaScript Application Graph. */
15
- export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => createJavaScriptApplicationGraph(buildJavaScriptArtifactGraphInput(snapshot, fileSet, analysis));
16
- /** Build a validated application graph with cooperative immutable ownership. */
17
- export const buildImmutableJavaScriptArtifactGraphSteps = (snapshot, fileSet, analysis) => createImmutableJavaScriptApplicationGraphSteps(buildJavaScriptArtifactGraphInput(snapshot, fileSet, analysis));
18
- const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
16
+ export const buildJavaScriptArtifactGraph = (snapshot, fileSet, analysis) => createJavaScriptApplicationGraph(completeSynchronously(buildJavaScriptArtifactGraphInputSteps(snapshot, fileSet, analysis)));
17
+ /**
18
+ * Build a validated application graph with cooperative immutable ownership.
19
+ * Constructing the graph input also runs in steps: projecting every module
20
+ * relationship and finding at once held the event loop for seconds.
21
+ */
22
+ export function* buildImmutableJavaScriptArtifactGraphSteps(snapshot, fileSet, analysis) {
23
+ const input = yield* buildJavaScriptArtifactGraphInputSteps(snapshot, fileSet, analysis);
24
+ // The input was built here and is not retained, so it can be transferred.
25
+ return yield* sealTransferredJavaScriptApplicationGraphSteps(input);
26
+ }
27
+ const completeSynchronously = (steps) => {
28
+ for (;;) {
29
+ const step = steps.next();
30
+ if (step.done === true)
31
+ return step.value;
32
+ }
33
+ };
34
+ function* buildJavaScriptArtifactGraphInputSteps(snapshot, fileSet, analysis) {
19
35
  const accumulator = new JavaScriptArtifactGraphAccumulator();
20
36
  const root = createJavaScriptArtifactRootNode(accumulator, snapshot);
21
37
  const context = {
@@ -33,15 +49,33 @@ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
33
49
  containerNodes: new Map([[snapshot.manifest.root_sha256, root]]),
34
50
  };
35
51
  addJavaScriptArtifactContainers(context);
52
+ yield;
36
53
  addJavaScriptArtifactFiles(context);
37
- const packageRoots = addJavaScriptPackageNodes(context);
38
- addJavaScriptSourceModules(context);
39
- const bundlerLimitations = addJavaScriptBundlerNodes(context);
40
- const relationshipOmissions = addJavaScriptModuleRelationships(context);
41
- const findingLimitations = addJavaScriptStaticFindings(context);
42
- addElectronBoundaries(context);
43
- addJavaScriptHtmlRoles(context);
44
- addJavaScriptSourceMapOriginals(context);
54
+ yield;
55
+ // Raw observations remain on the file nodes. Only admitted expansions feed
56
+ // the relationship builders, including their Electron and bundler callers.
57
+ const projectionContext = {
58
+ ...context,
59
+ analysis: {
60
+ ...analysis,
61
+ files: analysis.files.map((file) => file.application_projection_failure === undefined
62
+ ? file
63
+ : { ...file, javascript: null, semantic: null }),
64
+ },
65
+ };
66
+ const packageRoots = addJavaScriptPackageNodes(projectionContext);
67
+ yield;
68
+ addJavaScriptSourceModules(projectionContext);
69
+ yield;
70
+ const bundlerLimitations = addJavaScriptBundlerNodes(projectionContext);
71
+ const relationshipOmissions = yield* addJavaScriptModuleRelationshipsSteps(projectionContext);
72
+ const findingLimitations = yield* addJavaScriptStaticFindingsSteps(projectionContext);
73
+ addElectronBoundaries(projectionContext);
74
+ yield;
75
+ addJavaScriptHtmlRoles(projectionContext);
76
+ yield;
77
+ addJavaScriptSourceMapOriginals(projectionContext);
78
+ yield;
45
79
  const coverage = graphCoverage(context);
46
80
  return {
47
81
  schema: "JavaScriptApplicationGraph",
@@ -57,7 +91,7 @@ const buildJavaScriptArtifactGraphInput = (snapshot, fileSet, analysis) => {
57
91
  ...graphLimitations(context, coverage.status, relationshipOmissions),
58
92
  ],
59
93
  };
60
- };
94
+ }
61
95
  const graphCoverage = (context) => {
62
96
  const resourceLimits = semanticResourceLimits(context);
63
97
  const sourceMapPolicyGap = context.analysis.source_maps.some(({ status }) => status === "invalid");
@@ -65,17 +99,29 @@ const graphCoverage = (context) => {
65
99
  context.analysis.json_modules.some(({ status }) => status !== "included") ||
66
100
  context.analysis.source_maps.some(({ status }) => status === "invalid");
67
101
  const partialJavaScript = context.analysis.files.some(({ javascript }) => javascript !== null && javascript.parse_status === "partial");
68
- const unknownGap = context.analysis.parse_failures > 0 ||
102
+ const unknownGap = context.analysis.files.some(({ analysis_failure, application_projection_failure }) => analysis_failure !== undefined ||
103
+ application_projection_failure !== undefined) ||
104
+ context.analysis.parse_failures > 0 ||
69
105
  context.fileSet.invalid_utf8_files > 0 ||
70
106
  sourceMapPolicyGap ||
71
107
  malformedStructuredData ||
72
108
  partialJavaScript;
73
- if (context.analysis.truncated_scopes > 0)
74
- return partialApplicationCoverage([], null);
75
- if (resourceLimits.length > 0)
76
- return partialApplicationCoverage(resourceLimits.map(applicationGraphResourceLimit), null);
109
+ const executionLimits = context.analysis.files.flatMap(({ analysis_failure, application_projection_failure }) => [analysis_failure, application_projection_failure].flatMap((failure) => failure === undefined
110
+ ? []
111
+ : javaScriptAnalysisCoverageLimits(failure.limits)));
112
+ if (resourceLimits.length > 0 || executionLimits.length > 0)
113
+ return partialApplicationCoverage([
114
+ ...new Map([
115
+ ...semanticResourceLimitCoverage(resourceLimits),
116
+ ...executionLimits,
117
+ ].map((limit) => [JSON.stringify(limit), limit])).values(),
118
+ ], null);
77
119
  if (unknownGap)
78
120
  return partialApplicationCoverage([], null);
121
+ if (context.snapshot.integrity_contradictions.length > 0) {
122
+ const nestedArchiveWasOpaque = context.snapshot.integrity_contradictions.some(({ logical_path }) => logical_path.toLowerCase().endsWith(".asar"));
123
+ return partialApplicationCoverage([], nestedArchiveWasOpaque ? null : 0);
124
+ }
79
125
  return completeApplicationCoverage();
80
126
  };
81
127
  const semanticResourceLimits = (context) => [
@@ -83,19 +129,6 @@ const semanticResourceLimits = (context) => [
83
129
  ? []
84
130
  : semanticCoverageResourceLimits(semantic.ir.coverage))),
85
131
  ].sort();
86
- const applicationGraphResourceLimit = (resourceLimit) => ({
87
- name: `javascript_semantic_${resourceLimit.replaceAll("-", "_")}`,
88
- value: resourceLimit === "primitive-candidates"
89
- ? SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT
90
- : resourceLimit === "primitive-bytes"
91
- ? SEMANTIC_PRIMITIVE_JSON_BYTES_LIMIT
92
- : SEMANTIC_EXPRESSION_DEPTH_LIMIT,
93
- unit: resourceLimit === "expression-depth"
94
- ? "depth"
95
- : resourceLimit === "primitive-bytes"
96
- ? "bytes"
97
- : "items",
98
- });
99
132
  const graphLimitations = (context, coverage, relationshipOmissions) => {
100
133
  const ipc = collectElectronIpcRecords(context.analysis);
101
134
  const pairings = classifyElectronIpcPairings(ipc);
@@ -110,10 +143,14 @@ const graphLimitations = (context, coverage, relationshipOmissions) => {
110
143
  javascript.electron.native_addon_bindings.length), 0);
111
144
  return [
112
145
  ...context.analysis.limitations,
146
+ ...context.snapshot.integrity_contradictions.map(({ logical_path: path }) => `Artifact integrity metadata contradicts observed bytes at ${path}; the observed bytes are untrusted.`),
113
147
  ...selfReferenceOmissions(relationshipOmissions.selfImports, ["import specifier", "import specifiers"], "the importing module"),
114
148
  "CommonJS and ESM binding relationships were recovered from inert syntax and resolved only within the inventoried artifact container.",
115
149
  "Webpack/Rspack factories were recovered from AST literals; REA did not invoke push handlers or bundle bootstrap code.",
116
150
  "Static imports, entrypoints, workers, endpoints, and storage relationships do not prove runtime execution.",
151
+ ...(context.analysis.files.some(({ javascript }) => javascript?.limitations.includes(ELECTRON_IDENTITY_LIMITATION))
152
+ ? [ELECTRON_IDENTITY_LIMITATION]
153
+ : []),
117
154
  ...(electronFindings === 0
118
155
  ? []
119
156
  : [
@@ -147,3 +184,4 @@ const graphLimitations = (context, coverage, relationshipOmissions) => {
147
184
  ]),
148
185
  ];
149
186
  };
187
+ import { javaScriptAnalysisCoverageLimits } from "../../domain/javascript/javascriptAnalysisResourceControls.js";
@@ -1,3 +1,4 @@
1
+ import { compositeKey } from "../../domain/unicodeCodePointOrder.js";
1
2
  import { addAstContainsEdge, artifactLocalIdentity, chunkLookupKey, javascriptAnalysisCoverage, moduleLookupKey, selfReferenceOmissions, } from "./JavaScriptArtifactGraphContext.js";
2
3
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
3
4
  /** Project Webpack/Rspack AST literals and disclose unrepresentable relationships. */
@@ -41,7 +42,7 @@ const createBundlerChunkNode = (context, input) => {
41
42
  const chunkKey = `${registration.runtime}:${registration.chunk_keys.join(",")}`;
42
43
  return context.accumulator.addNode({
43
44
  kind: "javascript-chunk",
44
- identity: artifactLocalIdentity(file.sha256, "bundler-chunk", chunkKey),
45
+ identity: artifactLocalIdentity(file.sha256, "bundler-chunk", compositeKey([registration.runtime, registration.chunk_keys])),
45
46
  observations: [
46
47
  {
47
48
  label: chunkKey,
@@ -104,7 +105,7 @@ const addBundlerModuleNodes = (context, input) => {
104
105
  },
105
106
  ],
106
107
  });
107
- context.moduleNodes.set(moduleLookupKey(file.path, moduleValue.module_key), module);
108
+ context.moduleNodes.set(moduleLookupKey(file.path, registration.runtime, moduleValue.module_key), module);
108
109
  addAstContainsEdge(context, {
109
110
  source: chunk,
110
111
  target: module,
@@ -124,7 +125,7 @@ const addBundlerRuntimeEdges = (context, record) => {
124
125
  let selfAsyncChunks = 0;
125
126
  const { file, registration, chunk, coverage } = record;
126
127
  for (const moduleKey of registration.entry_module_keys) {
127
- const resolved = context.moduleNodes.get(moduleLookupKey(file.path, moduleKey));
128
+ const resolved = context.moduleNodes.get(moduleLookupKey(file.path, registration.runtime, moduleKey));
128
129
  const target = resolved ?? unresolvedBundlerModuleNode(context, record, moduleKey);
129
130
  context.accumulator.addEdge({
130
131
  source_node_id: chunk.node_id,
@@ -1,3 +1,4 @@
1
+ import { compositeKey } from "../../domain/unicodeCodePointOrder.js";
1
2
  import { completeApplicationCoverage, partialApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
2
3
  import { JavaScriptArtifactGraphAccumulator } from "./JavaScriptArtifactGraphAccumulator.js";
3
4
  import { artifactObservationEvidence, astObservationEvidence, staticInferenceEvidence, unavailableAstEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
@@ -63,12 +64,15 @@ export const addUnavailableStaticParseScope = (context, input) => {
63
64
  path: input.file.path,
64
65
  operation: input.operation,
65
66
  limitation: input.limitation,
67
+ ...(input.failure === undefined
68
+ ? {}
69
+ : { analysis_failure: input.failure }),
66
70
  },
67
71
  evidence: unavailableAstEvidence({
68
72
  sha256: input.file.sha256,
69
73
  path: input.file.path,
70
74
  operation: input.operation,
71
- coverage: partialApplicationCoverage([], null),
75
+ coverage: partialApplicationCoverage(input.limits ?? [], null),
72
76
  limitation: input.limitation,
73
77
  }),
74
78
  },
@@ -171,9 +175,9 @@ export const selfReferenceOmissions = (count, noun, owner) => count === 0
171
175
  `${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
176
  ];
173
177
  /** Deterministic key for one recovered module inside a bundle asset. */
174
- export const moduleLookupKey = (path, moduleKey) => `${path}\0${moduleKey}`;
178
+ export const moduleLookupKey = (path, runtime, moduleKey) => compositeKey([path, runtime, moduleKey]);
175
179
  /** Deterministic key for one recovered bundler chunk inside a bundle asset. */
176
- export const chunkLookupKey = (path, runtime, chunkKey) => `${path}\0${runtime}\0${chunkKey}`;
180
+ export const chunkLookupKey = (path, runtime, chunkKey) => compositeKey([path, runtime, chunkKey]);
177
181
  /** Resolve a relative static specifier without escaping the artifact root. */
178
182
  export const resolveArtifactPath = (specifier, sourcePath, files, moduleKind) => resolveArtifactPathByContext({
179
183
  declaredPath: specifier,
@@ -183,6 +187,8 @@ export const resolveArtifactPath = (specifier, sourcePath, files, moduleKind) =>
183
187
  ...(moduleKind === undefined ? {} : { moduleKind }),
184
188
  }).resolved_path;
185
189
  /** Locate the recovered module that owns a static finding. */
186
- export const sourceNodeFor = (context, path, moduleKey) => moduleKey === null
190
+ export const sourceNodeFor = (context, path, moduleKey, runtime) => moduleKey === null
187
191
  ? context.sourceModuleNodes.get(path)
188
- : context.moduleNodes.get(moduleLookupKey(path, moduleKey));
192
+ : runtime === undefined
193
+ ? undefined
194
+ : context.moduleNodes.get(moduleLookupKey(path, runtime, moduleKey));
@@ -1,10 +1,13 @@
1
+ import { createHash } from "node:crypto";
2
+ import { compactStringIdentityKey } from "../../domain/compactStringIdentity.js";
1
3
  import { addStaticInferenceEdge, artifactLocalIdentity, chunkLookupKey, createElectronRoleNode, javascriptAnalysisCoverage, linkElectronRoleToAsset, moduleLookupKey, resolveArtifactPath, selfReferenceOmissions, sourceNodeFor, } from "./JavaScriptArtifactGraphContext.js";
2
4
  import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
3
5
  import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
4
6
  /** Project imports, workers, roles, endpoints, storage, and source-map links. */
5
- export const addJavaScriptStaticFindings = (context) => {
7
+ export function* addJavaScriptStaticFindingsSteps(context) {
6
8
  const omissions = { selfReferences: 0 };
7
9
  for (const analyzed of context.analysis.files) {
10
+ yield;
8
11
  const { file, javascript } = analyzed;
9
12
  const asset = context.assetNodes.get(file.path);
10
13
  if (javascript === null || asset === undefined)
@@ -22,10 +25,9 @@ export const addJavaScriptStaticFindings = (context) => {
22
25
  addSourceMapEdge(context, { file, asset, value, coverage });
23
26
  }
24
27
  return selfReferenceOmissions(omissions.selfReferences, ["static reference", "static references"], "the referencing module");
25
- };
28
+ }
26
29
  const addReference = (context, input, omissions) => {
27
- const source = sourceNodeFor(context, input.file.path, input.value.module_key) ??
28
- input.asset;
30
+ const source = sourceNodeFor(context, input.file.path, input.value.module_key, input.value.module_runtime) ?? input.asset;
29
31
  const resolved = input.value.specifier === null
30
32
  ? null
31
33
  : resolveReference(context, input.file.path, input.value);
@@ -97,14 +99,15 @@ const addReference = (context, input, omissions) => {
97
99
  });
98
100
  };
99
101
  const addEndpoint = (context, input) => {
100
- const source = sourceNodeFor(context, input.file.path, input.value.module_key) ??
101
- input.asset;
102
+ const source = sourceNodeFor(context, input.file.path, input.value.module_key, input.value.module_runtime) ?? input.asset;
103
+ const key = compactStringIdentityKey(input.value.value);
104
+ const label = `${input.value.kind} endpoint`;
102
105
  const node = context.accumulator.addNode({
103
106
  kind: "endpoint",
104
- identity: artifactLocalIdentity(input.file.sha256, input.value.kind, input.value.value),
107
+ identity: artifactLocalIdentity(input.file.sha256, input.value.kind, key),
105
108
  observations: [
106
109
  {
107
- label: input.value.value,
110
+ label: input.value.value.length <= label.length ? input.value.value : label,
108
111
  properties: {
109
112
  endpoint_kind: input.value.kind,
110
113
  value: input.value.value,
@@ -131,8 +134,7 @@ const addEndpoint = (context, input) => {
131
134
  });
132
135
  };
133
136
  const addStorage = (context, input) => {
134
- const source = sourceNodeFor(context, input.file.path, input.value.module_key) ??
135
- input.asset;
137
+ const source = sourceNodeFor(context, input.file.path, input.value.module_key, input.value.module_runtime) ?? input.asset;
136
138
  const node = context.accumulator.addNode({
137
139
  kind: "storage",
138
140
  identity: artifactLocalIdentity(input.file.sha256, input.value.kind, input.value.name ?? input.value.mechanism),
@@ -179,8 +181,7 @@ const addDiscoveredRole = (context, input) => {
179
181
  range: input.value.location,
180
182
  coverage: input.coverage,
181
183
  });
182
- const source = sourceNodeFor(context, input.file.path, input.value.module_key) ??
183
- input.asset;
184
+ const source = sourceNodeFor(context, input.file.path, input.value.module_key, input.value.module_runtime) ?? input.asset;
184
185
  addStaticInferenceEdge(context, {
185
186
  source,
186
187
  target: role,
@@ -199,6 +200,9 @@ const addDiscoveredRole = (context, input) => {
199
200
  });
200
201
  };
201
202
  const addSourceMapEdge = (context, input) => {
203
+ const declaredUrlSha256 = createHash("sha256")
204
+ .update(input.value.declared_url)
205
+ .digest("hex");
202
206
  const resolvedPath = resolveArtifactPathByContext({
203
207
  declaredPath: input.value.declared_url,
204
208
  sourcePath: input.file.path,
@@ -207,33 +211,37 @@ const addSourceMapEdge = (context, input) => {
207
211
  }).resolved_path;
208
212
  const resolvedFile = resolvedPath === null ? undefined : context.filesByPath.get(resolvedPath);
209
213
  const resolvedNode = resolvedPath === null ? undefined : context.fileNodes.get(resolvedPath);
210
- const target = resolvedFile?.kind === "source-map" && resolvedNode !== undefined
211
- ? resolvedNode
212
- : context.accumulator.addNode({
213
- kind: "source-map",
214
- identity: artifactLocalIdentity(input.file.sha256, "unresolved-source-map", input.value.declared_url),
215
- observations: [
216
- {
217
- label: input.value.declared_url,
218
- properties: {
219
- declared_url: input.value.declared_url,
220
- resolved_path: resolvedPath,
221
- available: false,
222
- },
223
- evidence: staticInferenceEvidence({
224
- sha256: input.file.sha256,
225
- path: input.file.path,
226
- range: input.value.location,
227
- operation: "discover-source-map",
228
- coverage: input.coverage,
229
- confidence: "medium",
230
- limitations: [
214
+ const isAvailable = resolvedFile?.kind === "source-map" && resolvedNode !== undefined;
215
+ const target = context.accumulator.addNode({
216
+ kind: "source-map",
217
+ identity: isAvailable && resolvedNode !== undefined
218
+ ? resolvedNode.identity
219
+ : artifactLocalIdentity(input.file.sha256, "unresolved-source-map", declaredUrlSha256),
220
+ observations: [
221
+ {
222
+ label: "source map reference",
223
+ properties: {
224
+ declared_url: input.value.declared_url,
225
+ declared_url_sha256: declaredUrlSha256,
226
+ resolved_path: resolvedPath,
227
+ available: isAvailable,
228
+ },
229
+ evidence: staticInferenceEvidence({
230
+ sha256: input.file.sha256,
231
+ path: input.file.path,
232
+ range: input.value.location,
233
+ operation: "discover-source-map",
234
+ coverage: input.coverage,
235
+ confidence: "medium",
236
+ limitations: isAvailable
237
+ ? []
238
+ : [
231
239
  "The declared source map was not present in the inventoried artifact.",
232
240
  ],
233
- }),
234
- },
235
- ],
236
- });
241
+ }),
242
+ },
243
+ ],
244
+ });
237
245
  addStaticInferenceEdge(context, {
238
246
  source: input.asset,
239
247
  target,
@@ -242,7 +250,7 @@ const addSourceMapEdge = (context, input) => {
242
250
  coverage: input.coverage,
243
251
  relation: "maps_to",
244
252
  properties: {
245
- declared_url: input.value.declared_url,
253
+ declared_url_sha256: declaredUrlSha256,
246
254
  resolved_path: resolvedPath,
247
255
  },
248
256
  });
@@ -254,7 +262,9 @@ const resolveReference = (context, sourcePath, reference) => {
254
262
  const chunk = resolveBundlerChunkReference(context, sourcePath, reference);
255
263
  if (chunk !== null)
256
264
  return chunk;
257
- const module = context.moduleNodes.get(moduleLookupKey(sourcePath, specifier));
265
+ const module = reference.module_runtime === undefined
266
+ ? undefined
267
+ : context.moduleNodes.get(moduleLookupKey(sourcePath, reference.module_runtime, specifier));
258
268
  if (module !== undefined) {
259
269
  const file = context.filesByPath.get(sourcePath);
260
270
  return file === undefined
@@ -292,9 +302,10 @@ const resolveBundlerChunkReference = (context, sourcePath, reference) => {
292
302
  return null;
293
303
  const registrations = context.analysis.files
294
304
  .find(({ file: analyzedFile }) => analyzedFile.path === sourcePath)
295
- ?.javascript?.bundler_registrations.filter(({ modules }) => reference.module_key === null
296
- ? true
297
- : modules.some(({ module_key: moduleKey }) => moduleKey === reference.module_key));
305
+ ?.javascript?.bundler_registrations.filter(({ runtime, modules }) => reference.module_runtime === undefined
306
+ ? reference.module_key === null
307
+ : runtime === reference.module_runtime &&
308
+ modules.some(({ module_key: moduleKey }) => moduleKey === reference.module_key));
298
309
  if (registrations === undefined)
299
310
  return null;
300
311
  const candidates = registrations.flatMap(({ runtime }) => {
@@ -1,7 +1,10 @@
1
1
  import { completeApplicationCoverage } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
2
- import { addArtifactContainsEdge, addUnavailableStaticParseScope, artifactFileNodeKind, artifactLocalIdentity, createElectronRoleNode, linkElectronRoleToAsset, } from "./JavaScriptArtifactGraphContext.js";
3
- import { artifactObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
2
+ import { jsonValueSchema } from "../../domain/jsonValue.js";
3
+ import { freezeJsonSnapshot } from "../../domain/immutableJson.js";
4
+ import { addArtifactContainsEdge, addUnavailableStaticParseScope, artifactFileNodeKind, artifactLocalIdentity, javascriptAnalysisCoverage, createElectronRoleNode, linkElectronRoleToAsset, } from "./JavaScriptArtifactGraphContext.js";
5
+ import { artifactObservationEvidence, astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
4
6
  import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
7
+ import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
5
8
  /** Create the exact root artifact node from the inventory manifest. */
6
9
  export const createJavaScriptArtifactRootNode = (accumulator, snapshot) => {
7
10
  const root = snapshot.nodes.find(({ artifact_id: id }) => id === snapshot.manifest.root_artifact_id);
@@ -77,9 +80,39 @@ export const addJavaScriptArtifactContainers = (context) => {
77
80
  };
78
81
  /** Project relevant files, ASAR entries, and explicit unavailable parse scopes. */
79
82
  export const addJavaScriptArtifactFiles = (context) => {
83
+ const packagesByPath = indexFirstByPath(context.analysis.packages);
84
+ const jsonModulesByPath = indexFirstByPath(context.analysis.json_modules);
85
+ const sourceMapsByPath = indexFirstByPath(context.analysis.source_maps);
80
86
  for (const analyzed of context.analysis.files) {
81
87
  const { file } = analyzed;
82
- const target = createFileTarget(context, file, analyzed.javascript);
88
+ const jsonValue = jsonModulesByPath.get(file.path);
89
+ const target = createFileTarget(context, file, analyzed.javascript, jsonValue);
90
+ if (analyzed.application_projection_failure !== undefined &&
91
+ analyzed.javascript !== null)
92
+ context.accumulator.addNode({
93
+ kind: target.kind,
94
+ identity: target.identity,
95
+ observations: [
96
+ {
97
+ label: file.path,
98
+ properties: {
99
+ static_analysis: freezeJsonSnapshot(jsonValueSchema.parse(analyzed.javascript)),
100
+ semantic_module_analysis: analyzed.semantic === null
101
+ ? null
102
+ : freezeJsonSnapshot(jsonValueSchema.parse(analyzed.semantic.ir)),
103
+ application_projection_failure: analyzed.application_projection_failure.error,
104
+ },
105
+ evidence: astObservationEvidence({
106
+ sha256: file.sha256,
107
+ path: file.path,
108
+ operation: "retain-unexpanded-static-findings",
109
+ range: sourceFileRange(file),
110
+ coverage: javascriptAnalysisCoverage(analyzed.javascript),
111
+ limitations: [analyzed.application_projection_failure.reason],
112
+ }),
113
+ },
114
+ ],
115
+ });
83
116
  context.fileNodes.set(file.path, target);
84
117
  if (file.kind === "javascript")
85
118
  context.assetNodes.set(file.path, target);
@@ -112,7 +145,16 @@ export const addJavaScriptArtifactFiles = (context) => {
112
145
  }),
113
146
  });
114
147
  }
115
- if (file.kind === "javascript" &&
148
+ if (analyzed.analysis_failure !== undefined)
149
+ addUnavailableStaticParseScope(context, {
150
+ file,
151
+ asset: target,
152
+ operation: "analyze-javascript-source",
153
+ limitation: analyzed.analysis_failure.reason,
154
+ failure: analyzed.analysis_failure.error,
155
+ limits: javaScriptAnalysisCoverageLimits(analyzed.analysis_failure.limits),
156
+ });
157
+ else if (file.kind === "javascript" &&
116
158
  (analyzed.javascript === null ||
117
159
  analyzed.javascript.parse_status === "failed"))
118
160
  addUnavailableStaticParseScope(context, {
@@ -123,7 +165,16 @@ export const addJavaScriptArtifactFiles = (context) => {
123
165
  ? "JavaScript syntax could not be parsed."
124
166
  : `JavaScript text was unavailable: ${file.text.reason}.`,
125
167
  });
126
- const packageValue = context.analysis.packages.find(({ path }) => path === file.path);
168
+ if (analyzed.application_projection_failure !== undefined)
169
+ addUnavailableStaticParseScope(context, {
170
+ file,
171
+ asset: target,
172
+ operation: "project-javascript-application",
173
+ limitation: analyzed.application_projection_failure.reason,
174
+ failure: analyzed.application_projection_failure.error,
175
+ limits: javaScriptAnalysisCoverageLimits(analyzed.application_projection_failure.limits),
176
+ });
177
+ const packageValue = packagesByPath.get(file.path);
127
178
  if (packageValue !== undefined && packageValue.status !== "included")
128
179
  addUnavailableStaticParseScope(context, {
129
180
  file,
@@ -131,7 +182,6 @@ export const addJavaScriptArtifactFiles = (context) => {
131
182
  operation: "parse-package-json",
132
183
  limitation: packageValue.limitation,
133
184
  });
134
- const jsonValue = context.analysis.json_modules.find(({ path }) => path === file.path);
135
185
  if (jsonValue !== undefined && jsonValue.status !== "included")
136
186
  addUnavailableStaticParseScope(context, {
137
187
  file,
@@ -139,7 +189,7 @@ export const addJavaScriptArtifactFiles = (context) => {
139
189
  operation: "parse-json-module",
140
190
  limitation: jsonValue.limitation,
141
191
  });
142
- const sourceMap = context.analysis.source_maps.find(({ path }) => path === file.path);
192
+ const sourceMap = sourceMapsByPath.get(file.path);
143
193
  if (sourceMap !== undefined && sourceMap.status === "invalid")
144
194
  addUnavailableStaticParseScope(context, {
145
195
  file,
@@ -149,9 +199,24 @@ export const addJavaScriptArtifactFiles = (context) => {
149
199
  });
150
200
  }
151
201
  };
202
+ const sourceFileRange = (file) => {
203
+ if (!file.text.included)
204
+ throw new TypeError("Retained static facts require their source text");
205
+ let line = 1;
206
+ let lastLineStart = 0;
207
+ for (const match of file.text.value.matchAll(/\r\n|[\n\r\u2028\u2029]/gu)) {
208
+ line += 1;
209
+ lastLineStart = match.index + match[0].length;
210
+ }
211
+ return {
212
+ start: { line: 1, column: 0 },
213
+ end: { line, column: file.text.value.length - lastLineStart },
214
+ };
215
+ };
152
216
  /** Project package metadata and its declared Electron roles. */
153
217
  export const addJavaScriptPackageNodes = (context) => {
154
218
  const roots = [];
219
+ const rootPath = applicationManifestPath(context);
155
220
  for (const packageValue of context.analysis.packages) {
156
221
  const file = context.filesByPath.get(packageValue.path);
157
222
  if (file === undefined)
@@ -180,7 +245,7 @@ export const addJavaScriptPackageNodes = (context) => {
180
245
  },
181
246
  ],
182
247
  });
183
- if (roots.length === 0) {
248
+ if (file.path === rootPath) {
184
249
  roots.push(node);
185
250
  context.accumulator.addEdge({
186
251
  source_node_id: node.node_id,
@@ -202,6 +267,8 @@ export const addJavaScriptPackageNodes = (context) => {
202
267
  file,
203
268
  operation: "inventory-package",
204
269
  });
270
+ if (dependencyManifest(file.path))
271
+ continue;
205
272
  addPackageRole(context, {
206
273
  packageNode: node,
207
274
  packageFile: file,
@@ -217,9 +284,15 @@ export const addJavaScriptPackageNodes = (context) => {
217
284
  }
218
285
  return roots;
219
286
  };
220
- const createFileTarget = (context, file, javascript) => {
287
+ /** Dependency-only artifacts retain their inventory root. */
288
+ const applicationManifestPath = (context) => context.analysis.packages
289
+ .map(({ path }) => path)
290
+ .filter((path) => context.filesByPath.has(path) && !dependencyManifest(path))
291
+ .sort((left, right) => left.split("/").length - right.split("/").length ||
292
+ compareUnicodeCodePoints(left, right))[0];
293
+ const dependencyManifest = (path) => path.split("/").slice(0, -1).includes("node_modules");
294
+ const createFileTarget = (context, file, javascript, json) => {
221
295
  const kind = artifactFileNodeKind(file.kind);
222
- const json = context.analysis.json_modules.find(({ path }) => path === file.path);
223
296
  return context.accumulator.addNode({
224
297
  kind,
225
298
  identity: {
@@ -253,6 +326,14 @@ const createFileTarget = (context, file, javascript) => {
253
326
  ],
254
327
  });
255
328
  };
329
+ const indexFirstByPath = (values) => {
330
+ const index = new Map();
331
+ for (const value of values) {
332
+ if (!index.has(value.path))
333
+ index.set(value.path, value);
334
+ }
335
+ return index;
336
+ };
256
337
  const createAsarEntry = (context, file) => {
257
338
  const isAsar = context.snapshot.manifest.root_format === "asar" ||
258
339
  file.container_sha256 !== context.snapshot.manifest.root_sha256;
@@ -333,3 +414,4 @@ const containerProperties = (container) => ({
333
414
  bytes: container.bytes,
334
415
  inventory_artifact_id: container.inventory_artifact_id,
335
416
  });
417
+ import { javaScriptAnalysisCoverageLimits } from "../../domain/javascript/javascriptAnalysisResourceControls.js";