ktx/packages/context/src/scan/index.ts
Andrey Avtomonov eb375e22f8 fix: surface silent failures and drop unused dead-code paths
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).
2026-05-21 02:31:48 +02:00

409 lines
14 KiB
TypeScript

export {
REDACTED_KTX_CREDENTIAL_VALUE,
redactKtxCredentialEnvelope,
redactKtxCredentialValue,
redactKtxScanMetadata,
redactKtxScanReport,
redactKtxScanWarning,
} from './credentials.js';
export type {
KtxDataDictionaryColumnState,
KtxDataDictionarySampleDecision,
KtxDataDictionarySettings,
KtxDataDictionarySkipReason,
} from './data-dictionary.js';
export {
defaultKtxDataDictionarySettings,
isKtxDataDictionaryCandidate,
shouldKtxSampleColumnForDictionary,
} from './data-dictionary.js';
export type {
KtxColumnAnalysisResult,
KtxColumnDescriptionPromptInput,
KtxDataSourceDescriptionPromptInput,
KtxDescriptionCachePort,
KtxDescriptionColumn,
KtxDescriptionColumnTable,
KtxDescriptionGenerationSettings,
KtxDescriptionGeneratorOptions,
KtxDescriptionSamplingPort,
KtxDescriptionTableInput,
KtxGenerateColumnDescriptionsInput,
KtxGenerateDataSourceDescriptionInput,
KtxGenerateTableDescriptionInput,
KtxTableDescriptionPromptInput,
} from './description-generation.js';
export {
buildKtxColumnDescriptionPrompt,
buildKtxDataSourceDescriptionPrompt,
buildKtxTableDescriptionPrompt,
KtxDescriptionGenerator,
} from './description-generation.js';
export type { KtxColumnEmbeddingForeignKeys, KtxColumnEmbeddingTextInput } from './embedding-text.js';
export { buildKtxColumnEmbeddingText } from './embedding-text.js';
export type {
ComputeKtxScanEnrichmentInputHashInput,
KtxScanEnrichmentCompletedStage,
KtxScanEnrichmentFailedStage,
KtxScanEnrichmentStageLookup,
KtxScanEnrichmentStageRecord,
KtxScanEnrichmentStateStore,
} from './enrichment-state.js';
export {
completedKtxScanEnrichmentStateSummary,
computeKtxScanEnrichmentInputHash,
KTX_SCAN_ENRICHMENT_STAGES,
summarizeKtxScanEnrichmentState,
} from './enrichment-state.js';
export {
failedKtxScanEnrichmentSummary,
ktxScanErrorMessage,
skippedKtxScanEnrichmentSummary,
} from './enrichment-summary.js';
export type {
KtxEntityDetailsColumn,
KtxEntityDetailsErrorCode,
KtxEntityDetailsErrorResult,
KtxEntityDetailsInput,
KtxEntityDetailsRecord,
KtxEntityDetailsResponse,
KtxEntityDetailsSnapshotInfo,
KtxEntityDetailsTableInput,
} from './entity-details.js';
export { createKtxEntityDetailsService } from './entity-details.js';
export type {
DisplayTargetResolution,
RawSchemaHit,
TableDetail,
WarehouseCatalogServiceDeps,
} from './warehouse-catalog.js';
export { WarehouseCatalogService } from './warehouse-catalog.js';
export type {
KtxColumnSampleUpdate,
KtxDescriptionSource,
KtxDescriptionUpdate,
KtxEmbeddingUpdate,
KtxEnrichedColumn,
KtxEnrichedRelationship,
KtxEnrichedSchema,
KtxEnrichedTable,
KtxRelationshipEndpoint,
KtxRelationshipSource,
KtxRelationshipType,
KtxRelationshipUpdate,
KtxScanMetadataStore,
KtxSkippedRelationship,
KtxStructuralSyncPlan,
} from './enrichment-types.js';
export type {
KtxLocalScanEnrichmentInput,
KtxLocalScanEnrichmentProviders,
KtxLocalScanEnrichmentResult,
} from './local-enrichment.js';
export {
createDeterministicLocalScanEnrichmentProviders,
runLocalScanEnrichment,
snapshotToKtxEnrichedSchema,
} from './local-enrichment.js';
export type {
WriteLocalScanEnrichmentArtifactsInput,
WriteLocalScanEnrichmentArtifactsResult,
WriteLocalScanManifestShardsInput,
WriteLocalScanManifestShardsResult,
} from './local-enrichment-artifacts.js';
export {
writeLocalScanEnrichmentArtifacts,
writeLocalScanManifestShards,
} from './local-enrichment-artifacts.js';
export type {
LocalScanMcpOptions,
LocalScanRunResult,
LocalScanStatusResponse,
RunLocalScanOptions,
} from './local-scan.js';
export { filterSnapshotTables, getLocalScanReport, getLocalScanStatus, resolveEnabledTables, runLocalScan } from './local-scan.js';
export type { ReadLocalScanStructuralSnapshotInput } from './local-structural-artifacts.js';
export { readLocalScanStructuralSnapshot } from './local-structural-artifacts.js';
export type {
KtxRelationshipArtifactStatus,
ReadLocalScanRelationshipArtifactsResult,
} from './relationship-artifacts.js';
export { readLocalScanRelationshipArtifacts } from './relationship-artifacts.js';
export type {
KtxRelationshipBenchmarkReport,
KtxRelationshipBenchmarkReportCase,
KtxRelationshipBenchmarkReportCaseStatus,
} from './relationship-benchmark-report.js';
export {
buildKtxRelationshipBenchmarkReport,
formatKtxRelationshipBenchmarkReportMarkdown,
} from './relationship-benchmark-report.js';
export type {
KtxRelationshipBenchmarkCaseResult,
KtxRelationshipBenchmarkDetectedLink,
KtxRelationshipBenchmarkDetectedPk,
KtxRelationshipBenchmarkDetector,
KtxRelationshipBenchmarkDetectorInput,
KtxRelationshipBenchmarkDetectorResult,
KtxRelationshipBenchmarkExpectedLink,
KtxRelationshipBenchmarkExpectedLinks,
KtxRelationshipBenchmarkExpectedPk,
KtxRelationshipBenchmarkFixture,
KtxRelationshipBenchmarkMetrics,
KtxRelationshipBenchmarkMode,
KtxRelationshipBenchmarkStatus,
KtxRelationshipBenchmarkSuiteResult,
KtxRelationshipBenchmarkTier,
} from './relationship-benchmarks.js';
export {
currentKtxRelationshipBenchmarkDetector,
ktxRelationshipBenchmarkDetectorWithLlm,
KTX_RELATIONSHIP_BENCHMARK_MODES,
KTX_RELATIONSHIP_BENCHMARK_TIERS,
loadKtxRelationshipBenchmarkFixture,
loadKtxRelationshipBenchmarkFixtures,
maskKtxRelationshipBenchmarkSnapshot,
runKtxRelationshipBenchmarkCase,
runKtxRelationshipBenchmarkSuite,
} from './relationship-benchmarks.js';
export type {
ApplyKtxRelationshipValidationBudgetInput,
KtxRelationshipBudgetedCandidate,
KtxRelationshipValidationBudget,
KtxRelationshipValidationBudgetResult,
} from './relationship-budget.js';
export {
applyKtxRelationshipValidationBudget,
defaultKtxRelationshipValidationBudget,
} from './relationship-budget.js';
export type {
KtxRelationshipDiscoveryCandidate,
KtxRelationshipDiscoveryCandidateEvidence,
KtxRelationshipDiscoveryCandidateOptions,
KtxRelationshipDiscoveryCandidateSource,
KtxRelationshipDiscoveryCandidateStatus,
KtxRelationshipInferredTargetPk,
} from './relationship-candidates.js';
export {
generateKtxRelationshipDiscoveryCandidates,
inferKtxRelationshipTargetPks,
mergeKtxRelationshipDiscoveryCandidates,
} from './relationship-candidates.js';
export type {
DiscoverKtxCompositeRelationshipsInput,
DiscoverKtxCompositeRelationshipsResult,
KtxCompositePrimaryKeyCandidate,
KtxCompositeRelationshipCandidate,
KtxCompositeRelationshipStatus,
KtxCompositeRelationshipTupleEndpoint,
KtxCompositeRelationshipValidationEvidence,
} from './relationship-composite-candidates.js';
export { discoverKtxCompositeRelationships } from './relationship-composite-candidates.js';
export type {
BuildKtxRelationshipArtifactsInput,
BuildKtxRelationshipDiagnosticsInput,
EmptyKtxRelationshipProfileArtifactInput,
KtxRelationshipArtifact,
KtxRelationshipArtifactEdge,
KtxRelationshipArtifactEndpoint,
KtxRelationshipDiagnosticsArtifact,
KtxRelationshipDiagnosticsSummary,
KtxRelationshipDiagnosticsThresholds,
KtxRelationshipDiagnosticsValidation,
} from './relationship-diagnostics.js';
export {
buildKtxRelationshipArtifacts,
buildKtxRelationshipDiagnostics,
emptyKtxRelationshipProfileArtifact,
} from './relationship-diagnostics.js';
export type {
BuildKtxRelationshipFeedbackCalibrationReportInput,
CalibrateLocalRelationshipFeedbackLabelsInput,
KtxRelationshipFeedbackCalibrationBucket,
KtxRelationshipFeedbackCalibrationLabel,
KtxRelationshipFeedbackCalibrationReport,
} from './relationship-feedback-calibration.js';
export {
buildKtxRelationshipFeedbackCalibrationReport,
calibrateLocalRelationshipFeedbackLabels,
formatKtxRelationshipFeedbackCalibrationMarkdown,
} from './relationship-feedback-calibration.js';
export type {
ExportLocalRelationshipFeedbackLabelsInput,
ExportLocalRelationshipFeedbackLabelsResult,
KtxRelationshipFeedbackDecisionFilter,
KtxRelationshipFeedbackExportWarning,
KtxRelationshipFeedbackLabel,
} from './relationship-feedback-export.js';
export {
exportLocalRelationshipFeedbackLabels,
formatKtxRelationshipFeedbackLabelsJsonl,
} from './relationship-feedback-export.js';
export {
collectKtxFormalMetadataRelationships,
type KtxFormalMetadataRelationshipCollection,
} from './relationship-formal-metadata.js';
export type {
KtxRelationshipGraphResolutionResult,
KtxRelationshipGraphResolverSettings,
KtxResolvedRelationshipDiscoveryCandidate,
KtxResolvedRelationshipGraphEvidence,
KtxResolvedRelationshipPk,
KtxResolvedRelationshipPkEvidence,
KtxResolvedRelationshipStatus,
ResolveKtxRelationshipGraphInput,
} from './relationship-graph-resolver.js';
export { resolveKtxRelationshipGraph } from './relationship-graph-resolver.js';
export type {
KtxRelationshipLlmProposalResult,
KtxRelationshipLlmProposalSettings,
ProposeKtxRelationshipCandidatesWithLlmInput,
} from './relationship-llm-proposal.js';
export { proposeKtxRelationshipCandidatesWithLlm } from './relationship-llm-proposal.js';
export type {
KtxRelationshipLocalityCandidateTable,
LocalKtxRelationshipCandidateTablesInput,
} from './relationship-locality.js';
export { localCandidateTables } from './relationship-locality.js';
export type {
KtxRelationshipNormalizedName,
KtxRelationshipTokenInput,
} from './relationship-name-similarity.js';
export {
normalizeKtxRelationshipName,
pluralizeKtxRelationshipToken,
singularizeKtxRelationshipToken,
tokenizeKtxRelationshipName,
tokenSimilarity,
} from './relationship-name-similarity.js';
export type {
DiscoverKtxRelationshipsInput,
DiscoverKtxRelationshipsResult,
} from './relationship-discovery.js';
export { discoverKtxRelationships } from './relationship-discovery.js';
export type {
KtxRelationshipColumnProfile,
KtxRelationshipProfileArtifact,
KtxRelationshipReadOnlyExecutor,
KtxRelationshipTableProfile,
ProfileKtxRelationshipSchemaInput,
} from './relationship-profiling.js';
export {
formatKtxRelationshipTableRef,
profileKtxRelationshipSchema,
quoteKtxRelationshipIdentifier,
} from './relationship-profiling.js';
export type {
AppliedRelationshipReviewDecision,
ApplyLocalScanRelationshipReviewDecisionsInput,
ApplyLocalScanRelationshipReviewDecisionsResult,
} from './relationship-review-apply.js';
export { applyLocalScanRelationshipReviewDecisions } from './relationship-review-apply.js';
export type {
KtxRelationshipReviewDecisionArtifact,
KtxRelationshipReviewDecisionEntry,
KtxRelationshipReviewDecisionValue,
WriteLocalScanRelationshipReviewDecisionInput,
WriteLocalScanRelationshipReviewDecisionResult,
} from './relationship-review-decisions.js';
export { writeLocalScanRelationshipReviewDecision } from './relationship-review-decisions.js';
export type {
KtxRelationshipFixtureOrigin,
KtxRelationshipScoreBreakdown,
KtxRelationshipScoreSignal,
KtxRelationshipScoreWeights,
KtxRelationshipScoringCalibrationObservation,
KtxRelationshipSignalVector,
} from './relationship-scoring.js';
export {
calibrateWeightsFromSyntheticFixtures,
defaultKtxRelationshipScoreWeights,
KTX_RELATIONSHIP_SCORE_SIGNAL_KEYS,
normalizeKtxRelationshipScoreWeights,
scoreKtxRelationshipCandidate,
} from './relationship-scoring.js';
export type {
AdviseLocalRelationshipFeedbackThresholdsInput,
BuildKtxRelationshipThresholdAdviceReportInput,
KtxRelationshipThresholdAdviceCandidate,
KtxRelationshipThresholdAdviceReport,
KtxRelationshipThresholdAdviceStatus,
} from './relationship-threshold-advice.js';
export {
adviseLocalRelationshipFeedbackThresholds,
buildKtxRelationshipThresholdAdviceReport,
formatKtxRelationshipThresholdAdviceMarkdown,
} from './relationship-threshold-advice.js';
export type {
KtxRelationshipValidationEvidence,
KtxRelationshipValidationSettings,
KtxValidatedRelationshipDiscoveryCandidate,
KtxValidatedRelationshipStatus,
ValidateKtxRelationshipDiscoveryCandidatesInput,
} from './relationship-validation.js';
export { validateKtxRelationshipDiscoveryCandidates } from './relationship-validation.js';
export type { SqliteLocalScanEnrichmentStateStoreOptions } from './sqlite-local-enrichment-state-store.js';
export { SqliteLocalScanEnrichmentStateStore } from './sqlite-local-enrichment-state-store.js';
export type { KtxColumnTypeMapping } from './type-normalization.js';
export {
inferKtxDimensionType,
ktxColumnTypeMappingFromNative,
normalizeKtxNativeType,
} from './type-normalization.js';
export type {
KtxColumnSampleInput,
KtxColumnSampleResult,
KtxColumnStatsInput,
KtxColumnStatsResult,
KtxConnectionDriver,
KtxConnectorCapabilities,
KtxCredentialEnvelope,
KtxCredentialEnvReference,
KtxCredentialFileReference,
KtxEmbeddingPort,
KtxEventPropertyDiscovery,
KtxEventPropertyDiscoveryInput,
KtxEventPropertyValuesInput,
KtxEventPropertyValuesResult,
KtxEventStreamDiscoveryPort,
KtxEventTypeDiscovery,
KtxEventTypeDiscoveryInput,
KtxNetworkEndpoint,
KtxNetworkTunnelPort,
KtxNetworkTunnelRequest,
KtxOptionalConnectorCapabilities,
KtxProgressPort,
KtxProgressUpdateOptions,
KtxQueryResult,
KtxReadOnlyQueryInput,
KtxResolvedCredentialEnvelope,
KtxConnectorTestResult,
KtxScanArtifactPaths,
KtxScanConnector,
KtxScanContext,
KtxScanDiffSummary,
KtxScanEnrichmentStage,
KtxScanEnrichmentStateSummary,
KtxScanEnrichmentSummary,
KtxScanInput,
KtxScanLoggerPort,
KtxScanMode,
KtxScanRelationshipSummary,
KtxScanReport,
KtxScanTrigger,
KtxScanWarning,
KtxScanWarningCode,
KtxSchemaColumn,
KtxSchemaDimensionType,
KtxSchemaForeignKey,
KtxSchemaScope,
KtxSchemaSnapshot,
KtxSchemaTable,
KtxSchemaTableKind,
KtxStructuralSyncStats,
KtxTableListEntry,
KtxTableRef,
KtxTableSampleInput,
KtxTableSampleResult,
} from './types.js';
export { createKtxConnectorCapabilities } from './types.js';