mcp-copilot-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +207 -0
  2. package/bin/mcp-copilot-cli.mjs +3 -0
  3. package/dist/src/app.d.ts +71 -0
  4. package/dist/src/app.js +303 -0
  5. package/dist/src/app.js.map +1 -0
  6. package/dist/src/cli/doctor.d.ts +2 -0
  7. package/dist/src/cli/doctor.js +99 -0
  8. package/dist/src/cli/doctor.js.map +1 -0
  9. package/dist/src/config/defaults.d.ts +3 -0
  10. package/dist/src/config/defaults.js +4 -0
  11. package/dist/src/config/defaults.js.map +1 -0
  12. package/dist/src/index.d.ts +2 -0
  13. package/dist/src/index.js +98 -0
  14. package/dist/src/index.js.map +1 -0
  15. package/dist/src/mcp/system-status.d.ts +19 -0
  16. package/dist/src/mcp/system-status.js +20 -0
  17. package/dist/src/mcp/system-status.js.map +1 -0
  18. package/dist/src/mcp/task-markdown.d.ts +3 -0
  19. package/dist/src/mcp/task-markdown.js +70 -0
  20. package/dist/src/mcp/task-markdown.js.map +1 -0
  21. package/dist/src/mcp/tool-banners.d.ts +4 -0
  22. package/dist/src/mcp/tool-banners.js +26 -0
  23. package/dist/src/mcp/tool-banners.js.map +1 -0
  24. package/dist/src/mcp/tool-definitions.d.ts +109 -0
  25. package/dist/src/mcp/tool-definitions.js +125 -0
  26. package/dist/src/mcp/tool-definitions.js.map +1 -0
  27. package/dist/src/services/copilot-runtime.d.ts +28 -0
  28. package/dist/src/services/copilot-runtime.js +194 -0
  29. package/dist/src/services/copilot-runtime.js.map +1 -0
  30. package/dist/src/services/output-log.d.ts +7 -0
  31. package/dist/src/services/output-log.js +59 -0
  32. package/dist/src/services/output-log.js.map +1 -0
  33. package/dist/src/services/profile-manager.d.ts +34 -0
  34. package/dist/src/services/profile-manager.js +113 -0
  35. package/dist/src/services/profile-manager.js.map +1 -0
  36. package/dist/src/services/question-registry.d.ts +29 -0
  37. package/dist/src/services/question-registry.js +115 -0
  38. package/dist/src/services/question-registry.js.map +1 -0
  39. package/dist/src/services/spawn-validation.d.ts +9 -0
  40. package/dist/src/services/spawn-validation.js +53 -0
  41. package/dist/src/services/spawn-validation.js.map +1 -0
  42. package/dist/src/services/task-manager.d.ts +34 -0
  43. package/dist/src/services/task-manager.js +107 -0
  44. package/dist/src/services/task-manager.js.map +1 -0
  45. package/dist/src/services/task-persistence.d.ts +20 -0
  46. package/dist/src/services/task-persistence.js +67 -0
  47. package/dist/src/services/task-persistence.js.map +1 -0
  48. package/dist/src/services/task-store.d.ts +12 -0
  49. package/dist/src/services/task-store.js +167 -0
  50. package/dist/src/services/task-store.js.map +1 -0
  51. package/dist/src/services/workspace-isolation.d.ts +13 -0
  52. package/dist/src/services/workspace-isolation.js +74 -0
  53. package/dist/src/services/workspace-isolation.js.map +1 -0
  54. package/dist/src/templates/agent-prompt.d.ts +6 -0
  55. package/dist/src/templates/agent-prompt.js +58 -0
  56. package/dist/src/templates/agent-prompt.js.map +1 -0
  57. package/dist/src/types/task.d.ts +79 -0
  58. package/dist/src/types/task.js +22 -0
  59. package/dist/src/types/task.js.map +1 -0
  60. package/package.json +63 -0
  61. package/src/app.ts +341 -0
  62. package/src/cli/doctor.ts +112 -0
  63. package/src/config/defaults.ts +3 -0
  64. package/src/index.ts +128 -0
  65. package/src/mcp/system-status.ts +41 -0
  66. package/src/mcp/task-markdown.ts +81 -0
  67. package/src/mcp/tool-banners.ts +32 -0
  68. package/src/mcp/tool-definitions.ts +151 -0
  69. package/src/services/copilot-runtime.ts +247 -0
  70. package/src/services/output-log.ts +68 -0
  71. package/src/services/profile-manager.ts +165 -0
  72. package/src/services/question-registry.ts +169 -0
  73. package/src/services/spawn-validation.ts +75 -0
  74. package/src/services/task-manager.ts +144 -0
  75. package/src/services/task-persistence.ts +100 -0
  76. package/src/services/task-store.ts +207 -0
  77. package/src/services/workspace-isolation.ts +100 -0
  78. package/src/templates/agent-prompt.ts +71 -0
  79. package/src/types/task.ts +95 -0
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+ import { execFile } from 'node:child_process';
3
+ import process from 'node:process';
4
+ import { promisify } from 'node:util';
5
+ import { CopilotClient } from '@github/copilot-sdk';
6
+ import { buildCopilotClientOptions } from '../services/copilot-runtime.js';
7
+ import { ProfileManager } from '../services/profile-manager.js';
8
+ const execFileAsync = promisify(execFile);
9
+ async function commandVersion(command, args = ['--version']) {
10
+ try {
11
+ const { stdout, stderr } = await execFileAsync(command, args, { encoding: 'utf8' });
12
+ return (stdout || stderr).trim() || null;
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ async function inspectProfiles() {
19
+ const profileManager = ProfileManager.fromEnvironment();
20
+ const profiles = profileManager.getProfiles();
21
+ return Promise.all(profiles.map(async (profile) => {
22
+ const client = new CopilotClient(buildCopilotClientOptions({ cwd: process.cwd(), profile }));
23
+ try {
24
+ await client.start();
25
+ const auth = await client.getAuthStatus();
26
+ const models = auth.isAuthenticated
27
+ ? await client.listModels().catch(() => [])
28
+ : [];
29
+ return {
30
+ id: profile.id,
31
+ configDir: profile.configDir,
32
+ authenticated: auth.isAuthenticated,
33
+ login: auth.login,
34
+ models: models.slice(0, 10).map((model) => model.id),
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ id: profile.id,
40
+ configDir: profile.configDir,
41
+ authenticated: false,
42
+ error: error instanceof Error ? error.message : String(error),
43
+ models: [],
44
+ };
45
+ }
46
+ finally {
47
+ await client.stop().catch(async () => {
48
+ await client.forceStop().catch(() => { });
49
+ });
50
+ }
51
+ }));
52
+ }
53
+ async function main() {
54
+ const json = process.argv.includes('--json');
55
+ const inspectedProfiles = await inspectProfiles();
56
+ const report = {
57
+ node: process.version,
58
+ copilot: await commandVersion('copilot'),
59
+ mcpc: await commandVersion('mcpc'),
60
+ cwd: process.cwd(),
61
+ copilotCliPath: buildCopilotClientOptions({
62
+ cwd: process.cwd(),
63
+ profile: {
64
+ id: 'doctor',
65
+ configDir: process.env.COPILOT_CONFIG_DIRS?.split(',')[0]?.trim() || `${process.env.HOME}/.copilot`,
66
+ failureCount: 0,
67
+ },
68
+ }).cliPath,
69
+ profiles: inspectedProfiles,
70
+ };
71
+ if (json) {
72
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
73
+ return;
74
+ }
75
+ process.stdout.write(`Node: ${report.node}\n`);
76
+ process.stdout.write(`Copilot CLI: ${report.copilot ?? 'not found'}\n`);
77
+ process.stdout.write(`Copilot CLI Path: ${report.copilotCliPath}\n`);
78
+ process.stdout.write(`mcpc: ${report.mcpc ?? 'not found'}\n`);
79
+ process.stdout.write(`cwd: ${report.cwd}\n`);
80
+ process.stdout.write('\nProfiles:\n');
81
+ for (const profile of report.profiles) {
82
+ process.stdout.write(`- ${profile.id} (${profile.configDir}) authenticated=${String(profile.authenticated)}`);
83
+ if ('login' in profile && profile.login) {
84
+ process.stdout.write(` login=${profile.login}`);
85
+ }
86
+ if ('error' in profile && profile.error) {
87
+ process.stdout.write(` error=${profile.error}`);
88
+ }
89
+ process.stdout.write('\n');
90
+ if (profile.models.length > 0) {
91
+ process.stdout.write(` models: ${profile.models.join(', ')}\n`);
92
+ }
93
+ }
94
+ }
95
+ main().catch((error) => {
96
+ console.error(error);
97
+ process.exit(1);
98
+ });
99
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_MODEL = "gpt-5.4";
2
+ export declare const DEFAULT_TIMEOUT_MS: number;
3
+ export declare const DEFAULT_ISOLATION_MODE = "isolated";
@@ -0,0 +1,4 @@
1
+ export const DEFAULT_MODEL = 'gpt-5.4';
2
+ export const DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;
3
+ export const DEFAULT_ISOLATION_MODE = 'isolated';
4
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { CancelTaskRequestSchema, CallToolRequestSchema, GetTaskPayloadRequestSchema, GetTaskRequestSchema, ListTasksRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { CopilotMcpApp } from './app.js';
7
+ const require = createRequire(import.meta.url);
8
+ const pkg = require('../package.json');
9
+ const app = new CopilotMcpApp();
10
+ const server = new Server({ name: 'mcp-copilot-cli', version: pkg.version }, {
11
+ capabilities: {
12
+ tools: {},
13
+ resources: {},
14
+ tasks: {
15
+ list: {},
16
+ cancel: {},
17
+ },
18
+ },
19
+ });
20
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
21
+ tools: app.listTools().map((tool) => ({
22
+ name: tool.name,
23
+ description: tool.description,
24
+ inputSchema: tool.inputSchema,
25
+ })),
26
+ }));
27
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
28
+ const tools = app.listTools();
29
+ const tool = tools.find((candidate) => candidate.name === request.params.name);
30
+ if (!tool) {
31
+ return {
32
+ content: [{ type: 'text', text: `Unknown tool: ${request.params.name}` }],
33
+ isError: true,
34
+ };
35
+ }
36
+ try {
37
+ const args = tool.validate(request.params.arguments ?? {});
38
+ switch (tool.name) {
39
+ case 'spawn-agent':
40
+ return { content: [{ type: 'text', text: await app.spawnAgent(args) }] };
41
+ case 'message-agent':
42
+ return { content: [{ type: 'text', text: await app.messageAgent(args) }] };
43
+ case 'cancel-agent':
44
+ return { content: [{ type: 'text', text: await app.cancelAgent(args) }] };
45
+ case 'answer-agent':
46
+ return { content: [{ type: 'text', text: await app.answerAgent(args) }] };
47
+ default:
48
+ return {
49
+ content: [{ type: 'text', text: `Unhandled tool: ${tool.name}` }],
50
+ isError: true,
51
+ };
52
+ }
53
+ }
54
+ catch (error) {
55
+ return {
56
+ content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }],
57
+ isError: true,
58
+ };
59
+ }
60
+ });
61
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
62
+ resources: app.listResources(),
63
+ }));
64
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
65
+ const resource = await app.readResource(request.params.uri);
66
+ return {
67
+ contents: [
68
+ {
69
+ uri: request.params.uri,
70
+ mimeType: resource.mimeType,
71
+ text: resource.text,
72
+ },
73
+ ],
74
+ };
75
+ });
76
+ server.setRequestHandler(ListTasksRequestSchema, async () => ({
77
+ tasks: app.listTaskSummaries(),
78
+ }));
79
+ server.setRequestHandler(GetTaskRequestSchema, async (request) => app.getTaskSummary(request.params.taskId));
80
+ server.setRequestHandler(GetTaskPayloadRequestSchema, async (request) => app.getTaskPayload(request.params.taskId));
81
+ server.setRequestHandler(CancelTaskRequestSchema, async (request) => app.cancelTaskById(request.params.taskId));
82
+ async function main() {
83
+ await app.initialize(process.cwd());
84
+ const transport = new StdioServerTransport();
85
+ await server.connect(transport);
86
+ process.stdin.resume();
87
+ const shutdown = async () => {
88
+ await app.shutdown().catch(() => { });
89
+ process.exit(0);
90
+ };
91
+ process.on('SIGINT', () => void shutdown());
92
+ process.on('SIGTERM', () => void shutdown());
93
+ }
94
+ main().catch((error) => {
95
+ console.error(error);
96
+ process.exit(1);
97
+ });
98
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { CopilotProfile } from '../services/profile-manager.js';
2
+ import type { TaskRecord } from '../types/task.js';
3
+ export interface SystemStatus {
4
+ tasks: {
5
+ total: number;
6
+ running: number;
7
+ waiting: number;
8
+ waitingAnswer: number;
9
+ terminal: number;
10
+ };
11
+ profiles: {
12
+ total: number;
13
+ coolingDown: number;
14
+ };
15
+ }
16
+ export declare function buildSystemStatus(input: {
17
+ tasks: TaskRecord[];
18
+ profiles: CopilotProfile[];
19
+ }): SystemStatus;
@@ -0,0 +1,20 @@
1
+ import { TaskStatus } from '../types/task.js';
2
+ export function buildSystemStatus(input) {
3
+ return {
4
+ tasks: {
5
+ total: input.tasks.length,
6
+ running: input.tasks.filter((task) => task.status === TaskStatus.RUNNING).length,
7
+ waiting: input.tasks.filter((task) => task.status === TaskStatus.WAITING).length,
8
+ waitingAnswer: input.tasks.filter((task) => task.status === TaskStatus.WAITING_ANSWER).length,
9
+ terminal: input.tasks.filter((task) => task.status === TaskStatus.COMPLETED ||
10
+ task.status === TaskStatus.FAILED ||
11
+ task.status === TaskStatus.CANCELLED ||
12
+ task.status === TaskStatus.TIMED_OUT).length,
13
+ },
14
+ profiles: {
15
+ total: input.profiles.length,
16
+ coolingDown: input.profiles.filter((profile) => profile.cooldownUntil !== undefined).length,
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=system-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-status.js","sourceRoot":"","sources":["../../../src/mcp/system-status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAgB9C,MAAM,UAAU,iBAAiB,CAAC,KAGjC;IACC,OAAO;QACL,KAAK,EAAE;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACzB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM;YAChF,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM;YAChF,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM;YAC7F,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACpC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,SAAS;gBACpC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;gBACjC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,SAAS;gBACpC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,SAAS,CACrC,CAAC,MAAM;SACT;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;YAC5B,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,MAAM;SAC5F;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type TaskRecord } from '../types/task.js';
2
+ export declare function renderTaskMarkdown(task: TaskRecord): string;
3
+ export declare function renderTaskListMarkdown(tasks: TaskRecord[]): string;
@@ -0,0 +1,70 @@
1
+ import { TaskStatus } from '../types/task.js';
2
+ function renderLogInstructions(task) {
3
+ if (!task.outputFilePath) {
4
+ return [];
5
+ }
6
+ return [
7
+ '## Read Logs',
8
+ '',
9
+ '```bash',
10
+ `cat -n ${task.outputFilePath}`,
11
+ '```',
12
+ '',
13
+ 'Use `cat -n` to read with line numbers, then on subsequent reads use `tail -n +<N>` to skip already-read lines.',
14
+ '',
15
+ ];
16
+ }
17
+ export function renderTaskMarkdown(task) {
18
+ const lines = [
19
+ `# Task: ${task.id}`,
20
+ '',
21
+ '| Field | Value |',
22
+ '|---|---|',
23
+ `| **Status** | \`${task.status}\` |`,
24
+ `| **Model** | \`${task.model}\` |`,
25
+ `| **Agent Type** | \`${task.agentType}\` |`,
26
+ `| **Started** | ${task.startTime} |`,
27
+ '',
28
+ ...renderLogInstructions(task),
29
+ ];
30
+ if (task.status === TaskStatus.RUNNING ||
31
+ task.status === TaskStatus.PENDING ||
32
+ task.status === TaskStatus.WAITING) {
33
+ lines.push('## What to do next', '');
34
+ lines.push('The agent is still working. If you need to wait, run `sleep 30` and then read this resource again.');
35
+ if (task.outputFilePath) {
36
+ lines.push(`For a quick progress check without reading the full resource, run \`wc -l ${task.outputFilePath}\` — a growing line count means the agent is still working.`);
37
+ }
38
+ lines.push('If the agent is still running after your first check, wait longer before checking again: `sleep 60`, then `sleep 90`, `sleep 120`, `sleep 150`, up to `sleep 180` max.');
39
+ lines.push('');
40
+ }
41
+ if (task.pendingQuestion) {
42
+ lines.push('## ACTION REQUIRED', '');
43
+ lines.push(`**Question:** ${task.pendingQuestion.question}`);
44
+ lines.push('');
45
+ }
46
+ if (task.output.length > 0) {
47
+ lines.push('## Recent Output', '', '```');
48
+ lines.push(...task.output.slice(-50));
49
+ lines.push('```');
50
+ }
51
+ return lines.join('\n');
52
+ }
53
+ export function renderTaskListMarkdown(tasks) {
54
+ const lines = [
55
+ `# Tasks (${tasks.length} total)`,
56
+ '',
57
+ '| ID | Status | Prompt |',
58
+ '|---|---|---|',
59
+ ...tasks.map((task) => `| ${task.id} | ${task.status} | ${task.prompt.slice(0, 40)} |`),
60
+ ];
61
+ const pending = tasks.filter((task) => task.status === TaskStatus.WAITING_ANSWER);
62
+ if (pending.length > 0) {
63
+ lines.push('', `## Pending Questions (${pending.length})`, '');
64
+ for (const task of pending) {
65
+ lines.push(`### ${task.id}`, '', `**Q:** ${task.pendingQuestion?.question ?? 'Pending answer required'}`, '');
66
+ }
67
+ }
68
+ return lines.join('\n');
69
+ }
70
+ //# sourceMappingURL=task-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-markdown.js","sourceRoot":"","sources":["../../../src/mcp/task-markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { QuestionRegistry } from '../services/question-registry.js';
2
+ import type { TaskManager } from '../services/task-manager.js';
3
+ export declare function buildMessageBanner(taskManager: TaskManager): string;
4
+ export declare function buildAnswerBanner(questionRegistry: QuestionRegistry): string;
@@ -0,0 +1,26 @@
1
+ import { TaskStatus } from '../types/task.js';
2
+ export function buildMessageBanner(taskManager) {
3
+ const tasks = taskManager.getAllTasks();
4
+ if (tasks.length === 0) {
5
+ return '';
6
+ }
7
+ const running = tasks.filter((task) => task.status === TaskStatus.RUNNING).length;
8
+ const waitingAnswer = tasks.filter((task) => task.status === TaskStatus.WAITING_ANSWER).length;
9
+ const recent = tasks.slice(-3).map((task) => `- ${task.id} [${task.status}]`).join('\n');
10
+ return ['---', `AGENT STATUS: ${running} running | ${waitingAnswer} needs answer`, recent, 'Read task:///all for full details.']
11
+ .filter(Boolean)
12
+ .join('\n');
13
+ }
14
+ export function buildAnswerBanner(questionRegistry) {
15
+ const pending = questionRegistry.getAllPendingQuestions();
16
+ if (pending.size === 0) {
17
+ return '';
18
+ }
19
+ return [
20
+ '---',
21
+ `ACTION REQUIRED — ${pending.size} task${pending.size > 1 ? 's' : ''} waiting for your answer:`,
22
+ ...[...pending.entries()].map(([taskId, question]) => `- ${taskId}: "${question.question}"`),
23
+ 'Use answer-agent { "task_id": "<id>", "answer": "<choice>" }',
24
+ ].join('\n');
25
+ }
26
+ //# sourceMappingURL=tool-banners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-banners.js","sourceRoot":"","sources":["../../../src/mcp/tool-banners.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,kBAAkB,CAAC,WAAwB;IACzD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAClF,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;IAC/F,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzF,OAAO,CAAC,KAAK,EAAE,iBAAiB,OAAO,cAAc,aAAa,eAAe,EAAE,MAAM,EAAE,oCAAoC,CAAC;SAC7H,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,gBAAkC;IAClE,MAAM,OAAO,GAAG,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;IAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,KAAK;QACL,qBAAqB,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,2BAA2B;QAC/F,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM,MAAM,QAAQ,CAAC,QAAQ,GAAG,CAAC;QAC5F,8DAA8D;KAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { z } from 'zod';
2
+ declare const spawnAgentSchema: z.ZodObject<{
3
+ prompt: z.ZodString;
4
+ agent_type: z.ZodEnum<["coder", "planner", "researcher", "tester", "general"]>;
5
+ context_files: z.ZodOptional<z.ZodArray<z.ZodObject<{
6
+ path: z.ZodString;
7
+ description: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ path: string;
10
+ description?: string | undefined;
11
+ }, {
12
+ path: string;
13
+ description?: string | undefined;
14
+ }>, "many">>;
15
+ model: z.ZodOptional<z.ZodString>;
16
+ cwd: z.ZodOptional<z.ZodString>;
17
+ timeout: z.ZodOptional<z.ZodNumber>;
18
+ depends_on: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
19
+ labels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
20
+ isolation_mode: z.ZodOptional<z.ZodEnum<["shared", "isolated"]>>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ prompt: string;
23
+ agent_type: "coder" | "planner" | "researcher" | "tester" | "general";
24
+ cwd?: string | undefined;
25
+ model?: string | undefined;
26
+ labels?: string[] | undefined;
27
+ context_files?: {
28
+ path: string;
29
+ description?: string | undefined;
30
+ }[] | undefined;
31
+ timeout?: number | undefined;
32
+ depends_on?: string[] | undefined;
33
+ isolation_mode?: "shared" | "isolated" | undefined;
34
+ }, {
35
+ prompt: string;
36
+ agent_type: "coder" | "planner" | "researcher" | "tester" | "general";
37
+ cwd?: string | undefined;
38
+ model?: string | undefined;
39
+ labels?: string[] | undefined;
40
+ context_files?: {
41
+ path: string;
42
+ description?: string | undefined;
43
+ }[] | undefined;
44
+ timeout?: number | undefined;
45
+ depends_on?: string[] | undefined;
46
+ isolation_mode?: "shared" | "isolated" | undefined;
47
+ }>;
48
+ declare const messageAgentSchema: z.ZodObject<{
49
+ task_id: z.ZodString;
50
+ message: z.ZodOptional<z.ZodString>;
51
+ timeout: z.ZodOptional<z.ZodNumber>;
52
+ cwd: z.ZodOptional<z.ZodString>;
53
+ }, "strip", z.ZodTypeAny, {
54
+ task_id: string;
55
+ cwd?: string | undefined;
56
+ message?: string | undefined;
57
+ timeout?: number | undefined;
58
+ }, {
59
+ task_id: string;
60
+ cwd?: string | undefined;
61
+ message?: string | undefined;
62
+ timeout?: number | undefined;
63
+ }>;
64
+ declare const cancelAgentSchema: z.ZodObject<{
65
+ task_id: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
66
+ clear: z.ZodOptional<z.ZodBoolean>;
67
+ confirm: z.ZodOptional<z.ZodBoolean>;
68
+ }, "strip", z.ZodTypeAny, {
69
+ task_id: string | string[];
70
+ clear?: boolean | undefined;
71
+ confirm?: boolean | undefined;
72
+ }, {
73
+ task_id: string | string[];
74
+ clear?: boolean | undefined;
75
+ confirm?: boolean | undefined;
76
+ }>;
77
+ declare const answerAgentSchema: z.ZodObject<{
78
+ task_id: z.ZodString;
79
+ answer: z.ZodOptional<z.ZodString>;
80
+ answers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
81
+ }, "strip", z.ZodTypeAny, {
82
+ task_id: string;
83
+ answer?: string | undefined;
84
+ answers?: Record<string, string> | undefined;
85
+ }, {
86
+ task_id: string;
87
+ answer?: string | undefined;
88
+ answers?: Record<string, string> | undefined;
89
+ }>;
90
+ export type SpawnAgentInput = z.infer<typeof spawnAgentSchema>;
91
+ export type MessageAgentInput = z.infer<typeof messageAgentSchema>;
92
+ export type CancelAgentInput = z.infer<typeof cancelAgentSchema>;
93
+ export type AnswerAgentInput = z.infer<typeof answerAgentSchema>;
94
+ export interface ToolDefinition {
95
+ name: string;
96
+ description: string;
97
+ inputSchema: {
98
+ type: 'object';
99
+ properties: Record<string, unknown>;
100
+ required?: string[];
101
+ };
102
+ validate: (input: unknown) => unknown;
103
+ }
104
+ export interface CreateToolDefinitionsInput {
105
+ messageBanner: string;
106
+ answerBanner: string;
107
+ }
108
+ export declare function createToolDefinitions(input: CreateToolDefinitionsInput): ToolDefinition[];
109
+ export {};
@@ -0,0 +1,125 @@
1
+ import { z } from 'zod';
2
+ const contextFileSchema = z.object({
3
+ path: z.string().min(1),
4
+ description: z.string().optional(),
5
+ });
6
+ const spawnAgentSchema = z.object({
7
+ prompt: z.string().min(1).max(100_000),
8
+ agent_type: z.enum(['coder', 'planner', 'researcher', 'tester', 'general']),
9
+ context_files: z.array(contextFileSchema).max(20).optional(),
10
+ model: z.string().optional(),
11
+ cwd: z.string().optional(),
12
+ timeout: z.number().int().positive().max(3_600_000).optional(),
13
+ depends_on: z.array(z.string().min(1)).max(50).optional(),
14
+ labels: z.array(z.string().min(1).max(50)).max(10).optional(),
15
+ isolation_mode: z.enum(['shared', 'isolated']).optional(),
16
+ });
17
+ const messageAgentSchema = z.object({
18
+ task_id: z.string().min(1),
19
+ message: z.string().optional(),
20
+ timeout: z.number().int().positive().max(3_600_000).optional(),
21
+ cwd: z.string().optional(),
22
+ });
23
+ const cancelAgentSchema = z.object({
24
+ task_id: z.union([z.string().min(1), z.array(z.string().min(1)).min(1).max(50)]),
25
+ clear: z.boolean().optional(),
26
+ confirm: z.boolean().optional(),
27
+ });
28
+ const answerAgentSchema = z.object({
29
+ task_id: z.string().min(1),
30
+ answer: z.string().min(1).optional(),
31
+ answers: z.record(z.string(), z.string().min(1)).optional(),
32
+ });
33
+ export function createToolDefinitions(input) {
34
+ return [
35
+ {
36
+ name: 'spawn-agent',
37
+ description: [
38
+ 'Launch a Copilot-backed task in the background.',
39
+ 'Use `task:///all` to monitor status and `task:///{id}` for live detail.',
40
+ ].join(' '),
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ prompt: { type: 'string', minLength: 1, maxLength: 100000 },
45
+ agent_type: { type: 'string', enum: ['coder', 'planner', 'researcher', 'tester', 'general'] },
46
+ context_files: {
47
+ type: 'array',
48
+ items: {
49
+ type: 'object',
50
+ properties: {
51
+ path: { type: 'string', minLength: 1 },
52
+ description: { type: 'string' },
53
+ },
54
+ required: ['path'],
55
+ },
56
+ maxItems: 20,
57
+ },
58
+ model: { type: 'string' },
59
+ cwd: { type: 'string' },
60
+ timeout: { type: 'integer', minimum: 1, maximum: 3600000 },
61
+ depends_on: { type: 'array', items: { type: 'string', minLength: 1 }, maxItems: 50 },
62
+ labels: { type: 'array', items: { type: 'string', minLength: 1, maxLength: 50 }, maxItems: 10 },
63
+ isolation_mode: { type: 'string', enum: ['shared', 'isolated'] },
64
+ },
65
+ required: ['prompt', 'agent_type'],
66
+ },
67
+ validate: (payload) => spawnAgentSchema.parse(payload),
68
+ },
69
+ {
70
+ name: 'message-agent',
71
+ description: [
72
+ 'Resume a terminal task with a follow-up message.',
73
+ input.messageBanner,
74
+ ].filter(Boolean).join('\n\n'),
75
+ inputSchema: {
76
+ type: 'object',
77
+ properties: {
78
+ task_id: { type: 'string', minLength: 1 },
79
+ message: { type: 'string' },
80
+ timeout: { type: 'integer', minimum: 1, maximum: 3600000 },
81
+ cwd: { type: 'string' },
82
+ },
83
+ required: ['task_id'],
84
+ },
85
+ validate: (payload) => messageAgentSchema.parse(payload),
86
+ },
87
+ {
88
+ name: 'cancel-agent',
89
+ description: 'Cancel one task, many tasks, or clear all tracked tasks.',
90
+ inputSchema: {
91
+ type: 'object',
92
+ properties: {
93
+ task_id: {
94
+ type: ['string', 'array'],
95
+ items: { type: 'string', minLength: 1 },
96
+ minItems: 1,
97
+ maxItems: 50,
98
+ },
99
+ clear: { type: 'boolean' },
100
+ confirm: { type: 'boolean' },
101
+ },
102
+ required: ['task_id'],
103
+ },
104
+ validate: (payload) => cancelAgentSchema.parse(payload),
105
+ },
106
+ {
107
+ name: 'answer-agent',
108
+ description: [
109
+ 'Answer a pending agent question and resume execution.',
110
+ input.answerBanner,
111
+ ].filter(Boolean).join('\n\n'),
112
+ inputSchema: {
113
+ type: 'object',
114
+ properties: {
115
+ task_id: { type: 'string', minLength: 1 },
116
+ answer: { type: 'string', minLength: 1 },
117
+ answers: { type: 'object', additionalProperties: { type: 'string', minLength: 1 } },
118
+ },
119
+ required: ['task_id'],
120
+ },
121
+ validate: (payload) => answerAgentSchema.parse(payload),
122
+ },
123
+ ];
124
+ }
125
+ //# sourceMappingURL=tool-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-definitions.js","sourceRoot":"","sources":["../../../src/mcp/tool-definitions.ts"],"names":[],"mappings":"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"}