@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,885 +0,0 @@
1
- import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { initKtxProject } from './context/project/project.js';
5
- import { parseKtxProjectConfig } from './context/project/config.js';
6
- import { readKtxSetupState, writeKtxSetupState } from './context/project/setup-config.js';
7
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
8
- import { BUNDLED_ANTHROPIC_MODELS, fetchAnthropicModels, runKtxSetupAnthropicModelStep, } from './setup-models.js';
9
- function makeIo() {
10
- let stdout = '';
11
- let stderr = '';
12
- return {
13
- io: {
14
- stdout: {
15
- isTTY: true,
16
- write: (chunk) => {
17
- stdout += chunk;
18
- },
19
- },
20
- stderr: {
21
- write: (chunk) => {
22
- stderr += chunk;
23
- },
24
- },
25
- },
26
- stdout: () => stdout,
27
- stderr: () => stderr,
28
- };
29
- }
30
- function makeSpinnerEvents() {
31
- const events = [];
32
- const spinner = vi.fn(() => ({
33
- start: (msg) => events.push(`start:${msg}`),
34
- message: (msg) => events.push(`message:${msg}`),
35
- stop: (msg) => events.push(`stop:${msg}`),
36
- error: (msg) => events.push(`error:${msg}`),
37
- }));
38
- return { events, spinner };
39
- }
40
- function makePromptAdapter(options) {
41
- const selectValues = [...(options.selectValues ?? [])];
42
- const textValues = [...(options.textValues ?? [])];
43
- const passwordValues = [...(options.passwordValues ?? [])];
44
- let providerPromptCount = 0;
45
- const choose = async ({ message }) => {
46
- if (message.includes('LLM provider')) {
47
- providerPromptCount += 1;
48
- const nextProviderChoice = selectValues[0];
49
- if (nextProviderChoice === 'anthropic' ||
50
- nextProviderChoice === 'vertex' ||
51
- nextProviderChoice === 'claude-code' ||
52
- nextProviderChoice === 'back') {
53
- return selectValues.shift() ?? nextProviderChoice;
54
- }
55
- if (options.credentialChoice === 'back' && providerPromptCount > 1) {
56
- return 'back';
57
- }
58
- return options.providerChoice ?? 'anthropic';
59
- }
60
- const nextValue = selectValues.shift();
61
- if (nextValue) {
62
- return nextValue;
63
- }
64
- if (message.includes('Anthropic API key')) {
65
- return options.credentialChoice ?? 'env';
66
- }
67
- return options.modelChoice ?? 'claude-sonnet-4-6';
68
- };
69
- return {
70
- select: vi.fn(choose),
71
- autocomplete: vi.fn(choose),
72
- text: vi.fn(async () => textValues.shift() ?? ''),
73
- password: vi.fn(async () => passwordValues.length > 0 ? passwordValues.shift() : options.passwordValue ?? 'sk-ant-pasted'),
74
- cancel: vi.fn(),
75
- };
76
- }
77
- describe('setup Anthropic model step', () => {
78
- let tempDir;
79
- beforeEach(async () => {
80
- tempDir = await mkdtemp(join(tmpdir(), 'ktx-setup-models-'));
81
- await initKtxProject({ projectDir: tempDir });
82
- });
83
- afterEach(async () => {
84
- await rm(tempDir, { recursive: true, force: true });
85
- });
86
- it('does not expose Claude Sonnet 4 or Claude Opus 4 as selectable Anthropic models', async () => {
87
- const fetchModels = vi.fn(async () => new Response(JSON.stringify({
88
- data: [
89
- { id: 'claude-sonnet-4', display_name: 'Claude Sonnet 4' },
90
- { id: 'claude-opus-4', display_name: 'Claude Opus 4' },
91
- { id: 'claude-sonnet-4-6', display_name: 'Claude Sonnet 4.6' },
92
- { id: 'claude-opus-4-6', display_name: 'Claude Opus 4.6' },
93
- { id: 'claude-haiku-4-5', display_name: 'Claude Haiku 4.5' },
94
- ],
95
- }), { status: 200 }));
96
- await expect(fetchAnthropicModels('sk-ant-test', fetchModels)).resolves.toEqual([
97
- { id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true },
98
- { id: 'claude-opus-4-6', label: 'Claude Opus 4.6', recommended: false },
99
- { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', recommended: false },
100
- ]);
101
- expect(BUNDLED_ANTHROPIC_MODELS.map((model) => model.id)).not.toEqual(expect.arrayContaining(['claude-sonnet-4', 'claude-opus-4']));
102
- });
103
- it('filters Claude Sonnet 4 and Claude Opus 4 from Anthropic model prompt choices', async () => {
104
- const prompts = makePromptAdapter({ selectValues: ['env', 'back', 'back'] });
105
- await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, {
106
- prompts,
107
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
108
- listModels: vi.fn(async () => [
109
- { id: 'claude-sonnet-4', label: 'Claude Sonnet 4', recommended: true },
110
- { id: 'claude-opus-4', label: 'Claude Opus 4', recommended: false },
111
- { id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true },
112
- { id: 'claude-opus-4-6', label: 'Claude Opus 4.6', recommended: false },
113
- { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5', recommended: false },
114
- ]),
115
- });
116
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
117
- message: expect.stringContaining('Which Anthropic model should KTX use?'),
118
- options: [
119
- { value: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', hint: 'recommended' },
120
- { value: 'claude-opus-4-6', label: 'Claude Opus 4.6' },
121
- { value: 'claude-haiku-4-5', label: 'Claude Haiku 4.5' },
122
- { value: 'manual', label: 'Enter a model ID manually' },
123
- { value: 'back', label: 'Back' },
124
- ],
125
- }));
126
- });
127
- it('offers Anthropic provider paths in the preferred order', async () => {
128
- const prompts = makePromptAdapter({ providerChoice: 'back' });
129
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, { prompts, env: {} });
130
- expect(result.status).toBe('back');
131
- expect(prompts.select).toHaveBeenCalledWith(expect.objectContaining({
132
- message: expect.stringContaining('Which LLM provider should KTX use?'),
133
- options: [
134
- { value: 'claude-code', label: 'Claude subscription (Pro/Max)' },
135
- { value: 'anthropic', label: 'Anthropic API key' },
136
- { value: 'vertex', label: 'Google Vertex AI for Anthropic Claude' },
137
- { value: 'back', label: 'Back' },
138
- ],
139
- }));
140
- });
141
- it('configures Claude Code backend and validates local auth', async () => {
142
- const io = makeIo();
143
- const authProbe = vi.fn(async () => ({ ok: true }));
144
- const result = await runKtxSetupAnthropicModelStep({
145
- projectDir: tempDir,
146
- inputMode: 'disabled',
147
- llmBackend: 'claude-code',
148
- skipLlm: false,
149
- }, io.io, { claudeCodeAuthProbe: authProbe });
150
- expect(result.status).toBe('ready');
151
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
152
- expect(config.llm).toMatchObject({
153
- provider: { backend: 'claude-code' },
154
- models: { default: 'sonnet' },
155
- });
156
- expect(authProbe).toHaveBeenCalledWith(expect.objectContaining({ projectDir: tempDir, model: 'sonnet' }));
157
- });
158
- it('prompts for the Claude Code model during interactive setup', async () => {
159
- const io = makeIo();
160
- const prompts = makePromptAdapter({ selectValues: ['claude-code', 'opus'] });
161
- const authProbe = vi.fn(async () => ({ ok: true }));
162
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, { prompts, claudeCodeAuthProbe: authProbe });
163
- expect(result.status).toBe('ready');
164
- expect(prompts.select).toHaveBeenCalledWith(expect.objectContaining({
165
- message: expect.stringContaining('Which Claude Code model should KTX use?'),
166
- options: [
167
- { value: 'sonnet', label: 'Claude Sonnet', hint: 'recommended' },
168
- { value: 'opus', label: 'Claude Opus' },
169
- { value: 'haiku', label: 'Claude Haiku' },
170
- { value: 'manual', label: 'Enter a Claude Code model ID manually' },
171
- { value: 'back', label: 'Back' },
172
- ],
173
- }));
174
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
175
- expect(config.llm).toMatchObject({
176
- provider: { backend: 'claude-code' },
177
- models: { default: 'opus' },
178
- });
179
- expect(authProbe).toHaveBeenCalledWith(expect.objectContaining({ projectDir: tempDir, model: 'opus' }));
180
- });
181
- it('warns during Claude Code setup when existing prompt-caching fields will be ignored', async () => {
182
- await writeFile(join(tempDir, 'ktx.yaml'), [
183
- 'llm:',
184
- ' provider:',
185
- ' backend: anthropic',
186
- ' models:',
187
- ' default: claude-sonnet-4-6',
188
- ' promptCaching:',
189
- ' enabled: true',
190
- ' systemTtl: 1h',
191
- ' toolsTtl: 1h',
192
- ' historyTtl: 5m',
193
- '',
194
- ].join('\n'), 'utf-8');
195
- const io = makeIo();
196
- const result = await runKtxSetupAnthropicModelStep({
197
- projectDir: tempDir,
198
- inputMode: 'disabled',
199
- llmBackend: 'claude-code',
200
- skipLlm: false,
201
- }, io.io, {
202
- claudeCodeAuthProbe: async () => ({ ok: true }),
203
- });
204
- expect(result.status).toBe('ready');
205
- expect(io.stderr()).toContain('claude-code ignores llm.promptCaching.systemTtl');
206
- expect(io.stderr()).toContain('Claude Agent SDK does not expose KTX prompt-cache TTL, tool, or history markers');
207
- });
208
- it('returns from Anthropic credential Back to provider selection', async () => {
209
- const prompts = makePromptAdapter({ selectValues: ['anthropic', 'back', 'back'] });
210
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, { prompts, env: {} });
211
- expect(result.status).toBe('back');
212
- expect(prompts.select).toHaveBeenNthCalledWith(3, expect.objectContaining({
213
- message: expect.stringContaining('Which LLM provider should KTX use?'),
214
- }));
215
- });
216
- it('configures env credentials, selected model, prompt caching, and llm completion state', async () => {
217
- const io = makeIo();
218
- const { events: spinnerEvents, spinner } = makeSpinnerEvents();
219
- const result = await runKtxSetupAnthropicModelStep({
220
- projectDir: tempDir,
221
- inputMode: 'disabled',
222
- anthropicApiKeyEnv: 'ANTHROPIC_API_KEY', // pragma: allowlist secret
223
- llmModel: 'claude-sonnet-4-6',
224
- skipLlm: false,
225
- }, io.io, {
226
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
227
- healthCheck: vi.fn(async () => ({ ok: true })),
228
- spinner,
229
- });
230
- expect(result.status).toBe('ready');
231
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
232
- expect(config.llm).toMatchObject({
233
- provider: {
234
- backend: 'anthropic',
235
- anthropic: { api_key: 'env:ANTHROPIC_API_KEY' }, // pragma: allowlist secret
236
- },
237
- models: { default: 'claude-sonnet-4-6' },
238
- promptCaching: { enabled: true },
239
- });
240
- expect(config.scan.enrichment.mode).toBe('llm');
241
- expect(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8')).not.toContain('completed_steps:');
242
- expect((await readKtxSetupState(tempDir)).completed_steps).toContain('llm');
243
- expect(spinnerEvents).toEqual([
244
- 'start:Checking Anthropic API LLM (claude-sonnet-4-6).',
245
- 'stop:LLM test passed (Anthropic API, claude-sonnet-4-6)',
246
- ]);
247
- expect(io.stdout()).toContain('LLM ready: yes');
248
- expect(io.stdout()).not.toContain('sk-ant-test');
249
- });
250
- it('configures Vertex AI provider, selected model, prompt caching, and llm completion state', async () => {
251
- const io = makeIo();
252
- const healthCheck = vi.fn(async () => ({ ok: true }));
253
- const { events: spinnerEvents, spinner } = makeSpinnerEvents();
254
- const result = await runKtxSetupAnthropicModelStep({
255
- projectDir: tempDir,
256
- inputMode: 'disabled',
257
- llmBackend: 'vertex',
258
- vertexProject: 'local-gcp-project',
259
- vertexLocation: 'us-east5',
260
- llmModel: 'claude-sonnet-4-6',
261
- skipLlm: false,
262
- }, io.io, { env: {}, healthCheck, spinner });
263
- expect(result.status).toBe('ready');
264
- expect(healthCheck).toHaveBeenCalledWith({
265
- backend: 'vertex',
266
- vertex: { project: 'local-gcp-project', location: 'us-east5' },
267
- modelSlots: { default: 'claude-sonnet-4-6' },
268
- promptCaching: { enabled: true, vertexFallbackTo5m: true },
269
- });
270
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
271
- expect(config.llm).toMatchObject({
272
- provider: {
273
- backend: 'vertex',
274
- vertex: { project: 'local-gcp-project', location: 'us-east5' },
275
- },
276
- models: { default: 'claude-sonnet-4-6' },
277
- promptCaching: { enabled: true, vertexFallbackTo5m: true },
278
- });
279
- expect(config.scan.enrichment.mode).toBe('llm');
280
- expect(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8')).not.toContain('completed_steps:');
281
- expect((await readKtxSetupState(tempDir)).completed_steps).toContain('llm');
282
- expect(spinnerEvents).toEqual([
283
- 'start:Checking Vertex AI LLM (claude-sonnet-4-6).',
284
- 'stop:LLM test passed (Vertex AI, claude-sonnet-4-6)',
285
- ]);
286
- expect(io.stdout()).toContain('LLM ready: yes (claude-sonnet-4-6)');
287
- });
288
- it('uses existing Vertex AI credentials without an extra auth choice', async () => {
289
- const io = makeIo();
290
- const prompts = makePromptAdapter({ selectValues: ['vertex', 'local-gcp-project', 'claude-sonnet-4-6'] });
291
- const readGcloudProject = vi.fn(async () => 'local-gcp-project');
292
- const listGcloudProjects = vi.fn(async () => [
293
- { projectId: 'local-gcp-project', name: 'Local project' },
294
- { projectId: 'other-gcp-project', name: 'Other project' },
295
- ]);
296
- const healthCheck = vi.fn(async () => ({ ok: true }));
297
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
298
- prompts,
299
- env: {},
300
- readGcloudProject,
301
- listGcloudProjects,
302
- healthCheck,
303
- });
304
- expect(result.status).toBe('ready');
305
- expect(prompts.select).not.toHaveBeenCalledWith(expect.objectContaining({
306
- message: expect.stringContaining('How should KTX authenticate with Google Vertex AI?'),
307
- }));
308
- expect(readGcloudProject).toHaveBeenCalled();
309
- expect(listGcloudProjects).toHaveBeenCalled();
310
- expect(prompts.text).not.toHaveBeenCalled();
311
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
312
- message: expect.stringContaining('Which Google Cloud project should KTX use for Vertex AI?'),
313
- options: [
314
- { value: 'local-gcp-project', label: 'local-gcp-project - Local project (current gcloud project)' },
315
- { value: 'other-gcp-project', label: 'other-gcp-project - Other project' },
316
- { value: 'manual', label: 'Enter a project ID manually' },
317
- { value: 'back', label: 'Back' },
318
- ],
319
- }));
320
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
321
- message: expect.stringContaining('Which Anthropic model should KTX use?'),
322
- options: [
323
- { value: 'claude-opus-4-7', label: 'Claude Opus 4.7' },
324
- { value: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6' },
325
- { value: 'claude-opus-4-6', label: 'Claude Opus 4.6' },
326
- { value: 'claude-opus-4-5', label: 'Claude Opus 4.5' },
327
- { value: 'claude-haiku-4-5', label: 'Claude Haiku 4.5' },
328
- { value: 'claude-sonnet-4-5', label: 'Claude Sonnet 4.5' },
329
- { value: 'claude-opus-4-1', label: 'Claude Opus 4.1' },
330
- { value: 'manual', label: 'Enter a model ID manually' },
331
- { value: 'back', label: 'Back' },
332
- ],
333
- }));
334
- expect(healthCheck).toHaveBeenCalledWith({
335
- backend: 'vertex',
336
- vertex: { project: 'local-gcp-project', location: 'us-east5' },
337
- modelSlots: { default: 'claude-sonnet-4-6' },
338
- promptCaching: { enabled: true, vertexFallbackTo5m: true },
339
- });
340
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
341
- expect(config.llm.provider).toMatchObject({
342
- backend: 'vertex',
343
- vertex: { project: 'local-gcp-project', location: 'us-east5' },
344
- });
345
- });
346
- it('skips the Vertex AI auth choice when Application Default Credentials are the only option', async () => {
347
- const io = makeIo();
348
- const prompts = makePromptAdapter({ selectValues: ['vertex', 'local-gcp-project', 'claude-sonnet-4-6'] });
349
- const healthCheck = vi.fn(async () => ({ ok: true }));
350
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
351
- prompts,
352
- env: {},
353
- readGcloudProject: vi.fn(async () => 'local-gcp-project'),
354
- listGcloudProjects: vi.fn(async () => [{ projectId: 'local-gcp-project', name: 'Local project' }]),
355
- healthCheck,
356
- });
357
- expect(result.status).toBe('ready');
358
- expect(prompts.select).not.toHaveBeenCalledWith(expect.objectContaining({
359
- message: expect.stringContaining('How should KTX authenticate with Google Vertex AI?'),
360
- }));
361
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
362
- message: expect.stringContaining('Which Google Cloud project should KTX use for Vertex AI?'),
363
- }));
364
- expect(healthCheck).toHaveBeenCalledWith(expect.objectContaining({
365
- backend: 'vertex',
366
- vertex: { project: 'local-gcp-project', location: 'us-east5' },
367
- }));
368
- });
369
- it('lets users choose a different visible gcloud project for Vertex AI', async () => {
370
- const io = makeIo();
371
- const prompts = makePromptAdapter({ selectValues: ['vertex', 'other-gcp-project', 'claude-sonnet-4-6'] });
372
- const healthCheck = vi.fn(async () => ({ ok: true }));
373
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
374
- prompts,
375
- env: {},
376
- readGcloudProject: vi.fn(async () => 'current-gcp-project'),
377
- listGcloudProjects: vi.fn(async () => [
378
- { projectId: 'current-gcp-project', name: 'Current project' },
379
- { projectId: 'other-gcp-project', name: 'Other project' },
380
- ]),
381
- healthCheck,
382
- });
383
- expect(result.status).toBe('ready');
384
- expect(healthCheck).toHaveBeenCalledWith({
385
- backend: 'vertex',
386
- vertex: { project: 'other-gcp-project', location: 'us-east5' },
387
- modelSlots: { default: 'claude-sonnet-4-6' },
388
- promptCaching: { enabled: true, vertexFallbackTo5m: true },
389
- });
390
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
391
- expect(config.llm.provider).toMatchObject({
392
- backend: 'vertex',
393
- vertex: { project: 'other-gcp-project', location: 'us-east5' },
394
- });
395
- });
396
- it('allows manual Vertex AI project entry when gcloud project listing is empty', async () => {
397
- const io = makeIo();
398
- const prompts = makePromptAdapter({
399
- selectValues: ['vertex', 'manual', 'claude-sonnet-4-6'],
400
- textValues: ['manual-gcp-project'],
401
- });
402
- const healthCheck = vi.fn(async () => ({ ok: true }));
403
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
404
- prompts,
405
- env: {},
406
- readGcloudProject: vi.fn(async () => undefined),
407
- listGcloudProjects: vi.fn(async () => []),
408
- healthCheck,
409
- });
410
- expect(result.status).toBe('ready');
411
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
412
- message: expect.stringContaining('Which Google Cloud project should KTX use for Vertex AI?'),
413
- options: [
414
- { value: 'manual', label: 'Enter a project ID manually' },
415
- { value: 'back', label: 'Back' },
416
- ],
417
- }));
418
- expect(prompts.text).toHaveBeenCalledWith(expect.objectContaining({
419
- message: 'Google Cloud project ID\n│ Press Escape to go back.\n│',
420
- }));
421
- expect(healthCheck).toHaveBeenCalledWith(expect.objectContaining({
422
- vertex: { project: 'manual-gcp-project', location: 'us-east5' },
423
- }));
424
- });
425
- it('lets users retry Vertex AI project listing after gcloud auth fails', async () => {
426
- const io = makeIo();
427
- const prompts = makePromptAdapter({ selectValues: ['vertex', 'retry', 'other-gcp-project', 'claude-sonnet-4-6'] });
428
- const listGcloudProjects = vi
429
- .fn()
430
- .mockRejectedValueOnce(new Error('Reauthentication failed. cannot prompt during non-interactive execution.'))
431
- .mockResolvedValueOnce([
432
- { projectId: 'local-gcp-project', name: 'Local project' },
433
- { projectId: 'other-gcp-project', name: 'Other project' },
434
- ]);
435
- const healthCheck = vi.fn(async () => ({ ok: true }));
436
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
437
- prompts,
438
- env: {},
439
- readGcloudProject: vi.fn(async () => 'local-gcp-project'),
440
- listGcloudProjects,
441
- healthCheck,
442
- });
443
- expect(result.status).toBe('ready');
444
- expect(listGcloudProjects).toHaveBeenCalledTimes(2);
445
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
446
- message: expect.stringContaining('Could not list Google Cloud projects with gcloud'),
447
- options: expect.arrayContaining([{ value: 'retry', label: 'Retry loading Google Cloud projects' }]),
448
- }));
449
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
450
- message: expect.stringContaining(`${String.fromCharCode(0x1b)}[33mCould not list Google Cloud projects with gcloud`),
451
- }));
452
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
453
- message: expect.stringContaining('gcloud auth login --update-adc'),
454
- }));
455
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
456
- message: expect.stringContaining(`${String.fromCharCode(0x1b)}[33mRun \`gcloud auth login --update-adc\``),
457
- }));
458
- expect(healthCheck).toHaveBeenCalledWith(expect.objectContaining({
459
- vertex: { project: 'other-gcp-project', location: 'us-east5' },
460
- }));
461
- });
462
- it('returns from Vertex AI project selection Back to provider selection', async () => {
463
- const prompts = makePromptAdapter({ selectValues: ['vertex', 'back', 'back'] });
464
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, {
465
- prompts,
466
- env: {},
467
- readGcloudProject: vi.fn(async () => 'current-gcp-project'),
468
- listGcloudProjects: vi.fn(async () => [{ projectId: 'current-gcp-project', name: 'Current project' }]),
469
- });
470
- expect(result.status).toBe('back');
471
- expect(prompts.select).toHaveBeenNthCalledWith(2, expect.objectContaining({
472
- message: expect.stringContaining('Which LLM provider should KTX use?'),
473
- }));
474
- });
475
- it('explains common Vertex AI Forbidden health-check causes', async () => {
476
- const io = makeIo();
477
- const result = await runKtxSetupAnthropicModelStep({
478
- projectDir: tempDir,
479
- inputMode: 'disabled',
480
- llmBackend: 'vertex',
481
- vertexProject: 'kaelio-orbit-looker-20260430',
482
- vertexLocation: 'us-east5',
483
- llmModel: 'claude-sonnet-4-6',
484
- skipLlm: false,
485
- }, io.io, {
486
- env: {},
487
- healthCheck: vi.fn(async () => ({ ok: false, message: 'Forbidden' })),
488
- });
489
- expect(result.status).toBe('failed');
490
- expect(io.stderr()).toContain('project kaelio-orbit-looker-20260430');
491
- expect(io.stderr()).toContain('Vertex AI API is enabled');
492
- expect(io.stderr()).toContain('Anthropic Claude model access');
493
- expect(io.stderr()).toContain('roles/aiplatform.user');
494
- });
495
- it('resolves --anthropic-api-key-file for health checks and stores a file reference', async () => {
496
- const io = makeIo();
497
- const secretPath = join(tempDir, 'anthropic-api-key');
498
- await writeFile(secretPath, 'sk-ant-file', 'utf-8'); // pragma: allowlist secret
499
- const healthCheck = vi.fn(async () => ({ ok: true }));
500
- const result = await runKtxSetupAnthropicModelStep({
501
- projectDir: tempDir,
502
- inputMode: 'disabled',
503
- anthropicApiKeyFile: secretPath,
504
- llmModel: 'claude-sonnet-4-6',
505
- skipLlm: false,
506
- }, io.io, { env: {}, healthCheck });
507
- expect(result.status).toBe('ready');
508
- expect(healthCheck).toHaveBeenCalledWith(expect.objectContaining({
509
- anthropic: { apiKey: 'sk-ant-file' }, // pragma: allowlist secret
510
- modelSlots: { default: 'claude-sonnet-4-6' },
511
- }));
512
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
513
- expect(config.llm).toMatchObject({
514
- provider: {
515
- backend: 'anthropic',
516
- anthropic: { api_key: `file:${secretPath}` }, // pragma: allowlist secret
517
- },
518
- models: { default: 'claude-sonnet-4-6' },
519
- });
520
- expect(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8')).not.toContain('completed_steps:');
521
- expect((await readKtxSetupState(tempDir)).completed_steps).toContain('llm');
522
- expect(io.stdout()).not.toContain('sk-ant-file');
523
- });
524
- it('returns missing-input when --anthropic-api-key-file points to a missing file', async () => {
525
- const io = makeIo();
526
- const missingSecretPath = join(tempDir, 'missing-anthropic-api-key');
527
- const healthCheck = vi.fn(async () => ({ ok: true }));
528
- const result = await runKtxSetupAnthropicModelStep({
529
- projectDir: tempDir,
530
- inputMode: 'disabled',
531
- anthropicApiKeyFile: missingSecretPath,
532
- llmModel: 'claude-sonnet-4-6',
533
- skipLlm: false,
534
- }, io.io, { env: {}, healthCheck });
535
- expect(result.status).toBe('missing-input');
536
- expect(healthCheck).not.toHaveBeenCalled();
537
- expect(io.stderr()).toContain(`Missing Anthropic API key file: ${missingSecretPath}`);
538
- });
539
- it('does not recommend skipping when non-interactive setup is missing an Anthropic credential source', async () => {
540
- const io = makeIo();
541
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'disabled', skipLlm: false }, io.io);
542
- expect(result.status).toBe('missing-input');
543
- expect(io.stderr()).toContain('Missing Anthropic API key: pass --anthropic-api-key-env or --anthropic-api-key-file.');
544
- expect(io.stderr()).not.toContain('--skip-llm');
545
- });
546
- it('does not recommend skipping when non-interactive setup is missing an LLM model', async () => {
547
- const io = makeIo();
548
- const healthCheck = vi.fn(async () => ({ ok: true }));
549
- const result = await runKtxSetupAnthropicModelStep({
550
- projectDir: tempDir,
551
- inputMode: 'disabled',
552
- anthropicApiKeyEnv: 'ANTHROPIC_API_KEY', // pragma: allowlist secret
553
- skipLlm: false,
554
- }, io.io, { env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, healthCheck });
555
- expect(result.status).toBe('missing-input');
556
- expect(healthCheck).not.toHaveBeenCalled();
557
- expect(io.stderr()).toContain('Missing LLM model: pass --llm-model.');
558
- expect(io.stderr()).not.toContain('--skip-llm');
559
- });
560
- it('writes pasted keys to .ktx/secrets and never prints the key', async () => {
561
- const io = makeIo();
562
- const prompts = makePromptAdapter({
563
- credentialChoice: 'paste',
564
- modelChoice: 'claude-sonnet-4-6',
565
- passwordValue: 'sk-ant-pasted', // pragma: allowlist secret
566
- });
567
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
568
- prompts,
569
- env: {},
570
- listModels: vi.fn(async () => [{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true }]),
571
- healthCheck: vi.fn(async () => ({ ok: true })),
572
- });
573
- expect(result.status).toBe('ready');
574
- await expect(readFile(join(tempDir, '.ktx/secrets/anthropic-api-key'), 'utf-8')).resolves.toBe('sk-ant-pasted\n'); // pragma: allowlist secret
575
- if (process.platform !== 'win32') {
576
- expect((await stat(join(tempDir, '.ktx/secrets/anthropic-api-key'))).mode & 0o777).toBe(0o600);
577
- }
578
- const yaml = await readFile(join(tempDir, 'ktx.yaml'), 'utf-8');
579
- expect(yaml).toContain('api_key: file:');
580
- expect(yaml).not.toContain('sk-ant-pasted');
581
- expect(io.stdout()).not.toContain('sk-ant-pasted');
582
- });
583
- it('opens pasted key entry directly and tells users Escape goes back', async () => {
584
- const prompts = makePromptAdapter({
585
- selectValues: ['paste', 'claude-sonnet-4-6'],
586
- passwordValue: 'sk-ant-pasted', // pragma: allowlist secret
587
- });
588
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, {
589
- prompts,
590
- env: {},
591
- listModels: vi.fn(async () => [{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true }]),
592
- healthCheck: vi.fn(async () => ({ ok: true })),
593
- });
594
- expect(result.status).toBe('ready');
595
- expect(prompts.select).not.toHaveBeenCalledWith(expect.objectContaining({ message: 'Paste Anthropic API key now?' }));
596
- expect(prompts.password).toHaveBeenCalledWith({
597
- message: 'Anthropic API key\n│ Press Escape to go back.\n│',
598
- });
599
- });
600
- it('does not offer skipping while choosing an Anthropic credential source', async () => {
601
- const prompts = makePromptAdapter({ credentialChoice: 'back' });
602
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, { prompts, env: {} });
603
- expect(result.status).toBe('back');
604
- expect(prompts.select).toHaveBeenCalledWith(expect.objectContaining({
605
- message: expect.stringContaining('How should KTX find your Anthropic API key?'),
606
- options: expect.not.arrayContaining([expect.objectContaining({ value: 'skip' })]),
607
- }));
608
- });
609
- it('explains why KTX asks for an Anthropic API key', async () => {
610
- const io = makeIo();
611
- const prompts = makePromptAdapter({ credentialChoice: 'back' });
612
- const expectedPromptMessage = [
613
- 'How should KTX find your Anthropic API key?',
614
- '',
615
- [
616
- 'KTX uses the key to verify Anthropic model access now and to run ingest agents that turn schemas, SQL,',
617
- 'BI metadata, and docs into semantic-layer sources and wiki context. ktx.yaml stores an env: or file:',
618
- 'reference, not the raw key.',
619
- ].join(' '),
620
- ].join('\n');
621
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, { prompts, env: {} });
622
- expect(result.status).toBe('back');
623
- expect(prompts.select).toHaveBeenCalledWith(expect.objectContaining({
624
- message: expectedPromptMessage,
625
- }));
626
- expect(io.stdout()).not.toContain('KTX uses the key');
627
- });
628
- it('does not offer skipping while choosing an Anthropic model', async () => {
629
- const prompts = makePromptAdapter({ selectValues: ['env', 'back', 'back'] });
630
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, {
631
- prompts,
632
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
633
- listModels: vi.fn(async () => [{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true }]),
634
- });
635
- expect(result.status).toBe('back');
636
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
637
- message: expect.stringContaining('Which Anthropic model should KTX use?'),
638
- options: expect.not.arrayContaining([expect.objectContaining({ value: 'skip' })]),
639
- }));
640
- });
641
- it('explains why KTX asks for an Anthropic model', async () => {
642
- const io = makeIo();
643
- const prompts = makePromptAdapter({ credentialChoice: 'env', modelChoice: 'claude-sonnet-4-6' });
644
- const expectedPromptMessage = [
645
- 'Which Anthropic model should KTX use?',
646
- '',
647
- [
648
- 'KTX uses this as the default model for ingest agents that turn schemas, SQL, BI metadata, and docs',
649
- 'into semantic-layer sources and wiki context.',
650
- ].join(' '),
651
- ].join('\n');
652
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
653
- prompts,
654
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
655
- listModels: vi.fn(async () => [{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true }]),
656
- healthCheck: vi.fn(async () => ({ ok: true })),
657
- });
658
- expect(result.status).toBe('ready');
659
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
660
- message: expectedPromptMessage,
661
- }));
662
- expect(io.stdout()).not.toContain('KTX uses this as the default model');
663
- expect(io.stdout()).not.toContain('Setup verifies the selected model now');
664
- });
665
- it('uses the bundled fallback registry when live discovery fails', async () => {
666
- const io = makeIo();
667
- const prompts = makePromptAdapter({ credentialChoice: 'env', modelChoice: 'claude-sonnet-4-6' });
668
- await expect(runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
669
- prompts,
670
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
671
- listModels: vi.fn(async () => {
672
- throw new Error('network unavailable');
673
- }),
674
- healthCheck: vi.fn(async () => ({ ok: true })),
675
- })).resolves.toMatchObject({ status: 'ready' });
676
- expect(io.stderr()).toContain('Could not fetch live Anthropic models. Showing bundled defaults.');
677
- });
678
- it('shows bundled model choices when live discovery fails', async () => {
679
- const io = makeIo();
680
- const prompts = makePromptAdapter({ selectValues: ['env', 'manual'], textValues: [''] });
681
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
682
- prompts,
683
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
684
- listModels: vi.fn(async () => {
685
- throw new Error('network unavailable');
686
- }),
687
- healthCheck: vi.fn(async () => ({ ok: true })),
688
- });
689
- expect(result.status).toBe('missing-input');
690
- expect(BUNDLED_ANTHROPIC_MODELS.length).toBeGreaterThan(0);
691
- expect(prompts.autocomplete).toHaveBeenCalledWith(expect.objectContaining({
692
- message: expect.stringContaining('Which Anthropic model should KTX use?'),
693
- options: expect.arrayContaining([
694
- { value: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', hint: 'recommended' },
695
- ]),
696
- }));
697
- expect(prompts.text).toHaveBeenCalledWith(expect.objectContaining({
698
- message: 'Anthropic model ID\n│ Press Escape to go back.\n│',
699
- placeholder: 'claude-sonnet-4-6',
700
- }));
701
- });
702
- it('reports invalid Anthropic API keys during live discovery instead of showing bundled defaults', async () => {
703
- const io = makeIo();
704
- const prompts = makePromptAdapter({ selectValues: ['env', 'back'] });
705
- const fetchModels = vi.fn(async () => new Response(JSON.stringify({ error: { message: 'invalid x-api-key' } }), { status: 401 }));
706
- const healthCheck = vi.fn(async () => ({ ok: true }));
707
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
708
- prompts,
709
- env: { ANTHROPIC_API_KEY: 'sk-ant-invalid' }, // pragma: allowlist secret
710
- fetch: fetchModels,
711
- healthCheck,
712
- });
713
- expect(result.status).toBe('back');
714
- expect(fetchModels).toHaveBeenCalledTimes(1);
715
- expect(healthCheck).not.toHaveBeenCalled();
716
- expect(io.stderr()).toContain('Anthropic API key is invalid or unauthorized');
717
- expect(io.stderr()).toContain('Choose a different credential source or Back.');
718
- expect(io.stderr()).not.toContain('Could not fetch live Anthropic models. Showing bundled defaults.');
719
- expect(io.stderr()).not.toContain('sk-ant-invalid');
720
- });
721
- it('does not persist llm completion when the health check fails', async () => {
722
- const io = makeIo();
723
- const result = await runKtxSetupAnthropicModelStep({
724
- projectDir: tempDir,
725
- inputMode: 'disabled',
726
- anthropicApiKeyEnv: 'ANTHROPIC_API_KEY', // pragma: allowlist secret
727
- llmModel: 'claude-sonnet-4-6',
728
- skipLlm: false,
729
- }, io.io, {
730
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
731
- healthCheck: vi.fn(async () => ({ ok: false, message: '401 invalid x-api-key [redacted]' })),
732
- });
733
- expect(result.status).toBe('failed');
734
- expect(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8')).not.toContain('completed_steps:');
735
- expect(io.stderr()).toContain('Anthropic model health check failed: 401 invalid x-api-key [redacted]');
736
- expect(io.stderr()).not.toContain('sk-ant-test');
737
- });
738
- it('re-prompts after an interactive health-check failure and saves after retry success', async () => {
739
- const io = makeIo();
740
- const prompts = makePromptAdapter({
741
- selectValues: ['env', 'claude-haiku-3-5', 'env', 'claude-sonnet-4-6'],
742
- });
743
- const healthCheck = vi
744
- .fn()
745
- .mockResolvedValueOnce({ ok: false, message: 'model not found' })
746
- .mockResolvedValueOnce({ ok: true });
747
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, io.io, {
748
- prompts,
749
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
750
- listModels: vi.fn(async () => [
751
- { id: 'claude-haiku-3-5', label: 'Claude Haiku 3.5', recommended: false },
752
- { id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true },
753
- ]),
754
- healthCheck,
755
- });
756
- expect(result.status).toBe('ready');
757
- expect(healthCheck).toHaveBeenCalledTimes(2);
758
- expect(prompts.select).toHaveBeenCalledTimes(3);
759
- expect(prompts.autocomplete).toHaveBeenCalledTimes(2);
760
- expect(io.stderr()).toContain('Anthropic model health check failed: model not found');
761
- expect(io.stderr()).toContain('Choose a different credential source or model, or Back.');
762
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
763
- expect(config.llm.models.default).toBe('claude-sonnet-4-6');
764
- expect(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8')).not.toContain('completed_steps:');
765
- expect((await readKtxSetupState(tempDir)).completed_steps).toContain('llm');
766
- expect(io.stderr()).not.toContain('sk-ant-test');
767
- });
768
- it('leaves setup incomplete when skipped', async () => {
769
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'disabled', skipLlm: true }, makeIo().io);
770
- expect(result.status).toBe('skipped');
771
- expect(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8')).not.toContain('completed_steps:');
772
- });
773
- it('returns back without writing config when Back is selected', async () => {
774
- const prompts = makePromptAdapter({ credentialChoice: 'back' });
775
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, { prompts, env: {} });
776
- expect(result.status).toBe('back');
777
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
778
- expect(config.llm.provider.backend).toBe('none');
779
- });
780
- it('returns from model selection Back to credential selection instead of exiting setup', async () => {
781
- const prompts = makePromptAdapter({
782
- selectValues: ['paste', 'back', 'back'],
783
- passwordValue: 'sk-ant-pasted', // pragma: allowlist secret
784
- });
785
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, {
786
- prompts,
787
- env: {},
788
- listModels: vi.fn(async () => [{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true }]),
789
- healthCheck: vi.fn(async () => ({ ok: true })),
790
- });
791
- expect(result.status).toBe('back');
792
- expect(prompts.select).toHaveBeenNthCalledWith(3, expect.objectContaining({
793
- message: expect.stringContaining('How should KTX find your Anthropic API key?'),
794
- }));
795
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
796
- expect(config.llm.provider.backend).toBe('none');
797
- });
798
- it('returns from pasted key entry Escape to credential selection and can use env credentials', async () => {
799
- const prompts = makePromptAdapter({
800
- selectValues: ['paste', 'env', 'claude-sonnet-4-6'],
801
- passwordValues: [undefined],
802
- });
803
- const result = await runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'auto', skipLlm: false }, makeIo().io, {
804
- prompts,
805
- env: { ANTHROPIC_API_KEY: 'sk-ant-env' }, // pragma: allowlist secret
806
- listModels: vi.fn(async () => [{ id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6', recommended: true }]),
807
- healthCheck: vi.fn(async () => ({ ok: true })),
808
- });
809
- expect(result.status).toBe('ready');
810
- expect(prompts.password).toHaveBeenCalledWith({
811
- message: 'Anthropic API key\n│ Press Escape to go back.\n│',
812
- });
813
- await expect(readFile(join(tempDir, '.ktx/secrets/anthropic-api-key'), 'utf-8')).rejects.toMatchObject({
814
- code: 'ENOENT',
815
- });
816
- const config = parseKtxProjectConfig(await readFile(join(tempDir, 'ktx.yaml'), 'utf-8'));
817
- expect(config.llm.provider).toMatchObject({
818
- backend: 'anthropic',
819
- anthropic: { api_key: 'env:ANTHROPIC_API_KEY' }, // pragma: allowlist secret
820
- });
821
- });
822
- it('preserves already completed llm setup when no model args request changes', async () => {
823
- await mkdir(join(tempDir, '.ktx'), { recursive: true });
824
- await initKtxProject({ projectDir: tempDir, force: true });
825
- await writeFile(join(tempDir, 'ktx.yaml'), [
826
- 'setup:',
827
- ' database_connection_ids: []',
828
- 'connections: {}',
829
- 'llm:',
830
- ' provider:',
831
- ' backend: anthropic',
832
- ' anthropic:',
833
- ' api_key: env:ANTHROPIC_API_KEY', // pragma: allowlist secret
834
- ' models:',
835
- ' default: claude-sonnet-4-6',
836
- 'ingest:',
837
- ' embeddings:',
838
- ' backend: none',
839
- ' dimensions: 8',
840
- ].join('\n'), 'utf-8');
841
- await writeKtxSetupState(tempDir, { completed_steps: ['project', 'llm'] });
842
- const healthCheck = vi.fn(async () => ({ ok: true }));
843
- await expect(runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'disabled', skipLlm: false }, makeIo().io, {
844
- env: { ANTHROPIC_API_KEY: 'sk-ant-test' }, // pragma: allowlist secret
845
- healthCheck,
846
- })).resolves.toMatchObject({ status: 'ready' });
847
- expect(healthCheck).not.toHaveBeenCalled();
848
- });
849
- it.each([
850
- {
851
- backend: 'vertex',
852
- providerLines: [' backend: vertex', ' vertex:', ' project: kaelio-dev', ' location: us-east5'],
853
- model: 'claude-sonnet-4-6',
854
- },
855
- {
856
- backend: 'gateway',
857
- providerLines: [' backend: gateway', ' gateway:', ' api_key: env:AI_GATEWAY_API_KEY'],
858
- model: 'anthropic/claude-sonnet-4-6',
859
- },
860
- ])('preserves already configured $backend llm setup without asking for Anthropic credentials', async (fixture) => {
861
- await writeFile(join(tempDir, 'ktx.yaml'), [
862
- 'setup:',
863
- ' database_connection_ids: []',
864
- 'connections: {}',
865
- 'llm:',
866
- ' provider:',
867
- ...fixture.providerLines,
868
- ' models:',
869
- ` default: ${fixture.model}`,
870
- 'ingest:',
871
- ' embeddings:',
872
- ' backend: none',
873
- ' dimensions: 8',
874
- ].join('\n'), 'utf-8');
875
- await writeKtxSetupState(tempDir, { completed_steps: ['project', 'llm'] });
876
- const healthCheck = vi.fn(async () => ({ ok: true }));
877
- const io = makeIo();
878
- await expect(runKtxSetupAnthropicModelStep({ projectDir: tempDir, inputMode: 'disabled', skipLlm: false }, io.io, {
879
- healthCheck,
880
- })).resolves.toMatchObject({ status: 'ready' });
881
- expect(healthCheck).not.toHaveBeenCalled();
882
- expect(io.stdout()).toContain(`LLM ready: yes (${fixture.model})`);
883
- expect(io.stderr()).not.toContain('Anthropic');
884
- });
885
- });