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,176 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { CACHE_DIR_NAME } from "../../cache-dir.js";
4
+ import { invalidateLineageCache } from "./lineage-cache.js";
5
+ import { walkColumnLineage } from "./lineage-traversal.js";
6
+ import { setWorkspaceNode } from "../../coalesce/api/nodes.js";
7
+ import { buildUpdatedWorkspaceNodeBody } from "../workspace/node-update-helpers.js";
8
+ import { validatePathSegment } from "../../coalesce/types.js";
9
+ import { isPlainObject } from "../../utils.js";
10
+ export async function propagateColumnChange(client, cache, workspaceID, nodeID, columnID, changes, reportProgress, baseDir) {
11
+ if (!changes.columnName && !changes.dataType) {
12
+ throw new Error("At least one change (columnName or dataType) must be specified");
13
+ }
14
+ const node = cache.nodes.get(nodeID);
15
+ if (!node) {
16
+ throw new Error(`Node ${nodeID} not found in lineage cache`);
17
+ }
18
+ const sourceCol = node.columns.find((c) => c.id === columnID);
19
+ if (!sourceCol) {
20
+ throw new Error(`Column ${columnID} not found on node ${nodeID} (${node.name})`);
21
+ }
22
+ // Find all downstream columns that reference this column
23
+ const downstreamEntries = walkColumnLineage(cache, nodeID, columnID).filter((e) => e.direction === "downstream");
24
+ const safeWorkspaceID = validatePathSegment(workspaceID, "workspaceID");
25
+ async function emitProgress(label, itemName, index, total) {
26
+ if (reportProgress) {
27
+ await reportProgress(`${label} column ${itemName} (${index + 1}/${total})`, total);
28
+ }
29
+ }
30
+ // --- Phase 1: Prepare all changes (read-only, no writes) ---
31
+ const prepared = [];
32
+ const prepareErrors = [];
33
+ const snapshotTimestamp = new Date().toISOString();
34
+ const fullSnapshot = [];
35
+ for (let i = 0; i < downstreamEntries.length; i++) {
36
+ const entry = downstreamEntries[i];
37
+ await emitProgress("Preparing", `${entry.columnName} on ${entry.nodeName}`, i, downstreamEntries.length);
38
+ try {
39
+ const currentNode = await client.get(`/api/v1/workspaces/${safeWorkspaceID}/nodes/${validatePathSegment(entry.nodeID, "nodeID")}`, {});
40
+ if (!isPlainObject(currentNode) || !isPlainObject(currentNode.metadata)) {
41
+ prepareErrors.push({ nodeID: entry.nodeID, columnID: entry.columnID, message: "Could not read node metadata" });
42
+ continue;
43
+ }
44
+ const metadata = currentNode.metadata;
45
+ const columns = Array.isArray(metadata.columns) ? [...metadata.columns] : [];
46
+ const colIndex = columns.findIndex((c) => isPlainObject(c) &&
47
+ (c.id === entry.columnID || c.columnID === entry.columnID));
48
+ if (colIndex === -1) {
49
+ prepareErrors.push({ nodeID: entry.nodeID, columnID: entry.columnID, message: "Column not found in current node state" });
50
+ continue;
51
+ }
52
+ const col = columns[colIndex];
53
+ const previousName = typeof col.name === "string" ? col.name : undefined;
54
+ const previousDataType = typeof col.dataType === "string" ? col.dataType : undefined;
55
+ // Capture pre-mutation snapshot (full nodeBody for disk persistence)
56
+ fullSnapshot.push({
57
+ nodeID: entry.nodeID,
58
+ nodeName: entry.nodeName,
59
+ columnID: entry.columnID,
60
+ previousColumnName: previousName ?? entry.columnName,
61
+ previousDataType: previousDataType ?? "unknown",
62
+ capturedAt: snapshotTimestamp,
63
+ nodeBody: structuredClone(currentNode),
64
+ });
65
+ const updatedCol = { ...col };
66
+ if (changes.columnName)
67
+ updatedCol.name = changes.columnName;
68
+ if (changes.dataType)
69
+ updatedCol.dataType = changes.dataType;
70
+ columns[colIndex] = updatedCol;
71
+ const body = buildUpdatedWorkspaceNodeBody(currentNode, { metadata: { columns } });
72
+ prepared.push({
73
+ nodeID: entry.nodeID,
74
+ nodeName: entry.nodeName,
75
+ columnID: entry.columnID,
76
+ columnName: changes.columnName ?? entry.columnName,
77
+ previousName,
78
+ previousDataType,
79
+ body,
80
+ });
81
+ }
82
+ catch (error) {
83
+ const message = error instanceof Error ? error.message : String(error);
84
+ prepareErrors.push({ nodeID: entry.nodeID, columnID: entry.columnID, message });
85
+ }
86
+ }
87
+ /** Strip nodeBody from full snapshot entries for inline (LLM-friendly) response. */
88
+ function toSummary(entries) {
89
+ return entries.map(({ nodeBody: _, ...rest }) => rest);
90
+ }
91
+ // If nothing could be prepared, return early -- no writes attempted
92
+ if (prepared.length === 0) {
93
+ return {
94
+ sourceNodeID: nodeID,
95
+ sourceColumnID: columnID,
96
+ changes,
97
+ preMutationSnapshot: toSummary(fullSnapshot),
98
+ updatedNodes: [],
99
+ totalUpdated: 0,
100
+ errors: prepareErrors,
101
+ };
102
+ }
103
+ // --- Persist pre-mutation snapshot to disk ---
104
+ let snapshotPath;
105
+ try {
106
+ const resolvedBase = baseDir ?? process.cwd();
107
+ const snapshotDir = join(resolvedBase, CACHE_DIR_NAME, "propagation-snapshots");
108
+ mkdirSync(snapshotDir, { recursive: true });
109
+ const fileName = `propagation-${workspaceID}-${snapshotTimestamp.replace(/[:.]/g, "-")}.json`;
110
+ snapshotPath = join(snapshotDir, fileName);
111
+ const diskSnapshot = {
112
+ workspaceID,
113
+ sourceNodeID: nodeID,
114
+ sourceColumnID: columnID,
115
+ changes,
116
+ capturedAt: snapshotTimestamp,
117
+ entries: fullSnapshot,
118
+ };
119
+ writeFileSync(snapshotPath, JSON.stringify(diskSnapshot, null, 2));
120
+ }
121
+ catch (err) {
122
+ // Snapshot write failure should not block propagation
123
+ const reason = err instanceof Error ? err.message : String(err);
124
+ process.stderr.write(`Warning: failed to write pre-mutation snapshot to disk: ${reason}\n`);
125
+ snapshotPath = undefined;
126
+ }
127
+ // --- Phase 2: Apply all prepared changes ---
128
+ const updatedNodes = [];
129
+ const writeErrors = [];
130
+ for (let i = 0; i < prepared.length; i++) {
131
+ const update = prepared[i];
132
+ await emitProgress("Applying", `${update.columnName} on ${update.nodeName}`, i, prepared.length);
133
+ try {
134
+ await setWorkspaceNode(client, {
135
+ workspaceID: safeWorkspaceID,
136
+ nodeID: validatePathSegment(update.nodeID, "nodeID"),
137
+ body: update.body,
138
+ });
139
+ const { body: _, ...info } = update;
140
+ updatedNodes.push(info);
141
+ }
142
+ catch (error) {
143
+ const message = error instanceof Error ? error.message : String(error);
144
+ writeErrors.push({ nodeID: update.nodeID, columnID: update.columnID, message });
145
+ // Stop on first write failure to minimize workspace inconsistency
146
+ break;
147
+ }
148
+ }
149
+ const allErrors = [...prepareErrors, ...writeErrors];
150
+ const partialFailure = updatedNodes.length > 0 && writeErrors.length > 0;
151
+ // Skipped = prepared entries after the last written + 1 failed entry.
152
+ // The write loop processes prepared[] in order and breaks on first error,
153
+ // so everything beyond (updatedNodes.length + writeErrors.length) was skipped.
154
+ const firstSkippedIndex = updatedNodes.length + writeErrors.length;
155
+ const skippedNodes = prepared.slice(firstSkippedIndex).map(({ body: _, ...info }) => info);
156
+ // Only invalidate cache if writes were actually made
157
+ if (updatedNodes.length > 0) {
158
+ invalidateLineageCache(workspaceID);
159
+ }
160
+ const result = {
161
+ sourceNodeID: nodeID,
162
+ sourceColumnID: columnID,
163
+ changes,
164
+ preMutationSnapshot: toSummary(fullSnapshot),
165
+ ...(snapshotPath ? { snapshotPath } : {}),
166
+ updatedNodes,
167
+ totalUpdated: updatedNodes.length,
168
+ errors: allErrors,
169
+ };
170
+ if (partialFailure)
171
+ result.partialFailure = true;
172
+ if (skippedNodes.length > 0)
173
+ result.skippedNodes = skippedNodes;
174
+ return result;
175
+ }
176
+ //# sourceMappingURL=lineage-propagation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage-propagation.js","sourceRoot":"","sources":["../../../src/services/lineage/lineage-propagation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { LineageCacheEntry } from "./lineage-cache.js";
2
+ export type SearchField = "name" | "nodeType" | "sql" | "columnName" | "columnDataType" | "description" | "config";
3
+ export type WorkspaceSearchParams = {
4
+ query: string;
5
+ fields?: SearchField[];
6
+ nodeType?: string;
7
+ limit?: number;
8
+ };
9
+ export type SearchMatch = {
10
+ nodeID: string;
11
+ nodeName: string;
12
+ nodeType: string;
13
+ matchedFields: string[];
14
+ matches: Array<{
15
+ field: string;
16
+ /** For column matches, the column name */
17
+ columnName?: string;
18
+ /** Snippet of the matched content (truncated for large values) */
19
+ snippet: string;
20
+ }>;
21
+ };
22
+ export type WorkspaceSearchResult = {
23
+ query: string;
24
+ fields: SearchField[];
25
+ nodeTypeFilter?: string;
26
+ totalMatches: number;
27
+ returnedCount: number;
28
+ truncated: boolean;
29
+ results: SearchMatch[];
30
+ cacheAge: string;
31
+ };
32
+ export declare function searchWorkspaceContent(cache: LineageCacheEntry, params: WorkspaceSearchParams): WorkspaceSearchResult;
33
+ //# sourceMappingURL=lineage-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage-search.d.ts","sourceRoot":"","sources":["../../../src/services/lineage/lineage-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAK5D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAInH,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,0CAA0C;QAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kEAAkE;QAClE,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AA4CF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,qBAAqB,GAC5B,qBAAqB,CAiGvB"}
@@ -0,0 +1,133 @@
1
+ import { isPlainObject } from "../../utils.js";
2
+ const ALL_SEARCH_FIELDS = ["name", "nodeType", "sql", "columnName", "columnDataType", "description", "config"];
3
+ function extractSql(raw) {
4
+ const metadata = isPlainObject(raw.metadata) ? raw.metadata : {};
5
+ if (typeof metadata.query === "string" && metadata.query.length > 0)
6
+ return metadata.query;
7
+ if (typeof metadata.sqlQuery === "string" && metadata.sqlQuery.length > 0)
8
+ return metadata.sqlQuery;
9
+ const sourceMapping = Array.isArray(metadata.sourceMapping) ? metadata.sourceMapping : [];
10
+ for (const mapping of sourceMapping) {
11
+ if (isPlainObject(mapping) && typeof mapping.query === "string" && mapping.query.length > 0) {
12
+ return mapping.query;
13
+ }
14
+ }
15
+ return undefined;
16
+ }
17
+ function extractDescription(raw) {
18
+ if (typeof raw.description === "string" && raw.description.length > 0)
19
+ return raw.description;
20
+ const metadata = isPlainObject(raw.metadata) ? raw.metadata : {};
21
+ if (typeof metadata.description === "string" && metadata.description.length > 0)
22
+ return metadata.description;
23
+ return undefined;
24
+ }
25
+ function extractConfigString(raw) {
26
+ const config = isPlainObject(raw.config) ? raw.config : {};
27
+ const keys = Object.keys(config);
28
+ if (keys.length === 0)
29
+ return undefined;
30
+ return JSON.stringify(config);
31
+ }
32
+ function snippet(text, query, maxLen = 200) {
33
+ const lowerText = text.toLowerCase();
34
+ const lowerQuery = query.toLowerCase();
35
+ const idx = lowerText.indexOf(lowerQuery);
36
+ if (idx === -1) {
37
+ return text.length > maxLen ? `${text.slice(0, maxLen)}…` : text;
38
+ }
39
+ const start = Math.max(0, idx - 60);
40
+ const end = Math.min(text.length, idx + query.length + 60);
41
+ let s = text.slice(start, end);
42
+ if (start > 0)
43
+ s = `…${s}`;
44
+ if (end < text.length)
45
+ s = `${s}…`;
46
+ return s;
47
+ }
48
+ export function searchWorkspaceContent(cache, params) {
49
+ const { query, limit = 50 } = params;
50
+ const fields = params.fields && params.fields.length > 0 ? params.fields : ALL_SEARCH_FIELDS;
51
+ if (query.length === 0) {
52
+ throw new Error("Search query must not be empty");
53
+ }
54
+ const lowerQuery = query.toLowerCase();
55
+ const allMatches = [];
56
+ for (const node of cache.nodes.values()) {
57
+ if (params.nodeType && node.nodeType.toLowerCase() !== params.nodeType.toLowerCase()) {
58
+ continue;
59
+ }
60
+ const matchedFields = [];
61
+ const matches = [];
62
+ if (fields.includes("name") && node.name.toLowerCase().includes(lowerQuery)) {
63
+ matchedFields.push("name");
64
+ matches.push({ field: "name", snippet: node.name });
65
+ }
66
+ if (fields.includes("nodeType") && node.nodeType.toLowerCase().includes(lowerQuery)) {
67
+ matchedFields.push("nodeType");
68
+ matches.push({ field: "nodeType", snippet: node.nodeType });
69
+ }
70
+ if (fields.includes("sql")) {
71
+ const sql = extractSql(node.raw);
72
+ if (sql && sql.toLowerCase().includes(lowerQuery)) {
73
+ matchedFields.push("sql");
74
+ matches.push({ field: "sql", snippet: snippet(sql, query) });
75
+ }
76
+ }
77
+ if (fields.includes("description")) {
78
+ const desc = extractDescription(node.raw);
79
+ if (desc && desc.toLowerCase().includes(lowerQuery)) {
80
+ matchedFields.push("description");
81
+ matches.push({ field: "description", snippet: snippet(desc, query) });
82
+ }
83
+ }
84
+ if (fields.includes("config")) {
85
+ const configStr = extractConfigString(node.raw);
86
+ if (configStr && configStr.toLowerCase().includes(lowerQuery)) {
87
+ matchedFields.push("config");
88
+ matches.push({ field: "config", snippet: snippet(configStr, query) });
89
+ }
90
+ }
91
+ if (fields.includes("columnName")) {
92
+ for (const col of node.columns) {
93
+ if (col.name.toLowerCase().includes(lowerQuery)) {
94
+ if (!matchedFields.includes("columnName"))
95
+ matchedFields.push("columnName");
96
+ matches.push({ field: "columnName", columnName: col.name, snippet: col.name });
97
+ }
98
+ }
99
+ }
100
+ if (fields.includes("columnDataType")) {
101
+ for (const col of node.columns) {
102
+ if (col.dataType && col.dataType.toLowerCase().includes(lowerQuery)) {
103
+ if (!matchedFields.includes("columnDataType"))
104
+ matchedFields.push("columnDataType");
105
+ matches.push({ field: "columnDataType", columnName: col.name, snippet: col.dataType });
106
+ }
107
+ }
108
+ }
109
+ if (matches.length > 0) {
110
+ allMatches.push({
111
+ nodeID: node.id,
112
+ nodeName: node.name,
113
+ nodeType: node.nodeType,
114
+ matchedFields,
115
+ matches,
116
+ });
117
+ }
118
+ }
119
+ const results = allMatches.slice(0, limit);
120
+ const ageMs = Date.now() - cache.cachedAt;
121
+ const ageMin = Math.round(ageMs / 60_000);
122
+ return {
123
+ query,
124
+ fields,
125
+ ...(params.nodeType ? { nodeTypeFilter: params.nodeType } : {}),
126
+ totalMatches: allMatches.length,
127
+ returnedCount: results.length,
128
+ truncated: allMatches.length > limit,
129
+ results,
130
+ cacheAge: ageMin < 1 ? "< 1 minute" : `${ageMin} minute${ageMin === 1 ? "" : "s"}`,
131
+ };
132
+ }
133
+ //# sourceMappingURL=lineage-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage-search.js","sourceRoot":"","sources":["../../../src/services/lineage/lineage-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { LineageCacheEntry } from "./lineage-cache.js";
2
+ export type LineageGraphNode = {
3
+ nodeID: string;
4
+ nodeName: string;
5
+ nodeType: string;
6
+ depth: number;
7
+ };
8
+ export declare function walkUpstream(cache: LineageCacheEntry, startNodeID: string): LineageGraphNode[];
9
+ export declare function walkDownstream(cache: LineageCacheEntry, startNodeID: string): LineageGraphNode[];
10
+ export type ColumnLineageEntry = {
11
+ nodeID: string;
12
+ nodeName: string;
13
+ nodeType: string;
14
+ columnID: string;
15
+ columnName: string;
16
+ direction: "upstream" | "downstream";
17
+ depth: number;
18
+ };
19
+ export declare function walkColumnLineage(cache: LineageCacheEntry, nodeID: string, columnID: string): ColumnLineageEntry[];
20
+ export type ImpactResult = {
21
+ sourceNodeID: string;
22
+ sourceNodeName: string;
23
+ sourceNodeType: string;
24
+ sourceColumnID?: string;
25
+ sourceColumnName?: string;
26
+ impactedNodes: LineageGraphNode[];
27
+ impactedColumns: ColumnLineageEntry[];
28
+ totalImpactedNodes: number;
29
+ totalImpactedColumns: number;
30
+ byDepth: Record<number, string[]>;
31
+ criticalPath: string[];
32
+ };
33
+ export declare function analyzeNodeImpact(cache: LineageCacheEntry, nodeID: string, columnID?: string): ImpactResult;
34
+ //# sourceMappingURL=lineage-traversal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage-traversal.d.ts","sourceRoot":"","sources":["../../../src/services/lineage/lineage-traversal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAK5D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA4B9F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA4BhG;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,GAAG,YAAY,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,EAAE,CA+EtB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY,CAoEd"}