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
@@ -0,0 +1,381 @@
1
+ import * as t from "@babel/types";
2
+ import { resolveSemanticBindingState, } from "./javascriptSemanticState.js";
3
+ import { semanticCallableResultExpressions } from "./javascriptSemanticCallableResults.js";
4
+ import { semanticStaticPropertyKey, unwrapJavaScriptExpression, } from "./javascriptAstValues.js";
5
+ import { semanticPropertyPathKeyMatches, } from "./javascriptSemanticPropertyPaths.js";
6
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
7
+ export const semanticClassCandidates = (root, state) => {
8
+ const pending = [root];
9
+ const seenNodes = new Set();
10
+ const seenBindings = new Set();
11
+ const classes = [];
12
+ for (let cursor = 0; cursor < pending.length; cursor++) {
13
+ const node = pending[cursor];
14
+ if (node === undefined)
15
+ continue;
16
+ const expression = unwrapJavaScriptExpression(node).node;
17
+ if (seenNodes.has(expression))
18
+ continue;
19
+ seenNodes.add(expression);
20
+ if (t.isClass(expression)) {
21
+ classes.push(expression);
22
+ }
23
+ else if (t.isIdentifier(expression)) {
24
+ const binding = resolveSemanticBindingState(state, expression, expression.name);
25
+ if (binding === undefined || seenBindings.has(binding.bindingId))
26
+ continue;
27
+ seenBindings.add(binding.bindingId);
28
+ for (const initializer of binding.initializers)
29
+ pending.push(initializer.node);
30
+ }
31
+ else if (t.isConditionalExpression(expression) ||
32
+ t.isLogicalExpression(expression)) {
33
+ pending.push(t.isConditionalExpression(expression)
34
+ ? expression.consequent
35
+ : expression.left, t.isConditionalExpression(expression)
36
+ ? expression.alternate
37
+ : expression.right);
38
+ }
39
+ else if (t.isSequenceExpression(expression)) {
40
+ const last = expression.expressions.at(-1);
41
+ if (last !== undefined)
42
+ pending.push(last);
43
+ }
44
+ }
45
+ return classes;
46
+ };
47
+ const instanceFieldReferences = (root, propertyName, path, state) => {
48
+ const references = [];
49
+ const pending = [{ klass: root, excluded: new Set() }];
50
+ const selections = new Map();
51
+ let definiteNames;
52
+ for (let cursor = 0; cursor < pending.length; cursor++) {
53
+ const current = pending[cursor];
54
+ if (current === undefined)
55
+ continue;
56
+ const previous = selections.get(current.klass);
57
+ // A shared base can be reached through different derived classes. Only
58
+ // exclusions common to those paths can suppress a field in that base.
59
+ const excluded = previous === undefined
60
+ ? current.excluded
61
+ : new Set([...previous].filter((name) => current.excluded.has(name)));
62
+ if (previous !== undefined && previous.size === excluded.size)
63
+ continue;
64
+ selections.set(current.klass, excluded);
65
+ const shadowed = new Set(excluded);
66
+ for (const member of [...current.klass.body.body].reverse()) {
67
+ if (!t.isClassProperty(member) || member.static)
68
+ continue;
69
+ const key = semanticStaticPropertyKey(member.key, member.computed);
70
+ if (key !== null && shadowed.has(key))
71
+ continue;
72
+ if (key !== null)
73
+ shadowed.add(key);
74
+ if ((propertyName === null || key === null || key === propertyName) &&
75
+ member.value != null)
76
+ references.push({ node: member.value, path });
77
+ }
78
+ const bases = current.klass.superClass == null
79
+ ? []
80
+ : semanticClassCandidates(current.klass.superClass, state);
81
+ if (bases.length === 0)
82
+ definiteNames =
83
+ definiteNames === undefined
84
+ ? shadowed
85
+ : new Set([...definiteNames].filter((name) => shadowed.has(name)));
86
+ for (const klass of bases)
87
+ pending.push({ klass, excluded: shadowed });
88
+ }
89
+ return { references, definiteNames: definiteNames ?? new Set() };
90
+ };
91
+ const classPropertyDescriptors = (klass, propertyName, kind) => {
92
+ const isStatic = kind === "static";
93
+ const selectedGetters = [];
94
+ const fields = [];
95
+ const indexedMembers = [];
96
+ klass.body.body.forEach((member, index) => {
97
+ if ((t.isClassMethod(member) ||
98
+ (kind === "static" && t.isClassProperty(member))) &&
99
+ member.static === isStatic)
100
+ indexedMembers.push({
101
+ member,
102
+ index,
103
+ key: semanticStaticPropertyKey(member.key, member.computed),
104
+ });
105
+ });
106
+ const matchingMembers = propertyName === null
107
+ ? []
108
+ : indexedMembers.filter(({ key }) => key === propertyName);
109
+ const uncertainGetters = indexedMembers.filter((entry) => {
110
+ const { member, key } = entry;
111
+ return (t.isClassMethod(member) &&
112
+ member.kind === "get" &&
113
+ (propertyName === null || (member.computed && key === null)));
114
+ });
115
+ const getters = matchingMembers.filter((entry) => t.isClassMethod(entry.member) && entry.member.kind === "get");
116
+ const getter = getters.at(-1);
117
+ const getterIndex = getter?.index ?? -1;
118
+ const laterDataMember = matchingMembers.some(({ member, index }) => t.isClassProperty(member) ||
119
+ (t.isClassMethod(member) &&
120
+ member.kind === "method" &&
121
+ index > getterIndex));
122
+ const seenFields = new Set();
123
+ for (const { member, key } of [...indexedMembers].reverse()) {
124
+ if (!t.isClassProperty(member))
125
+ continue;
126
+ if (key !== null && seenFields.has(key))
127
+ continue;
128
+ if (key !== null)
129
+ seenFields.add(key);
130
+ if (propertyName === null || key === null || key === propertyName)
131
+ fields.push(member);
132
+ }
133
+ if (getters.length > 0 && !laterDataMember && getter !== undefined)
134
+ selectedGetters.push(getter.member);
135
+ for (const { member, index } of uncertainGetters)
136
+ if (!matchingMembers.some(({ member: matching, index: matchingIndex }) => (t.isClassProperty(matching) ||
137
+ (t.isClassMethod(matching) &&
138
+ (matching.kind === "method" || matching.kind === "get"))) &&
139
+ matchingIndex > index))
140
+ selectedGetters.push(member);
141
+ return {
142
+ getters: selectedGetters,
143
+ fields,
144
+ inherits: matchingMembers.length === 0,
145
+ };
146
+ };
147
+ export const semanticClassPropertyReferences = (lookup, selection, state, activeGetters = new Map()) => {
148
+ const root = lookup.owner;
149
+ const receiver = lookup.receiver ?? root;
150
+ const [key, ...path] = selection;
151
+ const propertyName = key == null || typeof key === "object" ? null : String(key);
152
+ const pending = [root];
153
+ const seen = new Set();
154
+ const possibleResults = [];
155
+ // Instance fields are own properties, including fields initialized by base
156
+ // constructors. They take precedence over every prototype descriptor.
157
+ let instanceFields = new Set();
158
+ if (lookup.kind === "instance") {
159
+ const fields = instanceFieldReferences(root, propertyName, path, state);
160
+ possibleResults.push(...fields.references);
161
+ instanceFields = fields.definiteNames;
162
+ if (propertyName !== null && instanceFields.has(propertyName))
163
+ return possibleResults;
164
+ }
165
+ for (let cursor = 0; cursor < pending.length; cursor++) {
166
+ const klass = pending[cursor];
167
+ if (klass === undefined || seen.has(klass))
168
+ continue;
169
+ seen.add(klass);
170
+ const descriptors = classPropertyDescriptors(klass, propertyName, lookup.kind);
171
+ for (const field of descriptors.fields)
172
+ if (field.value != null)
173
+ possibleResults.push({ node: field.value, path });
174
+ for (const getter of descriptors.getters) {
175
+ const key = semanticStaticPropertyKey(getter.key, getter.computed);
176
+ if (key !== null && instanceFields.has(key))
177
+ continue;
178
+ possibleResults.push(...getterResultReferences({ getter, owner: klass, receiver }, path, state, activeGetters));
179
+ }
180
+ // An exact own descriptor suppresses inherited lookup. Dynamic computed
181
+ // descriptors may or may not match, so retain possible superclass results.
182
+ if (descriptors.inherits &&
183
+ klass.superClass !== null &&
184
+ klass.superClass !== undefined)
185
+ pending.push(...semanticClassCandidates(klass.superClass, state));
186
+ }
187
+ return possibleResults;
188
+ };
189
+ const objectReceiverReference = (object, path, state) => {
190
+ // A literal's enclosing binding owns its slots. Returning the literal
191
+ // itself would bypass invalidation of that binding's observed properties.
192
+ let current = object;
193
+ const projection = [];
194
+ while (true) {
195
+ const parent = state.parentsByNode.get(current);
196
+ if (t.isVariableDeclarator(parent) &&
197
+ parent.init === current &&
198
+ t.isIdentifier(parent.id))
199
+ return [{ node: parent.id, path: [...projection, ...path] }];
200
+ if (t.isObjectProperty(parent) && parent.value === current) {
201
+ projection.unshift(semanticStaticPropertyKey(parent.key, parent.computed));
202
+ const container = state.parentsByNode.get(parent);
203
+ if (t.isObjectExpression(container)) {
204
+ current = container;
205
+ continue;
206
+ }
207
+ }
208
+ break;
209
+ }
210
+ return [{ node: object, path }];
211
+ };
212
+ const getterResultReferences = (invocation, path, state, activeGetters = new Map()) => {
213
+ const { getter, owner, receiver = owner } = invocation;
214
+ const previousLength = activeGetters.get(getter);
215
+ if (previousLength !== undefined && previousLength <= path.length)
216
+ return [];
217
+ // Repeated receiver reads may revisit a getter while consuming a finite
218
+ // path; recursive getters that preserve or grow that path cannot progress.
219
+ const active = new Map(activeGetters).set(getter, path.length);
220
+ const isStatic = t.isClassMethod(getter) && getter.static;
221
+ const resolve = (node, remaining) => {
222
+ const expression = unwrapJavaScriptExpression(node).node;
223
+ if (t.isThisExpression(expression)) {
224
+ if (t.isClass(receiver)) {
225
+ return semanticClassPropertyReferences({ owner: receiver, kind: isStatic ? "static" : "instance" }, remaining, state, active);
226
+ }
227
+ return objectReceiverReference(receiver, remaining, state);
228
+ }
229
+ if (t.isMemberExpression(expression) ||
230
+ t.isOptionalMemberExpression(expression)) {
231
+ if (t.isPrivateName(expression.property) &&
232
+ t.isThisExpression(expression.object) &&
233
+ t.isClass(owner)) {
234
+ const privateName = expression.property.id.name;
235
+ return owner.body.body.flatMap((member) => t.isClassPrivateProperty(member) &&
236
+ member.static === isStatic &&
237
+ member.key.id.name === privateName &&
238
+ member.value != null
239
+ ? [{ node: member.value, path: remaining }]
240
+ : []);
241
+ }
242
+ const key = semanticStaticPropertyKey(expression.property, expression.computed);
243
+ if (t.isSuper(expression.object) &&
244
+ t.isClass(owner) &&
245
+ owner.superClass != null) {
246
+ return semanticClassCandidates(owner.superClass, state).flatMap((base) => semanticClassPropertyReferences({
247
+ owner: base,
248
+ receiver: t.isClass(receiver) ? receiver : owner,
249
+ kind: isStatic ? "static" : "prototype",
250
+ }, [key, ...remaining], state, active));
251
+ }
252
+ return resolve(expression.object, [key, ...remaining]);
253
+ }
254
+ if (t.isConditionalExpression(expression))
255
+ return [
256
+ ...resolve(expression.consequent, remaining),
257
+ ...resolve(expression.alternate, remaining),
258
+ ];
259
+ if (t.isLogicalExpression(expression))
260
+ return [
261
+ ...resolve(expression.left, remaining),
262
+ ...resolve(expression.right, remaining),
263
+ ];
264
+ if (t.isSequenceExpression(expression)) {
265
+ const last = expression.expressions.at(-1);
266
+ return last === undefined ? [] : resolve(last, remaining);
267
+ }
268
+ return [{ node: expression, path: remaining }];
269
+ };
270
+ return semanticCallableResultExpressions(getter).flatMap(({ node }) => node === null ? [] : resolve(node, path));
271
+ };
272
+ export const semanticObjectPropertyReferences = (node, path, state) => {
273
+ const [key, ...remaining] = path;
274
+ const references = [];
275
+ const overwritten = new Set();
276
+ const dataOverwritten = new Set();
277
+ const accessorNames = new Set();
278
+ const getterNames = new Set();
279
+ const setterNames = new Set();
280
+ for (const property of [...node.properties].reverse()) {
281
+ if (t.isSpreadElement(property)) {
282
+ const selected = key ?? null;
283
+ if (typeof selected !== "object" && overwritten.has(String(selected)))
284
+ continue;
285
+ references.push({
286
+ node: property.argument,
287
+ path: [
288
+ typeof selected === "object"
289
+ ? {
290
+ ...selected,
291
+ excludedKeys: [
292
+ ...new Set([
293
+ ...(selected?.excludedKeys ?? []),
294
+ ...overwritten,
295
+ ]),
296
+ ].sort(compareUnicodeCodePoints),
297
+ }
298
+ : selected,
299
+ ...remaining,
300
+ ],
301
+ });
302
+ if (selected !== null &&
303
+ typeof selected !== "object" &&
304
+ t.isObjectExpression(property.argument) &&
305
+ objectExpressionDefinesKey(property.argument, String(selected))) {
306
+ overwritten.add(String(selected));
307
+ dataOverwritten.add(String(selected));
308
+ }
309
+ continue;
310
+ }
311
+ const name = semanticStaticPropertyKey(property.key, property.computed);
312
+ const isGetter = t.isObjectMethod(property) && property.kind === "get";
313
+ const isSetter = t.isObjectMethod(property) && property.kind === "set";
314
+ if (name !== null &&
315
+ (isGetter || isSetter
316
+ ? dataOverwritten.has(name) ||
317
+ (isGetter ? getterNames.has(name) : setterNames.has(name))
318
+ : dataOverwritten.has(name) || accessorNames.has(name)))
319
+ continue;
320
+ if (name === null || semanticPropertyPathKeyMatches(key ?? null, name)) {
321
+ if (t.isObjectMethod(property) && property.kind === "get") {
322
+ references.push(...getterResultReferences({ getter: property, owner: node }, remaining, state));
323
+ }
324
+ else if (t.isObjectMethod(property) && property.kind === "set") {
325
+ // A setter contributes no readable reference. A paired getter is
326
+ // handled independently when it appears earlier in this object.
327
+ }
328
+ else {
329
+ references.push({
330
+ node: t.isObjectProperty(property) ? property.value : property,
331
+ path: remaining,
332
+ });
333
+ }
334
+ }
335
+ if (name !== null) {
336
+ if (isGetter) {
337
+ getterNames.add(name);
338
+ accessorNames.add(name);
339
+ overwritten.add(name);
340
+ }
341
+ else if (isSetter) {
342
+ setterNames.add(name);
343
+ accessorNames.add(name);
344
+ overwritten.add(name);
345
+ }
346
+ else if (!(t.isObjectProperty(property) &&
347
+ !property.computed &&
348
+ !property.shorthand &&
349
+ name === "__proto__")) {
350
+ overwritten.add(name);
351
+ dataOverwritten.add(name);
352
+ }
353
+ }
354
+ }
355
+ return references;
356
+ };
357
+ const objectExpressionDefinesKey = (root, key) => {
358
+ const pending = [root];
359
+ const seen = new Set();
360
+ for (let cursor = 0; cursor < pending.length; cursor++) {
361
+ const object = pending[cursor];
362
+ if (object === undefined || seen.has(object))
363
+ continue;
364
+ seen.add(object);
365
+ for (const property of object.properties) {
366
+ if (t.isSpreadElement(property)) {
367
+ if (t.isObjectExpression(property.argument))
368
+ pending.push(property.argument);
369
+ continue;
370
+ }
371
+ const name = semanticStaticPropertyKey(property.key, property.computed);
372
+ if (name === key &&
373
+ !(t.isObjectProperty(property) &&
374
+ !property.computed &&
375
+ !property.shorthand &&
376
+ name === "__proto__"))
377
+ return true;
378
+ }
379
+ }
380
+ return false;
381
+ };
@@ -1,6 +1,6 @@
1
1
  import * as t from "@babel/types";
2
2
  import { semanticCallableIdForNode, semanticReadsBeforeWrite, } from "./javascriptSemanticProjection.js";
3
- import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
3
+ import { semanticStaticPropertyKey, unwrapJavaScriptExpression, } from "./javascriptAstValues.js";
4
4
  import { resolveSemanticBindingState, } from "./javascriptSemanticState.js";
5
5
  import { traverseJavaScriptAst } from "./javascriptSemanticTraversal.js";
6
6
  import { range } from "./javascriptStaticAnalysisHelpers.js";
@@ -109,7 +109,13 @@ const collectDestructuring = (node, ownerCallableId, state, output) => {
109
109
  };
110
110
  const addObjectOperation = (input, state, output) => {
111
111
  output.push({
112
- objectOperationId: `object:${input.kind}:${String(input.node.start ?? -1)}:${String(input.node.end ?? -1)}`,
112
+ // These high-volume IDs must not retain intermediate concatenations.
113
+ objectOperationId: [
114
+ "object",
115
+ input.kind,
116
+ String(input.node.start ?? -1),
117
+ String(input.node.end ?? -1),
118
+ ].join(":"),
113
119
  kind: input.kind,
114
120
  location: range(input.node),
115
121
  ownerCallableId: input.ownerCallableId,
@@ -128,6 +134,7 @@ const expressionObjectIdentity = (node, state) => {
128
134
  let current = node;
129
135
  let staticPath = true;
130
136
  while (current !== null && current !== undefined) {
137
+ current = unwrapJavaScriptExpression(current).node;
131
138
  if (t.isMemberExpression(current) ||
132
139
  t.isOptionalMemberExpression(current)) {
133
140
  const name = semanticStaticPropertyKey(current.property, current.computed);
@@ -137,11 +144,6 @@ const expressionObjectIdentity = (node, state) => {
137
144
  path.push(name);
138
145
  current = current.object;
139
146
  }
140
- else if (t.isTSAsExpression(current) ||
141
- t.isTSTypeAssertion(current) ||
142
- t.isTSNonNullExpression(current) ||
143
- t.isTSSatisfiesExpression(current))
144
- current = current.expression;
145
147
  else
146
148
  break;
147
149
  }
@@ -1,4 +1,4 @@
1
- import { compareCodePoints } from "../canonicalOrdering.js";
1
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
2
2
  import { semanticPrimitiveKey } from "./javascriptSemanticProvenance.js";
3
3
  import { SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, exceedsSemanticPrimitiveStringByteBudget, semanticResourceLimitUnknown, } from "./javascriptSemanticResourceLimits.js";
4
4
  /** Normalize one bounded collection of possible primitive values. */
@@ -10,6 +10,11 @@ export const semanticPrimitiveSet = (values) => {
10
10
  status: "unknown",
11
11
  reason: "Nonfinite numbers are outside the JSON primitive lattice.",
12
12
  };
13
+ if (typeof value === "number" && Object.is(value, -0))
14
+ return {
15
+ status: "unknown",
16
+ reason: "Negative zero cannot be preserved by JSON primitive evidence.",
17
+ };
13
18
  uniqueValues.add(value);
14
19
  if (uniqueValues.size > SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT)
15
20
  return semanticResourceLimitUnknown("primitive-candidates");
@@ -18,7 +23,7 @@ export const semanticPrimitiveSet = (values) => {
18
23
  return semanticResourceLimitUnknown("primitive-bytes");
19
24
  const unique = [...uniqueValues]
20
25
  .map((value) => ({ key: semanticPrimitiveKey(value), value }))
21
- .sort((left, right) => compareCodePoints(left.key, right.key))
26
+ .sort((left, right) => compareUnicodeCodePoints(left.key, right.key))
22
27
  .map(({ value }) => value);
23
28
  const only = unique[0];
24
29
  return unique.length === 1 && only !== undefined
@@ -1,10 +1,10 @@
1
1
  import * as t from "@babel/types";
2
2
  import { resolveSemanticBindingState, semanticResolutionBlocked, isUnshadowedGlobal, } from "./javascriptSemanticState.js";
3
3
  import { semanticRequireOrigin } from "./javascriptSemanticRequireOrigin.js";
4
- import { compareCodePoints } from "../canonicalOrdering.js";
5
- import { traverseJavaScriptAst } from "./javascriptSemanticTraversal.js";
4
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
5
+ import { completeSemanticSteps, traverseJavaScriptAstSteps, } from "./javascriptSemanticTraversal.js";
6
6
  import { evaluateSemanticBinding, evaluateSemanticProvenance, } from "./javascriptSemanticValues.js";
7
- import { range, stringValue } from "./javascriptStaticAnalysisHelpers.js";
7
+ import { range } from "./javascriptStaticAnalysisHelpers.js";
8
8
  import { propertyName, semanticStaticPropertyKey, } from "./javascriptAstValues.js";
9
9
  /** Retain callable identity without polluting lexical bindings. */
10
10
  export const collectSemanticCallable = (input) => {
@@ -43,7 +43,7 @@ export const collectSemanticModuleLink = (node, state) => {
43
43
  localName: null,
44
44
  exportedName: "*",
45
45
  location: range(node),
46
- });
46
+ }, node);
47
47
  else if (t.isExportNamedDeclaration(node))
48
48
  collectNamedExports(node, state);
49
49
  else if (t.isExportDefaultDeclaration(node))
@@ -55,18 +55,20 @@ export const collectSemanticModuleLink = (node, state) => {
55
55
  exportedName: "default",
56
56
  callableId: semanticCallableIdForNode(node.declaration),
57
57
  location: range(node),
58
- });
58
+ }, node);
59
59
  else if (t.isVariableDeclarator(node))
60
60
  collectRequireLink(node, state);
61
61
  else if (t.isAssignmentExpression(node))
62
62
  collectCommonJsExport(node, state);
63
63
  };
64
64
  /** Collect lexical references after definitions exist, optionally for one name. */
65
- export const collectSemanticReferences = (program, state, name) => {
65
+ export const collectSemanticReferences = (program, state, name) => completeSemanticSteps(collectSemanticReferencesSteps(program, state, name));
66
+ /** Collect lexical references in steps while preserving resolution and visit order. */
67
+ export function* collectSemanticReferencesSteps(program, state, name) {
66
68
  const output = [];
67
69
  const seen = new Set();
68
70
  const patterns = [];
69
- traverseJavaScriptAst(program, {
71
+ yield* traverseJavaScriptAstSteps(program, {
70
72
  enter: (node, parent, readAncestors) => {
71
73
  if (isPatternNode(node))
72
74
  patterns.push(node);
@@ -111,7 +113,7 @@ export const collectSemanticReferences = (program, state, name) => {
111
113
  },
112
114
  });
113
115
  return output;
114
- };
116
+ }
115
117
  /** Freeze collected scopes into deterministic IR order. */
116
118
  export const immutableSemanticScopes = (state) => state.scopes.map((scope) => ({
117
119
  scopeId: scope.scopeId,
@@ -121,7 +123,7 @@ export const immutableSemanticScopes = (state) => state.scopes.map((scope) => ({
121
123
  bindingsComplete: scope.bindingsComplete,
122
124
  bindingIds: [...scope.bindings.values()]
123
125
  .map(({ bindingId }) => bindingId)
124
- .sort(compareCodePoints),
126
+ .sort(compareUnicodeCodePoints),
125
127
  }));
126
128
  /** Evaluate and freeze bindings into deterministic IR order. */
127
129
  export const immutableSemanticBindings = (state) => [...state.bindingsById.values()]
@@ -135,7 +137,7 @@ export const immutableSemanticBindings = (state) => [...state.bindingsById.value
135
137
  value: evaluateSemanticBinding(binding, state),
136
138
  provenance: evaluateSemanticProvenance(binding, state),
137
139
  }))
138
- .sort((left, right) => compareCodePoints(left.bindingId, right.bindingId));
140
+ .sort((left, right) => compareUnicodeCodePoints(left.bindingId, right.bindingId));
139
141
  const callableKind = (node) => {
140
142
  if (t.isClassMethod(node) ||
141
143
  t.isClassPrivateMethod(node) ||
@@ -180,7 +182,7 @@ const collectImports = (node, state) => {
180
182
  localName: null,
181
183
  exportedName: null,
182
184
  location: range(node),
183
- });
185
+ }, node);
184
186
  for (const specifier of node.specifiers)
185
187
  addModuleLink(state, {
186
188
  kind: "import",
@@ -193,7 +195,7 @@ const collectImports = (node, state) => {
193
195
  localName: specifier.local.name,
194
196
  exportedName: null,
195
197
  location: range(specifier),
196
- });
198
+ }, node);
197
199
  };
198
200
  const collectNamedExports = (node, state) => {
199
201
  if (node.declaration !== null && node.declaration !== undefined)
@@ -206,7 +208,7 @@ const collectNamedExports = (node, state) => {
206
208
  exportedName: localName,
207
209
  callableId: declarationCallableId(node.declaration, localName),
208
210
  location: range(node.declaration),
209
- });
211
+ }, node);
210
212
  for (const specifier of node.specifiers)
211
213
  if (t.isExportSpecifier(specifier))
212
214
  addModuleLink(state, {
@@ -216,7 +218,7 @@ const collectNamedExports = (node, state) => {
216
218
  localName: node.source == null ? propertyName(specifier.local) : null,
217
219
  exportedName: propertyName(specifier.exported),
218
220
  location: range(specifier),
219
- });
221
+ }, node);
220
222
  };
221
223
  const collectRequireLink = (node, state) => {
222
224
  const origin = semanticRequireOrigin(node.init, state);
@@ -230,7 +232,7 @@ const collectRequireLink = (node, state) => {
230
232
  localName: binding.localName,
231
233
  exportedName: null,
232
234
  location: range(node),
233
- });
235
+ }, node);
234
236
  };
235
237
  const requirePatternBindings = (pattern, path) => {
236
238
  if (t.isTSParameterProperty(pattern))
@@ -258,19 +260,62 @@ const collectCommonJsExport = (node, state) => {
258
260
  const exportedName = commonJsExportName(node.left, state);
259
261
  if (exportedName === undefined)
260
262
  return;
261
- const origin = semanticRequireOrigin(node.right, state);
263
+ const receiverEffect = isCommonJsModuleExports(node.left, state)
264
+ ? null
265
+ : commonJsExportReceiverEffect(node.right, state);
266
+ if (receiverEffect === "detached")
267
+ return;
268
+ // Simple assignment chains yield their rightmost assigned value. Compound
269
+ // and logical writes also depend on the previous value, so remain unknown.
270
+ let value = node.operator === "=" && receiverEffect !== "uncertain" ? node.right : null;
271
+ while (t.isAssignmentExpression(value, { operator: "=" }))
272
+ value = value.right;
273
+ const origin = value === null ? undefined : semanticRequireOrigin(value, state);
262
274
  addModuleLink(state, {
263
275
  kind: "commonjs-export",
264
276
  specifier: origin?.specifier ?? null,
265
277
  importedName: origin?.importedPath.at(-1) ?? null,
266
- localName: t.isIdentifier(node.right) ? node.right.name : null,
278
+ localName: value !== null && t.isIdentifier(value) ? value.name : null,
267
279
  exportedName,
268
- callableId: semanticCallableIdForNode(node.right),
280
+ callableId: value === null ? null : semanticCallableIdForNode(value),
269
281
  location: range(node),
270
- });
282
+ }, node);
271
283
  };
272
- const addModuleLink = (state, link) => {
273
- state.moduleLinks.push({ ...link, callableId: link.callableId ?? null });
284
+ /**
285
+ * An outer property assignment captures its receiver before evaluating the
286
+ * RHS. When that chain assigns a freshly created identity to `module.exports`,
287
+ * the outer write targets the old exports object and cannot define an export
288
+ * on the value ultimately returned by the CommonJS module. Reassignments from
289
+ * existing bindings may preserve identity, so this guard leaves them as
290
+ * export candidates.
291
+ */
292
+ const commonJsExportReceiverEffect = (node, state) => {
293
+ let value = node;
294
+ while (t.isAssignmentExpression(value, { operator: "=" })) {
295
+ if (isCommonJsModuleExports(value.left, state))
296
+ return isFreshAssignmentResult(value.right) ? "detached" : "uncertain";
297
+ value = value.right;
298
+ }
299
+ return null;
300
+ };
301
+ const isFreshAssignmentResult = (node) => {
302
+ let value = node;
303
+ while (t.isAssignmentExpression(value, { operator: "=" }))
304
+ value = value.right;
305
+ return (t.isArrowFunctionExpression(value) ||
306
+ t.isFunctionExpression(value) ||
307
+ t.isClassExpression(value) ||
308
+ t.isObjectExpression(value) ||
309
+ t.isArrayExpression(value));
310
+ };
311
+ const addModuleLink = (state, link, referenceNode) => {
312
+ const collected = { ...link, callableId: link.callableId ?? null };
313
+ state.moduleLinks.push(collected);
314
+ if (link.localName !== null) {
315
+ const binding = resolveSemanticBindingState(state, referenceNode, link.localName);
316
+ if (binding !== undefined)
317
+ state.moduleLinkBindings.set(collected, binding);
318
+ }
274
319
  };
275
320
  /** Deterministic callable identity shared by collection and return recovery. */
276
321
  export const semanticCallableIdForNode = (node) => {
@@ -451,8 +496,7 @@ const defaultDeclarationName = (declaration) => (t.isFunctionDeclaration(declara
451
496
  ? declaration.id.name
452
497
  : null;
453
498
  const commonJsExportName = (node, state) => {
454
- if (isUnshadowedGlobal(node, state, "exports"))
455
- return "default";
499
+ // Rebinding the CommonJS `exports` alias does not replace `module.exports`.
456
500
  if (!t.isMemberExpression(node) && !t.isOptionalMemberExpression(node))
457
501
  return undefined;
458
502
  const key = semanticStaticPropertyKey(node.property, node.computed);
@@ -462,12 +506,12 @@ const commonJsExportName = (node, state) => {
462
506
  if (isUnshadowedGlobal(node.object, state, "exports"))
463
507
  return key === null ? "*" : key || "*";
464
508
  if (t.isMemberExpression(node.object) &&
465
- isUnshadowedGlobal(node.object.object, state, "module") &&
466
- semanticStaticPropertyKey(node.object.property, node.object.computed) ===
467
- "exports")
509
+ isCommonJsModuleExports(node.object, state))
468
510
  return key === null ? "*" : key || "default";
469
- if (isUnshadowedGlobal(node.object, state, "module") &&
470
- semanticStaticPropertyKey(node.property, node.computed) === "exports")
511
+ if (isCommonJsModuleExports(node, state))
471
512
  return "default";
472
513
  return undefined;
473
514
  };
515
+ const isCommonJsModuleExports = (node, state) => (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) &&
516
+ isUnshadowedGlobal(node.object, state, "module") &&
517
+ semanticStaticPropertyKey(node.property, node.computed) === "exports";