From 1180fffdeb54ceaf4f2c0c4cac0b9ebd5db2be24 Mon Sep 17 00:00:00 2001 From: Andrey Avtomonov Date: Wed, 13 May 2026 18:40:46 +0200 Subject: [PATCH] test: close unified ingest v1 expectations --- packages/cli/src/context-build-view.ts | 1 - packages/cli/src/ingest-depth.ts | 4 ++-- packages/cli/src/public-ingest.test.ts | 2 +- packages/cli/src/public-ingest.ts | 5 ++++- packages/cli/src/setup-context.test.ts | 26 +++++++++++++++++++----- packages/cli/src/setup-context.ts | 14 ++++++++++--- packages/cli/src/setup-databases.test.ts | 10 +++++++-- packages/cli/src/setup.test.ts | 1 - packages/cli/src/setup.ts | 5 +---- 9 files changed, 48 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/context-build-view.ts b/packages/cli/src/context-build-view.ts index 7a4d36e8..23225ce4 100644 --- a/packages/cli/src/context-build-view.ts +++ b/packages/cli/src/context-build-view.ts @@ -1,4 +1,3 @@ -import { resolve } from 'node:path'; import type { KtxProgressPort, KtxProgressUpdateOptions } from '@ktx/context/scan'; import type { KtxCliIo } from './index.js'; import type { KtxIngestProgressUpdate } from './ingest.js'; diff --git a/packages/cli/src/ingest-depth.ts b/packages/cli/src/ingest-depth.ts index fa4cc10c..f5706d8d 100644 --- a/packages/cli/src/ingest-depth.ts +++ b/packages/cli/src/ingest-depth.ts @@ -2,7 +2,7 @@ import type { KtxProjectConfig, KtxProjectConnectionConfig } from '@ktx/context/ export type KtxDatabaseContextDepth = 'fast' | 'deep'; -export const KTX_DATABASE_DRIVER_IDS = new Set([ +const KTX_DATABASE_DRIVER_IDS = new Set([ 'sqlite', 'postgres', 'postgresql', @@ -23,7 +23,7 @@ export function isDatabaseDriver(driver: string): boolean { return KTX_DATABASE_DRIVER_IDS.has(driver.trim().toLowerCase()); } -export function connectionContextRecord(connection: KtxProjectConnectionConfig): Record { +function connectionContextRecord(connection: KtxProjectConnectionConfig): Record { const context = connection.context; return typeof context === 'object' && context !== null && !Array.isArray(context) ? (context as Record) diff --git a/packages/cli/src/public-ingest.test.ts b/packages/cli/src/public-ingest.test.ts index edc4a226..8f4d4b41 100644 --- a/packages/cli/src/public-ingest.test.ts +++ b/packages/cli/src/public-ingest.test.ts @@ -46,7 +46,7 @@ function deepReadyProject( connections, llm: { ...config.llm, - provider: { backend: 'gateway', gateway: { api_key: 'env:KTX_GATEWAY_API_KEY' } }, + provider: { backend: 'gateway', gateway: { api_key: 'env:KTX_GATEWAY_API_KEY' } }, // pragma: allowlist secret models: { default: 'gpt-test' }, }, scan: { diff --git a/packages/cli/src/public-ingest.ts b/packages/cli/src/public-ingest.ts index a22b7704..2f334ad0 100644 --- a/packages/cli/src/public-ingest.ts +++ b/packages/cli/src/public-ingest.ts @@ -109,7 +109,10 @@ const queryHistoryDialectByDriver = new Map([ ]); function storedQueryHistory(connection: KtxProjectConnectionConfig): Record { - const value = connection.context?.queryHistory; + const context = connection.context; + const contextRecord = + context && typeof context === 'object' && !Array.isArray(context) ? (context as Record) : {}; + const value = contextRecord.queryHistory; return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record) : {}; } diff --git a/packages/cli/src/setup-context.test.ts b/packages/cli/src/setup-context.test.ts index 1fe34b28..cf10a2bf 100644 --- a/packages/cli/src/setup-context.test.ts +++ b/packages/cli/src/setup-context.test.ts @@ -15,6 +15,7 @@ import { contextBuildCommands, readKtxSetupContextState, runKtxSetupContextStep, + type KtxSetupContextDeps, writeKtxSetupContextState, } from './setup-context.js'; @@ -39,7 +40,16 @@ function makeIo() { }; } -async function writeReadyProject(projectDir: string, overrides: Partial = {}) { +type ReadyProjectOverrides = Omit, 'ingest' | 'llm' | 'scan'> & { + ingest?: Partial; + llm?: Partial; + scan?: Omit, 'enrichment' | 'relationships'> & { + enrichment?: Partial; + relationships?: Partial; + }; +}; + +async function writeReadyProject(projectDir: string, overrides: ReadyProjectOverrides = {}) { const defaults = buildDefaultKtxProjectConfig('revenue'); const readyConfig: KtxProjectConfig = { ...defaults, @@ -333,7 +343,9 @@ describe('setup context build state', () => { await writeFile(join(tempDir, 'wiki', 'global', 'metrics.md'), '# Metrics\n'); await writeReadyEnrichedScanReport(tempDir); const io = makeIo(); - const runContextBuildMock = vi.fn(async () => ({ exitCode: 0 })); + const runContextBuildMock = vi.fn>(async () => ({ + exitCode: 0, + })); await expect( runKtxSetupContextStep( @@ -415,7 +427,9 @@ describe('setup context build state', () => { manifestShards: ['semantic-layer/warehouse/_schema/public.yaml'], }); const io = makeIo(); - const runContextBuildMock = vi.fn(async () => ({ exitCode: 0 })); + const runContextBuildMock = vi.fn>(async () => ({ + exitCode: 0, + })); await expect( runKtxSetupContextStep( @@ -438,7 +452,9 @@ describe('setup context build state', () => { scan: { enrichment: { mode: 'none' } }, }); const io = makeIo(); - const runContextBuildMock = vi.fn(async () => ({ exitCode: 0 })); + const runContextBuildMock = vi.fn>(async () => ({ + exitCode: 0, + })); const verifyContextReady = vi.fn(async () => ({ ready: true, agentContextReady: true, @@ -472,7 +488,7 @@ describe('setup context build state', () => { await writeReadyProject(tempDir, { connections: { warehouse: { driver: 'postgres', readonly: true } }, llm: { - provider: { backend: 'gateway', gateway: { api_key: 'env:KTX_GATEWAY_API_KEY' } }, + provider: { backend: 'gateway', gateway: { api_key: 'env:KTX_GATEWAY_API_KEY' } }, // pragma: allowlist secret models: { default: 'gpt-test' }, }, scan: { diff --git a/packages/cli/src/setup-context.ts b/packages/cli/src/setup-context.ts index f369110d..a7a91adb 100644 --- a/packages/cli/src/setup-context.ts +++ b/packages/cli/src/setup-context.ts @@ -153,10 +153,18 @@ function normalizeState(projectDir: string, value: unknown): KtxSetupContextStat if (typeof value !== 'object' || value === null || Array.isArray(value)) { return notStartedState(projectDir); } - const record = value as Partial; - const rawStatus = record.status ?? 'not_started'; + const record = value as Record; + const rawStatus = typeof record.status === 'string' ? record.status : 'not_started'; const legacyActive = rawStatus === 'detached' || rawStatus === 'paused' || rawStatus === 'running'; - const status: KtxSetupContextBuildStatus = legacyActive ? 'stale' : rawStatus; + const status: KtxSetupContextBuildStatus = legacyActive + ? 'stale' + : rawStatus === 'completed' || + rawStatus === 'failed' || + rawStatus === 'interrupted' || + rawStatus === 'not_started' || + rawStatus === 'stale' + ? rawStatus + : 'not_started'; const runId = typeof record.runId === 'string' && record.runId.length > 0 ? record.runId : undefined; return { ...(runId ? { runId } : {}), diff --git a/packages/cli/src/setup-databases.test.ts b/packages/cli/src/setup-databases.test.ts index 734eea63..c80fba9b 100644 --- a/packages/cli/src/setup-databases.test.ts +++ b/packages/cli/src/setup-databases.test.ts @@ -1438,8 +1438,14 @@ describe('setup databases step', () => { }, }); expect(config.connections.warehouse.historicSql).toBeUndefined(); - expect(config.connections.warehouse.context?.queryHistory).not.toHaveProperty('windowDays'); - expect(config.connections.warehouse.context?.queryHistory).not.toHaveProperty('redactionPatterns'); + const warehouseContext = + config.connections.warehouse.context && + typeof config.connections.warehouse.context === 'object' && + !Array.isArray(config.connections.warehouse.context) + ? (config.connections.warehouse.context as Record) + : {}; + expect(warehouseContext.queryHistory).not.toHaveProperty('windowDays'); + expect(warehouseContext.queryHistory).not.toHaveProperty('redactionPatterns'); expect(configText).not.toContain('live-database'); expect(configText).not.toContain('historic-sql'); expect(configText).not.toMatch(/^\s+adapters:/m); diff --git a/packages/cli/src/setup.test.ts b/packages/cli/src/setup.test.ts index c5dfd6ea..621312f4 100644 --- a/packages/cli/src/setup.test.ts +++ b/packages/cli/src/setup.test.ts @@ -1655,7 +1655,6 @@ describe('setup status', () => { const status = await readKtxSetupStatus(tempDir); expect(status.context.status).toBe('stale'); - expect(status.context.watchCommand).toBeUndefined(); const state = await readKtxSetupContextState(tempDir); expect(state.status).toBe('stale'); }); diff --git a/packages/cli/src/setup.ts b/packages/cli/src/setup.ts index ee7d227e..474ee557 100644 --- a/packages/cli/src/setup.ts +++ b/packages/cli/src/setup.ts @@ -378,9 +378,6 @@ export function formatKtxSetupStatus(status: KtxSetupStatus): string { status.agents.length > 0 ? ` (${status.agents.map((agent) => `${agent.target}:${agent.scope}`).join(', ')})` : '' }`, ]; - if (!status.context.ready && status.context.watchCommand && status.context.status === 'running') { - lines.push(`Resume: ${status.context.watchCommand}`); - } if (!status.context.ready && status.context.status === 'failed' && status.context.detail) { lines.push(`Retry: ${status.context.retryCommand ?? `ktx setup --project-dir ${status.project.path}`}`); } @@ -412,7 +409,7 @@ function setupContextReady(status: KtxSetupStatus): boolean { } function setupContextActive(status: KtxSetupStatus): boolean { - return status.context.status === 'running' || status.context.status === 'detached'; + return status.context.status === 'running'; } function writeContextNotReadyForAgents(projectDir: string, io: KtxCliIo): void {