mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-22 08:38:08 +02:00
* feat: add telemetry phase 1
* feat: add node telemetry event catalog
* feat: add telemetry event helpers
* feat: emit setup and connection telemetry
* feat: emit connection and stack telemetry
* feat: emit ingest and scan telemetry
* feat: emit query telemetry
* feat: emit sampled mcp telemetry
* docs: expand telemetry event catalog
* feat: add telemetry schema sync artifact
* feat: pass telemetry project id to semantic daemon
* feat: add daemon telemetry foundation
* feat: emit semantic daemon telemetry
* feat: emit daemon lifecycle telemetry
* docs: document full telemetry event catalog
* feat(telemetry): dim first-run notice
* feat(telemetry): show first-run notice before command output
* feat(telemetry): wire ktx PostHog project for live ingestion
* docs(telemetry): drop posthog project name and host from storage section
* docs(telemetry): trim to general overview and disclaimer
* docs(agents): add short telemetry guidelines
* feat(telemetry): enable posthog geoip enrichment
* docs(telemetry): drop ip-geoip note from public overview
* refactor(telemetry): drop no-op groupIdentify, rely on capture groups field
* fix(telemetry): respect CI kill switch in python daemon identity
* fix(sql): route table-count analysis to existing analyze-batch endpoint
* fix(telemetry): emit install_first_run from notice path and derive flagsPresent from commander
* fix(telemetry): read package info via getKtxCliPackageInfo to satisfy boundary check
* fix(telemetry): make python identity env={} bypass os.environ and unset CI in tests
* fix(telemetry): unset CI kill switch in cli-program-telemetry tests
83 lines
3 KiB
TypeScript
83 lines
3 KiB
TypeScript
import { KtxIngestEmbeddingPortAdapter } from './context/llm/embedding-port.js';
|
|
import { createDefaultKtxMcpServer } from './context/mcp/server.js';
|
|
import { createLocalProjectMcpContextPorts } from './context/mcp/local-project-ports.js';
|
|
import { createLocalProjectMemoryIngest } from './context/memory/local-memory.js';
|
|
import type { KtxLocalProject } from './context/project/project.js';
|
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
import type { KtxCliIo } from './cli-runtime.js';
|
|
import { resolveProjectEmbeddingProvider } from './embedding-resolution.js';
|
|
import { createKtxCliIngestQueryExecutor } from './ingest-query-executor.js';
|
|
import { createKtxCliScanConnector } from './local-scan-connectors.js';
|
|
import { createManagedPythonSemanticLayerComputePort } from './managed-python-command.js';
|
|
import { createManagedDaemonSqlAnalysisPort } from './managed-python-http.js';
|
|
|
|
function noopMcpIo(): KtxCliIo {
|
|
return {
|
|
stdout: { write() {} },
|
|
stderr: { write() {} },
|
|
};
|
|
}
|
|
|
|
export async function createKtxMcpServerFactory(input: {
|
|
project: KtxLocalProject;
|
|
projectDir: string;
|
|
cliVersion: string;
|
|
io?: KtxCliIo;
|
|
}): Promise<() => McpServer> {
|
|
const io = input.io ?? noopMcpIo();
|
|
const queryExecutor = createKtxCliIngestQueryExecutor(input.project);
|
|
const semanticLayerCompute = await createManagedPythonSemanticLayerComputePort({
|
|
cliVersion: input.cliVersion,
|
|
installPolicy: 'auto',
|
|
io,
|
|
});
|
|
const sqlAnalysis = createManagedDaemonSqlAnalysisPort({
|
|
cliVersion: input.cliVersion,
|
|
projectDir: input.projectDir,
|
|
installPolicy: 'auto',
|
|
io,
|
|
});
|
|
const resolution = await resolveProjectEmbeddingProvider(input.project, {
|
|
mode: 'use-if-running',
|
|
cliVersion: input.cliVersion,
|
|
io,
|
|
});
|
|
const embeddingProvider =
|
|
resolution.kind === 'configured' || resolution.kind === 'managed-running' || resolution.kind === 'managed-started'
|
|
? resolution.provider
|
|
: null;
|
|
const embeddingService = embeddingProvider ? new KtxIngestEmbeddingPortAdapter(embeddingProvider) : null;
|
|
const contextTools = createLocalProjectMcpContextPorts(input.project, {
|
|
semanticLayerCompute,
|
|
queryExecutor,
|
|
sqlAnalysis,
|
|
embeddingService,
|
|
localScan: {
|
|
createConnector: async (connectionId) => createKtxCliScanConnector(input.project, connectionId),
|
|
},
|
|
});
|
|
|
|
let memoryIngest: ReturnType<typeof createLocalProjectMemoryIngest> | undefined;
|
|
try {
|
|
memoryIngest = createLocalProjectMemoryIngest(input.project, {
|
|
semanticLayerCompute,
|
|
queryExecutor,
|
|
embeddingProvider,
|
|
});
|
|
} catch (error) {
|
|
io.stderr.write(`KTX MCP memory_ingest disabled: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
}
|
|
|
|
return () =>
|
|
createDefaultKtxMcpServer({
|
|
name: 'ktx',
|
|
version: input.cliVersion,
|
|
userContext: { userId: 'local' },
|
|
projectDir: input.projectDir,
|
|
io,
|
|
contextTools: {
|
|
...contextTools,
|
|
...(memoryIngest ? { memoryIngest } : {}),
|
|
},
|
|
});
|
|
}
|