mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-13 08:15:14 +02:00
fix: surface silent failures and drop unused dead-code paths (#193)
Address overengineering audit findings across cli/context/connector packages: - F1 Snowflake `query`: drop bare catch that flattened all errors to empty result - F2 memory-agent: treat LLM `stopReason === 'error'` as crash (skip squash-merge) - F3 WikiSearchTool: description honest about token-only fallback vs sqlite-fts5 hybrid - F5 Scan enrichment provider resolution: return discriminated status and surface distinct `llm_unavailable` / `embedding_unavailable` warnings per failure mode - F6 Relationship validation budget: drop dead `tableCount === undefined → 'all'` branch; update tests to pass `tableCount` like production - F8 `ktx sql`: use canonical `resolveOutputMode` (now honors KTX_OUTPUT/CI/TTY) - F9 MCP stdio server: default `protocolIo.stderr` to `process.stderr` so memory_ingest startup failures are visible - F13/F14 Scan/setup JSON readers: distinguish ENOENT from corruption instead of silently treating both as missing - F15 `createKtxCliScanConnector`: throw config-shape error when driver matches but type guard rejects, instead of "no native connector" - F16 ContextEvidenceSearchTool: surface `embedding_unhealthy:<reason>` instead of silently dropping the semantic lane - F17 PromptService: default partials to `[]` (removes stale `clinical_policy` reference from a prior product) - F20 `contextBuildCommands`: drop unused `runId` parameter Dead-code removal: - F4 Delete `AgentRunnerService` (duplicated `RuntimeAgentRunner`, only test-used); migrate tests to exercise `AiSdkKtxLlmRuntime.runAgentLoop` directly - F7 Delete `KtxScanOrchestrator` and its test (no production callers; the inline pipeline in `runLocalScan` is the single source of truth) - F18 Delete `generateKtxText`/`generateKtxObject` pass-through helpers; inline the single `runtime.generateObject` call at its caller Plus a clarifying comment on the SQLite `resolveStringReference` `file:` carve-out (load-bearing for SQLite URI form, not a bug).
This commit is contained in:
parent
7737ccaf1a
commit
0958bc03dc
27 changed files with 186 additions and 820 deletions
|
|
@ -125,7 +125,7 @@ async function pathExists(path: string): Promise<boolean> {
|
|||
}
|
||||
}
|
||||
|
||||
export function contextBuildCommands(projectDir: string, runId?: string): KtxSetupContextCommands {
|
||||
export function contextBuildCommands(projectDir: string): KtxSetupContextCommands {
|
||||
const resolvedProjectDir = resolve(projectDir);
|
||||
return {
|
||||
build: `ktx setup --project-dir ${resolvedProjectDir}`,
|
||||
|
|
@ -177,7 +177,7 @@ function normalizeState(projectDir: string, value: unknown): KtxSetupContextStat
|
|||
retryableFailedTargets: Array.isArray(record.retryableFailedTargets)
|
||||
? record.retryableFailedTargets.filter((item): item is string => typeof item === 'string')
|
||||
: [],
|
||||
commands: contextBuildCommands(projectDir, runId),
|
||||
commands: contextBuildCommands(projectDir),
|
||||
...(typeof record.failureReason === 'string' ? { failureReason: record.failureReason } : {}),
|
||||
...(normalizeSourceProgress(record.sourceProgress) ? { sourceProgress: normalizeSourceProgress(record.sourceProgress) } : {}),
|
||||
};
|
||||
|
|
@ -241,7 +241,7 @@ export async function writeKtxSetupContextState(projectDir: string, state: KtxSe
|
|||
await mkdir(join(resolvedProjectDir, '.ktx', 'setup'), { recursive: true });
|
||||
const normalized = normalizeState(resolvedProjectDir, {
|
||||
...state,
|
||||
commands: contextBuildCommands(resolvedProjectDir, state.runId),
|
||||
commands: contextBuildCommands(resolvedProjectDir),
|
||||
});
|
||||
await writeFile(statePath(resolvedProjectDir), `${JSON.stringify(normalized, null, 2)}\n`, 'utf-8');
|
||||
}
|
||||
|
|
@ -323,8 +323,11 @@ function stringArrayValue(value: unknown): string[] {
|
|||
async function readJsonFile(path: string): Promise<unknown | null> {
|
||||
try {
|
||||
return JSON.parse(await readFile(path, 'utf-8')) as unknown;
|
||||
} catch {
|
||||
return null;
|
||||
} catch (error) {
|
||||
if (error instanceof Error && (error as NodeJS.ErrnoException).code === 'ENOENT') {
|
||||
return null;
|
||||
}
|
||||
throw new Error(`Failed to read JSON file ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -549,7 +552,7 @@ async function runBuild(
|
|||
reportIds: [],
|
||||
artifactPaths: [],
|
||||
retryableFailedTargets: [],
|
||||
commands: contextBuildCommands(args.projectDir, runId),
|
||||
commands: contextBuildCommands(args.projectDir),
|
||||
failureReason: 'Previous foreground context build did not finish. Rerun setup or ktx ingest.',
|
||||
};
|
||||
await writeKtxSetupContextState(args.projectDir, incompleteState);
|
||||
|
|
@ -663,7 +666,7 @@ async function completeExistingContext(
|
|||
reportIds: [],
|
||||
artifactPaths: [],
|
||||
retryableFailedTargets: [],
|
||||
commands: contextBuildCommands(args.projectDir, runId),
|
||||
commands: contextBuildCommands(args.projectDir),
|
||||
});
|
||||
writeExistingContextSuccess(readiness, io);
|
||||
return { status: 'ready', projectDir: args.projectDir, runId };
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue