rea-agents 2.0.0 → 2.1.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 (246) hide show
  1. package/README.md +78 -32
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/ArtifactExtraction.js +1 -1
  4. package/dist/application/ArtifactInventory/classify.js +42 -0
  5. package/dist/application/ArtifactInventory/hash.js +43 -0
  6. package/dist/application/ArtifactInventory/reader.js +41 -0
  7. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  8. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  9. package/dist/application/ArtifactInventory/types.js +10 -0
  10. package/dist/application/ArtifactInventory.js +9 -351
  11. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  12. package/dist/application/BinarySession.js +47 -270
  13. package/dist/application/BinarySessionExecution.js +28 -0
  14. package/dist/application/BinarySessionOpen.js +39 -0
  15. package/dist/application/BinarySessionRecords.js +149 -0
  16. package/dist/application/BinarySessionStatus.js +75 -0
  17. package/dist/application/CapabilityInventory.js +24 -2
  18. package/dist/application/ClientRegistrationStatus.js +1 -1
  19. package/dist/application/CrossVersionInventory.js +8 -2
  20. package/dist/application/CrossVersionInvestigation.js +1 -23
  21. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  22. package/dist/application/DirectAnalysis.js +47 -44
  23. package/dist/application/Doctor.js +156 -238
  24. package/dist/application/DoctorDiagnostics.js +180 -0
  25. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  26. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  27. package/dist/application/EnhancedToolPagination.js +22 -0
  28. package/dist/application/EnhancedToolTypes.js +4 -0
  29. package/dist/application/EnhancedTools.js +20 -37
  30. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  31. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  32. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  33. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  34. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  35. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  36. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  37. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  38. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  39. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  40. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  41. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  42. package/dist/application/JavaScriptJsonModules.js +39 -0
  43. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  44. package/dist/application/JavaScriptReplayPermission.js +16 -0
  45. package/dist/application/JavaScriptReplayService.js +182 -156
  46. package/dist/application/LinuxHopper.js +10 -0
  47. package/dist/application/MacHopper.js +22 -11
  48. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  49. package/dist/application/PermissionAuthority.js +106 -63
  50. package/dist/application/ProcessCaptureCapability.js +1 -1
  51. package/dist/application/ProcessCapturePermission.js +13 -0
  52. package/dist/application/ProcessCli.js +2 -12
  53. package/dist/application/ProcessHarness.js +1 -1
  54. package/dist/application/ProjectPermissionStore.js +48 -9
  55. package/dist/application/RealHopperAssertions.js +76 -0
  56. package/dist/application/ReconstructionCoverageService.js +69 -0
  57. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  58. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  59. package/dist/application/Setup.js +147 -259
  60. package/dist/application/SetupClientConfiguration.js +220 -0
  61. package/dist/application/SetupClients.js +24 -2
  62. package/dist/application/SetupPlan.js +123 -12
  63. package/dist/application/SetupSkill.js +26 -12
  64. package/dist/application/SupportedClients.js +1 -0
  65. package/dist/application/Uninstall.js +6 -3
  66. package/dist/application/WindowsCapabilities.js +86 -0
  67. package/dist/artifacts/AsarArtifactReader.js +11 -0
  68. package/dist/browser/BrowserProcessStartup.js +88 -0
  69. package/dist/browser/CdpCaptureDocuments.js +12 -8
  70. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  71. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  72. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  73. package/dist/browser/CdpCaptureEventState.js +1 -0
  74. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  75. package/dist/browser/CdpCaptureEvents.js +29 -496
  76. package/dist/browser/CdpObservationSession.js +51 -8
  77. package/dist/browser/CdpPageCapture.js +12 -133
  78. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  79. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  80. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  81. package/dist/browser/PngVisualDiff.js +9 -2
  82. package/dist/catalogIdentity.js +4 -0
  83. package/dist/cli/artifactCommands.js +82 -0
  84. package/dist/cli/coreAnalysisCommands.js +232 -0
  85. package/dist/cli/managedCommands.js +397 -0
  86. package/dist/cli/managedProjectGraphCommand.js +24 -0
  87. package/dist/cli/options.js +9 -0
  88. package/dist/cli/setupCommands.js +108 -0
  89. package/dist/cli/types.js +1 -0
  90. package/dist/cli/utilityCommands.js +122 -0
  91. package/dist/cli.js +10 -768
  92. package/dist/cliApplicationCommands.js +118 -4
  93. package/dist/cliBrowserAdvancedCommands.js +73 -16
  94. package/dist/cliBrowserCommands.js +39 -115
  95. package/dist/cliCommandNames.js +4 -0
  96. package/dist/cliElectronCommands.js +33 -62
  97. package/dist/cliEvidenceCommands.js +13 -2
  98. package/dist/cliInvestigationCommands.js +53 -10
  99. package/dist/cliObservationOptions.js +137 -0
  100. package/dist/cliPolicyCommands.js +80 -46
  101. package/dist/cliSetup.js +289 -0
  102. package/dist/config/environment.js +107 -0
  103. package/dist/config/parseConfig.js +228 -0
  104. package/dist/config/parsers.js +68 -0
  105. package/dist/config/permissions.js +30 -0
  106. package/dist/config/types.js +1 -0
  107. package/dist/config.js +1 -375
  108. package/dist/contracts/applicationToolContracts.js +134 -0
  109. package/dist/contracts/managedToolContracts.js +1 -1
  110. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  111. package/dist/contracts/providerSelection.js +2 -0
  112. package/dist/contracts/toolContracts.js +2 -2
  113. package/dist/contracts/toolEffects.js +14 -0
  114. package/dist/contracts/toolOutputSchemaGroups.js +232 -0
  115. package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
  116. package/dist/contracts/toolOutputSchemas.js +2 -550
  117. package/dist/domain/analysisErrorPresentation.js +234 -0
  118. package/dist/domain/analysisErrorProjection.js +284 -0
  119. package/dist/domain/artifactComparison.js +34 -15
  120. package/dist/domain/binaryTarget.js +87 -37
  121. package/dist/domain/browserObservation.js +1 -285
  122. package/dist/domain/browserObservationSchemas.js +286 -0
  123. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  124. package/dist/domain/errors.js +4 -486
  125. package/dist/domain/functionComparison.js +4 -165
  126. package/dist/domain/functionComparisonDimensions.js +164 -0
  127. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  128. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  129. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  130. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  131. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  132. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  133. package/dist/domain/javascriptSemanticIr.js +30 -0
  134. package/dist/domain/javascriptSemanticProjection.js +366 -0
  135. package/dist/domain/javascriptSemanticState.js +40 -0
  136. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  137. package/dist/domain/javascriptSemanticValues.js +352 -0
  138. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  139. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  140. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  141. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  142. package/dist/domain/knownPageCoverage.js +21 -0
  143. package/dist/domain/managedApplicationGraph.js +14 -364
  144. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  145. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  146. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  147. package/dist/domain/managedArtifact.js +16 -8
  148. package/dist/domain/managedMemberComparison.js +37 -391
  149. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  150. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  151. package/dist/domain/managedNativeVerification.js +27 -389
  152. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  153. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  154. package/dist/domain/managedReconstruction.js +82 -69
  155. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  156. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  157. package/dist/domain/permissionPolicy.js +2 -0
  158. package/dist/domain/reconstructionCoverage.js +387 -0
  159. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  160. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  161. package/dist/domain/runtimeCharacterization.js +85 -0
  162. package/dist/domain/webBundleAnalyzer.js +3 -409
  163. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  164. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  165. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  166. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  167. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  168. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  169. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  170. package/dist/dotnet/ManagedMemberRows.js +120 -0
  171. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  172. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  173. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  174. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  175. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  176. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  177. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  178. package/dist/dotnet/ManagedPeReader.js +59 -28
  179. package/dist/generatedPackageMetadata.js +2 -2
  180. package/dist/ghidra/GhidraClient.js +76 -91
  181. package/dist/ghidra/GhidraClientStartup.js +29 -0
  182. package/dist/ghidra/GhidraClientWire.js +34 -0
  183. package/dist/ghidra/GhidraDefaults.js +1 -1
  184. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  185. package/dist/ghidra/GhidraInstallation.js +20 -15
  186. package/dist/ghidra/GhidraLauncher.js +93 -29
  187. package/dist/ghidra/GhidraProvider.js +61 -161
  188. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  189. package/dist/ghidra/GhidraSessionValues.js +2 -0
  190. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  191. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  192. package/dist/ghidra/GhidraTransport.js +71 -0
  193. package/dist/identity.js +3 -2
  194. package/dist/main/messages.js +5 -0
  195. package/dist/main/reload.js +49 -0
  196. package/dist/main/shutdown.js +25 -0
  197. package/dist/main/startup.js +14 -0
  198. package/dist/main/state.js +26 -0
  199. package/dist/main/transport.js +61 -0
  200. package/dist/main/types.js +1 -0
  201. package/dist/main.js +35 -146
  202. package/dist/process/PrivateRuntimeRoot.js +3 -2
  203. package/dist/process/ProcessOwnership.js +35 -0
  204. package/dist/process/ProviderProcess.js +2 -0
  205. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  206. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  207. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  208. package/dist/replay/ReplayOutcome.js +95 -0
  209. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  210. package/dist/server/ProcessCaptureElicitation.js +157 -0
  211. package/dist/server/createServer.js +119 -54
  212. package/dist/server/registerApplicationTools/characterization.js +57 -0
  213. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  214. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  215. package/dist/server/registerApplicationTools/coverage.js +84 -0
  216. package/dist/server/registerApplicationTools/helpers.js +42 -0
  217. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  218. package/dist/server/registerApplicationTools/types.js +1 -0
  219. package/dist/server/registerApplicationTools.js +10 -112
  220. package/dist/server/registerBrowserTools.js +59 -83
  221. package/dist/server/registerElectronTools.js +31 -46
  222. package/dist/server/registerEnhancedTools.js +34 -42
  223. package/dist/server/registerEvidenceResources.js +54 -0
  224. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  225. package/dist/server/registerInvestigationTools/types.js +1 -0
  226. package/dist/server/registerInvestigationTools.js +83 -116
  227. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  228. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  229. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  230. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  231. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  232. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  233. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  234. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  235. package/dist/server/registerManagedWorkflowTools.js +10 -274
  236. package/dist/server/registerOfficialTools.js +73 -59
  237. package/dist/server/registerSessionRecordTools.js +137 -0
  238. package/dist/server/registerSessionStatusTool.js +2 -1
  239. package/dist/server/registerSessionTools.js +60 -164
  240. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  241. package/dist/server/toolRegistrationOptions.js +101 -3
  242. package/dist/server/toolResult.js +5 -0
  243. package/package.json +10 -11
  244. package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +20 -7
  245. package/scripts/prepare-node-pty.mjs +0 -35
  246. package/scripts/rebuild-native.mjs +0 -22
@@ -0,0 +1,366 @@
1
+ import * as t from "@babel/types";
2
+ import { resolveSemanticBindingState, semanticResolutionBlocked, } from "./javascriptSemanticState.js";
3
+ import { traverseJavaScriptAst } from "./javascriptSemanticTraversal.js";
4
+ import { evaluateSemanticBinding, evaluateSemanticProvenance, } from "./javascriptSemanticValues.js";
5
+ import { compareCodePoints, propertyName, range, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
6
+ /** Retain callable identity without polluting lexical bindings. */
7
+ export const collectSemanticCallable = (input) => {
8
+ const { node, parent, containerScope, bodyScope, state } = input;
9
+ const kind = callableKind(node);
10
+ if (kind === undefined)
11
+ return;
12
+ if (state.callables.length >= state.limits.maxCallables) {
13
+ reachSemanticLimit(state, "maxCallables");
14
+ return;
15
+ }
16
+ state.callables.push({
17
+ callableId: `callable:${kind}:${String(node.start ?? -1)}:${String(node.end ?? -1)}`,
18
+ kind,
19
+ name: callableName(node, parent),
20
+ containerScopeId: containerScope.scopeId,
21
+ bodyScopeId: bodyScope === undefined || !bodyScope.bindingsComplete
22
+ ? null
23
+ : bodyScope.scopeId,
24
+ location: range(node),
25
+ });
26
+ };
27
+ /** Collect one static import/export relationship for later composition. */
28
+ export const collectSemanticModuleLink = (node, state) => {
29
+ if (t.isImportDeclaration(node))
30
+ collectImports(node, state);
31
+ else if (t.isExportAllDeclaration(node))
32
+ addModuleLink(state, {
33
+ kind: "re-export",
34
+ specifier: node.source.value,
35
+ importedName: "*",
36
+ localName: null,
37
+ exportedName: "*",
38
+ location: range(node),
39
+ });
40
+ else if (t.isExportNamedDeclaration(node))
41
+ collectNamedExports(node, state);
42
+ else if (t.isExportDefaultDeclaration(node))
43
+ addModuleLink(state, {
44
+ kind: "export",
45
+ specifier: null,
46
+ importedName: null,
47
+ localName: defaultDeclarationName(node.declaration),
48
+ exportedName: "default",
49
+ location: range(node),
50
+ });
51
+ else if (t.isVariableDeclarator(node))
52
+ collectRequireLink(node, state);
53
+ else if (t.isAssignmentExpression(node))
54
+ collectCommonJsExport(node, state);
55
+ };
56
+ /** Collect bounded lexical identifier references after definitions exist. */
57
+ export const collectSemanticReferences = (program, state) => {
58
+ const output = [];
59
+ const seen = new Set();
60
+ traverseJavaScriptAst(program, {
61
+ enter: (node, parent) => {
62
+ if (!t.isIdentifier(node) || parent === null)
63
+ return;
64
+ const role = referenceRole(node, parent);
65
+ if (role === null)
66
+ return;
67
+ const key = `${String(node.start)}:${role}:${node.name}`;
68
+ if (seen.has(key))
69
+ return;
70
+ seen.add(key);
71
+ if (output.length >= state.limits.maxReferences) {
72
+ reachSemanticLimit(state, "maxReferences");
73
+ return;
74
+ }
75
+ const binding = resolveSemanticBindingState(state, node, node.name);
76
+ const blocked = binding === undefined &&
77
+ semanticResolutionBlocked(state, node, node.name);
78
+ output.push({
79
+ name: node.name,
80
+ role,
81
+ location: range(node),
82
+ bindingId: binding?.bindingId ?? null,
83
+ resolution: binding !== undefined ? "resolved" : blocked ? "unknown" : "unbound",
84
+ });
85
+ },
86
+ });
87
+ return output;
88
+ };
89
+ /** Freeze collected scopes into deterministic IR order. */
90
+ export const immutableSemanticScopes = (state) => state.scopes.map((scope) => ({
91
+ scopeId: scope.scopeId,
92
+ parentScopeId: scope.parentScopeId,
93
+ kind: scope.kind,
94
+ location: scope.location,
95
+ bindingsComplete: scope.bindingsComplete,
96
+ bindingIds: [...scope.bindings.values()]
97
+ .map(({ bindingId }) => bindingId)
98
+ .sort(compareCodePoints),
99
+ }));
100
+ /** Evaluate and freeze bindings into deterministic IR order. */
101
+ export const immutableSemanticBindings = (state) => [...state.bindingsById.values()]
102
+ .map((binding) => ({
103
+ bindingId: binding.bindingId,
104
+ scopeId: binding.scopeId,
105
+ name: binding.name,
106
+ kind: binding.kind,
107
+ mutable: binding.mutable,
108
+ definitions: binding.definitions,
109
+ value: evaluateSemanticBinding(binding, state),
110
+ provenance: evaluateSemanticProvenance(binding, state),
111
+ }))
112
+ .sort((left, right) => compareCodePoints(left.bindingId, right.bindingId));
113
+ /** Recover a literal require origin plus an optional member chain. */
114
+ export const semanticModuleOrigin = (node, projection) => {
115
+ if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) {
116
+ const nested = t.isNode(node.object)
117
+ ? semanticModuleOrigin(node.object, projection)
118
+ : undefined;
119
+ const member = semanticStaticPropertyName(node.property, node.computed);
120
+ return nested === undefined || member === ""
121
+ ? undefined
122
+ : { ...nested, importedPath: [...nested.importedPath, member] };
123
+ }
124
+ if (!t.isCallExpression(node) ||
125
+ !t.isIdentifier(node.callee, { name: "require" }))
126
+ return undefined;
127
+ const specifier = stringValue(node.arguments[0]);
128
+ return specifier === undefined || projection.includes(null)
129
+ ? undefined
130
+ : {
131
+ specifier,
132
+ importedPath: projection.map((segment) => String(segment)),
133
+ };
134
+ };
135
+ /** Read a property only when its syntax commits an exact name. */
136
+ export const semanticStaticPropertyName = (property, computed) => computed && !t.isStringLiteral(property) && !t.isNumericLiteral(property)
137
+ ? ""
138
+ : propertyName(property);
139
+ /** Record one exact limit hit without inventing the total omitted population. */
140
+ export const reachSemanticLimit = (state, limit) => {
141
+ state.limitsReached.add(limit);
142
+ state.omittedCount += 1;
143
+ };
144
+ const callableKind = (node) => {
145
+ if (t.isClassMethod(node) ||
146
+ t.isClassPrivateMethod(node) ||
147
+ t.isObjectMethod(node))
148
+ return "method";
149
+ if (t.isFunction(node))
150
+ return "function";
151
+ if (t.isClass(node))
152
+ return "class";
153
+ return undefined;
154
+ };
155
+ const callableName = (node, parent) => {
156
+ if ((t.isFunctionDeclaration(node) ||
157
+ t.isFunctionExpression(node) ||
158
+ t.isClassDeclaration(node) ||
159
+ t.isClassExpression(node)) &&
160
+ t.isIdentifier(node.id))
161
+ return node.id.name;
162
+ if (t.isClassMethod(node) ||
163
+ t.isClassPrivateMethod(node) ||
164
+ t.isObjectMethod(node)) {
165
+ if (t.isPrivateName(node.key))
166
+ return `#${node.key.id.name}`;
167
+ return propertyName(node.key) || `[computed@${String(node.start ?? -1)}]`;
168
+ }
169
+ if (parent !== null &&
170
+ t.isVariableDeclarator(parent) &&
171
+ t.isIdentifier(parent.id))
172
+ return parent.id.name;
173
+ return null;
174
+ };
175
+ const collectImports = (node, state) => {
176
+ if (node.specifiers.length === 0)
177
+ addModuleLink(state, {
178
+ kind: "import",
179
+ specifier: node.source.value,
180
+ importedName: null,
181
+ localName: null,
182
+ exportedName: null,
183
+ location: range(node),
184
+ });
185
+ for (const specifier of node.specifiers)
186
+ addModuleLink(state, {
187
+ kind: "import",
188
+ specifier: node.source.value,
189
+ importedName: t.isImportDefaultSpecifier(specifier)
190
+ ? "default"
191
+ : t.isImportNamespaceSpecifier(specifier)
192
+ ? "*"
193
+ : propertyName(specifier.imported),
194
+ localName: specifier.local.name,
195
+ exportedName: null,
196
+ location: range(specifier),
197
+ });
198
+ };
199
+ const collectNamedExports = (node, state) => {
200
+ if (node.declaration !== null && node.declaration !== undefined)
201
+ for (const localName of declarationNames(node.declaration))
202
+ addModuleLink(state, {
203
+ kind: "export",
204
+ specifier: null,
205
+ importedName: null,
206
+ localName,
207
+ exportedName: localName,
208
+ location: range(node.declaration),
209
+ });
210
+ for (const specifier of node.specifiers)
211
+ if (t.isExportSpecifier(specifier))
212
+ addModuleLink(state, {
213
+ kind: node.source == null ? "export" : "re-export",
214
+ specifier: node.source?.value ?? null,
215
+ importedName: propertyName(specifier.local),
216
+ localName: node.source == null ? propertyName(specifier.local) : null,
217
+ exportedName: propertyName(specifier.exported),
218
+ location: range(specifier),
219
+ });
220
+ };
221
+ const collectRequireLink = (node, state) => {
222
+ const origin = semanticModuleOrigin(node.init, []);
223
+ if (origin === undefined)
224
+ return;
225
+ for (const binding of requirePatternBindings(node.id, origin.importedPath))
226
+ addModuleLink(state, {
227
+ kind: "require",
228
+ specifier: origin.specifier,
229
+ importedName: binding.importedName,
230
+ localName: binding.localName,
231
+ exportedName: null,
232
+ location: range(node),
233
+ });
234
+ };
235
+ const requirePatternBindings = (pattern, path) => {
236
+ if (t.isTSParameterProperty(pattern))
237
+ return requirePatternBindings(pattern.parameter, path);
238
+ if (t.isIdentifier(pattern))
239
+ return [{ importedName: path.at(-1) ?? "*", localName: pattern.name }];
240
+ if (t.isAssignmentPattern(pattern))
241
+ return requirePatternBindings(pattern.left, path);
242
+ if (t.isObjectPattern(pattern))
243
+ return pattern.properties.flatMap((property) => {
244
+ if (t.isRestElement(property))
245
+ return [];
246
+ const name = semanticStaticPropertyName(property.key, property.computed);
247
+ return name === ""
248
+ ? []
249
+ : requirePatternBindings(property.value, [...path, name]);
250
+ });
251
+ if (t.isArrayPattern(pattern))
252
+ return pattern.elements.flatMap((element, index) => element === null
253
+ ? []
254
+ : requirePatternBindings(element, [...path, String(index)]));
255
+ return [];
256
+ };
257
+ const collectCommonJsExport = (node, state) => {
258
+ const exportedName = commonJsExportName(node.left);
259
+ if (exportedName === undefined)
260
+ return;
261
+ const origin = semanticModuleOrigin(node.right, []);
262
+ addModuleLink(state, {
263
+ kind: "commonjs-export",
264
+ specifier: origin?.specifier ?? null,
265
+ importedName: origin?.importedPath.at(-1) ?? null,
266
+ localName: t.isIdentifier(node.right) ? node.right.name : null,
267
+ exportedName,
268
+ location: range(node),
269
+ });
270
+ };
271
+ const addModuleLink = (state, link) => {
272
+ if (state.moduleLinks.length >= state.limits.maxModuleLinks) {
273
+ reachSemanticLimit(state, "maxModuleLinks");
274
+ return;
275
+ }
276
+ state.moduleLinks.push(link);
277
+ };
278
+ const referenceRole = (node, parent) => {
279
+ if (isDeclarationIdentifier(node, parent) || isNonReferenceKey(node, parent))
280
+ return null;
281
+ if ((t.isAssignmentExpression(parent) && parent.left === node) ||
282
+ t.isUpdateExpression(parent))
283
+ return "write";
284
+ if (t.isExportSpecifier(parent) && parent.local === node)
285
+ return "export";
286
+ return "read";
287
+ };
288
+ const isDeclarationIdentifier = (node, parent) => (t.isVariableDeclarator(parent) && patternContains(parent.id, node)) ||
289
+ ((t.isFunctionDeclaration(parent) || t.isFunctionExpression(parent)) &&
290
+ parent.id === node) ||
291
+ (t.isFunction(parent) &&
292
+ parent.params.some((value) => patternContains(value, node))) ||
293
+ ((t.isClassDeclaration(parent) || t.isClassExpression(parent)) &&
294
+ parent.id === node) ||
295
+ (t.isImportSpecifier(parent) &&
296
+ (parent.local === node || parent.imported === node)) ||
297
+ (t.isImportDefaultSpecifier(parent) && parent.local === node) ||
298
+ (t.isImportNamespaceSpecifier(parent) && parent.local === node) ||
299
+ (t.isCatchClause(parent) && parent.param === node);
300
+ const isNonReferenceKey = (node, parent) => ((t.isMemberExpression(parent) || t.isOptionalMemberExpression(parent)) &&
301
+ parent.property === node &&
302
+ !parent.computed) ||
303
+ ((t.isObjectProperty(parent) || t.isObjectMethod(parent)) &&
304
+ parent.key === node &&
305
+ !parent.computed &&
306
+ !(t.isObjectProperty(parent) && parent.shorthand)) ||
307
+ (t.isExportSpecifier(parent) && parent.exported === node) ||
308
+ t.isLabeledStatement(parent) ||
309
+ t.isBreakStatement(parent) ||
310
+ t.isContinueStatement(parent);
311
+ const patternNames = (pattern) => {
312
+ if (t.isTSParameterProperty(pattern))
313
+ return patternNames(pattern.parameter);
314
+ if (t.isIdentifier(pattern))
315
+ return [pattern.name];
316
+ if (t.isAssignmentPattern(pattern))
317
+ return patternNames(pattern.left);
318
+ if (t.isRestElement(pattern))
319
+ return patternNames(pattern.argument);
320
+ if (t.isObjectPattern(pattern))
321
+ return pattern.properties.flatMap((property) => t.isRestElement(property)
322
+ ? patternNames(property.argument)
323
+ : patternNames(property.value));
324
+ if (t.isArrayPattern(pattern))
325
+ return pattern.elements.flatMap((element) => element === null ? [] : patternNames(element));
326
+ return [];
327
+ };
328
+ const patternContains = (pattern, target) => pattern === target ||
329
+ (t.isAssignmentPattern(pattern) && patternContains(pattern.left, target)) ||
330
+ (t.isRestElement(pattern) && patternContains(pattern.argument, target)) ||
331
+ (t.isObjectPattern(pattern) &&
332
+ pattern.properties.some((property) => t.isRestElement(property)
333
+ ? patternContains(property.argument, target)
334
+ : patternContains(property.value, target))) ||
335
+ (t.isArrayPattern(pattern) &&
336
+ pattern.elements.some((element) => element !== null && patternContains(element, target)));
337
+ const declarationNames = (declaration) => {
338
+ if (t.isVariableDeclaration(declaration))
339
+ return declaration.declarations.flatMap(({ id }) => patternNames(id));
340
+ if ((t.isFunctionDeclaration(declaration) ||
341
+ t.isClassDeclaration(declaration)) &&
342
+ t.isIdentifier(declaration.id))
343
+ return [declaration.id.name];
344
+ return [];
345
+ };
346
+ const defaultDeclarationName = (declaration) => (t.isFunctionDeclaration(declaration) || t.isClassDeclaration(declaration)) &&
347
+ t.isIdentifier(declaration.id)
348
+ ? declaration.id.name
349
+ : null;
350
+ const commonJsExportName = (node) => {
351
+ if (t.isIdentifier(node, { name: "exports" }))
352
+ return "default";
353
+ if (!t.isMemberExpression(node) && !t.isOptionalMemberExpression(node))
354
+ return undefined;
355
+ const name = propertyName(node.property);
356
+ if (t.isIdentifier(node.object, { name: "exports" }))
357
+ return name || "*";
358
+ if (t.isMemberExpression(node.object) &&
359
+ t.isIdentifier(node.object.object, { name: "module" }) &&
360
+ propertyName(node.object.property) === "exports")
361
+ return name || "default";
362
+ if (t.isIdentifier(node.object, { name: "module" }) &&
363
+ propertyName(node.property) === "exports")
364
+ return "default";
365
+ return undefined;
366
+ };
@@ -0,0 +1,40 @@
1
+ /** Return the active scope from a non-empty construction stack. */
2
+ export const currentSemanticScope = (stack) => {
3
+ const scope = stack.at(-1);
4
+ if (scope === undefined)
5
+ throw new TypeError("Missing semantic scope");
6
+ return scope;
7
+ };
8
+ /** Create a stable source-position identity for one lexical scope. */
9
+ export const semanticScopeId = (kind, node) => `scope:${kind}:${String(node.start ?? -1)}:${String(node.end ?? -1)}`;
10
+ /** Resolve one lexical name from the scope containing a node. */
11
+ export const resolveSemanticBindingState = (state, node, name) => {
12
+ let scope = state.scopeByNode.get(node);
13
+ while (scope !== undefined) {
14
+ const binding = scope.bindings.get(name);
15
+ if (binding !== undefined)
16
+ return binding;
17
+ if (!scope.bindingsComplete)
18
+ return undefined;
19
+ scope =
20
+ scope.parentScopeId === null
21
+ ? undefined
22
+ : state.scopesById.get(scope.parentScopeId);
23
+ }
24
+ return undefined;
25
+ };
26
+ /** Report whether an omitted binding scope blocks a trustworthy miss. */
27
+ export const semanticResolutionBlocked = (state, node, name) => {
28
+ let scope = state.scopeByNode.get(node);
29
+ while (scope !== undefined) {
30
+ if (scope.bindings.has(name))
31
+ return false;
32
+ if (!scope.bindingsComplete)
33
+ return true;
34
+ scope =
35
+ scope.parentScopeId === null
36
+ ? undefined
37
+ : state.scopesById.get(scope.parentScopeId);
38
+ }
39
+ return false;
40
+ };
@@ -0,0 +1,22 @@
1
+ import * as t from "@babel/types";
2
+ /** Visit every Babel AST node in deterministic source-tree order. */
3
+ export const traverseJavaScriptAst = (root, visitor) => {
4
+ const visit = (node, parent) => {
5
+ visitor.enter(node, parent);
6
+ for (const child of childNodes(node))
7
+ visit(child, node);
8
+ visitor.exit?.(node, parent);
9
+ };
10
+ visit(root, null);
11
+ };
12
+ const childNodes = (node) => {
13
+ const keys = t.VISITOR_KEYS[node.type] ?? [];
14
+ return keys.flatMap((key) => {
15
+ const value = Reflect.get(node, key);
16
+ if (t.isNode(value))
17
+ return [value];
18
+ if (!Array.isArray(value))
19
+ return [];
20
+ return value.filter((item) => t.isNode(item));
21
+ });
22
+ };