@verygoodplugins/mcp-freescout 1.4.0 → 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.
package/TESTING.md ADDED
@@ -0,0 +1,98 @@
1
+ # Testing Strategy for mcp-freescout
2
+
3
+ ## Current MCP Testing Best Practices (2026)
4
+
5
+ Based on research and the MCP community standards:
6
+
7
+ 1. **Unit Tests**: Test business logic in isolation (API calls, data transformations)
8
+ 2. **Integration Tests**: Validate tool schemas, input/output structures, and MCP protocol compliance
9
+ 3. **Manual Testing**: Use MCP Inspector or direct client testing for end-to-end validation
10
+ 4. **Schema Validation**: Leverage Zod for runtime type safety
11
+
12
+ ## Test Suite Structure
13
+
14
+ ### ✅ Implemented
15
+
16
+ - **MCP Server Tool Patterns** (`src/__tests__/mcp-server.test.ts`)
17
+ - Tool registration with Zod schemas
18
+ - Input validation (enums, ranges, email format)
19
+ - Error handling patterns
20
+ - Response formatting (structured content + text content)
21
+ - Dynamic tool behavior (enable/disable, schema updates)
22
+ - 16 passing tests
23
+
24
+ - **FreeScout API Tests** (`src/__tests__/freescout-api.test.ts`)
25
+ - API client initialization
26
+ - Conversation fetching with retry logic
27
+ - Search with explicit filters
28
+ - Update operations
29
+ - Schema validation (Conversation, Thread, Customer)
30
+ - URL parsing
31
+ - Error recovery (malformed JSON, network timeouts)
32
+ - Markdown to HTML conversion
33
+
34
+ ### Known Issue: Jest Memory Consumption
35
+
36
+ The test suite encounters memory issues when running both test files together due to:
37
+
38
+ - ESM module transformation overhead (node-fetch, MCP SDK)
39
+ - TypeScript compilation in Jest
40
+ - Large dependency tree
41
+
42
+ **Workaround**: Tests are configured to run serially (`maxWorkers: 1`) with increased memory limits.
43
+
44
+ ## Manual Testing with MCP Inspector
45
+
46
+ For comprehensive end-to-end testing, use the MCP Inspector:
47
+
48
+ ```bash
49
+ # Install MCP Inspector (if not already installed)
50
+ npm install -g @modelcontextprotocol/inspector
51
+
52
+ # Test the server
53
+ npx @modelcontextprotocol/inspector node dist/index.js
54
+ ```
55
+
56
+ This allows you to:
57
+
58
+ - Discover all available tools
59
+ - Test tool calls with various inputs
60
+ - Validate responses without involving an LLM
61
+ - Debug error handling and edge cases
62
+
63
+ ## Testing Checklist Before Release
64
+
65
+ - [x] Build succeeds (`npm run build`)
66
+ - [x] Linter passes (`npm run lint`)
67
+ - [x] Format check passes (`npm run format:check`)
68
+ - [x] Unit tests pass (MCP server patterns)
69
+ - [ ] Integration tests pass (FreeScout API - memory issue)
70
+ - [ ] Manual testing with MCP Inspector
71
+ - [ ] Test with actual FreeScout instance
72
+ - [ ] Verify all tools work as expected in Claude Desktop
73
+
74
+ ## CI/CD Testing
75
+
76
+ The GitHub Actions workflow runs:
77
+
78
+ - `npm run build`
79
+ - `npm test` (with `--passWithNoTests` flag to handle memory issues gracefully)
80
+ - `npm run lint`
81
+
82
+ ## Future Improvements
83
+
84
+ 1. **Split test files**: Separate API tests from MCP tests to reduce memory pressure
85
+ 2. **Mock dependencies**: Use lighter mocks for node-fetch and MCP SDK
86
+ 3. **E2E test suite**: Dedicated integration tests with real FreeScout sandbox
87
+ 4. **Performance tests**: Validate retry logic and rate limiting behavior
88
+ 5. **Snapshot tests**: Ensure tool schemas remain stable across versions
89
+
90
+ ## Testing Philosophy
91
+
92
+ Following MCP best practices from 2026:
93
+
94
+ - **Test in isolation first**: Validate server logic without LLM involvement
95
+ - **Schema-driven**: Use Zod for both runtime validation and test assertions
96
+ - **Error-first**: Ensure clear error messages for debugging
97
+ - **Concise responses**: Keep tool outputs focused and token-efficient
98
+ - **Real-world scenarios**: Test with actual ticket data patterns
@@ -1,12 +1,32 @@
1
- import type { FreeScoutConversation, FreeScoutApiResponse, FreeScoutThread } from './types.js';
1
+ import type { FreeScoutConversation, FreeScoutApiResponse, FreeScoutThread, SearchFilters } from './types.js';
2
+ interface RetryOptions {
3
+ maxRetries?: number;
4
+ initialDelay?: number;
5
+ maxDelay?: number;
6
+ timeout?: number;
7
+ }
2
8
  export declare class FreeScoutAPI {
3
9
  private baseUrl;
4
10
  private apiKey;
5
- constructor(baseUrl: string, apiKey: string);
11
+ private retryOptions;
12
+ constructor(baseUrl: string, apiKey: string, retryOptions?: RetryOptions);
13
+ /**
14
+ * Parse relative time strings like "7d", "24h", "30m" to ISO date
15
+ */
16
+ private parseRelativeTime;
17
+ /**
18
+ * Exponential backoff retry logic with jitter
19
+ */
20
+ private sleep;
21
+ private retryWithBackoff;
6
22
  /**
7
23
  * Convert Markdown formatting to HTML for FreeScout
8
24
  */
9
25
  private markdownToHtml;
26
+ private escapeHtml;
27
+ private looksLikeHtml;
28
+ private containsMarkdownSyntax;
29
+ private formatForFreeScoutEditor;
10
30
  private request;
11
31
  getConversation(ticketId: string, includeThreads?: boolean): Promise<FreeScoutConversation>;
12
32
  addThread(ticketId: string, type: 'note' | 'message' | 'customer', text: string, userId?: number, state?: 'draft' | 'published'): Promise<FreeScoutThread>;
@@ -16,10 +36,18 @@ export declare class FreeScoutAPI {
16
36
  assignTo?: number;
17
37
  byUser?: number;
18
38
  }): Promise<FreeScoutConversation>;
19
- searchConversations(query: string, status?: string, state?: string, mailboxId?: number): Promise<FreeScoutApiResponse<FreeScoutConversation>>;
39
+ /**
40
+ * Search conversations with explicit filter parameters
41
+ */
42
+ searchConversations(filters: SearchFilters): Promise<FreeScoutApiResponse<FreeScoutConversation>>;
43
+ /**
44
+ * @deprecated Use searchConversations with SearchFilters instead
45
+ */
46
+ searchConversationsLegacy(query: string, status?: string, state?: string, mailboxId?: number): Promise<FreeScoutApiResponse<FreeScoutConversation>>;
20
47
  listConversations(status?: string, state?: string, assignee?: string | null): Promise<FreeScoutApiResponse<FreeScoutConversation>>;
21
- getMailboxes(): Promise<any>;
48
+ getMailboxes(): Promise<unknown>;
22
49
  extractTicketIdFromUrl(url: string): string | null;
23
50
  parseTicketInput(input: string): string;
24
51
  }
52
+ export {};
25
53
  //# sourceMappingURL=freescout-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"freescout-api.d.ts","sourceRoot":"","sources":["../src/freescout-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK3C;;OAEG;IACH,OAAO,CAAC,cAAc;YAgIR,OAAO;IA6Bf,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,OAAc,GAC7B,OAAO,CAAC,qBAAqB,CAAC;IAO3B,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,EACrC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,GAC5B,OAAO,CAAC,eAAe,CAAC;IAqBrB,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC;IAMrB,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,OAAO,CAAC,qBAAqB,CAAC;IAQ3B,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;IAiCjD,iBAAiB,CACrB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;IAiBjD,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IAIlC,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQlD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAoBxC"}
1
+ {"version":3,"file":"freescout-api.d.ts","sourceRoot":"","sources":["../src/freescout-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAyB;gBAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY;IAWxE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;OAEG;YACW,KAAK;YAIL,gBAAgB;IA+B9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAkItB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,wBAAwB;YAMlB,OAAO;IAqDf,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,OAAc,GAC7B,OAAO,CAAC,qBAAqB,CAAC;IAK3B,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,EACrC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,GAC5B,OAAO,CAAC,eAAe,CAAC;IAuBrB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI1F,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,OAAO,CAAC,qBAAqB,CAAC;IAIjC;;OAEG;IACG,mBAAmB,CACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;IA+DvD;;OAEG;IACG,yBAAyB,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;IAkBjD,iBAAiB,CACrB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;IAiBjD,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAItC,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQlD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAoBxC"}
@@ -1,17 +1,77 @@
1
- import fetch from 'node-fetch';
2
1
  export class FreeScoutAPI {
3
2
  baseUrl;
4
3
  apiKey;
5
- constructor(baseUrl, apiKey) {
4
+ retryOptions;
5
+ constructor(baseUrl, apiKey, retryOptions) {
6
6
  this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
7
7
  this.apiKey = apiKey;
8
+ this.retryOptions = {
9
+ maxRetries: retryOptions?.maxRetries ?? 3,
10
+ initialDelay: retryOptions?.initialDelay ?? 1000,
11
+ maxDelay: retryOptions?.maxDelay ?? 10000,
12
+ timeout: retryOptions?.timeout ?? 30000,
13
+ };
14
+ }
15
+ /**
16
+ * Parse relative time strings like "7d", "24h", "30m" to ISO date
17
+ */
18
+ parseRelativeTime(relative) {
19
+ const match = relative.match(/^(\d+)([dhm])$/);
20
+ if (!match)
21
+ return null;
22
+ const value = Number.parseInt(match[1], 10);
23
+ if (!Number.isFinite(value) || value <= 0 || value > 10000) {
24
+ return null;
25
+ }
26
+ const unit = match[2];
27
+ const now = new Date();
28
+ switch (unit) {
29
+ case 'd':
30
+ now.setDate(now.getDate() - value);
31
+ break;
32
+ case 'h':
33
+ now.setHours(now.getHours() - value);
34
+ break;
35
+ case 'm':
36
+ now.setMinutes(now.getMinutes() - value);
37
+ break;
38
+ }
39
+ return now.toISOString();
40
+ }
41
+ /**
42
+ * Exponential backoff retry logic with jitter
43
+ */
44
+ async sleep(ms) {
45
+ return new Promise((resolve) => setTimeout(resolve, ms));
46
+ }
47
+ async retryWithBackoff(fn, retryCount = 0) {
48
+ try {
49
+ return await fn();
50
+ }
51
+ catch (error) {
52
+ const message = error instanceof Error ? error.message : String(error);
53
+ const isRetryable = message.includes('ECONNRESET') ||
54
+ message.includes('ETIMEDOUT') ||
55
+ message.includes('429') ||
56
+ message.includes('503') ||
57
+ message.includes('502');
58
+ if (!isRetryable || retryCount >= this.retryOptions.maxRetries) {
59
+ throw error;
60
+ }
61
+ // Exponential backoff with jitter
62
+ const delay = Math.min(this.retryOptions.initialDelay * Math.pow(2, retryCount) + Math.random() * 1000, this.retryOptions.maxDelay);
63
+ console.error(`[FreeScout API] Retry ${retryCount + 1}/${this.retryOptions.maxRetries} after ${Math.round(delay)}ms. Error: ${message}`);
64
+ await this.sleep(delay);
65
+ return this.retryWithBackoff(fn, retryCount + 1);
66
+ }
8
67
  }
9
68
  /**
10
69
  * Convert Markdown formatting to HTML for FreeScout
11
70
  */
12
71
  markdownToHtml(text) {
72
+ const escaped = this.escapeHtml(text);
13
73
  // Convert bold text: **text** or __text__ -> <strong>text</strong>
14
- let html = text
74
+ let html = escaped
15
75
  .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
16
76
  .replace(/__(.*?)__/g, '<strong>$1</strong>');
17
77
  // Convert italic text: *text* or _text_ -> <em>text</em> (avoid conflicts with bold)
@@ -31,7 +91,7 @@ export class FreeScoutAPI {
31
91
  // Check for empty lines (paragraph breaks)
32
92
  if (!trimmedLine) {
33
93
  // Check if the next non-empty line is also a list item
34
- const nextListItemIndex = lines.slice(i + 1).findIndex(nextLine => {
94
+ const nextListItemIndex = lines.slice(i + 1).findIndex((nextLine) => {
35
95
  const nextTrimmed = nextLine.trim();
36
96
  return nextTrimmed && (/^\d+\.\s+/.test(nextTrimmed) || /^[-*]\s+/.test(nextTrimmed));
37
97
  });
@@ -122,33 +182,80 @@ export class FreeScoutAPI {
122
182
  }
123
183
  return processedLines.join('\n\n');
124
184
  }
185
+ escapeHtml(text) {
186
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
187
+ }
188
+ looksLikeHtml(text) {
189
+ // Heuristic: if it already contains common HTML tags, assume it's already formatted
190
+ return /<\/?(p|br|div|span|strong|em|ul|ol|li|code|pre|blockquote|h[1-6])\b/i.test(text);
191
+ }
192
+ containsMarkdownSyntax(text) {
193
+ return (text.includes('\n') ||
194
+ /\*\*.+?\*\*/.test(text) ||
195
+ /__.+?__/.test(text) ||
196
+ /`[^`]+`/.test(text) ||
197
+ /^\s*#{1,6}\s+.+/m.test(text) ||
198
+ /^\s*[-*]\s+.+/m.test(text) ||
199
+ /^\s*\d+\.\s+.+/m.test(text));
200
+ }
201
+ formatForFreeScoutEditor(text) {
202
+ if (this.looksLikeHtml(text))
203
+ return text;
204
+ if (!this.containsMarkdownSyntax(text))
205
+ return this.escapeHtml(text);
206
+ return this.markdownToHtml(text);
207
+ }
125
208
  async request(path, method = 'GET', body) {
126
- const url = `${this.baseUrl}/api${path}`;
127
- const headers = {
128
- 'X-FreeScout-API-Key': this.apiKey,
129
- };
130
- if (body) {
131
- headers['Content-Type'] = 'application/json';
132
- }
133
- const response = await fetch(url, {
134
- method,
135
- headers,
136
- body: body ? JSON.stringify(body) : undefined,
209
+ return this.retryWithBackoff(async () => {
210
+ const url = `${this.baseUrl}/api${path}`;
211
+ const headers = {
212
+ 'X-FreeScout-API-Key': this.apiKey,
213
+ };
214
+ if (body) {
215
+ headers['Content-Type'] = 'application/json';
216
+ }
217
+ // Create abort controller for timeout
218
+ const controller = new AbortController();
219
+ const timeoutId = setTimeout(() => controller.abort(), this.retryOptions.timeout);
220
+ try {
221
+ const response = await fetch(url, {
222
+ method,
223
+ headers,
224
+ body: body ? JSON.stringify(body) : undefined,
225
+ signal: controller.signal,
226
+ });
227
+ clearTimeout(timeoutId);
228
+ if (!response.ok) {
229
+ const errorText = await response.text();
230
+ // Include status code in error for retry logic
231
+ if (response.status === 429) {
232
+ throw new Error(`FreeScout API rate limit (429): ${errorText}`);
233
+ }
234
+ if (response.status >= 500) {
235
+ throw new Error(`FreeScout API server error (${response.status}): ${errorText}`);
236
+ }
237
+ throw new Error(`FreeScout API error: ${response.status} - ${errorText}`);
238
+ }
239
+ return response.json();
240
+ }
241
+ catch (error) {
242
+ clearTimeout(timeoutId);
243
+ if (error instanceof Error && error.name === 'AbortError') {
244
+ throw new Error(`FreeScout API timeout after ${this.retryOptions.timeout}ms`);
245
+ }
246
+ throw error;
247
+ }
137
248
  });
138
- if (!response.ok) {
139
- const errorText = await response.text();
140
- throw new Error(`FreeScout API error: ${response.status} - ${errorText}`);
141
- }
142
- return response.json();
143
249
  }
144
250
  async getConversation(ticketId, includeThreads = true) {
145
251
  const embed = includeThreads ? '?embed=threads' : '';
146
252
  return this.request(`/conversations/${ticketId}${embed}`);
147
253
  }
148
254
  async addThread(ticketId, type, text, userId, state) {
255
+ const formattedText = this.formatForFreeScoutEditor(text);
149
256
  const body = {
150
257
  type,
151
- text,
258
+ text: formattedText,
152
259
  };
153
260
  if (userId) {
154
261
  body.user = userId;
@@ -159,41 +266,84 @@ export class FreeScoutAPI {
159
266
  return this.request(`/conversations/${ticketId}/threads`, 'POST', body);
160
267
  }
161
268
  async createDraftReply(ticketId, text, userId) {
162
- // Convert Markdown formatting to HTML for proper display in FreeScout
163
- const htmlText = this.markdownToHtml(text);
164
- return this.addThread(ticketId, 'message', htmlText, userId, 'draft');
269
+ return this.addThread(ticketId, 'message', text, userId, 'draft');
165
270
  }
166
271
  async updateConversation(ticketId, updates) {
167
272
  return this.request(`/conversations/${ticketId}`, 'PUT', updates);
168
273
  }
169
- async searchConversations(query, status, state, mailboxId) {
170
- // Valid statuses as defined in the API
171
- const VALID_STATUSES = ['active', 'pending', 'closed', 'spam'];
274
+ /**
275
+ * Search conversations with explicit filter parameters
276
+ */
277
+ async searchConversations(filters) {
172
278
  const params = new URLSearchParams();
173
- if (query)
174
- params.append('query', query);
175
- // Handle state parameter
176
- if (state)
177
- params.append('state', state);
178
- // Handle mailboxId=0 correctly using typeof check
179
- if (typeof mailboxId !== 'undefined') {
180
- params.append('mailboxId', mailboxId.toString());
181
- }
182
- // Handle status parameter
183
- if (status) {
184
- if (status === 'all') {
185
- // When status is 'all', append each valid status explicitly
186
- VALID_STATUSES.forEach(validStatus => {
187
- params.append('status', validStatus);
188
- });
279
+ // Text search
280
+ if (filters.textSearch) {
281
+ params.append('query', filters.textSearch.trim());
282
+ }
283
+ // Assignee filter
284
+ if (filters.assignee !== undefined) {
285
+ if (filters.assignee === 'unassigned') {
286
+ params.append('assignee', 'null');
287
+ }
288
+ else if (filters.assignee === 'any') {
289
+ // Don't add assignee filter
189
290
  }
190
291
  else {
191
- // Only append single status when a specific status is provided
192
- params.append('status', status);
292
+ params.append('assignee', filters.assignee.toString());
193
293
  }
194
294
  }
295
+ // Status filter
296
+ if (filters.status) {
297
+ if (filters.status === 'all') {
298
+ params.append('status', 'active,pending,closed,spam');
299
+ }
300
+ else {
301
+ params.append('status', filters.status);
302
+ }
303
+ }
304
+ // State filter
305
+ if (filters.state) {
306
+ params.append('state', filters.state);
307
+ }
308
+ // Mailbox filter
309
+ if (filters.mailboxId != null) {
310
+ params.append('mailboxId', filters.mailboxId.toString());
311
+ }
312
+ // Date filters - convert relative times to ISO dates
313
+ if (filters.updatedSince) {
314
+ const isoDate = this.parseRelativeTime(filters.updatedSince) || filters.updatedSince;
315
+ params.append('updatedSince', isoDate);
316
+ }
317
+ if (filters.createdSince) {
318
+ const isoDate = this.parseRelativeTime(filters.createdSince) || filters.createdSince;
319
+ params.append('createdSince', isoDate);
320
+ }
321
+ // Pagination
322
+ if (filters.page) {
323
+ params.append('page', filters.page.toString());
324
+ }
325
+ if (filters.pageSize) {
326
+ params.append('per_page', filters.pageSize.toString());
327
+ }
195
328
  return this.request(`/conversations?${params.toString()}`);
196
329
  }
330
+ /**
331
+ * @deprecated Use searchConversations with SearchFilters instead
332
+ */
333
+ async searchConversationsLegacy(query, status, state, mailboxId) {
334
+ const statusValue = status;
335
+ const stateValue = state;
336
+ return this.searchConversations({
337
+ textSearch: query,
338
+ status: statusValue && ['active', 'pending', 'closed', 'spam', 'all'].includes(statusValue)
339
+ ? statusValue
340
+ : undefined,
341
+ state: stateValue && ['published', 'deleted'].includes(stateValue)
342
+ ? stateValue
343
+ : undefined,
344
+ mailboxId,
345
+ });
346
+ }
197
347
  async listConversations(status, state, assignee) {
198
348
  const params = new URLSearchParams();
199
349
  if (status)
@@ -1 +1 @@
1
- {"version":3,"file":"freescout-api.js","sourceRoot":"","sources":["../src/freescout-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"freescout-api.js","sourceRoot":"","sources":["../src/freescout-api.ts"],"names":[],"mappings":"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"}