@kaelio/ktx 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (872) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.6.0-py3-none-any.whl} +0 -0
  2. package/assets/python/manifest.json +4 -4
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/clack.d.ts +8 -0
  5. package/dist/clack.js +14 -0
  6. package/dist/connection.js +2 -9
  7. package/dist/connectors/bigquery/connector.d.ts +6 -1
  8. package/dist/connectors/bigquery/connector.js +38 -9
  9. package/dist/connectors/bigquery/dialect.d.ts +11 -9
  10. package/dist/connectors/bigquery/dialect.js +25 -45
  11. package/dist/connectors/clickhouse/connector.d.ts +5 -0
  12. package/dist/connectors/clickhouse/connector.js +36 -3
  13. package/dist/connectors/clickhouse/dialect.d.ts +11 -12
  14. package/dist/connectors/clickhouse/dialect.js +25 -100
  15. package/dist/connectors/mysql/connector.d.ts +7 -1
  16. package/dist/connectors/mysql/connector.js +67 -9
  17. package/dist/connectors/mysql/dialect.d.ts +11 -9
  18. package/dist/connectors/mysql/dialect.js +25 -43
  19. package/dist/connectors/postgres/connector.d.ts +6 -0
  20. package/dist/connectors/postgres/connector.js +67 -12
  21. package/dist/connectors/postgres/dialect.d.ts +11 -9
  22. package/dist/connectors/postgres/dialect.js +26 -35
  23. package/dist/connectors/snowflake/connector.d.ts +8 -3
  24. package/dist/connectors/snowflake/connector.js +39 -20
  25. package/dist/connectors/snowflake/dialect.d.ts +11 -9
  26. package/dist/connectors/snowflake/dialect.js +25 -24
  27. package/dist/connectors/sqlite/connector.d.ts +3 -1
  28. package/dist/connectors/sqlite/connector.js +23 -3
  29. package/dist/connectors/sqlite/dialect.d.ts +11 -9
  30. package/dist/connectors/sqlite/dialect.js +25 -29
  31. package/dist/connectors/sqlserver/connector.d.ts +6 -0
  32. package/dist/connectors/sqlserver/connector.js +56 -9
  33. package/dist/connectors/sqlserver/dialect.d.ts +11 -10
  34. package/dist/connectors/sqlserver/dialect.js +24 -40
  35. package/dist/context/connections/connection-type.d.ts +1 -1
  36. package/dist/context/connections/dialect-helpers.d.ts +9 -0
  37. package/dist/context/connections/dialect-helpers.js +67 -0
  38. package/dist/context/connections/dialects.d.ts +23 -5
  39. package/dist/context/connections/dialects.js +18 -56
  40. package/dist/context/connections/drivers.d.ts +23 -0
  41. package/dist/context/connections/drivers.js +171 -0
  42. package/dist/context/connections/local-query-executor.js +25 -7
  43. package/dist/context/connections/local-warehouse-descriptor.js +0 -2
  44. package/dist/context/connections/postgres-query-executor.js +1 -1
  45. package/dist/context/connections/sqlite-query-executor.js +1 -1
  46. package/dist/context/ingest/adapters/historic-sql/chunk-unified.js +1 -1
  47. package/dist/context/ingest/adapters/historic-sql/connection-dialect.js +11 -7
  48. package/dist/context/ingest/adapters/historic-sql/evidence-tool.d.ts +1 -1
  49. package/dist/context/ingest/adapters/historic-sql/evidence-tool.js +8 -5
  50. package/dist/context/ingest/adapters/historic-sql/evidence.d.ts +4 -4
  51. package/dist/context/ingest/adapters/historic-sql/evidence.js +2 -2
  52. package/dist/context/ingest/adapters/historic-sql/projection.js +5 -2
  53. package/dist/context/ingest/adapters/live-database/daemon-introspection.js +1 -1
  54. package/dist/context/ingest/adapters/live-database/stage.d.ts +2 -0
  55. package/dist/context/ingest/adapters/live-database/stage.js +9 -0
  56. package/dist/context/ingest/adapters/looker/mapping.d.ts +0 -3
  57. package/dist/context/ingest/adapters/looker/mapping.js +0 -3
  58. package/dist/context/ingest/adapters/looker/types.d.ts +1 -1
  59. package/dist/context/ingest/historic-sql-probes/bigquery-runner.d.ts +34 -0
  60. package/dist/context/ingest/historic-sql-probes/bigquery-runner.js +99 -0
  61. package/dist/context/ingest/historic-sql-probes/postgres-runner.d.ts +26 -0
  62. package/dist/context/ingest/historic-sql-probes/postgres-runner.js +76 -0
  63. package/dist/context/ingest/historic-sql-probes/snowflake-runner.d.ts +29 -0
  64. package/dist/context/ingest/historic-sql-probes/snowflake-runner.js +62 -0
  65. package/dist/context/ingest/historic-sql-probes.d.ts +46 -0
  66. package/dist/context/ingest/historic-sql-probes.js +62 -0
  67. package/dist/context/ingest/local-adapters.js +0 -1
  68. package/dist/context/ingest/local-ingest.js +1 -1
  69. package/dist/context/mcp/context-tools.js +11 -48
  70. package/dist/context/mcp/local-project-ports.js +0 -3
  71. package/dist/context/project/config.d.ts +0 -8
  72. package/dist/context/project/driver-schemas.d.ts +0 -4
  73. package/dist/context/project/driver-schemas.js +0 -2
  74. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  75. package/dist/context/scan/constraint-discovery.js +23 -0
  76. package/dist/context/scan/enabled-tables.d.ts +4 -5
  77. package/dist/context/scan/enabled-tables.js +4 -18
  78. package/dist/context/scan/entity-details.js +14 -44
  79. package/dist/context/scan/local-enrichment.js +13 -1
  80. package/dist/context/scan/local-scan.js +5 -4
  81. package/dist/context/scan/local-structural-artifacts.js +51 -0
  82. package/dist/context/scan/relationship-benchmarks.js +9 -6
  83. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  84. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  85. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  86. package/dist/context/scan/relationship-discovery.js +4 -4
  87. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  88. package/dist/context/scan/relationship-profiling.js +25 -94
  89. package/dist/context/scan/relationship-validation.d.ts +3 -2
  90. package/dist/context/scan/relationship-validation.js +12 -22
  91. package/dist/context/scan/table-ref.d.ts +1 -2
  92. package/dist/context/scan/table-ref.js +3 -4
  93. package/dist/context/scan/types.d.ts +6 -2
  94. package/dist/context/scan/warehouse-catalog.js +31 -48
  95. package/dist/context/sl/local-query.js +0 -3
  96. package/dist/context/sl/local-sl.js +0 -13
  97. package/dist/context/sl/semantic-layer.service.js +1 -4
  98. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  99. package/dist/context-build-view.js +1 -1
  100. package/dist/database-tree-picker.js +14 -7
  101. package/dist/error-message.d.ts +1 -0
  102. package/dist/error-message.js +29 -0
  103. package/dist/ingest-depth.js +0 -1
  104. package/dist/ingest.js +2 -2
  105. package/dist/llm/embedding-health.js +2 -2
  106. package/dist/local-scan-connectors.js +13 -56
  107. package/dist/managed-local-embeddings.js +2 -1
  108. package/dist/managed-python-daemon.d.ts +5 -0
  109. package/dist/managed-python-daemon.js +29 -9
  110. package/dist/managed-python-http.js +2 -1
  111. package/dist/public-ingest.js +1 -6
  112. package/dist/runtime-requirements.js +2 -2
  113. package/dist/setup-agents.d.ts +1 -1
  114. package/dist/setup-agents.js +16 -74
  115. package/dist/setup-context.js +2 -1
  116. package/dist/setup-databases.d.ts +3 -13
  117. package/dist/setup-databases.js +141 -313
  118. package/dist/setup-embeddings.js +10 -2
  119. package/dist/setup-runtime.js +2 -1
  120. package/dist/setup-sources.js +2 -1
  121. package/dist/setup.js +10 -4
  122. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  123. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  124. package/dist/skills/sl/SKILL.md +2 -2
  125. package/dist/sql.js +0 -4
  126. package/dist/status-project.d.ts +3 -18
  127. package/dist/status-project.js +42 -216
  128. package/dist/telemetry/events.d.ts +1 -1
  129. package/dist/telemetry/index.js +8 -3
  130. package/dist/tree-picker-state.d.ts +2 -2
  131. package/dist/tree-picker-state.js +29 -13
  132. package/dist/tree-picker-tui.d.ts +3 -1
  133. package/dist/tree-picker-tui.js +20 -32
  134. package/package.json +6 -6
  135. package/dist/admin-reindex.test.d.ts +0 -1
  136. package/dist/admin-reindex.test.js +0 -119
  137. package/dist/admin.test.d.ts +0 -1
  138. package/dist/admin.test.js +0 -201
  139. package/dist/cli-program-telemetry.test.d.ts +0 -1
  140. package/dist/cli-program-telemetry.test.js +0 -89
  141. package/dist/cli-program.test.d.ts +0 -1
  142. package/dist/cli-program.test.js +0 -71
  143. package/dist/command-tree.test.d.ts +0 -1
  144. package/dist/command-tree.test.js +0 -126
  145. package/dist/commands/mcp-commands.test.d.ts +0 -1
  146. package/dist/commands/mcp-commands.test.js +0 -111
  147. package/dist/commands/sql-commands.test.d.ts +0 -1
  148. package/dist/commands/sql-commands.test.js +0 -68
  149. package/dist/connection.test.d.ts +0 -1
  150. package/dist/connection.test.js +0 -426
  151. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  152. package/dist/connectors/bigquery/connector.test.js +0 -363
  153. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  154. package/dist/connectors/bigquery/dialect.test.js +0 -36
  155. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  156. package/dist/connectors/clickhouse/connector.test.js +0 -342
  157. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  158. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  159. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  160. package/dist/connectors/mysql/connector.test.js +0 -365
  161. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  162. package/dist/connectors/mysql/dialect.test.js +0 -36
  163. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  164. package/dist/connectors/postgres/connector.test.js +0 -391
  165. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  166. package/dist/connectors/postgres/dialect.test.js +0 -37
  167. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  168. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  169. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  170. package/dist/connectors/snowflake/connector.test.js +0 -462
  171. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  172. package/dist/connectors/snowflake/dialect.test.js +0 -34
  173. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  174. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  175. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  176. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  177. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  178. package/dist/connectors/sqlite/connector.test.js +0 -207
  179. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  180. package/dist/connectors/sqlite/dialect.test.js +0 -23
  181. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  182. package/dist/connectors/sqlserver/connector.test.js +0 -313
  183. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  184. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  185. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  186. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  187. package/dist/context/connections/dialects.test.d.ts +0 -1
  188. package/dist/context/connections/dialects.test.js +0 -24
  189. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  190. package/dist/context/connections/local-query-executor.test.js +0 -48
  191. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  192. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  193. package/dist/context/connections/notion-config.test.d.ts +0 -1
  194. package/dist/context/connections/notion-config.test.js +0 -121
  195. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  196. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  197. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  198. package/dist/context/connections/read-only-sql.test.js +0 -20
  199. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  200. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  201. package/dist/context/core/config-reference.test.d.ts +0 -1
  202. package/dist/context/core/config-reference.test.js +0 -27
  203. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  204. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  205. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  206. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  207. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  208. package/dist/context/core/git.service.patch.test.js +0 -40
  209. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  210. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  211. package/dist/context/core/git.service.test.d.ts +0 -1
  212. package/dist/context/core/git.service.test.js +0 -357
  213. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  214. package/dist/context/core/session-worktree.service.test.js +0 -97
  215. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  216. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  217. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  218. package/dist/context/index-sync/reindex.test.js +0 -139
  219. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  220. package/dist/context/ingest/action-identity.test.js +0 -19
  221. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  222. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  223. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  224. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  225. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  226. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  227. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  228. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  229. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  230. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  231. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  232. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  233. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  234. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  235. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  236. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  237. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  238. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  239. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  240. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  241. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  242. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  243. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  244. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  245. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  246. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  247. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  248. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  249. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  250. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  251. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  252. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  253. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  254. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  255. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  256. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  257. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  258. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  259. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  260. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  261. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  262. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  263. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  264. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  265. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  266. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  267. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  268. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  269. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  270. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  271. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  272. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  273. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  274. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  275. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  276. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  277. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  278. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  279. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  280. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  281. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  282. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  283. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  284. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  285. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  286. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  287. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  288. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  289. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  290. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  291. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  292. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  293. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  294. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  295. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  296. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  297. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  298. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  299. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  300. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  301. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  302. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  303. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  304. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  305. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  306. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  307. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  308. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  309. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  310. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  311. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  312. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  313. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  314. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  315. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  316. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  317. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  318. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  319. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  320. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  321. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  322. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  323. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  324. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  325. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  326. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  327. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  328. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  329. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  330. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  331. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  332. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  333. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  334. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  335. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  336. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  337. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  338. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  339. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  340. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  341. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  342. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  343. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  344. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  345. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  346. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  347. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  348. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  349. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  350. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  351. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  352. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  353. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  354. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  355. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  356. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  357. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  358. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  359. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  360. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  361. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  362. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  363. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  364. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  365. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  366. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  367. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  368. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  369. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  370. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  371. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  372. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  373. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  374. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  375. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  376. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  377. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  378. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  379. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  380. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  381. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  382. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  383. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  384. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  385. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  386. package/dist/context/ingest/artifact-gates.test.js +0 -167
  387. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  388. package/dist/context/ingest/canonical-pins.test.js +0 -66
  389. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  390. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  391. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  392. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  393. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  394. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  395. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  396. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  397. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  398. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  399. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  400. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  401. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  402. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  403. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  404. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  405. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  406. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  407. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  408. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  409. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  410. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  411. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  412. package/dist/context/ingest/diff-set.service.test.js +0 -132
  413. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  414. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  415. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  416. package/dist/context/ingest/finalization-scope.test.js +0 -114
  417. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  418. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  419. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  420. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  421. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  422. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  423. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  424. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  425. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  426. package/dist/context/ingest/ingest-trace.test.js +0 -76
  427. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  428. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  429. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  430. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  431. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  432. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  433. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  434. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  435. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  436. package/dist/context/ingest/local-adapters.test.js +0 -612
  437. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  438. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  439. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  440. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  441. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  442. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  443. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  444. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  445. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  446. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  447. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  448. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  449. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  450. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  451. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  452. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  453. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  454. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  455. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  456. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  457. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  458. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  459. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  460. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  461. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  462. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  463. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  464. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  465. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  466. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  467. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  468. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  469. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  470. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  471. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  472. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  473. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  474. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  475. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  476. package/dist/context/ingest/repo-fetch.test.js +0 -168
  477. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  478. package/dist/context/ingest/report-snapshot.test.js +0 -329
  479. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  480. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  481. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  482. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  483. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  484. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  485. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  486. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  487. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  488. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  489. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  490. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  491. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  492. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  493. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  494. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  495. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  496. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  497. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  498. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  499. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  500. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  501. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  502. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  503. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  504. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  505. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  506. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  507. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  508. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  509. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  510. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  511. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  512. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  513. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  514. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  515. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  516. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  517. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  518. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  519. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  520. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  521. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  522. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  523. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  524. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  525. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  526. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  527. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  528. package/dist/context/llm/claude-code-env.test.js +0 -17
  529. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  530. package/dist/context/llm/claude-code-models.test.js +0 -15
  531. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  532. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  533. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  534. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  535. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  536. package/dist/context/llm/embedding-port.test.js +0 -34
  537. package/dist/context/llm/local-config.test.d.ts +0 -1
  538. package/dist/context/llm/local-config.test.js +0 -164
  539. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  540. package/dist/context/llm/runtime-local-config.test.js +0 -17
  541. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  542. package/dist/context/llm/runtime-tools.test.js +0 -36
  543. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  544. package/dist/context/mcp/local-project-ports.test.js +0 -689
  545. package/dist/context/mcp/server.test.d.ts +0 -1
  546. package/dist/context/mcp/server.test.js +0 -902
  547. package/dist/context/memory/local-memory.test.d.ts +0 -1
  548. package/dist/context/memory/local-memory.test.js +0 -173
  549. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  550. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  551. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  552. package/dist/context/memory/memory-agent.service.test.js +0 -413
  553. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  554. package/dist/context/memory/memory-runs.test.js +0 -158
  555. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  556. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  557. package/dist/context/project/config.test.d.ts +0 -1
  558. package/dist/context/project/config.test.js +0 -467
  559. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  560. package/dist/context/project/driver-schemas.test.js +0 -125
  561. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  562. package/dist/context/project/local-git-file-store.test.js +0 -71
  563. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  564. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  565. package/dist/context/project/project.test.d.ts +0 -1
  566. package/dist/context/project/project.test.js +0 -55
  567. package/dist/context/project/setup-config.test.d.ts +0 -1
  568. package/dist/context/project/setup-config.test.js +0 -38
  569. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  570. package/dist/context/prompts/prompt.service.test.js +0 -43
  571. package/dist/context/scan/credentials.test.d.ts +0 -1
  572. package/dist/context/scan/credentials.test.js +0 -162
  573. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  574. package/dist/context/scan/data-dictionary.test.js +0 -92
  575. package/dist/context/scan/description-generation.test.d.ts +0 -1
  576. package/dist/context/scan/description-generation.test.js +0 -693
  577. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  578. package/dist/context/scan/embedding-text.test.js +0 -36
  579. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  580. package/dist/context/scan/enrichment-state.test.js +0 -147
  581. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  582. package/dist/context/scan/enrichment-summary.test.js +0 -34
  583. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  584. package/dist/context/scan/enrichment-types.test.js +0 -141
  585. package/dist/context/scan/entity-details.test.d.ts +0 -1
  586. package/dist/context/scan/entity-details.test.js +0 -234
  587. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  588. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  589. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  590. package/dist/context/scan/local-enrichment.test.js +0 -765
  591. package/dist/context/scan/local-scan.test.d.ts +0 -1
  592. package/dist/context/scan/local-scan.test.js +0 -1663
  593. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  594. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  595. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  596. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  597. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  598. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  599. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  600. package/dist/context/scan/relationship-budget.test.js +0 -71
  601. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  602. package/dist/context/scan/relationship-candidates.test.js +0 -747
  603. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  604. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  605. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  606. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  607. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  608. package/dist/context/scan/relationship-discovery.test.js +0 -618
  609. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  610. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  611. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  612. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  613. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  614. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  615. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  616. package/dist/context/scan/relationship-locality.test.js +0 -128
  617. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  618. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  619. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  620. package/dist/context/scan/relationship-profiling.test.js +0 -392
  621. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  622. package/dist/context/scan/relationship-scoring.test.js +0 -86
  623. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  624. package/dist/context/scan/relationship-validation.test.js +0 -455
  625. package/dist/context/scan/table-ref.test.d.ts +0 -1
  626. package/dist/context/scan/table-ref.test.js +0 -53
  627. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  628. package/dist/context/scan/type-normalization.test.js +0 -21
  629. package/dist/context/scan/types.test.d.ts +0 -1
  630. package/dist/context/scan/types.test.js +0 -206
  631. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  632. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  633. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  634. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  635. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  636. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  637. package/dist/context/search/discover.test.d.ts +0 -1
  638. package/dist/context/search/discover.test.js +0 -197
  639. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  640. package/dist/context/search/hybrid-search-core.test.js +0 -113
  641. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  642. package/dist/context/search/pglite-owner-process.test.js +0 -273
  643. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  644. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  645. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  646. package/dist/context/search/pglite-spike.test.js +0 -249
  647. package/dist/context/search/query.test.d.ts +0 -1
  648. package/dist/context/search/query.test.js +0 -23
  649. package/dist/context/search/rrf.test.d.ts +0 -1
  650. package/dist/context/search/rrf.test.js +0 -47
  651. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  652. package/dist/context/skills/skills-registry.service.test.js +0 -161
  653. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  654. package/dist/context/sl/dictionary-search.test.js +0 -204
  655. package/dist/context/sl/local-query.test.d.ts +0 -1
  656. package/dist/context/sl/local-query.test.js +0 -283
  657. package/dist/context/sl/local-sl.test.d.ts +0 -1
  658. package/dist/context/sl/local-sl.test.js +0 -334
  659. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  660. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  661. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  662. package/dist/context/sl/schemas.contract.test.js +0 -62
  663. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  664. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  665. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  666. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  667. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  668. package/dist/context/sl/sl-search.service.test.js +0 -256
  669. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  670. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  671. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  672. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  673. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  674. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  675. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  676. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  677. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  678. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  679. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  680. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  681. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  682. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  683. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  684. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  685. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  686. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  687. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  688. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  689. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  690. package/dist/context/test/make-local-git-repo.js +0 -34
  691. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  692. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  693. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  694. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  695. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  696. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  697. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  698. package/dist/context/wiki/local-knowledge.test.js +0 -270
  699. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  700. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  701. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  702. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  703. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  704. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  705. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  706. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  707. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  708. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  709. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  710. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  711. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  712. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  713. package/dist/context-build-view.test.d.ts +0 -1
  714. package/dist/context-build-view.test.js +0 -942
  715. package/dist/database-tree-picker.test.d.ts +0 -1
  716. package/dist/database-tree-picker.test.js +0 -188
  717. package/dist/demo-assets.test.d.ts +0 -1
  718. package/dist/demo-assets.test.js +0 -121
  719. package/dist/demo-metrics.test.d.ts +0 -1
  720. package/dist/demo-metrics.test.js +0 -108
  721. package/dist/doctor.test.d.ts +0 -1
  722. package/dist/doctor.test.js +0 -596
  723. package/dist/embedding-resolution.test.d.ts +0 -1
  724. package/dist/embedding-resolution.test.js +0 -132
  725. package/dist/example-smoke.test.d.ts +0 -1
  726. package/dist/example-smoke.test.js +0 -83
  727. package/dist/index.test.d.ts +0 -1
  728. package/dist/index.test.js +0 -1300
  729. package/dist/ingest-query-executor.test.d.ts +0 -1
  730. package/dist/ingest-query-executor.test.js +0 -71
  731. package/dist/ingest-report-file.test.d.ts +0 -1
  732. package/dist/ingest-report-file.test.js +0 -63
  733. package/dist/ingest-viz.test.d.ts +0 -1
  734. package/dist/ingest-viz.test.js +0 -691
  735. package/dist/ingest.test-utils.d.ts +0 -126
  736. package/dist/ingest.test-utils.js +0 -629
  737. package/dist/ingest.test.d.ts +0 -1
  738. package/dist/ingest.test.js +0 -1568
  739. package/dist/io/logger.test.d.ts +0 -1
  740. package/dist/io/logger.test.js +0 -55
  741. package/dist/io/mode.test.d.ts +0 -1
  742. package/dist/io/mode.test.js +0 -48
  743. package/dist/io/print-list.test.d.ts +0 -1
  744. package/dist/io/print-list.test.js +0 -277
  745. package/dist/knowledge.test.d.ts +0 -1
  746. package/dist/knowledge.test.js +0 -198
  747. package/dist/llm/embedding-health.test.d.ts +0 -1
  748. package/dist/llm/embedding-health.test.js +0 -72
  749. package/dist/llm/embedding-provider.test.d.ts +0 -1
  750. package/dist/llm/embedding-provider.test.js +0 -84
  751. package/dist/llm/message-builder.test.d.ts +0 -1
  752. package/dist/llm/message-builder.test.js +0 -127
  753. package/dist/llm/model-health.test.d.ts +0 -1
  754. package/dist/llm/model-health.test.js +0 -55
  755. package/dist/llm/model-provider.test.d.ts +0 -1
  756. package/dist/llm/model-provider.test.js +0 -246
  757. package/dist/llm/repair.test.d.ts +0 -1
  758. package/dist/llm/repair.test.js +0 -78
  759. package/dist/local-adapters.test.d.ts +0 -1
  760. package/dist/local-adapters.test.js +0 -166
  761. package/dist/local-scan-connectors.test.d.ts +0 -1
  762. package/dist/local-scan-connectors.test.js +0 -92
  763. package/dist/managed-local-embeddings.test.d.ts +0 -1
  764. package/dist/managed-local-embeddings.test.js +0 -229
  765. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  766. package/dist/managed-mcp-daemon.test.js +0 -187
  767. package/dist/managed-python-command.test.d.ts +0 -1
  768. package/dist/managed-python-command.test.js +0 -262
  769. package/dist/managed-python-daemon.test.d.ts +0 -1
  770. package/dist/managed-python-daemon.test.js +0 -360
  771. package/dist/managed-python-http.test.d.ts +0 -1
  772. package/dist/managed-python-http.test.js +0 -177
  773. package/dist/managed-python-runtime.test.d.ts +0 -1
  774. package/dist/managed-python-runtime.test.js +0 -426
  775. package/dist/mcp-http-server.test.d.ts +0 -1
  776. package/dist/mcp-http-server.test.js +0 -209
  777. package/dist/mcp-server-factory.test.d.ts +0 -1
  778. package/dist/mcp-server-factory.test.js +0 -142
  779. package/dist/memory-flow-interactive.test.d.ts +0 -1
  780. package/dist/memory-flow-interactive.test.js +0 -109
  781. package/dist/memory-flow-tui.test.d.ts +0 -1
  782. package/dist/memory-flow-tui.test.js +0 -247
  783. package/dist/next-steps.test.d.ts +0 -1
  784. package/dist/next-steps.test.js +0 -77
  785. package/dist/notion-page-picker.test.d.ts +0 -1
  786. package/dist/notion-page-picker.test.js +0 -244
  787. package/dist/print-command-tree.test.d.ts +0 -1
  788. package/dist/print-command-tree.test.js +0 -37
  789. package/dist/project-dir.test.d.ts +0 -1
  790. package/dist/project-dir.test.js +0 -124
  791. package/dist/project-resolver.test.d.ts +0 -1
  792. package/dist/project-resolver.test.js +0 -49
  793. package/dist/prompt-navigation.test.d.ts +0 -1
  794. package/dist/prompt-navigation.test.js +0 -33
  795. package/dist/proxy-env.test.d.ts +0 -1
  796. package/dist/proxy-env.test.js +0 -17
  797. package/dist/public-ingest-copy.test.d.ts +0 -1
  798. package/dist/public-ingest-copy.test.js +0 -24
  799. package/dist/public-ingest.test.d.ts +0 -1
  800. package/dist/public-ingest.test.js +0 -891
  801. package/dist/runtime-requirements.test.d.ts +0 -1
  802. package/dist/runtime-requirements.test.js +0 -73
  803. package/dist/runtime.test.d.ts +0 -1
  804. package/dist/runtime.test.js +0 -381
  805. package/dist/scan.test.d.ts +0 -1
  806. package/dist/scan.test.js +0 -1123
  807. package/dist/setup-agents.test.d.ts +0 -1
  808. package/dist/setup-agents.test.js +0 -1028
  809. package/dist/setup-context.test.d.ts +0 -1
  810. package/dist/setup-context.test.js +0 -491
  811. package/dist/setup-databases.test.d.ts +0 -1
  812. package/dist/setup-databases.test.js +0 -2101
  813. package/dist/setup-demo-tour.test.d.ts +0 -1
  814. package/dist/setup-demo-tour.test.js +0 -221
  815. package/dist/setup-embeddings.test.d.ts +0 -1
  816. package/dist/setup-embeddings.test.js +0 -436
  817. package/dist/setup-interrupt.test.d.ts +0 -1
  818. package/dist/setup-interrupt.test.js +0 -77
  819. package/dist/setup-models.test.d.ts +0 -1
  820. package/dist/setup-models.test.js +0 -885
  821. package/dist/setup-project.test.d.ts +0 -1
  822. package/dist/setup-project.test.js +0 -209
  823. package/dist/setup-prompts.test.d.ts +0 -1
  824. package/dist/setup-prompts.test.js +0 -208
  825. package/dist/setup-ready-menu.test.d.ts +0 -1
  826. package/dist/setup-ready-menu.test.js +0 -44
  827. package/dist/setup-runtime.test.d.ts +0 -1
  828. package/dist/setup-runtime.test.js +0 -111
  829. package/dist/setup-secrets.test.d.ts +0 -1
  830. package/dist/setup-secrets.test.js +0 -30
  831. package/dist/setup-sources-notion.test.d.ts +0 -1
  832. package/dist/setup-sources-notion.test.js +0 -109
  833. package/dist/setup-sources.test.d.ts +0 -1
  834. package/dist/setup-sources.test.js +0 -1303
  835. package/dist/setup.test.d.ts +0 -1
  836. package/dist/setup.test.js +0 -1825
  837. package/dist/sl.test.d.ts +0 -1
  838. package/dist/sl.test.js +0 -567
  839. package/dist/source-mapping.test.d.ts +0 -1
  840. package/dist/source-mapping.test.js +0 -65
  841. package/dist/sql.test.d.ts +0 -1
  842. package/dist/sql.test.js +0 -253
  843. package/dist/standalone-smoke.test.d.ts +0 -1
  844. package/dist/standalone-smoke.test.js +0 -250
  845. package/dist/status-project.test.d.ts +0 -1
  846. package/dist/status-project.test.js +0 -502
  847. package/dist/telemetry/command-hook.test.d.ts +0 -1
  848. package/dist/telemetry/command-hook.test.js +0 -31
  849. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  850. package/dist/telemetry/demo-detect.test.js +0 -22
  851. package/dist/telemetry/emitter.test.d.ts +0 -1
  852. package/dist/telemetry/emitter.test.js +0 -103
  853. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  854. package/dist/telemetry/events.snapshot.test.js +0 -135
  855. package/dist/telemetry/events.test.d.ts +0 -1
  856. package/dist/telemetry/events.test.js +0 -136
  857. package/dist/telemetry/identity.test.d.ts +0 -1
  858. package/dist/telemetry/identity.test.js +0 -148
  859. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  860. package/dist/telemetry/project-snapshot.test.js +0 -71
  861. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  862. package/dist/telemetry/schema-writer.test.js +0 -23
  863. package/dist/telemetry/scrubber.test.d.ts +0 -1
  864. package/dist/telemetry/scrubber.test.js +0 -21
  865. package/dist/text-ingest.test.d.ts +0 -1
  866. package/dist/text-ingest.test.js +0 -247
  867. package/dist/tree-picker-state.test.d.ts +0 -1
  868. package/dist/tree-picker-state.test.js +0 -303
  869. package/dist/tree-picker-tui.test.d.ts +0 -1
  870. package/dist/tree-picker-tui.test.js +0 -248
  871. package/dist/viz-fallback.test.d.ts +0 -1
  872. package/dist/viz-fallback.test.js +0 -77
@@ -1,1568 +0,0 @@
1
- import { access, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { LocalLookerRuntimeStore } from './context/ingest/adapters/looker/local-runtime-store.js';
5
- import { LocalMetabaseDiscoveryCache } from './context/ingest/adapters/metabase/local-source-state-store.js';
6
- import { initKtxProject, loadKtxProject } from './context/project/project.js';
7
- import { ktxLocalStateDbPath } from './context/project/local-state-db.js';
8
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
9
- import { runKtxIngest } from './ingest.js';
10
- import { CliLookerSlWritingAgentRunner, CliMetabaseAgentRunner, CliMetabaseSourceAdapter, completedLocalBundleRun, failedLocalBundleRun, localFakeBundleReport, makeCliLookerParser, makeCliLookerRuntimeClient, makeIo, persistLocalBundleReport, runPublicMetabaseSyncModeCase, writeMetabaseConfig, writeWarehouseConfig, } from './ingest.test-utils.js';
11
- import { resetVizFallbackWarningsForTest } from './viz-fallback.js';
12
- import { runKtxSetup } from './setup.js';
13
- describe('runKtxIngest', () => {
14
- let tempDir;
15
- let originalTerm;
16
- const interactiveEnv = () => ({ ...process.env, CI: 'false' });
17
- const runtimeReady = (projectDir) => ({
18
- status: 'ready',
19
- projectDir,
20
- requirements: { features: ['core'], requirements: [] },
21
- });
22
- beforeEach(async () => {
23
- resetVizFallbackWarningsForTest();
24
- originalTerm = process.env.TERM;
25
- process.env.TERM = 'xterm-256color';
26
- tempDir = await mkdtemp(join(tmpdir(), 'ktx-cli-ingest-'));
27
- });
28
- afterEach(async () => {
29
- if (originalTerm === undefined) {
30
- delete process.env.TERM;
31
- }
32
- else {
33
- process.env.TERM = originalTerm;
34
- }
35
- await rm(tempDir, { recursive: true, force: true });
36
- });
37
- it('runs local ingest and reads status', async () => {
38
- const projectDir = join(tempDir, 'project');
39
- await writeWarehouseConfig(projectDir);
40
- const sourceDir = join(tempDir, 'source');
41
- await mkdir(join(sourceDir, 'orders'), { recursive: true });
42
- await writeFile(join(sourceDir, 'orders', 'orders.json'), '{"name":"orders"}\n', 'utf-8');
43
- const runLocal = vi.fn(async (input) => {
44
- const result = completedLocalBundleRun(input, 'cli-local-run-1');
45
- await persistLocalBundleReport(projectDir, result.report);
46
- return result;
47
- });
48
- const runIo = makeIo();
49
- await expect(runKtxIngest({
50
- command: 'run',
51
- projectDir,
52
- connectionId: 'warehouse',
53
- adapter: 'fake',
54
- sourceDir,
55
- outputMode: 'plain',
56
- }, runIo.io, {
57
- runLocalIngest: runLocal,
58
- jobIdFactory: () => 'cli-local-run-1',
59
- })).resolves.toBe(0);
60
- expect(runIo.stdout()).toContain('Report: report-live-1');
61
- expect(runIo.stdout()).toContain('Run: run-live-1');
62
- expect(runIo.stdout()).toContain('Job: cli-local-run-1');
63
- expect(runIo.stdout()).toContain('Status: done');
64
- expect(runIo.stdout()).toContain('Diff: +2/~0/-0/=0');
65
- expect(runIo.stdout()).toContain('Saved memory: 1 wiki, 1 SL');
66
- const statusIo = makeIo();
67
- await expect(runKtxIngest({ command: 'status', projectDir, runId: 'cli-local-run-1', outputMode: 'plain' }, statusIo.io)).resolves.toBe(0);
68
- expect(statusIo.stdout()).toContain('Report: report-live-1');
69
- expect(statusIo.stdout()).toContain('Run: run-live-1');
70
- expect(statusIo.stdout()).toContain('Job: cli-local-run-1');
71
- expect(statusIo.stdout()).toContain('Status: done');
72
- expect(statusIo.stdout()).toContain('Diff: +2/~0/-0/=0');
73
- expect(statusIo.stderr()).toBe('');
74
- });
75
- it('labels internal database reports without adapter names in plain status output', async () => {
76
- const projectDir = join(tempDir, 'project');
77
- await writeWarehouseConfig(projectDir);
78
- const report = localFakeBundleReport('scan-job-1', {
79
- id: 'report-scan-1',
80
- runId: 'run-scan-1',
81
- connectionId: 'warehouse',
82
- sourceKey: 'live-database',
83
- });
84
- const io = makeIo();
85
- await expect(runKtxIngest({
86
- command: 'status',
87
- projectDir,
88
- reportFile: '/tmp/scan-report.json',
89
- outputMode: 'plain',
90
- }, io.io, {
91
- readReportFile: vi.fn(async () => report),
92
- })).resolves.toBe(0);
93
- expect(io.stdout()).toContain('Source: Database schema\n');
94
- expect(io.stdout()).not.toContain('Adapter:');
95
- expect(io.stdout()).not.toContain('live-database');
96
- expect(io.stderr()).toBe('');
97
- });
98
- it('labels internal query-history reports without adapter names in plain status output', async () => {
99
- const projectDir = join(tempDir, 'project');
100
- await writeWarehouseConfig(projectDir);
101
- const report = localFakeBundleReport('query-history-job-1', {
102
- id: 'report-query-history-1',
103
- runId: 'run-query-history-1',
104
- connectionId: 'warehouse',
105
- sourceKey: 'historic-sql',
106
- });
107
- const io = makeIo();
108
- await expect(runKtxIngest({
109
- command: 'status',
110
- projectDir,
111
- reportFile: '/tmp/query-history-report.json',
112
- outputMode: 'plain',
113
- }, io.io, {
114
- readReportFile: vi.fn(async () => report),
115
- })).resolves.toBe(0);
116
- expect(io.stdout()).toContain('Source: Query history\n');
117
- expect(io.stdout()).not.toContain('Adapter:');
118
- expect(io.stdout()).not.toContain('historic-sql');
119
- expect(io.stderr()).toBe('');
120
- });
121
- it('emits structured progress for non-TTY local ingest runs', async () => {
122
- const projectDir = join(tempDir, 'project');
123
- await writeWarehouseConfig(projectDir);
124
- const progressEvents = [];
125
- const runLocal = vi.fn(async (input) => {
126
- input.memoryFlow?.emit({ type: 'source_acquired', adapter: 'fake', trigger: 'manual_resync', fileCount: 2 });
127
- input.memoryFlow?.emit({ type: 'chunks_planned', chunkCount: 2, workUnitCount: 2, evictionCount: 0 });
128
- input.memoryFlow?.emit({ type: 'work_unit_started', unitKey: 'orders', skills: [], stepBudget: 4 });
129
- input.memoryFlow?.emit({ type: 'work_unit_step', unitKey: 'orders', stepIndex: 2, stepBudget: 4 });
130
- return completedLocalBundleRun(input, 'cli-local-progress-1');
131
- });
132
- const io = makeIo();
133
- await expect(runKtxIngest({
134
- command: 'run',
135
- projectDir,
136
- connectionId: 'warehouse',
137
- adapter: 'fake',
138
- outputMode: 'plain',
139
- }, io.io, {
140
- runLocalIngest: runLocal,
141
- jobIdFactory: () => 'cli-local-progress-1',
142
- progress: (event) => progressEvents.push(event),
143
- })).resolves.toBe(0);
144
- expect(progressEvents).toEqual(expect.arrayContaining([
145
- { percent: 5, message: 'Fetching source files for warehouse/fake' },
146
- { percent: 15, message: 'Fetched 2 source files from fake' },
147
- { percent: 45, message: 'Planned 2 tasks' },
148
- expect.objectContaining({
149
- message: 'Processing tasks: 0/2 complete, 1 active; latest orders step 2/4',
150
- transient: true,
151
- }),
152
- ]));
153
- expect(io.stderr()).not.toContain('[15%] Fetched 2 source files from fake');
154
- });
155
- it('describes zero-work-unit ingest progress as finalizing instead of appearing half-planned', async () => {
156
- const projectDir = join(tempDir, 'project');
157
- await writeWarehouseConfig(projectDir);
158
- const progressEvents = [];
159
- const runLocal = vi.fn(async (input) => {
160
- input.memoryFlow?.emit({ type: 'source_acquired', adapter: 'fake', trigger: 'manual_resync', fileCount: 2 });
161
- input.memoryFlow?.emit({ type: 'chunks_planned', chunkCount: 0, workUnitCount: 0, evictionCount: 0 });
162
- return completedLocalBundleRun(input, 'cli-local-zero-progress-1');
163
- });
164
- const io = makeIo();
165
- await expect(runKtxIngest({
166
- command: 'run',
167
- projectDir,
168
- connectionId: 'warehouse',
169
- adapter: 'fake',
170
- outputMode: 'plain',
171
- }, io.io, {
172
- runLocalIngest: runLocal,
173
- jobIdFactory: () => 'cli-local-zero-progress-1',
174
- progress: (event) => progressEvents.push(event),
175
- })).resolves.toBe(0);
176
- expect(progressEvents).toEqual(expect.arrayContaining([
177
- { percent: 80, message: 'No tasks to process; finalizing ingest' },
178
- ]));
179
- expect(progressEvents).not.toContainEqual({ percent: 45, message: 'Planned 0 tasks' });
180
- });
181
- it('prints provider setup guidance when a skip-llm setup project runs ingest', async () => {
182
- const projectDir = join(tempDir, 'project');
183
- const setupIo = makeIo();
184
- await expect(runKtxSetup({
185
- command: 'run',
186
- projectDir,
187
- mode: 'auto',
188
- agents: false,
189
- agentScope: 'project',
190
- skipAgents: true,
191
- inputMode: 'disabled',
192
- yes: true,
193
- cliVersion: '0.0.0-test',
194
- skipLlm: true,
195
- skipEmbeddings: true,
196
- databaseDrivers: ['postgres'],
197
- databaseConnectionId: 'warehouse',
198
- databaseUrl: 'env:WAREHOUSE_URL',
199
- databaseSchemas: [],
200
- enableQueryHistory: true,
201
- skipDatabases: false,
202
- skipSources: true,
203
- }, setupIo.io, {
204
- databasesDeps: {
205
- testConnection: async (_projectDir, _connectionId, io) => {
206
- io.stdout.write('Driver: postgres\nStatus: ok\n');
207
- return 0;
208
- },
209
- scanConnection: async () => 0,
210
- historicSqlProbe: async () => ({ ok: true, lines: ['PASS Historic SQL probe skipped in test'] }),
211
- },
212
- context: async () => ({ status: 'skipped', projectDir }),
213
- runtime: async () => runtimeReady(projectDir),
214
- })).resolves.toBe(0);
215
- const sourceDir = join(tempDir, 'source');
216
- await mkdir(join(sourceDir, 'orders'), { recursive: true });
217
- await writeFile(join(sourceDir, 'orders', 'orders.json'), '{"name":"orders"}\n', 'utf-8');
218
- const runIo = makeIo();
219
- await expect(runKtxIngest({
220
- command: 'run',
221
- projectDir,
222
- connectionId: 'warehouse',
223
- adapter: 'historic-sql',
224
- sourceDir,
225
- allowImplicitAdapter: true,
226
- outputMode: 'plain',
227
- }, runIo.io)).resolves.toBe(1);
228
- expect(runIo.stdout()).toBe('');
229
- expect(runIo.stderr()).toContain('ktx ingest requires llm.provider.backend: anthropic, vertex, gateway, or claude-code, or an injected agentRunner.');
230
- expect(runIo.stderr()).toContain('Configure a local Claude Code session or API-backed LLM, then rerun ingest:');
231
- expect(runIo.stderr()).toContain(`ktx setup --project-dir ${projectDir} --llm-backend claude-code --no-input`);
232
- expect(runIo.stderr()).toContain(`ktx setup --project-dir ${projectDir} --llm-backend anthropic --anthropic-api-key-env ANTHROPIC_API_KEY --llm-model claude-sonnet-4-6 --no-input`);
233
- });
234
- it('routes metabase scheduled pulls to the fan-out runner and prints child summaries', async () => {
235
- const projectDir = join(tempDir, 'project');
236
- await writeMetabaseConfig(projectDir);
237
- const io = makeIo();
238
- const report = localFakeBundleReport('metabase-child-1', {
239
- id: 'report-metabase-child-1',
240
- runId: 'run-a',
241
- jobId: 'metabase-child-1',
242
- connectionId: 'warehouse_a',
243
- sourceKey: 'metabase',
244
- });
245
- await expect(runKtxIngest({
246
- command: 'run',
247
- projectDir,
248
- connectionId: 'prod-metabase',
249
- adapter: 'metabase',
250
- outputMode: 'plain',
251
- }, io.io, {
252
- runLocalMetabaseIngest: async () => ({
253
- metabaseConnectionId: 'prod-metabase',
254
- status: 'all_succeeded',
255
- totals: { workUnits: 2, failedWorkUnits: 0 },
256
- children: [
257
- {
258
- jobId: 'metabase-child-1',
259
- metabaseConnectionId: 'prod-metabase',
260
- metabaseDatabaseId: 1,
261
- targetConnectionId: 'warehouse_a',
262
- result: {
263
- jobId: 'metabase-child-1',
264
- runId: 'run-a',
265
- syncId: 'sync-a',
266
- diffSummary: { added: 0, modified: 0, deleted: 0, unchanged: 0 },
267
- workUnitCount: 1,
268
- failedWorkUnits: [],
269
- artifactsWritten: 0,
270
- commitSha: null,
271
- },
272
- report,
273
- },
274
- ],
275
- }),
276
- })).resolves.toBe(0);
277
- expect(io.stdout()).toContain('Metabase fan-out: all_succeeded');
278
- expect(io.stdout()).toContain('warehouse_a');
279
- expect(io.stdout()).toContain('metabase-child-1');
280
- expect(io.stderr()).toContain('Metabase ingest: prod-metabase');
281
- });
282
- it('returns a non-zero code when Metabase fan-out has failed children', async () => {
283
- const projectDir = join(tempDir, 'project');
284
- await writeMetabaseConfig(projectDir);
285
- const io = makeIo();
286
- const report = localFakeBundleReport('metabase-child-1', {
287
- id: 'report-metabase-child-1',
288
- runId: 'run-a',
289
- jobId: 'metabase-child-1',
290
- connectionId: 'warehouse_a',
291
- sourceKey: 'metabase',
292
- body: {
293
- failedWorkUnits: ['metabase-db-1'],
294
- workUnits: [
295
- {
296
- unitKey: 'metabase-db-1',
297
- rawFiles: ['cards/1.json'],
298
- status: 'failed',
299
- reason: 'tool write failed',
300
- actions: [],
301
- touchedSlSources: [],
302
- },
303
- ],
304
- },
305
- });
306
- await expect(runKtxIngest({
307
- command: 'run',
308
- projectDir,
309
- connectionId: 'prod-metabase',
310
- adapter: 'metabase',
311
- outputMode: 'plain',
312
- }, io.io, {
313
- runLocalMetabaseIngest: async () => ({
314
- metabaseConnectionId: 'prod-metabase',
315
- status: 'partial_failure',
316
- totals: { workUnits: 1, failedWorkUnits: 1 },
317
- children: [
318
- {
319
- jobId: 'metabase-child-1',
320
- metabaseConnectionId: 'prod-metabase',
321
- metabaseDatabaseId: 1,
322
- targetConnectionId: 'warehouse_a',
323
- result: {
324
- jobId: 'metabase-child-1',
325
- runId: 'run-a',
326
- syncId: 'sync-a',
327
- diffSummary: { added: 0, modified: 0, deleted: 0, unchanged: 0 },
328
- workUnitCount: 1,
329
- failedWorkUnits: ['metabase-db-1'],
330
- artifactsWritten: 0,
331
- commitSha: null,
332
- },
333
- report,
334
- },
335
- ],
336
- }),
337
- })).resolves.toBe(1);
338
- expect(io.stdout()).toContain('Metabase fan-out: partial_failure');
339
- expect(io.stdout()).toContain('Failed tasks: 1');
340
- expect(io.stdout()).toContain('status=error');
341
- expect(io.stderr()).toContain('Metabase ingest: prod-metabase');
342
- });
343
- it('prints Metabase fan-out progress before the final summary', async () => {
344
- const projectDir = join(tempDir, 'project');
345
- await writeMetabaseConfig(projectDir);
346
- const io = makeIo();
347
- const report = localFakeBundleReport('metabase-child-1', {
348
- id: 'report-metabase-child-1',
349
- runId: 'run-a',
350
- jobId: 'metabase-child-1',
351
- connectionId: 'warehouse_a',
352
- sourceKey: 'metabase',
353
- });
354
- await expect(runKtxIngest({
355
- command: 'run',
356
- projectDir,
357
- connectionId: 'prod-metabase',
358
- adapter: 'metabase',
359
- outputMode: 'plain',
360
- }, io.io, {
361
- runLocalMetabaseIngest: async (input) => {
362
- const progress = input.progress;
363
- progress?.onMetabaseFanoutPlanned?.({
364
- metabaseConnectionId: 'prod-metabase',
365
- children: [{ metabaseDatabaseId: 1, targetConnectionId: 'warehouse_a' }],
366
- });
367
- progress?.onMetabaseChildStarted?.({
368
- metabaseConnectionId: 'prod-metabase',
369
- metabaseDatabaseId: 1,
370
- targetConnectionId: 'warehouse_a',
371
- jobId: 'metabase-child-1',
372
- });
373
- progress?.onMetabaseChildCompleted?.({
374
- metabaseConnectionId: 'prod-metabase',
375
- metabaseDatabaseId: 1,
376
- targetConnectionId: 'warehouse_a',
377
- jobId: 'metabase-child-1',
378
- status: 'done',
379
- });
380
- return {
381
- metabaseConnectionId: 'prod-metabase',
382
- status: 'all_succeeded',
383
- totals: { workUnits: 2, failedWorkUnits: 0 },
384
- children: [
385
- {
386
- jobId: 'metabase-child-1',
387
- metabaseConnectionId: 'prod-metabase',
388
- metabaseDatabaseId: 1,
389
- targetConnectionId: 'warehouse_a',
390
- result: {
391
- jobId: 'metabase-child-1',
392
- runId: 'run-a',
393
- syncId: 'sync-a',
394
- diffSummary: { added: 0, modified: 0, deleted: 0, unchanged: 0 },
395
- workUnitCount: 1,
396
- failedWorkUnits: [],
397
- artifactsWritten: 0,
398
- commitSha: null,
399
- },
400
- report,
401
- },
402
- ],
403
- };
404
- },
405
- })).resolves.toBe(0);
406
- expect(io.stderr()).toContain('Metabase ingest: prod-metabase');
407
- expect(io.stderr()).toContain('Targets: 1 mapped database');
408
- expect(io.stderr()).toContain('- database=1 target=warehouse_a status=running job=metabase-child-1');
409
- expect(io.stderr()).toContain('- database=1 target=warehouse_a status=done job=metabase-child-1');
410
- expect(io.stdout()).toContain('Metabase fan-out: all_succeeded');
411
- expect(io.stdout()).not.toContain('status=running job=metabase-child-1');
412
- });
413
- it('writes metabase fan-out progress to stderr and final result to stdout', async () => {
414
- const projectDir = join(tempDir, 'project');
415
- await writeMetabaseConfig(projectDir);
416
- const io = makeIo({ isTTY: true });
417
- await expect(runKtxIngest({
418
- command: 'run',
419
- projectDir,
420
- connectionId: 'prod-metabase',
421
- adapter: 'metabase',
422
- outputMode: 'plain',
423
- }, io.io, {
424
- runLocalMetabaseIngest: async (input) => {
425
- input.progress?.onMetabaseFanoutPlanned?.({
426
- metabaseConnectionId: 'prod-metabase',
427
- children: [{ metabaseDatabaseId: 1, targetConnectionId: 'warehouse_a' }],
428
- });
429
- input.progress?.onMetabaseChildStarted?.({
430
- metabaseConnectionId: 'prod-metabase',
431
- metabaseDatabaseId: 1,
432
- targetConnectionId: 'warehouse_a',
433
- jobId: 'metabase-child-1',
434
- });
435
- return {
436
- metabaseConnectionId: 'prod-metabase',
437
- status: 'all_succeeded',
438
- totals: { workUnits: 0, failedWorkUnits: 0 },
439
- children: [],
440
- };
441
- },
442
- })).resolves.toBe(0);
443
- expect(io.stderr()).toContain('Metabase ingest: prod-metabase');
444
- expect(io.stderr()).toContain('status=running job=metabase-child-1');
445
- expect(io.stdout()).toContain('Metabase fan-out: all_succeeded');
446
- expect(io.stdout()).not.toContain('status=running job=metabase-child-1');
447
- });
448
- it('emits structured progress for Metabase fan-out without writing progress to JSON output', async () => {
449
- const projectDir = join(tempDir, 'project');
450
- await writeMetabaseConfig(projectDir);
451
- const io = makeIo();
452
- const progressEvents = [];
453
- await expect(runKtxIngest({
454
- command: 'run',
455
- projectDir,
456
- connectionId: 'prod-metabase',
457
- adapter: 'metabase',
458
- outputMode: 'json',
459
- }, io.io, {
460
- progress: (event) => progressEvents.push(event),
461
- runLocalMetabaseIngest: async (input) => {
462
- input.progress?.onMetabaseFanoutPlanned?.({
463
- metabaseConnectionId: 'prod-metabase',
464
- children: [{ metabaseDatabaseId: 1, targetConnectionId: 'warehouse_a' }],
465
- });
466
- input.progress?.onMetabaseChildStarted?.({
467
- metabaseConnectionId: 'prod-metabase',
468
- metabaseDatabaseId: 1,
469
- targetConnectionId: 'warehouse_a',
470
- jobId: 'metabase-child-1',
471
- });
472
- input.progress?.onMetabaseChildCompleted?.({
473
- metabaseConnectionId: 'prod-metabase',
474
- metabaseDatabaseId: 1,
475
- targetConnectionId: 'warehouse_a',
476
- jobId: 'metabase-child-1',
477
- status: 'done',
478
- });
479
- return {
480
- metabaseConnectionId: 'prod-metabase',
481
- status: 'all_succeeded',
482
- totals: { workUnits: 0, failedWorkUnits: 0 },
483
- children: [],
484
- };
485
- },
486
- })).resolves.toBe(0);
487
- expect(progressEvents).toEqual(expect.arrayContaining([
488
- { percent: 5, message: 'Checking Metabase mappings for prod-metabase' },
489
- { percent: 10, message: 'Metabase prod-metabase: 1 mapped database' },
490
- { percent: 25, message: 'Metabase database 1 -> warehouse_a running' },
491
- { percent: 90, message: 'Metabase database 1 -> warehouse_a done' },
492
- ]));
493
- expect(io.stdout()).toContain('"status": "all_succeeded"');
494
- expect(io.stderr()).not.toContain('Metabase ingest: prod-metabase');
495
- });
496
- it('emits structured child ingest progress during Metabase fan-out', async () => {
497
- const projectDir = join(tempDir, 'project');
498
- await writeMetabaseConfig(projectDir);
499
- const io = makeIo();
500
- const progressEvents = [];
501
- await expect(runKtxIngest({
502
- command: 'run',
503
- projectDir,
504
- connectionId: 'prod-metabase',
505
- adapter: 'metabase',
506
- outputMode: 'json',
507
- }, io.io, {
508
- progress: (event) => progressEvents.push(event),
509
- runLocalMetabaseIngest: async (input) => {
510
- input.progress?.onMetabaseFanoutPlanned?.({
511
- metabaseConnectionId: 'prod-metabase',
512
- children: [{ metabaseDatabaseId: 1, targetConnectionId: 'warehouse_a' }],
513
- });
514
- input.progress?.onMetabaseChildStarted?.({
515
- metabaseConnectionId: 'prod-metabase',
516
- metabaseDatabaseId: 1,
517
- targetConnectionId: 'warehouse_a',
518
- jobId: 'metabase-child-1',
519
- });
520
- input.memoryFlow?.update({
521
- plannedWorkUnits: [
522
- {
523
- unitKey: 'metabase-col-6',
524
- rawFiles: ['cards/40.json'],
525
- peerFileCount: 0,
526
- dependencyCount: 0,
527
- },
528
- ],
529
- });
530
- input.memoryFlow?.emit({ type: 'chunks_planned', chunkCount: 1, workUnitCount: 1, evictionCount: 0 });
531
- input.memoryFlow?.emit({
532
- type: 'work_unit_started',
533
- unitKey: 'metabase-col-6',
534
- skills: ['sl_capture'],
535
- stepBudget: 40,
536
- });
537
- input.memoryFlow?.emit({
538
- type: 'work_unit_step',
539
- unitKey: 'metabase-col-6',
540
- stepIndex: 7,
541
- stepBudget: 40,
542
- });
543
- input.memoryFlow?.emit({
544
- type: 'stage_progress',
545
- stage: 'integration',
546
- percent: 81,
547
- message: 'Resolving text conflict for metabase-col-6',
548
- });
549
- input.memoryFlow?.emit({ type: 'work_unit_finished', unitKey: 'metabase-col-6', status: 'success' });
550
- input.memoryFlow?.update({
551
- plannedWorkUnits: [
552
- {
553
- unitKey: 'metabase-col-7',
554
- rawFiles: ['cards/48.json'],
555
- peerFileCount: 0,
556
- dependencyCount: 0,
557
- },
558
- ],
559
- });
560
- input.memoryFlow?.emit({ type: 'chunks_planned', chunkCount: 1, workUnitCount: 1, evictionCount: 0 });
561
- input.memoryFlow?.emit({
562
- type: 'work_unit_started',
563
- unitKey: 'metabase-col-7',
564
- skills: ['sl_capture'],
565
- stepBudget: 40,
566
- });
567
- input.progress?.onMetabaseChildCompleted?.({
568
- metabaseConnectionId: 'prod-metabase',
569
- metabaseDatabaseId: 1,
570
- targetConnectionId: 'warehouse_a',
571
- jobId: 'metabase-child-1',
572
- status: 'done',
573
- });
574
- return {
575
- metabaseConnectionId: 'prod-metabase',
576
- status: 'all_succeeded',
577
- totals: { workUnits: 1, failedWorkUnits: 0 },
578
- children: [],
579
- };
580
- },
581
- })).resolves.toBe(0);
582
- expect(progressEvents).toEqual(expect.arrayContaining([
583
- { percent: 45, message: 'Planned 1 task' },
584
- { percent: 55, message: 'Processing 1/1 tasks: metabase-col-6' },
585
- {
586
- percent: 60,
587
- message: 'Processing tasks: 0/1 complete, 1 active; latest metabase-col-6 step 7/40',
588
- transient: true,
589
- },
590
- { percent: 81, message: 'Resolving text conflict for metabase-col-6' },
591
- { percent: 81, message: 'Processing 1/1 tasks: metabase-col-7' },
592
- ]));
593
- expect(io.stdout()).toContain('"status": "all_succeeded"');
594
- expect(io.stderr()).not.toContain('Metabase ingest: prod-metabase');
595
- });
596
- it('runs Metabase scheduled ingest through the public CLI command path with real fan-out', async () => {
597
- const projectDir = join(tempDir, 'metabase-cli-project');
598
- await writeWarehouseConfig(projectDir);
599
- await writeFile(join(projectDir, 'ktx.yaml'), [
600
- 'connections:',
601
- ' prod-metabase:',
602
- ' driver: metabase',
603
- ' api_url: https://metabase.example.test',
604
- ' api_key: literal-test-key',
605
- ' mappings:',
606
- ' databaseMappings:',
607
- ' "1": warehouse_a',
608
- ' "2": warehouse_b',
609
- ' syncEnabled:',
610
- ' "1": true',
611
- ' "2": true',
612
- ' syncMode: ALL',
613
- ' defaultTagNames:',
614
- ' - ktx',
615
- ' warehouse_a:',
616
- ' driver: postgres',
617
- ' url: postgresql://readonly@db.example.test/warehouse_a',
618
- ' warehouse_b:',
619
- ' driver: postgres',
620
- ' url: postgresql://readonly@db.example.test/warehouse_b',
621
- 'ingest:',
622
- ' adapters:',
623
- ' - metabase',
624
- ' embeddings:',
625
- ' backend: none',
626
- '',
627
- ].join('\n'), 'utf-8');
628
- const project = await loadKtxProject({ projectDir });
629
- const discoveryCache = new LocalMetabaseDiscoveryCache({ dbPath: ktxLocalStateDbPath(project) });
630
- await discoveryCache.refreshDiscoveredDatabases({
631
- connectionId: 'prod-metabase',
632
- discovered: [
633
- { id: 1, name: 'Warehouse A', engine: 'postgres', host: 'db.example.test', dbName: 'warehouse_a' },
634
- { id: 2, name: 'Warehouse B', engine: 'postgres', host: 'db.example.test', dbName: 'warehouse_b' },
635
- ],
636
- });
637
- const adapter = new CliMetabaseSourceAdapter();
638
- const agentRunner = new CliMetabaseAgentRunner();
639
- const childJobIds = ['metabase-child-1', 'metabase-child-2'];
640
- const io = makeIo();
641
- await expect(runKtxIngest({
642
- command: 'run',
643
- projectDir,
644
- connectionId: 'prod-metabase',
645
- adapter: 'metabase',
646
- outputMode: 'plain',
647
- }, io.io, {
648
- createAdapters: vi.fn(() => [adapter]),
649
- jobIdFactory: () => childJobIds.shift() ?? 'metabase-child-extra',
650
- localIngestOptions: {
651
- agentRunner,
652
- },
653
- })).resolves.toBe(0);
654
- expect(io.stderr()).toContain('Metabase ingest: prod-metabase');
655
- expect(io.stderr()).toContain('Targets: 2 mapped databases');
656
- expect(io.stdout()).toContain('Metabase fan-out: all_succeeded');
657
- expect(io.stdout()).toContain('Source: prod-metabase');
658
- expect(io.stdout()).toContain('Children: 2');
659
- expect(io.stdout()).toContain('target=warehouse_a database=1 status=done job=metabase-child-1');
660
- expect(io.stdout()).toContain('target=warehouse_b database=2 status=done job=metabase-child-2');
661
- expect(adapter.fetchCalls).toEqual([
662
- { metabaseConnectionId: 'prod-metabase', metabaseDatabaseId: 1, connectionId: 'warehouse_a' },
663
- { metabaseConnectionId: 'prod-metabase', metabaseDatabaseId: 2, connectionId: 'warehouse_b' },
664
- ]);
665
- const statusIo = makeIo();
666
- await expect(runKtxIngest({ command: 'status', projectDir, runId: 'metabase-child-1', outputMode: 'plain' }, statusIo.io)).resolves.toBe(0);
667
- expect(statusIo.stdout()).toContain('Job: metabase-child-1');
668
- expect(statusIo.stdout()).toContain('Source: Metabase');
669
- expect(statusIo.stdout()).toContain('Connection: warehouse_a');
670
- expect(statusIo.stderr()).toBe('');
671
- });
672
- it('runs public Metabase CLI scheduled ingest for ALL, ONLY, and EXCEPT sync modes', async () => {
673
- await runPublicMetabaseSyncModeCase(tempDir, {
674
- name: 'all',
675
- syncMode: 'ALL',
676
- selections: [],
677
- expectedWorkUnitKeys: ['metabase-col-12', 'metabase-col-13'],
678
- expectedRawFiles: [
679
- 'cards/101.json',
680
- 'cards/102.json',
681
- 'cards/103.json',
682
- 'collections/12.json',
683
- 'collections/13.json',
684
- ],
685
- });
686
- await runPublicMetabaseSyncModeCase(tempDir, {
687
- name: 'only',
688
- syncMode: 'ONLY',
689
- selections: [{ selectionType: 'collection', metabaseObjectId: 12 }],
690
- expectedWorkUnitKeys: ['metabase-col-12'],
691
- expectedRawFiles: ['cards/101.json', 'cards/102.json', 'collections/12.json'],
692
- });
693
- await runPublicMetabaseSyncModeCase(tempDir, {
694
- name: 'except',
695
- syncMode: 'EXCEPT',
696
- selections: [{ selectionType: 'item', metabaseObjectId: 102 }],
697
- expectedWorkUnitKeys: ['metabase-col-12', 'metabase-col-13'],
698
- expectedRawFiles: ['cards/101.json', 'cards/103.json', 'collections/12.json', 'collections/13.json'],
699
- });
700
- });
701
- it('prints metabase fan-out JSON results', async () => {
702
- const projectDir = join(tempDir, 'project');
703
- await writeMetabaseConfig(projectDir);
704
- const io = makeIo();
705
- await expect(runKtxIngest({
706
- command: 'run',
707
- projectDir,
708
- connectionId: 'prod-metabase',
709
- adapter: 'metabase',
710
- outputMode: 'json',
711
- }, io.io, {
712
- runLocalMetabaseIngest: async () => ({
713
- metabaseConnectionId: 'prod-metabase',
714
- status: 'all_succeeded',
715
- totals: { workUnits: 0, failedWorkUnits: 0 },
716
- children: [],
717
- }),
718
- })).resolves.toBe(0);
719
- expect(JSON.parse(io.stdout())).toMatchObject({
720
- metabaseConnectionId: 'prod-metabase',
721
- status: 'all_succeeded',
722
- children: [],
723
- });
724
- expect(io.stderr()).toBe('');
725
- });
726
- it('keeps metabase JSON stdout free of operational adapter logs', async () => {
727
- const projectDir = join(tempDir, 'project');
728
- await writeMetabaseConfig(projectDir);
729
- const io = makeIo();
730
- let adapterOptions;
731
- await expect(runKtxIngest({
732
- command: 'run',
733
- projectDir,
734
- connectionId: 'prod-metabase',
735
- adapter: 'metabase',
736
- outputMode: 'json',
737
- }, io.io, {
738
- createAdapters: (_project, options) => {
739
- adapterOptions = options;
740
- options?.logger?.warn('adapter warning');
741
- return [];
742
- },
743
- runLocalMetabaseIngest: async (input) => {
744
- input.adapters.find((adapter) => adapter.source === 'metabase');
745
- return {
746
- metabaseConnectionId: 'prod-metabase',
747
- status: 'all_succeeded',
748
- totals: { workUnits: 0, failedWorkUnits: 0 },
749
- children: [],
750
- };
751
- },
752
- })).resolves.toBe(0);
753
- expect(adapterOptions?.logger).toEqual(expect.objectContaining({ warn: expect.any(Function) }));
754
- expect(() => JSON.parse(io.stdout())).not.toThrow();
755
- expect(io.stderr()).toBe('');
756
- });
757
- it('rejects source-dir uploads through the metabase fan-out route', async () => {
758
- const projectDir = join(tempDir, 'project');
759
- await writeMetabaseConfig(projectDir);
760
- const io = makeIo();
761
- await expect(runKtxIngest({
762
- command: 'run',
763
- projectDir,
764
- adapter: 'metabase',
765
- connectionId: 'prod-metabase',
766
- sourceDir: projectDir,
767
- outputMode: 'plain',
768
- }, io.io, {
769
- runLocalMetabaseIngest: async () => {
770
- throw new Error('fan-out should not be called');
771
- },
772
- })).resolves.toBe(1);
773
- expect(io.stderr()).toContain('source-dir uploads are not supported for the Metabase fan-out adapter');
774
- expect(io.stderr()).not.toContain('ktx ingest requires llm.provider.backend');
775
- expect(io.stdout()).toBe('');
776
- });
777
- it('prints previous run and diff summary for local ingest results', async () => {
778
- const projectDir = join(tempDir, 'project');
779
- await writeWarehouseConfig(projectDir);
780
- const sourceDir = join(tempDir, 'source');
781
- await mkdir(join(sourceDir, 'orders'), { recursive: true });
782
- await writeFile(join(sourceDir, 'orders', 'orders.json'), '{"name":"orders"}\n', 'utf-8');
783
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, 'local-job-1'));
784
- const io = makeIo();
785
- await expect(runKtxIngest({
786
- command: 'run',
787
- projectDir,
788
- connectionId: 'warehouse',
789
- adapter: 'fake',
790
- sourceDir,
791
- outputMode: 'plain',
792
- }, io.io, {
793
- runLocalIngest: runLocal,
794
- jobIdFactory: () => 'local-job-1',
795
- })).resolves.toBe(0);
796
- expect(io.stderr()).toBe('');
797
- expect(io.stdout()).toContain('Report: report-live-1\n');
798
- expect(io.stdout()).toContain('Job: local-job-1\n');
799
- expect(io.stdout()).toContain('Diff: +2/~0/-0/=0\n');
800
- });
801
- it('includes historic-sql projection output in saved memory counts', async () => {
802
- const projectDir = join(tempDir, 'project');
803
- await writeWarehouseConfig(projectDir);
804
- const runLocal = vi.fn(async (input) => {
805
- const result = completedLocalBundleRun(input, 'historic-sql-projection');
806
- return {
807
- ...result,
808
- report: localFakeBundleReport('historic-sql-projection', {
809
- sourceKey: 'historic-sql',
810
- body: {
811
- workUnits: [],
812
- finalization: {
813
- sourceKey: 'historic-sql',
814
- status: 'success',
815
- commitSha: 'finalization-sha',
816
- touchedPaths: ['semantic-layer/warehouse/_schema/public.yaml', 'wiki/global/historic-sql-orders.md'],
817
- declaredTouchedSources: [{ connectionId: 'warehouse', sourceName: 'orders' }],
818
- derivedTouchedSources: [{ connectionId: 'warehouse', sourceName: 'orders' }],
819
- declaredChangedWikiPageKeys: ['historic-sql-orders'],
820
- derivedChangedWikiPageKeys: ['historic-sql-orders'],
821
- mismatches: [],
822
- result: {
823
- tableUsageMerged: 56,
824
- staleTablesMarked: 1,
825
- patternPagesWritten: 30,
826
- stalePatternPagesMarked: 2,
827
- archivedPatternPages: 3,
828
- },
829
- errors: [],
830
- warnings: [],
831
- actions: [
832
- ...Array.from({ length: 57 }, (_, index) => ({
833
- target: 'sl',
834
- type: 'updated',
835
- key: `orders-${index}`,
836
- detail: 'Merged usage',
837
- targetConnectionId: 'warehouse',
838
- rawPaths: ['tables/public/orders.json'],
839
- })),
840
- ...Array.from({ length: 35 }, (_, index) => ({
841
- target: 'wiki',
842
- type: 'updated',
843
- key: `historic-sql-orders-${index}`,
844
- detail: 'Projected pattern',
845
- rawPaths: ['patterns/orders.json'],
846
- })),
847
- ],
848
- provenanceExclusions: [],
849
- },
850
- },
851
- }),
852
- };
853
- });
854
- const io = makeIo();
855
- await expect(runKtxIngest({
856
- command: 'run',
857
- projectDir,
858
- connectionId: 'warehouse',
859
- adapter: 'historic-sql',
860
- outputMode: 'plain',
861
- }, io.io, {
862
- runLocalIngest: runLocal,
863
- createAdapters: vi.fn(() => [
864
- { source: 'historic-sql', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
865
- ]),
866
- jobIdFactory: () => 'historic-sql-projection',
867
- })).resolves.toBe(0);
868
- expect(io.stderr()).toBe('');
869
- expect(io.stdout()).toContain('Source: Query history\n');
870
- expect(io.stdout()).toContain('Saved memory: 35 wiki, 57 SL\n');
871
- });
872
- it('returns a non-zero code when local ingest reports failed work units', async () => {
873
- const projectDir = join(tempDir, 'project');
874
- await writeWarehouseConfig(projectDir);
875
- const sourceDir = join(tempDir, 'source');
876
- await mkdir(join(sourceDir, 'orders'), { recursive: true });
877
- await writeFile(join(sourceDir, 'orders', 'orders.json'), '{"name":"orders"}\n', 'utf-8');
878
- const runLocal = vi.fn(async (input) => failedLocalBundleRun(input, 'local-job-failed'));
879
- const io = makeIo();
880
- await expect(runKtxIngest({
881
- command: 'run',
882
- projectDir,
883
- connectionId: 'warehouse',
884
- adapter: 'fake',
885
- sourceDir,
886
- outputMode: 'plain',
887
- }, io.io, {
888
- runLocalIngest: runLocal,
889
- jobIdFactory: () => 'local-job-failed',
890
- })).resolves.toBe(1);
891
- expect(io.stderr()).toBe('');
892
- expect(io.stdout()).toContain('Status: error\n');
893
- });
894
- it('prints trace path and error status for stored failed ingest reports', async () => {
895
- const projectDir = join(tempDir, 'project');
896
- await writeWarehouseConfig(projectDir);
897
- const io = makeIo();
898
- const report = {
899
- id: 'report-failed',
900
- runId: 'run-failed',
901
- jobId: 'job-failed',
902
- connectionId: 'warehouse',
903
- sourceKey: 'metabase',
904
- createdAt: '2026-05-17T12:00:00.000Z',
905
- body: {
906
- status: 'failed',
907
- syncId: 'sync-failed',
908
- diffSummary: { added: 1, modified: 0, deleted: 0, unchanged: 0 },
909
- commitSha: null,
910
- tracePath: '/project/.ktx/ingest-traces/job-failed/trace.jsonl',
911
- failure: { phase: 'final_gates', message: 'final artifact gates failed' },
912
- workUnits: [],
913
- failedWorkUnits: [],
914
- reconciliationSkipped: true,
915
- conflictsResolved: [],
916
- evictionsApplied: [],
917
- unmappedFallbacks: [],
918
- evictionInputs: [],
919
- unresolvedCards: [],
920
- supersededBy: null,
921
- overrideOf: null,
922
- provenanceRows: [],
923
- toolTranscripts: [],
924
- },
925
- };
926
- await runKtxIngest({
927
- command: 'status',
928
- projectDir,
929
- reportFile: '/project/report-failed.json',
930
- runId: 'run-failed',
931
- outputMode: 'plain',
932
- inputMode: 'disabled',
933
- }, io.io, {
934
- readReportFile: vi.fn().mockResolvedValue(report),
935
- });
936
- expect(io.stdout()).toContain('Trace: /project/.ktx/ingest-traces/job-failed/trace.jsonl');
937
- expect(io.stdout()).toContain('Status: error');
938
- expect(io.stdout()).toContain('Error: final artifact gates failed');
939
- });
940
- it('prints a clear first failure reason when query-history work units fail', async () => {
941
- const projectDir = join(tempDir, 'project');
942
- await writeWarehouseConfig(projectDir);
943
- const rawReason = '{"error":"invalid_grant","error_description":"reauth related error (invalid_rapt)","error_uri":"https://support.google.com/a/answer/9368756","error_subtype":"invalid_rapt"}';
944
- const runLocal = vi.fn(async (input) => {
945
- const failedWorkUnit = {
946
- ...localFakeBundleReport('query-history-failed').body.workUnits[0],
947
- unitKey: 'historic-sql-table-orders',
948
- rawFiles: ['tables/orders.json'],
949
- status: 'failed',
950
- reason: rawReason,
951
- actions: [],
952
- touchedSlSources: [],
953
- };
954
- const report = localFakeBundleReport('query-history-failed', {
955
- id: 'report-query-history-failed',
956
- runId: 'run-query-history-failed',
957
- connectionId: input.connectionId,
958
- sourceKey: 'historic-sql',
959
- body: {
960
- workUnits: [failedWorkUnit],
961
- failedWorkUnits: [failedWorkUnit.unitKey],
962
- },
963
- });
964
- return {
965
- result: {
966
- jobId: 'query-history-failed',
967
- runId: report.runId,
968
- syncId: report.body.syncId,
969
- diffSummary: report.body.diffSummary,
970
- workUnitCount: report.body.workUnits.length,
971
- failedWorkUnits: report.body.failedWorkUnits,
972
- artifactsWritten: report.body.provenanceRows.length,
973
- commitSha: report.body.commitSha,
974
- },
975
- report,
976
- };
977
- });
978
- const io = makeIo();
979
- await expect(runKtxIngest({
980
- command: 'run',
981
- projectDir,
982
- connectionId: 'warehouse',
983
- adapter: 'historic-sql',
984
- outputMode: 'plain',
985
- }, io.io, {
986
- runLocalIngest: runLocal,
987
- jobIdFactory: () => 'query-history-failed',
988
- })).resolves.toBe(1);
989
- expect(io.stdout()).toContain('Status: error\n');
990
- expect(io.stdout()).toContain('Failed tasks: 1\n');
991
- expect(io.stdout()).toContain('Error: Query history failed for 1 task. First failure: Google Cloud authentication failed while analyzing query history: application-default credentials expired or require reauthentication (invalid_grant / invalid_rapt). Run `gcloud auth application-default login`, then retry.');
992
- expect(io.stdout()).not.toContain('error_uri');
993
- });
994
- it('passes the debug LLM request file to local ingest runs', async () => {
995
- const projectDir = join(tempDir, 'project');
996
- await writeWarehouseConfig(projectDir);
997
- const runLocalIngest = vi.fn(async (input) => completedLocalBundleRun(input, 'job-debug'));
998
- const io = makeIo();
999
- const debugFile = join(projectDir, '.ktx', 'llm-debug.jsonl');
1000
- const exitCode = await runKtxIngest({
1001
- command: 'run',
1002
- projectDir,
1003
- connectionId: 'warehouse',
1004
- adapter: 'fake',
1005
- outputMode: 'plain',
1006
- debugLlmRequestFile: debugFile,
1007
- }, io.io, { runLocalIngest });
1008
- expect(exitCode).toBe(0);
1009
- expect(runLocalIngest).toHaveBeenCalledWith(expect.objectContaining({ llmDebugRequestFile: debugFile }));
1010
- });
1011
- it('supplies a scan-connector query executor to local ingest runs', async () => {
1012
- const io = makeIo();
1013
- const projectDir = join(tempDir, 'query-executor-project');
1014
- await writeWarehouseConfig(projectDir);
1015
- const queryExecutor = {
1016
- execute: vi.fn(async () => ({
1017
- headers: [],
1018
- rows: [],
1019
- totalRows: 0,
1020
- command: 'SELECT',
1021
- rowCount: 0,
1022
- })),
1023
- };
1024
- const runLocalIngest = vi.fn(async (input) => completedLocalBundleRun(input, 'query-executor-run'));
1025
- await expect(runKtxIngest({
1026
- command: 'run',
1027
- projectDir,
1028
- connectionId: 'warehouse',
1029
- adapter: 'fake',
1030
- outputMode: 'json',
1031
- }, io.io, {
1032
- runLocalIngest,
1033
- createAdapters: () => [],
1034
- createQueryExecutor: () => queryExecutor,
1035
- })).resolves.toBe(0);
1036
- expect(runLocalIngest).toHaveBeenCalledWith(expect.objectContaining({ queryExecutor }));
1037
- });
1038
- it('passes daemon database introspection URL to default local ingest adapters', async () => {
1039
- const projectDir = join(tempDir, 'project');
1040
- await writeWarehouseConfig(projectDir);
1041
- const sourceDir = join(tempDir, 'source');
1042
- await mkdir(join(sourceDir, 'orders'), { recursive: true });
1043
- await writeFile(join(sourceDir, 'orders', 'orders.json'), '{"name":"orders"}\n', 'utf-8');
1044
- const createdAdapters = [
1045
- { source: 'fake', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1046
- ];
1047
- const createAdapters = vi.fn(() => createdAdapters);
1048
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, input.jobId ?? 'local-job-1'));
1049
- const io = makeIo();
1050
- await expect(runKtxIngest({
1051
- command: 'run',
1052
- projectDir,
1053
- connectionId: 'warehouse',
1054
- adapter: 'fake',
1055
- sourceDir,
1056
- databaseIntrospectionUrl: 'http://127.0.0.1:8765',
1057
- outputMode: 'plain',
1058
- }, io.io, {
1059
- createAdapters,
1060
- runLocalIngest: runLocal,
1061
- jobIdFactory: () => 'local-job-1',
1062
- })).resolves.toBe(0);
1063
- expect(createAdapters).toHaveBeenCalledWith(expect.objectContaining({ projectDir }), expect.objectContaining({
1064
- databaseIntrospectionUrl: 'http://127.0.0.1:8765',
1065
- logger: expect.any(Object),
1066
- }));
1067
- expect(runLocal).toHaveBeenCalledWith(expect.objectContaining({
1068
- adapters: createdAdapters,
1069
- adapter: 'fake',
1070
- connectionId: 'warehouse',
1071
- pullConfigOptions: expect.objectContaining({
1072
- databaseIntrospectionUrl: 'http://127.0.0.1:8765',
1073
- logger: expect.any(Object),
1074
- }),
1075
- }));
1076
- });
1077
- it('passes KTX daemon options to adapters and pull-config options when no explicit daemon URL is set', async () => {
1078
- const projectDir = join(tempDir, 'managed-daemon-ingest-project');
1079
- await initKtxProject({ projectDir });
1080
- await writeWarehouseConfig(projectDir);
1081
- const createdAdapters = [
1082
- { source: 'fake', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1083
- ];
1084
- const createAdapters = vi.fn(() => createdAdapters);
1085
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, input.jobId ?? 'local-job-1'));
1086
- const io = makeIo();
1087
- const runtimeIo = makeIo({ isTTY: true });
1088
- await expect(runKtxIngest({
1089
- command: 'run',
1090
- projectDir,
1091
- connectionId: 'warehouse',
1092
- adapter: 'fake',
1093
- cliVersion: '0.2.0',
1094
- runtimeInstallPolicy: 'auto',
1095
- outputMode: 'plain',
1096
- }, io.io, {
1097
- createAdapters,
1098
- runLocalIngest: runLocal,
1099
- jobIdFactory: () => 'local-job-1',
1100
- runtimeIo: runtimeIo.io,
1101
- })).resolves.toBe(0);
1102
- const expectedManagedDaemon = {
1103
- cliVersion: '0.2.0',
1104
- projectDir,
1105
- installPolicy: 'auto',
1106
- io: runtimeIo.io,
1107
- };
1108
- expect(createAdapters).toHaveBeenCalledWith(expect.objectContaining({ projectDir }), expect.objectContaining({
1109
- managedDaemon: expectedManagedDaemon,
1110
- logger: expect.any(Object),
1111
- }));
1112
- expect(runLocal).toHaveBeenCalledWith(expect.objectContaining({
1113
- pullConfigOptions: expect.objectContaining({
1114
- managedDaemon: expectedManagedDaemon,
1115
- logger: expect.any(Object),
1116
- }),
1117
- }));
1118
- });
1119
- it('uses runtime IO when resolving managed embedding runtime', async () => {
1120
- const projectDir = join(tempDir, 'managed-embedding-ingest-project');
1121
- await initKtxProject({ projectDir });
1122
- await writeWarehouseConfig(projectDir);
1123
- const createdAdapters = [
1124
- { source: 'fake', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1125
- ];
1126
- const createAdapters = vi.fn(() => createdAdapters);
1127
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, input.jobId ?? 'local-job-1'));
1128
- const resolveEmbeddingProvider = vi.fn(async () => ({ kind: 'disabled' }));
1129
- const io = makeIo();
1130
- const runtimeIo = makeIo({ isTTY: true });
1131
- await expect(runKtxIngest({
1132
- command: 'run',
1133
- projectDir,
1134
- connectionId: 'warehouse',
1135
- adapter: 'fake',
1136
- cliVersion: '0.2.0',
1137
- runtimeInstallPolicy: 'auto',
1138
- outputMode: 'plain',
1139
- }, io.io, {
1140
- createAdapters,
1141
- runLocalIngest: runLocal,
1142
- jobIdFactory: () => 'local-job-1',
1143
- runtimeIo: runtimeIo.io,
1144
- resolveEmbeddingProvider,
1145
- })).resolves.toBe(0);
1146
- expect(resolveEmbeddingProvider).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
1147
- installPolicy: 'auto',
1148
- io: runtimeIo.io,
1149
- }));
1150
- });
1151
- it('passes the target connection id when constructing local historic-sql adapters', async () => {
1152
- const projectDir = join(tempDir, 'historic-sql-project');
1153
- await writeWarehouseConfig(projectDir);
1154
- await writeFile(join(projectDir, 'ktx.yaml'), [
1155
- 'connections:',
1156
- ' warehouse:',
1157
- ' driver: postgres',
1158
- ' url: env:WAREHOUSE_DATABASE_URL',
1159
- ' context:',
1160
- ' queryHistory:',
1161
- ' enabled: true',
1162
- ' minExecutions: 2',
1163
- 'ingest:',
1164
- ' adapters:',
1165
- ' - historic-sql',
1166
- '',
1167
- ].join('\n'), 'utf-8');
1168
- const createdAdapters = [
1169
- { source: 'historic-sql', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1170
- ];
1171
- const createAdapters = vi.fn(() => createdAdapters);
1172
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, input.jobId ?? 'local-historic-job'));
1173
- const io = makeIo();
1174
- await expect(runKtxIngest({
1175
- command: 'run',
1176
- projectDir,
1177
- connectionId: 'warehouse',
1178
- adapter: 'historic-sql',
1179
- outputMode: 'plain',
1180
- }, io.io, {
1181
- createAdapters,
1182
- runLocalIngest: runLocal,
1183
- jobIdFactory: () => 'local-historic-job',
1184
- })).resolves.toBe(0);
1185
- expect(createAdapters).toHaveBeenCalledWith(expect.objectContaining({ projectDir }), expect.objectContaining({
1186
- historicSqlConnectionId: 'warehouse',
1187
- logger: expect.any(Object),
1188
- }));
1189
- expect(runLocal).toHaveBeenCalledWith(expect.objectContaining({
1190
- adapters: createdAdapters,
1191
- adapter: 'historic-sql',
1192
- connectionId: 'warehouse',
1193
- }));
1194
- });
1195
- it('prints live progress for plain local ingest in interactive terminals', async () => {
1196
- const projectDir = join(tempDir, 'historic-sql-progress-project');
1197
- await mkdir(projectDir, { recursive: true });
1198
- await writeFile(join(projectDir, 'ktx.yaml'), [
1199
- 'connections:',
1200
- ' warehouse:',
1201
- ' driver: postgres',
1202
- ' url: env:WAREHOUSE_DATABASE_URL',
1203
- ' context:',
1204
- ' queryHistory:',
1205
- ' enabled: true',
1206
- ' minExecutions: 2',
1207
- 'ingest:',
1208
- ' adapters:',
1209
- ' - historic-sql',
1210
- '',
1211
- ].join('\n'), 'utf-8');
1212
- const createdAdapters = [
1213
- { source: 'historic-sql', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1214
- ];
1215
- const createAdapters = vi.fn(() => createdAdapters);
1216
- const runLocal = vi.fn(async (input) => {
1217
- expect(input.memoryFlow).toBeDefined();
1218
- input.memoryFlow?.emit({
1219
- type: 'source_acquired',
1220
- adapter: 'historic-sql',
1221
- trigger: 'manual_resync',
1222
- fileCount: 3,
1223
- });
1224
- input.memoryFlow?.update({ syncId: 'sync-progress-1' });
1225
- input.memoryFlow?.emit({ type: 'raw_snapshot_written', syncId: 'sync-progress-1', rawFileCount: 3 });
1226
- input.memoryFlow?.emit({ type: 'diff_computed', added: 2, modified: 0, deleted: 0, unchanged: 1 });
1227
- input.memoryFlow?.update({
1228
- plannedWorkUnits: [
1229
- {
1230
- unitKey: 'historic-sql-table-public-orders',
1231
- rawFiles: ['tables/public/orders.json'],
1232
- peerFileCount: 0,
1233
- dependencyCount: 0,
1234
- },
1235
- ],
1236
- });
1237
- input.memoryFlow?.emit({ type: 'chunks_planned', chunkCount: 1, workUnitCount: 1, evictionCount: 0 });
1238
- input.memoryFlow?.emit({
1239
- type: 'work_unit_started',
1240
- unitKey: 'historic-sql-table-public-orders',
1241
- skills: ['historic_sql_table_digest'],
1242
- stepBudget: 40,
1243
- });
1244
- input.memoryFlow?.emit({
1245
- type: 'work_unit_finished',
1246
- unitKey: 'historic-sql-table-public-orders',
1247
- status: 'success',
1248
- });
1249
- input.memoryFlow?.emit({ type: 'saved', commitSha: null, wikiCount: 0, slCount: 1 });
1250
- input.memoryFlow?.emit({ type: 'provenance_recorded', rowCount: 3 });
1251
- input.memoryFlow?.emit({ type: 'report_created', runId: 'run-live-1', reportPath: 'report-live-1' });
1252
- input.memoryFlow?.finish('done');
1253
- return completedLocalBundleRun(input, input.jobId ?? 'historic-progress-job');
1254
- });
1255
- const io = makeIo({ isTTY: true });
1256
- await expect(runKtxIngest({
1257
- command: 'run',
1258
- projectDir,
1259
- connectionId: 'warehouse',
1260
- adapter: 'historic-sql',
1261
- outputMode: 'plain',
1262
- }, io.io, {
1263
- env: interactiveEnv(),
1264
- createAdapters,
1265
- runLocalIngest: runLocal,
1266
- jobIdFactory: () => 'historic-progress-job',
1267
- })).resolves.toBe(0);
1268
- const stdout = io.stdout();
1269
- const stderr = io.stderr();
1270
- expect(stderr).toContain('[5%] Fetching source files for warehouse/historic-sql');
1271
- expect(stderr).toContain('[15%] Fetched 3 source files from historic-sql');
1272
- expect(stderr).toContain('[45%] Planned 1 task');
1273
- expect(stderr).toContain('[80%] Processed 1/1 tasks');
1274
- expect(stderr).toContain('[100%] Ingest completed');
1275
- expect(stdout).toContain('Report: report-live-1');
1276
- expect(stdout).not.toContain('[5%]');
1277
- });
1278
- it('writes plain TTY ingest progress to stderr and final report to stdout', async () => {
1279
- const projectDir = join(tempDir, 'project');
1280
- await writeWarehouseConfig(projectDir);
1281
- const sourceDir = join(tempDir, 'source');
1282
- await mkdir(join(sourceDir, 'orders'), { recursive: true });
1283
- await writeFile(join(sourceDir, 'orders', 'orders.json'), '{"name":"orders"}\n', 'utf-8');
1284
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, 'local-job-1'));
1285
- const io = makeIo({ isTTY: true });
1286
- await expect(runKtxIngest({
1287
- command: 'run',
1288
- projectDir,
1289
- connectionId: 'warehouse',
1290
- adapter: 'fake',
1291
- sourceDir,
1292
- outputMode: 'plain',
1293
- }, io.io, {
1294
- env: interactiveEnv(),
1295
- runLocalIngest: runLocal,
1296
- })).resolves.toBe(0);
1297
- expect(io.stderr()).toContain('[5%] Fetching source files for warehouse/fake');
1298
- expect(io.stdout()).toContain('Report: report-live-1');
1299
- expect(io.stdout()).not.toContain('[5%]');
1300
- });
1301
- it('prints plain WorkUnit step progress during long-running local ingest', async () => {
1302
- const projectDir = join(tempDir, 'historic-sql-step-progress-project');
1303
- await mkdir(projectDir, { recursive: true });
1304
- await writeFile(join(projectDir, 'ktx.yaml'), [
1305
- 'connections:',
1306
- ' warehouse:',
1307
- ' driver: postgres',
1308
- ' url: env:WAREHOUSE_DATABASE_URL',
1309
- ' context:',
1310
- ' queryHistory:',
1311
- ' enabled: true',
1312
- ' minExecutions: 2',
1313
- 'ingest:',
1314
- ' adapters:',
1315
- ' - historic-sql',
1316
- '',
1317
- ].join('\n'), 'utf-8');
1318
- const createdAdapters = [
1319
- { source: 'historic-sql', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1320
- ];
1321
- const runLocal = vi.fn(async (input) => {
1322
- input.memoryFlow?.update({
1323
- plannedWorkUnits: [
1324
- {
1325
- unitKey: 'historic-sql-table-public-orders',
1326
- rawFiles: ['tables/public/orders.json'],
1327
- peerFileCount: 0,
1328
- dependencyCount: 0,
1329
- },
1330
- {
1331
- unitKey: 'historic-sql-table-public-customers',
1332
- rawFiles: ['tables/public/customers.json'],
1333
- peerFileCount: 0,
1334
- dependencyCount: 0,
1335
- },
1336
- ],
1337
- });
1338
- input.memoryFlow?.emit({ type: 'chunks_planned', chunkCount: 2, workUnitCount: 2, evictionCount: 0 });
1339
- input.memoryFlow?.emit({
1340
- type: 'work_unit_started',
1341
- unitKey: 'historic-sql-table-public-orders',
1342
- skills: ['historic_sql_table_digest'],
1343
- stepBudget: 40,
1344
- });
1345
- input.memoryFlow?.emit({
1346
- type: 'work_unit_step',
1347
- unitKey: 'historic-sql-table-public-orders',
1348
- stepIndex: 7,
1349
- stepBudget: 40,
1350
- });
1351
- input.memoryFlow?.emit({
1352
- type: 'work_unit_finished',
1353
- unitKey: 'historic-sql-table-public-orders',
1354
- status: 'success',
1355
- });
1356
- input.memoryFlow?.finish('done');
1357
- return completedLocalBundleRun(input, input.jobId ?? 'historic-step-progress-job');
1358
- });
1359
- const io = makeIo({ isTTY: true });
1360
- await expect(runKtxIngest({
1361
- command: 'run',
1362
- projectDir,
1363
- connectionId: 'warehouse',
1364
- adapter: 'historic-sql',
1365
- outputMode: 'plain',
1366
- }, io.io, {
1367
- env: interactiveEnv(),
1368
- createAdapters: vi.fn(() => createdAdapters),
1369
- runLocalIngest: runLocal,
1370
- jobIdFactory: () => 'historic-step-progress-job',
1371
- })).resolves.toBe(0);
1372
- const stderr = io.stderr();
1373
- expect(stderr).toContain('[45%] Planned 2 tasks');
1374
- expect(stderr).toContain('[55%] Processing 1/2 tasks: historic-sql-table-public-orders');
1375
- expect(stderr).toContain('\r[58%] Processing tasks: 0/2 complete, 1 active; latest historic-sql-table-public-orders step 7/40\u001b[K');
1376
- expect(stderr).toContain('[68%] Processed 1/2 tasks');
1377
- });
1378
- it('renders concurrent WorkUnit step progress as transient aggregate status', async () => {
1379
- const projectDir = join(tempDir, 'historic-sql-concurrent-progress-project');
1380
- await mkdir(projectDir, { recursive: true });
1381
- await writeFile(join(projectDir, 'ktx.yaml'), [
1382
- 'connections:',
1383
- ' warehouse:',
1384
- ' driver: postgres',
1385
- ' url: env:WAREHOUSE_DATABASE_URL',
1386
- ' context:',
1387
- ' queryHistory:',
1388
- ' enabled: true',
1389
- ' minExecutions: 2',
1390
- 'ingest:',
1391
- ' adapters:',
1392
- ' - historic-sql',
1393
- '',
1394
- ].join('\n'), 'utf-8');
1395
- const createdAdapters = [
1396
- { source: 'historic-sql', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1397
- ];
1398
- const workUnitKeys = [
1399
- 'historic-sql-table-public-orders',
1400
- 'historic-sql-table-public-customers',
1401
- 'historic-sql-table-public-line-items',
1402
- 'historic-sql-table-public-payments',
1403
- 'historic-sql-table-public-products',
1404
- 'historic-sql-table-public-suppliers',
1405
- ];
1406
- const runLocal = vi.fn(async (input) => {
1407
- input.memoryFlow?.update({
1408
- plannedWorkUnits: workUnitKeys.map((unitKey) => ({
1409
- unitKey,
1410
- rawFiles: [`tables/${unitKey}.json`],
1411
- peerFileCount: 0,
1412
- dependencyCount: 0,
1413
- })),
1414
- });
1415
- input.memoryFlow?.emit({
1416
- type: 'chunks_planned',
1417
- chunkCount: workUnitKeys.length,
1418
- workUnitCount: workUnitKeys.length,
1419
- evictionCount: 0,
1420
- });
1421
- for (const unitKey of workUnitKeys) {
1422
- input.memoryFlow?.emit({
1423
- type: 'work_unit_started',
1424
- unitKey,
1425
- skills: ['historic_sql_table_digest'],
1426
- stepBudget: 40,
1427
- });
1428
- }
1429
- for (const unitKey of workUnitKeys) {
1430
- input.memoryFlow?.emit({ type: 'work_unit_step', unitKey, stepIndex: 1, stepBudget: 40 });
1431
- }
1432
- input.memoryFlow?.finish('done');
1433
- return completedLocalBundleRun(input, input.jobId ?? 'historic-concurrent-progress-job');
1434
- });
1435
- const io = makeIo({ isTTY: true });
1436
- await expect(runKtxIngest({
1437
- command: 'run',
1438
- projectDir,
1439
- connectionId: 'warehouse',
1440
- adapter: 'historic-sql',
1441
- outputMode: 'plain',
1442
- }, io.io, {
1443
- env: interactiveEnv(),
1444
- createAdapters: vi.fn(() => createdAdapters),
1445
- runLocalIngest: runLocal,
1446
- jobIdFactory: () => 'historic-concurrent-progress-job',
1447
- })).resolves.toBe(0);
1448
- const stderr = io.stderr();
1449
- expect(stderr).toContain('\r[56%] Processing tasks: 0/6 complete, 6 active; latest historic-sql-table-public-suppliers step 1/40\u001b[K');
1450
- expect(stderr).not.toContain('\n[56%] Processing 6/6 tasks: historic-sql-table-public-suppliers step 1/40\n');
1451
- expect(stderr).toContain('\n[100%] Ingest completed\n');
1452
- });
1453
- it('passes local Looker pull-config options and agent runner into scheduled ingest for Looker scheduled ingest', async () => {
1454
- const projectDir = join(tempDir, 'project');
1455
- await writeWarehouseConfig(projectDir);
1456
- const pullConfigOptions = {
1457
- looker: {
1458
- parser: { parse: vi.fn() },
1459
- },
1460
- };
1461
- const agentRunner = { runLoop: vi.fn() };
1462
- const createdAdapters = [
1463
- { source: 'fake', skillNames: [], detect: async () => true, chunk: async () => ({ workUnits: [] }) },
1464
- ];
1465
- const createAdapters = vi.fn(() => createdAdapters);
1466
- const runLocal = vi.fn(async (input) => completedLocalBundleRun(input, input.jobId ?? 'local-job-1'));
1467
- const io = makeIo();
1468
- await expect(runKtxIngest({
1469
- command: 'run',
1470
- projectDir,
1471
- connectionId: 'warehouse',
1472
- adapter: 'fake',
1473
- outputMode: 'plain',
1474
- }, io.io, {
1475
- createAdapters,
1476
- runLocalIngest: runLocal,
1477
- jobIdFactory: () => 'local-job-1',
1478
- localIngestOptions: {
1479
- agentRunner,
1480
- pullConfigOptions,
1481
- },
1482
- })).resolves.toBe(0);
1483
- expect(createAdapters).toHaveBeenCalledWith(expect.objectContaining({ projectDir }), expect.objectContaining({
1484
- logger: expect.any(Object),
1485
- looker: {
1486
- parser: pullConfigOptions.looker.parser,
1487
- },
1488
- }));
1489
- expect(runLocal).toHaveBeenCalledWith(expect.objectContaining({
1490
- agentRunner,
1491
- pullConfigOptions: expect.objectContaining(pullConfigOptions),
1492
- }));
1493
- });
1494
- it('runs Looker scheduled ingest through the public CLI command path', async () => {
1495
- const projectDir = join(tempDir, 'looker-project');
1496
- await writeWarehouseConfig(projectDir);
1497
- await writeFile(join(projectDir, 'ktx.yaml'), [
1498
- 'connections:',
1499
- ' prod-looker:',
1500
- ' driver: looker',
1501
- ' base_url: https://looker.example.test',
1502
- ' client_id: client',
1503
- ' prod-warehouse:',
1504
- ' driver: postgres',
1505
- ' url: postgresql://readonly@db.example.test/analytics',
1506
- 'ingest:',
1507
- ' adapters:',
1508
- ' - looker',
1509
- ' embeddings:',
1510
- ' backend: none',
1511
- '',
1512
- ].join('\n'), 'utf-8');
1513
- const project = await loadKtxProject({ projectDir });
1514
- const store = new LocalLookerRuntimeStore({ dbPath: ktxLocalStateDbPath(project) });
1515
- await store.setCursors('prod-looker', {
1516
- dashboardsLastSyncedAt: null,
1517
- looksLastSyncedAt: null,
1518
- });
1519
- await store.upsertConnectionMapping({
1520
- lookerConnectionId: 'prod-looker',
1521
- lookerConnectionName: 'analytics',
1522
- ktxConnectionId: 'prod-warehouse',
1523
- source: 'cli',
1524
- });
1525
- const runtimeClient = makeCliLookerRuntimeClient();
1526
- const parser = makeCliLookerParser();
1527
- const agentRunner = new CliLookerSlWritingAgentRunner();
1528
- const io = makeIo();
1529
- await expect(runKtxIngest({
1530
- command: 'run',
1531
- projectDir,
1532
- connectionId: 'prod-looker',
1533
- adapter: 'looker',
1534
- outputMode: 'plain',
1535
- }, io.io, {
1536
- jobIdFactory: () => 'cli-looker-job',
1537
- localIngestOptions: {
1538
- agentRunner,
1539
- pullConfigOptions: {
1540
- looker: {
1541
- client: runtimeClient,
1542
- runtimeClient,
1543
- parser,
1544
- },
1545
- },
1546
- },
1547
- })).resolves.toBe(0);
1548
- expect(io.stderr()).toBe('');
1549
- expect(io.stdout()).toContain('Job: cli-looker-job');
1550
- expect(io.stdout()).toContain('Source: Looker');
1551
- expect(io.stdout()).toContain('Connection: prod-looker');
1552
- expect(io.stdout()).toContain('Status: done');
1553
- expect(io.stdout()).toContain('Saved memory: 0 wiki, 1 SL');
1554
- expect(parser.parse).toHaveBeenCalledWith(expect.arrayContaining([
1555
- expect.objectContaining({ key: 'ecommerce.orders', sql_table_name: 'public.orders', dialect: 'postgres' }),
1556
- expect.objectContaining({ key: 'ecommerce.orders.users', sql_table_name: 'public.users', dialect: 'postgres' }),
1557
- ]));
1558
- expect(runtimeClient.cleanup).toHaveBeenCalledTimes(1);
1559
- const slPath = join(projectDir, 'semantic-layer', 'prod-warehouse', 'looker__ecommerce__orders.yaml');
1560
- await access(slPath);
1561
- await expect(readFile(slPath, 'utf-8')).resolves.toContain('table: public.orders');
1562
- const statusIo = makeIo();
1563
- await expect(runKtxIngest({ command: 'status', projectDir, runId: 'cli-looker-job', outputMode: 'plain' }, statusIo.io)).resolves.toBe(0);
1564
- expect(statusIo.stdout()).toContain('Job: cli-looker-job');
1565
- expect(statusIo.stdout()).toContain('Source: Looker');
1566
- expect(statusIo.stderr()).toBe('');
1567
- });
1568
- });