rea-agents 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,13 +1,23 @@
1
1
  import * as t from "@babel/types";
2
- import { invalidateSemanticMutationPath } from "./javascriptSemanticMutationValues.js";
2
+ import { semanticCapturePosition, semanticEscapeFollowsCapture, semanticBindingPrecedesCapture, } from "./javascriptSemanticMutationInitializers.js";
3
+ import { semanticSlotAtPath } from "./javascriptSemanticSlots.js";
4
+ import { invalidateSemanticEscapedPath, invalidateSemanticMutationPath, } from "./javascriptSemanticMutationValues.js";
3
5
  import { resolveSemanticBindingState, } from "./javascriptSemanticState.js";
4
6
  import { semanticRequireOrigin } from "./javascriptSemanticRequireOrigin.js";
5
- import { compareCodePoints } from "../canonicalOrdering.js";
6
- import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
7
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
8
+ import { readExactJavaScriptLiteral, semanticStaticPropertyKey, unwrapJavaScriptExpression, } from "./javascriptAstValues.js";
7
9
  import { semanticAmbiguousProvenance, semanticLocalProvenance, semanticOriginsProvenance, semanticUnresolvedProvenance, uniqueSemanticOrigins, } from "./javascriptSemanticProvenance.js";
8
- import { MAX_SEMANTIC_PRIMITIVE_CANDIDATES, semanticPrimitiveCandidates as primitiveCandidates, semanticPrimitiveSet as primitiveSet, semanticPrimitiveValue as primitiveValue, } from "./javascriptSemanticPrimitives.js";
10
+ import { semanticPrimitiveCandidates as primitiveCandidates, semanticPrimitiveSet as primitiveSet, } from "./javascriptSemanticPrimitives.js";
9
11
  import { SEMANTIC_EXPRESSION_DEPTH_LIMIT, SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT, exceedsSemanticPrimitiveAdditionByteBudget, exceedsSemanticTemplateByteBudget, semanticResourceLimitUnknown, semanticResourceLimitReason, } from "./javascriptSemanticResourceLimits.js";
10
12
  const primitiveBindingValuesByState = new WeakMap();
13
+ const primitiveExpressionValuesByState = new WeakMap();
14
+ const capturedBindingValuesByState = new WeakMap();
15
+ /** Discard primitive projections evaluated before mutation collection finished. */
16
+ export const clearSemanticPrimitiveBindingValues = (state) => {
17
+ primitiveBindingValuesByState.delete(state);
18
+ capturedBindingValuesByState.delete(state);
19
+ primitiveExpressionValuesByState.delete(state);
20
+ };
11
21
  const primitiveBindingValuesFor = (state) => {
12
22
  const existing = primitiveBindingValuesByState.get(state);
13
23
  if (existing !== undefined)
@@ -25,13 +35,18 @@ export const evaluateSemanticBinding = (binding, state) => evaluateBinding(bindi
25
35
  expressionDepth: 0,
26
36
  primitiveBindingValues: primitiveBindingValuesFor(state),
27
37
  });
28
- /** Evaluate one arbitrary inert expression in the established lexical state. */
29
- export const evaluateSemanticExpression = (node, state) => evaluateExpression(node, {
30
- state,
31
- bindings: new Set(),
32
- expressionDepth: 0,
33
- primitiveBindingValues: primitiveBindingValuesFor(state),
34
- });
38
+ /** Evaluate an inert expression, optionally at an earlier reference capture. */
39
+ export const evaluateSemanticExpression = (node, state, capturePoint) => {
40
+ const context = {
41
+ state,
42
+ bindings: new Set(),
43
+ expressionDepth: 0,
44
+ primitiveBindingValues: primitiveBindingValuesFor(state),
45
+ };
46
+ return evaluateExpression(node, capturePoint === undefined
47
+ ? context
48
+ : (captureContextAt(capturePoint, context) ?? context));
49
+ };
35
50
  /** Follow module provenance through destructuring, members, and aliases. */
36
51
  export const evaluateSemanticProvenance = (binding, state) => provenanceForBinding(binding, {
37
52
  state,
@@ -42,6 +57,14 @@ export const evaluateSemanticProvenance = (binding, state) => provenanceForBindi
42
57
  const evaluateBinding = (binding, context) => {
43
58
  if (context.bindings.has(binding.bindingId))
44
59
  return { status: "cycle", reason: `Alias cycle at ${binding.name}.` };
60
+ if (context.capturePoint !== undefined &&
61
+ !semanticBindingPrecedesCapture(binding, context.capturePoint, context.state.parentsByNode)) {
62
+ const { capturePoint: _capturePoint, ...liveContext } = context;
63
+ return evaluateBinding(binding, {
64
+ ...liveContext,
65
+ primitiveBindingValues: primitiveBindingValuesFor(context.state),
66
+ });
67
+ }
45
68
  const cached = context.primitiveBindingValues.get(binding.bindingId);
46
69
  if (cached !== undefined)
47
70
  return cached;
@@ -50,6 +73,16 @@ const evaluateBinding = (binding, context) => {
50
73
  status: "unknown",
51
74
  reason: `Binding ${binding.name} has no constant initializer.`,
52
75
  };
76
+ if (binding.initializers.some(({ node }) => t.isUpdateExpression(node) ||
77
+ (t.isAssignmentExpression(node) &&
78
+ node.operator !== "=" &&
79
+ node.operator !== "&&=" &&
80
+ node.operator !== "||=" &&
81
+ node.operator !== "??=")))
82
+ return {
83
+ status: "unknown",
84
+ reason: `Binding ${binding.name} has a compound or update write.`,
85
+ };
53
86
  if (binding.initializers.length > 1)
54
87
  return {
55
88
  status: "ambiguous",
@@ -59,9 +92,24 @@ const evaluateBinding = (binding, context) => {
59
92
  if (initializer === undefined)
60
93
  return { status: "unknown", reason: "Missing binding initializer." };
61
94
  const nested = nestedContext(context, binding.bindingId);
62
- const value = projectValue(evaluateExpression(initializer.node, nested), initializer.projection);
63
- const projected = binding.mutatedPaths.reduce(invalidateSemanticMutationPath, value);
64
- if (projected.status === "literal" ||
95
+ let value = projectValue(evaluateExpression(initializer.node, nested), initializer.projection);
96
+ if (!isPrimitive(value)) {
97
+ const captureContext = primitiveCaptureContext(initializer.node, nested);
98
+ if (captureContext !== undefined) {
99
+ const captured = projectValue(evaluateExpression(initializer.node, captureContext), initializer.projection);
100
+ if (isPrimitive(captured))
101
+ value = captured;
102
+ }
103
+ }
104
+ const mutated = binding.mutatedPaths.reduce(invalidateSemanticMutationPath, value);
105
+ const projected = binding.escapedPaths.reduce((value, escape) => context.capturePoint !== undefined &&
106
+ semanticEscapeFollowsCapture(binding, context.capturePoint, escape.node, context.state.parentsByNode)
107
+ ? value
108
+ : invalidateSemanticEscapedPath(value, escape.path), mutated);
109
+ // Point-local memoization also bounds failed speculative captures. Only a
110
+ // primitive result is allowed back into ordinary value evaluation.
111
+ if (context.capturePoint !== undefined ||
112
+ projected.status === "literal" ||
65
113
  projected.status === "union" ||
66
114
  (isSemanticResourceLimit(projected) &&
67
115
  (projected.resourceLimit === "primitive-bytes" ||
@@ -72,9 +120,21 @@ const evaluateBinding = (binding, context) => {
72
120
  const evaluateExpression = (node, context) => {
73
121
  if (context.expressionDepth > SEMANTIC_EXPRESSION_DEPTH_LIMIT)
74
122
  return semanticResourceLimitUnknown("expression-depth");
75
- const literal = primitiveValue(node);
123
+ const unwrapped = unwrapJavaScriptExpression(node);
124
+ if (unwrapped.depth > 0) {
125
+ if (context.expressionDepth + unwrapped.depth >
126
+ SEMANTIC_EXPRESSION_DEPTH_LIMIT)
127
+ return semanticResourceLimitUnknown("expression-depth");
128
+ return evaluateExpression(unwrapped.node, {
129
+ ...context,
130
+ expressionDepth: context.expressionDepth + unwrapped.depth,
131
+ });
132
+ }
133
+ const literal = readExactJavaScriptLiteral(node);
76
134
  if (literal.found)
77
- return { status: "literal", value: literal.value };
135
+ return typeof literal.value === "number"
136
+ ? primitiveSet([literal.value])
137
+ : { status: "literal", value: literal.value };
78
138
  if (t.isIdentifier(node)) {
79
139
  const binding = resolveSemanticBindingState(context.state, node, node.name);
80
140
  return binding === undefined
@@ -103,20 +163,18 @@ const evaluateExpression = (node, context) => {
103
163
  return evaluateAddition(node, context);
104
164
  if (t.isUnaryExpression(node))
105
165
  return evaluateUnary(node, context);
106
- if ((t.isTSAsExpression(node) ||
107
- t.isTSTypeAssertion(node) ||
108
- t.isTSNonNullExpression(node)) &&
109
- t.isExpression(node.expression))
110
- return evaluateExpression(node.expression, nestedContext(context));
111
166
  return { status: "unknown", reason: `Unsupported ${node.type} value.` };
112
167
  };
113
168
  const evaluateTemplate = (node, context) => {
114
169
  let candidates = [""];
115
170
  for (let index = 0; index < node.quasis.length; index += 1) {
116
171
  const quasi = node.quasis[index];
117
- // Semantic template evaluation retains its established raw fallback for
118
- // synthetic AST inputs; exact atom readers remain cooked-only.
119
- const text = quasi?.value.cooked ?? quasi?.value.raw ?? "";
172
+ const text = quasi?.value.cooked;
173
+ if (text === undefined || text === null)
174
+ return {
175
+ status: "unknown",
176
+ reason: "Template text has no cooked representation.",
177
+ };
120
178
  if (exceedsSemanticTemplateByteBudget(candidates, [text]))
121
179
  return semanticResourceLimitUnknown("primitive-bytes");
122
180
  candidates = candidates.map((prefix) => `${prefix}${text}`);
@@ -150,6 +208,7 @@ const evaluateObject = (node, context) => {
150
208
  for (const [name] of propertiesByName)
151
209
  propertiesByName.set(name, {
152
210
  name,
211
+ presence: "present",
153
212
  value: {
154
213
  status: "unknown",
155
214
  reason: "A later property may overwrite this value.",
@@ -183,15 +242,16 @@ const evaluateObject = (node, context) => {
183
242
  }
184
243
  propertiesByName.set(name, {
185
244
  name,
245
+ presence: "present",
186
246
  value: t.isObjectProperty(property)
187
- ? evaluateExpression(property.value, nestedContext(context))
247
+ ? evaluateCapturedExpression(property.value, nestedContext(context))
188
248
  : {
189
249
  status: "unknown",
190
250
  reason: "Object method or accessor value is not a primitive.",
191
251
  },
192
252
  });
193
253
  }
194
- const properties = [...propertiesByName.values()].sort((left, right) => compareCodePoints(left.name, right.name));
254
+ const properties = [...propertiesByName.values()].sort((left, right) => compareUnicodeCodePoints(left.name, right.name));
195
255
  return unknownProperties
196
256
  ? {
197
257
  status: "object",
@@ -218,20 +278,27 @@ const evaluateArray = (node, context) => {
218
278
  break;
219
279
  }
220
280
  if (element === null) {
221
- unknownItems = true;
222
- if (omittedItems !== null)
223
- omittedItems += 1;
224
281
  items.push({
225
- status: "unknown",
226
- reason: "Array hole has no primitive value.",
282
+ name: String(items.length),
283
+ presence: "absent",
284
+ value: { status: "unknown", reason: "Array hole has no own value." },
227
285
  });
228
286
  continue;
229
287
  }
230
- items.push(evaluateExpression(element, nestedContext(context)));
288
+ items.push({
289
+ name: String(items.length),
290
+ presence: "present",
291
+ value: evaluateCapturedExpression(element, nestedContext(context)),
292
+ });
231
293
  }
232
294
  return unknownItems
233
295
  ? { status: "array", items, unknownItems: true, omittedItems }
234
- : { status: "array", items, unknownItems: false, omittedItems: 0 };
296
+ : {
297
+ status: "array",
298
+ items,
299
+ unknownItems: false,
300
+ omittedItems: 0,
301
+ };
235
302
  };
236
303
  const evaluateMember = (node, context) => {
237
304
  const keys = [];
@@ -290,7 +357,7 @@ const addPrimitiveValues = (leftValue, rightValue) => {
290
357
  return rightValue;
291
358
  return { status: "unknown", reason: "Non-primitive addition." };
292
359
  }
293
- if (left.length > MAX_SEMANTIC_PRIMITIVE_CANDIDATES / right.length)
360
+ if (left.length > SEMANTIC_PRIMITIVE_CANDIDATE_LIMIT / right.length)
294
361
  return semanticResourceLimitUnknown("primitive-candidates");
295
362
  if (exceedsSemanticPrimitiveAdditionByteBudget(left, right))
296
363
  return semanticResourceLimitUnknown("primitive-bytes");
@@ -316,46 +383,16 @@ const evaluateUnary = (node, context) => {
316
383
  return { status: "unknown", reason: `Unsupported unary ${node.operator}.` };
317
384
  };
318
385
  const projectValue = (value, projection) => {
319
- let current = value;
320
- for (const key of projection) {
321
- if (key === null)
322
- return {
323
- status: "unknown",
324
- reason: "Cannot project a dynamic property.",
325
- };
326
- if (current.status === "object" && typeof key === "string") {
327
- const property = current.properties.find(({ name }) => name === key);
328
- if (property === undefined)
329
- return {
330
- status: current.unknownProperties ? "unknown" : "unknown",
331
- reason: `Object property ${key} was not observed.`,
332
- };
333
- current = property.value;
334
- }
335
- else if (current.status === "array") {
336
- const index = typeof key === "number" ? key : Number(key);
337
- if (!Number.isSafeInteger(index) ||
338
- index < 0 ||
339
- String(index) !== String(key))
340
- return {
341
- status: "unknown",
342
- reason: `Array property ${String(key)} is not a canonical index.`,
343
- };
344
- const item = current.items[index];
345
- if (item === undefined)
346
- return {
347
- status: "unknown",
348
- reason: `Array item ${String(key)} missing.`,
349
- };
350
- current = item;
351
- }
352
- else
353
- return {
354
- status: "unknown",
355
- reason: `Cannot project ${String(key)} from ${current.status}.`,
356
- };
357
- }
358
- return current;
386
+ if (projection.includes(null))
387
+ return { status: "unknown", reason: "Cannot project a dynamic property." };
388
+ const path = projection.map((key) => String(key));
389
+ const slot = semanticSlotAtPath(value, path);
390
+ return slot.presence === "present"
391
+ ? slot.value
392
+ : {
393
+ status: "unknown",
394
+ reason: `Own property ${path.join("/")} is ${slot.presence}.`,
395
+ };
359
396
  };
360
397
  const provenanceForBinding = (binding, context) => {
361
398
  if (context.bindings.has(binding.bindingId))
@@ -385,6 +422,16 @@ const provenanceForBinding = (binding, context) => {
385
422
  const provenanceForExpression = (node, context) => {
386
423
  if (context.expressionDepth > SEMANTIC_EXPRESSION_DEPTH_LIMIT)
387
424
  return semanticUnresolvedProvenance("unknown", semanticResourceLimitReason("expression-depth"));
425
+ const unwrapped = unwrapJavaScriptExpression(node);
426
+ if (unwrapped.depth > 0) {
427
+ if (context.expressionDepth + unwrapped.depth >
428
+ SEMANTIC_EXPRESSION_DEPTH_LIMIT)
429
+ return semanticUnresolvedProvenance("unknown", semanticResourceLimitReason("expression-depth"));
430
+ return provenanceForExpression(unwrapped.node, {
431
+ ...context,
432
+ expressionDepth: context.expressionDepth + unwrapped.depth,
433
+ });
434
+ }
388
435
  const required = semanticRequireOrigin(node, context.state);
389
436
  if (required !== undefined)
390
437
  return semanticOriginsProvenance([required]);
@@ -423,9 +470,14 @@ const provenanceForExpression = (node, context) => {
423
470
  provenanceForExpression(left, nestedContext(context)),
424
471
  provenanceForExpression(right, nestedContext(context)),
425
472
  ];
426
- const origins = candidates.flatMap((candidate) => candidate.origins);
473
+ const origins = uniqueSemanticOrigins(candidates.flatMap((candidate) => candidate.origins));
474
+ const allModuleOrigins = candidates.every(({ status }) => status === "module");
475
+ if (allModuleOrigins && origins.length === 1)
476
+ return semanticOriginsProvenance(origins);
427
477
  return origins.length > 0
428
- ? semanticAmbiguousProvenance(uniqueSemanticOrigins(origins), "Multiple module origins.")
478
+ ? semanticAmbiguousProvenance(origins, allModuleOrigins
479
+ ? "Multiple module origins."
480
+ : "Conditional provenance includes a non-module alternative.")
429
481
  : semanticUnresolvedProvenance("unknown", "Conditional provenance is unresolved.");
430
482
  }
431
483
  return semanticLocalProvenance();
@@ -442,8 +494,60 @@ const mergeValues = (values) => {
442
494
  const nestedContext = (context, bindingId) => ({
443
495
  state: context.state,
444
496
  primitiveBindingValues: context.primitiveBindingValues,
497
+ ...(context.capturePoint === undefined
498
+ ? {}
499
+ : { capturePoint: context.capturePoint }),
445
500
  expressionDepth: context.expressionDepth + 1,
446
501
  bindings: bindingId === undefined
447
502
  ? context.bindings
448
503
  : new Set([...context.bindings, bindingId]),
449
504
  });
505
+ const isPrimitive = (value) => value.status === "literal" || value.status === "union";
506
+ const primitiveCaptureContext = (node, context) => {
507
+ if (t.isObjectExpression(node) || t.isArrayExpression(node))
508
+ return undefined;
509
+ return captureContextAt(node, context);
510
+ };
511
+ const captureContextAt = (node, context) => {
512
+ if (context.capturePoint !== undefined ||
513
+ semanticCapturePosition(node, context.state.parentsByNode) === null)
514
+ return undefined;
515
+ let captures = capturedBindingValuesByState.get(context.state);
516
+ if (captures === undefined) {
517
+ captures = new WeakMap();
518
+ capturedBindingValuesByState.set(context.state, captures);
519
+ }
520
+ let values = captures.get(node);
521
+ if (values === undefined) {
522
+ values = new Map();
523
+ captures.set(node, values);
524
+ }
525
+ return { ...context, capturePoint: node, primitiveBindingValues: values };
526
+ };
527
+ const evaluateCapturedExpression = (node, context) => {
528
+ // A literal field captures its primitive at construction, even when its
529
+ // containing object is subsequently read at another capture point.
530
+ let values = primitiveExpressionValuesByState.get(context.state);
531
+ const cached = values?.get(node);
532
+ if (cached !== undefined)
533
+ return cached;
534
+ let value = evaluateExpression(node, context);
535
+ if (!isPrimitive(value)) {
536
+ const captureContext = primitiveCaptureContext(node, context);
537
+ if (captureContext !== undefined) {
538
+ const captured = evaluateExpression(node, captureContext);
539
+ if (isPrimitive(captured))
540
+ value = captured;
541
+ }
542
+ }
543
+ // Never publish values evaluated at somebody else's capture point. Like
544
+ // binding caches, these entries are discarded whenever effects change.
545
+ if (context.capturePoint === undefined && isPrimitive(value)) {
546
+ if (values === undefined) {
547
+ values = new WeakMap();
548
+ primitiveExpressionValuesByState.set(context.state, values);
549
+ }
550
+ values.set(node, value);
551
+ }
552
+ return value;
553
+ };
@@ -0,0 +1,114 @@
1
+ import { posix } from "node:path";
2
+ import { domainToASCII, fileURLToPath, pathToFileURL } from "node:url";
3
+ import { z } from "zod";
4
+ /** Map-scoped source declaration and its path interpretation for matching. */
5
+ export const javascriptSourceMapReferenceSchema = z.strictObject({
6
+ source_name: z.string(),
7
+ source_root: z.string().nullable(),
8
+ map_path: z.string().min(1),
9
+ resolution: z.discriminatedUnion("kind", [
10
+ z.strictObject({
11
+ kind: z.enum(["artifact-relative", "suffix"]),
12
+ path: z.string().min(1),
13
+ }),
14
+ z.strictObject({
15
+ kind: z.literal("unresolved"),
16
+ reason: z.string().min(1),
17
+ }),
18
+ ]),
19
+ });
20
+ /** Interpret a declaration once at the source-map ingestion boundary. */
21
+ export const resolveJavaScriptSourceMapReference = (sourceName, sourceRoot, mapPath) => {
22
+ // TraceMap's producer prefixes sourceRoot before resolving the URL reference.
23
+ const reference = `${sourceRoot ? `${sourceRoot}/` : ""}${sourceName}`;
24
+ return {
25
+ source_name: sourceName,
26
+ source_root: sourceRoot,
27
+ map_path: mapPath,
28
+ resolution: resolveJavaScriptSourceMapPath(reference, mapPath),
29
+ };
30
+ };
31
+ /** Resolve a source-map URL reference without changing its recorded identity. */
32
+ const resolveJavaScriptSourceMapPath = (source, mapPath) => {
33
+ const portable = source.replaceAll("\\", "/");
34
+ const windowsPath = /^[a-z]:\//iu.test(portable) || source.startsWith("\\\\");
35
+ // Preserve parent traversal rather than letting URL resolution clamp at '/'.
36
+ const anchor = `/${"source/".repeat(portable.split("/").length + 1)}`;
37
+ const directory = posix.join(anchor, posix.dirname(mapPath.replaceAll("\\", "/")));
38
+ const base = pathToFileURL(`${directory}/`, { windows: false });
39
+ const absolute = windowsPath ? windowsFileUrl(source) : URL.parse(source);
40
+ const resolved = windowsPath ? absolute : URL.parse(source, base);
41
+ if (resolved === null)
42
+ return {
43
+ kind: "unresolved",
44
+ reason: "Source reference is not a valid URL or filesystem path.",
45
+ };
46
+ if (!resolved.pathname.startsWith("/"))
47
+ return {
48
+ kind: "unresolved",
49
+ reason: "Source reference uses a non-hierarchical URL without a file pathname.",
50
+ };
51
+ if (resolved.pathname.endsWith("/"))
52
+ return {
53
+ kind: "unresolved",
54
+ reason: "Source reference names a directory rather than a file.",
55
+ };
56
+ // Encoded separators must not manufacture a different filesystem hierarchy.
57
+ if (/%(?:2f|5c)/iu.test(resolved.pathname))
58
+ return {
59
+ kind: "unresolved",
60
+ reason: "Source reference contains an encoded path separator.",
61
+ };
62
+ const relative = absolute === null
63
+ ? !portable.startsWith("/")
64
+ : absolute.href !== resolved.href;
65
+ const path = decodedUrlPath(resolved);
66
+ if (path === null)
67
+ return {
68
+ kind: "unresolved",
69
+ reason: "Source reference has malformed URL encoding or an invalid file URL.",
70
+ };
71
+ const value = relative
72
+ ? posix.relative(anchor, path)
73
+ : path.replace(/^\/+/, "");
74
+ if (value === "" || value === ".." || value.startsWith("../"))
75
+ return {
76
+ kind: "unresolved",
77
+ reason: "Source reference resolves outside the inventoried artifact.",
78
+ };
79
+ return { path: value, kind: relative ? "artifact-relative" : "suffix" };
80
+ };
81
+ // Reject URL delimiters/escapes before IDNA can truncate or decode the host.
82
+ const unusableHost = /[\0\t\n\r #/:<>?@[\\\]^|%]/u;
83
+ // URL/IDNA validation also rejects Unicode hosts that normalize to empty.
84
+ const carriesUsableHost = (host) => !unusableHost.test(host) && domainToASCII(host) !== "";
85
+ const windowsFileUrl = (path) => {
86
+ // A malformed UNC host aborts pathToFileURL() on the Node builds this
87
+ // package admits, so decline the reference before handing the path over
88
+ // rather than trusting a TypeError that never arrives.
89
+ if (path.startsWith("\\\\") &&
90
+ !carriesUsableHost(path.slice(2).split("\\")[0] ?? ""))
91
+ return null;
92
+ try {
93
+ return pathToFileURL(path, { windows: true });
94
+ }
95
+ catch (cause) {
96
+ if (cause instanceof TypeError)
97
+ return null;
98
+ throw cause;
99
+ }
100
+ };
101
+ const decodedUrlPath = (url) => {
102
+ try {
103
+ if (url.protocol === "file:")
104
+ return fileURLToPath(url, {
105
+ windows: url.hostname !== "" && url.hostname !== "localhost",
106
+ }).replaceAll("\\", "/");
107
+ return `${url.host}${decodeURIComponent(url.pathname)}`;
108
+ }
109
+ catch (cause) {
110
+ if (cause instanceof URIError || cause instanceof TypeError)
111
+ return null;
112
+ throw cause;
113
+ }
114
+ };
@@ -1,4 +1,37 @@
1
1
  import { parse } from "@babel/parser";
2
+ /**
3
+ * Babel plugins for one source path. Single owner for TypeScript/JSX
4
+ * mode selection (tsc + Babel `typescript` plugin semantics).
5
+ *
6
+ * - `dts:true` only for `.d.ts/.d.mts/.d.cts` ambient declarations;
7
+ * ordinary `.ts` keeps the missing-initializer diagnostic.
8
+ * - JSX enabled for `.tsx`, `.jsx`, `.js`, and unknown paths; disabled for
9
+ * plain `.ts/.cts/.mts` (angle-bracket assertions, not JSX) and for all
10
+ * declaration files. `.mts` (including `.d.mts`) sets
11
+ * `disallowAmbiguousJSXLike`, matching tsc's `.mts` mode.
12
+ * - `decorators-legacy` always present: without it decorated sources fail
13
+ * hard instead of reporting recovered syntax, losing every derived fact.
14
+ * - Unknown paths retain the existing JSX-capable contract (best-effort
15
+ * parse; failures surface via `errorRecovery`, never silent misparse).
16
+ */
17
+ export const parserPluginsForPath = (sourcePath) => {
18
+ const path = sourcePath ?? "";
19
+ const dts = /\.d\.(?:ts|mts|cts)$/iu.test(path);
20
+ const isTsLike = /\.(?:ts|cts|mts)$/iu.test(path);
21
+ const isTsx = /\.tsx$/iu.test(path);
22
+ const isMts = /\.mts$/iu.test(path);
23
+ const typescript = [
24
+ "typescript",
25
+ {
26
+ dts,
27
+ ...(isMts ? { disallowAmbiguousJSXLike: true } : {}),
28
+ },
29
+ ];
30
+ const jsxCapable = !dts && (isTsx || !isTsLike);
31
+ return jsxCapable
32
+ ? ["decorators-legacy", "jsx", typescript]
33
+ : ["decorators-legacy", typescript];
34
+ };
2
35
  /** Parse JavaScript or TypeScript once without attaching comments to AST nodes. */
3
36
  export const parseJavaScriptSource = (source, sourcePath) => {
4
37
  try {
@@ -6,15 +39,7 @@ export const parseJavaScriptSource = (source, sourcePath) => {
6
39
  sourceType: "unambiguous",
7
40
  errorRecovery: true,
8
41
  attachComment: false,
9
- // "decorators-legacy" admits both the standard and the legacy decorator
10
- // forms, including parameter decorators. Without it a decorated
11
- // TypeScript source fails to parse at all rather than reporting
12
- // recovered syntax, which loses every fact derived from that source.
13
- // Plain .ts artifacts admit angle-bracket type assertions instead of JSX.
14
- // Unknown paths retain the existing JSX-capable parser contract.
15
- plugins: sourcePath?.toLowerCase().endsWith(".ts") === true
16
- ? ["decorators-legacy", "typescript"]
17
- : ["decorators-legacy", "jsx", "typescript"],
42
+ plugins: parserPluginsForPath(sourcePath),
18
43
  });
19
44
  }
20
45
  catch (cause) {
@@ -1,7 +1,7 @@
1
1
  import * as t from "@babel/types";
2
2
  import { traverseJavaScriptAst } from "./javascriptSemanticTraversal.js";
3
3
  import { collectJavaScriptExports, fingerprintJavaScriptAst, } from "./javascriptAstFingerprint.js";
4
- import { compareCodePoints } from "../canonicalOrdering.js";
4
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
5
5
  import { addFindingOnce } from "./javascriptStaticAnalysisFindings.js";
6
6
  import { argumentValue, calleeName, chunkRuntime, factoryRequireName, moduleFactory, modulePropertyName, range, registrationKey, sha256Text, sourceSlice, staticArrayValues, } from "./javascriptStaticAnalysisHelpers.js";
7
7
  /** Inspect a bundler registration call and recover its module table. */
@@ -39,7 +39,7 @@ export const inspectBundlerRegistration = (source, call, accumulator) => {
39
39
  unknown_entry_module_keys: runtimeValue.unknownEntryModuleKeys,
40
40
  async_chunk_keys: asyncChunkKeys.values,
41
41
  unknown_async_chunk_keys: runtimeValue.unknownAsyncChunkKeys + recovered.unknownAsyncChunkKeys,
42
- modules: recovered.modules.sort((left, right) => compareCodePoints(left.module_key, right.module_key)),
42
+ modules: recovered.modules.sort((left, right) => compareUnicodeCodePoints(left.module_key, right.module_key)),
43
43
  location: range(call),
44
44
  };
45
45
  addFindingOnce(accumulator, `registration\0${registrationKey(registration)}`, () => accumulator.registrations.push(registration));
@@ -70,7 +70,7 @@ export const inspectEsbuildWrapper = (source, call, accumulator) => {
70
70
  unknown_entry_module_keys: 0,
71
71
  async_chunk_keys: recovered.asyncChunkKeys,
72
72
  unknown_async_chunk_keys: recovered.unknownAsyncChunkKeys,
73
- modules: recovered.modules.sort((left, right) => compareCodePoints(left.module_key, right.module_key)),
73
+ modules: recovered.modules.sort((left, right) => compareUnicodeCodePoints(left.module_key, right.module_key)),
74
74
  location: range(call),
75
75
  };
76
76
  addFindingOnce(accumulator, `registration\0${registrationKey(registration)}`, () => accumulator.registrations.push(registration));
@@ -146,7 +146,7 @@ const runtimeMetadata = (node) => {
146
146
  asyncChunkKeys: [],
147
147
  unknownAsyncChunkKeys: 0,
148
148
  };
149
- const entries = collectBundlerEntryModuleKeys(node, requireName);
149
+ const entries = collectBundlerCallArgumentValues(node, requireName);
150
150
  const asyncChunks = collectBundlerAsyncChunkKeys(node, requireName);
151
151
  return {
152
152
  requireName,
@@ -156,7 +156,6 @@ const runtimeMetadata = (node) => {
156
156
  unknownAsyncChunkKeys: asyncChunks.unknown,
157
157
  };
158
158
  };
159
- const collectBundlerEntryModuleKeys = (factory, requireName) => collectBundlerCallArgumentValues(factory, requireName);
160
159
  const collectBundlerAsyncChunkKeys = (factory, requireName) => requireName === null
161
160
  ? { values: [], unknown: 0 }
162
161
  : collectBundlerCallArgumentValues(factory, `${requireName}.e`);
@@ -183,7 +182,7 @@ const isBundlerFunction = (node) => t.isFunctionExpression(node) ||
183
182
  t.isArrowFunctionExpression(node) ||
184
183
  t.isObjectMethod(node);
185
184
  const uniqueValues = (values, unknown = 0) => {
186
- const unique = [...new Set(values)].sort(compareCodePoints);
185
+ const unique = [...new Set(values)].sort(compareUnicodeCodePoints);
187
186
  return {
188
187
  values: unique,
189
188
  unknown,
@@ -1,7 +1,8 @@
1
1
  import * as t from "@babel/types";
2
2
  import { sanitizeEndpointCandidate } from "../browserObservation.js";
3
3
  import { addFindingOnce, addLocatedFinding, } from "./javascriptStaticAnalysisFindings.js";
4
- import { STATIC_ROUTE_CALL_NAMES, argumentValue, calleeName, endpointArgument as endpointArgumentHelper, prefixedArgument, semanticStaticPropertyName, range, rangeForOffsets, sourceSlice, staticPath, staticPathResolutionContext, storageKind, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
4
+ import { STATIC_ROUTE_CALL_NAMES, argumentValue, calleeName, endpointArgument as endpointArgumentHelper, prefixedArgument, range, rangeForOffsets, sourceSlice, staticPath, staticPathResolutionContext, storageKind, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
5
+ import { semanticStaticPropertyName } from "./javascriptAstValues.js";
5
6
  /** Inspect one call or new expression for references, endpoints, storage, and roles. */
6
7
  export const inspectCall = (source, node, context) => {
7
8
  const { accumulator } = context;