@opencx/mcp 1.11.9 → 1.11.25
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/dist/api-client.d.ts +16 -11
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +41 -47
- package/dist/api-client.js.map +1 -1
- package/dist/api-client.spec.js +51 -89
- package/dist/api-client.spec.js.map +1 -1
- package/dist/schema.d.ts +12706 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +6 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/server.spec.js +54 -51
- package/dist/server.spec.js.map +1 -1
- package/dist/tools/actions.d.ts +1 -1
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +26 -12
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/audit-logs.d.ts +1 -1
- package/dist/tools/audit-logs.d.ts.map +1 -1
- package/dist/tools/audit-logs.js +14 -9
- package/dist/tools/audit-logs.js.map +1 -1
- package/dist/tools/autopilot.d.ts +1 -1
- package/dist/tools/autopilot.d.ts.map +1 -1
- package/dist/tools/autopilot.js +5 -4
- package/dist/tools/autopilot.js.map +1 -1
- package/dist/tools/blocklist.d.ts +1 -1
- package/dist/tools/blocklist.d.ts.map +1 -1
- package/dist/tools/blocklist.js +20 -20
- package/dist/tools/blocklist.js.map +1 -1
- package/dist/tools/contact-segments.d.ts +1 -1
- package/dist/tools/contact-segments.d.ts.map +1 -1
- package/dist/tools/contact-segments.js +15 -12
- package/dist/tools/contact-segments.js.map +1 -1
- package/dist/tools/contacts.d.ts +1 -1
- package/dist/tools/contacts.d.ts.map +1 -1
- package/dist/tools/contacts.js +24 -14
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/coworker.d.ts +1 -1
- package/dist/tools/coworker.d.ts.map +1 -1
- package/dist/tools/coworker.js +8 -6
- package/dist/tools/coworker.js.map +1 -1
- package/dist/tools/crawl.d.ts +1 -1
- package/dist/tools/crawl.d.ts.map +1 -1
- package/dist/tools/crawl.js +43 -14
- package/dist/tools/crawl.js.map +1 -1
- package/dist/tools/csat.d.ts +1 -1
- package/dist/tools/csat.d.ts.map +1 -1
- package/dist/tools/csat.js +16 -10
- package/dist/tools/csat.js.map +1 -1
- package/dist/tools/email.d.ts +1 -1
- package/dist/tools/email.d.ts.map +1 -1
- package/dist/tools/email.js +23 -9
- package/dist/tools/email.js.map +1 -1
- package/dist/tools/handoff-analytics.d.ts +1 -1
- package/dist/tools/handoff-analytics.d.ts.map +1 -1
- package/dist/tools/handoff-analytics.js +5 -6
- package/dist/tools/handoff-analytics.js.map +1 -1
- package/dist/tools/help-center.d.ts +1 -1
- package/dist/tools/help-center.d.ts.map +1 -1
- package/dist/tools/help-center.js +41 -11
- package/dist/tools/help-center.js.map +1 -1
- package/dist/tools/impact-report.d.ts +1 -1
- package/dist/tools/impact-report.d.ts.map +1 -1
- package/dist/tools/impact-report.js +3 -2
- package/dist/tools/impact-report.js.map +1 -1
- package/dist/tools/insights.d.ts +1 -1
- package/dist/tools/insights.d.ts.map +1 -1
- package/dist/tools/insights.js +19 -11
- package/dist/tools/insights.js.map +1 -1
- package/dist/tools/media.d.ts +1 -1
- package/dist/tools/media.d.ts.map +1 -1
- package/dist/tools/media.js +2 -3
- package/dist/tools/media.js.map +1 -1
- package/dist/tools/office-hours.d.ts +1 -1
- package/dist/tools/office-hours.d.ts.map +1 -1
- package/dist/tools/office-hours.js +42 -10
- package/dist/tools/office-hours.js.map +1 -1
- package/dist/tools/onboarding.js +1 -1
- package/dist/tools/onboarding.js.map +1 -1
- package/dist/tools/org.d.ts +1 -1
- package/dist/tools/org.d.ts.map +1 -1
- package/dist/tools/org.js +5 -4
- package/dist/tools/org.js.map +1 -1
- package/dist/tools/phone.d.ts +1 -1
- package/dist/tools/phone.d.ts.map +1 -1
- package/dist/tools/phone.js +59 -40
- package/dist/tools/phone.js.map +1 -1
- package/dist/tools/redaction.d.ts +1 -1
- package/dist/tools/redaction.d.ts.map +1 -1
- package/dist/tools/redaction.js +5 -4
- package/dist/tools/redaction.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +3 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/sequences.d.ts +1 -1
- package/dist/tools/sequences.d.ts.map +1 -1
- package/dist/tools/sequences.js +24 -13
- package/dist/tools/sequences.js.map +1 -1
- package/dist/tools/sessions.d.ts +1 -1
- package/dist/tools/sessions.d.ts.map +1 -1
- package/dist/tools/sessions.js +118 -80
- package/dist/tools/sessions.js.map +1 -1
- package/dist/tools/sla-analytics.d.ts +1 -1
- package/dist/tools/sla-analytics.d.ts.map +1 -1
- package/dist/tools/sla-analytics.js +26 -42
- package/dist/tools/sla-analytics.js.map +1 -1
- package/dist/tools/sla.d.ts +1 -1
- package/dist/tools/sla.d.ts.map +1 -1
- package/dist/tools/sla.js +18 -16
- package/dist/tools/sla.js.map +1 -1
- package/dist/tools/tags.d.ts +1 -1
- package/dist/tools/tags.d.ts.map +1 -1
- package/dist/tools/tags.js +11 -11
- package/dist/tools/tags.js.map +1 -1
- package/dist/tools/teams.d.ts +1 -1
- package/dist/tools/teams.d.ts.map +1 -1
- package/dist/tools/teams.js +24 -17
- package/dist/tools/teams.js.map +1 -1
- package/dist/tools/todos.d.ts +1 -1
- package/dist/tools/todos.d.ts.map +1 -1
- package/dist/tools/todos.js +11 -8
- package/dist/tools/todos.js.map +1 -1
- package/dist/tools/training.d.ts +1 -1
- package/dist/tools/training.d.ts.map +1 -1
- package/dist/tools/training.js +116 -73
- package/dist/tools/training.js.map +1 -1
- package/dist/tools/users.d.ts +1 -1
- package/dist/tools/users.d.ts.map +1 -1
- package/dist/tools/users.js +8 -8
- package/dist/tools/users.js.map +1 -1
- package/dist/tools/whatsapp.d.ts +1 -1
- package/dist/tools/whatsapp.d.ts.map +1 -1
- package/dist/tools/whatsapp.js +11 -2
- package/dist/tools/whatsapp.js.map +1 -1
- package/dist/tools/widget.d.ts +1 -1
- package/dist/tools/widget.d.ts.map +1 -1
- package/dist/tools/widget.js +3 -2
- package/dist/tools/widget.js.map +1 -1
- package/dist/tools/workflows.d.ts +1 -1
- package/dist/tools/workflows.d.ts.map +1 -1
- package/dist/tools/workflows.js +173 -74
- package/dist/tools/workflows.js.map +1 -1
- package/package.json +5 -2
package/dist/api-client.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type Client } from 'openapi-fetch';
|
|
2
|
+
import type { paths } from './schema.js';
|
|
1
3
|
export declare class ApiError extends Error {
|
|
2
4
|
readonly status: number;
|
|
3
5
|
readonly statusText: string;
|
|
@@ -12,17 +14,20 @@ export declare class ApiError extends Error {
|
|
|
12
14
|
* attacks (e.g. `../../backend/internal-route` or `..%2F..%2Fetc`).
|
|
13
15
|
*/
|
|
14
16
|
export declare function safePath(segment: string): string;
|
|
15
|
-
export
|
|
16
|
-
private readonly baseUrl;
|
|
17
|
-
private readonly headers;
|
|
17
|
+
export type OpenCXClient = Client<paths> & {
|
|
18
18
|
readonly coworkerSessionId: string | undefined;
|
|
19
|
-
constructor(apiKey: string, baseUrl: string);
|
|
20
|
-
get(path: string, query?: Record<string, string | undefined>): Promise<unknown>;
|
|
21
|
-
post(path: string, body?: unknown): Promise<unknown>;
|
|
22
|
-
patch(path: string, body?: unknown): Promise<unknown>;
|
|
23
|
-
put(path: string, body?: unknown): Promise<unknown>;
|
|
24
|
-
delete(path: string): Promise<unknown>;
|
|
25
19
|
postMultipart(path: string, formData: FormData): Promise<unknown>;
|
|
26
|
-
|
|
27
|
-
}
|
|
20
|
+
postJson(path: string, body: unknown): Promise<unknown>;
|
|
21
|
+
};
|
|
22
|
+
export declare function createOpenCXClient(apiKey: string, baseUrl: string): OpenCXClient;
|
|
23
|
+
/**
|
|
24
|
+
* Wraps a value as an MCP text-content result. Handles `undefined` from 204
|
|
25
|
+
* responses by falling back to `{}` so `JSON.stringify` always produces a string.
|
|
26
|
+
*/
|
|
27
|
+
export declare function jsonContent(data: unknown): {
|
|
28
|
+
content: [{
|
|
29
|
+
type: 'text';
|
|
30
|
+
text: string;
|
|
31
|
+
}];
|
|
32
|
+
};
|
|
28
33
|
//# sourceMappingURL=api-client.d.ts.map
|
package/dist/api-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,MAAM;gBAFZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM;CAK/B;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAchD;AAED,
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAqB,EAAE,KAAK,MAAM,EAAmB,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,MAAM;gBAFZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM;CAK/B;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAchD;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG;IACzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CA+DhF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAExF"}
|
package/dist/api-client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import createClient from 'openapi-fetch';
|
|
1
2
|
export class ApiError extends Error {
|
|
2
3
|
status;
|
|
3
4
|
statusText;
|
|
@@ -33,39 +34,31 @@ export function safePath(segment) {
|
|
|
33
34
|
}
|
|
34
35
|
return encodeURIComponent(decoded);
|
|
35
36
|
}
|
|
36
|
-
export
|
|
37
|
-
baseUrl;
|
|
38
|
-
headers
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
'Content-Type': 'application/json',
|
|
45
|
-
};
|
|
46
|
-
this.coworkerSessionId = process.env.OPENCX_COWORKER_SESSION_ID;
|
|
47
|
-
if (this.coworkerSessionId) {
|
|
48
|
-
this.headers['x-opencx-coworker-session-id'] = this.coworkerSessionId;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async get(path, query) {
|
|
52
|
-
return this.request('GET', path, undefined, query);
|
|
53
|
-
}
|
|
54
|
-
async post(path, body) {
|
|
55
|
-
return this.request('POST', path, body);
|
|
56
|
-
}
|
|
57
|
-
async patch(path, body) {
|
|
58
|
-
return this.request('PATCH', path, body);
|
|
37
|
+
export function createOpenCXClient(apiKey, baseUrl) {
|
|
38
|
+
const normalizedBase = baseUrl.replace(/\/$/, '');
|
|
39
|
+
const headers = {
|
|
40
|
+
Authorization: `Bearer ${apiKey}`,
|
|
41
|
+
};
|
|
42
|
+
const coworkerSessionId = process.env.OPENCX_COWORKER_SESSION_ID;
|
|
43
|
+
if (coworkerSessionId) {
|
|
44
|
+
headers['x-opencx-coworker-session-id'] = coworkerSessionId;
|
|
59
45
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
46
|
+
const client = createClient({
|
|
47
|
+
baseUrl: normalizedBase,
|
|
48
|
+
headers,
|
|
49
|
+
});
|
|
50
|
+
const errorMiddleware = {
|
|
51
|
+
async onResponse({ response }) {
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const text = await response.text().catch(() => '');
|
|
54
|
+
throw new ApiError(response.status, response.statusText, text);
|
|
55
|
+
}
|
|
56
|
+
return response;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
client.use(errorMiddleware);
|
|
60
|
+
async function postMultipart(path, formData) {
|
|
61
|
+
const url = `${normalizedBase}${path}`;
|
|
69
62
|
const res = await fetch(url, {
|
|
70
63
|
method: 'POST',
|
|
71
64
|
headers,
|
|
@@ -77,22 +70,15 @@ export class OpenCXClient {
|
|
|
77
70
|
}
|
|
78
71
|
return parseJsonOrEmpty(await res.text());
|
|
79
72
|
}
|
|
80
|
-
async
|
|
81
|
-
|
|
82
|
-
if (query) {
|
|
83
|
-
const params = new URLSearchParams();
|
|
84
|
-
for (const [key, value] of Object.entries(query)) {
|
|
85
|
-
if (value !== undefined)
|
|
86
|
-
params.set(key, value);
|
|
87
|
-
}
|
|
88
|
-
const qs = params.toString();
|
|
89
|
-
if (qs)
|
|
90
|
-
url += `?${qs}`;
|
|
91
|
-
}
|
|
73
|
+
async function postJson(path, body) {
|
|
74
|
+
const url = `${normalizedBase}${path}`;
|
|
92
75
|
const res = await fetch(url, {
|
|
93
|
-
method,
|
|
94
|
-
headers:
|
|
95
|
-
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: {
|
|
78
|
+
...headers,
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
},
|
|
81
|
+
body: JSON.stringify(body),
|
|
96
82
|
});
|
|
97
83
|
if (!res.ok) {
|
|
98
84
|
const text = await res.text().catch(() => '');
|
|
@@ -100,6 +86,14 @@ export class OpenCXClient {
|
|
|
100
86
|
}
|
|
101
87
|
return parseJsonOrEmpty(await res.text());
|
|
102
88
|
}
|
|
89
|
+
return Object.assign(client, { coworkerSessionId, postMultipart, postJson });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Wraps a value as an MCP text-content result. Handles `undefined` from 204
|
|
93
|
+
* responses by falling back to `{}` so `JSON.stringify` always produces a string.
|
|
94
|
+
*/
|
|
95
|
+
export function jsonContent(data) {
|
|
96
|
+
return { content: [{ type: 'text', text: JSON.stringify(data ?? {}) }] };
|
|
103
97
|
}
|
|
104
98
|
/**
|
|
105
99
|
* Parses a response body as JSON, returning `{}` for empty bodies (e.g. 204 No
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IACA;IACA;IAHlB,YACkB,MAAc,EACd,UAAkB,EAClB,IAAY;QAE5B,KAAK,CAAC,oBAAoB,MAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC,CAAC;QAJ3C,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/api-client.spec.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { ApiError, safePath,
|
|
2
|
+
import { ApiError, safePath, createOpenCXClient } from './api-client.js';
|
|
3
3
|
describe('ApiError', () => {
|
|
4
4
|
it('stores status, statusText, and body', () => {
|
|
5
5
|
const err = new ApiError(404, 'Not Found', '{"error":"missing"}');
|
|
@@ -45,7 +45,7 @@ describe('safePath', () => {
|
|
|
45
45
|
expect(() => safePath('abc%')).toThrow('Invalid path parameter');
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
|
-
describe('
|
|
48
|
+
describe('createOpenCXClient', () => {
|
|
49
49
|
let fetchSpy;
|
|
50
50
|
beforeEach(() => {
|
|
51
51
|
fetchSpy = vi.fn();
|
|
@@ -54,100 +54,62 @@ describe('OpenCXClient', () => {
|
|
|
54
54
|
afterEach(() => {
|
|
55
55
|
vi.restoreAllMocks();
|
|
56
56
|
});
|
|
57
|
-
function mockResponse(body, status = 200) {
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
function mockResponse(body, status = 200, statusText = 'OK') {
|
|
58
|
+
if (status === 204)
|
|
59
|
+
return new Response(null, { status, statusText });
|
|
60
|
+
const text = typeof body === 'string' ? body : JSON.stringify(body);
|
|
61
|
+
return new Response(text, {
|
|
60
62
|
status,
|
|
61
|
-
statusText
|
|
62
|
-
|
|
63
|
+
statusText,
|
|
64
|
+
headers: { 'Content-Type': 'application/json' },
|
|
63
65
|
});
|
|
64
66
|
}
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}));
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
mockResponse({ id: '1' });
|
|
92
|
-
await client.post('/contacts/', { name: 'Alice' });
|
|
93
|
-
const opts = fetchSpy.mock.calls[0][1];
|
|
94
|
-
expect(opts.method).toBe('POST');
|
|
95
|
-
expect(opts.body).toBe(JSON.stringify({ name: 'Alice' }));
|
|
96
|
-
});
|
|
97
|
-
it('PATCH sends JSON body', async () => {
|
|
98
|
-
const client = new OpenCXClient('key', 'https://api.example.com');
|
|
99
|
-
mockResponse({ id: '1' });
|
|
100
|
-
await client.patch('/contacts/1', { name: 'Bob' });
|
|
101
|
-
const opts = fetchSpy.mock.calls[0][1];
|
|
102
|
-
expect(opts.method).toBe('PATCH');
|
|
103
|
-
});
|
|
104
|
-
it('PUT sends JSON body', async () => {
|
|
105
|
-
const client = new OpenCXClient('key', 'https://api.example.com');
|
|
106
|
-
mockResponse({ ok: true });
|
|
107
|
-
await client.put('/settings', { value: true });
|
|
108
|
-
const opts = fetchSpy.mock.calls[0][1];
|
|
109
|
-
expect(opts.method).toBe('PUT');
|
|
110
|
-
});
|
|
111
|
-
it('DELETE sends no body', async () => {
|
|
112
|
-
const client = new OpenCXClient('key', 'https://api.example.com');
|
|
113
|
-
mockResponse({});
|
|
114
|
-
await client.delete('/contacts/1');
|
|
115
|
-
const opts = fetchSpy.mock.calls[0][1];
|
|
116
|
-
expect(opts.method).toBe('DELETE');
|
|
117
|
-
expect(opts.body).toBeUndefined();
|
|
67
|
+
function getRequestUrl(call) {
|
|
68
|
+
const arg = call[0];
|
|
69
|
+
if (arg instanceof Request)
|
|
70
|
+
return arg.url;
|
|
71
|
+
return String(arg);
|
|
72
|
+
}
|
|
73
|
+
function getRequestOptions(call) {
|
|
74
|
+
const arg = call[0];
|
|
75
|
+
if (arg instanceof Request)
|
|
76
|
+
return { method: arg.method, headers: arg.headers };
|
|
77
|
+
const opts = call[1];
|
|
78
|
+
return { method: opts.method ?? 'GET', headers: new Headers(opts.headers) };
|
|
79
|
+
}
|
|
80
|
+
it('strips trailing slash from baseUrl', async () => {
|
|
81
|
+
const client = createOpenCXClient('key-123', 'https://api.example.com/');
|
|
82
|
+
fetchSpy.mockResolvedValueOnce(mockResponse({ ok: true }));
|
|
83
|
+
await client.GET('/org');
|
|
84
|
+
const url = getRequestUrl(fetchSpy.mock.calls[0]);
|
|
85
|
+
expect(url).toBe('https://api.example.com/org');
|
|
86
|
+
});
|
|
87
|
+
it('sets Authorization header with Bearer token', async () => {
|
|
88
|
+
const client = createOpenCXClient('my-api-key', 'https://api.example.com');
|
|
89
|
+
fetchSpy.mockResolvedValueOnce(mockResponse({ ok: true }));
|
|
90
|
+
await client.GET('/org');
|
|
91
|
+
const opts = getRequestOptions(fetchSpy.mock.calls[0]);
|
|
92
|
+
expect(opts.headers.get('authorization')).toBe('Bearer my-api-key');
|
|
118
93
|
});
|
|
119
94
|
it('throws ApiError on non-ok response', async () => {
|
|
120
|
-
const client =
|
|
121
|
-
fetchSpy.mockResolvedValueOnce(
|
|
122
|
-
|
|
95
|
+
const client = createOpenCXClient('key', 'https://api.example.com');
|
|
96
|
+
fetchSpy.mockResolvedValueOnce(mockResponse('invalid key', 401, 'Unauthorized'));
|
|
97
|
+
await expect(client.GET('/org')).rejects.toThrow(ApiError);
|
|
98
|
+
fetchSpy.mockResolvedValueOnce(mockResponse('invalid key', 401, 'Unauthorized'));
|
|
99
|
+
await expect(client.GET('/org')).rejects.toMatchObject({
|
|
123
100
|
status: 401,
|
|
124
|
-
|
|
125
|
-
text: () => Promise.resolve('invalid key'),
|
|
101
|
+
body: 'invalid key',
|
|
126
102
|
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
});
|
|
138
|
-
it('builds a valid MCP text envelope for write tools that hit a 204 backend', async () => {
|
|
139
|
-
const client = new OpenCXClient('key', 'https://api.example.com');
|
|
140
|
-
fetchSpy.mockResolvedValueOnce({
|
|
141
|
-
ok: true,
|
|
142
|
-
status: 204,
|
|
143
|
-
statusText: 'No Content',
|
|
144
|
-
text: () => Promise.resolve(''),
|
|
145
|
-
});
|
|
146
|
-
const data = await client.patch('/chat/sessions/abc', { status: 'closed_resolved' });
|
|
147
|
-
const envelope = { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
148
|
-
expect(data).toEqual({});
|
|
149
|
-
expect(envelope.content[0].text).toBe('{}');
|
|
150
|
-
expect(envelope.content[0].text).not.toBeUndefined();
|
|
103
|
+
});
|
|
104
|
+
it('postMultipart sends FormData and throws ApiError on failure', async () => {
|
|
105
|
+
const client = createOpenCXClient('key', 'https://api.example.com');
|
|
106
|
+
const formData = new FormData();
|
|
107
|
+
formData.append('file', new Blob(['test']), 'test.png');
|
|
108
|
+
fetchSpy.mockResolvedValueOnce(mockResponse({ url: 'https://cdn.example.com/test.png' }));
|
|
109
|
+
const result = await client.postMultipart('/media/upload', formData);
|
|
110
|
+
expect(result).toEqual({ url: 'https://cdn.example.com/test.png' });
|
|
111
|
+
fetchSpy.mockResolvedValueOnce(mockResponse('too large', 413, 'Payload Too Large'));
|
|
112
|
+
await expect(client.postMultipart('/media/upload', formData)).rejects.toThrow(ApiError);
|
|
151
113
|
});
|
|
152
114
|
});
|
|
153
115
|
//# sourceMappingURL=api-client.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.spec.js","sourceRoot":"","sources":["../src/api-client.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"api-client.spec.js","sourceRoot":"","sources":["../src/api-client.spec.ts"],"names":[],"mappings":"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"}
|