diff --git a/packages/context/src/ingest/local-ingest.ts b/packages/context/src/ingest/local-ingest.ts index c4086f4c..bc6294c4 100644 --- a/packages/context/src/ingest/local-ingest.ts +++ b/packages/context/src/ingest/local-ingest.ts @@ -41,10 +41,17 @@ export interface RunLocalIngestOptions { export interface LocalIngestMcpOptions extends Pick< RunLocalIngestOptions, - 'agentRunner' | 'llmProvider' | 'memoryModel' | 'semanticLayerCompute' | 'queryExecutor' | 'logger' -> { + | 'agentRunner' + | 'llmProvider' + | 'memoryModel' + | 'semanticLayerCompute' + | 'queryExecutor' + | 'logger' + | 'pullConfigOptions' + > { adapters?: SourceAdapter[]; jobIdFactory?: () => string; + runLocalIngest?: (options: RunLocalIngestOptions) => Promise; runLocalMetabaseIngest?: (options: RunLocalMetabaseIngestOptions) => Promise; } diff --git a/packages/context/src/mcp/local-project-ports.test.ts b/packages/context/src/mcp/local-project-ports.test.ts index b4534f56..bd81b677 100644 --- a/packages/context/src/mcp/local-project-ports.test.ts +++ b/packages/context/src/mcp/local-project-ports.test.ts @@ -845,6 +845,63 @@ describe('createLocalProjectMcpContextPorts', () => { expect(agentRunner.runLoop).toHaveBeenCalledTimes(1); }); + it('passes local ingest pull-config options into runLocalIngest', async () => { + const project = await initKtxProject({ projectDir: tempDir, projectName: 'warehouse' }); + project.config.connections.warehouse = { driver: 'postgres' }; + project.config.ingest.adapters = ['looker']; + const runLocalIngest = vi.fn(async () => ({ + result: { ok: true }, + report: { + id: 'report-1', + runId: 'run-1', + jobId: 'job-1', + sourceKey: 'looker', + connectionId: 'warehouse', + body: { + syncId: 'sync-1', + workUnits: [], + failedWorkUnits: [], + diffSummary: { added: 0, modified: 0, deleted: 0, unchanged: 0 }, + provenanceRows: [], + }, + }, + }) as never); + const ports = createLocalProjectMcpContextPorts(project, { + localIngest: { + adapters: [{ source: 'looker', skillNames: [] }], + pullConfigOptions: { + looker: { + daemonBaseUrl: 'http://127.0.0.1:61234', + }, + }, + runLocalIngest, + }, + }); + + await expect( + ports.ingest?.trigger({ + adapter: 'looker', + connectionId: 'warehouse', + trigger: 'manual_resync', + config: {}, + }), + ).resolves.toMatchObject({ + runId: 'run-1', + jobId: 'job-1', + reportId: 'report-1', + }); + + expect(runLocalIngest).toHaveBeenCalledWith( + expect.objectContaining({ + pullConfigOptions: { + looker: { + daemonBaseUrl: 'http://127.0.0.1:61234', + }, + }, + }), + ); + }); + it('triggers fetch-capable local ingest without sourceDir config', async () => { const project = await initKtxProject({ projectDir: tempDir, projectName: 'warehouse' }); project.config.connections.warehouse = { diff --git a/packages/context/src/mcp/local-project-ports.ts b/packages/context/src/mcp/local-project-ports.ts index 60808426..8fcde94b 100644 --- a/packages/context/src/mcp/local-project-ports.ts +++ b/packages/context/src/mcp/local-project-ports.ts @@ -587,6 +587,7 @@ export function createLocalProjectMcpContextPorts( metabaseConnectionId: input.connectionId, trigger: input.trigger, jobIdFactory: options.localIngest?.jobIdFactory, + pullConfigOptions: options.localIngest?.pullConfigOptions, agentRunner: options.localIngest?.agentRunner, llmProvider: options.localIngest?.llmProvider, memoryModel: options.localIngest?.memoryModel, @@ -611,12 +612,14 @@ export function createLocalProjectMcpContextPorts( }; } - const result = await runLocalIngest({ + const executeLocalIngest = options.localIngest?.runLocalIngest ?? runLocalIngest; + const result = await executeLocalIngest({ project, adapters: options.localIngest?.adapters ?? createDefaultLocalIngestAdapters(project), adapter: input.adapter, connectionId: input.connectionId, sourceDir, + pullConfigOptions: options.localIngest?.pullConfigOptions, trigger: input.trigger, jobId: options.localIngest?.jobIdFactory?.(), agentRunner: options.localIngest?.agentRunner,