@kaelio/ktx 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (875) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.7.0-py3-none-any.whl} +0 -0
  2. package/assets/python/manifest.json +4 -4
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/clack.d.ts +8 -0
  5. package/dist/clack.js +14 -0
  6. package/dist/connection.js +2 -9
  7. package/dist/connectors/bigquery/connector.d.ts +6 -1
  8. package/dist/connectors/bigquery/connector.js +38 -9
  9. package/dist/connectors/bigquery/dialect.d.ts +11 -9
  10. package/dist/connectors/bigquery/dialect.js +25 -45
  11. package/dist/connectors/clickhouse/connector.d.ts +5 -0
  12. package/dist/connectors/clickhouse/connector.js +36 -3
  13. package/dist/connectors/clickhouse/dialect.d.ts +11 -12
  14. package/dist/connectors/clickhouse/dialect.js +25 -100
  15. package/dist/connectors/mysql/connector.d.ts +7 -1
  16. package/dist/connectors/mysql/connector.js +67 -9
  17. package/dist/connectors/mysql/dialect.d.ts +11 -9
  18. package/dist/connectors/mysql/dialect.js +25 -43
  19. package/dist/connectors/postgres/connector.d.ts +6 -0
  20. package/dist/connectors/postgres/connector.js +67 -12
  21. package/dist/connectors/postgres/dialect.d.ts +11 -9
  22. package/dist/connectors/postgres/dialect.js +26 -35
  23. package/dist/connectors/snowflake/connector.d.ts +8 -3
  24. package/dist/connectors/snowflake/connector.js +39 -20
  25. package/dist/connectors/snowflake/dialect.d.ts +11 -9
  26. package/dist/connectors/snowflake/dialect.js +25 -24
  27. package/dist/connectors/sqlite/connector.d.ts +3 -1
  28. package/dist/connectors/sqlite/connector.js +23 -3
  29. package/dist/connectors/sqlite/dialect.d.ts +11 -9
  30. package/dist/connectors/sqlite/dialect.js +25 -29
  31. package/dist/connectors/sqlserver/connector.d.ts +6 -0
  32. package/dist/connectors/sqlserver/connector.js +56 -9
  33. package/dist/connectors/sqlserver/dialect.d.ts +11 -10
  34. package/dist/connectors/sqlserver/dialect.js +24 -40
  35. package/dist/context/connections/connection-type.d.ts +1 -1
  36. package/dist/context/connections/dialect-helpers.d.ts +9 -0
  37. package/dist/context/connections/dialect-helpers.js +67 -0
  38. package/dist/context/connections/dialects.d.ts +23 -5
  39. package/dist/context/connections/dialects.js +18 -56
  40. package/dist/context/connections/drivers.d.ts +23 -0
  41. package/dist/context/connections/drivers.js +171 -0
  42. package/dist/context/connections/local-query-executor.js +25 -7
  43. package/dist/context/connections/local-warehouse-descriptor.js +0 -2
  44. package/dist/context/connections/postgres-query-executor.js +1 -1
  45. package/dist/context/connections/sqlite-query-executor.js +1 -1
  46. package/dist/context/ingest/adapters/historic-sql/chunk-unified.js +1 -1
  47. package/dist/context/ingest/adapters/historic-sql/connection-dialect.js +11 -7
  48. package/dist/context/ingest/adapters/historic-sql/evidence-tool.d.ts +1 -1
  49. package/dist/context/ingest/adapters/historic-sql/evidence-tool.js +8 -5
  50. package/dist/context/ingest/adapters/historic-sql/evidence.d.ts +4 -4
  51. package/dist/context/ingest/adapters/historic-sql/evidence.js +2 -2
  52. package/dist/context/ingest/adapters/historic-sql/projection.js +5 -2
  53. package/dist/context/ingest/adapters/live-database/daemon-introspection.js +1 -1
  54. package/dist/context/ingest/adapters/live-database/stage.d.ts +2 -0
  55. package/dist/context/ingest/adapters/live-database/stage.js +9 -0
  56. package/dist/context/ingest/adapters/looker/mapping.d.ts +0 -3
  57. package/dist/context/ingest/adapters/looker/mapping.js +0 -3
  58. package/dist/context/ingest/adapters/looker/types.d.ts +1 -1
  59. package/dist/context/ingest/historic-sql-probes/bigquery-runner.d.ts +34 -0
  60. package/dist/context/ingest/historic-sql-probes/bigquery-runner.js +99 -0
  61. package/dist/context/ingest/historic-sql-probes/postgres-runner.d.ts +26 -0
  62. package/dist/context/ingest/historic-sql-probes/postgres-runner.js +76 -0
  63. package/dist/context/ingest/historic-sql-probes/snowflake-runner.d.ts +29 -0
  64. package/dist/context/ingest/historic-sql-probes/snowflake-runner.js +62 -0
  65. package/dist/context/ingest/historic-sql-probes.d.ts +46 -0
  66. package/dist/context/ingest/historic-sql-probes.js +62 -0
  67. package/dist/context/ingest/local-adapters.js +0 -1
  68. package/dist/context/ingest/local-ingest.js +1 -1
  69. package/dist/context/llm/claude-code-runtime.js +16 -1
  70. package/dist/context/mcp/context-tools.js +11 -48
  71. package/dist/context/mcp/local-project-ports.js +0 -3
  72. package/dist/context/project/config.d.ts +0 -8
  73. package/dist/context/project/driver-schemas.d.ts +0 -4
  74. package/dist/context/project/driver-schemas.js +0 -2
  75. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  76. package/dist/context/scan/constraint-discovery.js +23 -0
  77. package/dist/context/scan/enabled-tables.d.ts +4 -5
  78. package/dist/context/scan/enabled-tables.js +4 -18
  79. package/dist/context/scan/entity-details.js +14 -44
  80. package/dist/context/scan/local-enrichment.js +13 -1
  81. package/dist/context/scan/local-scan.js +5 -4
  82. package/dist/context/scan/local-structural-artifacts.js +51 -0
  83. package/dist/context/scan/relationship-benchmarks.js +9 -6
  84. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  85. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  86. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  87. package/dist/context/scan/relationship-discovery.js +4 -4
  88. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  89. package/dist/context/scan/relationship-profiling.js +25 -94
  90. package/dist/context/scan/relationship-validation.d.ts +3 -2
  91. package/dist/context/scan/relationship-validation.js +12 -22
  92. package/dist/context/scan/table-ref.d.ts +1 -2
  93. package/dist/context/scan/table-ref.js +3 -4
  94. package/dist/context/scan/types.d.ts +6 -2
  95. package/dist/context/scan/warehouse-catalog.js +31 -48
  96. package/dist/context/sl/local-query.js +0 -3
  97. package/dist/context/sl/local-sl.js +0 -13
  98. package/dist/context/sl/semantic-layer.service.js +1 -4
  99. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  100. package/dist/context-build-view.js +1 -1
  101. package/dist/database-tree-picker.js +14 -7
  102. package/dist/error-message.d.ts +1 -0
  103. package/dist/error-message.js +29 -0
  104. package/dist/ingest-depth.js +0 -1
  105. package/dist/ingest.js +2 -2
  106. package/dist/llm/embedding-health.js +2 -2
  107. package/dist/local-scan-connectors.js +13 -56
  108. package/dist/managed-local-embeddings.js +2 -1
  109. package/dist/managed-python-daemon.d.ts +5 -0
  110. package/dist/managed-python-daemon.js +29 -9
  111. package/dist/managed-python-http.js +2 -1
  112. package/dist/public-ingest.js +1 -6
  113. package/dist/runtime-requirements.js +2 -2
  114. package/dist/setup-agents.d.ts +1 -1
  115. package/dist/setup-agents.js +16 -74
  116. package/dist/setup-context.js +2 -1
  117. package/dist/setup-databases.d.ts +3 -13
  118. package/dist/setup-databases.js +141 -313
  119. package/dist/setup-embeddings.js +10 -2
  120. package/dist/setup-project.d.ts +0 -8
  121. package/dist/setup-project.js +3 -27
  122. package/dist/setup-runtime.js +2 -1
  123. package/dist/setup-sources.js +2 -1
  124. package/dist/setup.js +11 -18
  125. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  126. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  127. package/dist/skills/sl/SKILL.md +2 -2
  128. package/dist/sql.js +0 -4
  129. package/dist/status-project.d.ts +3 -18
  130. package/dist/status-project.js +42 -216
  131. package/dist/telemetry/events.d.ts +1 -1
  132. package/dist/telemetry/index.js +8 -3
  133. package/dist/tree-picker-state.d.ts +2 -2
  134. package/dist/tree-picker-state.js +29 -13
  135. package/dist/tree-picker-tui.d.ts +3 -1
  136. package/dist/tree-picker-tui.js +20 -32
  137. package/package.json +6 -6
  138. package/dist/admin-reindex.test.d.ts +0 -1
  139. package/dist/admin-reindex.test.js +0 -119
  140. package/dist/admin.test.d.ts +0 -1
  141. package/dist/admin.test.js +0 -201
  142. package/dist/cli-program-telemetry.test.d.ts +0 -1
  143. package/dist/cli-program-telemetry.test.js +0 -89
  144. package/dist/cli-program.test.d.ts +0 -1
  145. package/dist/cli-program.test.js +0 -71
  146. package/dist/command-tree.test.d.ts +0 -1
  147. package/dist/command-tree.test.js +0 -126
  148. package/dist/commands/mcp-commands.test.d.ts +0 -1
  149. package/dist/commands/mcp-commands.test.js +0 -111
  150. package/dist/commands/sql-commands.test.d.ts +0 -1
  151. package/dist/commands/sql-commands.test.js +0 -68
  152. package/dist/connection.test.d.ts +0 -1
  153. package/dist/connection.test.js +0 -426
  154. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  155. package/dist/connectors/bigquery/connector.test.js +0 -363
  156. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  157. package/dist/connectors/bigquery/dialect.test.js +0 -36
  158. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  159. package/dist/connectors/clickhouse/connector.test.js +0 -342
  160. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  161. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  162. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  163. package/dist/connectors/mysql/connector.test.js +0 -365
  164. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  165. package/dist/connectors/mysql/dialect.test.js +0 -36
  166. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  167. package/dist/connectors/postgres/connector.test.js +0 -391
  168. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  169. package/dist/connectors/postgres/dialect.test.js +0 -37
  170. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  171. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  172. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  173. package/dist/connectors/snowflake/connector.test.js +0 -462
  174. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  175. package/dist/connectors/snowflake/dialect.test.js +0 -34
  176. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  177. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  178. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  179. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  180. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  181. package/dist/connectors/sqlite/connector.test.js +0 -207
  182. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  183. package/dist/connectors/sqlite/dialect.test.js +0 -23
  184. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  185. package/dist/connectors/sqlserver/connector.test.js +0 -313
  186. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  187. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  188. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  189. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  190. package/dist/context/connections/dialects.test.d.ts +0 -1
  191. package/dist/context/connections/dialects.test.js +0 -24
  192. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  193. package/dist/context/connections/local-query-executor.test.js +0 -48
  194. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  195. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  196. package/dist/context/connections/notion-config.test.d.ts +0 -1
  197. package/dist/context/connections/notion-config.test.js +0 -121
  198. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  199. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  200. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  201. package/dist/context/connections/read-only-sql.test.js +0 -20
  202. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  203. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  204. package/dist/context/core/config-reference.test.d.ts +0 -1
  205. package/dist/context/core/config-reference.test.js +0 -27
  206. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  207. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  208. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  209. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  210. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  211. package/dist/context/core/git.service.patch.test.js +0 -40
  212. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  213. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  214. package/dist/context/core/git.service.test.d.ts +0 -1
  215. package/dist/context/core/git.service.test.js +0 -357
  216. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  217. package/dist/context/core/session-worktree.service.test.js +0 -97
  218. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  219. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  220. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  221. package/dist/context/index-sync/reindex.test.js +0 -139
  222. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  223. package/dist/context/ingest/action-identity.test.js +0 -19
  224. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  225. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  226. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  227. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  228. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  229. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  230. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  231. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  232. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  233. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  234. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  235. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  236. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  237. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  238. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  239. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  240. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  241. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  242. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  243. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  244. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  245. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  246. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  247. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  248. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  249. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  250. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  251. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  252. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  253. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  254. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  255. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  256. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  257. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  258. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  259. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  260. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  261. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  262. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  263. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  264. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  265. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  266. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  267. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  268. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  269. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  270. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  271. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  272. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  273. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  274. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  275. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  276. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  277. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  278. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  279. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  280. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  281. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  282. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  283. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  284. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  285. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  286. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  287. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  288. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  289. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  290. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  291. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  292. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  293. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  294. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  295. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  296. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  297. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  298. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  299. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  300. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  301. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  302. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  303. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  304. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  305. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  306. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  307. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  308. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  309. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  310. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  311. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  312. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  313. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  314. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  315. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  316. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  317. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  318. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  319. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  320. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  321. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  322. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  323. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  324. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  325. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  326. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  327. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  328. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  329. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  330. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  331. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  332. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  333. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  334. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  335. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  336. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  337. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  338. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  339. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  340. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  341. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  342. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  343. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  344. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  345. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  346. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  347. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  348. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  349. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  350. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  351. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  352. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  353. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  354. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  355. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  356. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  357. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  358. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  359. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  360. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  361. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  362. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  363. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  364. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  365. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  366. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  367. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  368. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  369. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  370. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  371. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  372. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  373. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  374. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  375. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  376. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  377. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  378. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  379. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  380. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  381. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  382. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  383. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  384. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  385. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  386. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  387. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  388. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  389. package/dist/context/ingest/artifact-gates.test.js +0 -167
  390. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  391. package/dist/context/ingest/canonical-pins.test.js +0 -66
  392. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  393. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  394. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  395. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  396. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  397. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  398. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  399. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  400. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  401. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  402. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  403. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  404. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  405. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  406. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  407. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  408. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  409. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  410. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  411. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  412. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  413. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  414. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  415. package/dist/context/ingest/diff-set.service.test.js +0 -132
  416. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  417. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  418. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  419. package/dist/context/ingest/finalization-scope.test.js +0 -114
  420. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  421. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  422. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  423. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  424. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  425. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  426. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  427. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  428. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  429. package/dist/context/ingest/ingest-trace.test.js +0 -76
  430. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  431. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  432. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  433. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  434. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  435. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  436. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  437. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  438. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  439. package/dist/context/ingest/local-adapters.test.js +0 -612
  440. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  441. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  442. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  443. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  444. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  445. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  446. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  447. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  448. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  449. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  450. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  451. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  452. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  453. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  454. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  455. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  456. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  457. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  458. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  459. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  460. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  461. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  462. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  463. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  464. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  465. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  466. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  467. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  468. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  469. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  470. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  471. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  472. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  473. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  474. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  475. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  476. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  477. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  478. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  479. package/dist/context/ingest/repo-fetch.test.js +0 -168
  480. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  481. package/dist/context/ingest/report-snapshot.test.js +0 -329
  482. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  483. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  484. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  485. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  486. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  487. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  488. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  489. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  490. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  491. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  492. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  493. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  494. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  495. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  496. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  497. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  498. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  499. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  500. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  501. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  502. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  503. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  504. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  505. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  506. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  507. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  508. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  509. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  510. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  511. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  512. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  513. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  514. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  515. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  516. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  517. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  518. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  519. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  520. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  521. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  522. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  523. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  524. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  525. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  526. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  527. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  528. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  529. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  530. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  531. package/dist/context/llm/claude-code-env.test.js +0 -17
  532. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  533. package/dist/context/llm/claude-code-models.test.js +0 -15
  534. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  535. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  536. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  537. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  538. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  539. package/dist/context/llm/embedding-port.test.js +0 -34
  540. package/dist/context/llm/local-config.test.d.ts +0 -1
  541. package/dist/context/llm/local-config.test.js +0 -164
  542. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  543. package/dist/context/llm/runtime-local-config.test.js +0 -17
  544. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  545. package/dist/context/llm/runtime-tools.test.js +0 -36
  546. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  547. package/dist/context/mcp/local-project-ports.test.js +0 -689
  548. package/dist/context/mcp/server.test.d.ts +0 -1
  549. package/dist/context/mcp/server.test.js +0 -902
  550. package/dist/context/memory/local-memory.test.d.ts +0 -1
  551. package/dist/context/memory/local-memory.test.js +0 -173
  552. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  553. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  554. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  555. package/dist/context/memory/memory-agent.service.test.js +0 -413
  556. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  557. package/dist/context/memory/memory-runs.test.js +0 -158
  558. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  559. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  560. package/dist/context/project/config.test.d.ts +0 -1
  561. package/dist/context/project/config.test.js +0 -467
  562. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  563. package/dist/context/project/driver-schemas.test.js +0 -125
  564. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  565. package/dist/context/project/local-git-file-store.test.js +0 -71
  566. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  567. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  568. package/dist/context/project/project.test.d.ts +0 -1
  569. package/dist/context/project/project.test.js +0 -55
  570. package/dist/context/project/setup-config.test.d.ts +0 -1
  571. package/dist/context/project/setup-config.test.js +0 -38
  572. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  573. package/dist/context/prompts/prompt.service.test.js +0 -43
  574. package/dist/context/scan/credentials.test.d.ts +0 -1
  575. package/dist/context/scan/credentials.test.js +0 -162
  576. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  577. package/dist/context/scan/data-dictionary.test.js +0 -92
  578. package/dist/context/scan/description-generation.test.d.ts +0 -1
  579. package/dist/context/scan/description-generation.test.js +0 -693
  580. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  581. package/dist/context/scan/embedding-text.test.js +0 -36
  582. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  583. package/dist/context/scan/enrichment-state.test.js +0 -147
  584. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  585. package/dist/context/scan/enrichment-summary.test.js +0 -34
  586. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  587. package/dist/context/scan/enrichment-types.test.js +0 -141
  588. package/dist/context/scan/entity-details.test.d.ts +0 -1
  589. package/dist/context/scan/entity-details.test.js +0 -234
  590. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  591. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  592. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  593. package/dist/context/scan/local-enrichment.test.js +0 -765
  594. package/dist/context/scan/local-scan.test.d.ts +0 -1
  595. package/dist/context/scan/local-scan.test.js +0 -1663
  596. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  597. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  598. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  599. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  600. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  601. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  602. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  603. package/dist/context/scan/relationship-budget.test.js +0 -71
  604. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  605. package/dist/context/scan/relationship-candidates.test.js +0 -747
  606. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  607. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  608. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  609. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  610. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  611. package/dist/context/scan/relationship-discovery.test.js +0 -618
  612. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  613. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  614. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  615. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  616. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  617. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  618. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  619. package/dist/context/scan/relationship-locality.test.js +0 -128
  620. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  621. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  622. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  623. package/dist/context/scan/relationship-profiling.test.js +0 -392
  624. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  625. package/dist/context/scan/relationship-scoring.test.js +0 -86
  626. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  627. package/dist/context/scan/relationship-validation.test.js +0 -455
  628. package/dist/context/scan/table-ref.test.d.ts +0 -1
  629. package/dist/context/scan/table-ref.test.js +0 -53
  630. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  631. package/dist/context/scan/type-normalization.test.js +0 -21
  632. package/dist/context/scan/types.test.d.ts +0 -1
  633. package/dist/context/scan/types.test.js +0 -206
  634. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  635. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  636. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  637. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  638. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  639. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  640. package/dist/context/search/discover.test.d.ts +0 -1
  641. package/dist/context/search/discover.test.js +0 -197
  642. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  643. package/dist/context/search/hybrid-search-core.test.js +0 -113
  644. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  645. package/dist/context/search/pglite-owner-process.test.js +0 -273
  646. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  647. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  648. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  649. package/dist/context/search/pglite-spike.test.js +0 -249
  650. package/dist/context/search/query.test.d.ts +0 -1
  651. package/dist/context/search/query.test.js +0 -23
  652. package/dist/context/search/rrf.test.d.ts +0 -1
  653. package/dist/context/search/rrf.test.js +0 -47
  654. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  655. package/dist/context/skills/skills-registry.service.test.js +0 -161
  656. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  657. package/dist/context/sl/dictionary-search.test.js +0 -204
  658. package/dist/context/sl/local-query.test.d.ts +0 -1
  659. package/dist/context/sl/local-query.test.js +0 -283
  660. package/dist/context/sl/local-sl.test.d.ts +0 -1
  661. package/dist/context/sl/local-sl.test.js +0 -334
  662. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  663. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  664. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  665. package/dist/context/sl/schemas.contract.test.js +0 -62
  666. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  667. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  668. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  669. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  670. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  671. package/dist/context/sl/sl-search.service.test.js +0 -256
  672. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  673. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  674. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  675. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  676. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  677. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  678. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  679. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  680. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  681. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  682. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  683. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  684. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  685. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  686. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  687. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  688. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  689. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  690. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  691. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  692. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  693. package/dist/context/test/make-local-git-repo.js +0 -34
  694. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  695. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  696. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  697. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  698. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  699. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  700. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  701. package/dist/context/wiki/local-knowledge.test.js +0 -270
  702. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  703. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  704. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  705. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  706. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  707. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  708. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  709. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  710. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  711. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  712. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  713. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  714. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  715. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  716. package/dist/context-build-view.test.d.ts +0 -1
  717. package/dist/context-build-view.test.js +0 -942
  718. package/dist/database-tree-picker.test.d.ts +0 -1
  719. package/dist/database-tree-picker.test.js +0 -188
  720. package/dist/demo-assets.test.d.ts +0 -1
  721. package/dist/demo-assets.test.js +0 -121
  722. package/dist/demo-metrics.test.d.ts +0 -1
  723. package/dist/demo-metrics.test.js +0 -108
  724. package/dist/doctor.test.d.ts +0 -1
  725. package/dist/doctor.test.js +0 -596
  726. package/dist/embedding-resolution.test.d.ts +0 -1
  727. package/dist/embedding-resolution.test.js +0 -132
  728. package/dist/example-smoke.test.d.ts +0 -1
  729. package/dist/example-smoke.test.js +0 -83
  730. package/dist/index.test.d.ts +0 -1
  731. package/dist/index.test.js +0 -1300
  732. package/dist/ingest-query-executor.test.d.ts +0 -1
  733. package/dist/ingest-query-executor.test.js +0 -71
  734. package/dist/ingest-report-file.test.d.ts +0 -1
  735. package/dist/ingest-report-file.test.js +0 -63
  736. package/dist/ingest-viz.test.d.ts +0 -1
  737. package/dist/ingest-viz.test.js +0 -691
  738. package/dist/ingest.test-utils.d.ts +0 -126
  739. package/dist/ingest.test-utils.js +0 -629
  740. package/dist/ingest.test.d.ts +0 -1
  741. package/dist/ingest.test.js +0 -1568
  742. package/dist/io/logger.test.d.ts +0 -1
  743. package/dist/io/logger.test.js +0 -55
  744. package/dist/io/mode.test.d.ts +0 -1
  745. package/dist/io/mode.test.js +0 -48
  746. package/dist/io/print-list.test.d.ts +0 -1
  747. package/dist/io/print-list.test.js +0 -277
  748. package/dist/knowledge.test.d.ts +0 -1
  749. package/dist/knowledge.test.js +0 -198
  750. package/dist/llm/embedding-health.test.d.ts +0 -1
  751. package/dist/llm/embedding-health.test.js +0 -72
  752. package/dist/llm/embedding-provider.test.d.ts +0 -1
  753. package/dist/llm/embedding-provider.test.js +0 -84
  754. package/dist/llm/message-builder.test.d.ts +0 -1
  755. package/dist/llm/message-builder.test.js +0 -127
  756. package/dist/llm/model-health.test.d.ts +0 -1
  757. package/dist/llm/model-health.test.js +0 -55
  758. package/dist/llm/model-provider.test.d.ts +0 -1
  759. package/dist/llm/model-provider.test.js +0 -246
  760. package/dist/llm/repair.test.d.ts +0 -1
  761. package/dist/llm/repair.test.js +0 -78
  762. package/dist/local-adapters.test.d.ts +0 -1
  763. package/dist/local-adapters.test.js +0 -166
  764. package/dist/local-scan-connectors.test.d.ts +0 -1
  765. package/dist/local-scan-connectors.test.js +0 -92
  766. package/dist/managed-local-embeddings.test.d.ts +0 -1
  767. package/dist/managed-local-embeddings.test.js +0 -229
  768. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  769. package/dist/managed-mcp-daemon.test.js +0 -187
  770. package/dist/managed-python-command.test.d.ts +0 -1
  771. package/dist/managed-python-command.test.js +0 -262
  772. package/dist/managed-python-daemon.test.d.ts +0 -1
  773. package/dist/managed-python-daemon.test.js +0 -360
  774. package/dist/managed-python-http.test.d.ts +0 -1
  775. package/dist/managed-python-http.test.js +0 -177
  776. package/dist/managed-python-runtime.test.d.ts +0 -1
  777. package/dist/managed-python-runtime.test.js +0 -426
  778. package/dist/mcp-http-server.test.d.ts +0 -1
  779. package/dist/mcp-http-server.test.js +0 -209
  780. package/dist/mcp-server-factory.test.d.ts +0 -1
  781. package/dist/mcp-server-factory.test.js +0 -142
  782. package/dist/memory-flow-interactive.test.d.ts +0 -1
  783. package/dist/memory-flow-interactive.test.js +0 -109
  784. package/dist/memory-flow-tui.test.d.ts +0 -1
  785. package/dist/memory-flow-tui.test.js +0 -247
  786. package/dist/next-steps.test.d.ts +0 -1
  787. package/dist/next-steps.test.js +0 -77
  788. package/dist/notion-page-picker.test.d.ts +0 -1
  789. package/dist/notion-page-picker.test.js +0 -244
  790. package/dist/print-command-tree.test.d.ts +0 -1
  791. package/dist/print-command-tree.test.js +0 -37
  792. package/dist/project-dir.test.d.ts +0 -1
  793. package/dist/project-dir.test.js +0 -124
  794. package/dist/project-resolver.test.d.ts +0 -1
  795. package/dist/project-resolver.test.js +0 -49
  796. package/dist/prompt-navigation.test.d.ts +0 -1
  797. package/dist/prompt-navigation.test.js +0 -33
  798. package/dist/proxy-env.test.d.ts +0 -1
  799. package/dist/proxy-env.test.js +0 -17
  800. package/dist/public-ingest-copy.test.d.ts +0 -1
  801. package/dist/public-ingest-copy.test.js +0 -24
  802. package/dist/public-ingest.test.d.ts +0 -1
  803. package/dist/public-ingest.test.js +0 -891
  804. package/dist/runtime-requirements.test.d.ts +0 -1
  805. package/dist/runtime-requirements.test.js +0 -73
  806. package/dist/runtime.test.d.ts +0 -1
  807. package/dist/runtime.test.js +0 -381
  808. package/dist/scan.test.d.ts +0 -1
  809. package/dist/scan.test.js +0 -1123
  810. package/dist/setup-agents.test.d.ts +0 -1
  811. package/dist/setup-agents.test.js +0 -1028
  812. package/dist/setup-context.test.d.ts +0 -1
  813. package/dist/setup-context.test.js +0 -491
  814. package/dist/setup-databases.test.d.ts +0 -1
  815. package/dist/setup-databases.test.js +0 -2101
  816. package/dist/setup-demo-tour.test.d.ts +0 -1
  817. package/dist/setup-demo-tour.test.js +0 -221
  818. package/dist/setup-embeddings.test.d.ts +0 -1
  819. package/dist/setup-embeddings.test.js +0 -436
  820. package/dist/setup-interrupt.test.d.ts +0 -1
  821. package/dist/setup-interrupt.test.js +0 -77
  822. package/dist/setup-models.test.d.ts +0 -1
  823. package/dist/setup-models.test.js +0 -885
  824. package/dist/setup-project.test.d.ts +0 -1
  825. package/dist/setup-project.test.js +0 -209
  826. package/dist/setup-prompts.test.d.ts +0 -1
  827. package/dist/setup-prompts.test.js +0 -208
  828. package/dist/setup-ready-menu.test.d.ts +0 -1
  829. package/dist/setup-ready-menu.test.js +0 -44
  830. package/dist/setup-runtime.test.d.ts +0 -1
  831. package/dist/setup-runtime.test.js +0 -111
  832. package/dist/setup-secrets.test.d.ts +0 -1
  833. package/dist/setup-secrets.test.js +0 -30
  834. package/dist/setup-sources-notion.test.d.ts +0 -1
  835. package/dist/setup-sources-notion.test.js +0 -109
  836. package/dist/setup-sources.test.d.ts +0 -1
  837. package/dist/setup-sources.test.js +0 -1303
  838. package/dist/setup.test.d.ts +0 -1
  839. package/dist/setup.test.js +0 -1825
  840. package/dist/sl.test.d.ts +0 -1
  841. package/dist/sl.test.js +0 -567
  842. package/dist/source-mapping.test.d.ts +0 -1
  843. package/dist/source-mapping.test.js +0 -65
  844. package/dist/sql.test.d.ts +0 -1
  845. package/dist/sql.test.js +0 -253
  846. package/dist/standalone-smoke.test.d.ts +0 -1
  847. package/dist/standalone-smoke.test.js +0 -250
  848. package/dist/status-project.test.d.ts +0 -1
  849. package/dist/status-project.test.js +0 -502
  850. package/dist/telemetry/command-hook.test.d.ts +0 -1
  851. package/dist/telemetry/command-hook.test.js +0 -31
  852. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  853. package/dist/telemetry/demo-detect.test.js +0 -22
  854. package/dist/telemetry/emitter.test.d.ts +0 -1
  855. package/dist/telemetry/emitter.test.js +0 -103
  856. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  857. package/dist/telemetry/events.snapshot.test.js +0 -135
  858. package/dist/telemetry/events.test.d.ts +0 -1
  859. package/dist/telemetry/events.test.js +0 -136
  860. package/dist/telemetry/identity.test.d.ts +0 -1
  861. package/dist/telemetry/identity.test.js +0 -148
  862. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  863. package/dist/telemetry/project-snapshot.test.js +0 -71
  864. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  865. package/dist/telemetry/schema-writer.test.js +0 -23
  866. package/dist/telemetry/scrubber.test.d.ts +0 -1
  867. package/dist/telemetry/scrubber.test.js +0 -21
  868. package/dist/text-ingest.test.d.ts +0 -1
  869. package/dist/text-ingest.test.js +0 -247
  870. package/dist/tree-picker-state.test.d.ts +0 -1
  871. package/dist/tree-picker-state.test.js +0 -303
  872. package/dist/tree-picker-tui.test.d.ts +0 -1
  873. package/dist/tree-picker-tui.test.js +0 -248
  874. package/dist/viz-fallback.test.d.ts +0 -1
  875. package/dist/viz-fallback.test.js +0 -77
@@ -1,1139 +0,0 @@
1
- import { beforeEach, describe, expect, it } from 'vitest';
2
- import { parseMetricflowFiles, translateMetricflowJinjaFilter } from './deep-parse.js';
3
- function yaml(strings, ...values) {
4
- return String.raw(strings, ...values);
5
- }
6
- function parseOne(content) {
7
- return parseMetricflowFiles([{ content, path: 'test.yml' }]);
8
- }
9
- describe('parseMetricflowFiles', () => {
10
- beforeEach(() => {
11
- // Keep this hook so the copied tests keep their grouping shape while the parser stays pure.
12
- });
13
- // ============ Semantic Model Parsing ============
14
- describe('parseFiles — semantic models', () => {
15
- it('extracts name, description, modelRef, and defaultTimeDimension', () => {
16
- const result = parseOne(yaml `
17
- semantic_models:
18
- - name: orders
19
- description: All completed orders
20
- model: ref('stg_orders')
21
- defaults:
22
- agg_time_dimension: order_date
23
- dimensions: []
24
- measures: []
25
- `);
26
- expect(result.semanticModels).toHaveLength(1);
27
- const sm = result.semanticModels[0];
28
- expect(sm.name).toBe('orders');
29
- expect(sm.description).toBe('All completed orders');
30
- expect(sm.modelRef).toBe('stg_orders');
31
- expect(sm.defaultTimeDimension).toBe('order_date');
32
- });
33
- it('extracts modelRef from source()', () => {
34
- const result = parseOne(yaml `
35
- semantic_models:
36
- - name: raw_events
37
- model: source('analytics', 'events')
38
- dimensions: []
39
- measures: []
40
- `);
41
- expect(result.semanticModels[0].modelRef).toBe('events');
42
- });
43
- it('uses raw string when model is not ref() or source()', () => {
44
- const result = parseOne(yaml `
45
- semantic_models:
46
- - name: custom
47
- model: my_table
48
- dimensions: []
49
- measures: []
50
- `);
51
- expect(result.semanticModels[0].modelRef).toBe('my_table');
52
- });
53
- it('sets description to null when missing', () => {
54
- const result = parseOne(yaml `
55
- semantic_models:
56
- - name: orders
57
- model: ref('orders')
58
- dimensions: []
59
- measures: []
60
- `);
61
- expect(result.semanticModels[0].description).toBeNull();
62
- });
63
- });
64
- // ============ Dimensions ============
65
- describe('parseFiles — dimensions', () => {
66
- it('maps categorical to string and time to time', () => {
67
- const result = parseOne(yaml `
68
- semantic_models:
69
- - name: orders
70
- model: ref('orders')
71
- dimensions:
72
- - name: status
73
- type: categorical
74
- description: Order status
75
- - name: created_at
76
- type: time
77
- description: When the order was placed
78
- measures: []
79
- `);
80
- const dims = result.semanticModels[0].dimensions;
81
- expect(dims).toHaveLength(2);
82
- expect(dims[0]).toEqual({
83
- name: 'status',
84
- column: 'status',
85
- type: 'string',
86
- label: 'Status',
87
- description: 'Order status',
88
- });
89
- expect(dims[1]).toEqual({
90
- name: 'created_at',
91
- column: 'created_at',
92
- type: 'time',
93
- label: 'Created At',
94
- description: 'When the order was placed',
95
- });
96
- });
97
- it('uses expr as column when provided', () => {
98
- const result = parseOne(yaml `
99
- semantic_models:
100
- - name: orders
101
- model: ref('orders')
102
- dimensions:
103
- - name: order_status
104
- type: categorical
105
- expr: status_code
106
- measures: []
107
- `);
108
- expect(result.semanticModels[0].dimensions[0].column).toBe('status_code');
109
- });
110
- it('uses explicit label over auto-generated one', () => {
111
- const result = parseOne(yaml `
112
- semantic_models:
113
- - name: orders
114
- model: ref('orders')
115
- dimensions:
116
- - name: order_status_code
117
- type: categorical
118
- label: Status
119
- measures: []
120
- `);
121
- expect(result.semanticModels[0].dimensions[0].label).toBe('Status');
122
- });
123
- });
124
- // ============ Measures ============
125
- describe('parseFiles — measures', () => {
126
- it('maps all standard aggregation types', () => {
127
- const result = parseOne(yaml `
128
- semantic_models:
129
- - name: orders
130
- model: ref('orders')
131
- dimensions: []
132
- measures:
133
- - name: total_amount
134
- agg: sum
135
- expr: amount
136
- - name: order_count
137
- agg: count
138
- expr: '1'
139
- - name: unique_customers
140
- agg: count_distinct
141
- expr: customer_id
142
- - name: avg_amount
143
- agg: average
144
- expr: amount
145
- - name: max_amount
146
- agg: max
147
- expr: amount
148
- - name: min_amount
149
- agg: min
150
- expr: amount
151
- - name: median_amount
152
- agg: median
153
- expr: amount
154
- `);
155
- const measures = result.semanticModels[0].measures;
156
- expect(measures).toHaveLength(7);
157
- expect(measures.map((m) => m.type === 'simple' && m.aggregation)).toEqual([
158
- 'sum',
159
- 'count',
160
- 'count_distinct',
161
- 'avg',
162
- 'max',
163
- 'min',
164
- 'median',
165
- ]);
166
- });
167
- it('maps sum_boolean to sum', () => {
168
- const result = parseOne(yaml `
169
- semantic_models:
170
- - name: users
171
- model: ref('users')
172
- dimensions: []
173
- measures:
174
- - name: active_users
175
- agg: sum_boolean
176
- expr: is_active
177
- `);
178
- const m = result.semanticModels[0].measures[0];
179
- expect(m.type).toBe('simple');
180
- if (m.type === 'simple') {
181
- expect(m.aggregation).toBe('sum');
182
- }
183
- });
184
- it('maps percentile p50 to median', () => {
185
- const result = parseOne(yaml `
186
- semantic_models:
187
- - name: orders
188
- model: ref('orders')
189
- dimensions: []
190
- measures:
191
- - name: median_delivery_time
192
- agg: percentile
193
- expr: delivery_hours
194
- agg_params:
195
- percentile: 0.5
196
- `);
197
- const m = result.semanticModels[0].measures[0];
198
- expect(m.type).toBe('simple');
199
- if (m.type === 'simple') {
200
- expect(m.aggregation).toBe('median');
201
- expect(m.column).toBe('delivery_hours');
202
- }
203
- });
204
- it('maps percentile p95 to none with label', () => {
205
- const result = parseOne(yaml `
206
- semantic_models:
207
- - name: orders
208
- model: ref('orders')
209
- dimensions: []
210
- measures:
211
- - name: p95_delivery_time
212
- agg: percentile
213
- expr: delivery_hours
214
- agg_params:
215
- percentile: 0.95
216
- `);
217
- const m = result.semanticModels[0].measures[0];
218
- expect(m.type).toBe('simple');
219
- if (m.type === 'simple') {
220
- expect(m.aggregation).toBe('none');
221
- expect(m.label).toBe('P95 Delivery Time (p95)');
222
- }
223
- });
224
- it('skips unsupported aggregation types', () => {
225
- const result = parseOne(yaml `
226
- semantic_models:
227
- - name: orders
228
- model: ref('orders')
229
- dimensions: []
230
- measures:
231
- - name: total_amount
232
- agg: sum
233
- expr: amount
234
- - name: weird_measure
235
- agg: hyperloglog
236
- expr: user_id
237
- `);
238
- expect(result.semanticModels[0].measures).toHaveLength(1);
239
- expect(result.semanticModels[0].measures[0].name).toBe('total_amount');
240
- });
241
- it('uses measure name as column when expr is missing', () => {
242
- const result = parseOne(yaml `
243
- semantic_models:
244
- - name: orders
245
- model: ref('orders')
246
- dimensions: []
247
- measures:
248
- - name: amount
249
- agg: sum
250
- `);
251
- const m = result.semanticModels[0].measures[0];
252
- expect(m.type).toBe('simple');
253
- if (m.type === 'simple') {
254
- expect(m.column).toBe('amount');
255
- }
256
- });
257
- });
258
- // ============ Jinja Filter Translation ============
259
- describe('translateJinjaFilter', () => {
260
- it('translates Dimension references', () => {
261
- expect(translateMetricflowJinjaFilter("{{ Dimension('orders__status') }} = 'completed'")).toBe("status = 'completed'");
262
- });
263
- it('translates TimeDimension references', () => {
264
- expect(translateMetricflowJinjaFilter("{{ TimeDimension('orders__created_at', 'day') }} > '2024-01-01'")).toBe("created_at > '2024-01-01'");
265
- });
266
- it('translates TimeDimension without granularity arg', () => {
267
- expect(translateMetricflowJinjaFilter("{{ TimeDimension('orders__created_at') }} IS NOT NULL")).toBe('created_at IS NOT NULL');
268
- });
269
- it('translates Entity references', () => {
270
- expect(translateMetricflowJinjaFilter("{{ Entity('orders__customer_id') }} IS NOT NULL")).toBe('customer_id IS NOT NULL');
271
- });
272
- it('translates Metric with array params', () => {
273
- expect(translateMetricflowJinjaFilter("{{ Metric('total_revenue', ['product_category']) }} > 100")).toBe('total_revenue > 100');
274
- });
275
- it('translates Metric with object params', () => {
276
- expect(translateMetricflowJinjaFilter("{{ Metric('total_revenue', {'group': true}) }} > 100")).toBe('total_revenue > 100');
277
- });
278
- it('translates Metric without params', () => {
279
- expect(translateMetricflowJinjaFilter("{{ Metric('total_revenue') }} > 50")).toBe('total_revenue > 50');
280
- });
281
- it('handles combined filter with multiple Jinja references', () => {
282
- const filter = "{{ Dimension('orders__status') }} = 'active' AND {{ TimeDimension('orders__created_at', 'day') }} >= '2024-01-01'";
283
- expect(translateMetricflowJinjaFilter(filter)).toBe("status = 'active' AND created_at >= '2024-01-01'");
284
- });
285
- it('passes through plain SQL unchanged', () => {
286
- expect(translateMetricflowJinjaFilter("status = 'active'")).toBe("status = 'active'");
287
- });
288
- });
289
- // ============ Entity Relationships ============
290
- describe('parseFiles — relationships', () => {
291
- it('creates FK relationship when foreign entity matches primary entity by name', () => {
292
- const result = parseOne(yaml `
293
- semantic_models:
294
- - name: customers
295
- model: ref('dim_customers')
296
- entities:
297
- - name: customer_id
298
- type: primary
299
- expr: id
300
- dimensions: []
301
- measures: []
302
- - name: orders
303
- model: ref('fct_orders')
304
- entities:
305
- - name: order_id
306
- type: primary
307
- - name: customer_id
308
- type: foreign
309
- dimensions: []
310
- measures: []
311
- `);
312
- expect(result.relationships).toHaveLength(1);
313
- expect(result.relationships[0]).toEqual({
314
- fromTable: 'fct_orders',
315
- fromColumn: 'customer_id',
316
- toTable: 'dim_customers',
317
- toColumn: 'id',
318
- });
319
- });
320
- it('uses primary_entity shorthand for FK matching', () => {
321
- const result = parseOne(yaml `
322
- semantic_models:
323
- - name: products
324
- model: ref('dim_products')
325
- primary_entity: product_id
326
- dimensions: []
327
- measures: []
328
- - name: order_items
329
- model: ref('fct_order_items')
330
- entities:
331
- - name: item_id
332
- type: primary
333
- - name: product_id
334
- type: foreign
335
- dimensions: []
336
- measures: []
337
- `);
338
- expect(result.relationships).toHaveLength(1);
339
- expect(result.relationships[0]).toEqual({
340
- fromTable: 'fct_order_items',
341
- fromColumn: 'product_id',
342
- toTable: 'dim_products',
343
- toColumn: 'product_id',
344
- });
345
- });
346
- it('does not create self-referencing relationships', () => {
347
- const result = parseOne(yaml `
348
- semantic_models:
349
- - name: orders
350
- model: ref('orders')
351
- entities:
352
- - name: order_id
353
- type: primary
354
- - name: order_id
355
- type: foreign
356
- dimensions: []
357
- measures: []
358
- `);
359
- expect(result.relationships).toHaveLength(0);
360
- });
361
- it('deduplicates relationships across models in the same file', () => {
362
- const result = parseOne(yaml `
363
- semantic_models:
364
- - name: customers
365
- model: ref('customers')
366
- entities:
367
- - name: customer_id
368
- type: primary
369
- dimensions: []
370
- measures: []
371
- - name: orders
372
- model: ref('orders')
373
- entities:
374
- - name: order_id
375
- type: primary
376
- - name: customer_id
377
- type: foreign
378
- dimensions: []
379
- measures: []
380
- - name: returns
381
- model: ref('returns')
382
- entities:
383
- - name: return_id
384
- type: primary
385
- - name: customer_id
386
- type: foreign
387
- dimensions: []
388
- measures: []
389
- `);
390
- // orders→customers and returns→customers (2 unique relationships)
391
- expect(result.relationships).toHaveLength(2);
392
- });
393
- it('creates relationships when primary and foreign entities are split across files', () => {
394
- const result = parseMetricflowFiles([
395
- {
396
- content: yaml `
397
- semantic_models:
398
- - name: salesforce_calls
399
- model: ref('fct_salesforce_calls')
400
- entities:
401
- - name: task_id
402
- type: primary
403
- dimensions: []
404
- measures: []
405
- `,
406
- path: 'sem_fct_salesforce_calls.yml',
407
- },
408
- {
409
- content: yaml `
410
- semantic_models:
411
- - name: daily_flash
412
- model: ref('rpt_daily_flash')
413
- entities:
414
- - name: rpt_daily_flash_uuid
415
- type: primary
416
- - name: task_id
417
- type: foreign
418
- dimensions: []
419
- measures: []
420
- `,
421
- path: 'sem_rpt_daily_flash.yml',
422
- },
423
- ]);
424
- expect(result.relationships).toHaveLength(1);
425
- expect(result.relationships[0]).toEqual({
426
- fromTable: 'rpt_daily_flash',
427
- fromColumn: 'task_id',
428
- toTable: 'fct_salesforce_calls',
429
- toColumn: 'task_id',
430
- });
431
- });
432
- it('skips foreign entity with no matching primary', () => {
433
- const result = parseOne(yaml `
434
- semantic_models:
435
- - name: orders
436
- model: ref('orders')
437
- entities:
438
- - name: order_id
439
- type: primary
440
- - name: nonexistent_id
441
- type: foreign
442
- dimensions: []
443
- measures: []
444
- `);
445
- expect(result.relationships).toHaveLength(0);
446
- });
447
- });
448
- // ============ Metric Resolution ============
449
- describe('parseFiles — metric resolution', () => {
450
- it('absorbs simple metric label/description onto parent measure', () => {
451
- const result = parseOne(yaml `
452
- semantic_models:
453
- - name: orders
454
- model: ref('orders')
455
- dimensions: []
456
- measures:
457
- - name: total_revenue
458
- agg: sum
459
- expr: amount
460
- metrics:
461
- - name: revenue
462
- label: Total Revenue
463
- description: Sum of all order amounts
464
- type: simple
465
- type_params:
466
- measure: total_revenue
467
- `);
468
- const measure = result.semanticModels[0].measures[0];
469
- expect(measure.label).toBe('Total Revenue');
470
- expect(measure.description).toBe('Sum of all order amounts');
471
- });
472
- it('handles measure as object with name property', () => {
473
- const result = parseOne(yaml `
474
- semantic_models:
475
- - name: orders
476
- model: ref('orders')
477
- dimensions: []
478
- measures:
479
- - name: total_revenue
480
- agg: sum
481
- expr: amount
482
- metrics:
483
- - name: revenue
484
- label: Revenue (Filtered)
485
- type: simple
486
- type_params:
487
- measure:
488
- name: total_revenue
489
- filter:
490
- - "status = 'completed'"
491
- `);
492
- const measure = result.semanticModels[0].measures[0];
493
- expect(measure.label).toBe('Revenue (Filtered)');
494
- });
495
- it('applies metric-level filter to measure with Jinja translation', () => {
496
- const result = parseOne(yaml `
497
- semantic_models:
498
- - name: orders
499
- model: ref('orders')
500
- dimensions: []
501
- measures:
502
- - name: order_count
503
- agg: count
504
- expr: '1'
505
- metrics:
506
- - name: completed_orders
507
- type: simple
508
- type_params:
509
- measure: order_count
510
- filter:
511
- - "{{ Dimension('orders__status') }} = 'completed'"
512
- `);
513
- // Filtered metric creates a new measure; base measure stays clean
514
- expect(result.semanticModels[0].measures).toHaveLength(2);
515
- const baseMeasure = result.semanticModels[0].measures[0];
516
- expect(baseMeasure.filter).toBeUndefined();
517
- const filteredMeasure = result.semanticModels[0].measures[1];
518
- expect(filteredMeasure.name).toBe('completed_orders');
519
- expect(filteredMeasure.filter).toBe("status = 'completed'");
520
- });
521
- it('marks cumulative metrics on the measure', () => {
522
- const result = parseOne(yaml `
523
- semantic_models:
524
- - name: orders
525
- model: ref('orders')
526
- dimensions: []
527
- measures:
528
- - name: total_revenue
529
- agg: sum
530
- expr: amount
531
- metrics:
532
- - name: cumulative_revenue
533
- type: cumulative
534
- type_params:
535
- measure: total_revenue
536
- `);
537
- const measure = result.semanticModels[0].measures[0];
538
- expect(measure.cumulative).toBe(true);
539
- });
540
- it('creates derived measure for single-model derived metric', () => {
541
- const result = parseOne(yaml `
542
- semantic_models:
543
- - name: orders
544
- model: ref('orders')
545
- dimensions: []
546
- measures:
547
- - name: total_revenue
548
- agg: sum
549
- expr: amount
550
- - name: order_count
551
- agg: count
552
- expr: '1'
553
- metrics:
554
- - name: metric_revenue
555
- type: simple
556
- type_params:
557
- measure: total_revenue
558
- - name: metric_count
559
- type: simple
560
- type_params:
561
- measure: order_count
562
- - name: avg_order_value
563
- label: Average Order Value
564
- type: derived
565
- type_params:
566
- expr: SAFE_DIVIDE(rev, cnt)
567
- metrics:
568
- - name: metric_revenue
569
- alias: rev
570
- - name: metric_count
571
- alias: cnt
572
- `);
573
- const measures = result.semanticModels[0].measures;
574
- expect(measures).toHaveLength(3);
575
- const derived = measures[2];
576
- expect(derived.type).toBe('derived');
577
- if (derived.type === 'derived') {
578
- expect(derived.name).toBe('avg_order_value');
579
- expect(derived.label).toBe('Average Order Value');
580
- expect(derived.expr).toBe('SAFE_DIVIDE(total_revenue, order_count)');
581
- expect(derived.dependsOn).toEqual(['total_revenue', 'order_count']);
582
- }
583
- });
584
- it('auto-generates ratio metric expression from numerator/denominator', () => {
585
- const result = parseOne(yaml `
586
- semantic_models:
587
- - name: orders
588
- model: ref('orders')
589
- dimensions: []
590
- measures:
591
- - name: completed_count
592
- agg: count
593
- expr: '1'
594
- - name: total_count
595
- agg: count
596
- expr: '1'
597
- metrics:
598
- - name: metric_completed
599
- type: simple
600
- type_params:
601
- measure: completed_count
602
- - name: metric_total
603
- type: simple
604
- type_params:
605
- measure: total_count
606
- - name: completion_rate
607
- type: ratio
608
- type_params:
609
- numerator:
610
- name: metric_completed
611
- denominator:
612
- name: metric_total
613
- `);
614
- const measures = result.semanticModels[0].measures;
615
- const ratio = measures[2];
616
- expect(ratio.type).toBe('derived');
617
- if (ratio.type === 'derived') {
618
- expect(ratio.name).toBe('completion_rate');
619
- expect(ratio.expr).toBe('completed_count / NULLIF(total_count, 0)');
620
- expect(ratio.dependsOn).toEqual(['completed_count', 'total_count']);
621
- }
622
- });
623
- it('skips conversion metrics gracefully', () => {
624
- const result = parseOne(yaml `
625
- semantic_models:
626
- - name: events
627
- model: ref('events')
628
- dimensions: []
629
- measures:
630
- - name: event_count
631
- agg: count
632
- expr: '1'
633
- metrics:
634
- - name: signup_conversion
635
- type: conversion
636
- type_params:
637
- conversion_type_params:
638
- entity: user_id
639
- base_measure: page_views
640
- conversion_measure: signups
641
- - name: simple_metric
642
- type: simple
643
- type_params:
644
- measure: event_count
645
- `);
646
- // Conversion metric skipped, simple metric processed
647
- expect(result.crossModelMetrics).toHaveLength(0);
648
- const measures = result.semanticModels[0].measures;
649
- expect(measures).toHaveLength(1);
650
- });
651
- it('creates cross-model derived metric when references span models', () => {
652
- const result = parseMetricflowFiles([
653
- {
654
- content: yaml `
655
- semantic_models:
656
- - name: orders
657
- model: ref('orders')
658
- dimensions: []
659
- measures:
660
- - name: total_revenue
661
- agg: sum
662
- expr: amount
663
- `,
664
- path: 'orders.yml',
665
- },
666
- {
667
- content: yaml `
668
- semantic_models:
669
- - name: campaigns
670
- model: ref('campaigns')
671
- dimensions: []
672
- measures:
673
- - name: total_spend
674
- agg: sum
675
- expr: spend
676
- `,
677
- path: 'campaigns.yml',
678
- },
679
- {
680
- content: yaml `
681
- metrics:
682
- - name: metric_revenue
683
- type: simple
684
- type_params:
685
- measure: total_revenue
686
- - name: metric_spend
687
- type: simple
688
- type_params:
689
- measure: total_spend
690
- - name: roas
691
- label: Return on Ad Spend
692
- description: Revenue per dollar spent
693
- type: derived
694
- type_params:
695
- expr: SAFE_DIVIDE(revenue, spend)
696
- metrics:
697
- - name: metric_revenue
698
- alias: revenue
699
- - name: metric_spend
700
- alias: spend
701
- `,
702
- path: 'metrics.yml',
703
- },
704
- ]);
705
- expect(result.crossModelMetrics).toHaveLength(1);
706
- const cm = result.crossModelMetrics[0];
707
- expect(cm.name).toBe('roas');
708
- expect(cm.label).toBe('Return on Ad Spend');
709
- expect(cm.expr).toBe('SAFE_DIVIDE(revenue, spend)');
710
- expect(cm.dependsOn).toHaveLength(2);
711
- expect(cm.dependsOn[0].metricName).toBe('orders');
712
- expect(cm.dependsOn[1].metricName).toBe('campaigns');
713
- });
714
- it('resolves derived-of-derived metrics within the same model', () => {
715
- const result = parseOne(yaml `
716
- semantic_models:
717
- - name: financials
718
- model: ref('financials')
719
- dimensions: []
720
- measures:
721
- - name: gross_revenue
722
- agg: sum
723
- expr: revenue
724
- - name: cost_of_goods
725
- agg: sum
726
- expr: cogs
727
- - name: operating_expenses
728
- agg: sum
729
- expr: opex
730
- metrics:
731
- - name: metric_gross_revenue
732
- type: simple
733
- type_params:
734
- measure: gross_revenue
735
- - name: metric_cogs
736
- type: simple
737
- type_params:
738
- measure: cost_of_goods
739
- - name: metric_opex
740
- type: simple
741
- type_params:
742
- measure: operating_expenses
743
- - name: gross_profit
744
- type: derived
745
- type_params:
746
- expr: rev - cogs
747
- metrics:
748
- - name: metric_gross_revenue
749
- alias: rev
750
- - name: metric_cogs
751
- alias: cogs
752
- - name: net_profit_margin
753
- type: derived
754
- type_params:
755
- expr: SAFE_DIVIDE(gp - opex, gp)
756
- metrics:
757
- - name: gross_profit
758
- alias: gp
759
- - name: metric_opex
760
- alias: opex
761
- `);
762
- const measures = result.semanticModels[0].measures;
763
- // 3 original + gross_profit derived + net_profit_margin derived-of-derived
764
- expect(measures).toHaveLength(5);
765
- const netProfit = measures.find((m) => m.name === 'net_profit_margin');
766
- expect(netProfit).toBeDefined();
767
- expect(netProfit.type).toBe('derived');
768
- if (netProfit.type === 'derived') {
769
- expect(netProfit.dependsOn).toContain('gross_profit');
770
- }
771
- });
772
- });
773
- // ============ Edge Cases ============
774
- describe('parseFiles — edge cases', () => {
775
- it('handles empty YAML gracefully', () => {
776
- const result = parseOne('');
777
- expect(result.semanticModels).toHaveLength(0);
778
- expect(result.crossModelMetrics).toHaveLength(0);
779
- expect(result.relationships).toHaveLength(0);
780
- });
781
- it('handles invalid YAML gracefully', () => {
782
- const result = parseOne('{{{{invalid yaml!!!!');
783
- expect(result.semanticModels).toHaveLength(0);
784
- });
785
- it('handles file with only metrics and no semantic models', () => {
786
- const result = parseOne(yaml `
787
- metrics:
788
- - name: orphan_metric
789
- type: simple
790
- type_params:
791
- measure: nonexistent
792
- `);
793
- expect(result.semanticModels).toHaveLength(0);
794
- // Orphan metric referencing non-existent measure is silently skipped
795
- expect(result.crossModelMetrics).toHaveLength(0);
796
- });
797
- it('handles multiple files', () => {
798
- const result = parseMetricflowFiles([
799
- {
800
- content: yaml `
801
- semantic_models:
802
- - name: orders
803
- model: ref('orders')
804
- dimensions:
805
- - name: status
806
- type: categorical
807
- measures:
808
- - name: order_count
809
- agg: count
810
- expr: '1'
811
- `,
812
- path: 'orders.yml',
813
- },
814
- {
815
- content: yaml `
816
- semantic_models:
817
- - name: products
818
- model: ref('products')
819
- dimensions:
820
- - name: category
821
- type: categorical
822
- measures:
823
- - name: product_count
824
- agg: count
825
- expr: '1'
826
- `,
827
- path: 'products.yml',
828
- },
829
- ]);
830
- expect(result.semanticModels).toHaveLength(2);
831
- expect(result.semanticModels[0].name).toBe('orders');
832
- expect(result.semanticModels[1].name).toBe('products');
833
- });
834
- it('returns empty warnings for valid files', () => {
835
- const result = parseOne(yaml `
836
- semantic_models:
837
- - name: orders
838
- model: ref('orders')
839
- dimensions: []
840
- measures:
841
- - name: total
842
- agg: sum
843
- expr: amount
844
- `);
845
- expect(result.warnings).toHaveLength(0);
846
- });
847
- it('handles filter as object with where_filters', () => {
848
- const result = parseOne(yaml `
849
- semantic_models:
850
- - name: orders
851
- model: ref('orders')
852
- dimensions: []
853
- measures:
854
- - name: order_count
855
- agg: count
856
- expr: '1'
857
- metrics:
858
- - name: active_orders
859
- type: simple
860
- type_params:
861
- measure: order_count
862
- filter:
863
- where_filters:
864
- - where_sql_template: "status = 'active'"
865
- - where_sql_template: "amount > 0"
866
- `);
867
- // Filtered metric creates a new measure
868
- expect(result.semanticModels[0].measures).toHaveLength(2);
869
- const filteredMeasure = result.semanticModels[0].measures[1];
870
- expect(filteredMeasure.name).toBe('active_orders');
871
- expect(filteredMeasure.filter).toBe("status = 'active' AND amount > 0");
872
- });
873
- it('creates separate measures for multiple filtered metrics on the same base', () => {
874
- const result = parseOne(yaml `
875
- semantic_models:
876
- - name: intakes
877
- model: ref('intakes')
878
- dimensions: []
879
- measures:
880
- - name: count_intakes
881
- agg: count
882
- expr: '1'
883
- metrics:
884
- - name: count_first_intakes
885
- label: First Intakes
886
- type: simple
887
- type_params:
888
- measure: count_intakes
889
- filter:
890
- - "is_first_intake = TRUE"
891
- - name: count_new_intakes
892
- label: New Intakes
893
- type: simple
894
- type_params:
895
- measure: count_intakes
896
- filter:
897
- - "new_refill = 'New'"
898
- - name: count_refill_intakes
899
- label: Refill Intakes
900
- type: simple
901
- type_params:
902
- measure: count_intakes
903
- filter:
904
- - "new_refill = 'Refill'"
905
- `);
906
- const measures = result.semanticModels[0].measures;
907
- // 1 base + 3 filtered
908
- expect(measures).toHaveLength(4);
909
- // Base measure stays clean
910
- expect(measures[0].name).toBe('count_intakes');
911
- expect(measures[0].filter).toBeUndefined();
912
- // Each filtered metric creates its own measure
913
- expect(measures[1].name).toBe('count_first_intakes');
914
- expect(measures[1].filter).toBe('is_first_intake = TRUE');
915
- expect(measures[1].label).toBe('First Intakes');
916
- expect(measures[2].name).toBe('count_new_intakes');
917
- expect(measures[2].filter).toBe("new_refill = 'New'");
918
- expect(measures[3].name).toBe('count_refill_intakes');
919
- expect(measures[3].filter).toBe("new_refill = 'Refill'");
920
- });
921
- it('mixed filtered and unfiltered metrics work together', () => {
922
- const result = parseOne(yaml `
923
- semantic_models:
924
- - name: orders
925
- model: ref('orders')
926
- dimensions: []
927
- measures:
928
- - name: order_count
929
- agg: count
930
- expr: '1'
931
- metrics:
932
- - name: order_count
933
- label: All Orders
934
- type: simple
935
- type_params:
936
- measure: order_count
937
- - name: completed_orders
938
- label: Completed Orders
939
- type: simple
940
- type_params:
941
- measure: order_count
942
- filter:
943
- - "status = 'completed'"
944
- `);
945
- const measures = result.semanticModels[0].measures;
946
- expect(measures).toHaveLength(2);
947
- // Unfiltered metric updates base measure label
948
- expect(measures[0].name).toBe('order_count');
949
- expect(measures[0].label).toBe('All Orders');
950
- expect(measures[0].filter).toBeUndefined();
951
- // Filtered metric creates new measure
952
- expect(measures[1].name).toBe('completed_orders');
953
- expect(measures[1].label).toBe('Completed Orders');
954
- expect(measures[1].filter).toBe("status = 'completed'");
955
- });
956
- it('derived metric referencing a filtered metric resolves to the new measure name', () => {
957
- const result = parseOne(yaml `
958
- semantic_models:
959
- - name: orders
960
- model: ref('orders')
961
- dimensions: []
962
- measures:
963
- - name: order_count
964
- agg: count
965
- expr: '1'
966
- - name: order_total
967
- agg: sum
968
- expr: amount
969
- metrics:
970
- - name: all_orders
971
- type: simple
972
- type_params:
973
- measure: order_count
974
- - name: large_orders
975
- type: simple
976
- type_params:
977
- measure: order_count
978
- filter:
979
- - "amount > 100"
980
- - name: pct_large_orders
981
- type: derived
982
- label: "% Large Orders"
983
- type_params:
984
- expr: large_orders / all_orders
985
- metrics:
986
- - name: large_orders
987
- - name: all_orders
988
- `);
989
- const measures = result.semanticModels[0].measures;
990
- // order_count (base) + order_total (base) + large_orders (filtered) + pct_large_orders (derived)
991
- expect(measures).toHaveLength(4);
992
- const derived = measures[3];
993
- expect(derived.name).toBe('pct_large_orders');
994
- // large_orders resolves to its own name (the new filtered measure)
995
- // all_orders resolves to order_count (unfiltered metric → base measure)
996
- expect(derived.dependsOn).toEqual(['large_orders', 'order_count']);
997
- expect(derived.expr).toBe('large_orders / order_count');
998
- });
999
- });
1000
- // ============ Warnings Collection ============
1001
- describe('parseFiles — warnings', () => {
1002
- it('collects warning for unsupported aggregation type', () => {
1003
- const result = parseOne(yaml `
1004
- semantic_models:
1005
- - name: orders
1006
- model: ref('orders')
1007
- dimensions: []
1008
- measures:
1009
- - name: weird_measure
1010
- agg: hyperloglog
1011
- expr: user_id
1012
- `);
1013
- expect(result.warnings).toHaveLength(1);
1014
- expect(result.warnings[0]).toContain("unsupported aggregation 'hyperloglog'");
1015
- expect(result.warnings[0]).toContain('weird_measure');
1016
- });
1017
- it('collects warning for skipped conversion metrics', () => {
1018
- const result = parseOne(yaml `
1019
- semantic_models:
1020
- - name: events
1021
- model: ref('events')
1022
- dimensions: []
1023
- measures:
1024
- - name: event_count
1025
- agg: count
1026
- expr: '1'
1027
- metrics:
1028
- - name: signup_conversion
1029
- type: conversion
1030
- type_params:
1031
- conversion_type_params:
1032
- entity: user_id
1033
- base_measure: page_views
1034
- conversion_measure: signups
1035
- `);
1036
- expect(result.warnings).toHaveLength(1);
1037
- expect(result.warnings[0]).toContain('conversion metrics are not yet supported');
1038
- expect(result.warnings[0]).toContain('signup_conversion');
1039
- });
1040
- it('collects warning for non-median percentile', () => {
1041
- const result = parseOne(yaml `
1042
- semantic_models:
1043
- - name: orders
1044
- model: ref('orders')
1045
- dimensions: []
1046
- measures:
1047
- - name: p95_time
1048
- agg: percentile
1049
- expr: delivery_hours
1050
- agg_params:
1051
- percentile: 0.95
1052
- `);
1053
- expect(result.warnings).toHaveLength(1);
1054
- expect(result.warnings[0]).toContain("aggregation 'none'");
1055
- expect(result.warnings[0]).toContain('p95');
1056
- });
1057
- it('collects warning for unparseable YAML', () => {
1058
- const result = parseOne('{{{{invalid yaml!!!!');
1059
- expect(result.warnings).toHaveLength(1);
1060
- expect(result.warnings[0]).toContain('Failed to parse YAML');
1061
- });
1062
- it('collects multiple warnings from different sources', () => {
1063
- const result = parseOne(yaml `
1064
- semantic_models:
1065
- - name: orders
1066
- model: ref('orders')
1067
- dimensions: []
1068
- measures:
1069
- - name: weird_one
1070
- agg: hyperloglog
1071
- expr: x
1072
- - name: weird_two
1073
- agg: custom_agg
1074
- expr: y
1075
- metrics:
1076
- - name: funnel
1077
- type: conversion
1078
- type_params:
1079
- conversion_type_params:
1080
- entity: user_id
1081
- base_measure: a
1082
- conversion_measure: b
1083
- `);
1084
- expect(result.warnings).toHaveLength(3);
1085
- });
1086
- });
1087
- // ============ Entity Description Passthrough ============
1088
- describe('parseFiles — entity description on relationships', () => {
1089
- it('passes entity description to relationship', () => {
1090
- const result = parseOne(yaml `
1091
- semantic_models:
1092
- - name: customers
1093
- model: ref('dim_customers')
1094
- entities:
1095
- - name: customer_id
1096
- type: primary
1097
- expr: id
1098
- dimensions: []
1099
- measures: []
1100
- - name: orders
1101
- model: ref('fct_orders')
1102
- entities:
1103
- - name: order_id
1104
- type: primary
1105
- - name: customer_id
1106
- type: foreign
1107
- description: Links order to the purchasing customer
1108
- dimensions: []
1109
- measures: []
1110
- `);
1111
- expect(result.relationships).toHaveLength(1);
1112
- expect(result.relationships[0].description).toBe('Links order to the purchasing customer');
1113
- });
1114
- it('omits description when entity has no description', () => {
1115
- const result = parseOne(yaml `
1116
- semantic_models:
1117
- - name: customers
1118
- model: ref('dim_customers')
1119
- entities:
1120
- - name: customer_id
1121
- type: primary
1122
- expr: id
1123
- dimensions: []
1124
- measures: []
1125
- - name: orders
1126
- model: ref('fct_orders')
1127
- entities:
1128
- - name: order_id
1129
- type: primary
1130
- - name: customer_id
1131
- type: foreign
1132
- dimensions: []
1133
- measures: []
1134
- `);
1135
- expect(result.relationships).toHaveLength(1);
1136
- expect(result.relationships[0].description).toBeUndefined();
1137
- });
1138
- });
1139
- });