motionmcp 2.2.2 → 2.2.3

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.
@@ -1,168 +0,0 @@
1
- "use strict";
2
- /**
3
- * Pagination Utilities - Shared pagination logic for Motion API calls
4
- *
5
- * Provides utilities to handle cursor-based and offset-based pagination
6
- * consistently across all API endpoints.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.fetchAllPages = fetchAllPages;
10
- exports.fetchInBatches = fetchInBatches;
11
- exports.hasMorePages = hasMorePages;
12
- exports.getPaginationInfo = getPaginationInfo;
13
- const logger_1 = require("./logger");
14
- const constants_1 = require("./constants");
15
- /**
16
- * Generic cursor-based pagination handler
17
- * Automatically fetches all pages or up to maxPages limit
18
- */
19
- async function fetchAllPages(fetchPage, options = {}) {
20
- const { maxPages = 10, logProgress = true } = options;
21
- let allItems = [];
22
- let cursor;
23
- let pageCount = 0;
24
- let hasMore = true;
25
- // Infinite loop protection - ensure we never fetch more than absolute max pages
26
- const absoluteMaxPages = Math.min(maxPages, 50); // Hard limit to prevent infinite loops
27
- while (hasMore && pageCount < absoluteMaxPages) {
28
- try {
29
- if (logProgress && pageCount > 0) {
30
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, `Fetching page ${pageCount + 1}`, { cursor });
31
- }
32
- const response = await fetchPage(cursor);
33
- const data = response.data;
34
- // Extract items from various possible response structures
35
- const pageItems = extractItemsFromResponse(data);
36
- // Enforce page size limit to prevent memory exhaustion
37
- if (pageItems.length > constants_1.LIMITS.MAX_PAGE_SIZE) {
38
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Page size ${pageItems.length} exceeds maximum allowed ${constants_1.LIMITS.MAX_PAGE_SIZE}, truncating`, {
39
- pageNumber: pageCount + 1,
40
- originalSize: pageItems.length,
41
- truncatedSize: constants_1.LIMITS.MAX_PAGE_SIZE
42
- });
43
- pageItems.splice(constants_1.LIMITS.MAX_PAGE_SIZE); // Truncate to limit
44
- }
45
- allItems = allItems.concat(pageItems);
46
- // Update pagination state
47
- const newCursor = data.meta?.nextCursor;
48
- // Infinite loop protection: If cursor doesn't change, break
49
- if (cursor && newCursor === cursor) {
50
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Pagination cursor not advancing - breaking to prevent infinite loop', {
51
- cursor,
52
- pageCount,
53
- itemsCount: pageItems.length
54
- });
55
- break;
56
- }
57
- cursor = newCursor;
58
- hasMore = !!cursor && pageItems.length > 0;
59
- pageCount++;
60
- if (logProgress) {
61
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, `Page ${pageCount} fetched`, {
62
- pageItems: pageItems.length,
63
- totalItems: allItems.length,
64
- hasMore,
65
- nextCursor: cursor
66
- });
67
- }
68
- }
69
- catch (error) {
70
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, `Pagination failed on page ${pageCount + 1}`, {
71
- error: error instanceof Error ? error.message : String(error),
72
- cursor
73
- });
74
- // Return what we have so far
75
- break;
76
- }
77
- }
78
- if (pageCount >= absoluteMaxPages && hasMore) {
79
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Reached maximum page limit (${absoluteMaxPages})`, {
80
- totalFetched: allItems.length,
81
- finalCursor: cursor
82
- });
83
- }
84
- return {
85
- items: allItems,
86
- nextCursor: cursor,
87
- hasMore,
88
- totalFetched: allItems.length
89
- };
90
- }
91
- /**
92
- * Extract items from various API response structures
93
- * Handles the different ways Motion API can structure responses
94
- */
95
- function extractItemsFromResponse(data) {
96
- // Try different possible array locations
97
- if (data.tasks && Array.isArray(data.tasks))
98
- return data.tasks;
99
- if (data.projects && Array.isArray(data.projects))
100
- return data.projects;
101
- if (data.users && Array.isArray(data.users))
102
- return data.users;
103
- if (data.comments && Array.isArray(data.comments))
104
- return data.comments;
105
- if (data.customFields && Array.isArray(data.customFields))
106
- return data.customFields;
107
- if (data.recurringTasks && Array.isArray(data.recurringTasks))
108
- return data.recurringTasks;
109
- if (data.schedules && Array.isArray(data.schedules))
110
- return data.schedules;
111
- if (data.statuses && Array.isArray(data.statuses))
112
- return data.statuses;
113
- if (data.items && Array.isArray(data.items))
114
- return data.items;
115
- // Fallback: if data itself is an array
116
- if (Array.isArray(data))
117
- return data;
118
- // No items found
119
- return [];
120
- }
121
- async function fetchInBatches(fetchBatch, params, options = {}) {
122
- const { batchSize = 100, maxBatches = 10, delayMs = 100 } = options;
123
- let allItems = [];
124
- let offset = 0;
125
- let batchCount = 0;
126
- let hasMore = true;
127
- while (hasMore && batchCount < maxBatches) {
128
- try {
129
- const batchItems = await fetchBatch(params, offset, batchSize);
130
- if (batchItems.length === 0) {
131
- hasMore = false;
132
- }
133
- else {
134
- allItems = allItems.concat(batchItems);
135
- offset += batchSize;
136
- batchCount++;
137
- // Small delay to be API-friendly
138
- if (delayMs > 0 && hasMore) {
139
- await new Promise(resolve => setTimeout(resolve, delayMs));
140
- }
141
- // If we got fewer items than batch size, we've reached the end
142
- if (batchItems.length < batchSize) {
143
- hasMore = false;
144
- }
145
- }
146
- }
147
- catch (error) {
148
- (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, `Batch fetch failed at offset ${offset}`, {
149
- error: error instanceof Error ? error.message : String(error)
150
- });
151
- break;
152
- }
153
- }
154
- return allItems;
155
- }
156
- /**
157
- * Check if a response indicates more pages are available
158
- */
159
- function hasMorePages(response) {
160
- return !!(response.meta?.nextCursor || response.meta?.hasMore);
161
- }
162
- /**
163
- * Get pagination info from response
164
- */
165
- function getPaginationInfo(response) {
166
- return response.meta || null;
167
- }
168
- //# sourceMappingURL=pagination.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"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"}