@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/.github/dependabot.yml +26 -0
- package/.github/workflows/ci.yml +34 -0
- package/.github/workflows/release-please.yml +102 -0
- package/.github/workflows/security.yml +53 -0
- package/.prettierignore +24 -0
- package/.prettierrc +10 -0
- package/AGENTS.md +6 -0
- package/CHANGELOG.md +147 -0
- package/CLAUDE.md +111 -0
- package/README.md +183 -167
- package/TESTING.md +98 -0
- package/dist/freescout-api.d.ts +32 -4
- package/dist/freescout-api.d.ts.map +1 -1
- package/dist/freescout-api.js +195 -45
- package/dist/freescout-api.js.map +1 -1
- package/dist/index.js +237 -778
- package/dist/index.js.map +1 -1
- package/dist/ticket-analyzer.d.ts.map +1 -1
- package/dist/ticket-analyzer.js +27 -23
- package/dist/ticket-analyzer.js.map +1 -1
- package/dist/types.d.ts +221 -72
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +88 -1
- package/dist/types.js.map +1 -1
- package/eslint.config.mjs +24 -0
- package/jest.setup.cjs +48 -0
- package/package.json +19 -13
- package/server.json +87 -0
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
|
package/dist/freescout-api.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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<
|
|
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":"
|
|
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"}
|
package/dist/freescout-api.js
CHANGED
|
@@ -1,17 +1,77 @@
|
|
|
1
|
-
import fetch from 'node-fetch';
|
|
2
1
|
export class FreeScoutAPI {
|
|
3
2
|
baseUrl;
|
|
4
3
|
apiKey;
|
|
5
|
-
|
|
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 =
|
|
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, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
274
|
+
/**
|
|
275
|
+
* Search conversations with explicit filter parameters
|
|
276
|
+
*/
|
|
277
|
+
async searchConversations(filters) {
|
|
172
278
|
const params = new URLSearchParams();
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAO/B,MAAM,OAAO,YAAY;IACf,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,OAAe,EAAE,MAAc;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QACnE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAY;QACjC,mEAAmE;QACnE,IAAI,IAAI,GAAG,IAAI;aACZ,OAAO,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;aAChD,OAAO,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QAEhD,qFAAqF;QACrF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;QAChE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;QAE5D,4CAA4C;QAC5C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAEnD,qEAAqE;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAEhC,2CAA2C;YAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,uDAAuD;gBACvD,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAChE,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACpC,OAAO,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBACxF,CAAC,CAAC,CAAC;gBAEH,8EAA8E;gBAC9E,IAAI,CAAC,aAAa,IAAI,eAAe,CAAC,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE,CAAC;oBACnE,SAAS,CAAC,8CAA8C;gBAC1D,CAAC;gBAED,wDAAwD;gBACxD,IAAI,aAAa,EAAE,CAAC;oBAClB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC7B,aAAa,GAAG,KAAK,CAAC;gBACxB,CAAC;gBACD,IAAI,eAAe,EAAE,CAAC;oBACpB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC7B,eAAe,GAAG,KAAK,CAAC;gBAC1B,CAAC;gBAED,gCAAgC;gBAChC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvD,cAAc,CAAC,IAAI,CAAC,MAAM,gBAAgB,MAAM,CAAC,CAAC;oBAClD,gBAAgB,GAAG,EAAE,CAAC;gBACxB,CAAC;gBAED,yBAAyB;gBACzB,SAAS;YACX,CAAC;YAED,gCAAgC;YAChC,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,+BAA+B;gBAC/B,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvD,cAAc,CAAC,IAAI,CAAC,MAAM,gBAAgB,MAAM,CAAC,CAAC;oBAClD,gBAAgB,GAAG,EAAE,CAAC;gBACxB,CAAC;gBAED,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,IAAI,eAAe,EAAE,CAAC;wBACpB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC7B,eAAe,GAAG,KAAK,CAAC;oBAC1B,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC5B,aAAa,GAAG,IAAI,CAAC;gBACvB,CAAC;gBACD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACrD,cAAc,CAAC,IAAI,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC;YAC7C,CAAC;YACD,8BAA8B;iBACzB,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,+BAA+B;gBAC/B,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvD,cAAc,CAAC,IAAI,CAAC,MAAM,gBAAgB,MAAM,CAAC,CAAC;oBAClD,gBAAgB,GAAG,EAAE,CAAC;gBACxB,CAAC;gBAED,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,IAAI,aAAa,EAAE,CAAC;wBAClB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC7B,aAAa,GAAG,KAAK,CAAC;oBACxB,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC5B,eAAe,GAAG,IAAI,CAAC;gBACzB,CAAC;gBACD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACpD,cAAc,CAAC,IAAI,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC;YAC7C,CAAC;YACD,eAAe;iBACV,CAAC;gBACJ,kBAAkB;gBAClB,IAAI,aAAa,EAAE,CAAC;oBAClB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC7B,aAAa,GAAG,KAAK,CAAC;gBACxB,CAAC;gBACD,IAAI,eAAe,EAAE,CAAC;oBACpB,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC7B,eAAe,GAAG,KAAK,CAAC;gBAC1B,CAAC;gBAED,2BAA2B;gBAC3B,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,aAAa;YAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,eAAe;YAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElD,kCAAkC;QAClC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvD,cAAc,CAAC,IAAI,CAAC,MAAM,gBAAgB,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,SAAiB,KAAK,EACtB,IAAU;QAEV,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,OAAO,IAAI,EAAE,CAAC;QAEzC,MAAM,OAAO,GAA2B;YACtC,qBAAqB,EAAE,IAAI,CAAC,MAAM;SACnC,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAgB,EAChB,iBAA0B,IAAI;QAE9B,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,QAAQ,GAAG,KAAK,EAAE,CACrC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,QAAgB,EAChB,IAAqC,EACrC,IAAY,EACZ,MAAe,EACf,KAA6B;QAE7B,MAAM,IAAI,GAAQ;YAChB,IAAI;YACJ,IAAI;SACL,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,QAAQ,UAAU,EACpC,MAAM,EACN,IAAI,CACL,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,QAAgB,EAChB,IAAY,EACZ,MAAc;QAEd,sEAAsE;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,OAIC;QAED,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,QAAQ,EAAE,EAC5B,KAAK,EACL,OAAO,CACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,KAAa,EACb,MAAe,EACf,KAAc,EACd,SAAkB;QAElB,uCAAuC;QACvC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAGzC,yBAAyB;QACzB,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,kDAAkD;QAClD,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,0BAA0B;QAC1B,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,4DAA4D;gBAC5D,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;oBACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,MAAe,EACf,KAAc,EACd,QAAwB;QAExB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAM,YAAY,CAAC,CAAC;IACzC,CAAC;IAED,sBAAsB,CAAC,GAAW;QAChC,uBAAuB;QACvB,wCAAwC;QACxC,yCAAyC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,0BAA0B;QAC1B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;QAChC,CAAC;QAED,wCAAwC;QACxC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QAED,0DAA0D;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"freescout-api.js","sourceRoot":"","sources":["../src/freescout-api.ts"],"names":[],"mappings":"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"}
|