[SEP-2663] refactor!: remove 2025-11 experimental tasks (#2128)
This commit is contained in:
parent
600ba75f34
commit
c8d7401b46
3 changed files with 423 additions and 18280 deletions
|
|
@ -85,18 +85,6 @@ describe('context-types transform', () => {
|
|||
expect(result).toContain('ctx.http?.authInfo');
|
||||
});
|
||||
|
||||
it('rewrites extra.taskStore to ctx.task?.store', () => {
|
||||
const input = [
|
||||
`server.setRequestHandler('tools/call', async (request, extra) => {`,
|
||||
` const store = extra.taskStore;`,
|
||||
` return { content: [] };`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).toContain('ctx.task?.store');
|
||||
});
|
||||
|
||||
it('does not touch non-extra parameters', () => {
|
||||
const input = [
|
||||
`server.setRequestHandler('tools/call', async (request, context) => {`,
|
||||
|
|
@ -304,53 +292,6 @@ describe('context-types transform', () => {
|
|||
expect(sourceFile.getFullText()).toContain('extra');
|
||||
});
|
||||
|
||||
it('renames extra to ctx and remaps properties in registerToolTask handler object', () => {
|
||||
const input = [
|
||||
`server.experimental.tasks.registerToolTask('my-task', { schema: {} }, {`,
|
||||
` createTask: async (args, extra) => {`,
|
||||
` const s = extra.signal;`,
|
||||
` const store = extra.taskStore;`,
|
||||
` return { content: [] };`,
|
||||
` },`,
|
||||
` getTask: async (args, extra) => {`,
|
||||
` const auth = extra.authInfo;`,
|
||||
` return { content: [] };`,
|
||||
` },`,
|
||||
` getTaskResult: async (args, extra) => {`,
|
||||
` await extra.sendNotification({ method: 'test', params: {} });`,
|
||||
` return { content: [] };`,
|
||||
` },`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).not.toContain('extra');
|
||||
expect(result).toContain('(args, ctx)');
|
||||
expect(result).toContain('ctx.mcpReq.signal');
|
||||
expect(result).toContain('ctx.task?.store');
|
||||
expect(result).toContain('ctx.http?.authInfo');
|
||||
expect(result).toContain('ctx.mcpReq.notify(');
|
||||
});
|
||||
|
||||
it('handles registerToolTask with shorthand method syntax', () => {
|
||||
const input = [
|
||||
`server.registerToolTask('my-task', {}, {`,
|
||||
` async createTask(args, extra) {`,
|
||||
` const s = extra.signal;`,
|
||||
` return { content: [] };`,
|
||||
` },`,
|
||||
` async getTask(args, extra) {`,
|
||||
` return { content: [] };`,
|
||||
` },`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).not.toContain('extra');
|
||||
expect(result).toContain('(args, ctx)');
|
||||
expect(result).toContain('ctx.mcpReq.signal');
|
||||
});
|
||||
|
||||
it('does not rename "extra" inside string literals', () => {
|
||||
const input = [
|
||||
`server.setRequestHandler('tools/call', async (request, extra) => {`,
|
||||
|
|
|
|||
|
|
@ -192,69 +192,6 @@ describe('handler-registration transform', () => {
|
|||
expect(result.diagnostics[0]!.message).toContain('CustomNotification');
|
||||
});
|
||||
|
||||
it('replaces ListTasksRequestSchema with method string', () => {
|
||||
const input = [
|
||||
`import { ListTasksRequestSchema } from '@modelcontextprotocol/sdk/types.js';`,
|
||||
`client.setRequestHandler(ListTasksRequestSchema, async (request) => {`,
|
||||
` return { tasks: [] };`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).toContain("setRequestHandler('tasks/list'");
|
||||
expect(result).not.toContain('ListTasksRequestSchema');
|
||||
});
|
||||
|
||||
it('replaces GetTaskRequestSchema with method string', () => {
|
||||
const input = [
|
||||
`import { GetTaskRequestSchema } from '@modelcontextprotocol/sdk/types.js';`,
|
||||
`client.setRequestHandler(GetTaskRequestSchema, async (request) => {`,
|
||||
` return { taskId: '1', status: 'completed' };`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).toContain("setRequestHandler('tasks/get'");
|
||||
expect(result).not.toContain('GetTaskRequestSchema');
|
||||
});
|
||||
|
||||
it('replaces CancelTaskRequestSchema with method string', () => {
|
||||
const input = [
|
||||
`import { CancelTaskRequestSchema } from '@modelcontextprotocol/sdk/types.js';`,
|
||||
`client.setRequestHandler(CancelTaskRequestSchema, async (request) => {`,
|
||||
` return {};`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).toContain("setRequestHandler('tasks/cancel'");
|
||||
expect(result).not.toContain('CancelTaskRequestSchema');
|
||||
});
|
||||
|
||||
it('replaces GetTaskPayloadRequestSchema with method string', () => {
|
||||
const input = [
|
||||
`import { GetTaskPayloadRequestSchema } from '@modelcontextprotocol/sdk/types.js';`,
|
||||
`client.setRequestHandler(GetTaskPayloadRequestSchema, async (request) => {`,
|
||||
` return { content: [] };`,
|
||||
`});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).toContain("setRequestHandler('tasks/result'");
|
||||
expect(result).not.toContain('GetTaskPayloadRequestSchema');
|
||||
});
|
||||
|
||||
it('replaces TaskStatusNotificationSchema with method string', () => {
|
||||
const input = [
|
||||
`import { TaskStatusNotificationSchema } from '@modelcontextprotocol/sdk/types.js';`,
|
||||
`client.setNotificationHandler(TaskStatusNotificationSchema, async () => {});`,
|
||||
''
|
||||
].join('\n');
|
||||
const result = applyTransform(input);
|
||||
expect(result).toContain("setNotificationHandler('notifications/tasks/status'");
|
||||
expect(result).not.toContain('TaskStatusNotificationSchema');
|
||||
});
|
||||
|
||||
it('replaces ElicitationCompleteNotificationSchema with method string', () => {
|
||||
const input = [
|
||||
`import { ElicitationCompleteNotificationSchema } from '@modelcontextprotocol/sdk/types.js';`,
|
||||
|
|
|
|||
|
|
@ -307,77 +307,4 @@ describe('mcp-server-api transform', () => {
|
|||
expect(result).toContain('registerTool("ping", {}');
|
||||
expect(result).not.toContain('z.object');
|
||||
});
|
||||
|
||||
it('moves taskStore from top-level options into capabilities.tasks', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { taskStore, capabilities: { tasks: { list: {} } } });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
const result = mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const text = sourceFile.getFullText();
|
||||
expect(text).not.toMatch(/,\s*taskStore\s*,\s*capabilities/);
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskStore/);
|
||||
expect(result.changesCount).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('moves taskMessageQueue from top-level options into capabilities.tasks', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { taskMessageQueue, capabilities: { tasks: { list: {} } } });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
const result = mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const text = sourceFile.getFullText();
|
||||
expect(text).not.toMatch(/,\s*taskMessageQueue\s*,\s*capabilities/);
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskMessageQueue/);
|
||||
expect(result.changesCount).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('moves both taskStore and taskMessageQueue into capabilities.tasks', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { taskStore, taskMessageQueue, capabilities: { tasks: {} } });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const text = sourceFile.getFullText();
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskStore/);
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskMessageQueue/);
|
||||
});
|
||||
|
||||
it('moves both task props with complex values without corrupting output', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { taskStore: createStore(a, b), taskMessageQueue: new Queue({ size: 10 }), capabilities: { tasks: {} } });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const text = sourceFile.getFullText();
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskStore:\s*createStore\(a, b\)/);
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskMessageQueue:\s*new Queue\(\{\s*size:\s*10\s*\}\)/);
|
||||
expect(text).toContain('capabilities');
|
||||
});
|
||||
|
||||
it('emits warning when capabilities.tasks object is missing', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { taskStore, capabilities: {} });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
const result = mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const taskWarnings = result.diagnostics.filter(d => d.message.includes('taskStore'));
|
||||
expect(taskWarnings.length).toBe(1);
|
||||
expect(taskWarnings[0]!.message).toContain('capabilities.tasks');
|
||||
});
|
||||
|
||||
it('does not touch constructor without taskStore or taskMessageQueue', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { capabilities: {} });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
const result = mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const taskWarnings = result.diagnostics.filter(d => d.message.includes('taskStore') || d.message.includes('taskMessageQueue'));
|
||||
expect(taskWarnings.length).toBe(0);
|
||||
});
|
||||
|
||||
it('moves taskStore with complex value expression (nested braces/commas)', () => {
|
||||
const input = `const server = new McpServer({ name: "test", version: "1.0" }, { taskStore: new InMemoryTaskStore({ ttl: 5000 }), capabilities: { tasks: { list: {} } } });\n`;
|
||||
const project = new Project({ useInMemoryFileSystem: true });
|
||||
const sourceFile = project.createSourceFile('test.ts', MCP_IMPORT + input);
|
||||
const result = mcpServerApiTransform.apply(sourceFile, ctx);
|
||||
const text = sourceFile.getFullText();
|
||||
expect(text).toMatch(/tasks:\s*\{[\s\S]*taskStore:\s*new InMemoryTaskStore\(\{\s*ttl:\s*5000\s*\}\)/);
|
||||
expect(text).not.toMatch(/,\s*taskStore.*capabilities/);
|
||||
expect(result.changesCount).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue