rea-agents 6.3.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 (487) hide show
  1. package/README.md +7 -4
  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/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -3,7 +3,7 @@ import { compareUnicodeCodePoints, compositeKey, } from "../unicodeCodePointOrde
3
3
  import { stripQueryAndFragment } from "../artifactPathSyntax.js";
4
4
  import { addLocatedFinding } from "./javascriptStaticAnalysisFindings.js";
5
5
  import { argumentNode, calleeName, range, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
6
- import { propertyName, semanticStaticPropertyName, } from "./javascriptAstValues.js";
6
+ import { propertyName, semanticStaticPropertyKey, } from "./javascriptAstValues.js";
7
7
  /** Inspect JavaScript-side imports and re-exports of native .node addons. */
8
8
  export const inspectElectronNativeNode = (node, context) => {
9
9
  if (t.isImportDeclaration(node))
@@ -20,12 +20,12 @@ export const inspectElectronNativeNode = (node, context) => {
20
20
  const inspectImport = (node, context) => {
21
21
  if (!isNativeSpecifier(node.source.value, "import"))
22
22
  return;
23
- const members = node.specifiers.map((specifier) => {
23
+ const members = node.specifiers.flatMap((specifier) => {
24
24
  if (t.isImportDefaultSpecifier(specifier))
25
- return "default";
25
+ return ["default"];
26
26
  if (t.isImportNamespaceSpecifier(specifier))
27
- return "*";
28
- return propertyName(specifier.imported) || "[dynamic-import]";
27
+ return [];
28
+ return [propertyName(specifier.imported)];
29
29
  });
30
30
  addBinding({
31
31
  context,
@@ -34,6 +34,8 @@ const inspectImport = (node, context) => {
34
34
  kind: "import",
35
35
  moduleKind: "import",
36
36
  members,
37
+ namespaceAccess: node.specifiers.some((value) => t.isImportNamespaceSpecifier(value)),
38
+ dynamicMemberAccess: false,
37
39
  });
38
40
  };
39
41
  const inspectNamedExport = (node, context) => {
@@ -41,10 +43,12 @@ const inspectNamedExport = (node, context) => {
41
43
  node.source === undefined ||
42
44
  !isNativeSpecifier(node.source.value, "import"))
43
45
  return;
44
- const members = node.specifiers.map((specifier) => {
46
+ const members = node.specifiers.flatMap((specifier) => {
45
47
  if (t.isExportSpecifier(specifier))
46
- return propertyName(specifier.local);
47
- return "*";
48
+ return [propertyName(specifier.local)];
49
+ if (t.isExportDefaultSpecifier(specifier))
50
+ return ["default"];
51
+ return [];
48
52
  });
49
53
  addBinding({
50
54
  context,
@@ -53,6 +57,8 @@ const inspectNamedExport = (node, context) => {
53
57
  kind: "re-export",
54
58
  moduleKind: "import",
55
59
  members,
60
+ namespaceAccess: node.specifiers.some((value) => t.isExportNamespaceSpecifier(value)),
61
+ dynamicMemberAccess: false,
56
62
  });
57
63
  };
58
64
  const inspectExportAll = (node, context) => {
@@ -65,7 +71,9 @@ const inspectExportAll = (node, context) => {
65
71
  specifier: node.source.value,
66
72
  kind: "re-export",
67
73
  moduleKind: "import",
68
- members: ["*"],
74
+ members: [],
75
+ namespaceAccess: true,
76
+ dynamicMemberAccess: false,
69
77
  });
70
78
  };
71
79
  const inspectRequireBinding = (node, context) => {
@@ -78,7 +86,7 @@ const inspectRequireBinding = (node, context) => {
78
86
  specifier: required.specifier,
79
87
  kind: "require",
80
88
  moduleKind: "require",
81
- members: required.member === null ? bindingMembers(node.id) : [required.member],
89
+ ...(required.hasMemberAccess ? required.access : bindingMembers(node.id)),
82
90
  });
83
91
  };
84
92
  const inspectReExport = (node, context) => {
@@ -91,26 +99,32 @@ const inspectReExport = (node, context) => {
91
99
  specifier: required.specifier,
92
100
  kind: "re-export",
93
101
  moduleKind: "require",
94
- members: [required.member ?? exportedMember(node.left) ?? "*"],
102
+ ...required.access,
95
103
  });
96
104
  };
97
105
  const addBinding = (input) => {
98
106
  const { context, node, specifier, kind } = input;
99
- const unique = [
100
- ...new Set(input.members.filter((member) => member !== "")),
101
- ].sort(compareUnicodeCodePoints);
102
- const members = unique.length === 0 ? ["*"] : unique;
107
+ const members = [...new Set(input.members)].sort(compareUnicodeCodePoints);
103
108
  addLocatedFinding(context, {
104
109
  collection: context.accumulator.nativeAddonBindings,
105
110
  // Members are a variable-length source-derived list: compositeKey keeps
106
111
  // ["a\0b"] distinct from ["a", "b"] instead of collapsing one binding.
107
- key: compositeKey(["native-addon-binding", kind, specifier, members]),
112
+ key: compositeKey([
113
+ "native-addon-binding",
114
+ kind,
115
+ specifier,
116
+ members,
117
+ input.namespaceAccess,
118
+ input.dynamicMemberAccess,
119
+ ]),
108
120
  node,
109
121
  value: {
110
122
  specifier,
111
123
  binding_kind: kind,
112
124
  module_kind: input.moduleKind,
113
125
  members,
126
+ namespace_access: input.namespaceAccess,
127
+ dynamic_member_access: input.dynamicMemberAccess,
114
128
  module_key: null,
115
129
  location: range(node),
116
130
  },
@@ -118,12 +132,14 @@ const addBinding = (input) => {
118
132
  };
119
133
  const nativeRequire = (node) => {
120
134
  let member = null;
135
+ let hasMemberAccess = false;
121
136
  while (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) {
122
137
  if (!t.isNode(node.object))
123
138
  return undefined;
124
- const property = semanticStaticPropertyName(node.property, node.computed);
125
- if (member === null && property !== "")
126
- member = property;
139
+ const property = semanticStaticPropertyKey(node.property, node.computed);
140
+ // Walking inward leaves the first member consumed from the addon itself.
141
+ member = property;
142
+ hasMemberAccess = true;
127
143
  node = node.object;
128
144
  }
129
145
  if (!t.isCallExpression(node))
@@ -135,33 +151,47 @@ const nativeRequire = (node) => {
135
151
  return undefined;
136
152
  const specifier = stringValue(argumentNode(node.arguments[0]));
137
153
  return specifier !== undefined && isNativeSpecifier(specifier, "require")
138
- ? { specifier, member }
154
+ ? {
155
+ specifier,
156
+ hasMemberAccess,
157
+ access: {
158
+ members: member === null ? [] : [member],
159
+ namespaceAccess: !hasMemberAccess,
160
+ dynamicMemberAccess: hasMemberAccess && member === null,
161
+ },
162
+ }
139
163
  : undefined;
140
164
  };
141
165
  const bindingMembers = (pattern) => {
142
- if (t.isIdentifier(pattern))
143
- return ["*"];
144
166
  if (!t.isObjectPattern(pattern))
145
- return ["*"];
146
- return pattern.properties.map((property) => {
147
- if (t.isRestElement(property))
148
- return "*";
149
- return propertyName(property.key) || "[dynamic-import]";
150
- });
167
+ return { members: [], namespaceAccess: true, dynamicMemberAccess: false };
168
+ const members = [];
169
+ let namespaceAccess = false;
170
+ let dynamicMemberAccess = false;
171
+ for (const property of pattern.properties) {
172
+ if (t.isRestElement(property)) {
173
+ namespaceAccess = true;
174
+ continue;
175
+ }
176
+ const key = semanticStaticPropertyKey(property.key, property.computed);
177
+ if (key === null)
178
+ dynamicMemberAccess = true;
179
+ else
180
+ members.push(key);
181
+ }
182
+ return { members, namespaceAccess, dynamicMemberAccess };
151
183
  };
152
184
  const isModuleExport = (node) => {
153
- const name = calleeName(node);
154
- return (name === "module.exports" ||
155
- name.startsWith("module.exports.") ||
156
- name.startsWith("exports."));
157
- };
158
- const exportedMember = (node) => {
159
- const name = calleeName(node);
160
- if (name.startsWith("module.exports."))
161
- return name.slice("module.exports.".length);
162
- if (name.startsWith("exports."))
163
- return name.slice("exports.".length);
164
- return undefined;
185
+ const keys = [];
186
+ while (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) {
187
+ keys.unshift(semanticStaticPropertyKey(node.property, node.computed));
188
+ node = node.object;
189
+ }
190
+ if (!t.isIdentifier(node))
191
+ return false;
192
+ return node.name === "exports"
193
+ ? keys.length > 0
194
+ : node.name === "module" && keys[0] === "exports";
165
195
  };
166
196
  const isNativeSpecifier = (specifier, moduleKind) => {
167
197
  const path = moduleKind === "require" ? specifier : stripQueryAndFragment(specifier);
@@ -2,6 +2,22 @@ import * as t from "@babel/types";
2
2
  import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
3
3
  import { readExactJavaScriptLiteral, semanticStaticPropertyName, } from "./javascriptAstValues.js";
4
4
  import { sourceSlice } from "./javascriptStaticAnalysisHelpers.js";
5
+ /** Resolve a callee only when its root has a proven Electron module identity. */
6
+ export const electronCalleePath = (callee, context) => {
7
+ const members = [];
8
+ let root = callee;
9
+ while (t.isMemberExpression(root) || t.isOptionalMemberExpression(root)) {
10
+ const member = semanticStaticPropertyName(root.property, root.computed);
11
+ if (member === "" || !t.isNode(root.object))
12
+ return undefined;
13
+ members.push(member);
14
+ root = root.object;
15
+ }
16
+ const exported = context.electronBindings?.get(root.start ?? -1);
17
+ return exported === undefined
18
+ ? undefined
19
+ : [...exported, ...members.toReversed()];
20
+ };
5
21
  /** Preserve one literal value or the exact inert expression. */
6
22
  export const electronStaticValue = (source, node) => {
7
23
  const literal = literalValue(node);
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ /** Shared operational defaults for the isolated source-analysis boundary. */
3
+ export const JAVASCRIPT_ANALYSIS_RESOURCE_DEFAULTS = {
4
+ heapMb: 1024,
5
+ timeoutMs: 300_000,
6
+ };
7
+ /** Project observed execution limits without inventing unmeasured values. */
8
+ export const javaScriptAnalysisCoverageLimits = (limits) => {
9
+ const result = [];
10
+ for (const key of [
11
+ "worker_heap_limit_bytes",
12
+ "worker_timeout_ms",
13
+ "parent_result_budget_bytes",
14
+ "semantic_result_budget_bytes",
15
+ "transfer_record_bytes",
16
+ "transfer_file_bytes",
17
+ ]) {
18
+ const value = limits?.[key];
19
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
20
+ continue;
21
+ result.push({
22
+ name: `javascript_analysis_${key}`,
23
+ value,
24
+ unit: key.endsWith("_ms") ? "milliseconds" : "bytes",
25
+ });
26
+ }
27
+ return result;
28
+ };
29
+ /** Optional operational choices; omission keeps them out of Evidence parameters. */
30
+ export const javaScriptAnalysisResourceControlsSchema = z.strictObject({
31
+ max_heap_mb: z
32
+ .number()
33
+ .int()
34
+ .min(128)
35
+ .max(16_384)
36
+ .optional()
37
+ .describe("Maximum V8 old-space heap in MiB for the isolated JavaScript source analyzer; defaults to 1024. This does not change the CLI/MCP process heap."),
38
+ analysis_timeout_ms: z
39
+ .number()
40
+ .int()
41
+ .min(1)
42
+ .max(2_147_483_647)
43
+ .optional()
44
+ .describe("Maximum startup, analysis and transfer time per JavaScript source, in milliseconds; defaults to 300000. On timeout, return collected partial Evidence and stop the analysis."),
45
+ });
@@ -4,13 +4,16 @@ import { javaScriptSemanticGraphSchema, isValidatedImmutableJavaScriptSemanticGr
4
4
  import { digestSchema } from "../digests.js";
5
5
  import { prefixedDigestSchema } from "../digests.js";
6
6
  import { integrityContradictionSchema } from "../artifactGraph.js";
7
+ import { artifactIntegrityPolicySchema } from "../artifactIntegrityPolicy.js";
7
8
  import { localPathStringSchema } from "../localPath.js";
9
+ import { javaScriptAnalysisResourceControlsSchema } from "./javascriptAnalysisResourceControls.js";
8
10
  const countSchema = z.number().int().min(0);
9
11
  /** Public target-free request for static JavaScript application analysis. */
10
12
  export const analyzeJavaScriptApplicationInputSchema = z.strictObject({
11
13
  input_path: localPathStringSchema,
12
14
  format: z.enum(["auto", "asar", "directory"]).default("auto"),
13
- integrity_policy: z.enum(["fail", "record-and-continue"]).default("fail"),
15
+ integrity_policy: artifactIntegrityPolicySchema,
16
+ ...javaScriptAnalysisResourceControlsSchema.shape,
14
17
  });
15
18
  /** Compact counts for the high-level Electron architecture/security surface. */
16
19
  const electronBoundarySummarySchema = z.strictObject({
@@ -21,7 +21,9 @@ export const buildJavaScriptApplicationChangeGraph = (input) => {
21
21
  ...input.left.edges,
22
22
  ...input.right.edges,
23
23
  ]).filter(({ source_node_id: source, target_node_id: target }) => retained.has(source) && retained.has(target));
24
- const comparisonEdges = input.items.flatMap((item) => changedFromEdge(item, input, retained));
24
+ const leftById = new Map(input.left.nodes.map((node) => [node.node_id, node]));
25
+ const rightById = new Map(input.right.nodes.map((node) => [node.node_id, node]));
26
+ const comparisonEdges = input.items.flatMap((item) => changedFromEdge(item, input, retained, leftById, rightById));
25
27
  const candidateEdges = uniqueEdges([...sourceEdges, ...comparisonEdges]);
26
28
  const rootNodeIds = preferredRoots.filter((nodeId) => retained.has(nodeId));
27
29
  const fallbackRoot = mergedNodes[0]?.node_id;
@@ -62,7 +64,7 @@ const nodeCandidates = (input) => {
62
64
  output.set(node.node_id, [...(output.get(node.node_id) ?? []), node]);
63
65
  return output;
64
66
  };
65
- const changedFromEdge = (item, input, retained) => {
67
+ const changedFromEdge = (item, input, retained, leftById, rightById) => {
66
68
  const left = item.left_node_id;
67
69
  const right = item.right_node_id;
68
70
  if (item.match.status !== "matched" ||
@@ -73,7 +75,7 @@ const changedFromEdge = (item, input, retained) => {
73
75
  !retained.has(left) ||
74
76
  !retained.has(right))
75
77
  return [];
76
- const evidence = comparisonEvidence(item, input);
78
+ const evidence = comparisonEvidence(item, input, leftById.get(left), rightById.get(right));
77
79
  return [
78
80
  createJavaScriptApplicationEdge({
79
81
  source_node_id: right,
@@ -90,9 +92,7 @@ const changedFromEdge = (item, input, retained) => {
90
92
  }),
91
93
  ];
92
94
  };
93
- const comparisonEvidence = (item, input) => {
94
- const right = input.right.nodes.find(({ node_id: id }) => id === item.right_node_id);
95
- const left = input.left.nodes.find(({ node_id: id }) => id === item.left_node_id);
95
+ const comparisonEvidence = (item, input, left, right) => {
96
96
  const source = right?.observations[0]?.evidence ?? left?.observations[0]?.evidence;
97
97
  const complete = input.left.coverage.status === "complete" &&
98
98
  input.right.coverage.status === "complete";
@@ -1,9 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { arrayContainerSchema, parseElementSteps, } from "../zodCollectionSteps.js";
3
+ import { canonicalJsonDigestSteps } from "../canonicalJsonDigestSteps.js";
2
4
  import { canonicalJson } from "../comparisonSemantics.js";
3
5
  import { digestCanonicalValue } from "../canonicalDigest.js";
4
6
  import { uniqueSorted } from "../canonicalOrdering.js";
5
7
  import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
6
- import { freezeOwnedJsonSnapshotSteps } from "../immutableJson.js";
8
+ import { freezeJsonSnapshot, freezeOwnedJsonSnapshotSteps, } from "../immutableJson.js";
7
9
  import { applicationEdgeInputSchema, applicationEdgeSchema, applicationNodeInputSchema, applicationNodeObservationSchema, applicationNodeSchema, javascriptApplicationGraphInputSchema, javascriptApplicationGraphRecordSchema, } from "./javascriptApplicationGraphSchemas.js";
8
10
  const OBSERVATION_IDENTIFIER_STRATEGY = {
9
11
  strategy: "semantic-content-sha256",
@@ -160,7 +162,12 @@ const checkNode = (node, index, context) => {
160
162
  path: ["nodes", index, "identity"],
161
163
  });
162
164
  };
163
- const checkGraphInvariants = (graph, context) => {
165
+ const checkGraphContent = (graph, context) => {
166
+ const steps = checkGraphContentSteps(graph, context);
167
+ while (steps.next().done !== true)
168
+ ;
169
+ };
170
+ function* checkGraphContentSteps(graph, context) {
164
171
  sortedUniqueIssue(graph.root_node_ids, ["root_node_ids"], "Root nodes", context);
165
172
  sortedUniqueIssue(graph.nodes.map(({ node_id: id }) => id), ["nodes"], "Nodes", context);
166
173
  sortedUniqueIssue(graph.edges.map(({ edge_id: id }) => id), ["edges"], "Edges", context);
@@ -180,9 +187,14 @@ const checkGraphInvariants = (graph, context) => {
180
187
  message: "Root identifier must name a graph node",
181
188
  path: ["root_node_ids"],
182
189
  });
183
- for (const [index, node] of graph.nodes.entries())
190
+ for (const [index, node] of graph.nodes.entries()) {
191
+ if (index % 64 === 0)
192
+ yield;
184
193
  checkNode(node, index, context);
194
+ }
185
195
  for (const [index, edge] of graph.edges.entries()) {
196
+ if (index % 64 === 0)
197
+ yield;
186
198
  const { edge_id: identifier, ...semantic } = edge;
187
199
  if (identifier !== edgeId(semantic))
188
200
  context.addIssue({
@@ -213,6 +225,9 @@ const checkGraphInvariants = (graph, context) => {
213
225
  });
214
226
  checkEvidenceNormalization(edge.evidence, ["edges", index, "evidence"], context);
215
227
  }
228
+ }
229
+ const checkGraphInvariants = (graph, context) => {
230
+ checkGraphContent(graph, context);
216
231
  const { graph_id: identifier, ...semantic } = graph;
217
232
  if (identifier !==
218
233
  `jag_${digestCanonicalValue(semantic, "JavaScript Application Graph")}`)
@@ -224,9 +239,14 @@ const checkGraphInvariants = (graph, context) => {
224
239
  };
225
240
  /** Strict JavaScript Application Graph with verified commitments. */
226
241
  export const javascriptApplicationGraphSchema = javascriptApplicationGraphRecordSchema.superRefine(checkGraphInvariants);
242
+ const javascriptApplicationGraphContentSchema = javascriptApplicationGraphInputSchema.superRefine(checkGraphContent);
227
243
  /** Build one normalized application entity and derive all semantic IDs. */
228
244
  export const createJavaScriptApplicationNode = (input) => {
229
245
  const parsed = applicationNodeInputSchema.parse(input);
246
+ // These properties are newly parsed and exclusively owned. Authenticate
247
+ // them before the observation/node schemas and final graph validate again.
248
+ for (const observation of parsed.observations)
249
+ freezeJsonSnapshot(observation.properties);
230
250
  const identity = normalizeIdentity(parsed.identity);
231
251
  const identifier = nodeId({ kind: parsed.kind, identity });
232
252
  const observations = parsed.observations
@@ -252,6 +272,7 @@ export const createJavaScriptApplicationNode = (input) => {
252
272
  /** Build one normalized directed relationship and derive its semantic ID. */
253
273
  export const createJavaScriptApplicationEdge = (input) => {
254
274
  const parsed = applicationEdgeInputSchema.parse(input);
275
+ freezeJsonSnapshot(parsed.properties);
255
276
  const semantic = {
256
277
  ...parsed,
257
278
  evidence: normalizeEvidence(parsed.evidence),
@@ -264,26 +285,66 @@ export const createJavaScriptApplicationEdge = (input) => {
264
285
  };
265
286
  /** Normalize a complete graph and derive its top-level semantic ID. */
266
287
  export const createJavaScriptApplicationGraph = (input) => {
267
- const parsed = javascriptApplicationGraphInputSchema.parse(input);
268
- const semantic = {
269
- ...parsed,
270
- root_node_ids: uniqueSorted(parsed.root_node_ids),
271
- nodes: [...parsed.nodes].sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id)),
272
- edges: [...parsed.edges].sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id)),
273
- coverage: {
274
- ...parsed.coverage,
275
- limits: normalizeLimits(parsed.coverage.limits),
276
- },
277
- limitations: uniqueSorted(parsed.limitations),
288
+ const semantic = normalizeGraphInput(javascriptApplicationGraphInputSchema.parse(input));
289
+ const content = javascriptApplicationGraphContentSchema.parse(semantic);
290
+ return {
291
+ ...content,
292
+ graph_id: `jag_${digestCanonicalValue(content, "JavaScript Application Graph")}`,
278
293
  };
279
- return javascriptApplicationGraphSchema.parse({
280
- ...semantic,
281
- graph_id: `jag_${digestCanonicalValue(semantic, "JavaScript Application Graph")}`,
282
- });
283
294
  };
295
+ const normalizeGraphInput = (parsed) => ({
296
+ ...parsed,
297
+ root_node_ids: uniqueSorted(parsed.root_node_ids),
298
+ nodes: [...parsed.nodes].sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id)),
299
+ edges: [...parsed.edges].sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id)),
300
+ coverage: {
301
+ ...parsed.coverage,
302
+ limits: normalizeLimits(parsed.coverage.limits),
303
+ },
304
+ limitations: uniqueSorted(parsed.limitations),
305
+ });
284
306
  const validatedImmutableApplicationGraphs = new WeakSet();
285
307
  /** Clone and validate synchronously, then return steps to seal the owned graph. */
286
308
  export const createImmutableJavaScriptApplicationGraphSteps = (input) => sealValidatedApplicationGraphSteps(createJavaScriptApplicationGraph(input));
309
+ const applicationGraphShape = javascriptApplicationGraphInputSchema.shape;
310
+ const applicationGraphContainerSchema = javascriptApplicationGraphInputSchema.extend({
311
+ nodes: arrayContainerSchema(applicationGraphShape.nodes),
312
+ edges: arrayContainerSchema(applicationGraphShape.edges),
313
+ });
314
+ /**
315
+ * Seal a graph whose input the caller transfers: the caller neither retains nor
316
+ * mutates any part of it afterwards. Only the graph's own fields are validated
317
+ * synchronously; nodes and edges are validated, checked, hashed and frozen in
318
+ * steps, because doing so at once held the event loop for large applications.
319
+ */
320
+ export const sealTransferredJavaScriptApplicationGraphSteps = (input) => parseAndSealApplicationGraphSteps(applicationGraphContainerSchema.parse(input));
321
+ function* parseAndSealApplicationGraphSteps(container) {
322
+ const issues = [];
323
+ const parsed = {
324
+ ...container,
325
+ nodes: yield* parseElementSteps(applicationGraphShape.nodes.element, container.nodes, ["nodes"], issues),
326
+ edges: yield* parseElementSteps(applicationGraphShape.edges.element, container.edges, ["edges"], issues),
327
+ };
328
+ if (issues.length > 0)
329
+ throw new z.ZodError(issues);
330
+ const content = normalizeGraphInput(parsed);
331
+ let invalid = false;
332
+ yield* checkGraphContentSteps(content, {
333
+ addIssue: () => {
334
+ invalid = true;
335
+ },
336
+ });
337
+ // An invalid owned graph is a construction defect; report it with the exact
338
+ // issues the content schema produces.
339
+ if (invalid) {
340
+ javascriptApplicationGraphContentSchema.parse(content);
341
+ throw new TypeError("Application graph checks disagree with its schema");
342
+ }
343
+ return yield* sealValidatedApplicationGraphSteps({
344
+ ...content,
345
+ graph_id: `jag_${yield* canonicalJsonDigestSteps(content)}`,
346
+ });
347
+ }
287
348
  function* sealValidatedApplicationGraphSteps(graph) {
288
349
  yield* freezeOwnedJsonSnapshotSteps(graph);
289
350
  validatedImmutableApplicationGraphs.add(graph);
@@ -0,0 +1,35 @@
1
+ /** Forecast static-fact expansion into observations, nodes and relationships. */
2
+ export const estimateJavaScriptStaticApplicationProjection = (facts, checkpointBytes, sourcePath) => {
3
+ // A finding can produce a node, a separate observation and several edges.
4
+ // Allow for identifiers, locations, authority, coverage and schema copies,
5
+ // independently of the producer's compact checkpoint representation.
6
+ const findings = facts.references.length +
7
+ facts.endpoints.length +
8
+ facts.storage.length +
9
+ facts.role_paths.length +
10
+ facts.source_map_urls.length +
11
+ facts.electron.browser_windows.length +
12
+ facts.electron.context_bridge_apis.length +
13
+ facts.electron.ipc.length +
14
+ facts.electron.sender_validations.length +
15
+ facts.electron.utility_processes.length +
16
+ facts.electron.native_addon_bindings.length;
17
+ let records = findings * 8;
18
+ let repeatedBytes = 0;
19
+ for (const registration of facts.bundler_registrations) {
20
+ records +=
21
+ 3 +
22
+ registration.modules.length * 3 +
23
+ registration.entry_module_keys.length * 3 +
24
+ registration.async_chunk_keys.length * 3;
25
+ // Every module observation and containment edge repeats its chunk keys.
26
+ repeatedBytes +=
27
+ Buffer.byteLength(JSON.stringify(registration.chunk_keys)) *
28
+ registration.modules.length *
29
+ 2;
30
+ }
31
+ for (const binding of facts.electron.native_addon_bindings)
32
+ records += binding.members.length * 3;
33
+ const metadataBytes = 2048 + Buffer.byteLength(sourcePath) * 4;
34
+ return (checkpointBytes * 4 + repeatedBytes + records * metadataBytes) * 8;
35
+ };
@@ -12,7 +12,12 @@ export const classifyJavaScriptApplicationVersions = (matching, context) => {
12
12
  `pair:${left.node_id}:${right.node_id}`,
13
13
  ]));
14
14
  const fullContext = {
15
- ...context,
15
+ leftGraph: context.leftGraph,
16
+ rightGraph: context.rightGraph,
17
+ leftEvidenceId: context.leftEvidenceId,
18
+ rightEvidenceId: context.rightEvidenceId,
19
+ leftNativeEvidenceByDigest: indexNativeEvidence(context.leftNativeEvidence),
20
+ rightNativeEvidenceByDigest: indexNativeEvidence(context.rightNativeEvidence),
16
21
  pairByLeft,
17
22
  pairByRight,
18
23
  leftRelationships: indexRelationships(context.leftGraph),
@@ -258,19 +263,30 @@ const itemEvidenceLinks = (left, right, context) => [
258
263
  ...new Set([
259
264
  context.leftEvidenceId,
260
265
  context.rightEvidenceId,
261
- ...nativeLinks(left, context.leftNativeEvidence),
262
- ...nativeLinks(right, context.rightNativeEvidence),
266
+ ...nativeLinks(left, context.leftNativeEvidenceByDigest),
267
+ ...nativeLinks(right, context.rightNativeEvidenceByDigest),
263
268
  ]),
264
269
  ].sort(compareUnicodeCodePoints);
265
- const nativeLinks = (node, evidence) => {
266
- const digest = node === undefined
267
- ? null
268
- : contentIdentity(node)?.replace(/^content:/u, "");
269
- return digest === null
270
- ? []
271
- : evidence
272
- .filter(({ subject }) => subject?.digest.sha256 === digest)
273
- .map(({ evidence_id: id }) => id);
270
+ const nativeLinks = (node, evidenceByDigest) => {
271
+ const identity = node === undefined ? null : contentIdentity(node);
272
+ if (identity === null)
273
+ return [];
274
+ const digest = identity.replace(/^content:/u, "");
275
+ return evidenceByDigest.get(digest) ?? [];
276
+ };
277
+ const indexNativeEvidence = (evidence) => {
278
+ const evidenceByDigest = new Map();
279
+ for (const { evidence_id: id, subject } of evidence) {
280
+ const digest = subject?.digest.sha256;
281
+ if (digest === undefined)
282
+ continue;
283
+ const ids = evidenceByDigest.get(digest);
284
+ if (ids === undefined)
285
+ evidenceByDigest.set(digest, [id]);
286
+ else
287
+ ids.push(id);
288
+ }
289
+ return evidenceByDigest;
274
290
  };
275
291
  const pairLimitations = (pair, status) => [
276
292
  ...(pair.basis === "structural-fingerprint"
@@ -153,7 +153,15 @@ const semanticValue = (node, properties) => {
153
153
  exactString(properties.api_key) ??
154
154
  nonEmptyString(properties.api_name));
155
155
  if (node.kind === "native-export")
156
- return (joined(properties.specifier, stringList(properties.requested_members).join(",")) ?? firstLabel(node));
156
+ return (joined(properties.specifier, compositeKey([
157
+ stringList(properties.requested_members),
158
+ typeof properties.namespace_access === "boolean"
159
+ ? properties.namespace_access
160
+ : null,
161
+ typeof properties.dynamic_member_access === "boolean"
162
+ ? properties.dynamic_member_access
163
+ : null,
164
+ ])) ?? firstLabel(node));
157
165
  if ([
158
166
  "electron-main",
159
167
  "electron-preload",