@kaelio/ktx 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (875) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.7.0-py3-none-any.whl} +0 -0
  2. package/assets/python/manifest.json +4 -4
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/clack.d.ts +8 -0
  5. package/dist/clack.js +14 -0
  6. package/dist/connection.js +2 -9
  7. package/dist/connectors/bigquery/connector.d.ts +6 -1
  8. package/dist/connectors/bigquery/connector.js +38 -9
  9. package/dist/connectors/bigquery/dialect.d.ts +11 -9
  10. package/dist/connectors/bigquery/dialect.js +25 -45
  11. package/dist/connectors/clickhouse/connector.d.ts +5 -0
  12. package/dist/connectors/clickhouse/connector.js +36 -3
  13. package/dist/connectors/clickhouse/dialect.d.ts +11 -12
  14. package/dist/connectors/clickhouse/dialect.js +25 -100
  15. package/dist/connectors/mysql/connector.d.ts +7 -1
  16. package/dist/connectors/mysql/connector.js +67 -9
  17. package/dist/connectors/mysql/dialect.d.ts +11 -9
  18. package/dist/connectors/mysql/dialect.js +25 -43
  19. package/dist/connectors/postgres/connector.d.ts +6 -0
  20. package/dist/connectors/postgres/connector.js +67 -12
  21. package/dist/connectors/postgres/dialect.d.ts +11 -9
  22. package/dist/connectors/postgres/dialect.js +26 -35
  23. package/dist/connectors/snowflake/connector.d.ts +8 -3
  24. package/dist/connectors/snowflake/connector.js +39 -20
  25. package/dist/connectors/snowflake/dialect.d.ts +11 -9
  26. package/dist/connectors/snowflake/dialect.js +25 -24
  27. package/dist/connectors/sqlite/connector.d.ts +3 -1
  28. package/dist/connectors/sqlite/connector.js +23 -3
  29. package/dist/connectors/sqlite/dialect.d.ts +11 -9
  30. package/dist/connectors/sqlite/dialect.js +25 -29
  31. package/dist/connectors/sqlserver/connector.d.ts +6 -0
  32. package/dist/connectors/sqlserver/connector.js +56 -9
  33. package/dist/connectors/sqlserver/dialect.d.ts +11 -10
  34. package/dist/connectors/sqlserver/dialect.js +24 -40
  35. package/dist/context/connections/connection-type.d.ts +1 -1
  36. package/dist/context/connections/dialect-helpers.d.ts +9 -0
  37. package/dist/context/connections/dialect-helpers.js +67 -0
  38. package/dist/context/connections/dialects.d.ts +23 -5
  39. package/dist/context/connections/dialects.js +18 -56
  40. package/dist/context/connections/drivers.d.ts +23 -0
  41. package/dist/context/connections/drivers.js +171 -0
  42. package/dist/context/connections/local-query-executor.js +25 -7
  43. package/dist/context/connections/local-warehouse-descriptor.js +0 -2
  44. package/dist/context/connections/postgres-query-executor.js +1 -1
  45. package/dist/context/connections/sqlite-query-executor.js +1 -1
  46. package/dist/context/ingest/adapters/historic-sql/chunk-unified.js +1 -1
  47. package/dist/context/ingest/adapters/historic-sql/connection-dialect.js +11 -7
  48. package/dist/context/ingest/adapters/historic-sql/evidence-tool.d.ts +1 -1
  49. package/dist/context/ingest/adapters/historic-sql/evidence-tool.js +8 -5
  50. package/dist/context/ingest/adapters/historic-sql/evidence.d.ts +4 -4
  51. package/dist/context/ingest/adapters/historic-sql/evidence.js +2 -2
  52. package/dist/context/ingest/adapters/historic-sql/projection.js +5 -2
  53. package/dist/context/ingest/adapters/live-database/daemon-introspection.js +1 -1
  54. package/dist/context/ingest/adapters/live-database/stage.d.ts +2 -0
  55. package/dist/context/ingest/adapters/live-database/stage.js +9 -0
  56. package/dist/context/ingest/adapters/looker/mapping.d.ts +0 -3
  57. package/dist/context/ingest/adapters/looker/mapping.js +0 -3
  58. package/dist/context/ingest/adapters/looker/types.d.ts +1 -1
  59. package/dist/context/ingest/historic-sql-probes/bigquery-runner.d.ts +34 -0
  60. package/dist/context/ingest/historic-sql-probes/bigquery-runner.js +99 -0
  61. package/dist/context/ingest/historic-sql-probes/postgres-runner.d.ts +26 -0
  62. package/dist/context/ingest/historic-sql-probes/postgres-runner.js +76 -0
  63. package/dist/context/ingest/historic-sql-probes/snowflake-runner.d.ts +29 -0
  64. package/dist/context/ingest/historic-sql-probes/snowflake-runner.js +62 -0
  65. package/dist/context/ingest/historic-sql-probes.d.ts +46 -0
  66. package/dist/context/ingest/historic-sql-probes.js +62 -0
  67. package/dist/context/ingest/local-adapters.js +0 -1
  68. package/dist/context/ingest/local-ingest.js +1 -1
  69. package/dist/context/llm/claude-code-runtime.js +16 -1
  70. package/dist/context/mcp/context-tools.js +11 -48
  71. package/dist/context/mcp/local-project-ports.js +0 -3
  72. package/dist/context/project/config.d.ts +0 -8
  73. package/dist/context/project/driver-schemas.d.ts +0 -4
  74. package/dist/context/project/driver-schemas.js +0 -2
  75. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  76. package/dist/context/scan/constraint-discovery.js +23 -0
  77. package/dist/context/scan/enabled-tables.d.ts +4 -5
  78. package/dist/context/scan/enabled-tables.js +4 -18
  79. package/dist/context/scan/entity-details.js +14 -44
  80. package/dist/context/scan/local-enrichment.js +13 -1
  81. package/dist/context/scan/local-scan.js +5 -4
  82. package/dist/context/scan/local-structural-artifacts.js +51 -0
  83. package/dist/context/scan/relationship-benchmarks.js +9 -6
  84. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  85. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  86. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  87. package/dist/context/scan/relationship-discovery.js +4 -4
  88. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  89. package/dist/context/scan/relationship-profiling.js +25 -94
  90. package/dist/context/scan/relationship-validation.d.ts +3 -2
  91. package/dist/context/scan/relationship-validation.js +12 -22
  92. package/dist/context/scan/table-ref.d.ts +1 -2
  93. package/dist/context/scan/table-ref.js +3 -4
  94. package/dist/context/scan/types.d.ts +6 -2
  95. package/dist/context/scan/warehouse-catalog.js +31 -48
  96. package/dist/context/sl/local-query.js +0 -3
  97. package/dist/context/sl/local-sl.js +0 -13
  98. package/dist/context/sl/semantic-layer.service.js +1 -4
  99. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  100. package/dist/context-build-view.js +1 -1
  101. package/dist/database-tree-picker.js +14 -7
  102. package/dist/error-message.d.ts +1 -0
  103. package/dist/error-message.js +29 -0
  104. package/dist/ingest-depth.js +0 -1
  105. package/dist/ingest.js +2 -2
  106. package/dist/llm/embedding-health.js +2 -2
  107. package/dist/local-scan-connectors.js +13 -56
  108. package/dist/managed-local-embeddings.js +2 -1
  109. package/dist/managed-python-daemon.d.ts +5 -0
  110. package/dist/managed-python-daemon.js +29 -9
  111. package/dist/managed-python-http.js +2 -1
  112. package/dist/public-ingest.js +1 -6
  113. package/dist/runtime-requirements.js +2 -2
  114. package/dist/setup-agents.d.ts +1 -1
  115. package/dist/setup-agents.js +16 -74
  116. package/dist/setup-context.js +2 -1
  117. package/dist/setup-databases.d.ts +3 -13
  118. package/dist/setup-databases.js +141 -313
  119. package/dist/setup-embeddings.js +10 -2
  120. package/dist/setup-project.d.ts +0 -8
  121. package/dist/setup-project.js +3 -27
  122. package/dist/setup-runtime.js +2 -1
  123. package/dist/setup-sources.js +2 -1
  124. package/dist/setup.js +11 -18
  125. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  126. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  127. package/dist/skills/sl/SKILL.md +2 -2
  128. package/dist/sql.js +0 -4
  129. package/dist/status-project.d.ts +3 -18
  130. package/dist/status-project.js +42 -216
  131. package/dist/telemetry/events.d.ts +1 -1
  132. package/dist/telemetry/index.js +8 -3
  133. package/dist/tree-picker-state.d.ts +2 -2
  134. package/dist/tree-picker-state.js +29 -13
  135. package/dist/tree-picker-tui.d.ts +3 -1
  136. package/dist/tree-picker-tui.js +20 -32
  137. package/package.json +6 -6
  138. package/dist/admin-reindex.test.d.ts +0 -1
  139. package/dist/admin-reindex.test.js +0 -119
  140. package/dist/admin.test.d.ts +0 -1
  141. package/dist/admin.test.js +0 -201
  142. package/dist/cli-program-telemetry.test.d.ts +0 -1
  143. package/dist/cli-program-telemetry.test.js +0 -89
  144. package/dist/cli-program.test.d.ts +0 -1
  145. package/dist/cli-program.test.js +0 -71
  146. package/dist/command-tree.test.d.ts +0 -1
  147. package/dist/command-tree.test.js +0 -126
  148. package/dist/commands/mcp-commands.test.d.ts +0 -1
  149. package/dist/commands/mcp-commands.test.js +0 -111
  150. package/dist/commands/sql-commands.test.d.ts +0 -1
  151. package/dist/commands/sql-commands.test.js +0 -68
  152. package/dist/connection.test.d.ts +0 -1
  153. package/dist/connection.test.js +0 -426
  154. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  155. package/dist/connectors/bigquery/connector.test.js +0 -363
  156. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  157. package/dist/connectors/bigquery/dialect.test.js +0 -36
  158. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  159. package/dist/connectors/clickhouse/connector.test.js +0 -342
  160. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  161. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  162. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  163. package/dist/connectors/mysql/connector.test.js +0 -365
  164. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  165. package/dist/connectors/mysql/dialect.test.js +0 -36
  166. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  167. package/dist/connectors/postgres/connector.test.js +0 -391
  168. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  169. package/dist/connectors/postgres/dialect.test.js +0 -37
  170. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  171. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  172. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  173. package/dist/connectors/snowflake/connector.test.js +0 -462
  174. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  175. package/dist/connectors/snowflake/dialect.test.js +0 -34
  176. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  177. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  178. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  179. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  180. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  181. package/dist/connectors/sqlite/connector.test.js +0 -207
  182. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  183. package/dist/connectors/sqlite/dialect.test.js +0 -23
  184. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  185. package/dist/connectors/sqlserver/connector.test.js +0 -313
  186. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  187. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  188. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  189. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  190. package/dist/context/connections/dialects.test.d.ts +0 -1
  191. package/dist/context/connections/dialects.test.js +0 -24
  192. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  193. package/dist/context/connections/local-query-executor.test.js +0 -48
  194. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  195. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  196. package/dist/context/connections/notion-config.test.d.ts +0 -1
  197. package/dist/context/connections/notion-config.test.js +0 -121
  198. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  199. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  200. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  201. package/dist/context/connections/read-only-sql.test.js +0 -20
  202. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  203. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  204. package/dist/context/core/config-reference.test.d.ts +0 -1
  205. package/dist/context/core/config-reference.test.js +0 -27
  206. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  207. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  208. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  209. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  210. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  211. package/dist/context/core/git.service.patch.test.js +0 -40
  212. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  213. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  214. package/dist/context/core/git.service.test.d.ts +0 -1
  215. package/dist/context/core/git.service.test.js +0 -357
  216. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  217. package/dist/context/core/session-worktree.service.test.js +0 -97
  218. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  219. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  220. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  221. package/dist/context/index-sync/reindex.test.js +0 -139
  222. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  223. package/dist/context/ingest/action-identity.test.js +0 -19
  224. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  225. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  226. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  227. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  228. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  229. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  230. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  231. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  232. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  233. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  234. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  235. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  236. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  237. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  238. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  239. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  240. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  241. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  242. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  243. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  244. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  245. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  246. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  247. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  248. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  249. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  250. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  251. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  252. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  253. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  254. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  255. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  256. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  257. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  258. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  259. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  260. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  261. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  262. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  263. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  264. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  265. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  266. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  267. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  268. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  269. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  270. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  271. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  272. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  273. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  274. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  275. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  276. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  277. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  278. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  279. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  280. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  281. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  282. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  283. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  284. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  285. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  286. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  287. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  288. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  289. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  290. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  291. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  292. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  293. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  294. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  295. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  296. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  297. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  298. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  299. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  300. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  301. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  302. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  303. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  304. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  305. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  306. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  307. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  308. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  309. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  310. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  311. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  312. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  313. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  314. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  315. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  316. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  317. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  318. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  319. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  320. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  321. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  322. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  323. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  324. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  325. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  326. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  327. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  328. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  329. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  330. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  331. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  332. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  333. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  334. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  335. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  336. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  337. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  338. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  339. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  340. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  341. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  342. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  343. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  344. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  345. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  346. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  347. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  348. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  349. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  350. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  351. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  352. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  353. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  354. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  355. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  356. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  357. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  358. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  359. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  360. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  361. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  362. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  363. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  364. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  365. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  366. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  367. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  368. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  369. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  370. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  371. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  372. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  373. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  374. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  375. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  376. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  377. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  378. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  379. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  380. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  381. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  382. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  383. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  384. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  385. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  386. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  387. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  388. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  389. package/dist/context/ingest/artifact-gates.test.js +0 -167
  390. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  391. package/dist/context/ingest/canonical-pins.test.js +0 -66
  392. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  393. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  394. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  395. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  396. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  397. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  398. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  399. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  400. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  401. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  402. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  403. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  404. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  405. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  406. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  407. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  408. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  409. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  410. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  411. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  412. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  413. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  414. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  415. package/dist/context/ingest/diff-set.service.test.js +0 -132
  416. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  417. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  418. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  419. package/dist/context/ingest/finalization-scope.test.js +0 -114
  420. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  421. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  422. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  423. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  424. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  425. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  426. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  427. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  428. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  429. package/dist/context/ingest/ingest-trace.test.js +0 -76
  430. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  431. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  432. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  433. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  434. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  435. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  436. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  437. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  438. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  439. package/dist/context/ingest/local-adapters.test.js +0 -612
  440. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  441. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  442. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  443. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  444. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  445. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  446. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  447. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  448. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  449. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  450. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  451. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  452. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  453. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  454. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  455. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  456. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  457. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  458. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  459. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  460. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  461. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  462. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  463. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  464. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  465. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  466. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  467. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  468. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  469. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  470. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  471. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  472. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  473. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  474. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  475. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  476. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  477. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  478. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  479. package/dist/context/ingest/repo-fetch.test.js +0 -168
  480. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  481. package/dist/context/ingest/report-snapshot.test.js +0 -329
  482. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  483. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  484. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  485. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  486. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  487. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  488. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  489. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  490. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  491. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  492. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  493. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  494. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  495. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  496. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  497. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  498. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  499. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  500. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  501. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  502. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  503. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  504. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  505. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  506. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  507. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  508. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  509. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  510. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  511. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  512. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  513. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  514. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  515. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  516. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  517. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  518. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  519. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  520. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  521. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  522. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  523. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  524. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  525. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  526. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  527. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  528. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  529. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  530. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  531. package/dist/context/llm/claude-code-env.test.js +0 -17
  532. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  533. package/dist/context/llm/claude-code-models.test.js +0 -15
  534. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  535. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  536. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  537. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  538. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  539. package/dist/context/llm/embedding-port.test.js +0 -34
  540. package/dist/context/llm/local-config.test.d.ts +0 -1
  541. package/dist/context/llm/local-config.test.js +0 -164
  542. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  543. package/dist/context/llm/runtime-local-config.test.js +0 -17
  544. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  545. package/dist/context/llm/runtime-tools.test.js +0 -36
  546. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  547. package/dist/context/mcp/local-project-ports.test.js +0 -689
  548. package/dist/context/mcp/server.test.d.ts +0 -1
  549. package/dist/context/mcp/server.test.js +0 -902
  550. package/dist/context/memory/local-memory.test.d.ts +0 -1
  551. package/dist/context/memory/local-memory.test.js +0 -173
  552. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  553. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  554. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  555. package/dist/context/memory/memory-agent.service.test.js +0 -413
  556. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  557. package/dist/context/memory/memory-runs.test.js +0 -158
  558. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  559. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  560. package/dist/context/project/config.test.d.ts +0 -1
  561. package/dist/context/project/config.test.js +0 -467
  562. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  563. package/dist/context/project/driver-schemas.test.js +0 -125
  564. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  565. package/dist/context/project/local-git-file-store.test.js +0 -71
  566. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  567. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  568. package/dist/context/project/project.test.d.ts +0 -1
  569. package/dist/context/project/project.test.js +0 -55
  570. package/dist/context/project/setup-config.test.d.ts +0 -1
  571. package/dist/context/project/setup-config.test.js +0 -38
  572. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  573. package/dist/context/prompts/prompt.service.test.js +0 -43
  574. package/dist/context/scan/credentials.test.d.ts +0 -1
  575. package/dist/context/scan/credentials.test.js +0 -162
  576. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  577. package/dist/context/scan/data-dictionary.test.js +0 -92
  578. package/dist/context/scan/description-generation.test.d.ts +0 -1
  579. package/dist/context/scan/description-generation.test.js +0 -693
  580. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  581. package/dist/context/scan/embedding-text.test.js +0 -36
  582. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  583. package/dist/context/scan/enrichment-state.test.js +0 -147
  584. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  585. package/dist/context/scan/enrichment-summary.test.js +0 -34
  586. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  587. package/dist/context/scan/enrichment-types.test.js +0 -141
  588. package/dist/context/scan/entity-details.test.d.ts +0 -1
  589. package/dist/context/scan/entity-details.test.js +0 -234
  590. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  591. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  592. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  593. package/dist/context/scan/local-enrichment.test.js +0 -765
  594. package/dist/context/scan/local-scan.test.d.ts +0 -1
  595. package/dist/context/scan/local-scan.test.js +0 -1663
  596. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  597. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  598. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  599. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  600. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  601. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  602. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  603. package/dist/context/scan/relationship-budget.test.js +0 -71
  604. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  605. package/dist/context/scan/relationship-candidates.test.js +0 -747
  606. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  607. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  608. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  609. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  610. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  611. package/dist/context/scan/relationship-discovery.test.js +0 -618
  612. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  613. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  614. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  615. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  616. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  617. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  618. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  619. package/dist/context/scan/relationship-locality.test.js +0 -128
  620. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  621. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  622. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  623. package/dist/context/scan/relationship-profiling.test.js +0 -392
  624. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  625. package/dist/context/scan/relationship-scoring.test.js +0 -86
  626. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  627. package/dist/context/scan/relationship-validation.test.js +0 -455
  628. package/dist/context/scan/table-ref.test.d.ts +0 -1
  629. package/dist/context/scan/table-ref.test.js +0 -53
  630. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  631. package/dist/context/scan/type-normalization.test.js +0 -21
  632. package/dist/context/scan/types.test.d.ts +0 -1
  633. package/dist/context/scan/types.test.js +0 -206
  634. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  635. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  636. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  637. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  638. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  639. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  640. package/dist/context/search/discover.test.d.ts +0 -1
  641. package/dist/context/search/discover.test.js +0 -197
  642. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  643. package/dist/context/search/hybrid-search-core.test.js +0 -113
  644. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  645. package/dist/context/search/pglite-owner-process.test.js +0 -273
  646. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  647. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  648. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  649. package/dist/context/search/pglite-spike.test.js +0 -249
  650. package/dist/context/search/query.test.d.ts +0 -1
  651. package/dist/context/search/query.test.js +0 -23
  652. package/dist/context/search/rrf.test.d.ts +0 -1
  653. package/dist/context/search/rrf.test.js +0 -47
  654. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  655. package/dist/context/skills/skills-registry.service.test.js +0 -161
  656. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  657. package/dist/context/sl/dictionary-search.test.js +0 -204
  658. package/dist/context/sl/local-query.test.d.ts +0 -1
  659. package/dist/context/sl/local-query.test.js +0 -283
  660. package/dist/context/sl/local-sl.test.d.ts +0 -1
  661. package/dist/context/sl/local-sl.test.js +0 -334
  662. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  663. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  664. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  665. package/dist/context/sl/schemas.contract.test.js +0 -62
  666. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  667. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  668. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  669. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  670. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  671. package/dist/context/sl/sl-search.service.test.js +0 -256
  672. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  673. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  674. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  675. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  676. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  677. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  678. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  679. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  680. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  681. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  682. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  683. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  684. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  685. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  686. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  687. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  688. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  689. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  690. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  691. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  692. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  693. package/dist/context/test/make-local-git-repo.js +0 -34
  694. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  695. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  696. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  697. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  698. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  699. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  700. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  701. package/dist/context/wiki/local-knowledge.test.js +0 -270
  702. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  703. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  704. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  705. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  706. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  707. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  708. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  709. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  710. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  711. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  712. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  713. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  714. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  715. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  716. package/dist/context-build-view.test.d.ts +0 -1
  717. package/dist/context-build-view.test.js +0 -942
  718. package/dist/database-tree-picker.test.d.ts +0 -1
  719. package/dist/database-tree-picker.test.js +0 -188
  720. package/dist/demo-assets.test.d.ts +0 -1
  721. package/dist/demo-assets.test.js +0 -121
  722. package/dist/demo-metrics.test.d.ts +0 -1
  723. package/dist/demo-metrics.test.js +0 -108
  724. package/dist/doctor.test.d.ts +0 -1
  725. package/dist/doctor.test.js +0 -596
  726. package/dist/embedding-resolution.test.d.ts +0 -1
  727. package/dist/embedding-resolution.test.js +0 -132
  728. package/dist/example-smoke.test.d.ts +0 -1
  729. package/dist/example-smoke.test.js +0 -83
  730. package/dist/index.test.d.ts +0 -1
  731. package/dist/index.test.js +0 -1300
  732. package/dist/ingest-query-executor.test.d.ts +0 -1
  733. package/dist/ingest-query-executor.test.js +0 -71
  734. package/dist/ingest-report-file.test.d.ts +0 -1
  735. package/dist/ingest-report-file.test.js +0 -63
  736. package/dist/ingest-viz.test.d.ts +0 -1
  737. package/dist/ingest-viz.test.js +0 -691
  738. package/dist/ingest.test-utils.d.ts +0 -126
  739. package/dist/ingest.test-utils.js +0 -629
  740. package/dist/ingest.test.d.ts +0 -1
  741. package/dist/ingest.test.js +0 -1568
  742. package/dist/io/logger.test.d.ts +0 -1
  743. package/dist/io/logger.test.js +0 -55
  744. package/dist/io/mode.test.d.ts +0 -1
  745. package/dist/io/mode.test.js +0 -48
  746. package/dist/io/print-list.test.d.ts +0 -1
  747. package/dist/io/print-list.test.js +0 -277
  748. package/dist/knowledge.test.d.ts +0 -1
  749. package/dist/knowledge.test.js +0 -198
  750. package/dist/llm/embedding-health.test.d.ts +0 -1
  751. package/dist/llm/embedding-health.test.js +0 -72
  752. package/dist/llm/embedding-provider.test.d.ts +0 -1
  753. package/dist/llm/embedding-provider.test.js +0 -84
  754. package/dist/llm/message-builder.test.d.ts +0 -1
  755. package/dist/llm/message-builder.test.js +0 -127
  756. package/dist/llm/model-health.test.d.ts +0 -1
  757. package/dist/llm/model-health.test.js +0 -55
  758. package/dist/llm/model-provider.test.d.ts +0 -1
  759. package/dist/llm/model-provider.test.js +0 -246
  760. package/dist/llm/repair.test.d.ts +0 -1
  761. package/dist/llm/repair.test.js +0 -78
  762. package/dist/local-adapters.test.d.ts +0 -1
  763. package/dist/local-adapters.test.js +0 -166
  764. package/dist/local-scan-connectors.test.d.ts +0 -1
  765. package/dist/local-scan-connectors.test.js +0 -92
  766. package/dist/managed-local-embeddings.test.d.ts +0 -1
  767. package/dist/managed-local-embeddings.test.js +0 -229
  768. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  769. package/dist/managed-mcp-daemon.test.js +0 -187
  770. package/dist/managed-python-command.test.d.ts +0 -1
  771. package/dist/managed-python-command.test.js +0 -262
  772. package/dist/managed-python-daemon.test.d.ts +0 -1
  773. package/dist/managed-python-daemon.test.js +0 -360
  774. package/dist/managed-python-http.test.d.ts +0 -1
  775. package/dist/managed-python-http.test.js +0 -177
  776. package/dist/managed-python-runtime.test.d.ts +0 -1
  777. package/dist/managed-python-runtime.test.js +0 -426
  778. package/dist/mcp-http-server.test.d.ts +0 -1
  779. package/dist/mcp-http-server.test.js +0 -209
  780. package/dist/mcp-server-factory.test.d.ts +0 -1
  781. package/dist/mcp-server-factory.test.js +0 -142
  782. package/dist/memory-flow-interactive.test.d.ts +0 -1
  783. package/dist/memory-flow-interactive.test.js +0 -109
  784. package/dist/memory-flow-tui.test.d.ts +0 -1
  785. package/dist/memory-flow-tui.test.js +0 -247
  786. package/dist/next-steps.test.d.ts +0 -1
  787. package/dist/next-steps.test.js +0 -77
  788. package/dist/notion-page-picker.test.d.ts +0 -1
  789. package/dist/notion-page-picker.test.js +0 -244
  790. package/dist/print-command-tree.test.d.ts +0 -1
  791. package/dist/print-command-tree.test.js +0 -37
  792. package/dist/project-dir.test.d.ts +0 -1
  793. package/dist/project-dir.test.js +0 -124
  794. package/dist/project-resolver.test.d.ts +0 -1
  795. package/dist/project-resolver.test.js +0 -49
  796. package/dist/prompt-navigation.test.d.ts +0 -1
  797. package/dist/prompt-navigation.test.js +0 -33
  798. package/dist/proxy-env.test.d.ts +0 -1
  799. package/dist/proxy-env.test.js +0 -17
  800. package/dist/public-ingest-copy.test.d.ts +0 -1
  801. package/dist/public-ingest-copy.test.js +0 -24
  802. package/dist/public-ingest.test.d.ts +0 -1
  803. package/dist/public-ingest.test.js +0 -891
  804. package/dist/runtime-requirements.test.d.ts +0 -1
  805. package/dist/runtime-requirements.test.js +0 -73
  806. package/dist/runtime.test.d.ts +0 -1
  807. package/dist/runtime.test.js +0 -381
  808. package/dist/scan.test.d.ts +0 -1
  809. package/dist/scan.test.js +0 -1123
  810. package/dist/setup-agents.test.d.ts +0 -1
  811. package/dist/setup-agents.test.js +0 -1028
  812. package/dist/setup-context.test.d.ts +0 -1
  813. package/dist/setup-context.test.js +0 -491
  814. package/dist/setup-databases.test.d.ts +0 -1
  815. package/dist/setup-databases.test.js +0 -2101
  816. package/dist/setup-demo-tour.test.d.ts +0 -1
  817. package/dist/setup-demo-tour.test.js +0 -221
  818. package/dist/setup-embeddings.test.d.ts +0 -1
  819. package/dist/setup-embeddings.test.js +0 -436
  820. package/dist/setup-interrupt.test.d.ts +0 -1
  821. package/dist/setup-interrupt.test.js +0 -77
  822. package/dist/setup-models.test.d.ts +0 -1
  823. package/dist/setup-models.test.js +0 -885
  824. package/dist/setup-project.test.d.ts +0 -1
  825. package/dist/setup-project.test.js +0 -209
  826. package/dist/setup-prompts.test.d.ts +0 -1
  827. package/dist/setup-prompts.test.js +0 -208
  828. package/dist/setup-ready-menu.test.d.ts +0 -1
  829. package/dist/setup-ready-menu.test.js +0 -44
  830. package/dist/setup-runtime.test.d.ts +0 -1
  831. package/dist/setup-runtime.test.js +0 -111
  832. package/dist/setup-secrets.test.d.ts +0 -1
  833. package/dist/setup-secrets.test.js +0 -30
  834. package/dist/setup-sources-notion.test.d.ts +0 -1
  835. package/dist/setup-sources-notion.test.js +0 -109
  836. package/dist/setup-sources.test.d.ts +0 -1
  837. package/dist/setup-sources.test.js +0 -1303
  838. package/dist/setup.test.d.ts +0 -1
  839. package/dist/setup.test.js +0 -1825
  840. package/dist/sl.test.d.ts +0 -1
  841. package/dist/sl.test.js +0 -567
  842. package/dist/source-mapping.test.d.ts +0 -1
  843. package/dist/source-mapping.test.js +0 -65
  844. package/dist/sql.test.d.ts +0 -1
  845. package/dist/sql.test.js +0 -253
  846. package/dist/standalone-smoke.test.d.ts +0 -1
  847. package/dist/standalone-smoke.test.js +0 -250
  848. package/dist/status-project.test.d.ts +0 -1
  849. package/dist/status-project.test.js +0 -502
  850. package/dist/telemetry/command-hook.test.d.ts +0 -1
  851. package/dist/telemetry/command-hook.test.js +0 -31
  852. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  853. package/dist/telemetry/demo-detect.test.js +0 -22
  854. package/dist/telemetry/emitter.test.d.ts +0 -1
  855. package/dist/telemetry/emitter.test.js +0 -103
  856. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  857. package/dist/telemetry/events.snapshot.test.js +0 -135
  858. package/dist/telemetry/events.test.d.ts +0 -1
  859. package/dist/telemetry/events.test.js +0 -136
  860. package/dist/telemetry/identity.test.d.ts +0 -1
  861. package/dist/telemetry/identity.test.js +0 -148
  862. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  863. package/dist/telemetry/project-snapshot.test.js +0 -71
  864. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  865. package/dist/telemetry/schema-writer.test.js +0 -23
  866. package/dist/telemetry/scrubber.test.d.ts +0 -1
  867. package/dist/telemetry/scrubber.test.js +0 -21
  868. package/dist/text-ingest.test.d.ts +0 -1
  869. package/dist/text-ingest.test.js +0 -247
  870. package/dist/tree-picker-state.test.d.ts +0 -1
  871. package/dist/tree-picker-state.test.js +0 -303
  872. package/dist/tree-picker-tui.test.d.ts +0 -1
  873. package/dist/tree-picker-tui.test.js +0 -248
  874. package/dist/viz-fallback.test.d.ts +0 -1
  875. package/dist/viz-fallback.test.js +0 -77
@@ -1,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
- });