rea-agents 2.0.0 → 2.2.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 (273) hide show
  1. package/README.md +103 -38
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/AndroidApplicationService.js +17 -0
  4. package/dist/application/AppleApplicationService.js +17 -0
  5. package/dist/application/ArtifactExtraction.js +1 -1
  6. package/dist/application/ArtifactInventory/classify.js +42 -0
  7. package/dist/application/ArtifactInventory/hash.js +43 -0
  8. package/dist/application/ArtifactInventory/reader.js +41 -0
  9. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  10. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  11. package/dist/application/ArtifactInventory/types.js +10 -0
  12. package/dist/application/ArtifactInventory.js +9 -351
  13. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  14. package/dist/application/BinarySession.js +47 -270
  15. package/dist/application/BinarySessionExecution.js +28 -0
  16. package/dist/application/BinarySessionOpen.js +39 -0
  17. package/dist/application/BinarySessionRecords.js +149 -0
  18. package/dist/application/BinarySessionStatus.js +75 -0
  19. package/dist/application/CapabilityInventory.js +24 -2
  20. package/dist/application/ClientRegistrationStatus.js +11 -4
  21. package/dist/application/CrossVersionInventory.js +8 -2
  22. package/dist/application/CrossVersionInvestigation.js +1 -23
  23. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  24. package/dist/application/DirectAnalysis.js +47 -44
  25. package/dist/application/Doctor.js +156 -238
  26. package/dist/application/DoctorDiagnostics.js +180 -0
  27. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  28. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  29. package/dist/application/EnhancedToolPagination.js +22 -0
  30. package/dist/application/EnhancedToolTypes.js +4 -0
  31. package/dist/application/EnhancedTools.js +20 -37
  32. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  33. package/dist/application/InventoryProjectionEvidence.js +41 -0
  34. package/dist/application/InvestigationProviders.js +12 -0
  35. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  36. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  37. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  38. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  39. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  40. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  41. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  42. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  43. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  44. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  45. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  46. package/dist/application/JavaScriptJsonModules.js +39 -0
  47. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  48. package/dist/application/JavaScriptReplayPermission.js +16 -0
  49. package/dist/application/JavaScriptReplayService.js +182 -156
  50. package/dist/application/LinuxHopper.js +10 -0
  51. package/dist/application/MacHopper.js +22 -11
  52. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  53. package/dist/application/PermissionAuthority.js +106 -63
  54. package/dist/application/ProcessCaptureCapability.js +1 -1
  55. package/dist/application/ProcessCapturePermission.js +13 -0
  56. package/dist/application/ProcessCli.js +2 -12
  57. package/dist/application/ProcessHarness.js +1 -1
  58. package/dist/application/ProcessPairedExperiment.js +72 -0
  59. package/dist/application/ProjectPermissionStore.js +48 -9
  60. package/dist/application/RealHopperAssertions.js +76 -0
  61. package/dist/application/ReconstructionCoverageService.js +69 -0
  62. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  63. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  64. package/dist/application/Setup.js +148 -260
  65. package/dist/application/SetupClientConfiguration.js +224 -0
  66. package/dist/application/SetupClients.js +24 -2
  67. package/dist/application/SetupPlan.js +124 -12
  68. package/dist/application/SetupSkill.js +54 -36
  69. package/dist/application/SupportedClients.js +1 -0
  70. package/dist/application/Uninstall.js +12 -3
  71. package/dist/application/Upgrade.js +16 -1
  72. package/dist/application/WindowsCapabilities.js +86 -0
  73. package/dist/artifacts/AsarArtifactReader.js +11 -0
  74. package/dist/browser/BrowserProcessStartup.js +88 -0
  75. package/dist/browser/CdpCaptureDocuments.js +12 -8
  76. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  77. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  78. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  79. package/dist/browser/CdpCaptureEventState.js +1 -0
  80. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  81. package/dist/browser/CdpCaptureEvents.js +29 -496
  82. package/dist/browser/CdpObservationSession.js +51 -8
  83. package/dist/browser/CdpPageCapture.js +12 -133
  84. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  85. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  86. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  87. package/dist/browser/PngVisualDiff.js +9 -2
  88. package/dist/catalogIdentity.js +4 -0
  89. package/dist/cli/artifactCommands.js +82 -0
  90. package/dist/cli/coreAnalysisCommands.js +232 -0
  91. package/dist/cli/managedCommands.js +397 -0
  92. package/dist/cli/managedProjectGraphCommand.js +24 -0
  93. package/dist/cli/options.js +9 -0
  94. package/dist/cli/setupCommands.js +113 -0
  95. package/dist/cli/types.js +1 -0
  96. package/dist/cli/utilityCommands.js +122 -0
  97. package/dist/cli.js +10 -768
  98. package/dist/cliApplicationCommands.js +118 -4
  99. package/dist/cliBrowserAdvancedCommands.js +73 -16
  100. package/dist/cliBrowserCommands.js +39 -115
  101. package/dist/cliCommandNames.js +4 -0
  102. package/dist/cliElectronCommands.js +33 -62
  103. package/dist/cliEvidenceCommands.js +13 -2
  104. package/dist/cliInvestigationCommands.js +53 -10
  105. package/dist/cliObservationOptions.js +137 -0
  106. package/dist/cliPolicyCommands.js +80 -46
  107. package/dist/cliSetup.js +306 -0
  108. package/dist/config/environment.js +107 -0
  109. package/dist/config/parseConfig.js +228 -0
  110. package/dist/config/parsers.js +68 -0
  111. package/dist/config/permissions.js +30 -0
  112. package/dist/config/types.js +1 -0
  113. package/dist/config.js +1 -375
  114. package/dist/contracts/applicationToolContracts.js +134 -0
  115. package/dist/contracts/electronToolContracts.js +51 -3
  116. package/dist/contracts/managedToolContracts.js +8 -3
  117. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  118. package/dist/contracts/providerSelection.js +2 -0
  119. package/dist/contracts/sessionStatusContract.js +26 -0
  120. package/dist/contracts/toolContractTypes.js +12 -1
  121. package/dist/contracts/toolContracts.js +5 -12
  122. package/dist/contracts/toolEffects.js +14 -0
  123. package/dist/contracts/toolOutputSchemaGroups.js +274 -0
  124. package/dist/contracts/toolOutputSchemaPrimitives.js +328 -0
  125. package/dist/contracts/toolOutputSchemas.js +2 -550
  126. package/dist/domain/analysisErrorPresentation.js +234 -0
  127. package/dist/domain/analysisErrorProjection.js +284 -0
  128. package/dist/domain/androidApplication.js +206 -0
  129. package/dist/domain/appleApplication.js +221 -0
  130. package/dist/domain/artifactComparison.js +34 -15
  131. package/dist/domain/binaryTarget.js +87 -37
  132. package/dist/domain/boundedCartesianProjection.js +15 -0
  133. package/dist/domain/browserObservation.js +1 -285
  134. package/dist/domain/browserObservationSchemas.js +286 -0
  135. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  136. package/dist/domain/errors.js +4 -486
  137. package/dist/domain/functionComparison.js +4 -165
  138. package/dist/domain/functionComparisonDimensions.js +164 -0
  139. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  140. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  141. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  142. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  143. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  144. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  145. package/dist/domain/javascriptSemanticIr.js +30 -0
  146. package/dist/domain/javascriptSemanticProjection.js +366 -0
  147. package/dist/domain/javascriptSemanticState.js +40 -0
  148. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  149. package/dist/domain/javascriptSemanticValues.js +352 -0
  150. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  151. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  152. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  153. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  154. package/dist/domain/knownPageCoverage.js +21 -0
  155. package/dist/domain/managedApplicationGraph.js +14 -364
  156. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  157. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  158. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  159. package/dist/domain/managedArtifact.js +16 -8
  160. package/dist/domain/managedMemberComparison.js +37 -391
  161. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  162. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  163. package/dist/domain/managedNativeVerification.js +27 -389
  164. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  165. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  166. package/dist/domain/managedReconstruction.js +82 -69
  167. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  168. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  169. package/dist/domain/permissionPolicy.js +2 -0
  170. package/dist/domain/processComparison.js +19 -0
  171. package/dist/domain/processPairedExperiment.js +128 -0
  172. package/dist/domain/reconstructionCoverage.js +387 -0
  173. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  174. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  175. package/dist/domain/replayMachine.js +316 -0
  176. package/dist/domain/replayMachineRuntime.js +215 -0
  177. package/dist/domain/runtimeCharacterization.js +85 -0
  178. package/dist/domain/runtimeIdentification.js +210 -0
  179. package/dist/domain/webBundleAnalyzer.js +3 -409
  180. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  181. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  182. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  183. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  184. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  185. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  186. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  187. package/dist/dotnet/ManagedMemberRows.js +120 -0
  188. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  189. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  190. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  191. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  192. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  193. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  194. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  195. package/dist/dotnet/ManagedPeReader.js +59 -28
  196. package/dist/evaluation/CodexAgentEval.js +132 -0
  197. package/dist/generatedPackageMetadata.js +2 -2
  198. package/dist/ghidra/GhidraClient.js +76 -91
  199. package/dist/ghidra/GhidraClientStartup.js +29 -0
  200. package/dist/ghidra/GhidraClientWire.js +34 -0
  201. package/dist/ghidra/GhidraDefaults.js +1 -1
  202. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  203. package/dist/ghidra/GhidraInstallation.js +20 -15
  204. package/dist/ghidra/GhidraLauncher.js +93 -29
  205. package/dist/ghidra/GhidraProvider.js +61 -161
  206. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  207. package/dist/ghidra/GhidraSessionValues.js +2 -0
  208. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  209. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  210. package/dist/ghidra/GhidraTransport.js +71 -0
  211. package/dist/identity.js +4 -2
  212. package/dist/main/messages.js +5 -0
  213. package/dist/main/reload.js +49 -0
  214. package/dist/main/shutdown.js +25 -0
  215. package/dist/main/startup.js +14 -0
  216. package/dist/main/state.js +26 -0
  217. package/dist/main/transport.js +61 -0
  218. package/dist/main/types.js +1 -0
  219. package/dist/main.js +35 -146
  220. package/dist/process/PrivateRuntimeRoot.js +3 -2
  221. package/dist/process/ProcessOwnership.js +35 -0
  222. package/dist/process/ProviderProcess.js +2 -0
  223. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  224. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  225. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  226. package/dist/replay/ReplayOutcome.js +95 -0
  227. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  228. package/dist/server/ProcessCaptureElicitation.js +157 -0
  229. package/dist/server/createServer.js +124 -56
  230. package/dist/server/javascriptApplicationResult.js +85 -0
  231. package/dist/server/registerApplicationTools/characterization.js +57 -0
  232. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  233. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  234. package/dist/server/registerApplicationTools/coverage.js +84 -0
  235. package/dist/server/registerApplicationTools/helpers.js +42 -0
  236. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  237. package/dist/server/registerApplicationTools/types.js +1 -0
  238. package/dist/server/registerApplicationTools.js +10 -112
  239. package/dist/server/registerBrowserTools.js +59 -83
  240. package/dist/server/registerElectronTools.js +48 -49
  241. package/dist/server/registerEnhancedTools.js +34 -42
  242. package/dist/server/registerEvidenceResources.js +56 -0
  243. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  244. package/dist/server/registerInvestigationTools/types.js +1 -0
  245. package/dist/server/registerInvestigationTools.js +83 -116
  246. package/dist/server/registerJavaScriptApplicationGraphResource.js +69 -0
  247. package/dist/server/registerManagedTools.js +18 -1
  248. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  249. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  250. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  251. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  252. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  253. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  254. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  255. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  256. package/dist/server/registerManagedWorkflowTools.js +10 -274
  257. package/dist/server/registerOfficialTools.js +73 -59
  258. package/dist/server/registerSessionRecordTools.js +137 -0
  259. package/dist/server/registerSessionStatusTool.js +97 -26
  260. package/dist/server/registerSessionTools.js +60 -164
  261. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  262. package/dist/server/toolRegistrationOptions.js +101 -3
  263. package/dist/server/toolResult.js +15 -4
  264. package/package.json +11 -11
  265. package/skills/reverse-engineer-anything/SKILL.md +76 -0
  266. package/skills/reverse-engineer-anything/references/controlled-replay.md +12 -0
  267. package/skills/reverse-engineer-anything/references/evidence-workflows.md +33 -0
  268. package/skills/reverse-engineer-anything/references/javascript-applications.md +25 -0
  269. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +36 -0
  270. package/skills/reverse-engineer-anything/references/runtime-observation.md +24 -0
  271. package/scripts/prepare-node-pty.mjs +0 -35
  272. package/scripts/rebuild-native.mjs +0 -22
  273. package/skills/rea-analysis/SKILL.md +0 -222
@@ -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
+ };