paean 0.1.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +296 -0
  3. package/dist/api/auth.d.ts +71 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +257 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/client.d.ts +37 -0
  8. package/dist/api/client.d.ts.map +1 -0
  9. package/dist/api/client.js +101 -0
  10. package/dist/api/client.js.map +1 -0
  11. package/dist/api/todo.d.ts +167 -0
  12. package/dist/api/todo.d.ts.map +1 -0
  13. package/dist/api/todo.js +137 -0
  14. package/dist/api/todo.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +36 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/commands/context.d.ts +7 -0
  20. package/dist/commands/context.d.ts.map +1 -0
  21. package/dist/commands/context.js +155 -0
  22. package/dist/commands/context.js.map +1 -0
  23. package/dist/commands/login.d.ts +7 -0
  24. package/dist/commands/login.d.ts.map +1 -0
  25. package/dist/commands/login.js +108 -0
  26. package/dist/commands/login.js.map +1 -0
  27. package/dist/commands/logout.d.ts +7 -0
  28. package/dist/commands/logout.d.ts.map +1 -0
  29. package/dist/commands/logout.js +27 -0
  30. package/dist/commands/logout.js.map +1 -0
  31. package/dist/commands/serve.d.ts +7 -0
  32. package/dist/commands/serve.d.ts.map +1 -0
  33. package/dist/commands/serve.js +29 -0
  34. package/dist/commands/serve.js.map +1 -0
  35. package/dist/commands/tasks.d.ts +7 -0
  36. package/dist/commands/tasks.d.ts.map +1 -0
  37. package/dist/commands/tasks.js +276 -0
  38. package/dist/commands/tasks.js.map +1 -0
  39. package/dist/commands/validate.d.ts +7 -0
  40. package/dist/commands/validate.d.ts.map +1 -0
  41. package/dist/commands/validate.js +123 -0
  42. package/dist/commands/validate.js.map +1 -0
  43. package/dist/index.d.ts +13 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +19 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mcp/resources.d.ts +14 -0
  48. package/dist/mcp/resources.d.ts.map +1 -0
  49. package/dist/mcp/resources.js +166 -0
  50. package/dist/mcp/resources.js.map +1 -0
  51. package/dist/mcp/server.d.ts +12 -0
  52. package/dist/mcp/server.d.ts.map +1 -0
  53. package/dist/mcp/server.js +82 -0
  54. package/dist/mcp/server.js.map +1 -0
  55. package/dist/mcp/tools.d.ts +14 -0
  56. package/dist/mcp/tools.d.ts.map +1 -0
  57. package/dist/mcp/tools.js +341 -0
  58. package/dist/mcp/tools.js.map +1 -0
  59. package/dist/utils/config.d.ts +69 -0
  60. package/dist/utils/config.d.ts.map +1 -0
  61. package/dist/utils/config.js +129 -0
  62. package/dist/utils/config.js.map +1 -0
  63. package/dist/utils/output.d.ts +79 -0
  64. package/dist/utils/output.d.ts.map +1 -0
  65. package/dist/utils/output.js +157 -0
  66. package/dist/utils/output.js.map +1 -0
  67. package/dist/utils/project.d.ts +29 -0
  68. package/dist/utils/project.d.ts.map +1 -0
  69. package/dist/utils/project.js +135 -0
  70. package/dist/utils/project.js.map +1 -0
  71. package/package.json +72 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * MCP Resources
3
+ * Define resources that AI agents can read
4
+ */
5
+ import { getTodoList, getPendingChanges } from '../api/todo.js';
6
+ import { detectProject, getProjectId } from '../utils/project.js';
7
+ import { getConfigValue } from '../utils/config.js';
8
+ /**
9
+ * Get available MCP resources
10
+ */
11
+ export async function getMcpResources() {
12
+ const project = detectProject();
13
+ return [
14
+ {
15
+ uri: 'paean://tasks/pending',
16
+ name: 'Pending Tasks',
17
+ description: `Current pending tasks for ${project.name}`,
18
+ mimeType: 'application/json',
19
+ },
20
+ {
21
+ uri: 'paean://tasks/completed',
22
+ name: 'Completed Tasks',
23
+ description: 'Recently completed tasks',
24
+ mimeType: 'application/json',
25
+ },
26
+ {
27
+ uri: 'paean://tasks/all',
28
+ name: 'All Tasks',
29
+ description: 'All tasks with full details',
30
+ mimeType: 'application/json',
31
+ },
32
+ {
33
+ uri: 'paean://context',
34
+ name: 'Project Context',
35
+ description: 'Full project context including tasks and metadata',
36
+ mimeType: 'application/json',
37
+ },
38
+ {
39
+ uri: 'paean://pending-changes',
40
+ name: 'Pending Changes',
41
+ description: 'AI-suggested task changes awaiting review',
42
+ mimeType: 'application/json',
43
+ },
44
+ ];
45
+ }
46
+ /**
47
+ * Read a specific MCP resource
48
+ */
49
+ export async function readMcpResource(uri) {
50
+ const project = detectProject();
51
+ const projectId = getProjectId(project);
52
+ switch (uri) {
53
+ case 'paean://tasks/pending': {
54
+ const response = await getTodoList();
55
+ const pendingTasks = response.data.items.filter((t) => t.status === 'pending' || t.status === 'in_progress');
56
+ return {
57
+ project: project.name,
58
+ projectId,
59
+ tasks: pendingTasks.map((t) => ({
60
+ id: t.id,
61
+ content: t.content,
62
+ priority: t.priority,
63
+ status: t.status,
64
+ tags: t.tags,
65
+ dueDate: t.dueDate,
66
+ createdAt: t.createdAt,
67
+ })),
68
+ count: pendingTasks.length,
69
+ retrievedAt: new Date().toISOString(),
70
+ };
71
+ }
72
+ case 'paean://tasks/completed': {
73
+ const response = await getTodoList({ status: 'completed' });
74
+ const completedTasks = response.data.items.slice(0, 10); // Last 10 completed
75
+ return {
76
+ project: project.name,
77
+ projectId,
78
+ tasks: completedTasks.map((t) => ({
79
+ id: t.id,
80
+ content: t.content,
81
+ priority: t.priority,
82
+ completedAt: t.updatedAt,
83
+ })),
84
+ count: completedTasks.length,
85
+ retrievedAt: new Date().toISOString(),
86
+ };
87
+ }
88
+ case 'paean://tasks/all': {
89
+ const response = await getTodoList();
90
+ return {
91
+ project: project.name,
92
+ projectId,
93
+ tasks: response.data.items,
94
+ stats: response.data.stats,
95
+ retrievedAt: new Date().toISOString(),
96
+ };
97
+ }
98
+ case 'paean://context': {
99
+ const todoResponse = await getTodoList();
100
+ const pendingChanges = await getPendingChanges();
101
+ const pendingTasks = todoResponse.data.items.filter((t) => t.status === 'pending' || t.status === 'in_progress');
102
+ const recentCompleted = todoResponse.data.items
103
+ .filter((t) => t.status === 'completed')
104
+ .slice(0, 5);
105
+ return {
106
+ project: {
107
+ name: project.name,
108
+ type: project.type,
109
+ path: project.path,
110
+ id: projectId,
111
+ gitBranch: project.gitBranch,
112
+ },
113
+ user: {
114
+ email: getConfigValue('email'),
115
+ },
116
+ tasks: {
117
+ pending: pendingTasks.map((t) => ({
118
+ id: t.id,
119
+ content: t.content,
120
+ priority: t.priority,
121
+ status: t.status,
122
+ tags: t.tags,
123
+ dueDate: t.dueDate,
124
+ sourceContext: t.sourceContext,
125
+ })),
126
+ recentlyCompleted: recentCompleted.map((t) => ({
127
+ id: t.id,
128
+ content: t.content,
129
+ completedAt: t.updatedAt,
130
+ })),
131
+ stats: todoResponse.data.stats,
132
+ },
133
+ pendingChanges: pendingChanges.data.filter((c) => !c.isExpired).length,
134
+ instructions: {
135
+ onComplete: 'After completing a task, call the paean_complete_task tool with the task ID and a brief summary.',
136
+ onNewTask: 'If you discover additional work needed, call the paean_create_task tool.',
137
+ priority: 'Focus on high priority tasks first, then medium, then low.',
138
+ },
139
+ retrievedAt: new Date().toISOString(),
140
+ };
141
+ }
142
+ case 'paean://pending-changes': {
143
+ const response = await getPendingChanges();
144
+ return {
145
+ project: project.name,
146
+ projectId,
147
+ changes: response.data.map((c) => ({
148
+ id: c.id,
149
+ summary: c.summary,
150
+ status: c.status,
151
+ changeCount: c.changeCount,
152
+ operations: c.operationCounts,
153
+ sourceNote: c.sourceNoteTitle,
154
+ createdAt: c.createdAt,
155
+ isExpired: c.isExpired,
156
+ })),
157
+ count: response.data.length,
158
+ pendingCount: response.data.filter((c) => c.status === 'pending' && !c.isExpired).length,
159
+ retrievedAt: new Date().toISOString(),
160
+ };
161
+ }
162
+ default:
163
+ throw new Error(`Unknown resource: ${uri}`);
164
+ }
165
+ }
166
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP Server
3
+ * Model Context Protocol server for AI agent integration
4
+ */
5
+ export interface McpServerOptions {
6
+ debug?: boolean;
7
+ }
8
+ /**
9
+ * Start the MCP server
10
+ */
11
+ export declare function startMcpServer(options?: McpServerOptions): Promise<void>;
12
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFlF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * MCP Server
3
+ * Model Context Protocol server for AI agent integration
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
8
+ import { getMcpResources, readMcpResource } from './resources.js';
9
+ import { getMcpTools, executeMcpTool } from './tools.js';
10
+ /**
11
+ * Start the MCP server
12
+ */
13
+ export async function startMcpServer(options = {}) {
14
+ const server = new Server({
15
+ name: 'paean',
16
+ version: '0.1.0',
17
+ }, {
18
+ capabilities: {
19
+ resources: {},
20
+ tools: {},
21
+ },
22
+ });
23
+ // Debug logging
24
+ const debug = (message, ...args) => {
25
+ if (options.debug) {
26
+ console.error(`[MCP Debug] ${message}`, ...args);
27
+ }
28
+ };
29
+ // Handle list resources request
30
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
31
+ debug('Listing resources');
32
+ const resources = await getMcpResources();
33
+ return { resources };
34
+ });
35
+ // Handle read resource request
36
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
37
+ debug('Reading resource:', request.params.uri);
38
+ const content = await readMcpResource(request.params.uri);
39
+ return {
40
+ contents: [
41
+ {
42
+ uri: request.params.uri,
43
+ mimeType: 'application/json',
44
+ text: JSON.stringify(content, null, 2),
45
+ },
46
+ ],
47
+ };
48
+ });
49
+ // Handle list tools request
50
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
51
+ debug('Listing tools');
52
+ const tools = getMcpTools();
53
+ return { tools };
54
+ });
55
+ // Handle call tool request
56
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
57
+ debug('Calling tool:', request.params.name, request.params.arguments);
58
+ const result = await executeMcpTool(request.params.name, request.params.arguments);
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: JSON.stringify(result, null, 2),
64
+ },
65
+ ],
66
+ };
67
+ });
68
+ // Error handling
69
+ server.onerror = (error) => {
70
+ console.error('[MCP Error]', error);
71
+ };
72
+ // Connect to stdio transport
73
+ const transport = new StdioServerTransport();
74
+ await server.connect(transport);
75
+ debug('MCP server started');
76
+ // Keep server running
77
+ process.on('SIGINT', () => {
78
+ debug('Shutting down MCP server');
79
+ process.exit(0);
80
+ });
81
+ }
82
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP Tools
3
+ * Define tools that AI agents can execute
4
+ */
5
+ import { type Tool } from '@modelcontextprotocol/sdk/types.js';
6
+ /**
7
+ * Get available MCP tools
8
+ */
9
+ export declare function getMcpTools(): Tool[];
10
+ /**
11
+ * Execute an MCP tool
12
+ */
13
+ export declare function executeMcpTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;
14
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAW/D;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAkIpC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAkNlB"}
@@ -0,0 +1,341 @@
1
+ /**
2
+ * MCP Tools
3
+ * Define tools that AI agents can execute
4
+ */
5
+ import { completeTodoItem, createTodoItem, updateTodoItem, getTodoList, acceptPendingChange, rejectPendingChange, } from '../api/todo.js';
6
+ import { detectProject, getProjectId } from '../utils/project.js';
7
+ /**
8
+ * Get available MCP tools
9
+ */
10
+ export function getMcpTools() {
11
+ return [
12
+ {
13
+ name: 'paean_complete_task',
14
+ description: 'Mark a task as completed. Call this after successfully completing a task.',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ taskId: {
19
+ type: 'string',
20
+ description: 'The ID of the task to complete',
21
+ },
22
+ summary: {
23
+ type: 'string',
24
+ description: 'A brief summary of what was done to complete the task',
25
+ },
26
+ },
27
+ required: ['taskId'],
28
+ },
29
+ },
30
+ {
31
+ name: 'paean_create_task',
32
+ description: 'Create a new task. Use this when you discover additional work that needs to be done.',
33
+ inputSchema: {
34
+ type: 'object',
35
+ properties: {
36
+ content: {
37
+ type: 'string',
38
+ description: 'The task description',
39
+ },
40
+ priority: {
41
+ type: 'string',
42
+ enum: ['high', 'medium', 'low'],
43
+ description: 'Task priority level',
44
+ },
45
+ tags: {
46
+ type: 'array',
47
+ items: { type: 'string' },
48
+ description: 'Optional tags to categorize the task',
49
+ },
50
+ sourceContext: {
51
+ type: 'string',
52
+ description: 'Context about why this task was created',
53
+ },
54
+ },
55
+ required: ['content'],
56
+ },
57
+ },
58
+ {
59
+ name: 'paean_update_task',
60
+ description: 'Update an existing task (status, priority, or content)',
61
+ inputSchema: {
62
+ type: 'object',
63
+ properties: {
64
+ taskId: {
65
+ type: 'string',
66
+ description: 'The ID of the task to update',
67
+ },
68
+ status: {
69
+ type: 'string',
70
+ enum: ['pending', 'in_progress'],
71
+ description: 'New task status',
72
+ },
73
+ priority: {
74
+ type: 'string',
75
+ enum: ['high', 'medium', 'low'],
76
+ description: 'New task priority',
77
+ },
78
+ content: {
79
+ type: 'string',
80
+ description: 'Updated task content',
81
+ },
82
+ },
83
+ required: ['taskId'],
84
+ },
85
+ },
86
+ {
87
+ name: 'paean_list_tasks',
88
+ description: 'List tasks with optional filtering',
89
+ inputSchema: {
90
+ type: 'object',
91
+ properties: {
92
+ status: {
93
+ type: 'string',
94
+ enum: ['all', 'pending', 'in_progress', 'completed'],
95
+ description: 'Filter by task status',
96
+ },
97
+ priority: {
98
+ type: 'string',
99
+ enum: ['high', 'medium', 'low'],
100
+ description: 'Filter by priority',
101
+ },
102
+ },
103
+ },
104
+ },
105
+ {
106
+ name: 'paean_accept_change',
107
+ description: 'Accept a pending AI-suggested change',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ changeId: {
112
+ type: 'number',
113
+ description: 'The ID of the pending change to accept',
114
+ },
115
+ },
116
+ required: ['changeId'],
117
+ },
118
+ },
119
+ {
120
+ name: 'paean_reject_change',
121
+ description: 'Reject a pending AI-suggested change',
122
+ inputSchema: {
123
+ type: 'object',
124
+ properties: {
125
+ changeId: {
126
+ type: 'number',
127
+ description: 'The ID of the pending change to reject',
128
+ },
129
+ reason: {
130
+ type: 'string',
131
+ description: 'Reason for rejecting the change',
132
+ },
133
+ },
134
+ required: ['changeId'],
135
+ },
136
+ },
137
+ ];
138
+ }
139
+ /**
140
+ * Execute an MCP tool
141
+ */
142
+ export async function executeMcpTool(toolName, args) {
143
+ const project = detectProject();
144
+ const projectId = getProjectId(project);
145
+ switch (toolName) {
146
+ case 'paean_complete_task': {
147
+ const taskId = args.taskId;
148
+ const summary = args.summary;
149
+ if (!taskId) {
150
+ return {
151
+ success: false,
152
+ error: 'taskId is required',
153
+ };
154
+ }
155
+ try {
156
+ const result = await completeTodoItem(taskId, summary);
157
+ return {
158
+ success: true,
159
+ message: 'Task completed successfully',
160
+ task: {
161
+ id: result.data.id,
162
+ content: result.data.content,
163
+ status: result.data.status,
164
+ },
165
+ project: project.name,
166
+ projectId,
167
+ };
168
+ }
169
+ catch (error) {
170
+ return {
171
+ success: false,
172
+ error: error instanceof Error ? error.message : 'Failed to complete task',
173
+ };
174
+ }
175
+ }
176
+ case 'paean_create_task': {
177
+ const content = args.content;
178
+ const priority = args.priority || 'medium';
179
+ const tags = args.tags;
180
+ const sourceContext = args.sourceContext;
181
+ if (!content) {
182
+ return {
183
+ success: false,
184
+ error: 'content is required',
185
+ };
186
+ }
187
+ try {
188
+ const result = await createTodoItem({
189
+ content,
190
+ priority,
191
+ tags,
192
+ sourceContext,
193
+ });
194
+ return {
195
+ success: true,
196
+ message: 'Task created successfully',
197
+ task: {
198
+ id: result.data.id,
199
+ content: result.data.content,
200
+ priority: result.data.priority,
201
+ status: result.data.status,
202
+ },
203
+ project: project.name,
204
+ projectId,
205
+ };
206
+ }
207
+ catch (error) {
208
+ return {
209
+ success: false,
210
+ error: error instanceof Error ? error.message : 'Failed to create task',
211
+ };
212
+ }
213
+ }
214
+ case 'paean_update_task': {
215
+ const taskId = args.taskId;
216
+ const updates = {};
217
+ if (args.status)
218
+ updates.status = args.status;
219
+ if (args.priority)
220
+ updates.priority = args.priority;
221
+ if (args.content)
222
+ updates.content = args.content;
223
+ if (!taskId) {
224
+ return {
225
+ success: false,
226
+ error: 'taskId is required',
227
+ };
228
+ }
229
+ if (Object.keys(updates).length === 0) {
230
+ return {
231
+ success: false,
232
+ error: 'At least one update field is required (status, priority, or content)',
233
+ };
234
+ }
235
+ try {
236
+ const result = await updateTodoItem(taskId, updates);
237
+ return {
238
+ success: true,
239
+ message: 'Task updated successfully',
240
+ task: {
241
+ id: result.data.id,
242
+ content: result.data.content,
243
+ priority: result.data.priority,
244
+ status: result.data.status,
245
+ },
246
+ project: project.name,
247
+ projectId,
248
+ };
249
+ }
250
+ catch (error) {
251
+ return {
252
+ success: false,
253
+ error: error instanceof Error ? error.message : 'Failed to update task',
254
+ };
255
+ }
256
+ }
257
+ case 'paean_list_tasks': {
258
+ const status = args.status;
259
+ const priority = args.priority;
260
+ try {
261
+ const result = await getTodoList({
262
+ status: status,
263
+ priority: priority,
264
+ });
265
+ return {
266
+ success: true,
267
+ tasks: result.data.items.map((t) => ({
268
+ id: t.id,
269
+ content: t.content,
270
+ priority: t.priority,
271
+ status: t.status,
272
+ tags: t.tags,
273
+ dueDate: t.dueDate,
274
+ })),
275
+ stats: result.data.stats,
276
+ project: project.name,
277
+ projectId,
278
+ };
279
+ }
280
+ catch (error) {
281
+ return {
282
+ success: false,
283
+ error: error instanceof Error ? error.message : 'Failed to list tasks',
284
+ };
285
+ }
286
+ }
287
+ case 'paean_accept_change': {
288
+ const changeId = args.changeId;
289
+ if (!changeId) {
290
+ return {
291
+ success: false,
292
+ error: 'changeId is required',
293
+ };
294
+ }
295
+ try {
296
+ await acceptPendingChange(changeId);
297
+ return {
298
+ success: true,
299
+ message: 'Change accepted successfully',
300
+ changeId,
301
+ };
302
+ }
303
+ catch (error) {
304
+ return {
305
+ success: false,
306
+ error: error instanceof Error ? error.message : 'Failed to accept change',
307
+ };
308
+ }
309
+ }
310
+ case 'paean_reject_change': {
311
+ const changeId = args.changeId;
312
+ const reason = args.reason;
313
+ if (!changeId) {
314
+ return {
315
+ success: false,
316
+ error: 'changeId is required',
317
+ };
318
+ }
319
+ try {
320
+ await rejectPendingChange(changeId, reason);
321
+ return {
322
+ success: true,
323
+ message: 'Change rejected successfully',
324
+ changeId,
325
+ };
326
+ }
327
+ catch (error) {
328
+ return {
329
+ success: false,
330
+ error: error instanceof Error ? error.message : 'Failed to reject change',
331
+ };
332
+ }
333
+ }
334
+ default:
335
+ return {
336
+ success: false,
337
+ error: `Unknown tool: ${toolName}`,
338
+ };
339
+ }
340
+ }
341
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}