rea-agents 6.2.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 (297) hide show
  1. package/README.md +18 -20
  2. package/bridge/hopper_bridge.py +2 -0
  3. package/dist/android/JadxProvider.js +8 -2
  4. package/dist/android/JadxSession.js +51 -9
  5. package/dist/application/BinaryTargetResolver.js +63 -17
  6. package/dist/application/BrowserScenarioEvidence.js +2 -2
  7. package/dist/application/ClientConfigurationDocument.js +28 -0
  8. package/dist/application/ClientRegistrationStatus.js +19 -6
  9. package/dist/application/DirectAnalysis.js +12 -6
  10. package/dist/application/DirectAnalysisCleanup.js +0 -1
  11. package/dist/application/DirectAnalysisStatus.js +2 -5
  12. package/dist/application/Doctor.js +25 -34
  13. package/dist/application/DoctorDiagnostics.js +1 -1
  14. package/dist/application/EvidenceBundleFiles.js +1 -1
  15. package/dist/application/InvestigationProviders.js +4 -4
  16. package/dist/application/JsonFiles.js +15 -15
  17. package/dist/application/LinuxHopper.js +2 -1
  18. package/dist/application/ReconstructionObligationCandidates.js +9 -2
  19. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  20. package/dist/application/RegularFileRead.js +17 -0
  21. package/dist/application/Setup.js +18 -7
  22. package/dist/application/SetupClientConfiguration.js +18 -7
  23. package/dist/application/SetupHost.js +6 -4
  24. package/dist/application/SetupPlan.js +19 -15
  25. package/dist/application/SetupSkill.js +57 -8
  26. package/dist/application/SupportedClients.js +43 -0
  27. package/dist/application/Uninstall.js +18 -2
  28. package/dist/application/UpdateMaintenance.js +6 -2
  29. package/dist/application/Utf8JsonInput.js +64 -0
  30. package/dist/application/WebScriptExportService.js +13 -6
  31. package/dist/application/android/AndroidAnalysisService.js +1 -1
  32. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  33. package/dist/application/binary/BinarySession.js +16 -0
  34. package/dist/application/binary/BinarySessionOpen.js +9 -1
  35. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  36. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  37. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  38. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  39. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  40. package/dist/application/javascript/JavaScriptApplicationService.js +1 -0
  41. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  42. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +0 -6
  43. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +8 -18
  44. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +34 -26
  45. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +44 -12
  46. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +6 -3
  47. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  48. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  49. package/dist/application/javascript/JavaScriptModuleRelationships.js +5 -17
  50. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  51. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -2
  52. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  53. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  54. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  55. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +1 -1
  56. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  57. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  58. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +2 -2
  59. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +1 -1
  60. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  61. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  62. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +10 -7
  63. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  64. package/dist/application/native/NativeCallRoutes.js +2 -4
  65. package/dist/artifacts/ArtifactProvider.js +14 -16
  66. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  67. package/dist/artifacts/AsarArtifactReader.js +81 -17
  68. package/dist/artifacts/DirectoryArtifactReader.js +2 -2
  69. package/dist/artifacts/NativeDmgArtifactReader.js +152 -67
  70. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  71. package/dist/artifacts/apple/KeyedArchiveReader.js +54 -46
  72. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  73. package/dist/artifacts/extraction/ArtifactExtraction.js +29 -11
  74. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +7 -8
  75. package/dist/artifacts/inventory/classify.js +33 -14
  76. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  77. package/dist/artifacts/inventory/scanCanonical.js +28 -22
  78. package/dist/artifacts/inventory/scanReader.js +7 -11
  79. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  80. package/dist/browser/CdpBrowserProvider.js +4 -3
  81. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  82. package/dist/browser/CdpElectronInspection.js +2 -2
  83. package/dist/browser/CdpElectronProvider.js +4 -3
  84. package/dist/browser/CdpElectronScripts.js +2 -2
  85. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  86. package/dist/browser/PlaywrightBrowserScenarioProvider.js +6 -6
  87. package/dist/browser/PlaywrightScenarioBrowser.js +145 -42
  88. package/dist/browser/PlaywrightScenarioSession.js +3 -11
  89. package/dist/browser/WebSourceMapFetcher.js +32 -6
  90. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  91. package/dist/cli/coreAnalysisCommands.js +2 -2
  92. package/dist/cli/coreBinaryCommands.js +13 -9
  93. package/dist/cli/electronCommands.js +9 -10
  94. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  95. package/dist/cli/jsonOutput.js +3 -2
  96. package/dist/cli/streamedJsonOutput.js +83 -4
  97. package/dist/cli/utilityCommands.js +2 -4
  98. package/dist/cli.js +5 -2
  99. package/dist/cliJsonFile.js +179 -0
  100. package/dist/cliJsonInput.js +47 -34
  101. package/dist/cliObservationOptions.js +4 -0
  102. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  103. package/dist/composition/browserScenario.js +2 -2
  104. package/dist/composition/directAnalysis.js +2 -3
  105. package/dist/contracts/artifactComparisonExample.js +5 -5
  106. package/dist/contracts/errorSchemas.js +3 -1
  107. package/dist/contracts/functionComparisonExample.js +8 -0
  108. package/dist/contracts/inputSchemaPresentation.js +94 -3
  109. package/dist/contracts/javascript/electronToolContracts.js +2 -1
  110. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  111. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  112. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  113. package/dist/contracts/managed/managedToolContracts.js +3 -2
  114. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  115. package/dist/contracts/native/nativeToolContracts.js +1 -1
  116. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  117. package/dist/contracts/sessionStatusContract.js +3 -2
  118. package/dist/contracts/sessionToolContracts.js +3 -2
  119. package/dist/contracts/sessionToolSchemas.js +3 -2
  120. package/dist/contracts/toolOutputSchemaGroups.js +2 -2
  121. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  122. package/dist/domain/analysisErrorBase.js +5 -0
  123. package/dist/domain/analysisErrorPresentation.js +4 -2
  124. package/dist/domain/analysisSnapshot.js +3 -1
  125. package/dist/domain/analysisView/analysisView.js +1 -3
  126. package/dist/domain/android/androidPartialObservation.js +36 -0
  127. package/dist/domain/apple/dylibResolution.js +1 -1
  128. package/dist/domain/artifactComparison.js +4 -4
  129. package/dist/domain/artifactGraph.js +1 -1
  130. package/dist/domain/artifactIdentity.js +8 -8
  131. package/dist/domain/artifactInspection.js +8 -8
  132. package/dist/domain/artifactInventoryEvidence.js +5 -5
  133. package/dist/domain/browserCompleteness.js +3 -2
  134. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  135. package/dist/domain/browserScenarioNormalization.js +3 -3
  136. package/dist/domain/browserScenarioValues.js +3 -2
  137. package/dist/domain/callPath.js +8 -10
  138. package/dist/domain/canonicalDigest.js +7 -1
  139. package/dist/domain/canonicalOrdering.js +1 -13
  140. package/dist/domain/changedBehavior.js +2 -3
  141. package/dist/domain/comparisonSemantics.js +0 -5
  142. package/dist/domain/digests.js +0 -3
  143. package/dist/domain/evidence.js +10 -5
  144. package/dist/domain/evidenceBundle.js +51 -33
  145. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  146. package/dist/domain/functionComparison.js +2 -1
  147. package/dist/domain/functionComparisonNormalization.js +4 -3
  148. package/dist/domain/functionComparisonResults.js +2 -2
  149. package/dist/domain/functionDossierEvidence.js +2 -1
  150. package/dist/domain/hopperValues.js +11 -15
  151. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  152. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +2 -2
  153. package/dist/domain/javascript/electronStaticAnalysisIpc.js +9 -1
  154. package/dist/domain/javascript/electronStaticAnalysisNative.js +5 -3
  155. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  156. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  157. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  158. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  159. package/dist/domain/javascript/javascriptApplicationGraph.js +15 -13
  160. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  161. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  162. package/dist/domain/javascript/javascriptApplicationVersionItems.js +45 -34
  163. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +7 -7
  164. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  165. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  166. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  167. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  168. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  169. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  170. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  171. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  172. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  173. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  174. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -6
  175. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  176. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  177. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  178. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  179. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  180. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  181. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  182. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  183. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  184. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  185. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  186. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -6
  187. package/dist/domain/javascript/javascriptSemanticAnalysis.js +200 -8
  188. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  189. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  190. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  191. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  192. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  193. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  194. package/dist/domain/javascript/javascriptSemanticGraph.js +142 -35
  195. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  196. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  197. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  198. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +497 -113
  199. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  200. package/dist/domain/javascript/javascriptSemanticMutationValues.js +41 -27
  201. package/dist/domain/javascript/javascriptSemanticObjects.js +2 -6
  202. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  203. package/dist/domain/javascript/javascriptSemanticProjection.js +20 -14
  204. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  205. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  206. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  207. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  208. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  209. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  210. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  211. package/dist/domain/javascript/javascriptSemanticReturns.js +23 -27
  212. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  213. package/dist/domain/javascript/javascriptSemanticValues.js +135 -24
  214. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  215. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  216. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  217. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  218. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  219. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  220. package/dist/domain/jsonSerialization.js +109 -55
  221. package/dist/domain/jsonShape.js +46 -19
  222. package/dist/domain/localPath.js +10 -4
  223. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  224. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  225. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  226. package/dist/domain/native/nativeCallObservation.js +2 -4
  227. package/dist/domain/native/nativeValueFlow.js +5 -11
  228. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  229. package/dist/domain/process/processCapture.js +11 -10
  230. package/dist/domain/process/processCaptureCoverage.js +8 -5
  231. package/dist/domain/process/processCaptureExample.js +43 -0
  232. package/dist/domain/process/processCaptureValidation.js +4 -3
  233. package/dist/domain/process/processComparison.js +0 -23
  234. package/dist/domain/process/processScenario.js +3 -3
  235. package/dist/domain/process/processTraceEvaluation.js +4 -4
  236. package/dist/domain/process/processTraceSpecification.js +1 -3
  237. package/dist/domain/providerCleanupError.js +6 -2
  238. package/dist/domain/reconstructionCoverage.js +2 -1
  239. package/dist/domain/reconstructionUnknowns.js +4 -3
  240. package/dist/domain/reconstructionVerification.js +3 -2
  241. package/dist/domain/referenceSourceGraph.js +7 -7
  242. package/dist/domain/referenceSourceImportParsing.js +34 -45
  243. package/dist/domain/residualUnknown.js +3 -2
  244. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  245. package/dist/domain/swiftSymbolClassification.js +6 -1
  246. package/dist/domain/symbolAnalysis.js +17 -2
  247. package/dist/domain/unicodeCodePointOrder.js +6 -0
  248. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  249. package/dist/domain/webCaptureDiff.js +71 -29
  250. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  251. package/dist/domain/webInventory.js +3 -2
  252. package/dist/domain/webMcpDiscovery.js +4 -3
  253. package/dist/domain/webScriptExport.js +1 -1
  254. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  255. package/dist/dotnet/ManagedStaticProvider.js +10 -7
  256. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  257. package/dist/filesystem/RegularFile.js +41 -0
  258. package/dist/generatedPackageMetadata.js +1 -1
  259. package/dist/ghidra/GhidraClient.js +14 -4
  260. package/dist/ghidra/GhidraInstallation.js +111 -10
  261. package/dist/ghidra/GhidraLauncher.js +43 -19
  262. package/dist/hopper/HopperCleanup.js +1 -1
  263. package/dist/ida/IdaOperationRunner.js +2 -0
  264. package/dist/ida/IdaSessionClient.js +4 -2
  265. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  266. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  267. package/dist/inspector/V8InspectorProvider.js +60 -8
  268. package/dist/main/shutdown.js +76 -32
  269. package/dist/main/transport.js +1 -1
  270. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  271. package/dist/native/AppleObjcProperties.js +17 -7
  272. package/dist/native/LldbCallTracer.js +241 -75
  273. package/dist/native/NativeMacOSProvider.js +10 -5
  274. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  275. package/dist/process/ProcessOwnershipObservation.js +9 -13
  276. package/dist/process/capture/FilesystemSnapshot.js +88 -18
  277. package/dist/process/capture/ProcessCaptureLifecycle.js +13 -27
  278. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  279. package/dist/process/capture/ProcessHarness.js +8 -21
  280. package/dist/server/analysisAdmission.js +8 -0
  281. package/dist/server/createServer.js +22 -23
  282. package/dist/server/registerApplicationTools/compareExportShapes.js +2 -1
  283. package/dist/server/registerApplicationTools/helpers.js +3 -2
  284. package/dist/server/registerArtifactTools.js +2 -2
  285. package/dist/server/registerCloseLifecycleTool.js +6 -4
  286. package/dist/server/registerEnhancedTools.js +78 -73
  287. package/dist/server/registerEvidenceTools.js +54 -46
  288. package/dist/server/registerManagedTools.js +7 -4
  289. package/dist/server/registerOfficialTools.js +31 -25
  290. package/dist/server/registerSessionTools.js +9 -3
  291. package/native/windows/build/manifest.json +1 -1
  292. package/package.json +6 -3
  293. package/skills/reverse-engineer-anything/SKILL.md +5 -5
  294. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  295. package/dist/artifacts/inventory/policy.js +0 -2
  296. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  297. package/dist/server/registerNativeTools.js +0 -6
@@ -1,27 +1,65 @@
1
1
  import { z } from "zod";
2
- import { canonicalDigest, canonicalJson } from "../comparisonSemantics.js";
3
- import { compareCodePoints, uniqueSorted } from "../canonicalOrdering.js";
2
+ import { canonicalJson } from "../comparisonSemantics.js";
3
+ import { digestCanonicalValue } from "../canonicalDigest.js";
4
+ import { uniqueSorted } from "../canonicalOrdering.js";
5
+ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
4
6
  import { canonicalJsonDigestSteps } from "../canonicalJsonDigestSteps.js";
5
7
  import { freezeOwnedJsonSnapshotSteps } from "../immutableJson.js";
8
+ import { applicationGraphEvidenceSchema } from "./javascriptApplicationEvidenceSchemas.js";
6
9
  import { JAVASCRIPT_SEMANTIC_RELATION_FAMILIES, JAVASCRIPT_SEMANTIC_RELATION_FAMILY, javaScriptSemanticFingerprintInputSchema, javaScriptSemanticFingerprintSchema, javaScriptSemanticGraphInputSchema, javaScriptSemanticGraphRecordSchema, javaScriptSemanticNodeInputSchema, javaScriptSemanticNodeSchema, javaScriptSemanticRelationInputSchema, javaScriptSemanticRelationSchema, javaScriptSemanticUnknownInputSchema, javaScriptSemanticUnknownSchema, } from "./javascriptSemanticGraphSchemas.js";
7
10
  const normalizeEvidence = (evidence) => ({
8
11
  ...evidence,
9
12
  coverage: {
10
13
  ...evidence.coverage,
11
- limits: [...evidence.coverage.limits].sort((left, right) => compareCodePoints(canonicalJson(left, "JavaScript semantic graph"), canonicalJson(right, "JavaScript semantic graph"))),
14
+ limits: [...evidence.coverage.limits].sort((left, right) => compareUnicodeCodePoints(canonicalJson(left, "JavaScript semantic graph"), canonicalJson(right, "JavaScript semantic graph"))),
12
15
  },
13
16
  limitations: uniqueSorted(evidence.limitations),
14
17
  evidence_ids: uniqueSorted(evidence.evidence_ids),
15
18
  });
19
+ const evidenceContextId = (context) => `jsrg_evidence_${digestCanonicalValue(context, "JavaScript semantic evidence context")}`;
20
+ /** Graph-scoped owner for canonical provenance shared by semantic facts. */
21
+ export class JavaScriptSemanticEvidenceContextRegistry {
22
+ #contexts = new Map();
23
+ /** Intern normalized non-location provenance at fact construction. */
24
+ intern(evidence) {
25
+ const normalized = normalizeEvidence(evidence);
26
+ const { location, ...context } = normalized;
27
+ const contextId = evidenceContextId(context);
28
+ const row = { ...context, context_id: contextId };
29
+ const existing = this.#contexts.get(contextId);
30
+ if (existing !== undefined &&
31
+ canonicalJson(existing, "JavaScript semantic graph") !==
32
+ canonicalJson(row, "JavaScript semantic graph"))
33
+ throw new TypeError("JavaScript semantic evidence context digest collision");
34
+ this.#contexts.set(contextId, row);
35
+ return { context_id: contextId, location };
36
+ }
37
+ /** Resolve one already interned fact reference for derived evidence. */
38
+ resolve(reference) {
39
+ const context = this.#contexts.get(reference.context_id);
40
+ if (context === undefined)
41
+ throw new TypeError("Semantic evidence reference names an absent context");
42
+ const { context_id: _contextId, ...evidenceContext } = context;
43
+ return { ...evidenceContext, location: reference.location };
44
+ }
45
+ /** Return the deterministic context table owned by this graph projection. */
46
+ get contexts() {
47
+ return [...this.#contexts.values()].sort((left, right) => compareUnicodeCodePoints(left.context_id, right.context_id));
48
+ }
49
+ /** Release interned contexts after the owning graph is finalized. */
50
+ clear() {
51
+ this.#contexts.clear();
52
+ }
53
+ }
16
54
  /** Derive a semantic node ID from its kind and exact artifact identity. */
17
- export const javaScriptSemanticNodeId = (node) => `jsrg_node_${canonicalDigest({ kind: node.kind, identity: node.identity }, "JavaScript semantic graph")}`;
55
+ export const javaScriptSemanticNodeId = (node) => `jsrg_node_${digestCanonicalValue({ kind: node.kind, identity: node.identity }, "JavaScript semantic graph")}`;
18
56
  /** Normalize one semantic entity and derive its artifact-version identifier. */
19
- export const createJavaScriptSemanticGraphNode = (input) => {
57
+ export const createJavaScriptSemanticGraphNode = (input, evidenceContexts) => {
20
58
  const parsed = javaScriptSemanticNodeInputSchema.parse(input);
21
59
  const semantic = {
22
60
  ...parsed,
23
61
  application_node_ids: uniqueSorted(parsed.application_node_ids),
24
- evidence: normalizeEvidence(parsed.evidence),
62
+ evidence: evidenceContexts.intern(parsed.evidence),
25
63
  identifier_strategy: {
26
64
  strategy: "semantic-content-sha256",
27
65
  stability: "artifact-version",
@@ -33,11 +71,11 @@ export const createJavaScriptSemanticGraphNode = (input) => {
33
71
  });
34
72
  };
35
73
  /** Normalize one semantic relationship and derive its exact identifier. */
36
- export const createJavaScriptSemanticGraphRelation = (input) => {
74
+ export const createJavaScriptSemanticGraphRelation = (input, evidenceContexts) => {
37
75
  const parsed = javaScriptSemanticRelationInputSchema.parse(input);
38
76
  const semantic = {
39
77
  ...parsed,
40
- evidence: normalizeEvidence(parsed.evidence),
78
+ evidence: evidenceContexts.intern(parsed.evidence),
41
79
  identifier_strategy: {
42
80
  strategy: "semantic-content-sha256",
43
81
  stability: "relationship-exact",
@@ -45,25 +83,25 @@ export const createJavaScriptSemanticGraphRelation = (input) => {
45
83
  };
46
84
  return javaScriptSemanticRelationSchema.parse({
47
85
  ...semantic,
48
- relation_id: `jsrg_relation_${canonicalDigest(semantic, "JavaScript semantic graph")}`,
86
+ relation_id: `jsrg_relation_${digestCanonicalValue(semantic, "JavaScript semantic graph")}`,
49
87
  });
50
88
  };
51
89
  /** Normalize one unresolved semantic frontier and derive its identifier. */
52
- export const createJavaScriptSemanticGraphUnknown = (input) => {
90
+ export const createJavaScriptSemanticGraphUnknown = (input, evidenceContexts) => {
53
91
  const parsed = javaScriptSemanticUnknownInputSchema.parse(input);
54
92
  const semantic = {
55
93
  ...parsed,
56
94
  relation_kinds: uniqueSorted(parsed.relation_kinds),
57
95
  candidate_node_ids: uniqueSorted(parsed.candidate_node_ids),
58
- evidence: normalizeEvidence(parsed.evidence),
96
+ evidence: evidenceContexts.intern(parsed.evidence),
59
97
  };
60
98
  return javaScriptSemanticUnknownSchema.parse({
61
99
  ...semantic,
62
- unknown_id: `jsrg_unknown_${canonicalDigest(semantic, "JavaScript semantic graph")}`,
100
+ unknown_id: `jsrg_unknown_${digestCanonicalValue(semantic, "JavaScript semantic graph")}`,
63
101
  });
64
102
  };
65
103
  /** Normalize one function fingerprint and derive its component commitment. */
66
- export const createJavaScriptSemanticFingerprint = (input) => {
104
+ export const createJavaScriptSemanticFingerprint = (input, evidenceContexts) => {
67
105
  const parsed = javaScriptSemanticFingerprintInputSchema.parse(input);
68
106
  const semantic = {
69
107
  ...parsed,
@@ -72,13 +110,13 @@ export const createJavaScriptSemanticFingerprint = (input) => {
72
110
  effects: uniqueSorted(parsed.components.effects),
73
111
  },
74
112
  limitations: uniqueSorted(parsed.limitations),
75
- evidence: normalizeEvidence(parsed.evidence),
113
+ evidence: evidenceContexts.intern(parsed.evidence),
76
114
  };
77
- const fingerprintSha256 = canonicalDigest(semantic.components, "JavaScript semantic graph");
115
+ const fingerprintSha256 = digestCanonicalValue(semantic.components, "JavaScript semantic graph");
78
116
  return javaScriptSemanticFingerprintSchema.parse({
79
117
  ...semantic,
80
118
  fingerprint_sha256: fingerprintSha256,
81
- fingerprint_id: `jsrg_fingerprint_${canonicalDigest({
119
+ fingerprint_id: `jsrg_fingerprint_${digestCanonicalValue({
82
120
  function_node_id: semantic.function_node_id,
83
121
  algorithm: semantic.algorithm,
84
122
  fingerprint_sha256: fingerprintSha256,
@@ -87,7 +125,7 @@ export const createJavaScriptSemanticFingerprint = (input) => {
87
125
  };
88
126
  const sortedUniqueIssue = (values, path, label, context) => {
89
127
  for (let index = 1; index < values.length; index += 1) {
90
- if (compareCodePoints(values[index - 1] ?? "", values[index] ?? "") < 0)
128
+ if (compareUnicodeCodePoints(values[index - 1] ?? "", values[index] ?? "") < 0)
91
129
  continue;
92
130
  context.addIssue({
93
131
  code: "custom",
@@ -159,12 +197,64 @@ function* checkCoverageSteps(graph, context) {
159
197
  }
160
198
  const checkCanonicalOrder = (graph, context) => {
161
199
  sortedUniqueIssue(graph.root_node_ids, ["root_node_ids"], "Root nodes", context);
200
+ sortedUniqueIssue(graph.evidence_contexts.map(({ context_id }) => context_id), ["evidence_contexts"], "Evidence contexts", context);
162
201
  sortedUniqueIssue(graph.nodes.map(({ node_id }) => node_id), ["nodes"], "Nodes", context);
163
202
  sortedUniqueIssue(graph.relations.map(({ relation_id }) => relation_id), ["relations"], "Relations", context);
164
203
  sortedUniqueIssue(graph.fingerprints.map(({ fingerprint_id }) => fingerprint_id), ["fingerprints"], "Fingerprints", context);
165
204
  sortedUniqueIssue(graph.unknowns.map(({ unknown_id }) => unknown_id), ["unknowns"], "Unknown frontiers", context);
166
205
  sortedUniqueIssue(graph.limitations, ["limitations"], "Limitations", context);
167
206
  };
207
+ function* checkEvidenceContextReferencesSteps(graph, context) {
208
+ const contexts = new Map(graph.evidence_contexts.map((value) => [value.context_id, value]));
209
+ const referenced = new Set();
210
+ const validateReferences = function* (entities, entityKind) {
211
+ for (const [index, { evidence }] of entities.entries()) {
212
+ if (index % 256 === 0)
213
+ yield;
214
+ referenced.add(evidence.context_id);
215
+ const evidenceContext = contexts.get(evidence.context_id);
216
+ if (evidenceContext === undefined) {
217
+ context.addIssue({
218
+ code: "custom",
219
+ path: [entityKind, index, "evidence", "context_id"],
220
+ message: "Evidence reference names an absent context",
221
+ });
222
+ continue;
223
+ }
224
+ const { context_id: _contextId, ...evidenceValue } = evidenceContext;
225
+ if (!applicationGraphEvidenceSchema.safeParse({
226
+ ...evidenceValue,
227
+ location: evidence.location,
228
+ }).success)
229
+ context.addIssue({
230
+ code: "custom",
231
+ path: [entityKind, index, "evidence"],
232
+ message: "Evidence context is incompatible with its fact location",
233
+ });
234
+ }
235
+ };
236
+ yield* validateReferences(graph.nodes, "nodes");
237
+ yield* validateReferences(graph.relations, "relations");
238
+ yield* validateReferences(graph.unknowns, "unknowns");
239
+ yield* validateReferences(graph.fingerprints, "fingerprints");
240
+ for (const [index, evidenceContext] of graph.evidence_contexts.entries()) {
241
+ if (index % 256 === 0)
242
+ yield;
243
+ const { context_id: identifier, ...value } = evidenceContext;
244
+ if (identifier !== evidenceContextId(value))
245
+ context.addIssue({
246
+ code: "custom",
247
+ path: ["evidence_contexts", index, "context_id"],
248
+ message: "Evidence context identifier is stale",
249
+ });
250
+ if (!referenced.has(identifier))
251
+ context.addIssue({
252
+ code: "custom",
253
+ path: ["evidence_contexts", index],
254
+ message: "Evidence context is not referenced by a graph fact",
255
+ });
256
+ }
257
+ }
168
258
  function* checkNodesSteps(graph, nodes, context) {
169
259
  for (const [index, node] of graph.nodes.entries()) {
170
260
  if (index % 256 === 0)
@@ -196,13 +286,14 @@ function* checkRootsSteps(graph, nodes, context) {
196
286
  });
197
287
  }
198
288
  }
199
- function* checkRelationsSteps(graph, nodes, context) {
289
+ function* checkRelationsSteps(graph, nodes, evidenceContexts, context) {
200
290
  for (const [index, relation] of graph.relations.entries()) {
201
291
  if (index % 256 === 0)
202
292
  yield;
203
293
  const { relation_id: identifier, ...semantic } = relation;
204
294
  if (identifier !==
205
- "jsrg_relation_" + canonicalDigest(semantic, "JavaScript semantic graph"))
295
+ "jsrg_relation_" +
296
+ digestCanonicalValue(semantic, "JavaScript semantic graph"))
206
297
  context.addIssue({
207
298
  code: "custom",
208
299
  path: ["relations", index, "relation_id"],
@@ -222,7 +313,7 @@ function* checkRelationsSteps(graph, nodes, context) {
222
313
  message: "Semantic relations cannot be self-referential",
223
314
  });
224
315
  if (relation.resolution === "candidate" &&
225
- relation.evidence.state === "observed")
316
+ evidenceContexts.get(relation.evidence.context_id)?.state === "observed")
226
317
  context.addIssue({
227
318
  code: "custom",
228
319
  path: ["relations", index, "evidence", "state"],
@@ -230,13 +321,14 @@ function* checkRelationsSteps(graph, nodes, context) {
230
321
  });
231
322
  }
232
323
  }
233
- function* checkUnknownsSteps(graph, nodes, context) {
324
+ function* checkUnknownsSteps(graph, nodes, evidenceContexts, context) {
234
325
  for (const [index, unknown] of graph.unknowns.entries()) {
235
326
  if (index % 256 === 0)
236
327
  yield;
237
328
  const { unknown_id: identifier, ...semantic } = unknown;
238
329
  if (identifier !==
239
- "jsrg_unknown_" + canonicalDigest(semantic, "JavaScript semantic graph"))
330
+ "jsrg_unknown_" +
331
+ digestCanonicalValue(semantic, "JavaScript semantic graph"))
240
332
  context.addIssue({
241
333
  code: "custom",
242
334
  path: ["unknowns", index, "unknown_id"],
@@ -260,7 +352,8 @@ function* checkUnknownsSteps(graph, nodes, context) {
260
352
  path: ["unknowns", index, "relation_kinds"],
261
353
  message: "Unknown relation kinds must belong to their declared family",
262
354
  });
263
- if (!["unknown", "unavailable"].includes(unknown.evidence.state))
355
+ const evidenceState = evidenceContexts.get(unknown.evidence.context_id)?.state;
356
+ if (evidenceState !== "unknown" && evidenceState !== "unavailable")
264
357
  context.addIssue({
265
358
  code: "custom",
266
359
  path: ["unknowns", index, "evidence", "state"],
@@ -289,14 +382,14 @@ function* checkFingerprintsSteps(graph, nodes, context) {
289
382
  message: "Fingerprint must name a function node",
290
383
  });
291
384
  if (fingerprint.fingerprint_sha256 !==
292
- canonicalDigest(fingerprint.components, "JavaScript semantic graph"))
385
+ digestCanonicalValue(fingerprint.components, "JavaScript semantic graph"))
293
386
  context.addIssue({
294
387
  code: "custom",
295
388
  path: ["fingerprints", index, "fingerprint_sha256"],
296
389
  message: "Fingerprint component commitment is stale",
297
390
  });
298
391
  const expectedIdentifier = "jsrg_fingerprint_" +
299
- canonicalDigest({
392
+ digestCanonicalValue({
300
393
  function_node_id: fingerprint.function_node_id,
301
394
  algorithm: fingerprint.algorithm,
302
395
  fingerprint_sha256: fingerprint.fingerprint_sha256,
@@ -318,6 +411,11 @@ function* checkFingerprintsSteps(graph, nodes, context) {
318
411
  }
319
412
  function* checkGraphContentSteps(graph, context) {
320
413
  checkCanonicalOrder(graph, context);
414
+ yield* checkEvidenceContextReferencesSteps(graph, context);
415
+ const evidenceContexts = new Map(graph.evidence_contexts.map((evidenceContext) => [
416
+ evidenceContext.context_id,
417
+ evidenceContext,
418
+ ]));
321
419
  const nodes = new Map();
322
420
  for (const [index, node] of graph.nodes.entries()) {
323
421
  if (index % 256 === 0)
@@ -326,8 +424,8 @@ function* checkGraphContentSteps(graph, context) {
326
424
  }
327
425
  yield* checkNodesSteps(graph, nodes, context);
328
426
  yield* checkRootsSteps(graph, nodes, context);
329
- yield* checkRelationsSteps(graph, nodes, context);
330
- yield* checkUnknownsSteps(graph, nodes, context);
427
+ yield* checkRelationsSteps(graph, nodes, evidenceContexts, context);
428
+ yield* checkUnknownsSteps(graph, nodes, evidenceContexts, context);
331
429
  checkUnknownReferences(graph, context);
332
430
  yield* checkFingerprintsSteps(graph, nodes, context);
333
431
  yield* checkCoverageSteps(graph, context);
@@ -348,7 +446,7 @@ const checkGraph = (graph, context) => {
348
446
  checkGraphContent(graph, context);
349
447
  const { graph_id: identifier, ...semantic } = graph;
350
448
  if (identifier !==
351
- "jsrg_" + canonicalDigest(semantic, "JavaScript semantic graph"))
449
+ "jsrg_" + digestCanonicalValue(semantic, "JavaScript semantic graph"))
352
450
  context.addIssue({
353
451
  code: "custom",
354
452
  path: ["graph_id"],
@@ -357,22 +455,31 @@ const checkGraph = (graph, context) => {
357
455
  };
358
456
  /** Strict semantic graph schema with verified canonical commitments. */
359
457
  export const javaScriptSemanticGraphSchema = javaScriptSemanticGraphRecordSchema.superRefine(checkGraph);
458
+ /** Resolve one fact's compact provenance without changing its stored shape. */
459
+ export const resolveJavaScriptSemanticEvidence = (graph, reference) => {
460
+ const context = graph.evidence_contexts.find(({ context_id }) => context_id === reference.context_id);
461
+ if (context === undefined)
462
+ throw new TypeError("Semantic evidence reference names an absent context");
463
+ const { context_id: _contextId, ...evidenceContext } = context;
464
+ return { ...evidenceContext, location: reference.location };
465
+ };
360
466
  const normalizeGraphInput = (parsed) => ({
361
467
  ...parsed,
362
468
  root_node_ids: uniqueSorted(parsed.root_node_ids),
363
- nodes: [...parsed.nodes].sort((left, right) => compareCodePoints(left.node_id, right.node_id)),
364
- relations: [...parsed.relations].sort((left, right) => compareCodePoints(left.relation_id, right.relation_id)),
365
- fingerprints: [...parsed.fingerprints].sort((left, right) => compareCodePoints(left.fingerprint_id, right.fingerprint_id)),
366
- unknowns: [...parsed.unknowns].sort((left, right) => compareCodePoints(left.unknown_id, right.unknown_id)),
469
+ evidence_contexts: [...parsed.evidence_contexts].sort((left, right) => compareUnicodeCodePoints(left.context_id, right.context_id)),
470
+ nodes: [...parsed.nodes].sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id)),
471
+ relations: [...parsed.relations].sort((left, right) => compareUnicodeCodePoints(left.relation_id, right.relation_id)),
472
+ fingerprints: [...parsed.fingerprints].sort((left, right) => compareUnicodeCodePoints(left.fingerprint_id, right.fingerprint_id)),
473
+ unknowns: [...parsed.unknowns].sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id)),
367
474
  coverage: {
368
475
  ...parsed.coverage,
369
- limits: [...parsed.coverage.limits].sort((left, right) => compareCodePoints(canonicalJson(left, "JavaScript semantic graph"), canonicalJson(right, "JavaScript semantic graph"))),
476
+ limits: [...parsed.coverage.limits].sort((left, right) => compareUnicodeCodePoints(canonicalJson(left, "JavaScript semantic graph"), canonicalJson(right, "JavaScript semantic graph"))),
370
477
  families: [...parsed.coverage.families]
371
478
  .map((family) => ({
372
479
  ...family,
373
480
  unknown_ids: uniqueSorted(family.unknown_ids),
374
481
  }))
375
- .sort((left, right) => compareCodePoints(left.family, right.family)),
482
+ .sort((left, right) => compareUnicodeCodePoints(left.family, right.family)),
376
483
  },
377
484
  limitations: uniqueSorted(parsed.limitations),
378
485
  });
@@ -384,7 +491,7 @@ export const createJavaScriptSemanticGraph = (input) => {
384
491
  // public schema still verifies arbitrary records and their commitments.
385
492
  const record = {
386
493
  ...semantic,
387
- graph_id: `jsrg_${canonicalDigest(semantic, "JavaScript semantic graph")}`,
494
+ graph_id: `jsrg_${digestCanonicalValue(semantic, "JavaScript semantic graph")}`,
388
495
  };
389
496
  const issues = [];
390
497
  checkGraphContent(record, {
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { applicationGraphEvidenceSchema } from "./javascriptApplicationEvidenceSchemas.js";
2
+ import { applicationGraphEvidenceContextSchema, applicationGraphEvidenceLocationSchema, applicationGraphEvidenceSchema, } from "./javascriptApplicationEvidenceSchemas.js";
3
3
  import { jsonValueSchema } from "../jsonValue.js";
4
4
  import { digestSchema } from "../digests.js";
5
5
  import { prefixedDigestSchema } from "../digests.js";
@@ -11,6 +11,18 @@ const semanticRelationIdSchema = z
11
11
  const semanticUnknownIdSchema = z
12
12
  .string()
13
13
  .regex(/^jsrg_unknown_[a-f0-9]{64}$/u);
14
+ const semanticEvidenceContextIdSchema = z
15
+ .string()
16
+ .regex(/^jsrg_evidence_[a-f0-9]{64}$/u);
17
+ /** One canonical owner for provenance shared by semantic graph facts. */
18
+ export const javaScriptSemanticEvidenceContextSchema = applicationGraphEvidenceContextSchema.extend({
19
+ context_id: semanticEvidenceContextIdSchema,
20
+ });
21
+ /** Location-specific reference to one exact graph-level evidence context. */
22
+ export const javaScriptSemanticEvidenceReferenceSchema = z.strictObject({
23
+ context_id: semanticEvidenceContextIdSchema,
24
+ location: applicationGraphEvidenceLocationSchema,
25
+ });
14
26
  /** Semantic entity kinds admitted by JavaScript Semantic Relation Graph. */
15
27
  export const JAVASCRIPT_SEMANTIC_NODE_KINDS = [
16
28
  "module",
@@ -188,6 +200,7 @@ export const javaScriptSemanticNodeInputSchema = z.strictObject({
188
200
  });
189
201
  /** One exact, artifact-version semantic entity. */
190
202
  export const javaScriptSemanticNodeSchema = javaScriptSemanticNodeInputSchema.extend({
203
+ evidence: javaScriptSemanticEvidenceReferenceSchema,
191
204
  node_id: semanticNodeIdSchema,
192
205
  identifier_strategy: z.strictObject({
193
206
  strategy: z.literal("semantic-content-sha256"),
@@ -205,6 +218,7 @@ export const javaScriptSemanticRelationInputSchema = z.strictObject({
205
218
  });
206
219
  /** One canonical directed semantic relationship. */
207
220
  export const javaScriptSemanticRelationSchema = javaScriptSemanticRelationInputSchema.extend({
221
+ evidence: javaScriptSemanticEvidenceReferenceSchema,
208
222
  relation_id: semanticRelationIdSchema,
209
223
  identifier_strategy: z.strictObject({
210
224
  strategy: z.literal("semantic-content-sha256"),
@@ -222,6 +236,7 @@ export const JAVASCRIPT_SEMANTIC_UNKNOWN_REASONS = [
222
236
  "incomplete-module",
223
237
  "missing-source",
224
238
  "resource-limit",
239
+ "unknown-value",
225
240
  "unsupported-syntax",
226
241
  ];
227
242
  /** One unresolved semantic frontier before its ID is derived. */
@@ -236,6 +251,7 @@ export const javaScriptSemanticUnknownInputSchema = z.strictObject({
236
251
  });
237
252
  /** One canonical unresolved semantic frontier. */
238
253
  export const javaScriptSemanticUnknownSchema = javaScriptSemanticUnknownInputSchema.extend({
254
+ evidence: javaScriptSemanticEvidenceReferenceSchema,
239
255
  unknown_id: semanticUnknownIdSchema,
240
256
  });
241
257
  const fingerprintComponentsSchema = z.strictObject({
@@ -265,6 +281,7 @@ export const javaScriptSemanticFingerprintInputSchema = z.strictObject({
265
281
  });
266
282
  /** One canonical function fingerprint record. */
267
283
  export const javaScriptSemanticFingerprintSchema = javaScriptSemanticFingerprintInputSchema.extend({
284
+ evidence: javaScriptSemanticEvidenceReferenceSchema,
268
285
  fingerprint_id: prefixedDigestSchema("jsrg_fingerprint"),
269
286
  fingerprint_sha256: digestSchema,
270
287
  });
@@ -293,6 +310,7 @@ export const javaScriptSemanticGraphInputSchema = z.strictObject({
293
310
  root_artifact_sha256: digestSchema,
294
311
  application_graph_id: prefixedDigestSchema("jag"),
295
312
  root_node_ids: z.array(semanticNodeIdSchema).min(1),
313
+ evidence_contexts: z.array(javaScriptSemanticEvidenceContextSchema),
296
314
  nodes: z.array(javaScriptSemanticNodeSchema).min(1),
297
315
  relations: z.array(javaScriptSemanticRelationSchema),
298
316
  fingerprints: z.array(javaScriptSemanticFingerprintSchema),
@@ -1,7 +1,3 @@
1
- /** Find the innermost resolved reference at one source coordinate. */
2
- export const semanticReferenceAt = (ir, line, column) => ir.references.find(({ location }) => location.start.line === line && location.start.column === column);
3
- /** Read one binding by its deterministic semantic identifier. */
4
- export const semanticBinding = (ir, bindingId) => ir.bindings.find(({ bindingId: candidate }) => candidate === bindingId);
5
1
  /** Fail-closed result when Babel cannot produce an inert syntax tree. */
6
2
  export const failedJavaScriptSemanticIr = () => ({
7
3
  schema: "JavaScriptSemanticIR",
@@ -0,0 +1,106 @@
1
+ import * as t from "@babel/types";
2
+ import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
3
+ import { semanticArrayIndex } from "./javascriptSemanticPropertyPaths.js";
4
+ const add = (sources, source, mutation, guards) => {
5
+ sources.push({
6
+ node: source.node,
7
+ projection: source.projection,
8
+ mutation,
9
+ ...guards,
10
+ });
11
+ };
12
+ const project = (source, key) => {
13
+ if (source === undefined)
14
+ return undefined;
15
+ const index = key === null ? null : semanticArrayIndex(key);
16
+ return {
17
+ node: source.node,
18
+ projection: [
19
+ ...source.projection,
20
+ source.restStartIndex !== undefined && index !== null
21
+ ? source.restStartIndex + index
22
+ : key,
23
+ ],
24
+ };
25
+ };
26
+ const visit = (context, pattern, source, guards = {}) => {
27
+ const { sources, mutation } = context;
28
+ if (t.isTSParameterProperty(pattern)) {
29
+ visit(context, pattern.parameter, source, guards);
30
+ return;
31
+ }
32
+ if (t.isAssignmentPattern(pattern)) {
33
+ visit(context, pattern.left, source, {
34
+ ...guards,
35
+ requiredSources: [
36
+ ...(guards.requiredSources ?? []),
37
+ ...(source === undefined ? [] : [source]),
38
+ ],
39
+ });
40
+ visit(context, pattern.left, { node: pattern.right, projection: [] }, {
41
+ ...guards,
42
+ fallbackSources: [
43
+ ...(guards.fallbackSources ?? []),
44
+ ...(source === undefined ? [] : [source]),
45
+ ],
46
+ });
47
+ return;
48
+ }
49
+ if (t.isObjectPattern(pattern)) {
50
+ for (const property of pattern.properties) {
51
+ // Object rest creates a fresh object and has no iterable binding pattern.
52
+ if (t.isRestElement(property))
53
+ continue;
54
+ visit(context, property.value, project(source, semanticStaticPropertyKey(property.key, property.computed)), guards);
55
+ }
56
+ return;
57
+ }
58
+ if (t.isArrayPattern(pattern)) {
59
+ if (source !== undefined && source.restStartIndex === undefined)
60
+ add(sources, source, mutation, guards);
61
+ pattern.elements.forEach((element, index) => {
62
+ if (element === null)
63
+ return;
64
+ if (t.isRestElement(element))
65
+ visit(context, element.argument, source === undefined
66
+ ? undefined
67
+ : {
68
+ node: source.node,
69
+ projection: source.projection,
70
+ restStartIndex: (source.restStartIndex ?? 0) + index,
71
+ }, guards);
72
+ else
73
+ visit(context, element, project(source, index), guards);
74
+ });
75
+ return;
76
+ }
77
+ if (t.isRestElement(pattern))
78
+ visit(context, pattern.argument, undefined, guards);
79
+ };
80
+ /** Describe implicit iteration sources without deciding their runtime values. */
81
+ export const semanticIterationSources = (node, parent) => {
82
+ const sources = [];
83
+ const context = { sources, mutation: node };
84
+ if (t.isVariableDeclarator(node) && node.init != null)
85
+ visit(context, node.id, { node: node.init, projection: [] });
86
+ else if (t.isAssignmentExpression(node) && node.operator === "=")
87
+ visit(context, node.left, { node: node.right, projection: [] });
88
+ else if (t.isForOfStatement(node)) {
89
+ add(sources, { node: node.right, projection: [] }, node, {});
90
+ const source = { node: node.right, projection: [null] };
91
+ if (t.isVariableDeclaration(node.left)) {
92
+ for (const declaration of node.left.declarations)
93
+ visit(context, declaration.id, source);
94
+ }
95
+ else
96
+ visit(context, node.left, source);
97
+ }
98
+ else if (t.isSpreadElement(node) && t.isArrayExpression(parent))
99
+ add(sources, { node: node.argument, projection: [] }, node, {});
100
+ else if (t.isYieldExpression(node) && node.delegate && node.argument != null)
101
+ add(sources, { node: node.argument, projection: [] }, node, {});
102
+ else if (t.isFunction(node))
103
+ for (const parameter of node.params)
104
+ visit(context, parameter, undefined);
105
+ return sources;
106
+ };