@kaelio/ktx 0.5.0 → 0.6.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 (872) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.6.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/mcp/context-tools.js +11 -48
  70. package/dist/context/mcp/local-project-ports.js +0 -3
  71. package/dist/context/project/config.d.ts +0 -8
  72. package/dist/context/project/driver-schemas.d.ts +0 -4
  73. package/dist/context/project/driver-schemas.js +0 -2
  74. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  75. package/dist/context/scan/constraint-discovery.js +23 -0
  76. package/dist/context/scan/enabled-tables.d.ts +4 -5
  77. package/dist/context/scan/enabled-tables.js +4 -18
  78. package/dist/context/scan/entity-details.js +14 -44
  79. package/dist/context/scan/local-enrichment.js +13 -1
  80. package/dist/context/scan/local-scan.js +5 -4
  81. package/dist/context/scan/local-structural-artifacts.js +51 -0
  82. package/dist/context/scan/relationship-benchmarks.js +9 -6
  83. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  84. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  85. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  86. package/dist/context/scan/relationship-discovery.js +4 -4
  87. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  88. package/dist/context/scan/relationship-profiling.js +25 -94
  89. package/dist/context/scan/relationship-validation.d.ts +3 -2
  90. package/dist/context/scan/relationship-validation.js +12 -22
  91. package/dist/context/scan/table-ref.d.ts +1 -2
  92. package/dist/context/scan/table-ref.js +3 -4
  93. package/dist/context/scan/types.d.ts +6 -2
  94. package/dist/context/scan/warehouse-catalog.js +31 -48
  95. package/dist/context/sl/local-query.js +0 -3
  96. package/dist/context/sl/local-sl.js +0 -13
  97. package/dist/context/sl/semantic-layer.service.js +1 -4
  98. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  99. package/dist/context-build-view.js +1 -1
  100. package/dist/database-tree-picker.js +14 -7
  101. package/dist/error-message.d.ts +1 -0
  102. package/dist/error-message.js +29 -0
  103. package/dist/ingest-depth.js +0 -1
  104. package/dist/ingest.js +2 -2
  105. package/dist/llm/embedding-health.js +2 -2
  106. package/dist/local-scan-connectors.js +13 -56
  107. package/dist/managed-local-embeddings.js +2 -1
  108. package/dist/managed-python-daemon.d.ts +5 -0
  109. package/dist/managed-python-daemon.js +29 -9
  110. package/dist/managed-python-http.js +2 -1
  111. package/dist/public-ingest.js +1 -6
  112. package/dist/runtime-requirements.js +2 -2
  113. package/dist/setup-agents.d.ts +1 -1
  114. package/dist/setup-agents.js +16 -74
  115. package/dist/setup-context.js +2 -1
  116. package/dist/setup-databases.d.ts +3 -13
  117. package/dist/setup-databases.js +141 -313
  118. package/dist/setup-embeddings.js +10 -2
  119. package/dist/setup-runtime.js +2 -1
  120. package/dist/setup-sources.js +2 -1
  121. package/dist/setup.js +10 -4
  122. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  123. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  124. package/dist/skills/sl/SKILL.md +2 -2
  125. package/dist/sql.js +0 -4
  126. package/dist/status-project.d.ts +3 -18
  127. package/dist/status-project.js +42 -216
  128. package/dist/telemetry/events.d.ts +1 -1
  129. package/dist/telemetry/index.js +8 -3
  130. package/dist/tree-picker-state.d.ts +2 -2
  131. package/dist/tree-picker-state.js +29 -13
  132. package/dist/tree-picker-tui.d.ts +3 -1
  133. package/dist/tree-picker-tui.js +20 -32
  134. package/package.json +6 -6
  135. package/dist/admin-reindex.test.d.ts +0 -1
  136. package/dist/admin-reindex.test.js +0 -119
  137. package/dist/admin.test.d.ts +0 -1
  138. package/dist/admin.test.js +0 -201
  139. package/dist/cli-program-telemetry.test.d.ts +0 -1
  140. package/dist/cli-program-telemetry.test.js +0 -89
  141. package/dist/cli-program.test.d.ts +0 -1
  142. package/dist/cli-program.test.js +0 -71
  143. package/dist/command-tree.test.d.ts +0 -1
  144. package/dist/command-tree.test.js +0 -126
  145. package/dist/commands/mcp-commands.test.d.ts +0 -1
  146. package/dist/commands/mcp-commands.test.js +0 -111
  147. package/dist/commands/sql-commands.test.d.ts +0 -1
  148. package/dist/commands/sql-commands.test.js +0 -68
  149. package/dist/connection.test.d.ts +0 -1
  150. package/dist/connection.test.js +0 -426
  151. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  152. package/dist/connectors/bigquery/connector.test.js +0 -363
  153. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  154. package/dist/connectors/bigquery/dialect.test.js +0 -36
  155. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  156. package/dist/connectors/clickhouse/connector.test.js +0 -342
  157. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  158. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  159. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  160. package/dist/connectors/mysql/connector.test.js +0 -365
  161. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  162. package/dist/connectors/mysql/dialect.test.js +0 -36
  163. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  164. package/dist/connectors/postgres/connector.test.js +0 -391
  165. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  166. package/dist/connectors/postgres/dialect.test.js +0 -37
  167. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  168. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  169. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  170. package/dist/connectors/snowflake/connector.test.js +0 -462
  171. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  172. package/dist/connectors/snowflake/dialect.test.js +0 -34
  173. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  174. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  175. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  176. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  177. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  178. package/dist/connectors/sqlite/connector.test.js +0 -207
  179. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  180. package/dist/connectors/sqlite/dialect.test.js +0 -23
  181. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  182. package/dist/connectors/sqlserver/connector.test.js +0 -313
  183. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  184. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  185. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  186. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  187. package/dist/context/connections/dialects.test.d.ts +0 -1
  188. package/dist/context/connections/dialects.test.js +0 -24
  189. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  190. package/dist/context/connections/local-query-executor.test.js +0 -48
  191. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  192. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  193. package/dist/context/connections/notion-config.test.d.ts +0 -1
  194. package/dist/context/connections/notion-config.test.js +0 -121
  195. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  196. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  197. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  198. package/dist/context/connections/read-only-sql.test.js +0 -20
  199. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  200. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  201. package/dist/context/core/config-reference.test.d.ts +0 -1
  202. package/dist/context/core/config-reference.test.js +0 -27
  203. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  204. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  205. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  206. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  207. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  208. package/dist/context/core/git.service.patch.test.js +0 -40
  209. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  210. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  211. package/dist/context/core/git.service.test.d.ts +0 -1
  212. package/dist/context/core/git.service.test.js +0 -357
  213. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  214. package/dist/context/core/session-worktree.service.test.js +0 -97
  215. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  216. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  217. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  218. package/dist/context/index-sync/reindex.test.js +0 -139
  219. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  220. package/dist/context/ingest/action-identity.test.js +0 -19
  221. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  222. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  223. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  224. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  225. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  226. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  227. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  228. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  229. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  230. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  231. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  232. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  233. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  234. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  235. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  236. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  237. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  238. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  239. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  240. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  241. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  242. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  243. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  244. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  245. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  246. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  247. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  248. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  249. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  250. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  251. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  252. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  253. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  254. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  255. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  256. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  257. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  258. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  259. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  260. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  261. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  262. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  263. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  264. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  265. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  266. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  267. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  268. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  269. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  270. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  271. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  272. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  273. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  274. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  275. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  276. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  277. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  278. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  279. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  280. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  281. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  282. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  283. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  284. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  285. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  286. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  287. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  288. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  289. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  290. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  291. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  292. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  293. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  294. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  295. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  296. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  297. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  298. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  299. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  300. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  301. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  302. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  303. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  304. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  305. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  306. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  307. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  308. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  309. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  310. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  311. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  312. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  313. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  314. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  315. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  316. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  317. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  318. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  319. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  320. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  321. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  322. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  323. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  324. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  325. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  326. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  327. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  328. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  329. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  330. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  331. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  332. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  333. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  334. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  335. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  336. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  337. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  338. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  339. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  340. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  341. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  342. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  343. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  344. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  345. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  346. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  347. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  348. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  349. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  350. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  351. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  352. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  353. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  354. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  355. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  356. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  357. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  358. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  359. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  360. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  361. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  362. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  363. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  364. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  365. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  366. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  367. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  368. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  369. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  370. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  371. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  372. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  373. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  374. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  375. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  376. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  377. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  378. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  379. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  380. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  381. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  382. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  383. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  384. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  385. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  386. package/dist/context/ingest/artifact-gates.test.js +0 -167
  387. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  388. package/dist/context/ingest/canonical-pins.test.js +0 -66
  389. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  390. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  391. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  392. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  393. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  394. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  395. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  396. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  397. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  398. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  399. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  400. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  401. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  402. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  403. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  404. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  405. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  406. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  407. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  408. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  409. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  410. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  411. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  412. package/dist/context/ingest/diff-set.service.test.js +0 -132
  413. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  414. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  415. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  416. package/dist/context/ingest/finalization-scope.test.js +0 -114
  417. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  418. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  419. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  420. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  421. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  422. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  423. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  424. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  425. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  426. package/dist/context/ingest/ingest-trace.test.js +0 -76
  427. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  428. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  429. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  430. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  431. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  432. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  433. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  434. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  435. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  436. package/dist/context/ingest/local-adapters.test.js +0 -612
  437. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  438. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  439. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  440. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  441. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  442. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  443. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  444. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  445. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  446. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  447. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  448. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  449. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  450. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  451. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  452. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  453. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  454. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  455. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  456. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  457. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  458. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  459. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  460. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  461. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  462. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  463. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  464. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  465. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  466. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  467. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  468. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  469. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  470. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  471. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  472. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  473. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  474. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  475. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  476. package/dist/context/ingest/repo-fetch.test.js +0 -168
  477. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  478. package/dist/context/ingest/report-snapshot.test.js +0 -329
  479. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  480. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  481. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  482. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  483. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  484. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  485. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  486. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  487. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  488. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  489. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  490. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  491. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  492. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  493. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  494. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  495. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  496. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  497. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  498. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  499. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  500. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  501. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  502. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  503. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  504. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  505. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  506. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  507. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  508. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  509. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  510. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  511. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  512. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  513. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  514. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  515. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  516. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  517. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  518. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  519. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  520. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  521. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  522. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  523. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  524. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  525. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  526. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  527. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  528. package/dist/context/llm/claude-code-env.test.js +0 -17
  529. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  530. package/dist/context/llm/claude-code-models.test.js +0 -15
  531. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  532. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  533. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  534. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  535. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  536. package/dist/context/llm/embedding-port.test.js +0 -34
  537. package/dist/context/llm/local-config.test.d.ts +0 -1
  538. package/dist/context/llm/local-config.test.js +0 -164
  539. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  540. package/dist/context/llm/runtime-local-config.test.js +0 -17
  541. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  542. package/dist/context/llm/runtime-tools.test.js +0 -36
  543. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  544. package/dist/context/mcp/local-project-ports.test.js +0 -689
  545. package/dist/context/mcp/server.test.d.ts +0 -1
  546. package/dist/context/mcp/server.test.js +0 -902
  547. package/dist/context/memory/local-memory.test.d.ts +0 -1
  548. package/dist/context/memory/local-memory.test.js +0 -173
  549. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  550. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  551. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  552. package/dist/context/memory/memory-agent.service.test.js +0 -413
  553. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  554. package/dist/context/memory/memory-runs.test.js +0 -158
  555. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  556. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  557. package/dist/context/project/config.test.d.ts +0 -1
  558. package/dist/context/project/config.test.js +0 -467
  559. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  560. package/dist/context/project/driver-schemas.test.js +0 -125
  561. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  562. package/dist/context/project/local-git-file-store.test.js +0 -71
  563. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  564. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  565. package/dist/context/project/project.test.d.ts +0 -1
  566. package/dist/context/project/project.test.js +0 -55
  567. package/dist/context/project/setup-config.test.d.ts +0 -1
  568. package/dist/context/project/setup-config.test.js +0 -38
  569. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  570. package/dist/context/prompts/prompt.service.test.js +0 -43
  571. package/dist/context/scan/credentials.test.d.ts +0 -1
  572. package/dist/context/scan/credentials.test.js +0 -162
  573. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  574. package/dist/context/scan/data-dictionary.test.js +0 -92
  575. package/dist/context/scan/description-generation.test.d.ts +0 -1
  576. package/dist/context/scan/description-generation.test.js +0 -693
  577. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  578. package/dist/context/scan/embedding-text.test.js +0 -36
  579. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  580. package/dist/context/scan/enrichment-state.test.js +0 -147
  581. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  582. package/dist/context/scan/enrichment-summary.test.js +0 -34
  583. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  584. package/dist/context/scan/enrichment-types.test.js +0 -141
  585. package/dist/context/scan/entity-details.test.d.ts +0 -1
  586. package/dist/context/scan/entity-details.test.js +0 -234
  587. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  588. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  589. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  590. package/dist/context/scan/local-enrichment.test.js +0 -765
  591. package/dist/context/scan/local-scan.test.d.ts +0 -1
  592. package/dist/context/scan/local-scan.test.js +0 -1663
  593. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  594. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  595. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  596. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  597. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  598. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  599. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  600. package/dist/context/scan/relationship-budget.test.js +0 -71
  601. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  602. package/dist/context/scan/relationship-candidates.test.js +0 -747
  603. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  604. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  605. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  606. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  607. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  608. package/dist/context/scan/relationship-discovery.test.js +0 -618
  609. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  610. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  611. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  612. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  613. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  614. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  615. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  616. package/dist/context/scan/relationship-locality.test.js +0 -128
  617. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  618. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  619. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  620. package/dist/context/scan/relationship-profiling.test.js +0 -392
  621. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  622. package/dist/context/scan/relationship-scoring.test.js +0 -86
  623. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  624. package/dist/context/scan/relationship-validation.test.js +0 -455
  625. package/dist/context/scan/table-ref.test.d.ts +0 -1
  626. package/dist/context/scan/table-ref.test.js +0 -53
  627. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  628. package/dist/context/scan/type-normalization.test.js +0 -21
  629. package/dist/context/scan/types.test.d.ts +0 -1
  630. package/dist/context/scan/types.test.js +0 -206
  631. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  632. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  633. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  634. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  635. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  636. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  637. package/dist/context/search/discover.test.d.ts +0 -1
  638. package/dist/context/search/discover.test.js +0 -197
  639. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  640. package/dist/context/search/hybrid-search-core.test.js +0 -113
  641. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  642. package/dist/context/search/pglite-owner-process.test.js +0 -273
  643. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  644. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  645. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  646. package/dist/context/search/pglite-spike.test.js +0 -249
  647. package/dist/context/search/query.test.d.ts +0 -1
  648. package/dist/context/search/query.test.js +0 -23
  649. package/dist/context/search/rrf.test.d.ts +0 -1
  650. package/dist/context/search/rrf.test.js +0 -47
  651. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  652. package/dist/context/skills/skills-registry.service.test.js +0 -161
  653. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  654. package/dist/context/sl/dictionary-search.test.js +0 -204
  655. package/dist/context/sl/local-query.test.d.ts +0 -1
  656. package/dist/context/sl/local-query.test.js +0 -283
  657. package/dist/context/sl/local-sl.test.d.ts +0 -1
  658. package/dist/context/sl/local-sl.test.js +0 -334
  659. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  660. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  661. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  662. package/dist/context/sl/schemas.contract.test.js +0 -62
  663. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  664. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  665. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  666. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  667. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  668. package/dist/context/sl/sl-search.service.test.js +0 -256
  669. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  670. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  671. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  672. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  673. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  674. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  675. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  676. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  677. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  678. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  679. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  680. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  681. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  682. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  683. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  684. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  685. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  686. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  687. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  688. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  689. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  690. package/dist/context/test/make-local-git-repo.js +0 -34
  691. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  692. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  693. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  694. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  695. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  696. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  697. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  698. package/dist/context/wiki/local-knowledge.test.js +0 -270
  699. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  700. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  701. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  702. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  703. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  704. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  705. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  706. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  707. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  708. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  709. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  710. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  711. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  712. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  713. package/dist/context-build-view.test.d.ts +0 -1
  714. package/dist/context-build-view.test.js +0 -942
  715. package/dist/database-tree-picker.test.d.ts +0 -1
  716. package/dist/database-tree-picker.test.js +0 -188
  717. package/dist/demo-assets.test.d.ts +0 -1
  718. package/dist/demo-assets.test.js +0 -121
  719. package/dist/demo-metrics.test.d.ts +0 -1
  720. package/dist/demo-metrics.test.js +0 -108
  721. package/dist/doctor.test.d.ts +0 -1
  722. package/dist/doctor.test.js +0 -596
  723. package/dist/embedding-resolution.test.d.ts +0 -1
  724. package/dist/embedding-resolution.test.js +0 -132
  725. package/dist/example-smoke.test.d.ts +0 -1
  726. package/dist/example-smoke.test.js +0 -83
  727. package/dist/index.test.d.ts +0 -1
  728. package/dist/index.test.js +0 -1300
  729. package/dist/ingest-query-executor.test.d.ts +0 -1
  730. package/dist/ingest-query-executor.test.js +0 -71
  731. package/dist/ingest-report-file.test.d.ts +0 -1
  732. package/dist/ingest-report-file.test.js +0 -63
  733. package/dist/ingest-viz.test.d.ts +0 -1
  734. package/dist/ingest-viz.test.js +0 -691
  735. package/dist/ingest.test-utils.d.ts +0 -126
  736. package/dist/ingest.test-utils.js +0 -629
  737. package/dist/ingest.test.d.ts +0 -1
  738. package/dist/ingest.test.js +0 -1568
  739. package/dist/io/logger.test.d.ts +0 -1
  740. package/dist/io/logger.test.js +0 -55
  741. package/dist/io/mode.test.d.ts +0 -1
  742. package/dist/io/mode.test.js +0 -48
  743. package/dist/io/print-list.test.d.ts +0 -1
  744. package/dist/io/print-list.test.js +0 -277
  745. package/dist/knowledge.test.d.ts +0 -1
  746. package/dist/knowledge.test.js +0 -198
  747. package/dist/llm/embedding-health.test.d.ts +0 -1
  748. package/dist/llm/embedding-health.test.js +0 -72
  749. package/dist/llm/embedding-provider.test.d.ts +0 -1
  750. package/dist/llm/embedding-provider.test.js +0 -84
  751. package/dist/llm/message-builder.test.d.ts +0 -1
  752. package/dist/llm/message-builder.test.js +0 -127
  753. package/dist/llm/model-health.test.d.ts +0 -1
  754. package/dist/llm/model-health.test.js +0 -55
  755. package/dist/llm/model-provider.test.d.ts +0 -1
  756. package/dist/llm/model-provider.test.js +0 -246
  757. package/dist/llm/repair.test.d.ts +0 -1
  758. package/dist/llm/repair.test.js +0 -78
  759. package/dist/local-adapters.test.d.ts +0 -1
  760. package/dist/local-adapters.test.js +0 -166
  761. package/dist/local-scan-connectors.test.d.ts +0 -1
  762. package/dist/local-scan-connectors.test.js +0 -92
  763. package/dist/managed-local-embeddings.test.d.ts +0 -1
  764. package/dist/managed-local-embeddings.test.js +0 -229
  765. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  766. package/dist/managed-mcp-daemon.test.js +0 -187
  767. package/dist/managed-python-command.test.d.ts +0 -1
  768. package/dist/managed-python-command.test.js +0 -262
  769. package/dist/managed-python-daemon.test.d.ts +0 -1
  770. package/dist/managed-python-daemon.test.js +0 -360
  771. package/dist/managed-python-http.test.d.ts +0 -1
  772. package/dist/managed-python-http.test.js +0 -177
  773. package/dist/managed-python-runtime.test.d.ts +0 -1
  774. package/dist/managed-python-runtime.test.js +0 -426
  775. package/dist/mcp-http-server.test.d.ts +0 -1
  776. package/dist/mcp-http-server.test.js +0 -209
  777. package/dist/mcp-server-factory.test.d.ts +0 -1
  778. package/dist/mcp-server-factory.test.js +0 -142
  779. package/dist/memory-flow-interactive.test.d.ts +0 -1
  780. package/dist/memory-flow-interactive.test.js +0 -109
  781. package/dist/memory-flow-tui.test.d.ts +0 -1
  782. package/dist/memory-flow-tui.test.js +0 -247
  783. package/dist/next-steps.test.d.ts +0 -1
  784. package/dist/next-steps.test.js +0 -77
  785. package/dist/notion-page-picker.test.d.ts +0 -1
  786. package/dist/notion-page-picker.test.js +0 -244
  787. package/dist/print-command-tree.test.d.ts +0 -1
  788. package/dist/print-command-tree.test.js +0 -37
  789. package/dist/project-dir.test.d.ts +0 -1
  790. package/dist/project-dir.test.js +0 -124
  791. package/dist/project-resolver.test.d.ts +0 -1
  792. package/dist/project-resolver.test.js +0 -49
  793. package/dist/prompt-navigation.test.d.ts +0 -1
  794. package/dist/prompt-navigation.test.js +0 -33
  795. package/dist/proxy-env.test.d.ts +0 -1
  796. package/dist/proxy-env.test.js +0 -17
  797. package/dist/public-ingest-copy.test.d.ts +0 -1
  798. package/dist/public-ingest-copy.test.js +0 -24
  799. package/dist/public-ingest.test.d.ts +0 -1
  800. package/dist/public-ingest.test.js +0 -891
  801. package/dist/runtime-requirements.test.d.ts +0 -1
  802. package/dist/runtime-requirements.test.js +0 -73
  803. package/dist/runtime.test.d.ts +0 -1
  804. package/dist/runtime.test.js +0 -381
  805. package/dist/scan.test.d.ts +0 -1
  806. package/dist/scan.test.js +0 -1123
  807. package/dist/setup-agents.test.d.ts +0 -1
  808. package/dist/setup-agents.test.js +0 -1028
  809. package/dist/setup-context.test.d.ts +0 -1
  810. package/dist/setup-context.test.js +0 -491
  811. package/dist/setup-databases.test.d.ts +0 -1
  812. package/dist/setup-databases.test.js +0 -2101
  813. package/dist/setup-demo-tour.test.d.ts +0 -1
  814. package/dist/setup-demo-tour.test.js +0 -221
  815. package/dist/setup-embeddings.test.d.ts +0 -1
  816. package/dist/setup-embeddings.test.js +0 -436
  817. package/dist/setup-interrupt.test.d.ts +0 -1
  818. package/dist/setup-interrupt.test.js +0 -77
  819. package/dist/setup-models.test.d.ts +0 -1
  820. package/dist/setup-models.test.js +0 -885
  821. package/dist/setup-project.test.d.ts +0 -1
  822. package/dist/setup-project.test.js +0 -209
  823. package/dist/setup-prompts.test.d.ts +0 -1
  824. package/dist/setup-prompts.test.js +0 -208
  825. package/dist/setup-ready-menu.test.d.ts +0 -1
  826. package/dist/setup-ready-menu.test.js +0 -44
  827. package/dist/setup-runtime.test.d.ts +0 -1
  828. package/dist/setup-runtime.test.js +0 -111
  829. package/dist/setup-secrets.test.d.ts +0 -1
  830. package/dist/setup-secrets.test.js +0 -30
  831. package/dist/setup-sources-notion.test.d.ts +0 -1
  832. package/dist/setup-sources-notion.test.js +0 -109
  833. package/dist/setup-sources.test.d.ts +0 -1
  834. package/dist/setup-sources.test.js +0 -1303
  835. package/dist/setup.test.d.ts +0 -1
  836. package/dist/setup.test.js +0 -1825
  837. package/dist/sl.test.d.ts +0 -1
  838. package/dist/sl.test.js +0 -567
  839. package/dist/source-mapping.test.d.ts +0 -1
  840. package/dist/source-mapping.test.js +0 -65
  841. package/dist/sql.test.d.ts +0 -1
  842. package/dist/sql.test.js +0 -253
  843. package/dist/standalone-smoke.test.d.ts +0 -1
  844. package/dist/standalone-smoke.test.js +0 -250
  845. package/dist/status-project.test.d.ts +0 -1
  846. package/dist/status-project.test.js +0 -502
  847. package/dist/telemetry/command-hook.test.d.ts +0 -1
  848. package/dist/telemetry/command-hook.test.js +0 -31
  849. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  850. package/dist/telemetry/demo-detect.test.js +0 -22
  851. package/dist/telemetry/emitter.test.d.ts +0 -1
  852. package/dist/telemetry/emitter.test.js +0 -103
  853. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  854. package/dist/telemetry/events.snapshot.test.js +0 -135
  855. package/dist/telemetry/events.test.d.ts +0 -1
  856. package/dist/telemetry/events.test.js +0 -136
  857. package/dist/telemetry/identity.test.d.ts +0 -1
  858. package/dist/telemetry/identity.test.js +0 -148
  859. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  860. package/dist/telemetry/project-snapshot.test.js +0 -71
  861. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  862. package/dist/telemetry/schema-writer.test.js +0 -23
  863. package/dist/telemetry/scrubber.test.d.ts +0 -1
  864. package/dist/telemetry/scrubber.test.js +0 -21
  865. package/dist/text-ingest.test.d.ts +0 -1
  866. package/dist/text-ingest.test.js +0 -247
  867. package/dist/tree-picker-state.test.d.ts +0 -1
  868. package/dist/tree-picker-state.test.js +0 -303
  869. package/dist/tree-picker-tui.test.d.ts +0 -1
  870. package/dist/tree-picker-tui.test.js +0 -248
  871. package/dist/viz-fallback.test.d.ts +0 -1
  872. package/dist/viz-fallback.test.js +0 -77
@@ -1,1072 +0,0 @@
1
- import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { describe, expect, it } from 'vitest';
5
- import { currentKtxRelationshipBenchmarkDetector, loadKtxRelationshipBenchmarkFixture, loadKtxRelationshipBenchmarkFixtures, maskKtxRelationshipBenchmarkSnapshot, runKtxRelationshipBenchmarkCase, runKtxRelationshipBenchmarkSuite, } from './relationship-benchmarks.js';
6
- const EXPECTED_LINKS = {
7
- expectedPks: [
8
- { table: 'accounts', columns: ['id'] },
9
- { table: 'users', columns: ['id'] },
10
- ],
11
- expectedLinks: [
12
- {
13
- fromTable: 'users',
14
- fromColumns: ['account_id'],
15
- toTable: 'accounts',
16
- toColumns: ['id'],
17
- relationship: 'many_to_one',
18
- },
19
- ],
20
- };
21
- const CHECKED_IN_FIXTURE_ORIGINS = {
22
- abbreviated_old_no_declared_constraints: 'synthetic',
23
- adventureworks_oltp_with_declared_metadata: 'public',
24
- adventureworkslt_with_declared_metadata: 'public',
25
- analytical_warehouse_no_naming_convention: 'synthetic',
26
- chinook_with_declared_metadata: 'public',
27
- composite_keys_no_declared_constraints: 'synthetic',
28
- demo_b2b_declared_metadata: 'synthetic',
29
- demo_b2b_no_declared_constraints: 'synthetic',
30
- mixed_case_within_schema_no_declared_constraints: 'synthetic',
31
- natural_keys_no_declared_constraints: 'synthetic',
32
- non_english_naming_no_declared_constraints: 'synthetic',
33
- northwind_with_declared_metadata: 'public',
34
- orbit_style_product_no_declared_constraints: 'synthetic',
35
- plan_code_no_declared_constraints: 'synthetic',
36
- polymorphic_partial_overlap_no_declared_constraints: 'synthetic',
37
- sakila_with_declared_metadata: 'public',
38
- scale_stress_no_declared_constraints: 'synthetic',
39
- semantic_embedding_aliases_no_declared_constraints: 'synthetic',
40
- };
41
- function runAdHocRelationshipBenchmarks() {
42
- return process.env.KTX_RUN_RELATIONSHIP_BENCHMARKS === '1';
43
- }
44
- const adHocRelationshipBenchmarkIt = runAdHocRelationshipBenchmarks() ? it : it.skip;
45
- function snapshot() {
46
- return {
47
- connectionId: 'warehouse',
48
- driver: 'sqlite',
49
- extractedAt: '2026-05-07T00:00:00.000Z',
50
- scope: {},
51
- metadata: {},
52
- tables: [
53
- {
54
- catalog: null,
55
- db: 'main',
56
- name: 'accounts',
57
- kind: 'table',
58
- comment: null,
59
- estimatedRows: 2,
60
- columns: [
61
- {
62
- name: 'id',
63
- nativeType: 'INTEGER',
64
- normalizedType: 'integer',
65
- dimensionType: 'number',
66
- nullable: false,
67
- primaryKey: true,
68
- comment: null,
69
- },
70
- {
71
- name: 'name',
72
- nativeType: 'TEXT',
73
- normalizedType: 'text',
74
- dimensionType: 'string',
75
- nullable: false,
76
- primaryKey: false,
77
- comment: null,
78
- },
79
- ],
80
- foreignKeys: [],
81
- },
82
- {
83
- catalog: null,
84
- db: 'main',
85
- name: 'users',
86
- kind: 'table',
87
- comment: null,
88
- estimatedRows: 3,
89
- columns: [
90
- {
91
- name: 'id',
92
- nativeType: 'INTEGER',
93
- normalizedType: 'integer',
94
- dimensionType: 'number',
95
- nullable: false,
96
- primaryKey: true,
97
- comment: null,
98
- },
99
- {
100
- name: 'account_id',
101
- nativeType: 'INTEGER',
102
- normalizedType: 'integer',
103
- dimensionType: 'number',
104
- nullable: false,
105
- primaryKey: false,
106
- comment: null,
107
- },
108
- ],
109
- foreignKeys: [
110
- {
111
- fromColumn: 'account_id',
112
- toCatalog: null,
113
- toDb: 'main',
114
- toTable: 'accounts',
115
- toColumn: 'id',
116
- constraintName: 'users_account_id_fkey',
117
- },
118
- ],
119
- },
120
- ],
121
- };
122
- }
123
- describe('relationship benchmarks', () => {
124
- it('keeps the current benchmark detector on the relationship-discovery path only', async () => {
125
- const source = await readFile(new URL('relationship-benchmarks.ts', import.meta.url), 'utf-8');
126
- expect(source).not.toMatch(/KtxRelationshipDetector/);
127
- expect(source).not.toMatch(/relationship-detection\.js/);
128
- expect(source).not.toMatch(/\bacceptedLinks\b/);
129
- expect(source).toMatch(/generateKtxRelationshipDiscoveryCandidates/);
130
- expect(source).toMatch(/validateKtxRelationshipDiscoveryCandidates/);
131
- expect(source).toMatch(/resolveKtxRelationshipGraph/);
132
- });
133
- it('scores the current detector with declared metadata present', async () => {
134
- const result = await runKtxRelationshipBenchmarkCase({
135
- fixture: {
136
- id: 'mini_declared',
137
- name: 'Mini declared fixture',
138
- tier: 'unit',
139
- origin: 'synthetic',
140
- snapshot: snapshot(),
141
- expected: EXPECTED_LINKS,
142
- defaultModes: ['metadata_present'],
143
- dataPath: null,
144
- columnEmbeddings: {},
145
- },
146
- mode: 'metadata_present',
147
- detector: currentKtxRelationshipBenchmarkDetector(),
148
- });
149
- expect(result.metrics.pkRecall).toBe(1);
150
- expect(result.metrics.pkPrecision).toBe(1);
151
- expect(result.metrics.fkRecall).toBe(1);
152
- expect(result.metrics.fkPrecision).toBe(1);
153
- expect(result.falseNegatives.fk).toEqual([]);
154
- expect(result.predicted.fk).toEqual(['users.(account_id)->accounts.(id)']);
155
- });
156
- it('keeps no-declared-constraint misses in benchmark metrics', async () => {
157
- const result = await runKtxRelationshipBenchmarkCase({
158
- fixture: {
159
- id: 'mini_no_declared',
160
- name: 'Mini no declared fixture',
161
- tier: 'unit',
162
- origin: 'synthetic',
163
- snapshot: snapshot(),
164
- expected: EXPECTED_LINKS,
165
- defaultModes: ['declared_pks_and_declared_fks_removed'],
166
- dataPath: null,
167
- columnEmbeddings: {},
168
- },
169
- mode: 'declared_pks_and_declared_fks_removed',
170
- detector: currentKtxRelationshipBenchmarkDetector(),
171
- });
172
- expect(result.metrics.pkRecall).toBe(0.5);
173
- expect(result.metrics.fkRecall).toBe(0);
174
- expect(result.metrics.reviewRecall).toBe(1);
175
- expect(result.metrics.acceptedOrReviewRecall).toBe(1);
176
- expect(result.falseNegatives.pk).toEqual(['users.(id)']);
177
- expect(result.falseNegatives.fk).toEqual([]);
178
- expect(result.predicted.acceptedFk).toEqual([]);
179
- expect(result.predicted.reviewFk).toEqual(['users.(account_id)->accounts.(id)']);
180
- });
181
- it('keeps composite ground truth in recall denominators and skipped-composite buckets', async () => {
182
- const compositeExpected = {
183
- expectedPks: [{ table: 'order_lines', columns: ['order_id', 'line_number'] }],
184
- expectedLinks: [
185
- {
186
- fromTable: 'order_line_allocations',
187
- fromColumns: ['order_id', 'line_number'],
188
- toTable: 'order_lines',
189
- toColumns: ['order_id', 'line_number'],
190
- relationship: 'many_to_one',
191
- },
192
- ],
193
- };
194
- const emptyDetector = {
195
- async detect() {
196
- return {
197
- pks: [],
198
- links: [],
199
- validationBlocked: false,
200
- sqlQueries: 0,
201
- llmCalls: 0,
202
- runtimeSeconds: 0.001,
203
- };
204
- },
205
- };
206
- const result = await runKtxRelationshipBenchmarkCase({
207
- fixture: {
208
- id: 'composite_no_declared',
209
- name: 'Composite relationship fixture without declared constraints',
210
- tier: 'row_bearing',
211
- origin: 'synthetic',
212
- snapshot: snapshot(),
213
- expected: compositeExpected,
214
- defaultModes: ['declared_pks_and_declared_fks_removed'],
215
- dataPath: null,
216
- columnEmbeddings: {},
217
- },
218
- mode: 'declared_pks_and_declared_fks_removed',
219
- detector: emptyDetector,
220
- });
221
- expect(result.expected.pk).toEqual(['order_lines.(order_id,line_number)']);
222
- expect(result.expected.fk).toEqual([
223
- 'order_line_allocations.(order_id,line_number)->order_lines.(order_id,line_number)',
224
- ]);
225
- expect(result.metrics.pkRecall).toBe(0);
226
- expect(result.metrics.fkRecall).toBe(0);
227
- expect(result.falseNegatives.pk).toEqual(['order_lines.(order_id,line_number)']);
228
- expect(result.falseNegatives.fk).toEqual([
229
- 'order_line_allocations.(order_id,line_number)->order_lines.(order_id,line_number)',
230
- ]);
231
- expect(result.skippedComposite).toEqual({
232
- pk: ['order_lines.(order_id,line_number)'],
233
- fk: ['order_line_allocations.(order_id,line_number)->order_lines.(order_id,line_number)'],
234
- });
235
- });
236
- it('loads the composite-key fixture and accepts composite ground truth as headline evidence', async () => {
237
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
238
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'composite_keys_no_declared_constraints'));
239
- expect(fixture.tier).toBe('row_bearing');
240
- expect(fixture.defaultModes).toEqual([
241
- 'declared_pks_and_declared_fks_removed',
242
- 'llm_disabled',
243
- 'profiling_disabled',
244
- 'validation_disabled',
245
- 'embeddings_disabled',
246
- ]);
247
- expect(fixture.dataPath).toMatch(/composite_keys_no_declared_constraints\/data\.sqlite$/);
248
- const suite = await runKtxRelationshipBenchmarkSuite({
249
- fixtures: [fixture],
250
- detector: currentKtxRelationshipBenchmarkDetector(),
251
- });
252
- const headline = suite.cases.find((item) => item.fixtureId === 'composite_keys_no_declared_constraints' &&
253
- item.mode === 'declared_pks_and_declared_fks_removed');
254
- const profilingDisabled = suite.cases.find((item) => item.fixtureId === 'composite_keys_no_declared_constraints' && item.mode === 'profiling_disabled');
255
- const validationDisabled = suite.cases.find((item) => item.fixtureId === 'composite_keys_no_declared_constraints' && item.mode === 'validation_disabled');
256
- const compositePks = [
257
- 'order_line_allocations.(order_id,line_number,warehouse_code)',
258
- 'order_lines.(order_id,line_number)',
259
- ];
260
- const compositeFk = ['order_line_allocations.(order_id,line_number)->order_lines.(order_id,line_number)'];
261
- expect(headline?.expected.pk).toEqual(compositePks);
262
- expect(headline?.expected.fk).toEqual(compositeFk);
263
- expect(headline?.predicted.pk).toEqual(compositePks);
264
- expect(headline?.predicted.acceptedFk).toEqual(compositeFk);
265
- expect(headline?.predicted.reviewFk).toEqual([]);
266
- expect(headline?.metrics.pkRecall).toBe(1);
267
- expect(headline?.metrics.fkRecall).toBe(1);
268
- expect(headline?.metrics.acceptedOrReviewRecall).toBe(1);
269
- expect(headline?.metrics.acceptedFalsePositiveCount).toBe(0);
270
- expect(headline?.falseNegatives.pk).toEqual([]);
271
- expect(headline?.falseNegatives.fk).toEqual([]);
272
- expect(headline?.skippedComposite).toEqual({
273
- pk: [],
274
- fk: [],
275
- });
276
- expect(profilingDisabled?.validationBlocked).toBe(true);
277
- expect(validationDisabled?.validationBlocked).toBe(true);
278
- expect(suite.validationBlockedCases).toEqual([
279
- 'composite_keys_no_declared_constraints:profiling_disabled',
280
- 'composite_keys_no_declared_constraints:validation_disabled',
281
- ]);
282
- expect(suite.aggregate.headlineCaseCount).toBe(1);
283
- expect(suite.aggregate.headlinePkRecall).toBe(1);
284
- expect(suite.aggregate.headlineFkRecall).toBe(1);
285
- });
286
- it('counts formal metadata links in metadata-present mode without SQL validation', async () => {
287
- const source = snapshot();
288
- const fixture = {
289
- id: 'declared_without_sql',
290
- name: 'Declared relationships without SQL validation',
291
- tier: 'unit',
292
- origin: 'synthetic',
293
- snapshot: {
294
- ...source,
295
- tables: source.tables.map((table) => table.name === 'accounts'
296
- ? {
297
- ...table,
298
- columns: table.columns.map((column) => column.name === 'id' ? { ...column, primaryKey: true } : column),
299
- }
300
- : table.name === 'users'
301
- ? {
302
- ...table,
303
- foreignKeys: [
304
- {
305
- fromColumn: 'account_id',
306
- toCatalog: null,
307
- toDb: null,
308
- toTable: 'accounts',
309
- toColumn: 'id',
310
- constraintName: 'users_account_id_fkey',
311
- },
312
- ],
313
- }
314
- : table),
315
- },
316
- expected: EXPECTED_LINKS,
317
- defaultModes: ['metadata_present'],
318
- dataPath: null,
319
- columnEmbeddings: {},
320
- };
321
- const result = await runKtxRelationshipBenchmarkCase({
322
- fixture,
323
- mode: 'metadata_present',
324
- });
325
- expect(result.validationBlocked).toBe(false);
326
- expect(result.predicted.acceptedFk).toEqual(['users.(account_id)->accounts.(id)']);
327
- expect(result.metrics.fkRecall).toBe(1);
328
- expect(result.metrics.fkPrecision).toBe(1);
329
- });
330
- it('masks primary keys and foreign keys independently', () => {
331
- const pksRemoved = maskKtxRelationshipBenchmarkSnapshot(snapshot(), 'declared_pks_removed');
332
- const fksRemoved = maskKtxRelationshipBenchmarkSnapshot(snapshot(), 'declared_fks_removed');
333
- expect(pksRemoved.tables.flatMap((table) => table.columns.filter((column) => column.primaryKey))).toEqual([]);
334
- expect(pksRemoved.tables.find((table) => table.name === 'users')?.foreignKeys).toHaveLength(1);
335
- expect(fksRemoved.tables.find((table) => table.name === 'accounts')?.columns[0]?.primaryKey).toBe(true);
336
- expect(fksRemoved.tables.find((table) => table.name === 'users')?.foreignKeys).toEqual([]);
337
- });
338
- it('loads fixture.yaml, snapshot.json, and expected-links.yaml from a fixture directory', async () => {
339
- const fixtureDir = await mkdtemp(join(tmpdir(), 'ktx-relationship-fixture-'));
340
- try {
341
- await writeFile(join(fixtureDir, 'fixture.yaml'), [
342
- 'id: mini_loaded',
343
- 'name: Mini loaded fixture',
344
- 'tier: unit',
345
- 'origin: synthetic',
346
- 'validationBudget: 3',
347
- 'defaultModes:',
348
- ' - metadata_present',
349
- ' - declared_pks_and_declared_fks_removed',
350
- '',
351
- ].join('\n'));
352
- await writeFile(join(fixtureDir, 'snapshot.json'), `${JSON.stringify(snapshot(), null, 2)}\n`);
353
- await writeFile(join(fixtureDir, 'column-embeddings.json'), `${JSON.stringify({
354
- 'accounts.id': [1, 0, 0],
355
- 'users.account_id': [0.99, 0.01, 0],
356
- }, null, 2)}\n`);
357
- await writeFile(join(fixtureDir, 'expected-links.yaml'), [
358
- 'expectedPks:',
359
- ' - table: accounts',
360
- ' columns: [id]',
361
- ' - table: users',
362
- ' columns: [id]',
363
- 'expectedLinks:',
364
- ' - fromTable: users',
365
- ' fromColumns: [account_id]',
366
- ' toTable: accounts',
367
- ' toColumns: [id]',
368
- ' relationship: many_to_one',
369
- '',
370
- ].join('\n'));
371
- await expect(loadKtxRelationshipBenchmarkFixture(fixtureDir)).resolves.toMatchObject({
372
- id: 'mini_loaded',
373
- origin: 'synthetic',
374
- validationBudget: 3,
375
- defaultModes: ['metadata_present', 'declared_pks_and_declared_fks_removed'],
376
- columnEmbeddings: {
377
- 'accounts.id': [1, 0, 0],
378
- 'users.account_id': [0.99, 0.01, 0],
379
- },
380
- expected: {
381
- expectedLinks: [
382
- {
383
- fromTable: 'users',
384
- fromColumns: ['account_id'],
385
- toTable: 'accounts',
386
- toColumns: ['id'],
387
- relationship: 'many_to_one',
388
- },
389
- ],
390
- },
391
- });
392
- await expect(readFile(join(fixtureDir, 'snapshot.json'), 'utf-8')).resolves.toContain('"connectionId": "warehouse"');
393
- }
394
- finally {
395
- await rm(fixtureDir, { recursive: true, force: true });
396
- }
397
- });
398
- it('passes fixture validation budgets into benchmark detectors', async () => {
399
- const seenBudgets = [];
400
- const detector = {
401
- async detect(input) {
402
- seenBudgets.push(input.validationBudget);
403
- return {
404
- pks: [],
405
- links: [],
406
- validationBlocked: false,
407
- sqlQueries: 0,
408
- llmCalls: 0,
409
- runtimeSeconds: 0.001,
410
- };
411
- },
412
- };
413
- await runKtxRelationshipBenchmarkSuite({
414
- fixtures: [
415
- {
416
- id: 'budgeted_fixture',
417
- name: 'Budgeted fixture',
418
- tier: 'row_bearing',
419
- origin: 'synthetic',
420
- validationBudget: 0,
421
- snapshot: snapshot(),
422
- expected: EXPECTED_LINKS,
423
- defaultModes: ['declared_pks_and_declared_fks_removed'],
424
- dataPath: null,
425
- columnEmbeddings: {},
426
- },
427
- {
428
- id: 'unbudgeted_fixture',
429
- name: 'Unbudgeted fixture',
430
- tier: 'row_bearing',
431
- origin: 'synthetic',
432
- snapshot: snapshot(),
433
- expected: EXPECTED_LINKS,
434
- defaultModes: ['metadata_present'],
435
- dataPath: null,
436
- columnEmbeddings: {},
437
- },
438
- ],
439
- detector,
440
- });
441
- expect(seenBudgets).toEqual([0, undefined]);
442
- });
443
- it('requires relationship benchmark fixture origin provenance', async () => {
444
- const fixtureDir = await mkdtemp(join(tmpdir(), 'ktx-relationship-missing-origin-'));
445
- try {
446
- await writeFile(join(fixtureDir, 'fixture.yaml'), [
447
- 'id: missing_origin',
448
- 'name: Missing origin fixture',
449
- 'tier: unit',
450
- 'defaultModes:',
451
- ' - metadata_present',
452
- '',
453
- ].join('\n'));
454
- await writeFile(join(fixtureDir, 'snapshot.json'), `${JSON.stringify(snapshot(), null, 2)}\n`);
455
- await writeFile(join(fixtureDir, 'expected-links.yaml'), ['expectedPks:', ' - table: accounts', ' columns: [id]', 'expectedLinks: []', ''].join('\n'));
456
- await expect(loadKtxRelationshipBenchmarkFixture(fixtureDir)).rejects.toThrow(/origin/);
457
- }
458
- finally {
459
- await rm(fixtureDir, { recursive: true, force: true });
460
- }
461
- });
462
- it('loads all benchmark fixture directories in stable order', async () => {
463
- const fixtureRoot = await mkdtemp(join(tmpdir(), 'ktx-relationship-fixture-root-'));
464
- async function writeFixtureDir(dirName, fixtureId) {
465
- const fixtureDir = join(fixtureRoot, dirName);
466
- await mkdir(fixtureDir);
467
- await writeFile(join(fixtureDir, 'fixture.yaml'), [
468
- `id: ${fixtureId}`,
469
- `name: ${fixtureId}`,
470
- 'tier: unit',
471
- 'origin: synthetic',
472
- 'defaultModes:',
473
- ' - metadata_present',
474
- '',
475
- ].join('\n'));
476
- await writeFile(join(fixtureDir, 'snapshot.json'), `${JSON.stringify(snapshot(), null, 2)}\n`);
477
- await writeFile(join(fixtureDir, 'expected-links.yaml'), [
478
- 'expectedPks:',
479
- ' - table: accounts',
480
- ' columns: [id]',
481
- ' - table: users',
482
- ' columns: [id]',
483
- 'expectedLinks:',
484
- ' - fromTable: users',
485
- ' fromColumns: [account_id]',
486
- ' toTable: accounts',
487
- ' toColumns: [id]',
488
- ' relationship: many_to_one',
489
- '',
490
- ].join('\n'));
491
- }
492
- try {
493
- await writeFixtureDir('z_fixture', 'z_fixture');
494
- await writeFixtureDir('a_fixture', 'a_fixture');
495
- await expect(loadKtxRelationshipBenchmarkFixtures(fixtureRoot)).resolves.toMatchObject([
496
- { id: 'a_fixture', origin: 'synthetic' },
497
- { id: 'z_fixture', origin: 'synthetic' },
498
- ]);
499
- }
500
- finally {
501
- await rm(fixtureRoot, { recursive: true, force: true });
502
- }
503
- });
504
- it('loads every checked-in relationship benchmark fixture with explicit provenance', async () => {
505
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
506
- const fixtureDirs = (await readdir(fixtureRoot, { withFileTypes: true }))
507
- .filter((entry) => entry.isDirectory())
508
- .map((entry) => entry.name)
509
- .sort((left, right) => left.localeCompare(right));
510
- expect(fixtureDirs).toEqual(Object.keys(CHECKED_IN_FIXTURE_ORIGINS).sort());
511
- const fixtures = await loadKtxRelationshipBenchmarkFixtures(fixtureRoot.pathname);
512
- expect(Object.fromEntries(fixtures.map((fixture) => [fixture.id, fixture.origin]))).toEqual(CHECKED_IN_FIXTURE_ORIGINS);
513
- });
514
- it('loads May 8 evidence-fusion adversarial fixtures as reported synthetic evidence', async () => {
515
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
516
- const fixtures = await loadKtxRelationshipBenchmarkFixtures(fixtureRoot.pathname);
517
- const byId = new Map(fixtures.map((fixture) => [fixture.id, fixture]));
518
- const adversarialIds = [
519
- 'non_english_naming_no_declared_constraints',
520
- 'abbreviated_old_no_declared_constraints',
521
- 'analytical_warehouse_no_naming_convention',
522
- 'mixed_case_within_schema_no_declared_constraints',
523
- 'polymorphic_partial_overlap_no_declared_constraints',
524
- ];
525
- for (const fixtureId of adversarialIds) {
526
- const fixture = byId.get(fixtureId);
527
- expect(fixture, fixtureId).toBeDefined();
528
- expect(fixture?.origin).toBe('synthetic');
529
- expect(fixture?.tier).toBe('row_bearing');
530
- expect(fixture?.thresholdEligible).toBe(false);
531
- expect(fixture?.defaultModes).toEqual(['declared_pks_and_declared_fks_removed']);
532
- expect(fixture?.dataPath).toMatch(/data\.sqlite$/);
533
- expect(fixture?.expected.expectedPks.length).toBeGreaterThan(0);
534
- expect(fixture?.expected.expectedLinks.length).toBeGreaterThan(0);
535
- }
536
- expect(byId
537
- .get('polymorphic_partial_overlap_no_declared_constraints')
538
- ?.expected.expectedLinks.filter((link) => link.fromTable === 'activity_events' && link.fromColumns.join(',') === 'entity_id')).toHaveLength(2);
539
- });
540
- it('loads the May 8 scale stress fixture with bounded benchmark validation', async () => {
541
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
542
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'scale_stress_no_declared_constraints'));
543
- expect(fixture.origin).toBe('synthetic');
544
- expect(fixture.tier).toBe('row_bearing');
545
- expect(fixture.thresholdEligible).toBe(false);
546
- expect(fixture.defaultModes).toEqual(['declared_pks_and_declared_fks_removed']);
547
- expect(fixture.validationBudget).toBe(800);
548
- expect(fixture.snapshot.tables).toHaveLength(400);
549
- expect(fixture.snapshot.tables.every((table) => table.columns.length === 50)).toBe(true);
550
- expect(fixture.expected.expectedPks).toHaveLength(20);
551
- expect(fixture.expected.expectedLinks).toHaveLength(1900);
552
- });
553
- adHocRelationshipBenchmarkIt('runs the scale stress fixture inside the benchmark validation budget', async () => {
554
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
555
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'scale_stress_no_declared_constraints'));
556
- const result = await runKtxRelationshipBenchmarkCase({
557
- fixture,
558
- mode: 'declared_pks_and_declared_fks_removed',
559
- detector: currentKtxRelationshipBenchmarkDetector(),
560
- });
561
- expect(result.metrics.runtimeSeconds).toBeLessThan(60);
562
- expect(result.metrics.sqlQueries).toBeLessThanOrEqual(800);
563
- expect(result.validationBlocked).toBe(false);
564
- }, 60_000);
565
- it('aggregates suite metrics without hiding validation-blocked cases', async () => {
566
- const suite = await runKtxRelationshipBenchmarkSuite({
567
- fixtures: [
568
- {
569
- id: 'mini_declared',
570
- name: 'Mini declared fixture',
571
- tier: 'unit',
572
- origin: 'synthetic',
573
- snapshot: snapshot(),
574
- expected: EXPECTED_LINKS,
575
- defaultModes: ['metadata_present'],
576
- dataPath: null,
577
- columnEmbeddings: {},
578
- },
579
- {
580
- id: 'mini_no_declared',
581
- name: 'Mini no declared fixture',
582
- tier: 'row_bearing',
583
- origin: 'synthetic',
584
- snapshot: snapshot(),
585
- expected: EXPECTED_LINKS,
586
- defaultModes: ['declared_pks_and_declared_fks_removed', 'validation_disabled'],
587
- dataPath: null,
588
- columnEmbeddings: {},
589
- },
590
- ],
591
- detector: currentKtxRelationshipBenchmarkDetector(),
592
- });
593
- expect(suite.cases.map((item) => `${item.fixtureId}:${item.mode}`)).toEqual([
594
- 'mini_declared:metadata_present',
595
- 'mini_no_declared:declared_pks_and_declared_fks_removed',
596
- 'mini_no_declared:validation_disabled',
597
- ]);
598
- expect(suite.validationBlockedCases).toEqual(['mini_no_declared:validation_disabled']);
599
- expect(suite.aggregate.caseCount).toBe(3);
600
- expect(suite.aggregate.headlineCaseCount).toBe(1);
601
- expect(suite.aggregate.headlineFkRecall).toBe(0);
602
- expect(suite.aggregate.headlineAcceptedOrReviewRecall).toBe(1);
603
- });
604
- it('keeps smoke fixtures out of headline threshold metrics', async () => {
605
- const detector = {
606
- async detect() {
607
- return {
608
- pks: [
609
- { table: 'accounts', columns: ['id'], score: 1, status: 'accepted' },
610
- { table: 'users', columns: ['id'], score: 1, status: 'accepted' },
611
- ],
612
- links: [
613
- {
614
- fromTable: 'users',
615
- fromColumns: ['account_id'],
616
- toTable: 'accounts',
617
- toColumns: ['id'],
618
- relationship: 'many_to_one',
619
- score: 1,
620
- status: 'accepted',
621
- source: 'test',
622
- },
623
- ],
624
- validationBlocked: false,
625
- sqlQueries: 1,
626
- llmCalls: 0,
627
- runtimeSeconds: 0.001,
628
- };
629
- },
630
- };
631
- const suite = await runKtxRelationshipBenchmarkSuite({
632
- fixtures: [
633
- {
634
- id: 'smoke_no_declared',
635
- name: 'Smoke no declared fixture',
636
- tier: 'smoke',
637
- origin: 'synthetic',
638
- snapshot: snapshot(),
639
- expected: EXPECTED_LINKS,
640
- defaultModes: ['declared_pks_and_declared_fks_removed'],
641
- dataPath: null,
642
- columnEmbeddings: {},
643
- },
644
- {
645
- id: 'row_bearing_no_declared',
646
- name: 'Row-bearing no declared fixture',
647
- tier: 'row_bearing',
648
- origin: 'synthetic',
649
- snapshot: snapshot(),
650
- expected: EXPECTED_LINKS,
651
- defaultModes: ['declared_pks_and_declared_fks_removed'],
652
- dataPath: null,
653
- columnEmbeddings: {},
654
- },
655
- ],
656
- detector,
657
- });
658
- expect(suite.aggregate.caseCount).toBe(2);
659
- expect(suite.aggregate.headlineCaseCount).toBe(1);
660
- expect(suite.aggregate.headlineFkRecall).toBe(1);
661
- expect(suite.aggregate.headlinePkRecall).toBe(1);
662
- });
663
- it('counts product fixtures as headline evidence only when threshold eligible', async () => {
664
- const detector = {
665
- async detect() {
666
- return {
667
- pks: [
668
- { table: 'accounts', columns: ['id'], score: 1, status: 'accepted' },
669
- { table: 'users', columns: ['id'], score: 1, status: 'accepted' },
670
- ],
671
- links: [
672
- {
673
- fromTable: 'users',
674
- fromColumns: ['account_id'],
675
- toTable: 'accounts',
676
- toColumns: ['id'],
677
- relationship: 'many_to_one',
678
- score: 1,
679
- status: 'accepted',
680
- source: 'test',
681
- },
682
- ],
683
- validationBlocked: false,
684
- sqlQueries: 1,
685
- llmCalls: 0,
686
- runtimeSeconds: 0.001,
687
- };
688
- },
689
- };
690
- const suite = await runKtxRelationshipBenchmarkSuite({
691
- fixtures: [
692
- {
693
- id: 'product_not_curated',
694
- name: 'Product fixture without curated threshold evidence',
695
- tier: 'product',
696
- origin: 'synthetic',
697
- snapshot: snapshot(),
698
- expected: EXPECTED_LINKS,
699
- defaultModes: ['declared_pks_and_declared_fks_removed'],
700
- dataPath: null,
701
- columnEmbeddings: {},
702
- },
703
- {
704
- id: 'product_curated',
705
- name: 'Product fixture with curated threshold evidence',
706
- tier: 'product',
707
- origin: 'synthetic',
708
- thresholdEligible: true,
709
- snapshot: snapshot(),
710
- expected: EXPECTED_LINKS,
711
- defaultModes: ['declared_pks_and_declared_fks_removed'],
712
- dataPath: null,
713
- columnEmbeddings: {},
714
- },
715
- {
716
- id: 'smoke_even_if_marked',
717
- name: 'Smoke fixture remains excluded',
718
- tier: 'smoke',
719
- origin: 'synthetic',
720
- thresholdEligible: true,
721
- snapshot: snapshot(),
722
- expected: EXPECTED_LINKS,
723
- defaultModes: ['declared_pks_and_declared_fks_removed'],
724
- dataPath: null,
725
- columnEmbeddings: {},
726
- },
727
- ],
728
- detector,
729
- });
730
- expect(suite.aggregate.caseCount).toBe(3);
731
- expect(suite.aggregate.headlineCaseCount).toBe(1);
732
- expect(suite.aggregate.headlinePkRecall).toBe(1);
733
- expect(suite.aggregate.headlineFkRecall).toBe(1);
734
- });
735
- it('loads the packaged B2B demo fixtures and records the current relationship-discovery baseline', async () => {
736
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
737
- const declared = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'demo_b2b_declared_metadata'));
738
- const noDeclared = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'demo_b2b_no_declared_constraints'));
739
- expect(declared.tier).toBe('smoke');
740
- expect(noDeclared.tier).toBe('smoke');
741
- expect(declared.defaultModes).toEqual([
742
- 'metadata_present',
743
- 'declared_fks_removed',
744
- 'declared_pks_removed',
745
- 'declared_pks_and_declared_fks_removed',
746
- 'llm_disabled',
747
- 'profiling_disabled',
748
- 'validation_disabled',
749
- 'embeddings_disabled',
750
- ]);
751
- expect(noDeclared.defaultModes).toEqual([
752
- 'declared_pks_and_declared_fks_removed',
753
- 'profiling_disabled',
754
- 'validation_disabled',
755
- 'llm_disabled',
756
- 'embeddings_disabled',
757
- ]);
758
- const suite = await runKtxRelationshipBenchmarkSuite({
759
- fixtures: [declared, noDeclared],
760
- detector: currentKtxRelationshipBenchmarkDetector(),
761
- });
762
- const declaredCase = suite.cases.find((item) => item.fixtureId === 'demo_b2b_declared_metadata' && item.mode === 'metadata_present');
763
- const noDeclaredCase = suite.cases.find((item) => item.fixtureId === 'demo_b2b_no_declared_constraints' && item.mode === 'declared_pks_and_declared_fks_removed');
764
- const profilingDisabledCase = suite.cases.find((item) => item.fixtureId === 'demo_b2b_no_declared_constraints' && item.mode === 'profiling_disabled');
765
- expect(declaredCase?.expected.fk).toHaveLength(7);
766
- expect(declaredCase?.metrics.fkRecall).toBe(1);
767
- expect(declaredCase?.metrics.pkRecall).toBe(1);
768
- expect(noDeclaredCase?.expected.fk).toHaveLength(7);
769
- expect(noDeclaredCase?.metrics.fkRecall).toBe(1);
770
- expect(noDeclaredCase?.metrics.fkPrecision).toBe(1);
771
- expect(noDeclaredCase?.metrics.pkRecall).toBe(1);
772
- expect(noDeclaredCase?.falseNegatives.pk).toEqual([]);
773
- expect(noDeclaredCase?.metrics.reviewRecall).toBe(0);
774
- expect(noDeclaredCase?.metrics.acceptedOrReviewRecall).toBe(1);
775
- expect(noDeclaredCase?.metrics.acceptedFalsePositiveCount).toBe(0);
776
- expect(noDeclaredCase?.predicted.acceptedFk).toEqual([
777
- 'invoices.(account_id)->accounts.(id)',
778
- 'opportunities.(account_id)->accounts.(id)',
779
- 'product_events.(account_id)->accounts.(id)',
780
- 'product_events.(user_id)->users.(id)',
781
- 'subscriptions.(account_id)->accounts.(id)',
782
- 'support_tickets.(account_id)->accounts.(id)',
783
- 'users.(account_id)->accounts.(id)',
784
- ]);
785
- expect(noDeclaredCase?.predicted.reviewFk).toEqual([]);
786
- expect(noDeclaredCase?.falseNegatives.fk).toEqual([]);
787
- expect(profilingDisabledCase?.validationBlocked).toBe(true);
788
- expect(profilingDisabledCase?.metrics.fkRecall).toBe(0);
789
- expect(profilingDisabledCase?.metrics.acceptedOrReviewRecall).toBe(1);
790
- expect(suite.aggregate.headlineCaseCount).toBe(0);
791
- expect(suite.aggregate.headlineFkRecall).toBe(0);
792
- expect(suite.aggregate.headlineAcceptedOrReviewRecall).toBe(0);
793
- expect(suite.validationBlockedCases).toEqual([
794
- 'demo_b2b_declared_metadata:profiling_disabled',
795
- 'demo_b2b_declared_metadata:validation_disabled',
796
- 'demo_b2b_no_declared_constraints:profiling_disabled',
797
- 'demo_b2b_no_declared_constraints:validation_disabled',
798
- ]);
799
- });
800
- it('loads the public Chinook benchmark fixture with declared metadata', async () => {
801
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
802
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'chinook_with_declared_metadata'));
803
- expect(fixture.tier).toBe('row_bearing');
804
- expect(fixture.thresholdEligible).toBe(true);
805
- expect(fixture.defaultModes).toContain('metadata_present');
806
- expect(fixture.defaultModes).toContain('declared_pks_and_declared_fks_removed');
807
- expect(fixture.snapshot.tables.length).toBeGreaterThanOrEqual(11);
808
- expect(fixture.expected.expectedLinks.length).toBeGreaterThanOrEqual(8);
809
- const albumArtist = fixture.expected.expectedLinks.find((link) => link.fromTable === 'Album' && link.toTable === 'Artist');
810
- expect(albumArtist).toBeDefined();
811
- });
812
- it('loads the public Northwind benchmark fixture with declared metadata', async () => {
813
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
814
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'northwind_with_declared_metadata'));
815
- expect(fixture.tier).toBe('row_bearing');
816
- expect(fixture.thresholdEligible).toBe(true);
817
- expect(fixture.snapshot.tables.length).toBeGreaterThanOrEqual(13);
818
- expect(fixture.expected.expectedLinks.length).toBeGreaterThanOrEqual(11);
819
- const orderCustomer = fixture.expected.expectedLinks.find((link) => ['Orders', 'orders'].includes(link.fromTable) && ['Customers', 'customers'].includes(link.toTable));
820
- expect(orderCustomer).toBeDefined();
821
- });
822
- it('loads the public Sakila benchmark fixture with declared metadata', async () => {
823
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
824
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'sakila_with_declared_metadata'));
825
- expect(fixture.tier).toBe('row_bearing');
826
- expect(fixture.thresholdEligible).toBe(true);
827
- expect(fixture.snapshot.tables.length).toBeGreaterThanOrEqual(16);
828
- expect(fixture.expected.expectedLinks.length).toBeGreaterThanOrEqual(14);
829
- const filmLanguage = fixture.expected.expectedLinks.find((link) => link.fromTable === 'film' && link.toTable === 'language');
830
- expect(filmLanguage).toBeDefined();
831
- });
832
- it('loads the public AdventureWorksLT benchmark fixture with declared metadata', async () => {
833
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
834
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'adventureworkslt_with_declared_metadata'));
835
- expect(fixture.id).toBe('adventureworkslt_with_declared_metadata');
836
- expect(fixture.name).toBe('AdventureWorksLT (SQLite, declared metadata)');
837
- expect(fixture.tier).toBe('row_bearing');
838
- expect(fixture.thresholdEligible).toBe(true);
839
- expect(fixture.defaultModes).toEqual([
840
- 'metadata_present',
841
- 'declared_pks_and_declared_fks_removed',
842
- 'declared_pks_removed',
843
- 'declared_fks_removed',
844
- 'profiling_disabled',
845
- 'validation_disabled',
846
- 'llm_disabled',
847
- 'embeddings_disabled',
848
- ]);
849
- expect(fixture.snapshot.tables).toHaveLength(12);
850
- expect(fixture.expected.expectedPks).toHaveLength(12);
851
- expect(fixture.expected.expectedLinks).toHaveLength(12);
852
- const customerAddressPk = fixture.expected.expectedPks.find((pk) => pk.table === 'CustomerAddress');
853
- expect(customerAddressPk?.columns).toEqual(['CustomerID', 'AddressID']);
854
- const modelDescriptionPk = fixture.expected.expectedPks.find((pk) => pk.table === 'ProductModelProductDescription');
855
- expect(modelDescriptionPk?.columns).toEqual(['ProductModelID', 'ProductDescriptionID', 'Culture']);
856
- expect(fixture.expected.expectedLinks).toContainEqual({
857
- fromTable: 'CustomerAddress',
858
- fromColumns: ['CustomerID'],
859
- toTable: 'Customer',
860
- toColumns: ['CustomerID'],
861
- relationship: 'many_to_one',
862
- });
863
- expect(fixture.expected.expectedLinks).toContainEqual({
864
- fromTable: 'ProductCategory',
865
- fromColumns: ['ParentProductCategoryID'],
866
- toTable: 'ProductCategory',
867
- toColumns: ['ProductCategoryID'],
868
- relationship: 'many_to_one',
869
- });
870
- expect(fixture.expected.expectedLinks).toContainEqual({
871
- fromTable: 'SalesOrderDetail',
872
- fromColumns: ['SalesOrderID'],
873
- toTable: 'SalesOrderHeader',
874
- toColumns: ['SalesOrderID'],
875
- relationship: 'many_to_one',
876
- });
877
- expect(fixture.expected.expectedLinks).toContainEqual({
878
- fromTable: 'SalesOrderHeader',
879
- fromColumns: ['CustomerID'],
880
- toTable: 'Customer',
881
- toColumns: ['CustomerID'],
882
- relationship: 'many_to_one',
883
- });
884
- });
885
- it('loads the full AdventureWorks OLTP benchmark fixture with declared metadata', async () => {
886
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
887
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'adventureworks_oltp_with_declared_metadata'));
888
- expect(fixture.id).toBe('adventureworks_oltp_with_declared_metadata');
889
- expect(fixture.name).toBe('AdventureWorks OLTP (SQL Server 2022, declared metadata)');
890
- expect(fixture.tier).toBe('row_bearing');
891
- expect(fixture.thresholdEligible).toBe(true);
892
- expect(fixture.defaultModes).toEqual([
893
- 'metadata_present',
894
- 'declared_pks_and_declared_fks_removed',
895
- 'declared_pks_removed',
896
- 'declared_fks_removed',
897
- 'profiling_disabled',
898
- 'validation_disabled',
899
- 'llm_disabled',
900
- 'embeddings_disabled',
901
- ]);
902
- expect(fixture.dataPath === null || fixture.dataPath.endsWith('/adventureworks_oltp_with_declared_metadata/data.sqlite')).toBe(true);
903
- expect(fixture.snapshot.driver).toBe('sqlite');
904
- expect(fixture.snapshot.metadata.source_driver).toBe('sqlserver');
905
- expect(fixture.snapshot.tables).toHaveLength(71);
906
- expect(fixture.expected.expectedPks).toHaveLength(71);
907
- expect(fixture.expected.expectedLinks).toHaveLength(90);
908
- expect(fixture.expected.expectedPks).toContainEqual({
909
- table: 'Sales.SalesOrderDetail',
910
- columns: ['SalesOrderID', 'SalesOrderDetailID'],
911
- });
912
- expect(fixture.expected.expectedPks).toContainEqual({
913
- table: 'Sales.SalesOrderHeaderSalesReason',
914
- columns: ['SalesOrderID', 'SalesReasonID'],
915
- });
916
- expect(fixture.expected.expectedLinks).toContainEqual({
917
- fromTable: 'Sales.SalesOrderHeader',
918
- fromColumns: ['CustomerID'],
919
- toTable: 'Sales.Customer',
920
- toColumns: ['CustomerID'],
921
- relationship: 'many_to_one',
922
- });
923
- expect(fixture.expected.expectedLinks).toContainEqual({
924
- fromTable: 'Sales.SalesOrderDetail',
925
- fromColumns: ['SalesOrderID'],
926
- toTable: 'Sales.SalesOrderHeader',
927
- toColumns: ['SalesOrderID'],
928
- relationship: 'many_to_one',
929
- });
930
- expect(fixture.expected.expectedLinks).toContainEqual({
931
- fromTable: 'Production.Product',
932
- fromColumns: ['ProductSubcategoryID'],
933
- toTable: 'Production.ProductSubcategory',
934
- toColumns: ['ProductSubcategoryID'],
935
- relationship: 'many_to_one',
936
- });
937
- });
938
- it('loads the row-bearing natural-key fixture and counts it as headline evidence', async () => {
939
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
940
- const naturalKeys = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'natural_keys_no_declared_constraints'));
941
- expect(naturalKeys.tier).toBe('row_bearing');
942
- expect(naturalKeys.defaultModes).toEqual([
943
- 'declared_pks_and_declared_fks_removed',
944
- 'llm_disabled',
945
- 'profiling_disabled',
946
- 'validation_disabled',
947
- 'embeddings_disabled',
948
- ]);
949
- const suite = await runKtxRelationshipBenchmarkSuite({
950
- fixtures: [naturalKeys],
951
- detector: currentKtxRelationshipBenchmarkDetector(),
952
- });
953
- const headline = suite.cases.find((item) => item.fixtureId === 'natural_keys_no_declared_constraints' &&
954
- item.mode === 'declared_pks_and_declared_fks_removed');
955
- expect(headline?.metrics.pkRecall).toBe(1);
956
- expect(headline?.metrics.fkRecall).toBe(1);
957
- expect(headline?.metrics.acceptedFalsePositiveCount).toBe(0);
958
- expect(headline?.predicted.acceptedFk).toEqual(['fct_accounts.(country_code)->dim_countries.(iso_code)']);
959
- expect(headline?.falseNegatives.fk).toEqual([]);
960
- expect(suite.aggregate.headlineCaseCount).toBe(1);
961
- expect(suite.aggregate.headlineFkRecall).toBe(1);
962
- });
963
- it('accepts plan-code suffix relationships only when validation is available', async () => {
964
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
965
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'plan_code_no_declared_constraints'));
966
- expect(fixture.tier).toBe('row_bearing');
967
- expect(fixture.defaultModes).toEqual([
968
- 'declared_pks_and_declared_fks_removed',
969
- 'llm_disabled',
970
- 'profiling_disabled',
971
- 'validation_disabled',
972
- 'embeddings_disabled',
973
- ]);
974
- const suite = await runKtxRelationshipBenchmarkSuite({
975
- fixtures: [fixture],
976
- detector: currentKtxRelationshipBenchmarkDetector(),
977
- });
978
- const expectedAccepted = [
979
- 'mart_account_segments.(current_plan_code)->stg_plans.(plan_code)',
980
- 'mart_account_segments.(normalized_plan_code)->stg_plans.(plan_code)',
981
- 'stg_plan_segment_mapping.(canonical_plan_code)->stg_plans.(plan_code)',
982
- 'stg_plans.(canonical_plan_code)->stg_plans.(plan_code)',
983
- ];
984
- const headline = suite.cases.find((item) => item.fixtureId === 'plan_code_no_declared_constraints' && item.mode === 'declared_pks_and_declared_fks_removed');
985
- const llmDisabled = suite.cases.find((item) => item.fixtureId === 'plan_code_no_declared_constraints' && item.mode === 'llm_disabled');
986
- const embeddingsDisabled = suite.cases.find((item) => item.fixtureId === 'plan_code_no_declared_constraints' && item.mode === 'embeddings_disabled');
987
- const validationDisabled = suite.cases.find((item) => item.fixtureId === 'plan_code_no_declared_constraints' && item.mode === 'validation_disabled');
988
- const profilingDisabled = suite.cases.find((item) => item.fixtureId === 'plan_code_no_declared_constraints' && item.mode === 'profiling_disabled');
989
- expect(headline?.predicted.acceptedFk).toEqual(expectedAccepted);
990
- expect(headline?.predicted.reviewFk).toEqual([]);
991
- expect(headline?.metrics.fkRecall).toBe(1);
992
- expect(headline?.metrics.fkPrecision).toBe(1);
993
- expect(headline?.metrics.acceptedFalsePositiveCount).toBe(0);
994
- expect(llmDisabled?.predicted.acceptedFk).toEqual(expectedAccepted);
995
- expect(embeddingsDisabled?.predicted.acceptedFk).toEqual(expectedAccepted);
996
- expect(validationDisabled?.predicted.acceptedFk).toEqual([]);
997
- expect(validationDisabled?.predicted.reviewFk).toEqual(expectedAccepted);
998
- expect(validationDisabled?.validationBlocked).toBe(true);
999
- expect(validationDisabled?.metrics.reviewRecall).toBe(1);
1000
- expect(validationDisabled?.metrics.acceptedOrReviewRecall).toBe(1);
1001
- expect(profilingDisabled?.predicted.acceptedFk).toEqual([]);
1002
- expect(profilingDisabled?.validationBlocked).toBe(true);
1003
- expect(suite.aggregate.headlineCaseCount).toBe(1);
1004
- expect(suite.aggregate.headlineFkRecall).toBe(1);
1005
- expect(suite.aggregate.headlineAcceptedOrReviewRecall).toBe(1);
1006
- });
1007
- it('uses embedding fixtures for semantic alias relationship benchmark cases', async () => {
1008
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
1009
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'semantic_embedding_aliases_no_declared_constraints'));
1010
- expect(fixture.columnEmbeddings).toMatchObject({
1011
- 'customers.id': [1, 0, 0],
1012
- 'orders.buyer_ref': [0.995, 0.005, 0],
1013
- });
1014
- const withEmbeddings = await runKtxRelationshipBenchmarkCase({
1015
- fixture,
1016
- mode: 'declared_pks_and_declared_fks_removed',
1017
- detector: currentKtxRelationshipBenchmarkDetector(),
1018
- });
1019
- const withoutEmbeddings = await runKtxRelationshipBenchmarkCase({
1020
- fixture,
1021
- mode: 'embeddings_disabled',
1022
- detector: currentKtxRelationshipBenchmarkDetector(),
1023
- });
1024
- expect(withEmbeddings.predicted.acceptedFk).toEqual(['orders.(buyer_ref)->customers.(id)']);
1025
- expect(withEmbeddings.metrics.fkRecall).toBe(1);
1026
- expect(withEmbeddings.metrics.acceptedFalsePositiveCount).toBe(0);
1027
- expect(withEmbeddings.falseNegatives.fk).toEqual([]);
1028
- expect(withoutEmbeddings.predicted.acceptedFk).toEqual([]);
1029
- expect(withoutEmbeddings.metrics.fkRecall).toBe(0);
1030
- expect(withoutEmbeddings.falseNegatives.fk).toEqual(['orders.(buyer_ref)->customers.(id)']);
1031
- });
1032
- it('loads the Orbit-style product fixture as curated relationship-discovery benchmark evidence', async () => {
1033
- const fixtureRoot = new URL('../../test/fixtures/relationship-benchmarks/', import.meta.url);
1034
- const fixture = await loadKtxRelationshipBenchmarkFixture(join(fixtureRoot.pathname, 'orbit_style_product_no_declared_constraints'));
1035
- expect(fixture.tier).toBe('product');
1036
- expect(fixture.thresholdEligible).toBe(true);
1037
- expect(fixture.defaultModes).toEqual([
1038
- 'declared_pks_and_declared_fks_removed',
1039
- 'llm_disabled',
1040
- 'profiling_disabled',
1041
- 'validation_disabled',
1042
- 'embeddings_disabled',
1043
- ]);
1044
- const suite = await runKtxRelationshipBenchmarkSuite({
1045
- fixtures: [fixture],
1046
- detector: currentKtxRelationshipBenchmarkDetector(),
1047
- });
1048
- const headline = suite.cases.find((item) => item.fixtureId === 'orbit_style_product_no_declared_constraints' &&
1049
- item.mode === 'declared_pks_and_declared_fks_removed');
1050
- const validationDisabled = suite.cases.find((item) => item.fixtureId === 'orbit_style_product_no_declared_constraints' && item.mode === 'validation_disabled');
1051
- expect(headline?.expected.fk).toHaveLength(9);
1052
- expect(headline?.metrics.pkRecall).toBe(1);
1053
- expect(headline?.metrics.fkRecall).toBe(1);
1054
- expect(headline?.metrics.acceptedFalsePositiveCount).toBe(0);
1055
- expect(headline?.predicted.acceptedFk).toEqual([
1056
- 'dim_users.(account_id)->dim_accounts.(id)',
1057
- 'dim_workspaces.(account_id)->dim_accounts.(id)',
1058
- 'dim_workspaces.(user_id)->dim_users.(id)',
1059
- 'fct_invoices.(account_id)->dim_accounts.(id)',
1060
- 'fct_product_events.(account_id)->dim_accounts.(id)',
1061
- 'fct_product_events.(user_id)->dim_users.(id)',
1062
- 'fct_product_events.(workspace_id)->dim_workspaces.(id)',
1063
- 'support_tickets.(account_id)->dim_accounts.(id)',
1064
- 'support_tickets.(user_id)->dim_users.(id)',
1065
- ]);
1066
- expect(headline?.falseNegatives.fk).toEqual([]);
1067
- expect(validationDisabled?.validationBlocked).toBe(true);
1068
- expect(suite.aggregate.headlineCaseCount).toBe(1);
1069
- expect(suite.aggregate.headlineFkRecall).toBe(1);
1070
- expect(suite.aggregate.headlinePkRecall).toBe(1);
1071
- });
1072
- });