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,21 +1,14 @@
1
1
  import { z } from "zod";
2
2
  import { emptyArraySchema } from "../emptyArraySchema.js";
3
3
  import { evidenceSchema } from "../evidence.js";
4
- import { javascriptApplicationGraphSchema } from "./javascriptApplicationGraph.js";
4
+ import { isValidatedImmutableJavaScriptApplicationGraph, javascriptApplicationGraphSchema, } from "./javascriptApplicationGraph.js";
5
5
  import { JAVASCRIPT_APPLICATION_NODE_KINDS } from "./javascriptApplicationGraphSchemas.js";
6
6
  import { prefixedDigestSchema } from "../digests.js";
7
7
  const evidenceIdSchema = prefixedDigestSchema("ev");
8
8
  const nodeIdSchema = prefixedDigestSchema("jag_node");
9
9
  const textSchema = z.string().min(1);
10
- /** Two authenticated application versions and their native observations. */
11
- export const compareApplicationVersionsInputSchema = z
12
- .strictObject({
13
- left: evidenceSchema,
14
- right: evidenceSchema,
15
- left_native_observations: z.array(evidenceSchema).default([]),
16
- right_native_observations: z.array(evidenceSchema).default([]),
17
- })
18
- .superRefine((input, context) => {
10
+ /** Check paired version identities and per-side native identity uniqueness. */
11
+ const validateApplicationVersionIdentities = (input, context) => {
19
12
  if (input.left.evidence_id === input.right.evidence_id)
20
13
  context.addIssue({
21
14
  code: "custom",
@@ -34,8 +27,26 @@ export const compareApplicationVersionsInputSchema = z
34
27
  message: "Native observations must be unique on each side",
35
28
  });
36
29
  }
37
- });
38
- const emptyCandidateNodesSchema = emptyArraySchema;
30
+ };
31
+ const evidenceIdentitySchema = z.object({ evidence_id: evidenceIdSchema });
32
+ /** Validate paired version identities without capturing whole analysis graphs. */
33
+ export const applicationVersionIdentitiesSchema = z
34
+ .object({
35
+ left: evidenceIdentitySchema,
36
+ right: evidenceIdentitySchema,
37
+ left_native_observations: z.array(evidenceIdentitySchema),
38
+ right_native_observations: z.array(evidenceIdentitySchema),
39
+ })
40
+ .superRefine(validateApplicationVersionIdentities);
41
+ /** Two authenticated application versions and their native observations. */
42
+ export const compareApplicationVersionsInputSchema = z
43
+ .strictObject({
44
+ left: evidenceSchema,
45
+ right: evidenceSchema,
46
+ left_native_observations: z.array(evidenceSchema).default([]),
47
+ right_native_observations: z.array(evidenceSchema).default([]),
48
+ })
49
+ .superRefine(validateApplicationVersionIdentities);
39
50
  const candidateNodesSchema = z.tuple([nodeIdSchema]).rest(nodeIdSchema);
40
51
  const exactMatchSchema = z.strictObject({
41
52
  status: z.literal("matched"),
@@ -45,22 +56,22 @@ const exactMatchSchema = z.strictObject({
45
56
  "exact-module-source-digest",
46
57
  ]),
47
58
  confidence: z.literal("exact"),
48
- candidate_left_node_ids: emptyCandidateNodesSchema,
49
- candidate_right_node_ids: emptyCandidateNodesSchema,
59
+ candidate_left_node_ids: emptyArraySchema,
60
+ candidate_right_node_ids: emptyArraySchema,
50
61
  });
51
62
  const sourceMapMatchSchema = z.strictObject({
52
63
  status: z.literal("matched"),
53
64
  basis: z.literal("source-map-identity"),
54
65
  confidence: z.literal("high"),
55
- candidate_left_node_ids: emptyCandidateNodesSchema,
56
- candidate_right_node_ids: emptyCandidateNodesSchema,
66
+ candidate_left_node_ids: emptyArraySchema,
67
+ candidate_right_node_ids: emptyArraySchema,
57
68
  });
58
69
  const inferredMatchSchema = z.strictObject({
59
70
  status: z.literal("matched"),
60
71
  basis: z.enum(["structural-fingerprint", "semantic-key"]),
61
72
  confidence: z.literal("medium"),
62
- candidate_left_node_ids: emptyCandidateNodesSchema,
63
- candidate_right_node_ids: emptyCandidateNodesSchema,
73
+ candidate_left_node_ids: emptyArraySchema,
74
+ candidate_right_node_ids: emptyArraySchema,
64
75
  });
65
76
  const matchedItemMatchSchema = z.union([
66
77
  exactMatchSchema,
@@ -71,14 +82,14 @@ const unmatchedItemMatchSchema = z.strictObject({
71
82
  status: z.literal("unmatched"),
72
83
  basis: z.literal("none"),
73
84
  confidence: z.literal("unknown"),
74
- candidate_left_node_ids: emptyCandidateNodesSchema,
75
- candidate_right_node_ids: emptyCandidateNodesSchema,
85
+ candidate_left_node_ids: emptyArraySchema,
86
+ candidate_right_node_ids: emptyArraySchema,
76
87
  });
77
88
  const leftAmbiguousMatchSchema = z.strictObject({
78
89
  status: z.literal("ambiguous"),
79
90
  basis: z.literal("none"),
80
91
  confidence: z.literal("unknown"),
81
- candidate_left_node_ids: emptyCandidateNodesSchema,
92
+ candidate_left_node_ids: emptyArraySchema,
82
93
  candidate_right_node_ids: candidateNodesSchema,
83
94
  });
84
95
  const rightAmbiguousMatchSchema = z.strictObject({
@@ -86,7 +97,7 @@ const rightAmbiguousMatchSchema = z.strictObject({
86
97
  basis: z.literal("none"),
87
98
  confidence: z.literal("unknown"),
88
99
  candidate_left_node_ids: candidateNodesSchema,
89
- candidate_right_node_ids: emptyCandidateNodesSchema,
100
+ candidate_right_node_ids: emptyArraySchema,
90
101
  });
91
102
  const comparisonItemContextShape = {
92
103
  item_id: prefixedDigestSchema("javc_item"),
@@ -194,3 +205,7 @@ export const applicationVersionComparisonResultSchema = z
194
205
  message: "Comparison coverage must match source graph completeness",
195
206
  });
196
207
  });
208
+ /** Reuse the exact owned change graph while validating the rest of the result. */
209
+ export const ownedApplicationVersionComparisonResultSchema = applicationVersionComparisonResultSchema.safeExtend({
210
+ graph: z.custom(isValidatedImmutableJavaScriptApplicationGraph),
211
+ });
@@ -1,6 +1,6 @@
1
- import { absenceClaimable, canonicalDigest, canonicalJson, } from "../comparisonSemantics.js";
2
- import { compareCodePoints } from "../canonicalOrdering.js";
3
- import {} from "./javascriptApplicationGraph.js";
1
+ import { absenceClaimable, canonicalJson } from "../comparisonSemantics.js";
2
+ import { digestCanonicalValue } from "../canonicalDigest.js";
3
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
4
4
  /** Classify matched, unmatched, and ambiguous nodes without inventing absence. */
5
5
  export const classifyJavaScriptApplicationVersions = (matching, context) => {
6
6
  const pairByLeft = new Map(matching.pairs.map(({ left, right }) => [
@@ -11,7 +11,13 @@ export const classifyJavaScriptApplicationVersions = (matching, context) => {
11
11
  right.node_id,
12
12
  `pair:${left.node_id}:${right.node_id}`,
13
13
  ]));
14
- const fullContext = { ...context, pairByLeft, pairByRight };
14
+ const fullContext = {
15
+ ...context,
16
+ pairByLeft,
17
+ pairByRight,
18
+ leftRelationships: indexRelationships(context.leftGraph),
19
+ rightRelationships: indexRelationships(context.rightGraph),
20
+ };
15
21
  const leftItems = matching.unmatchedLeft.map((node) => {
16
22
  const candidates = matching.candidatesForLeft.get(node.node_id) ?? [];
17
23
  return unmatchedItem({
@@ -31,7 +37,7 @@ export const classifyJavaScriptApplicationVersions = (matching, context) => {
31
37
  ...matching.pairs.map((pair) => matchedItem(pair, fullContext)),
32
38
  ...leftItems,
33
39
  ...rightItems,
34
- ].sort((left, right) => compareCodePoints(left.item_id, right.item_id)),
40
+ ].sort((left, right) => compareUnicodeCodePoints(left.item_id, right.item_id)),
35
41
  };
36
42
  };
37
43
  const matchedItem = (pair, context) => {
@@ -202,38 +208,46 @@ const contentIdentity = (node) => {
202
208
  };
203
209
  const locations = (node) => node.observations
204
210
  .map(({ evidence }) => evidence.location.available ? evidence.location.value : evidence.location)
205
- .sort((left, right) => compareCodePoints(canonicalJson(left), canonicalJson(right)));
211
+ .sort((left, right) => compareUnicodeCodePoints(canonicalJson(left), canonicalJson(right)));
206
212
  const properties = (node) => node.observations
207
- .map(({ label, properties: values }) => ({ label, properties: values }))
208
- .sort((left, right) => compareCodePoints(canonicalJson(left), canonicalJson(right)));
213
+ .map(({ label, properties: values, source_map_reference }) => ({
214
+ label,
215
+ properties: values,
216
+ source_map_reference,
217
+ }))
218
+ .sort((left, right) => compareUnicodeCodePoints(canonicalJson(left), canonicalJson(right)));
219
+ const indexRelationships = (graph) => {
220
+ const adjacency = new Map();
221
+ const add = (nodeId, relationship) => {
222
+ const existing = adjacency.get(nodeId);
223
+ if (existing === undefined)
224
+ adjacency.set(nodeId, [relationship]);
225
+ else
226
+ existing.push(relationship);
227
+ };
228
+ for (const edge of graph.edges) {
229
+ add(edge.source_node_id, {
230
+ direction: "out",
231
+ relation: edge.relation,
232
+ neighborId: edge.target_node_id,
233
+ });
234
+ if (edge.target_node_id !== edge.source_node_id)
235
+ add(edge.target_node_id, {
236
+ direction: "in",
237
+ relation: edge.relation,
238
+ neighborId: edge.source_node_id,
239
+ });
240
+ }
241
+ return {
242
+ nodeById: new Map(graph.nodes.map((value) => [value.node_id, value])),
243
+ adjacency,
244
+ };
245
+ };
209
246
  const relationshipSignature = (node, side, context) => {
210
- const graph = side === "left" ? context.leftGraph : context.rightGraph;
247
+ const { nodeById, adjacency } = side === "left" ? context.leftRelationships : context.rightRelationships;
211
248
  const paired = side === "left" ? context.pairByLeft : context.pairByRight;
212
- const nodeById = new Map(graph.nodes.map((value) => [value.node_id, value]));
213
- const signatures = graph.edges.flatMap((edge) => {
214
- if (edge.source_node_id === node.node_id)
215
- return [
216
- edgeSignature({
217
- direction: "out",
218
- relation: edge.relation,
219
- neighborId: edge.target_node_id,
220
- paired,
221
- nodeById,
222
- }),
223
- ];
224
- if (edge.target_node_id === node.node_id)
225
- return [
226
- edgeSignature({
227
- direction: "in",
228
- relation: edge.relation,
229
- neighborId: edge.source_node_id,
230
- paired,
231
- nodeById,
232
- }),
233
- ];
234
- return [];
235
- });
236
- return canonicalJson(signatures.sort(compareCodePoints));
249
+ const signatures = (adjacency.get(node.node_id) ?? []).map((relationship) => edgeSignature({ ...relationship, paired, nodeById }));
250
+ return canonicalJson(signatures.sort(compareUnicodeCodePoints));
237
251
  };
238
252
  const edgeSignature = (context) => {
239
253
  const mapped = context.paired.get(context.neighborId);
@@ -247,7 +261,7 @@ const itemEvidenceLinks = (left, right, context) => [
247
261
  ...nativeLinks(left, context.leftNativeEvidence),
248
262
  ...nativeLinks(right, context.rightNativeEvidence),
249
263
  ]),
250
- ].sort(compareCodePoints);
264
+ ].sort(compareUnicodeCodePoints);
251
265
  const nativeLinks = (node, evidence) => {
252
266
  const digest = node === undefined
253
267
  ? null
@@ -280,7 +294,7 @@ const pairLimitations = (pair, status) => [
280
294
  ];
281
295
  const itemWithId = (semantic) => ({
282
296
  ...semantic,
283
- item_id: `javc_item_${canonicalDigest(semantic, "Application version item")}`,
297
+ item_id: `javc_item_${digestCanonicalValue(semantic, "Application version item")}`,
284
298
  });
285
299
  const stringProperty = (node, key) => {
286
300
  const values = [
@@ -1,4 +1,5 @@
1
- import { compareCodePoints } from "../canonicalOrdering.js";
1
+ import { canonicalJson } from "../comparisonSemantics.js";
2
+ import { compareUnicodeCodePoints, compositeKey, } from "../unicodeCodePointOrder.js";
2
3
  const matchTiers = () => [
3
4
  {
4
5
  match: { basis: "exact-content-digest", confidence: "exact" },
@@ -39,7 +40,7 @@ export const matchJavaScriptApplicationVersions = (leftNodes, rightNodes) => {
39
40
  const leftIds = new Set(remainingLeft.map(({ node_id: id }) => id));
40
41
  const rightIds = new Set(remainingRight.map(({ node_id: id }) => id));
41
42
  return {
42
- pairs: pairs.sort((a, b) => compareCodePoints(`${a.left.node_id}\0${a.right.node_id}`, `${b.left.node_id}\0${b.right.node_id}`)),
43
+ pairs: pairs.sort((a, b) => compareUnicodeCodePoints(`${a.left.node_id}\0${a.right.node_id}`, `${b.left.node_id}\0${b.right.node_id}`)),
43
44
  unmatchedLeft: remainingLeft,
44
45
  unmatchedRight: remainingRight,
45
46
  candidatesForLeft: filteredCandidates(leftCandidates, rightIds),
@@ -49,7 +50,7 @@ export const matchJavaScriptApplicationVersions = (leftNodes, rightNodes) => {
49
50
  const applyTier = (context) => {
50
51
  const leftByKey = nodesByKey(context.left.values(), context.tier.key);
51
52
  const rightByKey = nodesByKey(context.right.values(), context.tier.key);
52
- for (const key of [...leftByKey.keys()].sort(compareCodePoints)) {
53
+ for (const key of [...leftByKey.keys()].sort(compareUnicodeCodePoints)) {
53
54
  const leftGroup = leftByKey.get(key) ?? [];
54
55
  const rightGroup = rightByKey.get(key) ?? [];
55
56
  if (rightGroup.length === 0)
@@ -97,7 +98,7 @@ const recordCandidates = (left, right, leftCandidates, rightCandidates) => {
97
98
  const filteredCandidates = (candidates, retained) => new Map([...candidates.entries()].flatMap(([nodeId, values]) => {
98
99
  const filtered = [...values]
99
100
  .filter((value) => retained.has(value))
100
- .sort(compareCodePoints);
101
+ .sort(compareUnicodeCodePoints);
101
102
  return filtered.length === 0 ? [] : [[nodeId, filtered]];
102
103
  }));
103
104
  const nodeIdentityKey = (node) => `node\0${node.kind}\0${node.node_id}`;
@@ -112,7 +113,7 @@ const moduleSourceDigestKey = (node) => {
112
113
  };
113
114
  const sourceMapKey = (node) => node.kind === "source-module" &&
114
115
  node.identity.strategy === "source-map-original"
115
- ? `source-map\0${node.identity.original_source}`
116
+ ? `source-map\0${canonicalJson([node.identity.source_root, node.identity.original_source])}`
116
117
  : null;
117
118
  const structuralFingerprintKey = (node) => {
118
119
  if (node.kind !== "javascript-module")
@@ -177,7 +178,7 @@ const uniqueStringProperty = (node, name) => {
177
178
  };
178
179
  const joined = (...values) => {
179
180
  const strings = values.map(nonEmptyString);
180
- return strings.some((value) => value === null) ? null : strings.join("\0");
181
+ return strings.some((value) => value === null) ? null : compositeKey(strings);
181
182
  };
182
183
  const nonEmptyString = (value) => typeof value === "string" && value !== "" ? value : null;
183
184
  /** A literal value such as `ipcMain.handle("")` keeps its exact empty text. */
@@ -185,6 +186,6 @@ const exactString = (value) => typeof value === "string" ? value : null;
185
186
  const stringList = (value) => Array.isArray(value)
186
187
  ? value
187
188
  .filter((item) => typeof item === "string")
188
- .sort(compareCodePoints)
189
+ .sort(compareUnicodeCodePoints)
189
190
  : [];
190
- const sortedNodes = (nodes) => [...nodes].sort((left, right) => compareCodePoints(left.node_id, right.node_id));
191
+ const sortedNodes = (nodes) => [...nodes].sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id));
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import * as t from "@babel/types";
3
3
  import { traverseJavaScriptAst } from "./javascriptSemanticTraversal.js";
4
- import { compareCodePoints } from "../canonicalOrdering.js";
4
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
5
5
  import { propertyName } from "./javascriptAstValues.js";
6
6
  import { stringValue } from "./javascriptStaticAnalysisHelpers.js";
7
7
  /** Derive a rename-resistant syntax fingerprint without code execution. */
@@ -28,7 +28,7 @@ export const collectJavaScriptExports = (node) => {
28
28
  },
29
29
  });
30
30
  return {
31
- values: [...exports].sort(compareCodePoints),
31
+ values: [...exports].sort(compareUnicodeCodePoints),
32
32
  };
33
33
  };
34
34
  const semanticTokens = (node) => {
@@ -1,6 +1,27 @@
1
1
  import * as t from "@babel/types";
2
+ /**
3
+ * Remove wrappers that affect TypeScript or Flow checking but not runtime
4
+ * expression identity. The returned depth lets bounded evaluators account for
5
+ * syntax that normalization would otherwise skip.
6
+ */
7
+ export const unwrapJavaScriptExpression = (node) => {
8
+ let current = node;
9
+ let depth = 0;
10
+ while (t.isParenthesizedExpression(current) ||
11
+ t.isTSAsExpression(current) ||
12
+ t.isTSTypeAssertion(current) ||
13
+ t.isTSNonNullExpression(current) ||
14
+ t.isTSSatisfiesExpression(current) ||
15
+ t.isTSInstantiationExpression(current) ||
16
+ t.isTypeCastExpression(current)) {
17
+ current = current.expression;
18
+ depth += 1;
19
+ }
20
+ return { node: current, depth };
21
+ };
2
22
  /** Read one syntax-level primitive only when its value is exact. */
3
23
  export const readExactJavaScriptLiteral = (node) => {
24
+ node = unwrapJavaScriptExpression(node).node;
4
25
  if (t.isStringLiteral(node))
5
26
  return { found: true, value: node.value };
6
27
  if (t.isNumericLiteral(node) && Number.isFinite(node.value))
@@ -31,6 +52,7 @@ export const propertyName = (node) => {
31
52
  export const semanticStaticPropertyName = (property, computed) => semanticStaticPropertyKey(property, computed) ?? "";
32
53
  /** Read an exact property key, preserving the legal empty-string key. */
33
54
  export const semanticStaticPropertyKey = (property, computed) => {
55
+ property = unwrapJavaScriptExpression(property).node;
34
56
  if (t.isStringLiteral(property) || t.isNumericLiteral(property))
35
57
  return String(property.value);
36
58
  return !computed && t.isIdentifier(property) ? property.name : null;
@@ -1,7 +1,7 @@
1
- import { jsonObjectSchema, jsonValueSchema } from "../../domain/jsonValue.js";
2
- import { partialApplicationCoverage, truncatedApplicationCoverage, } from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
3
- import { flattenSemanticReturnValue } from "../../domain/javascript/javascriptSemanticReturns.js";
4
- /** Project one exact export/callable link into shallow bounded graph values. */
1
+ import { jsonObjectSchema, jsonValueSchema } from "../jsonValue.js";
2
+ import { partialApplicationCoverage, truncatedApplicationCoverage, } from "./javascriptApplicationEvidenceSchemas.js";
3
+ import { flattenSemanticReturnValue } from "./javascriptSemanticReturns.js";
4
+ /** Project one exact export/callable link into inert return-shape observations. */
5
5
  export const projectJavaScriptExportReturnShapes = (input) => {
6
6
  if (input.link.callableId === null || input.link.exportedName === null)
7
7
  return null;
@@ -1,8 +1,9 @@
1
- import { compareCodePoints, uniqueSorted } from "../canonicalOrdering.js";
1
+ import { uniqueSorted } from "../canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
2
3
  import { canonicalExportShapeValue, digestExportShapeValue, } from "./javascriptExportShapeComparisonIdentity.js";
3
4
  import { javaScriptExportShapeComparisonResultSchema, } from "./javascriptExportShapeComparisonSchemas.js";
4
5
  import { retainJavaScriptExportShapes, selectJavaScriptExport, } from "./javascriptExportShapeSelection.js";
5
- import { buildJavaScriptExportShapeChanges, hasPartialJavaScriptExportPropertyCoverage, pairJavaScriptExportShapeVariants, } from "./javascriptExportShapeVariants.js";
6
+ import { buildJavaScriptExportShapeChanges, buildJavaScriptExportShapeInventories, hasPartialJavaScriptExportPropertyCoverage, pairJavaScriptExportShapeVariants, } from "./javascriptExportShapeVariants.js";
6
7
  /** Compare exact selected export return shapes without executing JavaScript. */
7
8
  export const compareJavaScriptExportShapes = (input) => {
8
9
  const left = selectJavaScriptExport(input.left);
@@ -21,6 +22,11 @@ export const compareJavaScriptExportShapes = (input) => {
21
22
  }));
22
23
  const changes = allChanges;
23
24
  const omittedChanges = 0;
25
+ const propertyInventories = buildJavaScriptExportShapeInventories({
26
+ pairing,
27
+ leftShapes: leftRetained.shapes,
28
+ rightShapes: rightRetained.shapes,
29
+ });
24
30
  const coverage = comparisonCoverage({
25
31
  input,
26
32
  left,
@@ -35,6 +41,7 @@ export const compareJavaScriptExportShapes = (input) => {
35
41
  const semantic = {
36
42
  left: left.selection,
37
43
  right: right.selection,
44
+ property_inventories: propertyInventories,
38
45
  summary: summarize(allChanges),
39
46
  changes,
40
47
  coverage,
@@ -59,7 +66,7 @@ const sortChanges = (changes) => changes
59
66
  change_id: change.change_id,
60
67
  }),
61
68
  }))
62
- .sort((left, right) => compareCodePoints(left.sortKey, right.sortKey) ||
69
+ .sort((left, right) => compareUnicodeCodePoints(left.sortKey, right.sortKey) ||
63
70
  left.index - right.index)
64
71
  .map(({ change }) => change);
65
72
  const comparisonCoverage = (context) => {
@@ -1,6 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
- /** Canonically encode one export-shape comparison value. */
3
+ /**
4
+ * Canonically encode one export-shape comparison value.
5
+ *
6
+ * Comparison identifiers hash the full result semantics, including each
7
+ * change's presence object and the per-variant property inventories.
8
+ */
4
9
  export const canonicalExportShapeValue = (value) => {
5
10
  const encoded = canonicalize(value);
6
11
  if (encoded === undefined)
@@ -5,7 +5,6 @@ const evidenceIdSchema = prefixedDigestSchema("ev");
5
5
  const graphIdSchema = prefixedDigestSchema("jag");
6
6
  const nodeIdSchema = prefixedDigestSchema("jag_node");
7
7
  const textSchema = z.string().min(1);
8
- const selectorTextSchema = textSchema;
9
8
  const semanticPrimitiveSchema = z.union([
10
9
  z.string(),
11
10
  z.number().finite(),
@@ -49,25 +48,38 @@ const sourceRangeSchema = z
49
48
  message: "Source range end must not precede its start",
50
49
  });
51
50
  });
52
- /** Two authenticated application graphs and exact export selectors. */
53
- export const compareJavaScriptExportShapesInputSchema = z
54
- .strictObject({
55
- left: evidenceSchema,
56
- right: evidenceSchema,
57
- left_module_path: selectorTextSchema,
58
- left_export_name: selectorTextSchema,
59
- right_module_path: selectorTextSchema,
60
- right_export_name: selectorTextSchema,
61
- })
62
- .superRefine((input, context) => {
51
+ /** Check that export-shape comparisons bind distinct source Evidence. */
52
+ const validateJavaScriptExportShapeIdentities = (input, context) => {
63
53
  if (input.left.evidence_id === input.right.evidence_id)
64
54
  context.addIssue({
65
55
  code: "custom",
66
56
  path: ["right"],
67
57
  message: "JavaScript export shape Evidence must be distinct",
68
58
  });
69
- });
70
- const projectedReturnFieldShape = { path: jsonPointerSchema };
59
+ };
60
+ const evidenceIdentitySchema = z.object({ evidence_id: evidenceIdSchema });
61
+ /** Validate export-shape identities without capturing complete source graphs. */
62
+ export const javaScriptExportShapeIdentitiesSchema = z
63
+ .object({
64
+ left: evidenceIdentitySchema,
65
+ right: evidenceIdentitySchema,
66
+ })
67
+ .superRefine(validateJavaScriptExportShapeIdentities);
68
+ /** Two authenticated application graphs and exact export selectors. */
69
+ export const compareJavaScriptExportShapesInputSchema = z
70
+ .strictObject({
71
+ left: evidenceSchema,
72
+ right: evidenceSchema,
73
+ left_module_path: textSchema,
74
+ left_export_name: textSchema,
75
+ right_module_path: textSchema,
76
+ right_export_name: textSchema,
77
+ })
78
+ .superRefine(validateJavaScriptExportShapeIdentities);
79
+ const projectedReturnFieldShape = {
80
+ path: jsonPointerSchema,
81
+ presence: z.enum(["present", "absent", "unknown-coverage"]),
82
+ };
71
83
  const projectedReturnFieldSchema = z.discriminatedUnion("state", [
72
84
  z.strictObject({
73
85
  ...projectedReturnFieldShape,
@@ -135,8 +147,8 @@ const projectedReturnShapeSchema = z
135
147
  export const projectedExportReturnShapesSchema = z
136
148
  .strictObject({
137
149
  semantic_role: z.literal("export-return-shapes"),
138
- module_path: selectorTextSchema,
139
- exported_name: selectorTextSchema,
150
+ module_path: textSchema,
151
+ exported_name: textSchema,
140
152
  callable_id: textSchema,
141
153
  callable_kind: z.enum(["function", "class", "method"]),
142
154
  static_return_shapes: z.array(projectedReturnShapeSchema),
@@ -160,16 +172,16 @@ export const projectedExportReturnShapesSchema = z
160
172
  });
161
173
  const exportCandidateSchema = z.strictObject({
162
174
  node_id: nodeIdSchema,
163
- module_path: selectorTextSchema,
164
- export_name: selectorTextSchema,
175
+ module_path: textSchema,
176
+ export_name: textSchema,
165
177
  matches_requested_module: z.boolean(),
166
178
  matches_requested_export: z.boolean(),
167
179
  });
168
180
  const selectorResultShape = {
169
181
  evidence_id: evidenceIdSchema,
170
182
  graph_id: graphIdSchema,
171
- requested_module_path: selectorTextSchema,
172
- requested_export_name: selectorTextSchema,
183
+ requested_module_path: textSchema,
184
+ requested_export_name: textSchema,
173
185
  candidates: z.array(exportCandidateSchema),
174
186
  omitted_candidates: z.number().int().min(0),
175
187
  };
@@ -209,11 +221,21 @@ const discriminantSchema = z.strictObject({
209
221
  path: jsonPointerSchema,
210
222
  value: semanticPrimitiveSchema,
211
223
  });
212
- const comparisonChangeSchema = z.strictObject({
224
+ const propertyPresenceSchema = z.enum([
225
+ "present",
226
+ "absent",
227
+ "unknown-coverage",
228
+ ]);
229
+ /** One change row; presence is required even when values stay unknown. */
230
+ export const javaScriptExportShapeComparisonChangeSchema = z.strictObject({
213
231
  change_id: prefixedDigestSchema("jesc_change"),
214
232
  status: z.enum(["added", "removed", "changed", "unknown"]),
215
233
  path: jsonPointerSchema,
216
234
  discriminant: discriminantSchema.nullable(),
235
+ presence: z.strictObject({
236
+ left: propertyPresenceSchema,
237
+ right: propertyPresenceSchema,
238
+ }),
217
239
  left: valueAvailabilitySchema,
218
240
  right: valueAvailabilitySchema,
219
241
  left_source_range: sourceRangeSchema.nullable(),
@@ -221,18 +243,32 @@ const comparisonChangeSchema = z.strictObject({
221
243
  evidence_links: z.array(evidenceIdSchema).length(2),
222
244
  limitations: z.array(textSchema),
223
245
  });
246
+ const inventoryPropertyCoverageSchema = z.strictObject({
247
+ path: jsonPointerSchema,
248
+ status: z.enum(["complete", "partial"]),
249
+ });
250
+ const propertyInventorySchema = z.strictObject({
251
+ side: z.enum(["left", "right"]),
252
+ variant_index: z.number().int().nonnegative(),
253
+ discriminant: discriminantSchema.nullable(),
254
+ paired: z.boolean(),
255
+ source_range: sourceRangeSchema,
256
+ properties: z.array(jsonPointerSchema),
257
+ property_coverage: z.array(inventoryPropertyCoverageSchema),
258
+ });
224
259
  /** Static export-return comparison with explicit unknown semantics. */
225
260
  export const javaScriptExportShapeComparisonResultSchema = z.strictObject({
226
261
  comparison_id: prefixedDigestSchema("jesc"),
227
262
  left: selectorResultSchema,
228
263
  right: selectorResultSchema,
264
+ property_inventories: z.array(propertyInventorySchema),
229
265
  summary: z.strictObject({
230
266
  added: z.number().int().min(0),
231
267
  removed: z.number().int().min(0),
232
268
  changed: z.number().int().min(0),
233
269
  unknown: z.number().int().min(0),
234
270
  }),
235
- changes: z.array(comparisonChangeSchema),
271
+ changes: z.array(javaScriptExportShapeComparisonChangeSchema),
236
272
  coverage: z.strictObject({
237
273
  status: z.enum(["complete-within-inputs", "partial", "truncated"]),
238
274
  left_graph_status: z.enum([
@@ -1,5 +1,5 @@
1
1
  import { projectedExportReturnShapesSchema, } from "./javascriptExportShapeComparisonSchemas.js";
2
- import { compareCodePoints } from "../canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
3
3
  /** Select one exact trusted export and its exact static return-shape observation. */
4
4
  export const selectJavaScriptExport = (side) => {
5
5
  const candidates = exportCandidates(side.graph);
@@ -41,11 +41,11 @@ export const selectJavaScriptExport = (side) => {
41
41
  limitations: [],
42
42
  };
43
43
  };
44
- /** Retain every projected return variant. */
45
- export const retainJavaScriptExportShapes = (selection) => {
46
- const shapes = selection.projection?.static_return_shapes ?? [];
47
- return { shapes, omitted: 0 };
48
- };
44
+ /** Retain every authenticated variant with its explicit slot presence. */
45
+ export const retainJavaScriptExportShapes = (selection) => ({
46
+ shapes: selection.projection?.static_return_shapes ?? [],
47
+ omitted: 0,
48
+ });
49
49
  const selectorBase = (side, candidates) => ({
50
50
  evidence_id: side.evidenceId,
51
51
  graph_id: side.graph.graph_id,
@@ -90,7 +90,7 @@ const exportCandidates = (graph) => {
90
90
  });
91
91
  }
92
92
  }
93
- return [...candidates.values()].sort((left, right) => compareCodePoints(candidateKey(left), candidateKey(right)));
93
+ return [...candidates.values()].sort((left, right) => compareUnicodeCodePoints(candidateKey(left), candidateKey(right)));
94
94
  };
95
95
  const candidateKey = (candidate) => `${candidate.modulePath}\0${candidate.exportName}\0${candidate.node.node_id}`;
96
96
  const returnShapeFor = (node, side) => {