motionmcp 1.0.1 → 2.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 (159) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +251 -417
  3. package/dist/handlers/CommentHandler.d.ts +9 -0
  4. package/dist/handlers/CommentHandler.d.ts.map +1 -0
  5. package/dist/handlers/CommentHandler.js +66 -0
  6. package/dist/handlers/CommentHandler.js.map +1 -0
  7. package/dist/handlers/CustomFieldHandler.d.ts +14 -0
  8. package/dist/handlers/CustomFieldHandler.d.ts.map +1 -0
  9. package/dist/handlers/CustomFieldHandler.js +95 -0
  10. package/dist/handlers/CustomFieldHandler.js.map +1 -0
  11. package/dist/handlers/HandlerFactory.d.ts +15 -0
  12. package/dist/handlers/HandlerFactory.d.ts.map +1 -0
  13. package/dist/handlers/HandlerFactory.js +58 -0
  14. package/dist/handlers/HandlerFactory.js.map +1 -0
  15. package/dist/handlers/ProjectHandler.d.ts +10 -0
  16. package/dist/handlers/ProjectHandler.d.ts.map +1 -0
  17. package/dist/handlers/ProjectHandler.js +63 -0
  18. package/dist/handlers/ProjectHandler.js.map +1 -0
  19. package/dist/handlers/RecurringTaskHandler.d.ts +10 -0
  20. package/dist/handlers/RecurringTaskHandler.d.ts.map +1 -0
  21. package/dist/handlers/RecurringTaskHandler.js +68 -0
  22. package/dist/handlers/RecurringTaskHandler.js.map +1 -0
  23. package/dist/handlers/ScheduleHandler.d.ts +8 -0
  24. package/dist/handlers/ScheduleHandler.d.ts.map +1 -0
  25. package/dist/handlers/ScheduleHandler.js +43 -0
  26. package/dist/handlers/ScheduleHandler.js.map +1 -0
  27. package/dist/handlers/SearchHandler.d.ts +10 -0
  28. package/dist/handlers/SearchHandler.d.ts.map +1 -0
  29. package/dist/handlers/SearchHandler.js +116 -0
  30. package/dist/handlers/SearchHandler.js.map +1 -0
  31. package/dist/handlers/StatusHandler.d.ts +8 -0
  32. package/dist/handlers/StatusHandler.d.ts.map +1 -0
  33. package/dist/handlers/StatusHandler.js +22 -0
  34. package/dist/handlers/StatusHandler.js.map +1 -0
  35. package/dist/handlers/TaskHandler.d.ts +22 -0
  36. package/dist/handlers/TaskHandler.d.ts.map +1 -0
  37. package/dist/handlers/TaskHandler.js +266 -0
  38. package/dist/handlers/TaskHandler.js.map +1 -0
  39. package/dist/handlers/UserHandler.d.ts +9 -0
  40. package/dist/handlers/UserHandler.d.ts.map +1 -0
  41. package/dist/handlers/UserHandler.js +36 -0
  42. package/dist/handlers/UserHandler.js.map +1 -0
  43. package/dist/handlers/WorkspaceHandler.d.ts +10 -0
  44. package/dist/handlers/WorkspaceHandler.d.ts.map +1 -0
  45. package/dist/handlers/WorkspaceHandler.js +49 -0
  46. package/dist/handlers/WorkspaceHandler.js.map +1 -0
  47. package/dist/handlers/base/BaseHandler.d.ts +16 -0
  48. package/dist/handlers/base/BaseHandler.d.ts.map +1 -0
  49. package/dist/handlers/base/BaseHandler.js +31 -0
  50. package/dist/handlers/base/BaseHandler.js.map +1 -0
  51. package/dist/handlers/base/HandlerInterface.d.ts +18 -0
  52. package/dist/handlers/base/HandlerInterface.d.ts.map +1 -0
  53. package/dist/handlers/base/HandlerInterface.js +3 -0
  54. package/dist/handlers/base/HandlerInterface.js.map +1 -0
  55. package/dist/handlers/index.d.ts +14 -0
  56. package/dist/handlers/index.d.ts.map +1 -0
  57. package/dist/handlers/index.js +31 -0
  58. package/dist/handlers/index.js.map +1 -0
  59. package/dist/mcp-server-old.d.ts +29 -0
  60. package/dist/mcp-server-old.d.ts.map +1 -0
  61. package/dist/mcp-server-old.js +1304 -0
  62. package/dist/mcp-server-old.js.map +1 -0
  63. package/dist/mcp-server.d.ts +15 -0
  64. package/dist/mcp-server.d.ts.map +1 -0
  65. package/dist/mcp-server.js +145 -0
  66. package/dist/mcp-server.js.map +1 -0
  67. package/dist/schemas/motion.d.ts +4971 -0
  68. package/dist/schemas/motion.d.ts.map +1 -0
  69. package/dist/schemas/motion.js +328 -0
  70. package/dist/schemas/motion.js.map +1 -0
  71. package/dist/services/motionApi.d.ts +186 -0
  72. package/dist/services/motionApi.d.ts.map +1 -0
  73. package/dist/services/motionApi.js +1912 -0
  74. package/dist/services/motionApi.js.map +1 -0
  75. package/dist/tools/ToolConfigurator.d.ts +19 -0
  76. package/dist/tools/ToolConfigurator.d.ts.map +1 -0
  77. package/dist/tools/ToolConfigurator.js +89 -0
  78. package/dist/tools/ToolConfigurator.js.map +1 -0
  79. package/dist/tools/ToolDefinitions.d.ts +25 -0
  80. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  81. package/dist/tools/ToolDefinitions.js +502 -0
  82. package/dist/tools/ToolDefinitions.js.map +1 -0
  83. package/dist/tools/ToolRegistry.d.ts +16 -0
  84. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  85. package/dist/tools/ToolRegistry.js +89 -0
  86. package/dist/tools/ToolRegistry.js.map +1 -0
  87. package/dist/tools/index.d.ts +4 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +21 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/types/mcp-tool-args.d.ts +122 -0
  92. package/dist/types/mcp-tool-args.d.ts.map +1 -0
  93. package/dist/types/mcp-tool-args.js +7 -0
  94. package/dist/types/mcp-tool-args.js.map +1 -0
  95. package/dist/types/mcp.d.ts +32 -0
  96. package/dist/types/mcp.d.ts.map +1 -0
  97. package/dist/types/mcp.js +3 -0
  98. package/dist/types/mcp.js.map +1 -0
  99. package/dist/types/motion.d.ts +304 -0
  100. package/dist/types/motion.d.ts.map +1 -0
  101. package/dist/types/motion.js +3 -0
  102. package/dist/types/motion.js.map +1 -0
  103. package/dist/utils/cache.d.ts +25 -0
  104. package/dist/utils/cache.d.ts.map +1 -0
  105. package/dist/utils/cache.js +135 -0
  106. package/dist/utils/cache.js.map +1 -0
  107. package/dist/utils/constants.d.ts +83 -0
  108. package/dist/utils/constants.d.ts.map +1 -0
  109. package/dist/utils/constants.js +151 -0
  110. package/dist/utils/constants.js.map +1 -0
  111. package/dist/utils/errorHandling.d.ts +50 -0
  112. package/dist/utils/errorHandling.d.ts.map +1 -0
  113. package/dist/utils/errorHandling.js +86 -0
  114. package/dist/utils/errorHandling.js.map +1 -0
  115. package/dist/utils/index.d.ts +13 -0
  116. package/dist/utils/index.d.ts.map +1 -0
  117. package/dist/utils/index.js +38 -0
  118. package/dist/utils/index.js.map +1 -0
  119. package/dist/utils/logger.d.ts +13 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +47 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/dist/utils/paginationNew.d.ts +44 -0
  124. package/dist/utils/paginationNew.d.ts.map +1 -0
  125. package/dist/utils/paginationNew.js +149 -0
  126. package/dist/utils/paginationNew.js.map +1 -0
  127. package/dist/utils/parameterUtils.d.ts +79 -0
  128. package/dist/utils/parameterUtils.d.ts.map +1 -0
  129. package/dist/utils/parameterUtils.js +189 -0
  130. package/dist/utils/parameterUtils.js.map +1 -0
  131. package/dist/utils/responseFormatters.d.ts +92 -0
  132. package/dist/utils/responseFormatters.d.ts.map +1 -0
  133. package/dist/utils/responseFormatters.js +331 -0
  134. package/dist/utils/responseFormatters.js.map +1 -0
  135. package/dist/utils/responseWrapper.d.ts +38 -0
  136. package/dist/utils/responseWrapper.d.ts.map +1 -0
  137. package/dist/utils/responseWrapper.js +201 -0
  138. package/dist/utils/responseWrapper.js.map +1 -0
  139. package/dist/utils/sanitize.d.ts +51 -0
  140. package/dist/utils/sanitize.d.ts.map +1 -0
  141. package/dist/utils/sanitize.js +137 -0
  142. package/dist/utils/sanitize.js.map +1 -0
  143. package/dist/utils/validator.d.ts +37 -0
  144. package/dist/utils/validator.d.ts.map +1 -0
  145. package/dist/utils/validator.js +74 -0
  146. package/dist/utils/validator.js.map +1 -0
  147. package/dist/utils/workspaceResolver.d.ts +40 -0
  148. package/dist/utils/workspaceResolver.d.ts.map +1 -0
  149. package/dist/utils/workspaceResolver.js +207 -0
  150. package/dist/utils/workspaceResolver.js.map +1 -0
  151. package/package.json +41 -17
  152. package/.claude/settings.local.json +0 -15
  153. package/.env.example +0 -3
  154. package/sample.png +0 -0
  155. package/src/index.js +0 -49
  156. package/src/mcp-server.js +0 -1137
  157. package/src/routes/motion.js +0 -152
  158. package/src/services/motionApi.js +0 -1177
  159. package/src/worker.js +0 -248
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ /**
3
+ * Response Formatting Utilities - MCP response formatting helpers
4
+ *
5
+ * This module provides utilities to format various types of responses
6
+ * consistently across all MCP handlers, reducing duplication and ensuring
7
+ * uniform response structures.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.formatListResponse = formatListResponse;
11
+ exports.formatProjectList = formatProjectList;
12
+ exports.formatTaskList = formatTaskList;
13
+ exports.formatWorkspaceList = formatWorkspaceList;
14
+ exports.formatDetailResponse = formatDetailResponse;
15
+ exports.formatTaskDetail = formatTaskDetail;
16
+ exports.formatSearchResults = formatSearchResults;
17
+ exports.formatCommentList = formatCommentList;
18
+ exports.formatCommentDetail = formatCommentDetail;
19
+ exports.formatCustomFieldList = formatCustomFieldList;
20
+ exports.formatCustomFieldDetail = formatCustomFieldDetail;
21
+ exports.formatCustomFieldSuccess = formatCustomFieldSuccess;
22
+ exports.formatRecurringTaskList = formatRecurringTaskList;
23
+ exports.formatRecurringTaskDetail = formatRecurringTaskDetail;
24
+ exports.formatScheduleList = formatScheduleList;
25
+ exports.formatStatusList = formatStatusList;
26
+ const errorHandling_1 = require("./errorHandling");
27
+ const constants_1 = require("./constants");
28
+ /**
29
+ * Format a list of items for MCP response
30
+ */
31
+ function formatListResponse(items, title, formatter) {
32
+ if (!Array.isArray(items)) {
33
+ throw new Error('Items must be an array');
34
+ }
35
+ const list = items.map(formatter).join('\n');
36
+ const responseText = `${title}:\n${list}`;
37
+ return (0, errorHandling_1.formatMcpSuccess)(responseText);
38
+ }
39
+ /**
40
+ * Format project list response with workspace context
41
+ */
42
+ function formatProjectList(projects, workspaceName, workspaceId = null, options = {}) {
43
+ const { includeWorkspaceNote = false, showIds = true } = options;
44
+ const projectFormatter = (project) => {
45
+ if (showIds) {
46
+ // For cross-workspace listings, show workspace info too
47
+ if (workspaceName === 'All Workspaces' && project.workspaceId) {
48
+ return `- ${project.name} (ID: ${project.id}) [Workspace: ${project.workspaceId}]`;
49
+ }
50
+ return `- ${project.name} (ID: ${project.id})`;
51
+ }
52
+ return `- ${project.name}`;
53
+ };
54
+ let responseText = `Found ${projects.length} ${projects.length === 1 ? 'project' : 'projects'} in workspace "${workspaceName}"`;
55
+ if (workspaceId) {
56
+ responseText += ` (ID: ${workspaceId})`;
57
+ }
58
+ if (projects.length > 0) {
59
+ const projectList = projects.map(projectFormatter).join('\n');
60
+ responseText += `:\n${projectList}`;
61
+ }
62
+ if (includeWorkspaceNote && !workspaceId) {
63
+ responseText += `\n\nNote: This shows projects from the default workspace. You can specify a different workspace using the workspaceId or workspaceName parameter, or use motion_workspaces (operation: list) to see all available workspaces.`;
64
+ }
65
+ return (0, errorHandling_1.formatMcpSuccess)(responseText);
66
+ }
67
+ /**
68
+ * Format task list response
69
+ */
70
+ function formatTaskList(tasks, context = {}) {
71
+ const { workspaceName, projectName, status, limit, allWorkspaces } = context;
72
+ const taskFormatter = (task) => {
73
+ let line = `- ${task.name}`;
74
+ if (task.id)
75
+ line += ` (ID: ${task.id})`;
76
+ if (task.status)
77
+ line += ` [${typeof task.status === 'string' ? task.status : task.status.name}]`;
78
+ if (task.priority)
79
+ line += ` {${task.priority}}`;
80
+ if (task.dueDate) {
81
+ const dueDate = new Date(task.dueDate).toLocaleDateString();
82
+ line += ` (Due: ${dueDate})`;
83
+ }
84
+ return line;
85
+ };
86
+ let title = `Found ${tasks.length} ${tasks.length === 1 ? 'task' : 'tasks'}`;
87
+ if (allWorkspaces) {
88
+ title += ` across all workspaces`;
89
+ }
90
+ else {
91
+ if (workspaceName)
92
+ title += ` in workspace "${workspaceName}"`;
93
+ }
94
+ if (projectName)
95
+ title += ` in project "${projectName}"`;
96
+ if (status)
97
+ title += ` with status "${status}"`;
98
+ if (limit)
99
+ title += ` (limit: ${limit})`;
100
+ return formatListResponse(tasks, title, taskFormatter);
101
+ }
102
+ /**
103
+ * Format workspace list response
104
+ */
105
+ function formatWorkspaceList(workspaces) {
106
+ const workspaceFormatter = (workspace) => {
107
+ let line = `- ${workspace.name} (ID: ${workspace.id})`;
108
+ if (workspace.type)
109
+ line += ` [${workspace.type}]`;
110
+ return line;
111
+ };
112
+ return formatListResponse(workspaces, `Available workspaces (${workspaces.length})`, workspaceFormatter);
113
+ }
114
+ /**
115
+ * Format detailed item response (project, task, etc.)
116
+ */
117
+ function formatDetailResponse(item, itemType, fields = []) {
118
+ let responseText = `${itemType} Details:\n`;
119
+ fields.forEach(field => {
120
+ const value = item[field];
121
+ const fieldStr = String(field);
122
+ const displayName = fieldStr.charAt(0).toUpperCase() + fieldStr.slice(1);
123
+ const displayValue = value ?? 'N/A';
124
+ responseText += `- ${displayName}: ${displayValue}\n`;
125
+ });
126
+ return (0, errorHandling_1.formatMcpSuccess)(responseText);
127
+ }
128
+ /**
129
+ * Format single task detail response with comprehensive information
130
+ */
131
+ function formatTaskDetail(task) {
132
+ const details = [
133
+ `Task: ${task.name}`,
134
+ `ID: ${task.id}`,
135
+ task.description ? `Description: ${task.description}` : null,
136
+ `Status: ${typeof task.status === 'string' ? task.status : task.status?.name || 'Unknown'}`,
137
+ `Priority: ${task.priority || 'Not set'}`,
138
+ `Completed: ${task.completed ? 'Yes' : 'No'}`,
139
+ task.dueDate ? `Due Date: ${new Date(task.dueDate).toLocaleString()}` : 'Due Date: Not set',
140
+ task.createdTime ? `Created: ${new Date(task.createdTime).toLocaleString()}` : null,
141
+ task.updatedTime ? `Last Updated: ${new Date(task.updatedTime).toLocaleString()}` : null,
142
+ task.completedTime ? `Completed: ${new Date(task.completedTime).toLocaleString()}` : null,
143
+ `Workspace: ${task.workspace?.name || 'Unknown'} (${task.workspace?.id || 'N/A'})`,
144
+ task.project ? `Project: ${task.project.name} (${task.project.id})` : 'Project: No project assigned',
145
+ task.assignees && task.assignees.length > 0
146
+ ? `Assignees: ${task.assignees.map(a => `${a.name} (${a.email})`).join(', ')}`
147
+ : 'Assignees: None',
148
+ task.creator ? `Creator: ${task.creator.name} (${task.creator.email})` : null,
149
+ (task.labels && task.labels.length > 0)
150
+ ? `Labels: ${task.labels.map(l => typeof l === 'string' ? l : l.name).join(', ')}`
151
+ : null,
152
+ task.duration ? `Duration: ${typeof task.duration === 'number' ? `${task.duration} minutes` : task.duration}` : null,
153
+ task.deadlineType ? `Deadline Type: ${task.deadlineType}` : null,
154
+ task.scheduledStart ? `Scheduled Start: ${new Date(task.scheduledStart).toLocaleString()}` : null,
155
+ task.scheduledEnd ? `Scheduled End: ${new Date(task.scheduledEnd).toLocaleString()}` : null,
156
+ task.parentRecurringTaskId ? `Recurring Task ID: ${task.parentRecurringTaskId}` : null,
157
+ task.chunks && task.chunks.length > 0
158
+ ? `Scheduled Chunks: ${task.chunks.length} time block(s)`
159
+ : null
160
+ ].filter(Boolean).join('\n');
161
+ return (0, errorHandling_1.formatMcpSuccess)(details);
162
+ }
163
+ /**
164
+ * Format search results response
165
+ */
166
+ function formatSearchResults(results, query, options = {}) {
167
+ const { limit, searchScope } = options;
168
+ const resultFormatter = (result) => {
169
+ const type = result.projectId ? "task" : "project";
170
+ return `- [${type}] ${result.name} (ID: ${result.id})`;
171
+ };
172
+ let title = `Search Results for "${query}"`;
173
+ if (limit)
174
+ title += ` (Limit: ${limit})`;
175
+ if (searchScope)
176
+ title += ` (Scope: ${searchScope})`;
177
+ return formatListResponse(results, title, resultFormatter);
178
+ }
179
+ /**
180
+ * Format comments list response
181
+ */
182
+ function formatCommentList(comments) {
183
+ if (comments.length === 0) {
184
+ return (0, errorHandling_1.formatMcpSuccess)("No comments found.");
185
+ }
186
+ const commentFormatter = (comment) => {
187
+ const location = `Task ${comment.taskId}`;
188
+ const timestamp = comment.createdAt;
189
+ const author = comment.creator.name || comment.creator.email || comment.creator.id;
190
+ // Truncate long comments for display
191
+ const displayContent = comment.content.length > constants_1.LIMITS.COMMENT_DISPLAY_LENGTH
192
+ ? comment.content.substring(0, constants_1.LIMITS.COMMENT_DISPLAY_LENGTH) + '...'
193
+ : comment.content;
194
+ // Keep as single line for proper list formatting
195
+ return `- [${comment.id}] ${location} | Author: ${author} | ${timestamp} | "${displayContent}"`;
196
+ };
197
+ return formatListResponse(comments, `Found ${comments.length} comment${comments.length === 1 ? '' : 's'}`, commentFormatter);
198
+ }
199
+ /**
200
+ * Format single comment response
201
+ */
202
+ function formatCommentDetail(comment) {
203
+ const location = `Task ${comment.taskId}`;
204
+ const timestamp = comment.createdAt;
205
+ const author = comment.creator.name || comment.creator.email || comment.creator.id;
206
+ const details = [
207
+ `Comment created successfully:`,
208
+ `- ID: ${comment.id}`,
209
+ `- Location: ${location}`,
210
+ `- Author: ${author}`,
211
+ `- Created: ${timestamp}`,
212
+ `- Content: "${comment.content}"`
213
+ ].join('\n');
214
+ return (0, errorHandling_1.formatMcpSuccess)(details);
215
+ }
216
+ /**
217
+ * Format custom field list response
218
+ */
219
+ function formatCustomFieldList(fields) {
220
+ if (fields.length === 0) {
221
+ return (0, errorHandling_1.formatMcpSuccess)("No custom fields found.");
222
+ }
223
+ const fieldFormatter = (field) => {
224
+ return `- ID: ${field.id} [Type: ${field.field}]`;
225
+ };
226
+ return formatListResponse(fields, `Found ${fields.length} custom field${fields.length === 1 ? '' : 's'}`, fieldFormatter);
227
+ }
228
+ /**
229
+ * Format single custom field response
230
+ */
231
+ function formatCustomFieldDetail(field) {
232
+ const details = [
233
+ `Custom field created successfully:`,
234
+ `- ID: ${field.id}`,
235
+ `- Type: ${field.field}`
236
+ ].join('\n');
237
+ return (0, errorHandling_1.formatMcpSuccess)(details);
238
+ }
239
+ /**
240
+ * Format success message for custom field operations
241
+ */
242
+ function formatCustomFieldSuccess(operation, entityType, entityId) {
243
+ let message = `Custom field ${operation} successfully`;
244
+ if (entityType && entityId) {
245
+ message += ` for ${entityType} ${entityId}`;
246
+ }
247
+ return (0, errorHandling_1.formatMcpSuccess)(message);
248
+ }
249
+ /**
250
+ * Format recurring task list response
251
+ */
252
+ function formatRecurringTaskList(tasks) {
253
+ if (tasks.length === 0) {
254
+ return (0, errorHandling_1.formatMcpSuccess)("No recurring tasks found.");
255
+ }
256
+ const taskFormatter = (task) => {
257
+ const projectName = task.project?.name ?? 'No Project';
258
+ return `- ${task.name} (ID: ${task.id}) [${task.priority}] (Project: ${projectName})`;
259
+ };
260
+ return formatListResponse(tasks, `Found ${tasks.length} recurring task${tasks.length === 1 ? '' : 's'}`, taskFormatter);
261
+ }
262
+ /**
263
+ * Format single recurring task response
264
+ */
265
+ function formatRecurringTaskDetail(task) {
266
+ const details = [
267
+ `Recurring task created successfully:`,
268
+ `- ID: ${task.id}`,
269
+ `- Name: ${task.name}`,
270
+ `- Priority: ${task.priority}`,
271
+ `- Creator: ${task.creator.name} (${task.creator.email})`,
272
+ `- Workspace: ${task.workspace.name} (${task.workspace.id})`,
273
+ task.project ? `- Project: ${task.project.name} (${task.project.id})` : `- Project: No project assigned`,
274
+ task.assignee ? `- Assignee: ${task.assignee.name} (${task.assignee.email})` : null,
275
+ `- Status: ${typeof task.status === 'string' ? task.status : task.status?.name || 'Unknown'}`,
276
+ (task.labels && task.labels.length > 0) ? `- Labels: ${task.labels.map(l => typeof l === 'string' ? l : l.name).join(', ')}` : null
277
+ ].filter(Boolean).join('\n');
278
+ return (0, errorHandling_1.formatMcpSuccess)(details);
279
+ }
280
+ /**
281
+ * Format schedule list response
282
+ */
283
+ function formatScheduleList(schedules) {
284
+ // Add null safety check for the array itself
285
+ if (!schedules || !Array.isArray(schedules) || schedules.length === 0) {
286
+ return (0, errorHandling_1.formatMcpSuccess)("No schedules found.");
287
+ }
288
+ const scheduleFormatter = (schedule) => {
289
+ // Defensive programming for nested schedule object
290
+ if (!schedule) {
291
+ return '- Invalid schedule entry';
292
+ }
293
+ const name = schedule.name || 'Unnamed';
294
+ const timezone = schedule.timezone || 'Unknown timezone';
295
+ // Count working days if schedule details are available
296
+ let workingDays = '';
297
+ if (schedule.schedule && typeof schedule.schedule === 'object') {
298
+ const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
299
+ const activeDays = days.filter(day => Array.isArray(schedule.schedule[day]) &&
300
+ schedule.schedule[day].length > 0);
301
+ workingDays = activeDays.length > 0
302
+ ? ` | Working days: ${activeDays.length}/7`
303
+ : ' | No working hours defined';
304
+ }
305
+ else {
306
+ workingDays = ' | Schedule details unavailable';
307
+ }
308
+ return `- ${name} (${timezone})${workingDays}`;
309
+ };
310
+ return formatListResponse(schedules, `Found ${schedules.length} schedule${schedules.length === 1 ? '' : 's'}`, scheduleFormatter);
311
+ }
312
+ function formatStatusList(statuses) {
313
+ const statusFormatter = (status) => {
314
+ // Defensive programming for status object
315
+ if (!status) {
316
+ return '- Invalid status entry';
317
+ }
318
+ const name = status.name || 'Unnamed';
319
+ const flags = [];
320
+ if (status.isDefaultStatus) {
321
+ flags.push('Default');
322
+ }
323
+ if (status.isResolvedStatus) {
324
+ flags.push('Resolved');
325
+ }
326
+ const flagsStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';
327
+ return `- ${name}${flagsStr}`;
328
+ };
329
+ return formatListResponse(statuses, `Found ${statuses.length} status${statuses.length === 1 ? '' : 'es'}`, statusFormatter);
330
+ }
331
+ //# sourceMappingURL=responseFormatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseFormatters.js","sourceRoot":"","sources":["../../src/utils/responseFormatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Motion API Response Wrapper Utility
3
+ *
4
+ * Handles the inconsistent response patterns across Motion API endpoints:
5
+ * - Some return wrapped responses: { meta: {...}, [resource]: [...] }
6
+ * - Others return direct arrays: [...]
7
+ *
8
+ * This utility provides type-safe unwrapping with proper pagination support.
9
+ */
10
+ import { MotionPaginationMeta } from '../types/motion';
11
+ /**
12
+ * Standard unwrapped response structure for consistent internal handling
13
+ */
14
+ export interface UnwrappedResponse<T> {
15
+ data: T[];
16
+ meta?: MotionPaginationMeta;
17
+ }
18
+ /**
19
+ * Unwraps a Motion API response based on the known patterns
20
+ *
21
+ * @param response - The raw API response data
22
+ * @param apiEndpoint - The API endpoint name (e.g., 'tasks', 'projects', 'comments')
23
+ * @returns Standardized unwrapped response with data array and optional meta
24
+ */
25
+ export declare function unwrapApiResponse<T = unknown>(response: unknown, apiEndpoint: string): UnwrappedResponse<T>;
26
+ /**
27
+ * Checks if an API endpoint supports pagination based on known patterns
28
+ */
29
+ export declare function supportsPagination(apiEndpoint: string): boolean;
30
+ /**
31
+ * Gets the expected resource key for a wrapped API response
32
+ */
33
+ export declare function getResourceKey(apiEndpoint: string): string | undefined;
34
+ /**
35
+ * Updates the known pattern for an API endpoint (for runtime discovery)
36
+ */
37
+ export declare function updateApiPattern(apiEndpoint: string, isWrapped: boolean, resourceKey?: string): void;
38
+ //# sourceMappingURL=responseWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseWrapper.d.ts","sourceRoot":"","sources":["../../src/utils/responseWrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAIvD;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,IAAI,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AA6DD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAC3C,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,MAAM,GAClB,iBAAiB,CAAC,CAAC,CAAC,CAiBtB;AAyGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,OAAO,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAYN"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ /**
3
+ * Motion API Response Wrapper Utility
4
+ *
5
+ * Handles the inconsistent response patterns across Motion API endpoints:
6
+ * - Some return wrapped responses: { meta: {...}, [resource]: [...] }
7
+ * - Others return direct arrays: [...]
8
+ *
9
+ * This utility provides type-safe unwrapping with proper pagination support.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.unwrapApiResponse = unwrapApiResponse;
13
+ exports.supportsPagination = supportsPagination;
14
+ exports.getResourceKey = getResourceKey;
15
+ exports.updateApiPattern = updateApiPattern;
16
+ const logger_1 = require("./logger");
17
+ const constants_1 = require("./constants");
18
+ /**
19
+ * Known API response patterns based on current codebase evidence and task documentation
20
+ */
21
+ const API_RESPONSE_PATTERNS = {
22
+ // Wrapped responses (with meta pagination)
23
+ tasks: {
24
+ isWrapped: true,
25
+ resourceKey: 'tasks',
26
+ apiName: 'Tasks'
27
+ },
28
+ projects: {
29
+ isWrapped: true,
30
+ resourceKey: 'projects',
31
+ apiName: 'Projects'
32
+ },
33
+ comments: {
34
+ isWrapped: true,
35
+ resourceKey: 'comments',
36
+ apiName: 'Comments'
37
+ },
38
+ 'recurring-tasks': {
39
+ isWrapped: true,
40
+ resourceKey: 'tasks', // Note: recurring tasks API returns { meta, tasks } not { meta, recurringTasks }
41
+ apiName: 'Recurring Tasks'
42
+ },
43
+ 'custom-fields': {
44
+ isWrapped: true,
45
+ resourceKey: 'customFields',
46
+ apiName: 'Custom Fields'
47
+ },
48
+ // Direct array responses (no wrapper)
49
+ schedules: {
50
+ isWrapped: false,
51
+ apiName: 'Schedules'
52
+ },
53
+ statuses: {
54
+ isWrapped: false,
55
+ apiName: 'Statuses'
56
+ },
57
+ workspaces: {
58
+ isWrapped: false,
59
+ apiName: 'Workspaces'
60
+ },
61
+ users: {
62
+ isWrapped: false, // TODO: Verify this - may be wrapped with 'users' key
63
+ apiName: 'Users'
64
+ }
65
+ };
66
+ /**
67
+ * Unwraps a Motion API response based on the known patterns
68
+ *
69
+ * @param response - The raw API response data
70
+ * @param apiEndpoint - The API endpoint name (e.g., 'tasks', 'projects', 'comments')
71
+ * @returns Standardized unwrapped response with data array and optional meta
72
+ */
73
+ function unwrapApiResponse(response, apiEndpoint) {
74
+ const config = API_RESPONSE_PATTERNS[apiEndpoint];
75
+ if (!config) {
76
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Unknown API endpoint pattern: ${apiEndpoint}`, {
77
+ endpoint: apiEndpoint,
78
+ availablePatterns: Object.keys(API_RESPONSE_PATTERNS)
79
+ });
80
+ // Fallback: try to extract array from common patterns
81
+ return fallbackUnwrap(response, apiEndpoint);
82
+ }
83
+ if (config.isWrapped) {
84
+ return unwrapWrappedResponse(response, config);
85
+ }
86
+ else {
87
+ return unwrapDirectResponse(response, config);
88
+ }
89
+ }
90
+ /**
91
+ * Unwraps a wrapped response: { meta: {...}, [resourceKey]: [...] }
92
+ */
93
+ function unwrapWrappedResponse(response, config) {
94
+ if (!response || typeof response !== 'object') {
95
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Expected wrapped response object for ${config.apiName}`, {
96
+ receivedType: typeof response,
97
+ response
98
+ });
99
+ return { data: [] };
100
+ }
101
+ const responseObj = response;
102
+ const resourceKey = config.resourceKey;
103
+ const data = responseObj[resourceKey];
104
+ const meta = responseObj.meta;
105
+ if (!Array.isArray(data)) {
106
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Expected array for ${resourceKey} in ${config.apiName} response`, {
107
+ resourceKey,
108
+ receivedType: typeof data,
109
+ hasMetaField: !!meta,
110
+ responseKeys: Object.keys(responseObj)
111
+ });
112
+ return { data: [] };
113
+ }
114
+ return {
115
+ data,
116
+ meta: meta && typeof meta === 'object' ? meta : undefined
117
+ };
118
+ }
119
+ /**
120
+ * Unwraps a direct array response: [...]
121
+ */
122
+ function unwrapDirectResponse(response, config) {
123
+ if (!Array.isArray(response)) {
124
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Expected direct array response for ${config.apiName}`, {
125
+ receivedType: typeof response,
126
+ response
127
+ });
128
+ return { data: [] };
129
+ }
130
+ return { data: response };
131
+ }
132
+ /**
133
+ * Fallback unwrapping logic for unknown endpoints
134
+ * Attempts to handle both wrapped and direct patterns
135
+ */
136
+ function fallbackUnwrap(response, apiEndpoint) {
137
+ // Case 1: Direct array
138
+ if (Array.isArray(response)) {
139
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, `Fallback: treating ${apiEndpoint} as direct array`, {
140
+ itemCount: response.length
141
+ });
142
+ return { data: response };
143
+ }
144
+ // Case 2: Wrapped response - try common resource keys
145
+ if (response && typeof response === 'object') {
146
+ const responseObj = response;
147
+ const possibleKeys = ['items', 'tasks', 'projects', 'comments', 'users', 'workspaces', 'schedules', 'statuses', 'customFields'];
148
+ for (const key of possibleKeys) {
149
+ if (Array.isArray(responseObj[key])) {
150
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, `Fallback: found array at ${key} for ${apiEndpoint}`, {
151
+ key,
152
+ itemCount: responseObj[key].length,
153
+ hasMeta: !!responseObj.meta
154
+ });
155
+ return {
156
+ data: responseObj[key],
157
+ meta: responseObj.meta
158
+ };
159
+ }
160
+ }
161
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Fallback: no array found in object response for ${apiEndpoint}`, {
162
+ responseKeys: Object.keys(responseObj)
163
+ });
164
+ }
165
+ // Case 3: Unexpected response
166
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, `Fallback: unexpected response format for ${apiEndpoint}`, {
167
+ responseType: typeof response,
168
+ response
169
+ });
170
+ return { data: [] };
171
+ }
172
+ /**
173
+ * Checks if an API endpoint supports pagination based on known patterns
174
+ */
175
+ function supportsPagination(apiEndpoint) {
176
+ const config = API_RESPONSE_PATTERNS[apiEndpoint];
177
+ return config?.isWrapped || false;
178
+ }
179
+ /**
180
+ * Gets the expected resource key for a wrapped API response
181
+ */
182
+ function getResourceKey(apiEndpoint) {
183
+ const config = API_RESPONSE_PATTERNS[apiEndpoint];
184
+ return config?.resourceKey;
185
+ }
186
+ /**
187
+ * Updates the known pattern for an API endpoint (for runtime discovery)
188
+ */
189
+ function updateApiPattern(apiEndpoint, isWrapped, resourceKey) {
190
+ API_RESPONSE_PATTERNS[apiEndpoint] = {
191
+ isWrapped,
192
+ resourceKey,
193
+ apiName: apiEndpoint
194
+ };
195
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, `Updated API pattern for ${apiEndpoint}`, {
196
+ endpoint: apiEndpoint,
197
+ isWrapped,
198
+ resourceKey
199
+ });
200
+ }
201
+ //# sourceMappingURL=responseWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseWrapper.js","sourceRoot":"","sources":["../../src/utils/responseWrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Input Sanitization Utilities
3
+ *
4
+ * Provides secure sanitization functions for user-provided content
5
+ * to prevent injection attacks and ensure data integrity.
6
+ */
7
+ /**
8
+ * Sanitize user-provided text content for safe storage and transmission
9
+ * Removes dangerous HTML tags, script content, and other potentially harmful input
10
+ *
11
+ * @param input - The user input to sanitize
12
+ * @returns Sanitized string safe for storage/transmission
13
+ */
14
+ export declare function sanitizeTextContent(input: string | undefined | null): string;
15
+ /**
16
+ * Validate that sanitized content is not empty after sanitization
17
+ *
18
+ * @param original - Original user input
19
+ * @param sanitized - Sanitized version
20
+ * @returns True if content is valid after sanitization
21
+ */
22
+ export declare function isValidSanitizedContent(original: string | undefined | null, sanitized: string): boolean;
23
+ /**
24
+ * Sanitize and validate comment content
25
+ *
26
+ * @param content - Comment content to sanitize
27
+ * @returns Object with sanitized content and validation result
28
+ */
29
+ export declare function sanitizeCommentContent(content: string | undefined | null): {
30
+ sanitized: string;
31
+ isValid: boolean;
32
+ error?: string;
33
+ };
34
+ /**
35
+ * Sanitize task/project description content
36
+ * Similar to comment content but allows empty descriptions
37
+ *
38
+ * @param description - Task or project description to sanitize
39
+ * @returns Sanitized description or undefined if empty/invalid
40
+ */
41
+ export declare function sanitizeDescription(description: string | undefined | null): string | undefined;
42
+ /**
43
+ * Sanitize task/project name content
44
+ * Names are required and must be non-empty after sanitization
45
+ *
46
+ * @param name - Task or project name to sanitize
47
+ * @returns Sanitized name
48
+ * @throws Error if name is empty or contains invalid content
49
+ */
50
+ export declare function sanitizeName(name: string | undefined | null): string;
51
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAiC5E;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAQvG;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAwBA;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAgBpE"}