motionmcp 2.6.0 → 2.8.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.
- package/README.md +4 -4
- package/dist/handlers/CustomFieldHandler.d.ts.map +1 -1
- package/dist/handlers/CustomFieldHandler.js +18 -2
- package/dist/handlers/CustomFieldHandler.js.map +1 -1
- package/dist/handlers/HandlerFactory.d.ts +0 -5
- package/dist/handlers/HandlerFactory.d.ts.map +1 -1
- package/dist/handlers/HandlerFactory.js +0 -15
- package/dist/handlers/HandlerFactory.js.map +1 -1
- package/dist/handlers/RecurringTaskHandler.d.ts.map +1 -1
- package/dist/handlers/RecurringTaskHandler.js +7 -2
- package/dist/handlers/RecurringTaskHandler.js.map +1 -1
- package/dist/handlers/TaskHandler.d.ts.map +1 -1
- package/dist/handlers/TaskHandler.js +7 -0
- package/dist/handlers/TaskHandler.js.map +1 -1
- package/dist/mcp-server.js +3 -3
- package/dist/mcp-server.js.map +1 -1
- package/dist/services/api/ApiClient.d.ts +22 -0
- package/dist/services/api/ApiClient.d.ts.map +1 -0
- package/dist/services/api/ApiClient.js +198 -0
- package/dist/services/api/ApiClient.js.map +1 -0
- package/dist/services/api/CacheManager.d.ts +21 -0
- package/dist/services/api/CacheManager.d.ts.map +1 -0
- package/dist/services/api/CacheManager.js +25 -0
- package/dist/services/api/CacheManager.js.map +1 -0
- package/dist/services/api/comments.d.ts +8 -0
- package/dist/services/api/comments.d.ts.map +1 -0
- package/dist/services/api/comments.js +86 -0
- package/dist/services/api/comments.js.map +1 -0
- package/dist/services/api/customFields.d.ts +21 -0
- package/dist/services/api/customFields.d.ts.map +1 -0
- package/dist/services/api/customFields.js +277 -0
- package/dist/services/api/customFields.js.map +1 -0
- package/dist/services/api/index.d.ts +22 -0
- package/dist/services/api/index.d.ts.map +1 -0
- package/dist/services/api/index.js +64 -0
- package/dist/services/api/index.js.map +1 -0
- package/dist/services/api/projects.d.ts +18 -0
- package/dist/services/api/projects.d.ts.map +1 -0
- package/dist/services/api/projects.js +346 -0
- package/dist/services/api/projects.js.map +1 -0
- package/dist/services/api/recurringTasks.d.ts +15 -0
- package/dist/services/api/recurringTasks.d.ts.map +1 -0
- package/dist/services/api/recurringTasks.js +143 -0
- package/dist/services/api/recurringTasks.js.map +1 -0
- package/dist/services/api/schedules.d.ts +8 -0
- package/dist/services/api/schedules.d.ts.map +1 -0
- package/dist/services/api/schedules.js +70 -0
- package/dist/services/api/schedules.js.map +1 -0
- package/dist/services/api/search.d.ts +29 -0
- package/dist/services/api/search.d.ts.map +1 -0
- package/dist/services/api/search.js +415 -0
- package/dist/services/api/search.js.map +1 -0
- package/dist/services/api/statuses.d.ts +7 -0
- package/dist/services/api/statuses.d.ts.map +1 -0
- package/dist/services/api/statuses.js +67 -0
- package/dist/services/api/statuses.js.map +1 -0
- package/dist/services/api/tasks.d.ts +34 -0
- package/dist/services/api/tasks.d.ts.map +1 -0
- package/dist/services/api/tasks.js +474 -0
- package/dist/services/api/tasks.js.map +1 -0
- package/dist/services/api/types.d.ts +54 -0
- package/dist/services/api/types.d.ts.map +1 -0
- package/dist/services/api/types.js +9 -0
- package/dist/services/api/types.js.map +1 -0
- package/dist/services/api/users.d.ts +8 -0
- package/dist/services/api/users.d.ts.map +1 -0
- package/dist/services/api/users.js +93 -0
- package/dist/services/api/users.js.map +1 -0
- package/dist/services/api/workspaces.d.ts +7 -0
- package/dist/services/api/workspaces.d.ts.map +1 -0
- package/dist/services/api/workspaces.js +59 -0
- package/dist/services/api/workspaces.js.map +1 -0
- package/dist/services/motionApi.d.ts +34 -180
- package/dist/services/motionApi.d.ts.map +1 -1
- package/dist/services/motionApi.js +84 -2163
- package/dist/services/motionApi.js.map +1 -1
- package/dist/tools/ToolConfigurator.d.ts +1 -7
- package/dist/tools/ToolConfigurator.d.ts.map +1 -1
- package/dist/tools/ToolConfigurator.js +0 -31
- package/dist/tools/ToolConfigurator.js.map +1 -1
- package/dist/tools/ToolDefinitions.js +1 -1
- package/dist/tools/ToolDefinitions.js.map +1 -1
- package/dist/tools/ToolRegistry.d.ts +1 -22
- package/dist/tools/ToolRegistry.d.ts.map +1 -1
- package/dist/tools/ToolRegistry.js +0 -31
- package/dist/tools/ToolRegistry.js.map +1 -1
- package/dist/types/motion.d.ts +0 -7
- package/dist/types/motion.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +0 -8
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +7 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errorHandling.d.ts +0 -12
- package/dist/utils/errorHandling.d.ts.map +1 -1
- package/dist/utils/errorHandling.js +2 -23
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/errors.d.ts +89 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +276 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/parameterUtils.d.ts +10 -0
- package/dist/utils/parameterUtils.d.ts.map +1 -1
- package/dist/utils/parameterUtils.js +61 -5
- package/dist/utils/parameterUtils.js.map +1 -1
- package/dist/utils/responseFormatters.js +16 -16
- package/dist/utils/responseFormatters.js.map +1 -1
- package/dist/utils/serverInstructions.d.ts +2 -0
- package/dist/utils/serverInstructions.d.ts.map +1 -0
- package/dist/utils/serverInstructions.js +21 -0
- package/dist/utils/serverInstructions.js.map +1 -0
- package/dist/utils/userFacingErrors.d.ts +0 -8
- package/dist/utils/userFacingErrors.d.ts.map +1 -1
- package/dist/utils/userFacingErrors.js +0 -19
- package/dist/utils/userFacingErrors.js.map +1 -1
- package/dist/utils/workspaceResolver.js +12 -12
- package/dist/utils/workspaceResolver.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Project resource module — getProjects, getAllProjects, getProject, createProject,
|
|
4
|
+
* updateProject, deleteProject, getProjectByName
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getProjects = getProjects;
|
|
8
|
+
exports.getAllProjects = getAllProjects;
|
|
9
|
+
exports.getProject = getProject;
|
|
10
|
+
exports.createProject = createProject;
|
|
11
|
+
exports.updateProject = updateProject;
|
|
12
|
+
exports.deleteProject = deleteProject;
|
|
13
|
+
exports.getProjectByName = getProjectByName;
|
|
14
|
+
const axios_1 = require("axios");
|
|
15
|
+
const constants_1 = require("../../utils/constants");
|
|
16
|
+
const errors_1 = require("../../utils/errors");
|
|
17
|
+
const logger_1 = require("../../utils/logger");
|
|
18
|
+
const paginationNew_1 = require("../../utils/paginationNew");
|
|
19
|
+
const responseWrapper_1 = require("../../utils/responseWrapper");
|
|
20
|
+
const ApiClient_1 = require("./ApiClient");
|
|
21
|
+
const workspaces_1 = require("./workspaces");
|
|
22
|
+
async function getProjects(ctx, workspaceId, options) {
|
|
23
|
+
const { maxPages = constants_1.LIMITS.MAX_PAGES, limit } = options || {};
|
|
24
|
+
// Validate limit parameter if provided
|
|
25
|
+
if (limit !== undefined && (limit < 0 || !Number.isInteger(limit))) {
|
|
26
|
+
throw new Error('limit must be a non-negative integer');
|
|
27
|
+
}
|
|
28
|
+
const cacheKey = `projects:workspace:${workspaceId}:maxPages:${maxPages ?? 'default'}:limit:${limit ?? 'none'}`;
|
|
29
|
+
// Check cache - return items only (no stale truncation info)
|
|
30
|
+
const cachedItems = ctx.cache.project.get(cacheKey);
|
|
31
|
+
if (cachedItems !== null) {
|
|
32
|
+
return { items: cachedItems };
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching projects from Motion API', {
|
|
36
|
+
method: 'getProjects',
|
|
37
|
+
workspaceId,
|
|
38
|
+
maxPages,
|
|
39
|
+
limit
|
|
40
|
+
});
|
|
41
|
+
// Create a fetch function for potential pagination
|
|
42
|
+
const fetchPage = async (cursor) => {
|
|
43
|
+
const params = new URLSearchParams();
|
|
44
|
+
params.append('workspaceId', workspaceId);
|
|
45
|
+
if (cursor) {
|
|
46
|
+
params.append('cursor', cursor);
|
|
47
|
+
}
|
|
48
|
+
const queryString = params.toString();
|
|
49
|
+
const url = `/projects?${queryString}`;
|
|
50
|
+
return ctx.api.requestWithRetry(() => ctx.api.client.get(url));
|
|
51
|
+
};
|
|
52
|
+
try {
|
|
53
|
+
// Attempt pagination-aware fetch with new response wrapper
|
|
54
|
+
const paginatedResult = await (0, paginationNew_1.fetchAllPages)(fetchPage, 'projects', {
|
|
55
|
+
maxPages,
|
|
56
|
+
logProgress: false,
|
|
57
|
+
...(limit ? { maxItems: limit } : {})
|
|
58
|
+
});
|
|
59
|
+
const projects = paginatedResult.items;
|
|
60
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Projects fetched successfully with pagination', {
|
|
61
|
+
method: 'getProjects',
|
|
62
|
+
totalCount: projects.length,
|
|
63
|
+
hasMore: paginatedResult.hasMore,
|
|
64
|
+
workspaceId
|
|
65
|
+
});
|
|
66
|
+
// Cache only items, not truncation metadata
|
|
67
|
+
ctx.cache.project.set(cacheKey, projects);
|
|
68
|
+
return { items: projects, truncation: paginatedResult.truncation };
|
|
69
|
+
}
|
|
70
|
+
catch (paginationError) {
|
|
71
|
+
// Fallback to simple fetch if pagination fails — results may be incomplete
|
|
72
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Pagination failed, falling back to single-page fetch', {
|
|
73
|
+
method: 'getProjects',
|
|
74
|
+
error: paginationError instanceof Error ? paginationError.message : String(paginationError)
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Use new response wrapper for single page fallback
|
|
78
|
+
const response = await fetchPage();
|
|
79
|
+
const unwrapped = (0, responseWrapper_1.unwrapApiResponse)(response.data, 'projects');
|
|
80
|
+
let projects = unwrapped.data;
|
|
81
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Projects fetched successfully (single page)', {
|
|
82
|
+
method: 'getProjects',
|
|
83
|
+
count: projects.length,
|
|
84
|
+
workspaceId
|
|
85
|
+
});
|
|
86
|
+
// Do not cache fallback results. If pagination failed, this may be only the first page.
|
|
87
|
+
return { items: projects, truncation: { wasTruncated: true, returnedCount: projects.length, reason: 'error' } };
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch projects', {
|
|
91
|
+
method: 'getProjects',
|
|
92
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
93
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
94
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
95
|
+
});
|
|
96
|
+
throw ctx.api.formatApiError(error, 'fetch', 'project');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function getAllProjects(ctx) {
|
|
100
|
+
try {
|
|
101
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching projects from all workspaces', {
|
|
102
|
+
method: 'getAllProjects'
|
|
103
|
+
});
|
|
104
|
+
const allWorkspaces = await (0, workspaces_1.getWorkspaces)(ctx);
|
|
105
|
+
const allProjects = [];
|
|
106
|
+
let aggregateTruncation;
|
|
107
|
+
for (const workspace of allWorkspaces) {
|
|
108
|
+
try {
|
|
109
|
+
const { items, truncation } = await getProjects(ctx, workspace.id);
|
|
110
|
+
allProjects.push(...items);
|
|
111
|
+
aggregateTruncation = ctx.api.mergeTruncationMetadata(aggregateTruncation, truncation);
|
|
112
|
+
}
|
|
113
|
+
catch (workspaceError) {
|
|
114
|
+
// Log error but continue with other workspaces
|
|
115
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Failed to fetch projects from workspace', {
|
|
116
|
+
method: 'getAllProjects',
|
|
117
|
+
workspaceId: workspace.id,
|
|
118
|
+
workspaceName: workspace.name,
|
|
119
|
+
error: (0, ApiClient_1.getErrorMessage)(workspaceError)
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'All projects fetched successfully', {
|
|
124
|
+
method: 'getAllProjects',
|
|
125
|
+
totalProjects: allProjects.length,
|
|
126
|
+
workspaceCount: allWorkspaces.length
|
|
127
|
+
});
|
|
128
|
+
if (aggregateTruncation) {
|
|
129
|
+
aggregateTruncation.returnedCount = allProjects.length;
|
|
130
|
+
}
|
|
131
|
+
return { items: allProjects, truncation: aggregateTruncation };
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch projects from all workspaces', {
|
|
135
|
+
method: 'getAllProjects',
|
|
136
|
+
error: (0, ApiClient_1.getErrorMessage)(error)
|
|
137
|
+
});
|
|
138
|
+
throw ctx.api.formatApiError(error, 'fetch', 'project');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function getProject(ctx, projectId) {
|
|
142
|
+
const cacheKey = `project:${projectId}`;
|
|
143
|
+
return ctx.cache.singleProject.withCache(cacheKey, async () => {
|
|
144
|
+
try {
|
|
145
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching single project from Motion API', {
|
|
146
|
+
method: 'getProject',
|
|
147
|
+
projectId
|
|
148
|
+
});
|
|
149
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.get(`/projects/${projectId}`));
|
|
150
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Successfully fetched project', {
|
|
151
|
+
method: 'getProject',
|
|
152
|
+
projectId,
|
|
153
|
+
projectName: response.data.name
|
|
154
|
+
});
|
|
155
|
+
return response.data;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch project', {
|
|
159
|
+
method: 'getProject',
|
|
160
|
+
projectId,
|
|
161
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
162
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
163
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
164
|
+
});
|
|
165
|
+
throw ctx.api.formatApiError(error, 'fetch', 'project', projectId);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
async function createProject(ctx, projectData) {
|
|
170
|
+
try {
|
|
171
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Creating project in Motion API', {
|
|
172
|
+
method: 'createProject',
|
|
173
|
+
projectName: projectData.name,
|
|
174
|
+
workspaceId: projectData.workspaceId
|
|
175
|
+
});
|
|
176
|
+
if (!projectData.workspaceId) {
|
|
177
|
+
throw new errors_1.UserFacingError('Workspace ID is required to create a project', 'Workspace ID is required to create a project', undefined, undefined, 400);
|
|
178
|
+
}
|
|
179
|
+
// Create minimal payload by removing empty/null values to avoid validation errors
|
|
180
|
+
const minimalPayload = (0, constants_1.createMinimalPayload)(projectData);
|
|
181
|
+
// Debug logging: log the exact payload being sent to API
|
|
182
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'API payload for project creation', {
|
|
183
|
+
method: 'createProject',
|
|
184
|
+
payload: JSON.stringify(minimalPayload, null, 2)
|
|
185
|
+
});
|
|
186
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.post('/projects', minimalPayload));
|
|
187
|
+
// Invalidate cache after successful creation
|
|
188
|
+
ctx.cache.project.invalidate(`projects:workspace:${projectData.workspaceId}`);
|
|
189
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Project created successfully', {
|
|
190
|
+
method: 'createProject',
|
|
191
|
+
projectId: response.data.id,
|
|
192
|
+
projectName: response.data.name
|
|
193
|
+
});
|
|
194
|
+
return response.data;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to create project', {
|
|
198
|
+
method: 'createProject',
|
|
199
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
200
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
201
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined,
|
|
202
|
+
fullErrorResponse: (0, axios_1.isAxiosError)(error) ? JSON.stringify(error.response?.data, null, 2) : undefined
|
|
203
|
+
});
|
|
204
|
+
throw ctx.api.formatApiError(error, 'create', 'project', undefined, projectData.name);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Note: Project update/delete are not in the public API docs but appear to be functional
|
|
208
|
+
async function updateProject(ctx, projectId, updates) {
|
|
209
|
+
try {
|
|
210
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Updating project in Motion API', {
|
|
211
|
+
method: 'updateProject',
|
|
212
|
+
projectId,
|
|
213
|
+
updates: Object.keys(updates)
|
|
214
|
+
});
|
|
215
|
+
// Create minimal payload by removing empty/null values to avoid validation errors
|
|
216
|
+
const minimalUpdates = (0, constants_1.createMinimalPayload)(updates);
|
|
217
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.patch(`/projects/${projectId}`, minimalUpdates));
|
|
218
|
+
// Invalidate cache after successful update
|
|
219
|
+
ctx.cache.project.invalidate(`projects:workspace:${response.data.workspaceId}`);
|
|
220
|
+
ctx.cache.singleProject.invalidate(`project:${projectId}`);
|
|
221
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Project updated successfully', {
|
|
222
|
+
method: 'updateProject',
|
|
223
|
+
projectId,
|
|
224
|
+
projectName: response.data.name
|
|
225
|
+
});
|
|
226
|
+
return response.data;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to update project', {
|
|
230
|
+
method: 'updateProject',
|
|
231
|
+
projectId,
|
|
232
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
233
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
234
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
235
|
+
});
|
|
236
|
+
throw ctx.api.formatApiError(error, 'update', 'project', projectId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Note: Project delete is not in the public API docs but appears to be functional
|
|
240
|
+
async function deleteProject(ctx, projectId) {
|
|
241
|
+
try {
|
|
242
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Deleting project from Motion API', {
|
|
243
|
+
method: 'deleteProject',
|
|
244
|
+
projectId
|
|
245
|
+
});
|
|
246
|
+
await ctx.api.requestWithRetry(() => ctx.api.client.delete(`/projects/${projectId}`));
|
|
247
|
+
// Invalidate all project caches since we don't know the workspace ID
|
|
248
|
+
ctx.cache.project.invalidate();
|
|
249
|
+
ctx.cache.singleProject.invalidate(`project:${projectId}`);
|
|
250
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Project deleted successfully', {
|
|
251
|
+
method: 'deleteProject',
|
|
252
|
+
projectId
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to delete project', {
|
|
257
|
+
method: 'deleteProject',
|
|
258
|
+
projectId,
|
|
259
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
260
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
261
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
262
|
+
});
|
|
263
|
+
throw ctx.api.formatApiError(error, 'delete', 'project', projectId);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async function getProjectByName(ctx, projectName, workspaceId) {
|
|
267
|
+
try {
|
|
268
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Finding project by name', {
|
|
269
|
+
method: 'getProjectByName',
|
|
270
|
+
projectName,
|
|
271
|
+
workspaceId
|
|
272
|
+
});
|
|
273
|
+
// First, search in the specified workspace (if provided)
|
|
274
|
+
if (workspaceId) {
|
|
275
|
+
const { items: projects } = await getProjects(ctx, workspaceId);
|
|
276
|
+
const project = projects.find(p => p.name === projectName);
|
|
277
|
+
if (project) {
|
|
278
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Project found by name in specified workspace', {
|
|
279
|
+
method: 'getProjectByName',
|
|
280
|
+
projectName,
|
|
281
|
+
projectId: project.id,
|
|
282
|
+
workspaceId
|
|
283
|
+
});
|
|
284
|
+
return project;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// If not found in specified workspace (or none specified), search across all other workspaces
|
|
288
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Project not found in specified workspace, searching all workspaces', {
|
|
289
|
+
method: 'getProjectByName',
|
|
290
|
+
projectName,
|
|
291
|
+
specifiedWorkspaceId: workspaceId
|
|
292
|
+
});
|
|
293
|
+
const allWorkspaces = await (0, workspaces_1.getWorkspaces)(ctx);
|
|
294
|
+
const otherWorkspaces = allWorkspaces.filter(w => w.id !== workspaceId);
|
|
295
|
+
for (const workspace of otherWorkspaces) {
|
|
296
|
+
try {
|
|
297
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Searching workspace for project', {
|
|
298
|
+
method: 'getProjectByName',
|
|
299
|
+
projectName,
|
|
300
|
+
searchingWorkspaceId: workspace.id,
|
|
301
|
+
searchingWorkspaceName: workspace.name
|
|
302
|
+
});
|
|
303
|
+
const { items: workspaceProjects } = await getProjects(ctx, workspace.id);
|
|
304
|
+
const foundProject = workspaceProjects.find(p => p.name === projectName);
|
|
305
|
+
if (foundProject) {
|
|
306
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Project found by name in different workspace', {
|
|
307
|
+
method: 'getProjectByName',
|
|
308
|
+
projectName,
|
|
309
|
+
projectId: foundProject.id,
|
|
310
|
+
foundInWorkspaceId: workspace.id,
|
|
311
|
+
foundInWorkspaceName: workspace.name,
|
|
312
|
+
originalWorkspaceId: workspaceId
|
|
313
|
+
});
|
|
314
|
+
return foundProject;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (workspaceError) {
|
|
318
|
+
// Log error but continue searching other workspaces
|
|
319
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Failed to search workspace for project', {
|
|
320
|
+
method: 'getProjectByName',
|
|
321
|
+
projectName,
|
|
322
|
+
workspaceId: workspace.id,
|
|
323
|
+
workspaceName: workspace.name,
|
|
324
|
+
error: (0, ApiClient_1.getErrorMessage)(workspaceError)
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Project not found in any workspace
|
|
329
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Project not found by name in any workspace', {
|
|
330
|
+
method: 'getProjectByName',
|
|
331
|
+
projectName,
|
|
332
|
+
searchedWorkspaces: [workspaceId, ...otherWorkspaces.map(w => w.id)],
|
|
333
|
+
totalWorkspacesSearched: allWorkspaces.length
|
|
334
|
+
});
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to find project by name', {
|
|
339
|
+
method: 'getProjectByName',
|
|
340
|
+
projectName,
|
|
341
|
+
error: (0, ApiClient_1.getErrorMessage)(error)
|
|
342
|
+
});
|
|
343
|
+
throw error;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/services/api/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recurring task resource module — getRecurringTasks, createRecurringTask, deleteRecurringTask
|
|
3
|
+
*/
|
|
4
|
+
import { MotionRecurringTask, CreateRecurringTaskData } from '../../types/motion';
|
|
5
|
+
import { ListResult } from '../../types/mcp';
|
|
6
|
+
import { ResourceContext } from './types';
|
|
7
|
+
export declare function getRecurringTasks(ctx: ResourceContext, workspaceId?: string, options?: {
|
|
8
|
+
maxPages?: number;
|
|
9
|
+
limit?: number;
|
|
10
|
+
}): Promise<ListResult<MotionRecurringTask>>;
|
|
11
|
+
export declare function createRecurringTask(ctx: ResourceContext, taskData: CreateRecurringTaskData): Promise<MotionRecurringTask>;
|
|
12
|
+
export declare function deleteRecurringTask(ctx: ResourceContext, recurringTaskId: string): Promise<{
|
|
13
|
+
success: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=recurringTasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurringTasks.d.ts","sourceRoot":"","sources":["../../../src/services/api/recurringTasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAIlF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,eAAe,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CA0D1C;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuD/H;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8BtH"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Recurring task resource module — getRecurringTasks, createRecurringTask, deleteRecurringTask
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getRecurringTasks = getRecurringTasks;
|
|
7
|
+
exports.createRecurringTask = createRecurringTask;
|
|
8
|
+
exports.deleteRecurringTask = deleteRecurringTask;
|
|
9
|
+
const axios_1 = require("axios");
|
|
10
|
+
const constants_1 = require("../../utils/constants");
|
|
11
|
+
const logger_1 = require("../../utils/logger");
|
|
12
|
+
const paginationNew_1 = require("../../utils/paginationNew");
|
|
13
|
+
const frequencyTransform_1 = require("../../utils/frequencyTransform");
|
|
14
|
+
const ApiClient_1 = require("./ApiClient");
|
|
15
|
+
async function getRecurringTasks(ctx, workspaceId, options) {
|
|
16
|
+
const { maxPages = constants_1.LIMITS.MAX_PAGES, limit } = options || {};
|
|
17
|
+
const cacheKey = workspaceId ? `recurring-tasks:workspace:${workspaceId}` : 'recurring-tasks:all';
|
|
18
|
+
// Check cache - return items only (no stale truncation info)
|
|
19
|
+
const cachedItems = ctx.cache.recurringTask.get(cacheKey);
|
|
20
|
+
if (cachedItems !== null) {
|
|
21
|
+
return { items: cachedItems };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching recurring tasks from Motion API with pagination', {
|
|
25
|
+
method: 'getRecurringTasks',
|
|
26
|
+
workspaceId,
|
|
27
|
+
maxPages,
|
|
28
|
+
limit
|
|
29
|
+
});
|
|
30
|
+
// Create a fetch function for pagination utility
|
|
31
|
+
const fetchPage = async (cursor) => {
|
|
32
|
+
const params = new URLSearchParams();
|
|
33
|
+
if (workspaceId)
|
|
34
|
+
params.append('workspaceId', workspaceId);
|
|
35
|
+
if (cursor)
|
|
36
|
+
params.append('cursor', cursor);
|
|
37
|
+
const queryString = params.toString();
|
|
38
|
+
const url = queryString ? `/recurring-tasks?${queryString}` : '/recurring-tasks';
|
|
39
|
+
return ctx.api.requestWithRetry(() => ctx.api.client.get(url));
|
|
40
|
+
};
|
|
41
|
+
// Use pagination utility to fetch all pages
|
|
42
|
+
const paginatedResult = await (0, paginationNew_1.fetchAllPages)(fetchPage, 'recurring-tasks', {
|
|
43
|
+
maxPages,
|
|
44
|
+
logProgress: true,
|
|
45
|
+
...(limit ? { maxItems: limit } : {})
|
|
46
|
+
});
|
|
47
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Recurring tasks fetched successfully with pagination', {
|
|
48
|
+
method: 'getRecurringTasks',
|
|
49
|
+
totalCount: paginatedResult.totalFetched,
|
|
50
|
+
pagesProcessed: Math.ceil(paginatedResult.totalFetched / constants_1.LIMITS.DEFAULT_PAGE_SIZE),
|
|
51
|
+
hasMore: paginatedResult.hasMore,
|
|
52
|
+
workspaceId
|
|
53
|
+
});
|
|
54
|
+
// Cache only items, not truncation metadata
|
|
55
|
+
ctx.cache.recurringTask.set(cacheKey, paginatedResult.items);
|
|
56
|
+
return { items: paginatedResult.items, truncation: paginatedResult.truncation };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch recurring tasks', {
|
|
60
|
+
method: 'getRecurringTasks',
|
|
61
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
62
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
63
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined,
|
|
64
|
+
workspaceId
|
|
65
|
+
});
|
|
66
|
+
throw ctx.api.formatApiError(error, 'fetch', 'recurring task');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function createRecurringTask(ctx, taskData) {
|
|
70
|
+
try {
|
|
71
|
+
// Validate frequency object before transformation
|
|
72
|
+
const freqValidation = (0, frequencyTransform_1.validateFrequencyObject)(taskData.frequency);
|
|
73
|
+
if (!freqValidation.valid) {
|
|
74
|
+
throw new Error(`Invalid frequency object: ${freqValidation.reason || 'Unknown reason'}`);
|
|
75
|
+
}
|
|
76
|
+
// Transform frequency object to API string format
|
|
77
|
+
const frequencyString = (0, frequencyTransform_1.transformFrequencyToApiString)(taskData.frequency);
|
|
78
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Creating recurring task in Motion API', {
|
|
79
|
+
method: 'createRecurringTask',
|
|
80
|
+
name: taskData.name,
|
|
81
|
+
assigneeId: taskData.assigneeId,
|
|
82
|
+
frequency: frequencyString,
|
|
83
|
+
originalFrequency: taskData.frequency,
|
|
84
|
+
workspaceId: taskData.workspaceId
|
|
85
|
+
});
|
|
86
|
+
// Build API payload: extract endDate from frequency object to top-level,
|
|
87
|
+
// replace frequency object with transformed string
|
|
88
|
+
const { frequency: _freqObj, ...restTaskData } = taskData;
|
|
89
|
+
const apiPayload = {
|
|
90
|
+
...restTaskData,
|
|
91
|
+
frequency: frequencyString,
|
|
92
|
+
...(taskData.frequency.endDate && { endDate: taskData.frequency.endDate })
|
|
93
|
+
};
|
|
94
|
+
// Create minimal payload by removing empty/null values to avoid validation errors
|
|
95
|
+
const minimalPayload = (0, constants_1.createMinimalPayload)(apiPayload);
|
|
96
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.post('/recurring-tasks', minimalPayload));
|
|
97
|
+
// Invalidate cache after successful creation
|
|
98
|
+
ctx.cache.recurringTask.invalidate('recurring-tasks:');
|
|
99
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Recurring task created successfully', {
|
|
100
|
+
method: 'createRecurringTask',
|
|
101
|
+
taskId: response.data?.id,
|
|
102
|
+
name: taskData.name
|
|
103
|
+
});
|
|
104
|
+
return response.data;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to create recurring task', {
|
|
108
|
+
method: 'createRecurringTask',
|
|
109
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
110
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
111
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined,
|
|
112
|
+
taskName: taskData?.name
|
|
113
|
+
});
|
|
114
|
+
throw ctx.api.formatApiError(error, 'create', 'recurring task', undefined, taskData.name);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function deleteRecurringTask(ctx, recurringTaskId) {
|
|
118
|
+
try {
|
|
119
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Deleting recurring task from Motion API', {
|
|
120
|
+
method: 'deleteRecurringTask',
|
|
121
|
+
recurringTaskId
|
|
122
|
+
});
|
|
123
|
+
await ctx.api.requestWithRetry(() => ctx.api.client.delete(`/recurring-tasks/${recurringTaskId}`));
|
|
124
|
+
// Invalidate cache after successful deletion
|
|
125
|
+
ctx.cache.recurringTask.invalidate('recurring-tasks:');
|
|
126
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Recurring task deleted successfully', {
|
|
127
|
+
method: 'deleteRecurringTask',
|
|
128
|
+
recurringTaskId
|
|
129
|
+
});
|
|
130
|
+
return { success: true };
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to delete recurring task', {
|
|
134
|
+
method: 'deleteRecurringTask',
|
|
135
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
136
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
137
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined,
|
|
138
|
+
recurringTaskId
|
|
139
|
+
});
|
|
140
|
+
throw ctx.api.formatApiError(error, 'delete', 'recurring task', recurringTaskId);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=recurringTasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurringTasks.js","sourceRoot":"","sources":["../../../src/services/api/recurringTasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule resource module — getSchedules, getAvailableScheduleNames
|
|
3
|
+
*/
|
|
4
|
+
import { MotionSchedule } from '../../types/motion';
|
|
5
|
+
import { ResourceContext } from './types';
|
|
6
|
+
export declare function getSchedules(ctx: ResourceContext): Promise<MotionSchedule[]>;
|
|
7
|
+
export declare function getAvailableScheduleNames(ctx: ResourceContext, workspaceId?: string): Promise<string[]>;
|
|
8
|
+
//# sourceMappingURL=schedules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedules.d.ts","sourceRoot":"","sources":["../../../src/services/api/schedules.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAgB,MAAM,oBAAoB,CAAC;AAIlE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwClF;AAED,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0B7G"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Schedule resource module — getSchedules, getAvailableScheduleNames
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getSchedules = getSchedules;
|
|
7
|
+
exports.getAvailableScheduleNames = getAvailableScheduleNames;
|
|
8
|
+
const axios_1 = require("axios");
|
|
9
|
+
const constants_1 = require("../../utils/constants");
|
|
10
|
+
const logger_1 = require("../../utils/logger");
|
|
11
|
+
const motion_1 = require("../../schemas/motion");
|
|
12
|
+
const ApiClient_1 = require("./ApiClient");
|
|
13
|
+
async function getSchedules(ctx) {
|
|
14
|
+
const cacheKey = 'schedules:all';
|
|
15
|
+
return ctx.cache.schedule.withCache(cacheKey, async () => {
|
|
16
|
+
try {
|
|
17
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching schedules from Motion API', {
|
|
18
|
+
method: 'getSchedules'
|
|
19
|
+
});
|
|
20
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.get('/schedules'));
|
|
21
|
+
// Validate response against schema
|
|
22
|
+
const validatedResponse = ctx.api.validateResponse(response.data, motion_1.SchedulesListResponseSchema, 'getSchedules');
|
|
23
|
+
// Handle both wrapped and unwrapped responses
|
|
24
|
+
const schedules = Array.isArray(validatedResponse)
|
|
25
|
+
? validatedResponse
|
|
26
|
+
: validatedResponse.schedules || [];
|
|
27
|
+
const schedulesArray = Array.isArray(schedules) ? schedules : [];
|
|
28
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Schedules fetched successfully', {
|
|
29
|
+
method: 'getSchedules',
|
|
30
|
+
count: schedulesArray.length
|
|
31
|
+
});
|
|
32
|
+
return schedulesArray;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch schedules', {
|
|
36
|
+
method: 'getSchedules',
|
|
37
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
38
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
39
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
40
|
+
});
|
|
41
|
+
throw ctx.api.formatApiError(error, 'fetch', 'schedule');
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async function getAvailableScheduleNames(ctx, workspaceId) {
|
|
46
|
+
try {
|
|
47
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching available schedule names', {
|
|
48
|
+
method: 'getAvailableScheduleNames',
|
|
49
|
+
workspaceId
|
|
50
|
+
});
|
|
51
|
+
// Fetch all schedules without filters to get available schedule templates
|
|
52
|
+
const schedules = await getSchedules(ctx);
|
|
53
|
+
const scheduleNames = schedules.map(schedule => schedule.name).filter(Boolean);
|
|
54
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Available schedule names fetched successfully', {
|
|
55
|
+
method: 'getAvailableScheduleNames',
|
|
56
|
+
count: scheduleNames.length,
|
|
57
|
+
scheduleNames
|
|
58
|
+
});
|
|
59
|
+
return scheduleNames;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch available schedule names', {
|
|
63
|
+
method: 'getAvailableScheduleNames',
|
|
64
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
65
|
+
workspaceId
|
|
66
|
+
});
|
|
67
|
+
throw ctx.api.formatApiError(error, 'fetch', 'schedule');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedules.js","sourceRoot":"","sources":["../../../src/services/api/schedules.ts"],"names":[],"mappings":"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"}
|