coalesce-transform-mcp 0.3.0 → 0.4.2

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 (279) hide show
  1. package/README.md +74 -3
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +6 -2
  4. package/dist/client.js.map +1 -1
  5. package/dist/coalesce/api/environments.d.ts +0 -12
  6. package/dist/coalesce/api/environments.d.ts.map +1 -1
  7. package/dist/coalesce/api/environments.js +0 -4
  8. package/dist/coalesce/api/environments.js.map +1 -1
  9. package/dist/coalesce/api/jobs.d.ts +3 -5
  10. package/dist/coalesce/api/jobs.d.ts.map +1 -1
  11. package/dist/coalesce/api/jobs.js +3 -6
  12. package/dist/coalesce/api/jobs.js.map +1 -1
  13. package/dist/coalesce/api/nodes.d.ts +3 -3
  14. package/dist/coalesce/api/nodes.d.ts.map +1 -1
  15. package/dist/coalesce/api/nodes.js +6 -4
  16. package/dist/coalesce/api/nodes.js.map +1 -1
  17. package/dist/coalesce/api/runs.d.ts.map +1 -1
  18. package/dist/coalesce/api/runs.js +11 -1
  19. package/dist/coalesce/api/runs.js.map +1 -1
  20. package/dist/coalesce/api/scan.d.ts +14 -0
  21. package/dist/coalesce/api/scan.d.ts.map +1 -0
  22. package/dist/coalesce/api/scan.js +64 -0
  23. package/dist/coalesce/api/scan.js.map +1 -0
  24. package/dist/coalesce/api/subgraphs.d.ts +3 -2
  25. package/dist/coalesce/api/subgraphs.d.ts.map +1 -1
  26. package/dist/coalesce/api/subgraphs.js +3 -2
  27. package/dist/coalesce/api/subgraphs.js.map +1 -1
  28. package/dist/coalesce/run-schemas.d.ts.map +1 -1
  29. package/dist/coalesce/run-schemas.js +26 -16
  30. package/dist/coalesce/run-schemas.js.map +1 -1
  31. package/dist/coalesce/tool-response.d.ts +1 -13
  32. package/dist/coalesce/tool-response.d.ts.map +1 -1
  33. package/dist/coalesce/tool-response.js +20 -6
  34. package/dist/coalesce/tool-response.js.map +1 -1
  35. package/dist/coalesce/tool-schemas.d.ts +1 -2
  36. package/dist/coalesce/tool-schemas.d.ts.map +1 -1
  37. package/dist/coalesce/tool-schemas.js +368 -5
  38. package/dist/coalesce/tool-schemas.js.map +1 -1
  39. package/dist/coalesce/types.d.ts +8 -0
  40. package/dist/coalesce/types.d.ts.map +1 -1
  41. package/dist/coalesce/types.js +3 -1
  42. package/dist/coalesce/types.js.map +1 -1
  43. package/dist/constants.d.ts +18 -0
  44. package/dist/constants.d.ts.map +1 -0
  45. package/dist/constants.js +21 -0
  46. package/dist/constants.js.map +1 -0
  47. package/dist/mcp/cache.d.ts +2 -1
  48. package/dist/mcp/cache.d.ts.map +1 -1
  49. package/dist/mcp/cache.js +122 -138
  50. package/dist/mcp/cache.js.map +1 -1
  51. package/dist/mcp/environments.d.ts +2 -1
  52. package/dist/mcp/environments.d.ts.map +1 -1
  53. package/dist/mcp/environments.js +56 -112
  54. package/dist/mcp/environments.js.map +1 -1
  55. package/dist/mcp/git-accounts.d.ts +2 -1
  56. package/dist/mcp/git-accounts.d.ts.map +1 -1
  57. package/dist/mcp/git-accounts.js +74 -96
  58. package/dist/mcp/git-accounts.js.map +1 -1
  59. package/dist/mcp/jobs.d.ts +2 -1
  60. package/dist/mcp/jobs.d.ts.map +1 -1
  61. package/dist/mcp/jobs.js +68 -122
  62. package/dist/mcp/jobs.js.map +1 -1
  63. package/dist/mcp/lineage.d.ts +5 -0
  64. package/dist/mcp/lineage.d.ts.map +1 -0
  65. package/dist/mcp/lineage.js +410 -0
  66. package/dist/mcp/lineage.js.map +1 -0
  67. package/dist/mcp/node-type-corpus.d.ts +2 -1
  68. package/dist/mcp/node-type-corpus.d.ts.map +1 -1
  69. package/dist/mcp/node-type-corpus.js +148 -151
  70. package/dist/mcp/node-type-corpus.js.map +1 -1
  71. package/dist/mcp/nodes.d.ts +2 -1
  72. package/dist/mcp/nodes.d.ts.map +1 -1
  73. package/dist/mcp/nodes.js +358 -464
  74. package/dist/mcp/nodes.js.map +1 -1
  75. package/dist/mcp/pipelines.d.ts +2 -1
  76. package/dist/mcp/pipelines.d.ts.map +1 -1
  77. package/dist/mcp/pipelines.js +514 -314
  78. package/dist/mcp/pipelines.js.map +1 -1
  79. package/dist/mcp/projects.d.ts +2 -1
  80. package/dist/mcp/projects.d.ts.map +1 -1
  81. package/dist/mcp/projects.js +66 -100
  82. package/dist/mcp/projects.js.map +1 -1
  83. package/dist/mcp/repo-node-types.d.ts +2 -1
  84. package/dist/mcp/repo-node-types.d.ts.map +1 -1
  85. package/dist/mcp/repo-node-types.js +92 -121
  86. package/dist/mcp/repo-node-types.js.map +1 -1
  87. package/dist/mcp/runs.d.ts +3 -2
  88. package/dist/mcp/runs.d.ts.map +1 -1
  89. package/dist/mcp/runs.js +93 -148
  90. package/dist/mcp/runs.js.map +1 -1
  91. package/dist/mcp/skills.d.ts +13 -0
  92. package/dist/mcp/skills.d.ts.map +1 -0
  93. package/dist/mcp/skills.js +85 -0
  94. package/dist/mcp/skills.js.map +1 -0
  95. package/dist/mcp/subgraphs.d.ts +2 -1
  96. package/dist/mcp/subgraphs.d.ts.map +1 -1
  97. package/dist/mcp/subgraphs.js +61 -98
  98. package/dist/mcp/subgraphs.js.map +1 -1
  99. package/dist/mcp/tool-helpers.d.ts +37 -0
  100. package/dist/mcp/tool-helpers.d.ts.map +1 -0
  101. package/dist/mcp/tool-helpers.js +82 -0
  102. package/dist/mcp/tool-helpers.js.map +1 -0
  103. package/dist/mcp/users.d.ts +2 -1
  104. package/dist/mcp/users.d.ts.map +1 -1
  105. package/dist/mcp/users.js +92 -145
  106. package/dist/mcp/users.js.map +1 -1
  107. package/dist/mcp/workshop.d.ts +2 -1
  108. package/dist/mcp/workshop.d.ts.map +1 -1
  109. package/dist/mcp/workshop.js +66 -101
  110. package/dist/mcp/workshop.js.map +1 -1
  111. package/dist/mcp/workspaces.d.ts +2 -1
  112. package/dist/mcp/workspaces.d.ts.map +1 -1
  113. package/dist/mcp/workspaces.js +19 -34
  114. package/dist/mcp/workspaces.js.map +1 -1
  115. package/dist/prompts/index.d.ts.map +1 -1
  116. package/dist/prompts/index.js +85 -0
  117. package/dist/prompts/index.js.map +1 -1
  118. package/dist/resources/context/pipeline-workshop-guide.md +1 -1
  119. package/dist/resources/context/tool-usage.md +7 -0
  120. package/dist/resources/index.d.ts +13 -0
  121. package/dist/resources/index.d.ts.map +1 -1
  122. package/dist/resources/index.js +105 -5
  123. package/dist/resources/index.js.map +1 -1
  124. package/dist/schemas/node-payloads.d.ts +2 -2
  125. package/dist/server.d.ts +2 -1
  126. package/dist/server.d.ts.map +1 -1
  127. package/dist/server.js +158 -41
  128. package/dist/server.js.map +1 -1
  129. package/dist/services/cache/snapshots.d.ts.map +1 -1
  130. package/dist/services/cache/snapshots.js +9 -5
  131. package/dist/services/cache/snapshots.js.map +1 -1
  132. package/dist/services/config/schema-resolver.d.ts.map +1 -1
  133. package/dist/services/config/schema-resolver.js +3 -6
  134. package/dist/services/config/schema-resolver.js.map +1 -1
  135. package/dist/services/lineage/lineage-cache.d.ts +53 -0
  136. package/dist/services/lineage/lineage-cache.d.ts.map +1 -0
  137. package/dist/services/lineage/lineage-cache.js +335 -0
  138. package/dist/services/lineage/lineage-cache.js.map +1 -0
  139. package/dist/services/lineage/lineage-documentation.d.ts +29 -0
  140. package/dist/services/lineage/lineage-documentation.d.ts.map +1 -0
  141. package/dist/services/lineage/lineage-documentation.js +80 -0
  142. package/dist/services/lineage/lineage-documentation.js.map +1 -0
  143. package/dist/services/lineage/lineage-propagation.d.ts +47 -0
  144. package/dist/services/lineage/lineage-propagation.d.ts.map +1 -0
  145. package/dist/services/lineage/lineage-propagation.js +176 -0
  146. package/dist/services/lineage/lineage-propagation.js.map +1 -0
  147. package/dist/services/lineage/lineage-search.d.ts +33 -0
  148. package/dist/services/lineage/lineage-search.d.ts.map +1 -0
  149. package/dist/services/lineage/lineage-search.js +133 -0
  150. package/dist/services/lineage/lineage-search.js.map +1 -0
  151. package/dist/services/lineage/lineage-traversal.d.ts +34 -0
  152. package/dist/services/lineage/lineage-traversal.d.ts.map +1 -0
  153. package/dist/services/lineage/lineage-traversal.js +283 -0
  154. package/dist/services/lineage/lineage-traversal.js.map +1 -0
  155. package/dist/services/pipelines/clause-extraction.d.ts +3 -0
  156. package/dist/services/pipelines/clause-extraction.d.ts.map +1 -0
  157. package/dist/services/pipelines/clause-extraction.js +27 -0
  158. package/dist/services/pipelines/clause-extraction.js.map +1 -0
  159. package/dist/services/pipelines/column-helpers.d.ts +8 -0
  160. package/dist/services/pipelines/column-helpers.d.ts.map +1 -0
  161. package/dist/services/pipelines/column-helpers.js +125 -0
  162. package/dist/services/pipelines/column-helpers.js.map +1 -0
  163. package/dist/services/pipelines/cte-parsing.d.ts +29 -0
  164. package/dist/services/pipelines/cte-parsing.d.ts.map +1 -0
  165. package/dist/services/pipelines/cte-parsing.js +160 -0
  166. package/dist/services/pipelines/cte-parsing.js.map +1 -0
  167. package/dist/services/pipelines/cte-planning.d.ts +22 -0
  168. package/dist/services/pipelines/cte-planning.d.ts.map +1 -0
  169. package/dist/services/pipelines/cte-planning.js +206 -0
  170. package/dist/services/pipelines/cte-planning.js.map +1 -0
  171. package/dist/services/pipelines/execution.d.ts.map +1 -1
  172. package/dist/services/pipelines/execution.js +0 -1
  173. package/dist/services/pipelines/execution.js.map +1 -1
  174. package/dist/services/pipelines/intent-parsing.d.ts +24 -0
  175. package/dist/services/pipelines/intent-parsing.d.ts.map +1 -0
  176. package/dist/services/pipelines/intent-parsing.js +245 -0
  177. package/dist/services/pipelines/intent-parsing.js.map +1 -0
  178. package/dist/services/pipelines/intent-resolution.d.ts +24 -0
  179. package/dist/services/pipelines/intent-resolution.d.ts.map +1 -0
  180. package/dist/services/pipelines/intent-resolution.js +141 -0
  181. package/dist/services/pipelines/intent-resolution.js.map +1 -0
  182. package/dist/services/pipelines/intent.d.ts +4 -45
  183. package/dist/services/pipelines/intent.d.ts.map +1 -1
  184. package/dist/services/pipelines/intent.js +14 -408
  185. package/dist/services/pipelines/intent.js.map +1 -1
  186. package/dist/services/pipelines/node-type-candidates.d.ts +6 -0
  187. package/dist/services/pipelines/node-type-candidates.d.ts.map +1 -0
  188. package/dist/services/pipelines/node-type-candidates.js +165 -0
  189. package/dist/services/pipelines/node-type-candidates.js.map +1 -0
  190. package/dist/services/pipelines/node-type-intent.d.ts +1 -5
  191. package/dist/services/pipelines/node-type-intent.d.ts.map +1 -1
  192. package/dist/services/pipelines/node-type-intent.js +1 -5
  193. package/dist/services/pipelines/node-type-intent.js.map +1 -1
  194. package/dist/services/pipelines/node-type-scoring.d.ts +13 -0
  195. package/dist/services/pipelines/node-type-scoring.d.ts.map +1 -0
  196. package/dist/services/pipelines/node-type-scoring.js +322 -0
  197. package/dist/services/pipelines/node-type-scoring.js.map +1 -0
  198. package/dist/services/pipelines/node-type-selection.d.ts +22 -2
  199. package/dist/services/pipelines/node-type-selection.d.ts.map +1 -1
  200. package/dist/services/pipelines/node-type-selection.js +16 -538
  201. package/dist/services/pipelines/node-type-selection.js.map +1 -1
  202. package/dist/services/pipelines/plan-builder.d.ts +33 -0
  203. package/dist/services/pipelines/plan-builder.d.ts.map +1 -0
  204. package/dist/services/pipelines/plan-builder.js +224 -0
  205. package/dist/services/pipelines/plan-builder.js.map +1 -0
  206. package/dist/services/pipelines/planning-types.d.ts +543 -0
  207. package/dist/services/pipelines/planning-types.d.ts.map +1 -0
  208. package/dist/services/pipelines/planning-types.js +85 -0
  209. package/dist/services/pipelines/planning-types.js.map +1 -0
  210. package/dist/services/pipelines/planning.d.ts +8 -537
  211. package/dist/services/pipelines/planning.d.ts.map +1 -1
  212. package/dist/services/pipelines/planning.js +10 -1956
  213. package/dist/services/pipelines/planning.js.map +1 -1
  214. package/dist/services/pipelines/review.d.ts.map +1 -1
  215. package/dist/services/pipelines/review.js +3 -8
  216. package/dist/services/pipelines/review.js.map +1 -1
  217. package/dist/services/pipelines/select-parsing.d.ts +7 -0
  218. package/dist/services/pipelines/select-parsing.d.ts.map +1 -0
  219. package/dist/services/pipelines/select-parsing.js +185 -0
  220. package/dist/services/pipelines/select-parsing.js.map +1 -0
  221. package/dist/services/pipelines/source-parsing.d.ts +8 -0
  222. package/dist/services/pipelines/source-parsing.d.ts.map +1 -0
  223. package/dist/services/pipelines/source-parsing.js +151 -0
  224. package/dist/services/pipelines/source-parsing.js.map +1 -0
  225. package/dist/services/pipelines/sql-parsing.d.ts +8 -0
  226. package/dist/services/pipelines/sql-parsing.d.ts.map +1 -0
  227. package/dist/services/pipelines/sql-parsing.js +9 -0
  228. package/dist/services/pipelines/sql-parsing.js.map +1 -0
  229. package/dist/services/pipelines/sql-tokenizer.d.ts +42 -0
  230. package/dist/services/pipelines/sql-tokenizer.d.ts.map +1 -0
  231. package/dist/services/pipelines/sql-tokenizer.js +493 -0
  232. package/dist/services/pipelines/sql-tokenizer.js.map +1 -0
  233. package/dist/services/pipelines/sql-utils.d.ts +30 -0
  234. package/dist/services/pipelines/sql-utils.d.ts.map +1 -0
  235. package/dist/services/pipelines/sql-utils.js +62 -0
  236. package/dist/services/pipelines/sql-utils.js.map +1 -0
  237. package/dist/services/pipelines/workshop.d.ts.map +1 -1
  238. package/dist/services/pipelines/workshop.js +53 -25
  239. package/dist/services/pipelines/workshop.js.map +1 -1
  240. package/dist/services/pipelines/workspace-resolution.d.ts +18 -0
  241. package/dist/services/pipelines/workspace-resolution.d.ts.map +1 -0
  242. package/dist/services/pipelines/workspace-resolution.js +279 -0
  243. package/dist/services/pipelines/workspace-resolution.js.map +1 -0
  244. package/dist/services/runs/diagnostics.d.ts.map +1 -1
  245. package/dist/services/runs/diagnostics.js +3 -8
  246. package/dist/services/runs/diagnostics.js.map +1 -1
  247. package/dist/services/shared/elicitation.d.ts +14 -0
  248. package/dist/services/shared/elicitation.d.ts.map +1 -0
  249. package/dist/services/shared/elicitation.js +56 -0
  250. package/dist/services/shared/elicitation.js.map +1 -0
  251. package/dist/services/workspace/node-creation.d.ts.map +1 -1
  252. package/dist/services/workspace/node-creation.js +5 -1
  253. package/dist/services/workspace/node-creation.js.map +1 -1
  254. package/dist/services/workspace/node-update-helpers.d.ts.map +1 -1
  255. package/dist/services/workspace/node-update-helpers.js +3 -8
  256. package/dist/services/workspace/node-update-helpers.js.map +1 -1
  257. package/dist/utils.d.ts +11 -0
  258. package/dist/utils.d.ts.map +1 -1
  259. package/dist/utils.js +20 -1
  260. package/dist/utils.js.map +1 -1
  261. package/dist/workflows/get-environment-health.d.ts +49 -0
  262. package/dist/workflows/get-environment-health.d.ts.map +1 -0
  263. package/dist/workflows/get-environment-health.js +310 -0
  264. package/dist/workflows/get-environment-health.js.map +1 -0
  265. package/dist/workflows/get-environment-overview.d.ts +2 -1
  266. package/dist/workflows/get-environment-overview.d.ts.map +1 -1
  267. package/dist/workflows/get-environment-overview.js +13 -19
  268. package/dist/workflows/get-environment-overview.js.map +1 -1
  269. package/dist/workflows/get-run-details.d.ts +2 -2
  270. package/dist/workflows/get-run-details.d.ts.map +1 -1
  271. package/dist/workflows/get-run-details.js +14 -19
  272. package/dist/workflows/get-run-details.js.map +1 -1
  273. package/dist/workflows/retry-and-wait.d.ts.map +1 -1
  274. package/dist/workflows/retry-and-wait.js +3 -2
  275. package/dist/workflows/retry-and-wait.js.map +1 -1
  276. package/dist/workflows/run-and-wait.d.ts.map +1 -1
  277. package/dist/workflows/run-and-wait.js +3 -2
  278. package/dist/workflows/run-and-wait.js.map +1 -1
  279. package/package.json +2 -2
@@ -0,0 +1,283 @@
1
+ import { parseColumnKey, columnKey } from "./lineage-cache.js";
2
+ export function walkUpstream(cache, startNodeID) {
3
+ const result = [];
4
+ const visited = new Set();
5
+ const queue = [{ nodeID: startNodeID, depth: 0 }];
6
+ while (queue.length > 0) {
7
+ const { nodeID, depth } = queue.shift();
8
+ if (visited.has(nodeID))
9
+ continue;
10
+ visited.add(nodeID);
11
+ if (nodeID !== startNodeID) {
12
+ const node = cache.nodes.get(nodeID);
13
+ if (node) {
14
+ result.push({ nodeID: node.id, nodeName: node.name, nodeType: node.nodeType, depth });
15
+ }
16
+ }
17
+ const upstream = cache.upstreamNodes.get(nodeID);
18
+ if (upstream) {
19
+ for (const upID of upstream) {
20
+ if (!visited.has(upID)) {
21
+ queue.push({ nodeID: upID, depth: depth + 1 });
22
+ }
23
+ }
24
+ }
25
+ }
26
+ return result;
27
+ }
28
+ export function walkDownstream(cache, startNodeID) {
29
+ const result = [];
30
+ const visited = new Set();
31
+ const queue = [{ nodeID: startNodeID, depth: 0 }];
32
+ while (queue.length > 0) {
33
+ const { nodeID, depth } = queue.shift();
34
+ if (visited.has(nodeID))
35
+ continue;
36
+ visited.add(nodeID);
37
+ if (nodeID !== startNodeID) {
38
+ const node = cache.nodes.get(nodeID);
39
+ if (node) {
40
+ result.push({ nodeID: node.id, nodeName: node.name, nodeType: node.nodeType, depth });
41
+ }
42
+ }
43
+ const downstream = cache.downstreamNodes.get(nodeID);
44
+ if (downstream) {
45
+ for (const downID of downstream) {
46
+ if (!visited.has(downID)) {
47
+ queue.push({ nodeID: downID, depth: depth + 1 });
48
+ }
49
+ }
50
+ }
51
+ }
52
+ return result;
53
+ }
54
+ export function walkColumnLineage(cache, nodeID, columnID) {
55
+ const result = [];
56
+ const startKey = columnKey(nodeID, columnID);
57
+ // Walk upstream
58
+ const visitedUp = new Set();
59
+ const queueUp = [{ key: startKey, depth: 0 }];
60
+ while (queueUp.length > 0) {
61
+ const { key, depth } = queueUp.shift();
62
+ if (visitedUp.has(key))
63
+ continue;
64
+ visitedUp.add(key);
65
+ if (key !== startKey) {
66
+ const parsed = parseColumnKey(key);
67
+ const node = cache.nodes.get(parsed.nodeID);
68
+ if (node) {
69
+ const col = node.columns.find((c) => c.id === parsed.columnID);
70
+ if (col) {
71
+ result.push({
72
+ nodeID: parsed.nodeID,
73
+ nodeName: node.name,
74
+ nodeType: node.nodeType,
75
+ columnID: parsed.columnID,
76
+ columnName: col.name,
77
+ direction: "upstream",
78
+ depth,
79
+ });
80
+ }
81
+ }
82
+ }
83
+ const upstream = cache.columnUpstream.get(key);
84
+ if (upstream) {
85
+ for (const srcKey of upstream) {
86
+ if (!visitedUp.has(srcKey)) {
87
+ queueUp.push({ key: srcKey, depth: depth + 1 });
88
+ }
89
+ }
90
+ }
91
+ }
92
+ // Walk downstream
93
+ const visitedDown = new Set();
94
+ const queueDown = [{ key: startKey, depth: 0 }];
95
+ while (queueDown.length > 0) {
96
+ const { key, depth } = queueDown.shift();
97
+ if (visitedDown.has(key))
98
+ continue;
99
+ visitedDown.add(key);
100
+ if (key !== startKey) {
101
+ const parsed = parseColumnKey(key);
102
+ const node = cache.nodes.get(parsed.nodeID);
103
+ if (node) {
104
+ const col = node.columns.find((c) => c.id === parsed.columnID);
105
+ if (col) {
106
+ result.push({
107
+ nodeID: parsed.nodeID,
108
+ nodeName: node.name,
109
+ nodeType: node.nodeType,
110
+ columnID: parsed.columnID,
111
+ columnName: col.name,
112
+ direction: "downstream",
113
+ depth,
114
+ });
115
+ }
116
+ }
117
+ }
118
+ const downstream = cache.columnDownstream.get(key);
119
+ if (downstream) {
120
+ for (const dstKey of downstream) {
121
+ if (!visitedDown.has(dstKey)) {
122
+ queueDown.push({ key: dstKey, depth: depth + 1 });
123
+ }
124
+ }
125
+ }
126
+ }
127
+ return result;
128
+ }
129
+ export function analyzeNodeImpact(cache, nodeID, columnID) {
130
+ const node = cache.nodes.get(nodeID);
131
+ if (!node) {
132
+ throw new Error(`Node ${nodeID} not found in lineage cache. Ensure the workspace has been cached with detail=true.`);
133
+ }
134
+ let sourceColumnName;
135
+ if (columnID) {
136
+ const col = node.columns.find((c) => c.id === columnID);
137
+ if (!col) {
138
+ const available = node.columns.map((c) => `${c.id} (${c.name})`).join(", ");
139
+ throw new Error(`Column ${columnID} not found on node ${nodeID} (${node.name}). Available columns: ${available || "none"}`);
140
+ }
141
+ sourceColumnName = col.name;
142
+ }
143
+ // Node-level impact: all downstream nodes
144
+ const impactedNodes = walkDownstream(cache, nodeID);
145
+ // Column-level impact
146
+ let impactedColumns = [];
147
+ if (columnID) {
148
+ impactedColumns = walkColumnLineage(cache, nodeID, columnID).filter((e) => e.direction === "downstream");
149
+ }
150
+ else {
151
+ // All columns on this node -> trace each downstream
152
+ for (const col of node.columns) {
153
+ const downstream = walkColumnLineage(cache, nodeID, col.id).filter((e) => e.direction === "downstream");
154
+ impactedColumns.push(...downstream);
155
+ }
156
+ // Deduplicate
157
+ const seen = new Set();
158
+ impactedColumns = impactedColumns.filter((e) => {
159
+ const key = columnKey(e.nodeID, e.columnID);
160
+ if (seen.has(key))
161
+ return false;
162
+ seen.add(key);
163
+ return true;
164
+ });
165
+ }
166
+ // Group by depth
167
+ const byDepth = {};
168
+ for (const n of impactedNodes) {
169
+ if (!byDepth[n.depth])
170
+ byDepth[n.depth] = [];
171
+ byDepth[n.depth].push(n.nodeName);
172
+ }
173
+ // Critical path: longest path from source to leaf
174
+ const criticalPath = findCriticalPath(cache, nodeID);
175
+ return {
176
+ sourceNodeID: nodeID,
177
+ sourceNodeName: node.name,
178
+ sourceNodeType: node.nodeType,
179
+ ...(columnID ? { sourceColumnID: columnID } : {}),
180
+ ...(sourceColumnName ? { sourceColumnName } : {}),
181
+ impactedNodes,
182
+ impactedColumns,
183
+ totalImpactedNodes: impactedNodes.length,
184
+ totalImpactedColumns: impactedColumns.length,
185
+ byDepth,
186
+ criticalPath,
187
+ };
188
+ }
189
+ function findCriticalPath(cache, startNodeID) {
190
+ const node = cache.nodes.get(startNodeID);
191
+ if (!node)
192
+ return [];
193
+ // Collect reachable downstream subgraph via BFS
194
+ const reachable = new Set();
195
+ const bfsQueue = [startNodeID];
196
+ while (bfsQueue.length > 0) {
197
+ const id = bfsQueue.shift();
198
+ if (reachable.has(id))
199
+ continue;
200
+ reachable.add(id);
201
+ const downstream = cache.downstreamNodes.get(id);
202
+ if (downstream) {
203
+ for (const nextID of downstream) {
204
+ if (!reachable.has(nextID))
205
+ bfsQueue.push(nextID);
206
+ }
207
+ }
208
+ }
209
+ // Topological sort (Kahn's algorithm) over the reachable subgraph
210
+ const inDegree = new Map();
211
+ for (const id of reachable)
212
+ inDegree.set(id, 0);
213
+ for (const id of reachable) {
214
+ const downstream = cache.downstreamNodes.get(id);
215
+ if (downstream) {
216
+ for (const nextID of downstream) {
217
+ if (reachable.has(nextID)) {
218
+ inDegree.set(nextID, (inDegree.get(nextID) ?? 0) + 1);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ const topoQueue = [];
224
+ for (const [id, deg] of inDegree) {
225
+ if (deg === 0)
226
+ topoQueue.push(id);
227
+ }
228
+ const topoOrder = [];
229
+ while (topoQueue.length > 0) {
230
+ const id = topoQueue.shift();
231
+ topoOrder.push(id);
232
+ const downstream = cache.downstreamNodes.get(id);
233
+ if (downstream) {
234
+ for (const nextID of downstream) {
235
+ if (!reachable.has(nextID))
236
+ continue;
237
+ const newDeg = (inDegree.get(nextID) ?? 1) - 1;
238
+ inDegree.set(nextID, newDeg);
239
+ if (newDeg === 0)
240
+ topoQueue.push(nextID);
241
+ }
242
+ }
243
+ }
244
+ // DP longest path from startNodeID — O(V+E)
245
+ const dist = new Map();
246
+ const predecessor = new Map();
247
+ dist.set(startNodeID, 0);
248
+ for (const id of topoOrder) {
249
+ const d = dist.get(id);
250
+ if (d === undefined)
251
+ continue; // not reachable from start
252
+ const downstream = cache.downstreamNodes.get(id);
253
+ if (downstream) {
254
+ for (const nextID of downstream) {
255
+ if (!reachable.has(nextID))
256
+ continue;
257
+ if (d + 1 > (dist.get(nextID) ?? -1)) {
258
+ dist.set(nextID, d + 1);
259
+ predecessor.set(nextID, id);
260
+ }
261
+ }
262
+ }
263
+ }
264
+ // Find the farthest node
265
+ let farthestID = startNodeID;
266
+ let maxDist = 0;
267
+ for (const [id, d] of dist) {
268
+ if (d > maxDist) {
269
+ maxDist = d;
270
+ farthestID = id;
271
+ }
272
+ }
273
+ // Reconstruct path
274
+ const pathIDs = [];
275
+ let cur = farthestID;
276
+ while (cur !== undefined) {
277
+ pathIDs.push(cur);
278
+ cur = predecessor.get(cur);
279
+ }
280
+ pathIDs.reverse();
281
+ return pathIDs.map((id) => cache.nodes.get(id)?.name ?? id);
282
+ }
283
+ //# sourceMappingURL=lineage-traversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage-traversal.js","sourceRoot":"","sources":["../../../src/services/lineage/lineage-traversal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function extractSelectClause(sql: string): string | null;
2
+ export declare function extractFromClause(sql: string): string | null;
3
+ //# sourceMappingURL=clause-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clause-extraction.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/clause-extraction.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU9D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa5D"}
@@ -0,0 +1,27 @@
1
+ import { findTopLevelKeywordIndex } from "./sql-tokenizer.js";
2
+ export function extractSelectClause(sql) {
3
+ const selectIndex = findTopLevelKeywordIndex(sql, "select");
4
+ if (selectIndex < 0) {
5
+ return null;
6
+ }
7
+ const fromIndex = findTopLevelKeywordIndex(sql, "from", selectIndex + 6);
8
+ if (fromIndex < 0) {
9
+ return null;
10
+ }
11
+ return sql.slice(selectIndex + 6, fromIndex).trim();
12
+ }
13
+ export function extractFromClause(sql) {
14
+ const selectIndex = findTopLevelKeywordIndex(sql, "select");
15
+ if (selectIndex < 0) {
16
+ return null;
17
+ }
18
+ const fromIndex = findTopLevelKeywordIndex(sql, "from", selectIndex + 6);
19
+ if (fromIndex < 0) {
20
+ return null;
21
+ }
22
+ return sql
23
+ .slice(fromIndex)
24
+ .trim()
25
+ .replace(/;+\s*$/u, "");
26
+ }
27
+ //# sourceMappingURL=clause-extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clause-extraction.js","sourceRoot":"","sources":["../../../src/services/pipelines/clause-extraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,WAAW,GAAG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,WAAW,GAAG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,SAAS,CAAC;SAChB,IAAI,EAAE;SACN,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PlannedSelectItem, PlannedPipelineNode } from "./planning-types.js";
2
+ export declare function getColumnNamesFromNode(node: Record<string, unknown>): string[];
3
+ export declare function getNodeColumnArray(node: Record<string, unknown>): Record<string, unknown>[];
4
+ export declare function getColumnSourceNodeIDs(column: Record<string, unknown>): string[];
5
+ export declare function findMatchingBaseColumn(node: Record<string, unknown>, selectItem: PlannedSelectItem): Record<string, unknown> | null;
6
+ export declare function renameSourceMappingEntries(node: Record<string, unknown>, newName: string): Record<string, unknown>;
7
+ export declare function buildStageSourceMappingFromPlan(currentNode: Record<string, unknown>, nodePlan: PlannedPipelineNode): Record<string, unknown>[];
8
+ //# sourceMappingURL=column-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-helpers.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/column-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGlF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAY9E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAM3F;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAgBhF;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,iBAAiB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAqBhC;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,EAAE,mBAAmB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA0C3B"}
@@ -0,0 +1,125 @@
1
+ import { isPlainObject } from "../../utils.js";
2
+ import { normalizeSqlIdentifier, deepClone, getUniqueSourceDependencies } from "./sql-parsing.js";
3
+ export function getColumnNamesFromNode(node) {
4
+ const metadata = isPlainObject(node.metadata) ? node.metadata : undefined;
5
+ if (!Array.isArray(metadata?.columns)) {
6
+ return [];
7
+ }
8
+ return metadata.columns.flatMap((column) => {
9
+ if (!isPlainObject(column) || typeof column.name !== "string") {
10
+ return [];
11
+ }
12
+ return [column.name];
13
+ });
14
+ }
15
+ export function getNodeColumnArray(node) {
16
+ const metadata = isPlainObject(node.metadata) ? node.metadata : undefined;
17
+ if (!Array.isArray(metadata?.columns)) {
18
+ return [];
19
+ }
20
+ return metadata.columns.filter(isPlainObject);
21
+ }
22
+ export function getColumnSourceNodeIDs(column) {
23
+ if (!Array.isArray(column.sources)) {
24
+ return [];
25
+ }
26
+ const ids = new Set();
27
+ for (const source of column.sources) {
28
+ if (!isPlainObject(source) || !Array.isArray(source.columnReferences)) {
29
+ continue;
30
+ }
31
+ for (const ref of source.columnReferences) {
32
+ if (isPlainObject(ref) && typeof ref.nodeID === "string") {
33
+ ids.add(ref.nodeID);
34
+ }
35
+ }
36
+ }
37
+ return Array.from(ids);
38
+ }
39
+ export function findMatchingBaseColumn(node, selectItem) {
40
+ if (!selectItem.sourceColumnName)
41
+ return null;
42
+ const normalizedTargetName = normalizeSqlIdentifier(selectItem.sourceColumnName);
43
+ for (const column of getNodeColumnArray(node)) {
44
+ if (typeof column.name !== "string" ||
45
+ normalizeSqlIdentifier(column.name) !== normalizedTargetName) {
46
+ continue;
47
+ }
48
+ const sourceNodeIDs = getColumnSourceNodeIDs(column);
49
+ if (selectItem.sourceNodeID && sourceNodeIDs.includes(selectItem.sourceNodeID)) {
50
+ return deepClone(column);
51
+ }
52
+ if (!selectItem.sourceNodeID) {
53
+ return deepClone(column);
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ export function renameSourceMappingEntries(node, newName) {
59
+ const metadata = isPlainObject(node.metadata) ? node.metadata : undefined;
60
+ if (!metadata || !Array.isArray(metadata.sourceMapping)) {
61
+ return node;
62
+ }
63
+ const previousName = typeof node.name === "string" && node.name.trim().length > 0 ? node.name : null;
64
+ const updateSingleUnnamedMapping = previousName === null && metadata.sourceMapping.length === 1;
65
+ return {
66
+ ...node,
67
+ metadata: {
68
+ ...metadata,
69
+ sourceMapping: metadata.sourceMapping.map((entry) => {
70
+ if (!isPlainObject(entry)) {
71
+ return entry;
72
+ }
73
+ const shouldRename = (previousName !== null && entry.name === previousName) ||
74
+ updateSingleUnnamedMapping;
75
+ if (!shouldRename) {
76
+ return entry;
77
+ }
78
+ return {
79
+ ...entry,
80
+ name: newName,
81
+ };
82
+ }),
83
+ },
84
+ };
85
+ }
86
+ export function buildStageSourceMappingFromPlan(currentNode, nodePlan) {
87
+ const metadata = isPlainObject(currentNode.metadata) ? currentNode.metadata : undefined;
88
+ const existingEntry = metadata && Array.isArray(metadata.sourceMapping)
89
+ ? metadata.sourceMapping.find(isPlainObject)
90
+ : undefined;
91
+ const aliases = {};
92
+ for (const ref of nodePlan.sourceRefs) {
93
+ if (!ref.nodeID) {
94
+ continue;
95
+ }
96
+ const alias = ref.alias ?? ref.nodeName;
97
+ if (nodePlan.sourceRefs.length > 1 || ref.alias) {
98
+ aliases[alias] = ref.nodeID;
99
+ }
100
+ }
101
+ return [
102
+ {
103
+ ...(isPlainObject(existingEntry) ? existingEntry : {}),
104
+ aliases,
105
+ customSQL: {
106
+ ...(isPlainObject(existingEntry) && isPlainObject(existingEntry.customSQL)
107
+ ? existingEntry.customSQL
108
+ : {}),
109
+ customSQL: "",
110
+ },
111
+ dependencies: getUniqueSourceDependencies(nodePlan.sourceRefs),
112
+ join: {
113
+ ...(isPlainObject(existingEntry) && isPlainObject(existingEntry.join)
114
+ ? existingEntry.join
115
+ : {}),
116
+ joinCondition: nodePlan.joinCondition ?? "",
117
+ },
118
+ name: nodePlan.name,
119
+ noLinkRefs: isPlainObject(existingEntry) && Array.isArray(existingEntry.noLinkRefs)
120
+ ? existingEntry.noLinkRefs
121
+ : [],
122
+ },
123
+ ];
124
+ }
125
+ //# sourceMappingURL=column-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-helpers.js","sourceRoot":"","sources":["../../../src/services/pipelines/column-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Parsed CTE with name and body SQL.
3
+ */
4
+ export type ParsedCte = {
5
+ name: string;
6
+ body: string;
7
+ columns: CteColumn[];
8
+ whereClause: string | null;
9
+ sourceTable: string | null;
10
+ hasGroupBy: boolean;
11
+ hasJoin: boolean;
12
+ };
13
+ export type CteColumn = {
14
+ outputName: string;
15
+ expression: string;
16
+ isTransform: boolean;
17
+ };
18
+ /**
19
+ * Extract CTEs with their bodies from SQL.
20
+ * Uses quoting-aware scanning to find CTE headers and balanced parentheses,
21
+ * avoiding false matches inside string literals, quoted identifiers, and comments.
22
+ */
23
+ export declare function extractCtes(sql: string): ParsedCte[];
24
+ /**
25
+ * Classify a CTE's pattern to pick the right node type.
26
+ */
27
+ export declare function classifyCtePattern(cte: ParsedCte): "staging" | "multiSource" | "aggregation";
28
+ export declare function isAggregateFn(name: string): boolean;
29
+ //# sourceMappingURL=cte-parsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cte-parsing.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/cte-parsing.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CA6CpD;AAmGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,CAI5F;AAUD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}