@kaelio/ktx 0.5.0 → 0.7.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 (875) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.7.0-py3-none-any.whl} +0 -0
  2. package/assets/python/manifest.json +4 -4
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/clack.d.ts +8 -0
  5. package/dist/clack.js +14 -0
  6. package/dist/connection.js +2 -9
  7. package/dist/connectors/bigquery/connector.d.ts +6 -1
  8. package/dist/connectors/bigquery/connector.js +38 -9
  9. package/dist/connectors/bigquery/dialect.d.ts +11 -9
  10. package/dist/connectors/bigquery/dialect.js +25 -45
  11. package/dist/connectors/clickhouse/connector.d.ts +5 -0
  12. package/dist/connectors/clickhouse/connector.js +36 -3
  13. package/dist/connectors/clickhouse/dialect.d.ts +11 -12
  14. package/dist/connectors/clickhouse/dialect.js +25 -100
  15. package/dist/connectors/mysql/connector.d.ts +7 -1
  16. package/dist/connectors/mysql/connector.js +67 -9
  17. package/dist/connectors/mysql/dialect.d.ts +11 -9
  18. package/dist/connectors/mysql/dialect.js +25 -43
  19. package/dist/connectors/postgres/connector.d.ts +6 -0
  20. package/dist/connectors/postgres/connector.js +67 -12
  21. package/dist/connectors/postgres/dialect.d.ts +11 -9
  22. package/dist/connectors/postgres/dialect.js +26 -35
  23. package/dist/connectors/snowflake/connector.d.ts +8 -3
  24. package/dist/connectors/snowflake/connector.js +39 -20
  25. package/dist/connectors/snowflake/dialect.d.ts +11 -9
  26. package/dist/connectors/snowflake/dialect.js +25 -24
  27. package/dist/connectors/sqlite/connector.d.ts +3 -1
  28. package/dist/connectors/sqlite/connector.js +23 -3
  29. package/dist/connectors/sqlite/dialect.d.ts +11 -9
  30. package/dist/connectors/sqlite/dialect.js +25 -29
  31. package/dist/connectors/sqlserver/connector.d.ts +6 -0
  32. package/dist/connectors/sqlserver/connector.js +56 -9
  33. package/dist/connectors/sqlserver/dialect.d.ts +11 -10
  34. package/dist/connectors/sqlserver/dialect.js +24 -40
  35. package/dist/context/connections/connection-type.d.ts +1 -1
  36. package/dist/context/connections/dialect-helpers.d.ts +9 -0
  37. package/dist/context/connections/dialect-helpers.js +67 -0
  38. package/dist/context/connections/dialects.d.ts +23 -5
  39. package/dist/context/connections/dialects.js +18 -56
  40. package/dist/context/connections/drivers.d.ts +23 -0
  41. package/dist/context/connections/drivers.js +171 -0
  42. package/dist/context/connections/local-query-executor.js +25 -7
  43. package/dist/context/connections/local-warehouse-descriptor.js +0 -2
  44. package/dist/context/connections/postgres-query-executor.js +1 -1
  45. package/dist/context/connections/sqlite-query-executor.js +1 -1
  46. package/dist/context/ingest/adapters/historic-sql/chunk-unified.js +1 -1
  47. package/dist/context/ingest/adapters/historic-sql/connection-dialect.js +11 -7
  48. package/dist/context/ingest/adapters/historic-sql/evidence-tool.d.ts +1 -1
  49. package/dist/context/ingest/adapters/historic-sql/evidence-tool.js +8 -5
  50. package/dist/context/ingest/adapters/historic-sql/evidence.d.ts +4 -4
  51. package/dist/context/ingest/adapters/historic-sql/evidence.js +2 -2
  52. package/dist/context/ingest/adapters/historic-sql/projection.js +5 -2
  53. package/dist/context/ingest/adapters/live-database/daemon-introspection.js +1 -1
  54. package/dist/context/ingest/adapters/live-database/stage.d.ts +2 -0
  55. package/dist/context/ingest/adapters/live-database/stage.js +9 -0
  56. package/dist/context/ingest/adapters/looker/mapping.d.ts +0 -3
  57. package/dist/context/ingest/adapters/looker/mapping.js +0 -3
  58. package/dist/context/ingest/adapters/looker/types.d.ts +1 -1
  59. package/dist/context/ingest/historic-sql-probes/bigquery-runner.d.ts +34 -0
  60. package/dist/context/ingest/historic-sql-probes/bigquery-runner.js +99 -0
  61. package/dist/context/ingest/historic-sql-probes/postgres-runner.d.ts +26 -0
  62. package/dist/context/ingest/historic-sql-probes/postgres-runner.js +76 -0
  63. package/dist/context/ingest/historic-sql-probes/snowflake-runner.d.ts +29 -0
  64. package/dist/context/ingest/historic-sql-probes/snowflake-runner.js +62 -0
  65. package/dist/context/ingest/historic-sql-probes.d.ts +46 -0
  66. package/dist/context/ingest/historic-sql-probes.js +62 -0
  67. package/dist/context/ingest/local-adapters.js +0 -1
  68. package/dist/context/ingest/local-ingest.js +1 -1
  69. package/dist/context/llm/claude-code-runtime.js +16 -1
  70. package/dist/context/mcp/context-tools.js +11 -48
  71. package/dist/context/mcp/local-project-ports.js +0 -3
  72. package/dist/context/project/config.d.ts +0 -8
  73. package/dist/context/project/driver-schemas.d.ts +0 -4
  74. package/dist/context/project/driver-schemas.js +0 -2
  75. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  76. package/dist/context/scan/constraint-discovery.js +23 -0
  77. package/dist/context/scan/enabled-tables.d.ts +4 -5
  78. package/dist/context/scan/enabled-tables.js +4 -18
  79. package/dist/context/scan/entity-details.js +14 -44
  80. package/dist/context/scan/local-enrichment.js +13 -1
  81. package/dist/context/scan/local-scan.js +5 -4
  82. package/dist/context/scan/local-structural-artifacts.js +51 -0
  83. package/dist/context/scan/relationship-benchmarks.js +9 -6
  84. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  85. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  86. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  87. package/dist/context/scan/relationship-discovery.js +4 -4
  88. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  89. package/dist/context/scan/relationship-profiling.js +25 -94
  90. package/dist/context/scan/relationship-validation.d.ts +3 -2
  91. package/dist/context/scan/relationship-validation.js +12 -22
  92. package/dist/context/scan/table-ref.d.ts +1 -2
  93. package/dist/context/scan/table-ref.js +3 -4
  94. package/dist/context/scan/types.d.ts +6 -2
  95. package/dist/context/scan/warehouse-catalog.js +31 -48
  96. package/dist/context/sl/local-query.js +0 -3
  97. package/dist/context/sl/local-sl.js +0 -13
  98. package/dist/context/sl/semantic-layer.service.js +1 -4
  99. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  100. package/dist/context-build-view.js +1 -1
  101. package/dist/database-tree-picker.js +14 -7
  102. package/dist/error-message.d.ts +1 -0
  103. package/dist/error-message.js +29 -0
  104. package/dist/ingest-depth.js +0 -1
  105. package/dist/ingest.js +2 -2
  106. package/dist/llm/embedding-health.js +2 -2
  107. package/dist/local-scan-connectors.js +13 -56
  108. package/dist/managed-local-embeddings.js +2 -1
  109. package/dist/managed-python-daemon.d.ts +5 -0
  110. package/dist/managed-python-daemon.js +29 -9
  111. package/dist/managed-python-http.js +2 -1
  112. package/dist/public-ingest.js +1 -6
  113. package/dist/runtime-requirements.js +2 -2
  114. package/dist/setup-agents.d.ts +1 -1
  115. package/dist/setup-agents.js +16 -74
  116. package/dist/setup-context.js +2 -1
  117. package/dist/setup-databases.d.ts +3 -13
  118. package/dist/setup-databases.js +141 -313
  119. package/dist/setup-embeddings.js +10 -2
  120. package/dist/setup-project.d.ts +0 -8
  121. package/dist/setup-project.js +3 -27
  122. package/dist/setup-runtime.js +2 -1
  123. package/dist/setup-sources.js +2 -1
  124. package/dist/setup.js +11 -18
  125. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  126. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  127. package/dist/skills/sl/SKILL.md +2 -2
  128. package/dist/sql.js +0 -4
  129. package/dist/status-project.d.ts +3 -18
  130. package/dist/status-project.js +42 -216
  131. package/dist/telemetry/events.d.ts +1 -1
  132. package/dist/telemetry/index.js +8 -3
  133. package/dist/tree-picker-state.d.ts +2 -2
  134. package/dist/tree-picker-state.js +29 -13
  135. package/dist/tree-picker-tui.d.ts +3 -1
  136. package/dist/tree-picker-tui.js +20 -32
  137. package/package.json +6 -6
  138. package/dist/admin-reindex.test.d.ts +0 -1
  139. package/dist/admin-reindex.test.js +0 -119
  140. package/dist/admin.test.d.ts +0 -1
  141. package/dist/admin.test.js +0 -201
  142. package/dist/cli-program-telemetry.test.d.ts +0 -1
  143. package/dist/cli-program-telemetry.test.js +0 -89
  144. package/dist/cli-program.test.d.ts +0 -1
  145. package/dist/cli-program.test.js +0 -71
  146. package/dist/command-tree.test.d.ts +0 -1
  147. package/dist/command-tree.test.js +0 -126
  148. package/dist/commands/mcp-commands.test.d.ts +0 -1
  149. package/dist/commands/mcp-commands.test.js +0 -111
  150. package/dist/commands/sql-commands.test.d.ts +0 -1
  151. package/dist/commands/sql-commands.test.js +0 -68
  152. package/dist/connection.test.d.ts +0 -1
  153. package/dist/connection.test.js +0 -426
  154. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  155. package/dist/connectors/bigquery/connector.test.js +0 -363
  156. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  157. package/dist/connectors/bigquery/dialect.test.js +0 -36
  158. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  159. package/dist/connectors/clickhouse/connector.test.js +0 -342
  160. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  161. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  162. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  163. package/dist/connectors/mysql/connector.test.js +0 -365
  164. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  165. package/dist/connectors/mysql/dialect.test.js +0 -36
  166. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  167. package/dist/connectors/postgres/connector.test.js +0 -391
  168. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  169. package/dist/connectors/postgres/dialect.test.js +0 -37
  170. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  171. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  172. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  173. package/dist/connectors/snowflake/connector.test.js +0 -462
  174. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  175. package/dist/connectors/snowflake/dialect.test.js +0 -34
  176. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  177. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  178. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  179. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  180. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  181. package/dist/connectors/sqlite/connector.test.js +0 -207
  182. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  183. package/dist/connectors/sqlite/dialect.test.js +0 -23
  184. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  185. package/dist/connectors/sqlserver/connector.test.js +0 -313
  186. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  187. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  188. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  189. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  190. package/dist/context/connections/dialects.test.d.ts +0 -1
  191. package/dist/context/connections/dialects.test.js +0 -24
  192. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  193. package/dist/context/connections/local-query-executor.test.js +0 -48
  194. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  195. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  196. package/dist/context/connections/notion-config.test.d.ts +0 -1
  197. package/dist/context/connections/notion-config.test.js +0 -121
  198. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  199. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  200. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  201. package/dist/context/connections/read-only-sql.test.js +0 -20
  202. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  203. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  204. package/dist/context/core/config-reference.test.d.ts +0 -1
  205. package/dist/context/core/config-reference.test.js +0 -27
  206. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  207. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  208. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  209. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  210. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  211. package/dist/context/core/git.service.patch.test.js +0 -40
  212. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  213. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  214. package/dist/context/core/git.service.test.d.ts +0 -1
  215. package/dist/context/core/git.service.test.js +0 -357
  216. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  217. package/dist/context/core/session-worktree.service.test.js +0 -97
  218. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  219. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  220. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  221. package/dist/context/index-sync/reindex.test.js +0 -139
  222. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  223. package/dist/context/ingest/action-identity.test.js +0 -19
  224. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  225. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  226. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  227. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  228. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  229. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  230. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  231. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  232. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  233. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  234. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  235. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  236. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  237. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  238. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  239. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  240. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  241. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  242. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  243. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  244. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  245. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  246. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  247. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  248. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  249. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  250. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  251. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  252. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  253. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  254. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  255. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  256. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  257. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  258. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  259. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  260. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  261. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  262. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  263. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  264. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  265. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  266. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  267. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  268. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  269. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  270. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  271. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  272. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  273. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  274. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  275. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  276. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  277. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  278. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  279. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  280. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  281. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  282. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  283. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  284. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  285. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  286. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  287. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  288. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  289. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  290. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  291. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  292. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  293. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  294. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  295. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  296. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  297. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  298. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  299. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  300. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  301. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  302. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  303. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  304. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  305. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  306. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  307. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  308. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  309. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  310. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  311. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  312. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  313. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  314. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  315. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  316. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  317. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  318. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  319. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  320. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  321. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  322. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  323. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  324. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  325. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  326. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  327. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  328. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  329. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  330. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  331. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  332. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  333. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  334. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  335. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  336. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  337. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  338. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  339. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  340. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  341. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  342. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  343. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  344. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  345. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  346. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  347. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  348. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  349. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  350. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  351. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  352. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  353. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  354. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  355. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  356. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  357. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  358. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  359. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  360. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  361. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  362. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  363. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  364. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  365. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  366. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  367. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  368. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  369. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  370. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  371. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  372. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  373. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  374. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  375. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  376. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  377. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  378. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  379. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  380. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  381. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  382. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  383. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  384. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  385. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  386. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  387. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  388. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  389. package/dist/context/ingest/artifact-gates.test.js +0 -167
  390. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  391. package/dist/context/ingest/canonical-pins.test.js +0 -66
  392. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  393. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  394. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  395. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  396. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  397. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  398. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  399. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  400. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  401. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  402. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  403. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  404. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  405. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  406. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  407. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  408. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  409. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  410. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  411. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  412. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  413. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  414. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  415. package/dist/context/ingest/diff-set.service.test.js +0 -132
  416. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  417. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  418. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  419. package/dist/context/ingest/finalization-scope.test.js +0 -114
  420. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  421. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  422. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  423. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  424. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  425. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  426. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  427. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  428. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  429. package/dist/context/ingest/ingest-trace.test.js +0 -76
  430. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  431. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  432. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  433. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  434. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  435. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  436. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  437. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  438. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  439. package/dist/context/ingest/local-adapters.test.js +0 -612
  440. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  441. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  442. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  443. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  444. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  445. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  446. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  447. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  448. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  449. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  450. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  451. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  452. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  453. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  454. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  455. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  456. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  457. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  458. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  459. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  460. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  461. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  462. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  463. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  464. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  465. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  466. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  467. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  468. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  469. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  470. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  471. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  472. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  473. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  474. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  475. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  476. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  477. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  478. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  479. package/dist/context/ingest/repo-fetch.test.js +0 -168
  480. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  481. package/dist/context/ingest/report-snapshot.test.js +0 -329
  482. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  483. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  484. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  485. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  486. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  487. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  488. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  489. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  490. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  491. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  492. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  493. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  494. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  495. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  496. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  497. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  498. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  499. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  500. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  501. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  502. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  503. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  504. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  505. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  506. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  507. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  508. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  509. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  510. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  511. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  512. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  513. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  514. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  515. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  516. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  517. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  518. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  519. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  520. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  521. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  522. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  523. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  524. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  525. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  526. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  527. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  528. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  529. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  530. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  531. package/dist/context/llm/claude-code-env.test.js +0 -17
  532. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  533. package/dist/context/llm/claude-code-models.test.js +0 -15
  534. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  535. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  536. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  537. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  538. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  539. package/dist/context/llm/embedding-port.test.js +0 -34
  540. package/dist/context/llm/local-config.test.d.ts +0 -1
  541. package/dist/context/llm/local-config.test.js +0 -164
  542. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  543. package/dist/context/llm/runtime-local-config.test.js +0 -17
  544. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  545. package/dist/context/llm/runtime-tools.test.js +0 -36
  546. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  547. package/dist/context/mcp/local-project-ports.test.js +0 -689
  548. package/dist/context/mcp/server.test.d.ts +0 -1
  549. package/dist/context/mcp/server.test.js +0 -902
  550. package/dist/context/memory/local-memory.test.d.ts +0 -1
  551. package/dist/context/memory/local-memory.test.js +0 -173
  552. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  553. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  554. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  555. package/dist/context/memory/memory-agent.service.test.js +0 -413
  556. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  557. package/dist/context/memory/memory-runs.test.js +0 -158
  558. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  559. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  560. package/dist/context/project/config.test.d.ts +0 -1
  561. package/dist/context/project/config.test.js +0 -467
  562. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  563. package/dist/context/project/driver-schemas.test.js +0 -125
  564. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  565. package/dist/context/project/local-git-file-store.test.js +0 -71
  566. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  567. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  568. package/dist/context/project/project.test.d.ts +0 -1
  569. package/dist/context/project/project.test.js +0 -55
  570. package/dist/context/project/setup-config.test.d.ts +0 -1
  571. package/dist/context/project/setup-config.test.js +0 -38
  572. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  573. package/dist/context/prompts/prompt.service.test.js +0 -43
  574. package/dist/context/scan/credentials.test.d.ts +0 -1
  575. package/dist/context/scan/credentials.test.js +0 -162
  576. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  577. package/dist/context/scan/data-dictionary.test.js +0 -92
  578. package/dist/context/scan/description-generation.test.d.ts +0 -1
  579. package/dist/context/scan/description-generation.test.js +0 -693
  580. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  581. package/dist/context/scan/embedding-text.test.js +0 -36
  582. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  583. package/dist/context/scan/enrichment-state.test.js +0 -147
  584. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  585. package/dist/context/scan/enrichment-summary.test.js +0 -34
  586. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  587. package/dist/context/scan/enrichment-types.test.js +0 -141
  588. package/dist/context/scan/entity-details.test.d.ts +0 -1
  589. package/dist/context/scan/entity-details.test.js +0 -234
  590. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  591. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  592. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  593. package/dist/context/scan/local-enrichment.test.js +0 -765
  594. package/dist/context/scan/local-scan.test.d.ts +0 -1
  595. package/dist/context/scan/local-scan.test.js +0 -1663
  596. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  597. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  598. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  599. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  600. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  601. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  602. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  603. package/dist/context/scan/relationship-budget.test.js +0 -71
  604. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  605. package/dist/context/scan/relationship-candidates.test.js +0 -747
  606. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  607. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  608. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  609. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  610. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  611. package/dist/context/scan/relationship-discovery.test.js +0 -618
  612. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  613. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  614. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  615. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  616. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  617. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  618. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  619. package/dist/context/scan/relationship-locality.test.js +0 -128
  620. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  621. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  622. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  623. package/dist/context/scan/relationship-profiling.test.js +0 -392
  624. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  625. package/dist/context/scan/relationship-scoring.test.js +0 -86
  626. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  627. package/dist/context/scan/relationship-validation.test.js +0 -455
  628. package/dist/context/scan/table-ref.test.d.ts +0 -1
  629. package/dist/context/scan/table-ref.test.js +0 -53
  630. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  631. package/dist/context/scan/type-normalization.test.js +0 -21
  632. package/dist/context/scan/types.test.d.ts +0 -1
  633. package/dist/context/scan/types.test.js +0 -206
  634. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  635. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  636. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  637. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  638. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  639. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  640. package/dist/context/search/discover.test.d.ts +0 -1
  641. package/dist/context/search/discover.test.js +0 -197
  642. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  643. package/dist/context/search/hybrid-search-core.test.js +0 -113
  644. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  645. package/dist/context/search/pglite-owner-process.test.js +0 -273
  646. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  647. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  648. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  649. package/dist/context/search/pglite-spike.test.js +0 -249
  650. package/dist/context/search/query.test.d.ts +0 -1
  651. package/dist/context/search/query.test.js +0 -23
  652. package/dist/context/search/rrf.test.d.ts +0 -1
  653. package/dist/context/search/rrf.test.js +0 -47
  654. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  655. package/dist/context/skills/skills-registry.service.test.js +0 -161
  656. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  657. package/dist/context/sl/dictionary-search.test.js +0 -204
  658. package/dist/context/sl/local-query.test.d.ts +0 -1
  659. package/dist/context/sl/local-query.test.js +0 -283
  660. package/dist/context/sl/local-sl.test.d.ts +0 -1
  661. package/dist/context/sl/local-sl.test.js +0 -334
  662. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  663. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  664. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  665. package/dist/context/sl/schemas.contract.test.js +0 -62
  666. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  667. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  668. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  669. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  670. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  671. package/dist/context/sl/sl-search.service.test.js +0 -256
  672. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  673. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  674. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  675. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  676. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  677. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  678. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  679. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  680. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  681. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  682. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  683. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  684. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  685. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  686. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  687. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  688. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  689. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  690. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  691. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  692. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  693. package/dist/context/test/make-local-git-repo.js +0 -34
  694. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  695. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  696. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  697. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  698. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  699. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  700. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  701. package/dist/context/wiki/local-knowledge.test.js +0 -270
  702. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  703. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  704. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  705. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  706. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  707. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  708. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  709. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  710. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  711. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  712. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  713. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  714. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  715. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  716. package/dist/context-build-view.test.d.ts +0 -1
  717. package/dist/context-build-view.test.js +0 -942
  718. package/dist/database-tree-picker.test.d.ts +0 -1
  719. package/dist/database-tree-picker.test.js +0 -188
  720. package/dist/demo-assets.test.d.ts +0 -1
  721. package/dist/demo-assets.test.js +0 -121
  722. package/dist/demo-metrics.test.d.ts +0 -1
  723. package/dist/demo-metrics.test.js +0 -108
  724. package/dist/doctor.test.d.ts +0 -1
  725. package/dist/doctor.test.js +0 -596
  726. package/dist/embedding-resolution.test.d.ts +0 -1
  727. package/dist/embedding-resolution.test.js +0 -132
  728. package/dist/example-smoke.test.d.ts +0 -1
  729. package/dist/example-smoke.test.js +0 -83
  730. package/dist/index.test.d.ts +0 -1
  731. package/dist/index.test.js +0 -1300
  732. package/dist/ingest-query-executor.test.d.ts +0 -1
  733. package/dist/ingest-query-executor.test.js +0 -71
  734. package/dist/ingest-report-file.test.d.ts +0 -1
  735. package/dist/ingest-report-file.test.js +0 -63
  736. package/dist/ingest-viz.test.d.ts +0 -1
  737. package/dist/ingest-viz.test.js +0 -691
  738. package/dist/ingest.test-utils.d.ts +0 -126
  739. package/dist/ingest.test-utils.js +0 -629
  740. package/dist/ingest.test.d.ts +0 -1
  741. package/dist/ingest.test.js +0 -1568
  742. package/dist/io/logger.test.d.ts +0 -1
  743. package/dist/io/logger.test.js +0 -55
  744. package/dist/io/mode.test.d.ts +0 -1
  745. package/dist/io/mode.test.js +0 -48
  746. package/dist/io/print-list.test.d.ts +0 -1
  747. package/dist/io/print-list.test.js +0 -277
  748. package/dist/knowledge.test.d.ts +0 -1
  749. package/dist/knowledge.test.js +0 -198
  750. package/dist/llm/embedding-health.test.d.ts +0 -1
  751. package/dist/llm/embedding-health.test.js +0 -72
  752. package/dist/llm/embedding-provider.test.d.ts +0 -1
  753. package/dist/llm/embedding-provider.test.js +0 -84
  754. package/dist/llm/message-builder.test.d.ts +0 -1
  755. package/dist/llm/message-builder.test.js +0 -127
  756. package/dist/llm/model-health.test.d.ts +0 -1
  757. package/dist/llm/model-health.test.js +0 -55
  758. package/dist/llm/model-provider.test.d.ts +0 -1
  759. package/dist/llm/model-provider.test.js +0 -246
  760. package/dist/llm/repair.test.d.ts +0 -1
  761. package/dist/llm/repair.test.js +0 -78
  762. package/dist/local-adapters.test.d.ts +0 -1
  763. package/dist/local-adapters.test.js +0 -166
  764. package/dist/local-scan-connectors.test.d.ts +0 -1
  765. package/dist/local-scan-connectors.test.js +0 -92
  766. package/dist/managed-local-embeddings.test.d.ts +0 -1
  767. package/dist/managed-local-embeddings.test.js +0 -229
  768. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  769. package/dist/managed-mcp-daemon.test.js +0 -187
  770. package/dist/managed-python-command.test.d.ts +0 -1
  771. package/dist/managed-python-command.test.js +0 -262
  772. package/dist/managed-python-daemon.test.d.ts +0 -1
  773. package/dist/managed-python-daemon.test.js +0 -360
  774. package/dist/managed-python-http.test.d.ts +0 -1
  775. package/dist/managed-python-http.test.js +0 -177
  776. package/dist/managed-python-runtime.test.d.ts +0 -1
  777. package/dist/managed-python-runtime.test.js +0 -426
  778. package/dist/mcp-http-server.test.d.ts +0 -1
  779. package/dist/mcp-http-server.test.js +0 -209
  780. package/dist/mcp-server-factory.test.d.ts +0 -1
  781. package/dist/mcp-server-factory.test.js +0 -142
  782. package/dist/memory-flow-interactive.test.d.ts +0 -1
  783. package/dist/memory-flow-interactive.test.js +0 -109
  784. package/dist/memory-flow-tui.test.d.ts +0 -1
  785. package/dist/memory-flow-tui.test.js +0 -247
  786. package/dist/next-steps.test.d.ts +0 -1
  787. package/dist/next-steps.test.js +0 -77
  788. package/dist/notion-page-picker.test.d.ts +0 -1
  789. package/dist/notion-page-picker.test.js +0 -244
  790. package/dist/print-command-tree.test.d.ts +0 -1
  791. package/dist/print-command-tree.test.js +0 -37
  792. package/dist/project-dir.test.d.ts +0 -1
  793. package/dist/project-dir.test.js +0 -124
  794. package/dist/project-resolver.test.d.ts +0 -1
  795. package/dist/project-resolver.test.js +0 -49
  796. package/dist/prompt-navigation.test.d.ts +0 -1
  797. package/dist/prompt-navigation.test.js +0 -33
  798. package/dist/proxy-env.test.d.ts +0 -1
  799. package/dist/proxy-env.test.js +0 -17
  800. package/dist/public-ingest-copy.test.d.ts +0 -1
  801. package/dist/public-ingest-copy.test.js +0 -24
  802. package/dist/public-ingest.test.d.ts +0 -1
  803. package/dist/public-ingest.test.js +0 -891
  804. package/dist/runtime-requirements.test.d.ts +0 -1
  805. package/dist/runtime-requirements.test.js +0 -73
  806. package/dist/runtime.test.d.ts +0 -1
  807. package/dist/runtime.test.js +0 -381
  808. package/dist/scan.test.d.ts +0 -1
  809. package/dist/scan.test.js +0 -1123
  810. package/dist/setup-agents.test.d.ts +0 -1
  811. package/dist/setup-agents.test.js +0 -1028
  812. package/dist/setup-context.test.d.ts +0 -1
  813. package/dist/setup-context.test.js +0 -491
  814. package/dist/setup-databases.test.d.ts +0 -1
  815. package/dist/setup-databases.test.js +0 -2101
  816. package/dist/setup-demo-tour.test.d.ts +0 -1
  817. package/dist/setup-demo-tour.test.js +0 -221
  818. package/dist/setup-embeddings.test.d.ts +0 -1
  819. package/dist/setup-embeddings.test.js +0 -436
  820. package/dist/setup-interrupt.test.d.ts +0 -1
  821. package/dist/setup-interrupt.test.js +0 -77
  822. package/dist/setup-models.test.d.ts +0 -1
  823. package/dist/setup-models.test.js +0 -885
  824. package/dist/setup-project.test.d.ts +0 -1
  825. package/dist/setup-project.test.js +0 -209
  826. package/dist/setup-prompts.test.d.ts +0 -1
  827. package/dist/setup-prompts.test.js +0 -208
  828. package/dist/setup-ready-menu.test.d.ts +0 -1
  829. package/dist/setup-ready-menu.test.js +0 -44
  830. package/dist/setup-runtime.test.d.ts +0 -1
  831. package/dist/setup-runtime.test.js +0 -111
  832. package/dist/setup-secrets.test.d.ts +0 -1
  833. package/dist/setup-secrets.test.js +0 -30
  834. package/dist/setup-sources-notion.test.d.ts +0 -1
  835. package/dist/setup-sources-notion.test.js +0 -109
  836. package/dist/setup-sources.test.d.ts +0 -1
  837. package/dist/setup-sources.test.js +0 -1303
  838. package/dist/setup.test.d.ts +0 -1
  839. package/dist/setup.test.js +0 -1825
  840. package/dist/sl.test.d.ts +0 -1
  841. package/dist/sl.test.js +0 -567
  842. package/dist/source-mapping.test.d.ts +0 -1
  843. package/dist/source-mapping.test.js +0 -65
  844. package/dist/sql.test.d.ts +0 -1
  845. package/dist/sql.test.js +0 -253
  846. package/dist/standalone-smoke.test.d.ts +0 -1
  847. package/dist/standalone-smoke.test.js +0 -250
  848. package/dist/status-project.test.d.ts +0 -1
  849. package/dist/status-project.test.js +0 -502
  850. package/dist/telemetry/command-hook.test.d.ts +0 -1
  851. package/dist/telemetry/command-hook.test.js +0 -31
  852. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  853. package/dist/telemetry/demo-detect.test.js +0 -22
  854. package/dist/telemetry/emitter.test.d.ts +0 -1
  855. package/dist/telemetry/emitter.test.js +0 -103
  856. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  857. package/dist/telemetry/events.snapshot.test.js +0 -135
  858. package/dist/telemetry/events.test.d.ts +0 -1
  859. package/dist/telemetry/events.test.js +0 -136
  860. package/dist/telemetry/identity.test.d.ts +0 -1
  861. package/dist/telemetry/identity.test.js +0 -148
  862. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  863. package/dist/telemetry/project-snapshot.test.js +0 -71
  864. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  865. package/dist/telemetry/schema-writer.test.js +0 -23
  866. package/dist/telemetry/scrubber.test.d.ts +0 -1
  867. package/dist/telemetry/scrubber.test.js +0 -21
  868. package/dist/text-ingest.test.d.ts +0 -1
  869. package/dist/text-ingest.test.js +0 -247
  870. package/dist/tree-picker-state.test.d.ts +0 -1
  871. package/dist/tree-picker-state.test.js +0 -303
  872. package/dist/tree-picker-tui.test.d.ts +0 -1
  873. package/dist/tree-picker-tui.test.js +0 -248
  874. package/dist/viz-fallback.test.d.ts +0 -1
  875. package/dist/viz-fallback.test.js +0 -77
@@ -1,747 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { normalizeKtxRelationshipName } from './relationship-name-similarity.js';
3
- import { generateKtxRelationshipDiscoveryCandidates, inferKtxRelationshipTargetPks, mergeKtxRelationshipDiscoveryCandidates, } from './relationship-candidates.js';
4
- function column(tableId, id, name, options = {}) {
5
- const tableRef = options.tableRef ?? { catalog: null, db: 'public', name: tableId };
6
- return {
7
- id,
8
- tableId,
9
- tableRef,
10
- name,
11
- nativeType: options.nativeType ?? 'INTEGER',
12
- normalizedType: options.normalizedType ?? 'integer',
13
- dimensionType: options.dimensionType ?? 'number',
14
- nullable: options.nullable ?? true,
15
- primaryKey: options.primaryKey ?? false,
16
- parentColumnId: options.parentColumnId ?? null,
17
- descriptions: options.descriptions ?? {},
18
- embedding: options.embedding ?? null,
19
- sampleValues: options.sampleValues ?? null,
20
- cardinality: options.cardinality ?? null,
21
- };
22
- }
23
- function table(id, name, columns) {
24
- const ref = { catalog: null, db: 'public', name };
25
- return {
26
- id,
27
- ref,
28
- enabled: true,
29
- descriptions: {},
30
- columns: columns.map((item) => ({ ...item, tableId: id, tableRef: ref })),
31
- };
32
- }
33
- function schema(tables) {
34
- return {
35
- connectionId: 'warehouse',
36
- tables,
37
- relationships: [],
38
- };
39
- }
40
- function planCodeProfiles() {
41
- return {
42
- connectionId: 'warehouse',
43
- driver: 'sqlite',
44
- sqlAvailable: true,
45
- queryCount: 0,
46
- tables: [
47
- { table: { catalog: null, db: 'public', name: 'stg_plans' }, rowCount: 4 },
48
- { table: { catalog: null, db: 'public', name: 'mart_account_segments' }, rowCount: 4 },
49
- { table: { catalog: null, db: 'public', name: 'stg_plan_segment_mapping' }, rowCount: 4 },
50
- ],
51
- warnings: [],
52
- columns: {
53
- 'stg_plans.plan_code': {
54
- table: { catalog: null, db: 'public', name: 'stg_plans' },
55
- column: 'plan_code',
56
- nativeType: 'TEXT',
57
- normalizedType: 'text',
58
- rowCount: 4,
59
- nullCount: 0,
60
- distinctCount: 4,
61
- uniquenessRatio: 1,
62
- nullRate: 0,
63
- sampleValues: ['basic', 'enterprise', 'free', 'pro'],
64
- minTextLength: 4,
65
- maxTextLength: 10,
66
- },
67
- 'stg_plans.created_at': {
68
- table: { catalog: null, db: 'public', name: 'stg_plans' },
69
- column: 'created_at',
70
- nativeType: 'TEXT',
71
- normalizedType: 'text',
72
- rowCount: 4,
73
- nullCount: 0,
74
- distinctCount: 4,
75
- uniquenessRatio: 1,
76
- nullRate: 0,
77
- sampleValues: ['2026-05-01', '2026-05-02', '2026-05-03', '2026-05-04'],
78
- minTextLength: 10,
79
- maxTextLength: 10,
80
- },
81
- 'stg_plans.email': {
82
- table: { catalog: null, db: 'public', name: 'stg_plans' },
83
- column: 'email',
84
- nativeType: 'TEXT',
85
- normalizedType: 'text',
86
- rowCount: 4,
87
- nullCount: 0,
88
- distinctCount: 4,
89
- uniquenessRatio: 1,
90
- nullRate: 0,
91
- sampleValues: ['a@example.test', 'b@example.test', 'c@example.test', 'd@example.test'],
92
- minTextLength: 14,
93
- maxTextLength: 14,
94
- },
95
- 'stg_plans.is_deleted': {
96
- table: { catalog: null, db: 'public', name: 'stg_plans' },
97
- column: 'is_deleted',
98
- nativeType: 'TEXT',
99
- normalizedType: 'text',
100
- rowCount: 4,
101
- nullCount: 0,
102
- distinctCount: 4,
103
- uniquenessRatio: 1,
104
- nullRate: 0,
105
- sampleValues: ['deleted-a', 'deleted-b', 'deleted-c', 'deleted-d'],
106
- minTextLength: 9,
107
- maxTextLength: 9,
108
- },
109
- 'mart_account_segments.current_plan_code': {
110
- table: { catalog: null, db: 'public', name: 'mart_account_segments' },
111
- column: 'current_plan_code',
112
- nativeType: 'TEXT',
113
- normalizedType: 'text',
114
- rowCount: 4,
115
- nullCount: 0,
116
- distinctCount: 4,
117
- uniquenessRatio: 1,
118
- nullRate: 0,
119
- sampleValues: ['basic', 'enterprise', 'free', 'pro'],
120
- minTextLength: 4,
121
- maxTextLength: 10,
122
- },
123
- 'mart_account_segments.normalized_plan_code': {
124
- table: { catalog: null, db: 'public', name: 'mart_account_segments' },
125
- column: 'normalized_plan_code',
126
- nativeType: 'TEXT',
127
- normalizedType: 'text',
128
- rowCount: 4,
129
- nullCount: 0,
130
- distinctCount: 4,
131
- uniquenessRatio: 1,
132
- nullRate: 0,
133
- sampleValues: ['basic', 'enterprise', 'free', 'pro'],
134
- minTextLength: 4,
135
- maxTextLength: 10,
136
- },
137
- 'stg_plan_segment_mapping.canonical_plan_code': {
138
- table: { catalog: null, db: 'public', name: 'stg_plan_segment_mapping' },
139
- column: 'canonical_plan_code',
140
- nativeType: 'TEXT',
141
- normalizedType: 'text',
142
- rowCount: 4,
143
- nullCount: 0,
144
- distinctCount: 4,
145
- uniquenessRatio: 1,
146
- nullRate: 0,
147
- sampleValues: ['basic', 'enterprise', 'free', 'pro'],
148
- minTextLength: 4,
149
- maxTextLength: 10,
150
- },
151
- 'stg_plans.canonical_plan_code': {
152
- table: { catalog: null, db: 'public', name: 'stg_plans' },
153
- column: 'canonical_plan_code',
154
- nativeType: 'TEXT',
155
- normalizedType: 'text',
156
- rowCount: 4,
157
- nullCount: 0,
158
- distinctCount: 4,
159
- uniquenessRatio: 1,
160
- nullRate: 0,
161
- sampleValues: ['basic', 'enterprise', 'free', 'pro'],
162
- minTextLength: 4,
163
- maxTextLength: 10,
164
- },
165
- },
166
- };
167
- }
168
- describe('relationship discovery candidates', () => {
169
- it('normalizes warehouse prefixes and emits review candidates without declared primary keys', () => {
170
- const accounts = table('accounts-id', 'dim_accounts', [
171
- column('accounts-id', 'accounts-id-col', 'id', { primaryKey: false }),
172
- column('accounts-id', 'accounts-name-col', 'account_name', { nativeType: 'TEXT', normalizedType: 'text' }),
173
- ]);
174
- const invoices = table('invoices-id', 'fct_invoices', [
175
- column('invoices-id', 'invoice-id-col', 'id', { primaryKey: false }),
176
- column('invoices-id', 'account-id-col', 'account_id', { primaryKey: false }),
177
- ]);
178
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([accounts, invoices]));
179
- expect(candidates).toHaveLength(1);
180
- expect(candidates[0]).toMatchObject({
181
- from: { tableId: 'invoices-id', columnIds: ['account-id-col'], columns: ['account_id'] },
182
- to: { tableId: 'accounts-id', columnIds: ['accounts-id-col'], columns: ['id'] },
183
- relationshipType: 'many_to_one',
184
- status: 'review',
185
- source: 'normalized_table_match',
186
- evidence: {
187
- sourceColumnBase: 'account',
188
- targetTableBase: 'account',
189
- targetKeyScore: 0.92,
190
- },
191
- });
192
- expect(candidates[0]?.confidence).toBeGreaterThanOrEqual(0.8);
193
- expect(candidates[0]?.evidence.signalVector).toMatchObject({
194
- nameSimilarity: 0.92,
195
- typeCompatibility: 1,
196
- valueOverlap: 0,
197
- embeddingSimilarity: 0,
198
- profileUniqueness: 0.92,
199
- });
200
- expect(candidates[0]?.evidence.scoreBreakdown?.score).toBe(candidates[0]?.confidence);
201
- expect(candidates[0]?.evidence.scoreBreakdown?.contributions.nameSimilarity).toBeGreaterThan(0);
202
- expect(candidates[0]?.evidence.reasons).toEqual(expect.arrayContaining(['foreign_key_suffix', 'normalized_table_name', 'target_key_like']));
203
- });
204
- it('generates candidates for PascalCase ID columns without declared keys', () => {
205
- const artists = table('artist-id', 'Artist', [
206
- column('artist-id', 'artist-id-col', 'ArtistId', { primaryKey: false }),
207
- column('artist-id', 'artist-name-col', 'Name', { nativeType: 'TEXT', normalizedType: 'text' }),
208
- ]);
209
- const albums = table('album-id', 'Album', [
210
- column('album-id', 'album-id-col', 'AlbumId', { primaryKey: false }),
211
- column('album-id', 'artist-id-fk-col', 'ArtistId', { primaryKey: false }),
212
- ]);
213
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([artists, albums]));
214
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).toEqual(['Album.ArtistId->Artist.ArtistId']);
215
- expect(candidates[0]).toMatchObject({
216
- source: 'normalized_table_match',
217
- evidence: {
218
- sourceColumnBase: 'artist',
219
- targetTableBase: 'artist',
220
- targetColumnBase: 'artist_id',
221
- targetKeyScore: 0.9,
222
- reasons: expect.arrayContaining(['foreign_key_suffix', 'normalized_table_name', 'target_key_like']),
223
- },
224
- });
225
- expect(candidates[0]?.confidence).toBeGreaterThanOrEqual(0.9);
226
- });
227
- it('uses the locality cap before scanning parent tables', () => {
228
- const accounts = table('accounts-id', 'accounts', [column('accounts-id', 'accounts-id-col', 'id')]);
229
- const invoices = table('invoices-id', 'invoices', [
230
- column('invoices-id', 'invoice-id-col', 'id'),
231
- column('invoices-id', 'account-id-col', 'account_id'),
232
- ]);
233
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([accounts, invoices]), {
234
- maxCandidateParentTables: 0,
235
- });
236
- expect(candidates).toEqual([]);
237
- });
238
- it('keeps the nearest parent when the locality cap is one', () => {
239
- const artists = table('artist-id', 'Artist', [
240
- column('artist-id', 'artist-id-col', 'ArtistId', { primaryKey: false }),
241
- column('artist-id', 'artist-name-col', 'Name', { nativeType: 'TEXT', normalizedType: 'text' }),
242
- ]);
243
- const albums = table('album-id', 'Album', [
244
- column('album-id', 'album-id-col', 'AlbumId', { primaryKey: false }),
245
- column('album-id', 'artist-id-fk-col', 'ArtistId', { primaryKey: false }),
246
- ]);
247
- const fillerTables = Array.from({ length: 25 }, (_, index) => table(`filler-${index}`, `WarehouseFiller${index}`, [
248
- column(`filler-${index}`, `filler-${index}-id`, 'WarehouseFillerId', { primaryKey: false }),
249
- ]));
250
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([albums, ...fillerTables, artists]), {
251
- maxCandidateParentTables: 1,
252
- });
253
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).toEqual(['Album.ArtistId->Artist.ArtistId']);
254
- });
255
- it('uses final table tokens from dotted parent table names', () => {
256
- const customers = table('customer-id', 'SalesLT.Customer', [
257
- column('customer-id', 'customer-id-col', 'CustomerID', { primaryKey: false }),
258
- column('customer-id', 'customer-name-col', 'CustomerName', { nativeType: 'TEXT', normalizedType: 'text' }),
259
- ]);
260
- const orders = table('order-id', 'SalesLT.SalesOrderHeader', [
261
- column('order-id', 'order-id-col', 'SalesOrderID', { primaryKey: false }),
262
- column('order-id', 'customer-id-fk-col', 'CustomerID', { primaryKey: false }),
263
- ]);
264
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([customers, orders]));
265
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).toEqual(['SalesLT.SalesOrderHeader.CustomerID->SalesLT.Customer.CustomerID']);
266
- expect(candidates[0]).toMatchObject({
267
- evidence: {
268
- sourceColumnBase: 'customer',
269
- targetTableBase: 'sales_lt_customer',
270
- targetColumnBase: 'customer_id',
271
- targetKeyScore: 0.9,
272
- reasons: expect.arrayContaining(['foreign_key_suffix', 'inflection', 'target_key_like']),
273
- },
274
- });
275
- });
276
- it('emits lower-confidence parent-table-name candidates when the target key name differs from the table name', () => {
277
- const customerAccounts = table('customer-account-id', 'crm.CustomerAccount', [
278
- column('customer-account-id', 'business-entity-id-col', 'BusinessEntityID', { primaryKey: true }),
279
- column('customer-account-id', 'account-name-col', 'AccountName', {
280
- nativeType: 'TEXT',
281
- normalizedType: 'text',
282
- dimensionType: 'string',
283
- }),
284
- ]);
285
- const subscriptions = table('subscriptions-id', 'fct_subscriptions', [
286
- column('subscriptions-id', 'subscription-id-col', 'SubscriptionID', { primaryKey: false }),
287
- column('subscriptions-id', 'customer-account-id-col', 'CustomerAccountID', { primaryKey: false }),
288
- ]);
289
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([customerAccounts, subscriptions]));
290
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).toEqual(['fct_subscriptions.CustomerAccountID->crm.CustomerAccount.BusinessEntityID']);
291
- expect(candidates[0]).toMatchObject({
292
- source: 'parent_table_name_match',
293
- relationshipType: 'many_to_one',
294
- status: 'review',
295
- evidence: {
296
- sourceColumnBase: 'customer_account',
297
- targetTableBase: 'crm_customer_account',
298
- targetColumnBase: 'business_entity_id',
299
- targetKeyScore: 1,
300
- nameScore: 0.82,
301
- reasons: expect.arrayContaining(['foreign_key_suffix', 'parent_table_name_match', 'target_key_like']),
302
- },
303
- });
304
- expect(candidates[0]?.evidence.signalVector).toMatchObject({
305
- nameSimilarity: 0.82,
306
- typeCompatibility: 1,
307
- });
308
- expect(candidates[0]?.evidence.scoreBreakdown?.score).toBe(candidates[0]?.confidence);
309
- });
310
- it('does not emit parent-table-name candidates when the target key type is incompatible', () => {
311
- const customerAccounts = table('customer-account-id', 'crm.CustomerAccount', [
312
- column('customer-account-id', 'business-entity-id-col', 'BusinessEntityID', {
313
- primaryKey: true,
314
- nativeType: 'TEXT',
315
- normalizedType: 'text',
316
- dimensionType: 'string',
317
- }),
318
- ]);
319
- const subscriptions = table('subscriptions-id', 'fct_subscriptions', [
320
- column('subscriptions-id', 'customer-account-id-col', 'CustomerAccountID', {
321
- primaryKey: false,
322
- nativeType: 'INTEGER',
323
- normalizedType: 'integer',
324
- dimensionType: 'number',
325
- }),
326
- ]);
327
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([customerAccounts, subscriptions]));
328
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).not.toContain('fct_subscriptions.CustomerAccountID->crm.CustomerAccount.BusinessEntityID');
329
- });
330
- it('does not use parent-table-name matching to create same-table same-column self-links', () => {
331
- const customerAccounts = table('customer-account-id', 'crm.CustomerAccount', [
332
- column('customer-account-id', 'customer-account-id-col', 'CustomerAccountID', { primaryKey: false }),
333
- column('customer-account-id', 'account-name-col', 'AccountName', {
334
- nativeType: 'TEXT',
335
- normalizedType: 'text',
336
- dimensionType: 'string',
337
- }),
338
- ]);
339
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([customerAccounts]));
340
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).not.toContain('crm.CustomerAccount.CustomerAccountID->crm.CustomerAccount.CustomerAccountID');
341
- });
342
- it('uses profile evidence to generate natural-key candidates without id-like target names', () => {
343
- const countries = table('countries-id', 'dim_countries', [
344
- column('countries-id', 'countries-code-col', 'iso_code', {
345
- nativeType: 'TEXT',
346
- normalizedType: 'text',
347
- dimensionType: 'string',
348
- }),
349
- column('countries-id', 'countries-name-col', 'name', {
350
- nativeType: 'TEXT',
351
- normalizedType: 'text',
352
- dimensionType: 'string',
353
- }),
354
- ]);
355
- const accounts = table('accounts-id', 'fct_accounts', [
356
- column('accounts-id', 'account-id-col', 'id', { primaryKey: false }),
357
- column('accounts-id', 'country-code-col', 'country_code', {
358
- nativeType: 'TEXT',
359
- normalizedType: 'text',
360
- dimensionType: 'string',
361
- }),
362
- ]);
363
- const profiles = {
364
- connectionId: 'warehouse',
365
- driver: 'sqlite',
366
- sqlAvailable: true,
367
- queryCount: 0,
368
- tables: [],
369
- warnings: [],
370
- columns: {
371
- 'dim_countries.iso_code': {
372
- table: { catalog: null, db: 'public', name: 'dim_countries' },
373
- column: 'iso_code',
374
- nativeType: 'TEXT',
375
- normalizedType: 'text',
376
- rowCount: 3,
377
- nullCount: 0,
378
- distinctCount: 3,
379
- uniquenessRatio: 1,
380
- nullRate: 0,
381
- sampleValues: ['DE', 'FR', 'US'],
382
- minTextLength: 2,
383
- maxTextLength: 2,
384
- },
385
- 'fct_accounts.country_code': {
386
- table: { catalog: null, db: 'public', name: 'fct_accounts' },
387
- column: 'country_code',
388
- nativeType: 'TEXT',
389
- normalizedType: 'text',
390
- rowCount: 4,
391
- nullCount: 0,
392
- distinctCount: 3,
393
- uniquenessRatio: 0.75,
394
- nullRate: 0,
395
- sampleValues: ['FR', 'US'],
396
- minTextLength: 2,
397
- maxTextLength: 2,
398
- },
399
- },
400
- };
401
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([countries, accounts]), { profiles });
402
- expect(candidates).toHaveLength(1);
403
- expect(candidates[0]).toMatchObject({
404
- source: 'profile_match',
405
- from: { tableId: 'accounts-id', columnIds: ['country-code-col'], columns: ['country_code'] },
406
- to: { tableId: 'countries-id', columnIds: ['countries-code-col'], columns: ['iso_code'] },
407
- evidence: {
408
- sourceColumnBase: 'country',
409
- targetTableBase: 'country',
410
- targetColumnBase: 'iso_code',
411
- targetKeyScore: 0.86,
412
- },
413
- });
414
- expect(candidates[0]?.confidence).toBeGreaterThanOrEqual(0.78);
415
- expect(candidates[0]?.evidence.reasons).toEqual(expect.arrayContaining([
416
- 'foreign_key_code_suffix',
417
- 'normalized_table_name',
418
- 'profile_unique_target',
419
- 'profile_sample_overlap',
420
- ]));
421
- });
422
- it('drops same-table same-column self-links using ordered endpoint equality', () => {
423
- const accounts = table('accounts-id', 'stg_accounts', [
424
- column('accounts-id', 'accounts-account-id-col', 'account_id', { primaryKey: false }),
425
- column('accounts-id', 'accounts-name-col', 'account_name', {
426
- nativeType: 'TEXT',
427
- normalizedType: 'text',
428
- dimensionType: 'string',
429
- }),
430
- ]);
431
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([accounts]));
432
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).not.toContain('stg_accounts.account_id->stg_accounts.account_id');
433
- });
434
- it('keeps legitimate same-table different-column self-references', () => {
435
- const employees = table('employees-id', 'employees', [
436
- column('employees-id', 'employees-id-col', 'id', { primaryKey: false }),
437
- column('employees-id', 'employees-parent-id-col', 'parent_id', { primaryKey: false }),
438
- ]);
439
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([employees]));
440
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).toContain('employees.parent_id->employees.id');
441
- expect(candidates[0]).toMatchObject({
442
- source: 'self_reference',
443
- evidence: {
444
- reasons: expect.arrayContaining(['self_reference']),
445
- },
446
- });
447
- });
448
- it('emits column_suffix_match candidates for relationship-key-shaped trailing target columns', () => {
449
- const plans = table('plans-id', 'stg_plans', [
450
- column('plans-id', 'plans-plan-code-col', 'plan_code', {
451
- nativeType: 'TEXT',
452
- normalizedType: 'text',
453
- dimensionType: 'string',
454
- }),
455
- column('plans-id', 'plans-canonical-plan-code-col', 'canonical_plan_code', {
456
- nativeType: 'TEXT',
457
- normalizedType: 'text',
458
- dimensionType: 'string',
459
- }),
460
- column('plans-id', 'plans-created-at-col', 'created_at', {
461
- nativeType: 'TEXT',
462
- normalizedType: 'text',
463
- dimensionType: 'string',
464
- }),
465
- column('plans-id', 'plans-email-col', 'email', {
466
- nativeType: 'TEXT',
467
- normalizedType: 'text',
468
- dimensionType: 'string',
469
- }),
470
- column('plans-id', 'plans-is-deleted-col', 'is_deleted', {
471
- nativeType: 'TEXT',
472
- normalizedType: 'text',
473
- dimensionType: 'string',
474
- }),
475
- ]);
476
- const accountSegments = table('account-segments-id', 'mart_account_segments', [
477
- column('account-segments-id', 'current-plan-code-col', 'current_plan_code', {
478
- nativeType: 'TEXT',
479
- normalizedType: 'text',
480
- dimensionType: 'string',
481
- }),
482
- column('account-segments-id', 'normalized-plan-code-col', 'normalized_plan_code', {
483
- nativeType: 'TEXT',
484
- normalizedType: 'text',
485
- dimensionType: 'string',
486
- }),
487
- column('account-segments-id', 'source-created-at-col', 'source_created_at', {
488
- nativeType: 'TEXT',
489
- normalizedType: 'text',
490
- dimensionType: 'string',
491
- }),
492
- column('account-segments-id', 'billing-email-col', 'billing_email', {
493
- nativeType: 'TEXT',
494
- normalizedType: 'text',
495
- dimensionType: 'string',
496
- }),
497
- column('account-segments-id', 'source-is-deleted-col', 'source_is_deleted', {
498
- nativeType: 'TEXT',
499
- normalizedType: 'text',
500
- dimensionType: 'string',
501
- }),
502
- ]);
503
- const mapping = table('mapping-id', 'stg_plan_segment_mapping', [
504
- column('mapping-id', 'mapping-canonical-plan-code-col', 'canonical_plan_code', {
505
- nativeType: 'TEXT',
506
- normalizedType: 'text',
507
- dimensionType: 'string',
508
- }),
509
- ]);
510
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([plans, accountSegments, mapping]), {
511
- profiles: planCodeProfiles(),
512
- });
513
- const candidateKeys = candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`);
514
- expect(candidateKeys).toEqual([
515
- 'mart_account_segments.current_plan_code->stg_plans.plan_code',
516
- 'mart_account_segments.normalized_plan_code->stg_plans.plan_code',
517
- 'stg_plan_segment_mapping.canonical_plan_code->stg_plans.plan_code',
518
- 'stg_plans.canonical_plan_code->stg_plans.plan_code',
519
- ]);
520
- expect(candidates).toEqual(expect.arrayContaining([
521
- expect.objectContaining({
522
- source: 'column_suffix_match',
523
- confidence: expect.any(Number),
524
- evidence: expect.objectContaining({
525
- nameScore: 0.78,
526
- targetKeyScore: 0.86,
527
- reasons: expect.arrayContaining(['column_suffix_match', 'profile_unique_target']),
528
- }),
529
- }),
530
- ]));
531
- expect(candidateKeys).not.toContain('mart_account_segments.source_created_at->stg_plans.created_at');
532
- expect(candidateKeys).not.toContain('mart_account_segments.billing_email->stg_plans.email');
533
- expect(candidateKeys).not.toContain('mart_account_segments.source_is_deleted->stg_plans.is_deleted');
534
- const suffixCandidate = candidates.find((candidate) => candidate.from.table.name === 'mart_account_segments' && candidate.from.columns[0] === 'current_plan_code');
535
- expect(suffixCandidate?.confidence).toBe(suffixCandidate?.evidence.scoreBreakdown?.score);
536
- expect(suffixCandidate?.evidence.signalVector).toMatchObject({
537
- nameSimilarity: 0.78,
538
- typeCompatibility: 1,
539
- valueOverlap: 1,
540
- profileUniqueness: 1,
541
- profileNullRate: 1,
542
- });
543
- });
544
- it('does not suffix-match bare single-token targets or incompatible target types', () => {
545
- const users = table('users-id', 'users', [
546
- column('users-id', 'users-id-col', 'id', { primaryKey: false }),
547
- column('users-id', 'users-account-id-col', 'account_id', { primaryKey: false }),
548
- ]);
549
- const plans = table('plans-id', 'plans', [
550
- column('plans-id', 'plans-plan-code-col', 'plan_code', {
551
- nativeType: 'INTEGER',
552
- normalizedType: 'integer',
553
- dimensionType: 'number',
554
- }),
555
- ]);
556
- const accounts = table('accounts-id', 'accounts', [
557
- column('accounts-id', 'current-plan-code-col', 'current_plan_code', {
558
- nativeType: 'TEXT',
559
- normalizedType: 'text',
560
- dimensionType: 'string',
561
- }),
562
- ]);
563
- const profiles = {
564
- ...planCodeProfiles(),
565
- columns: {
566
- ...planCodeProfiles().columns,
567
- 'users.id': {
568
- table: { catalog: null, db: 'public', name: 'users' },
569
- column: 'id',
570
- nativeType: 'INTEGER',
571
- normalizedType: 'integer',
572
- rowCount: 2,
573
- nullCount: 0,
574
- distinctCount: 2,
575
- uniquenessRatio: 1,
576
- nullRate: 0,
577
- sampleValues: ['1', '2'],
578
- minTextLength: 1,
579
- maxTextLength: 1,
580
- },
581
- 'plans.plan_code': {
582
- table: { catalog: null, db: 'public', name: 'plans' },
583
- column: 'plan_code',
584
- nativeType: 'INTEGER',
585
- normalizedType: 'integer',
586
- rowCount: 2,
587
- nullCount: 0,
588
- distinctCount: 2,
589
- uniquenessRatio: 1,
590
- nullRate: 0,
591
- sampleValues: ['1', '2'],
592
- minTextLength: 1,
593
- maxTextLength: 1,
594
- },
595
- },
596
- };
597
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([users, plans, accounts]), { profiles });
598
- const candidateKeys = candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`);
599
- expect(candidateKeys).not.toContain('users.account_id->users.id');
600
- expect(candidateKeys).not.toContain('accounts.current_plan_code->plans.plan_code');
601
- });
602
- it('uses column embeddings as a recall source for non-standard source names', () => {
603
- const customers = table('customers-id', 'customers', [
604
- column('customers-id', 'customers-id-col', 'id', {
605
- primaryKey: false,
606
- embedding: [1, 0, 0],
607
- }),
608
- column('customers-id', 'customers-name-col', 'name', {
609
- nativeType: 'TEXT',
610
- normalizedType: 'text',
611
- dimensionType: 'string',
612
- embedding: [0, 1, 0],
613
- }),
614
- ]);
615
- const orders = table('orders-id', 'orders', [
616
- column('orders-id', 'orders-id-col', 'id', {
617
- primaryKey: false,
618
- embedding: [0, 0, 1],
619
- }),
620
- column('orders-id', 'buyer-ref-col', 'buyer_ref', {
621
- primaryKey: false,
622
- embedding: [0.995, 0.005, 0],
623
- }),
624
- ]);
625
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([customers, orders]), {
626
- embeddingSimilarityThreshold: 0.95,
627
- });
628
- expect(candidates).toHaveLength(1);
629
- expect(candidates[0]).toMatchObject({
630
- source: 'embedding_similarity',
631
- from: { tableId: 'orders-id', columnIds: ['buyer-ref-col'], columns: ['buyer_ref'] },
632
- to: { tableId: 'customers-id', columnIds: ['customers-id-col'], columns: ['id'] },
633
- relationshipType: 'many_to_one',
634
- status: 'review',
635
- evidence: {
636
- sourceColumnBase: 'buyer_ref',
637
- targetTableBase: 'customer',
638
- targetColumnBase: 'id',
639
- targetKeyScore: 0.92,
640
- embeddingSimilarity: expect.any(Number),
641
- },
642
- });
643
- expect(candidates[0]?.confidence).toBeGreaterThanOrEqual(0.9);
644
- expect(candidates[0]?.evidence.reasons).toEqual(expect.arrayContaining(['embedding_similarity', 'target_key_like']));
645
- });
646
- it('singularizes names and caps candidates per source column deterministically', () => {
647
- const accounts = table('accounts-id', 'accounts', [column('accounts-id', 'accounts-id-col', 'id')]);
648
- const archivedAccounts = table('archived-accounts-id', 'accounts_archive', [
649
- column('archived-accounts-id', 'archived-accounts-id-col', 'id'),
650
- ]);
651
- const events = table('events-id', 'product_events', [
652
- column('events-id', 'event-id-col', 'id'),
653
- column('events-id', 'account-id-col', 'account_id'),
654
- ]);
655
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([events, archivedAccounts, accounts]), {
656
- maxCandidatesPerColumn: 1,
657
- });
658
- expect(candidates.map((candidate) => `${candidate.from.table.name}.${candidate.from.columns[0]}->${candidate.to.table.name}.${candidate.to.columns[0]}`)).toEqual(['product_events.account_id->accounts.id']);
659
- });
660
- it('infers target primary-key candidates from incoming review links', () => {
661
- const accounts = table('accounts-id', 'accounts', [column('accounts-id', 'accounts-id-col', 'id')]);
662
- const users = table('users-id', 'users', [column('users-id', 'users-id-col', 'id')]);
663
- const events = table('events-id', 'product_events', [
664
- column('events-id', 'event-id-col', 'id'),
665
- column('events-id', 'account-id-col', 'account_id'),
666
- column('events-id', 'user-id-col', 'user_id'),
667
- ]);
668
- const candidates = generateKtxRelationshipDiscoveryCandidates(schema([accounts, users, events]));
669
- const inferredPks = inferKtxRelationshipTargetPks(candidates);
670
- expect(inferredPks).toEqual([
671
- {
672
- table: 'accounts',
673
- columns: ['id'],
674
- score: expect.any(Number),
675
- status: 'review',
676
- incomingCandidateCount: 1,
677
- },
678
- {
679
- table: 'users',
680
- columns: ['id'],
681
- score: expect.any(Number),
682
- status: 'review',
683
- incomingCandidateCount: 1,
684
- },
685
- ]);
686
- expect(inferredPks.every((pk) => pk.score >= 0.8)).toBe(true);
687
- });
688
- it('does not generate candidates from primary-key source columns or incompatible target types', () => {
689
- const accounts = table('accounts-id', 'accounts', [
690
- column('accounts-id', 'accounts-id-col', 'id', { nativeType: 'TEXT', normalizedType: 'text' }),
691
- ]);
692
- const invoices = table('invoices-id', 'invoices', [
693
- column('invoices-id', 'invoice-id-col', 'id', { primaryKey: true }),
694
- column('invoices-id', 'account-id-col', 'account_id', { nativeType: 'INTEGER', normalizedType: 'integer' }),
695
- ]);
696
- expect(generateKtxRelationshipDiscoveryCandidates(schema([accounts, invoices]))).toEqual([]);
697
- });
698
- it('normalizes layer prefixes, punctuation, plural forms, and non-plural trailing s words', () => {
699
- expect(normalizeKtxRelationshipName('mart__Sales_Accounts')).toMatchObject({
700
- normalized: 'sales_accounts',
701
- singular: 'sales_account',
702
- tokens: ['sales', 'accounts'],
703
- });
704
- expect(normalizeKtxRelationshipName('dim_users')).toMatchObject({
705
- normalized: 'users',
706
- singular: 'user',
707
- tokens: ['users'],
708
- });
709
- expect(normalizeKtxRelationshipName('Address')).toMatchObject({
710
- normalized: 'address',
711
- singular: 'address',
712
- plural: 'addresses',
713
- tokens: ['address'],
714
- });
715
- });
716
- it('merges duplicate deterministic and LLM proposal candidates without losing LLM rationale', () => {
717
- const accounts = table('accounts-id', 'accounts', [column('accounts-id', 'accounts-id-col', 'id')]);
718
- const invoices = table('invoices-id', 'invoices', [column('invoices-id', 'account-id-col', 'account_id')]);
719
- const [deterministic] = generateKtxRelationshipDiscoveryCandidates(schema([accounts, invoices]));
720
- if (!deterministic) {
721
- throw new Error('Expected deterministic relationship candidate');
722
- }
723
- const llmCandidate = {
724
- ...deterministic,
725
- confidence: 0.99,
726
- source: 'llm_proposal',
727
- evidence: {
728
- ...deterministic.evidence,
729
- reasons: ['llm_proposal', 'llm_pk_proposal'],
730
- llmConfidence: 0.89,
731
- llmRationale: 'Invoices point at the owning account dimension.',
732
- },
733
- };
734
- const merged = mergeKtxRelationshipDiscoveryCandidates([deterministic, llmCandidate]);
735
- expect(merged).toHaveLength(1);
736
- expect(merged[0]).toMatchObject({
737
- id: deterministic.id,
738
- source: 'normalized_table_match',
739
- confidence: 0.99,
740
- evidence: {
741
- llmConfidence: 0.89,
742
- llmRationale: 'Invoices point at the owning account dimension.',
743
- },
744
- });
745
- expect(merged[0]?.evidence.reasons).toEqual(expect.arrayContaining(['foreign_key_suffix', 'normalized_table_name', 'target_key_like', 'llm_proposal']));
746
- });
747
- });