@thisispamela/sdk 1.0.4 → 1.1.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/dist/chunk-IKGLZFM6.mjs +38 -0
- package/dist/chunk-IKGLZFM6.mjs.map +1 -0
- package/dist/chunk-NQIPPPEL.mjs +50 -0
- package/dist/chunk-NQIPPPEL.mjs.map +1 -0
- package/dist/chunk-WMXO6YYV.mjs +50 -0
- package/dist/chunk-WMXO6YYV.mjs.map +1 -0
- package/dist/errors.d.mts +47 -0
- package/dist/errors.d.ts +8 -6
- package/dist/errors.js +78 -47
- package/dist/errors.js.map +1 -0
- package/dist/errors.mjs +17 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/index.d.mts +109 -0
- package/dist/index.d.ts +11 -69
- package/dist/index.js +315 -200
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +170 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.mts +99 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.js +74 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +7 -0
- package/dist/types.mjs.map +1 -0
- package/dist/webhooks.d.mts +12 -0
- package/dist/webhooks.d.ts +12 -0
- package/dist/webhooks.js +73 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/webhooks.mjs +9 -0
- package/dist/webhooks.mjs.map +1 -0
- package/package.json +28 -4
- package/src/index.ts +9 -84
- package/src/types.ts +126 -0
- package/src/webhooks.ts +55 -0
- package/tsup.config.ts +10 -0
package/dist/index.js
CHANGED
|
@@ -1,207 +1,322 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
AuthenticationError: () => AuthenticationError,
|
|
34
|
+
CallError: () => CallError,
|
|
35
|
+
ErrorCodes: () => ErrorCodes,
|
|
36
|
+
Pamela: () => PamelaClient,
|
|
37
|
+
PamelaClient: () => PamelaClient,
|
|
38
|
+
PamelaError: () => PamelaError,
|
|
39
|
+
RateLimitError: () => RateLimitError,
|
|
40
|
+
SubscriptionError: () => SubscriptionError,
|
|
41
|
+
UsageClient: () => UsageClient,
|
|
42
|
+
ValidationError: () => ValidationError,
|
|
43
|
+
default: () => index_default,
|
|
44
|
+
parseToolWebhook: () => parseToolWebhook,
|
|
45
|
+
verifyWebhookSignature: () => verifyWebhookSignature
|
|
20
46
|
});
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
-
__setModuleDefault(result, mod);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
})();
|
|
38
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
module.exports = __toCommonJS(index_exports);
|
|
48
|
+
var import_axios = __toESM(require("axios"));
|
|
49
|
+
|
|
50
|
+
// src/errors.ts
|
|
51
|
+
var PamelaError = class extends Error {
|
|
52
|
+
constructor(message, options) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.name = "PamelaError";
|
|
55
|
+
this.errorCode = options?.errorCode;
|
|
56
|
+
this.details = options?.details;
|
|
57
|
+
this.statusCode = options?.statusCode;
|
|
58
|
+
}
|
|
40
59
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
Object.defineProperty(exports, "PamelaError", { enumerable: true, get: function () { return errors_1.PamelaError; } });
|
|
47
|
-
Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return errors_1.AuthenticationError; } });
|
|
48
|
-
Object.defineProperty(exports, "SubscriptionError", { enumerable: true, get: function () { return errors_1.SubscriptionError; } });
|
|
49
|
-
Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
|
|
50
|
-
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
|
|
51
|
-
Object.defineProperty(exports, "CallError", { enumerable: true, get: function () { return errors_1.CallError; } });
|
|
52
|
-
const mapAxiosError = (error, endpoint) => {
|
|
53
|
-
const statusCode = error.response?.status;
|
|
54
|
-
const data = error.response?.data;
|
|
55
|
-
let errorCode;
|
|
56
|
-
let message;
|
|
57
|
-
let details;
|
|
58
|
-
if (data && typeof data === 'object') {
|
|
59
|
-
const detail = data.detail;
|
|
60
|
-
if (detail && typeof detail === 'object') {
|
|
61
|
-
errorCode = detail.error_code ?? detail.error?.code;
|
|
62
|
-
message = detail.message ?? detail.error?.message;
|
|
63
|
-
details = detail.details ?? detail.error?.details;
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
errorCode = data.error_code ?? data.error?.code;
|
|
67
|
-
message = data.message ?? data.detail;
|
|
68
|
-
details = data.details ?? data.error?.details;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (!message) {
|
|
72
|
-
message = error.message || 'Request failed';
|
|
73
|
-
}
|
|
74
|
-
const options = { errorCode, details, statusCode };
|
|
75
|
-
if (statusCode === 401)
|
|
76
|
-
return new errors_1.AuthenticationError(message, options);
|
|
77
|
-
if (statusCode === 403)
|
|
78
|
-
return new errors_1.SubscriptionError(message, options);
|
|
79
|
-
if (statusCode === 429)
|
|
80
|
-
return new errors_1.RateLimitError(message, options);
|
|
81
|
-
if (statusCode === 400 || statusCode === 422)
|
|
82
|
-
return new errors_1.ValidationError(message, options);
|
|
83
|
-
if (endpoint?.startsWith('/calls')) {
|
|
84
|
-
return new errors_1.CallError(message, options);
|
|
85
|
-
}
|
|
86
|
-
return new errors_1.PamelaError(message, options);
|
|
60
|
+
var AuthenticationError = class extends PamelaError {
|
|
61
|
+
constructor(message, options) {
|
|
62
|
+
super(message, options);
|
|
63
|
+
this.name = "AuthenticationError";
|
|
64
|
+
}
|
|
87
65
|
};
|
|
88
|
-
class
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
66
|
+
var SubscriptionError = class extends PamelaError {
|
|
67
|
+
constructor(message, options) {
|
|
68
|
+
super(message, options);
|
|
69
|
+
this.name = "SubscriptionError";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var RateLimitError = class extends PamelaError {
|
|
73
|
+
constructor(message, options) {
|
|
74
|
+
super(message, options);
|
|
75
|
+
this.name = "RateLimitError";
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var ValidationError = class extends PamelaError {
|
|
79
|
+
constructor(message, options) {
|
|
80
|
+
super(message, options);
|
|
81
|
+
this.name = "ValidationError";
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var CallError = class extends PamelaError {
|
|
85
|
+
constructor(message, options) {
|
|
86
|
+
super(message, options);
|
|
87
|
+
this.name = "CallError";
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/types.ts
|
|
92
|
+
var ErrorCodes = {
|
|
93
|
+
// Auth errors (1000-1999)
|
|
94
|
+
AUTH_REQUIRED: 1001,
|
|
95
|
+
AUTH_INVALID: 1002,
|
|
96
|
+
AUTH_EXPIRED: 1003,
|
|
97
|
+
AUTH_INSUFFICIENT_PERMISSIONS: 1004,
|
|
98
|
+
AUTH_FORBIDDEN: 1005,
|
|
99
|
+
// Validation errors (2000-2999)
|
|
100
|
+
VALIDATION_ERROR: 2001,
|
|
101
|
+
INVALID_PHONE: 2002,
|
|
102
|
+
INVALID_EMAIL: 2003,
|
|
103
|
+
INVALID_PASSWORD: 2004,
|
|
104
|
+
MISSING_REQUIRED_FIELD: 2005,
|
|
105
|
+
INVALID_JSON: 2006,
|
|
106
|
+
INVALID_REQUEST_BODY: 2007,
|
|
107
|
+
// Not found errors (3000-3999)
|
|
108
|
+
NOT_FOUND: 3001,
|
|
109
|
+
USER_NOT_FOUND: 3002,
|
|
110
|
+
CONVERSATION_NOT_FOUND: 3003,
|
|
111
|
+
CALL_SESSION_NOT_FOUND: 3004,
|
|
112
|
+
RESOURCE_NOT_FOUND: 3005,
|
|
113
|
+
MESSAGE_NOT_FOUND: 3006,
|
|
114
|
+
// Conflict errors (4000-4999)
|
|
115
|
+
RESOURCE_ALREADY_EXISTS: 4001,
|
|
116
|
+
EMAIL_ALREADY_REGISTERED: 4002,
|
|
117
|
+
ACCOUNT_LINKING_REQUIRED: 4003,
|
|
118
|
+
// Server errors (5000-5999)
|
|
119
|
+
INTERNAL_ERROR: 5001,
|
|
120
|
+
EXTERNAL_SERVICE_ERROR: 5002,
|
|
121
|
+
DATABASE_ERROR: 5003,
|
|
122
|
+
CONFIGURATION_ERROR: 5004,
|
|
123
|
+
// Rate limiting (6000-6999)
|
|
124
|
+
RATE_LIMIT_EXCEEDED: 6001,
|
|
125
|
+
QUOTA_EXCEEDED: 6002,
|
|
126
|
+
// B2B errors (7000-7999)
|
|
127
|
+
B2B_PARTNER_NOT_FOUND: 7001,
|
|
128
|
+
B2B_PROJECT_NOT_FOUND: 7002,
|
|
129
|
+
B2B_CALL_NOT_FOUND: 7003,
|
|
130
|
+
B2B_NO_PHONE_NUMBER: 7004,
|
|
131
|
+
B2B_UNSUPPORTED_COUNTRY: 7005,
|
|
132
|
+
B2B_TOOL_EXECUTION_FAILED: 7006,
|
|
133
|
+
B2B_WEBHOOK_DELIVERY_FAILED: 7007,
|
|
134
|
+
SUBSCRIPTION_EXPIRED: 7008
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// src/webhooks.ts
|
|
138
|
+
var crypto = __toESM(require("crypto"));
|
|
139
|
+
var verifyWebhookSignature = (payload, signature, secret) => {
|
|
140
|
+
if (!signature) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
if (!secret) {
|
|
144
|
+
throw new Error("Webhook secret cannot be empty");
|
|
145
|
+
}
|
|
146
|
+
const payloadString = typeof payload === "string" ? payload : JSON.stringify(payload);
|
|
147
|
+
const expectedSignature = crypto.createHmac("sha256", secret).update(payloadString).digest("hex");
|
|
148
|
+
return crypto.timingSafeEqual(
|
|
149
|
+
Buffer.from(signature),
|
|
150
|
+
Buffer.from(expectedSignature)
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
var parseToolWebhook = (payload) => {
|
|
154
|
+
const requiredFields = ["tool_name", "arguments", "call_id", "correlation_id"];
|
|
155
|
+
const missing = requiredFields.filter((field) => !(field in payload));
|
|
156
|
+
if (missing.length > 0) {
|
|
157
|
+
throw new Error(`Missing required fields: ${missing.join(", ")}`);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
tool_name: String(payload.tool_name),
|
|
161
|
+
arguments: typeof payload.arguments === "object" && payload.arguments ? payload.arguments : {},
|
|
162
|
+
call_id: String(payload.call_id),
|
|
163
|
+
correlation_id: String(payload.correlation_id),
|
|
164
|
+
call_session_id: payload.call_session_id,
|
|
165
|
+
partner_id: payload.partner_id,
|
|
166
|
+
project_id: payload.project_id
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// src/index.ts
|
|
171
|
+
var mapAxiosError = (error, endpoint) => {
|
|
172
|
+
const statusCode = error.response?.status;
|
|
173
|
+
const data = error.response?.data;
|
|
174
|
+
let errorCode;
|
|
175
|
+
let message;
|
|
176
|
+
let details;
|
|
177
|
+
if (data && typeof data === "object") {
|
|
178
|
+
const detail = data.detail;
|
|
179
|
+
if (detail && typeof detail === "object") {
|
|
180
|
+
errorCode = detail.error_code ?? detail.error?.code;
|
|
181
|
+
message = detail.message ?? detail.error?.message;
|
|
182
|
+
details = detail.details ?? detail.error?.details;
|
|
183
|
+
} else {
|
|
184
|
+
errorCode = data.error_code ?? data.error?.code;
|
|
185
|
+
message = data.message ?? data.detail;
|
|
186
|
+
details = data.details ?? data.error?.details;
|
|
143
187
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
188
|
+
}
|
|
189
|
+
if (!message) {
|
|
190
|
+
message = error.message || "Request failed";
|
|
191
|
+
}
|
|
192
|
+
const options = { errorCode, details, statusCode };
|
|
193
|
+
if (statusCode === 401) return new AuthenticationError(message, options);
|
|
194
|
+
if (statusCode === 403) return new SubscriptionError(message, options);
|
|
195
|
+
if (statusCode === 429) return new RateLimitError(message, options);
|
|
196
|
+
if (statusCode === 400 || statusCode === 422) return new ValidationError(message, options);
|
|
197
|
+
if (endpoint?.startsWith("/calls")) {
|
|
198
|
+
return new CallError(message, options);
|
|
199
|
+
}
|
|
200
|
+
return new PamelaError(message, options);
|
|
201
|
+
};
|
|
202
|
+
var UsageClient = class {
|
|
203
|
+
constructor(client) {
|
|
204
|
+
this.client = client;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get usage statistics for partner/project.
|
|
208
|
+
*/
|
|
209
|
+
async get(period) {
|
|
210
|
+
const params = period ? { period } : {};
|
|
211
|
+
const response = await this.client.get("/usage", { params });
|
|
212
|
+
return response.data;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
var PamelaClient = class {
|
|
216
|
+
constructor(config) {
|
|
217
|
+
this.apiKey = config.apiKey;
|
|
218
|
+
const baseURL = config.baseUrl || "https://api.thisispamela.com";
|
|
219
|
+
this.client = import_axios.default.create({
|
|
220
|
+
baseURL: `${baseURL}/api/b2b/v1`,
|
|
221
|
+
headers: {
|
|
222
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
223
|
+
"Content-Type": "application/json"
|
|
224
|
+
},
|
|
225
|
+
timeout: 3e4
|
|
226
|
+
});
|
|
227
|
+
this.usage = new UsageClient(this.client);
|
|
228
|
+
this.client.interceptors.response.use(
|
|
229
|
+
(response) => response,
|
|
230
|
+
async (error) => {
|
|
231
|
+
const config2 = error.config;
|
|
232
|
+
if (!config2 || !config2.retry) {
|
|
233
|
+
config2.retry = 0;
|
|
152
234
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Delete a tool.
|
|
187
|
-
*/
|
|
188
|
-
async deleteTool(toolId) {
|
|
189
|
-
const response = await this.client.delete(`/tools/${toolId}`);
|
|
190
|
-
return response.data;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Verify webhook signature.
|
|
194
|
-
*/
|
|
195
|
-
static verifyWebhookSignature(payload, signature, secret) {
|
|
196
|
-
const payloadString = typeof payload === 'string' ? payload : JSON.stringify(payload);
|
|
197
|
-
const expectedSignature = crypto
|
|
198
|
-
.createHmac('sha256', secret)
|
|
199
|
-
.update(payloadString)
|
|
200
|
-
.digest('hex');
|
|
201
|
-
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
|
|
235
|
+
config2.retry += 1;
|
|
236
|
+
if (config2.retry <= 3 && error.response?.status && error.response.status >= 500) {
|
|
237
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3 * config2.retry));
|
|
238
|
+
return this.client.request(config2);
|
|
239
|
+
}
|
|
240
|
+
return Promise.reject(mapAxiosError(error, config2?.url));
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Create a new call.
|
|
246
|
+
*/
|
|
247
|
+
async createCall(request) {
|
|
248
|
+
const response = await this.client.post("/calls", request);
|
|
249
|
+
return response.data;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get call status and details.
|
|
253
|
+
*/
|
|
254
|
+
async getCall(callId) {
|
|
255
|
+
const response = await this.client.get(`/calls/${callId}`);
|
|
256
|
+
return response.data;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* List calls for the authenticated partner/project.
|
|
260
|
+
*/
|
|
261
|
+
async listCalls(params) {
|
|
262
|
+
const normalizedParams = { ...params };
|
|
263
|
+
if (params?.status_filter || params?.status) {
|
|
264
|
+
normalizedParams.status_filter = params?.status_filter ?? params?.status;
|
|
265
|
+
delete normalizedParams.status;
|
|
202
266
|
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
267
|
+
const response = await this.client.get("/calls", { params: normalizedParams });
|
|
268
|
+
return response.data;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Cancel an in-progress call.
|
|
272
|
+
*/
|
|
273
|
+
async cancelCall(callId) {
|
|
274
|
+
const response = await this.client.post(`/calls/${callId}/cancel`);
|
|
275
|
+
return response.data;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Force hangup an in-progress call.
|
|
279
|
+
*/
|
|
280
|
+
async hangupCall(callId) {
|
|
281
|
+
const response = await this.client.post(`/calls/${callId}/hangup`);
|
|
282
|
+
return response.data;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Register a tool.
|
|
286
|
+
*/
|
|
287
|
+
async registerTool(tool) {
|
|
288
|
+
const response = await this.client.post("/tools", { tool });
|
|
289
|
+
return response.data;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* List all tools for the project.
|
|
293
|
+
*/
|
|
294
|
+
async listTools() {
|
|
295
|
+
const response = await this.client.get("/tools");
|
|
296
|
+
return response.data;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Delete a tool.
|
|
300
|
+
*/
|
|
301
|
+
async deleteTool(toolId) {
|
|
302
|
+
const response = await this.client.delete(`/tools/${toolId}`);
|
|
303
|
+
return response.data;
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
var index_default = PamelaClient;
|
|
307
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
308
|
+
0 && (module.exports = {
|
|
309
|
+
AuthenticationError,
|
|
310
|
+
CallError,
|
|
311
|
+
ErrorCodes,
|
|
312
|
+
Pamela,
|
|
313
|
+
PamelaClient,
|
|
314
|
+
PamelaError,
|
|
315
|
+
RateLimitError,
|
|
316
|
+
SubscriptionError,
|
|
317
|
+
UsageClient,
|
|
318
|
+
ValidationError,
|
|
319
|
+
parseToolWebhook,
|
|
320
|
+
verifyWebhookSignature
|
|
321
|
+
});
|
|
322
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/types.ts","../src/webhooks.ts"],"sourcesContent":["/**\n * Pamela Enterprise Voice API SDK for JavaScript/TypeScript\n */\n\nimport axios, { AxiosInstance, AxiosError } from 'axios';\nimport {\n PamelaError,\n AuthenticationError,\n SubscriptionError,\n RateLimitError,\n ValidationError,\n CallError,\n} from './errors';\nimport type {\n PamelaClientConfig,\n CreateCallRequest,\n CallResponse,\n CallStatus,\n ToolDefinition,\n} from './types';\n\nconst mapAxiosError = (error: AxiosError, endpoint?: string): PamelaError => {\n const statusCode = error.response?.status;\n const data = error.response?.data as any;\n let errorCode: number | undefined;\n let message: string | undefined;\n let details: Record<string, any> | undefined;\n\n if (data && typeof data === 'object') {\n const detail = data.detail;\n if (detail && typeof detail === 'object') {\n errorCode = detail.error_code ?? detail.error?.code;\n message = detail.message ?? detail.error?.message;\n details = detail.details ?? detail.error?.details;\n } else {\n errorCode = data.error_code ?? data.error?.code;\n message = data.message ?? data.detail;\n details = data.details ?? data.error?.details;\n }\n }\n\n if (!message) {\n message = error.message || 'Request failed';\n }\n\n const options = { errorCode, details, statusCode };\n if (statusCode === 401) return new AuthenticationError(message, options);\n if (statusCode === 403) return new SubscriptionError(message, options);\n if (statusCode === 429) return new RateLimitError(message, options);\n if (statusCode === 400 || statusCode === 422) return new ValidationError(message, options);\n\n if (endpoint?.startsWith('/calls')) {\n return new CallError(message, options);\n }\n\n return new PamelaError(message, options);\n};\n\nexport class UsageClient {\n private client: AxiosInstance;\n\n constructor(client: AxiosInstance) {\n this.client = client;\n }\n\n /**\n * Get usage statistics for partner/project.\n */\n async get(period?: string): Promise<{\n partner_id: string;\n project_id?: string;\n period: string;\n call_count: number;\n last_updated?: string;\n quota?: {\n partner_limit?: number;\n project_limit?: number;\n };\n }> {\n const params = period ? { period } : {};\n const response = await this.client.get('/usage', { params });\n return response.data;\n }\n}\n\nexport class PamelaClient {\n private client: AxiosInstance;\n private apiKey: string;\n public usage: UsageClient;\n\n constructor(config: PamelaClientConfig) {\n this.apiKey = config.apiKey;\n const baseURL = config.baseUrl || 'https://api.thisispamela.com';\n \n this.client = axios.create({\n baseURL: `${baseURL}/api/b2b/v1`,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 30000,\n });\n\n // Initialize usage client\n this.usage = new UsageClient(this.client);\n\n // Add retry logic\n this.client.interceptors.response.use(\n (response) => response,\n async (error: AxiosError) => {\n const config = error.config as any;\n if (!config || !config.retry) {\n config.retry = 0;\n }\n config.retry += 1;\n\n if (config.retry <= 3 && error.response?.status && error.response.status >= 500) {\n await new Promise(resolve => setTimeout(resolve, 1000 * config.retry));\n return this.client.request(config);\n }\n\n return Promise.reject(mapAxiosError(error, config?.url));\n }\n );\n }\n\n /**\n * Create a new call.\n */\n async createCall(request: CreateCallRequest): Promise<CallResponse> {\n const response = await this.client.post<CallResponse>('/calls', request);\n return response.data;\n }\n\n /**\n * Get call status and details.\n */\n async getCall(callId: string): Promise<CallStatus> {\n const response = await this.client.get<CallStatus>(`/calls/${callId}`);\n return response.data;\n }\n\n /**\n * List calls for the authenticated partner/project.\n */\n async listCalls(params?: {\n status?: string;\n status_filter?: string;\n limit?: number;\n offset?: number;\n start_date?: string;\n end_date?: string;\n }): Promise<{ items: CallStatus[]; total: number; limit: number; offset: number }> {\n const normalizedParams = { ...params };\n if (params?.status_filter || params?.status) {\n normalizedParams.status_filter = params?.status_filter ?? params?.status;\n delete (normalizedParams as { status?: string }).status;\n }\n const response = await this.client.get('/calls', { params: normalizedParams });\n // Backend returns { items: [...], total, limit, offset }\n return response.data;\n }\n\n /**\n * Cancel an in-progress call.\n */\n async cancelCall(callId: string): Promise<{ success: boolean; call_id: string; status: string }> {\n const response = await this.client.post(`/calls/${callId}/cancel`);\n return response.data;\n }\n\n /**\n * Force hangup an in-progress call.\n */\n async hangupCall(callId: string): Promise<{ success: boolean; call_id: string; status: string }> {\n const response = await this.client.post(`/calls/${callId}/hangup`);\n return response.data;\n }\n\n /**\n * Register a tool.\n */\n async registerTool(tool: ToolDefinition): Promise<{ id: string; project_id: string; name: string; description: string; input_schema: Record<string, any>; output_schema: Record<string, any>; timeout_ms: number; created_at: string }> {\n const response = await this.client.post('/tools', { tool });\n return response.data;\n }\n\n /**\n * List all tools for the project.\n */\n async listTools(): Promise<Array<{ id: string; project_id: string; name: string; description: string; input_schema: Record<string, any>; output_schema: Record<string, any>; timeout_ms: number; created_at: string }>> {\n const response = await this.client.get('/tools');\n return response.data;\n }\n\n /**\n * Delete a tool.\n */\n async deleteTool(toolId: string): Promise<{ success: boolean; tool_id: string }> {\n const response = await this.client.delete(`/tools/${toolId}`);\n return response.data;\n }\n\n}\n\n// Export as both default and named export for flexibility\nexport default PamelaClient;\nexport { PamelaClient as Pamela };\nexport {\n PamelaError,\n AuthenticationError,\n SubscriptionError,\n RateLimitError,\n ValidationError,\n CallError,\n};\nexport * from './types';\nexport * from './webhooks';\n\n","export class PamelaError extends Error {\n public errorCode?: number;\n public details?: Record<string, any>;\n public statusCode?: number;\n\n constructor(message: string, options?: { errorCode?: number; details?: Record<string, any>; statusCode?: number }) {\n super(message);\n this.name = 'PamelaError';\n this.errorCode = options?.errorCode;\n this.details = options?.details;\n this.statusCode = options?.statusCode;\n }\n}\n\nexport class AuthenticationError extends PamelaError {\n constructor(message: string, options?: { errorCode?: number; details?: Record<string, any>; statusCode?: number }) {\n super(message, options);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class SubscriptionError extends PamelaError {\n constructor(message: string, options?: { errorCode?: number; details?: Record<string, any>; statusCode?: number }) {\n super(message, options);\n this.name = 'SubscriptionError';\n }\n}\n\nexport class RateLimitError extends PamelaError {\n constructor(message: string, options?: { errorCode?: number; details?: Record<string, any>; statusCode?: number }) {\n super(message, options);\n this.name = 'RateLimitError';\n }\n}\n\nexport class ValidationError extends PamelaError {\n constructor(message: string, options?: { errorCode?: number; details?: Record<string, any>; statusCode?: number }) {\n super(message, options);\n this.name = 'ValidationError';\n }\n}\n\nexport class CallError extends PamelaError {\n constructor(message: string, options?: { errorCode?: number; details?: Record<string, any>; statusCode?: number }) {\n super(message, options);\n this.name = 'CallError';\n }\n}\n","export interface PamelaClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport interface CreateCallRequest {\n to: string;\n country?: string;\n locale?: string;\n task: string;\n instructions?: string;\n max_duration_seconds?: number;\n voice?: 'male' | 'female' | 'auto';\n agent_name?: string;\n caller_name?: string;\n end_user_id?: string;\n metadata?: Record<string, any>;\n tools?: Array<Record<string, any>>;\n webhooks?: {\n webhook_url?: string;\n tool_webhook_url?: string;\n };\n}\n\nexport type CallStatusValue =\n | 'initiating'\n | 'queued'\n | 'ringing'\n | 'in_progress'\n | 'completed'\n | 'failed'\n | 'cancelled'\n | 'timeout_terminated'\n | 'in-progress';\n\nexport interface CallResponse {\n id: string;\n status: CallStatusValue | string;\n call_session_id: string;\n created_at: string;\n}\n\nexport interface CallStatus {\n id: string;\n status: CallStatusValue | string;\n to: string;\n from_: string; // Backend uses from_ (Python keyword)\n country: string;\n created_at: string;\n started_at?: string;\n completed_at?: string;\n duration_seconds?: number;\n max_duration_seconds?: number;\n transcript?: Array<Record<string, any>>;\n summary?: string;\n metadata: Record<string, any>;\n end_user_id?: string; // Marketplace end-user ID for privacy isolation\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n input_schema: Record<string, any>;\n output_schema?: Record<string, any>;\n timeout_ms?: number;\n}\n\nexport interface WebhookPayload {\n event: string;\n call_id: string;\n call_session_id: string;\n timestamp: string;\n data: Record<string, any>;\n}\n\n/** Standard error codes (aligned with backend models/errors.py) */\nexport const ErrorCodes = {\n // Auth errors (1000-1999)\n AUTH_REQUIRED: 1001,\n AUTH_INVALID: 1002,\n AUTH_EXPIRED: 1003,\n AUTH_INSUFFICIENT_PERMISSIONS: 1004,\n AUTH_FORBIDDEN: 1005,\n\n // Validation errors (2000-2999)\n VALIDATION_ERROR: 2001,\n INVALID_PHONE: 2002,\n INVALID_EMAIL: 2003,\n INVALID_PASSWORD: 2004,\n MISSING_REQUIRED_FIELD: 2005,\n INVALID_JSON: 2006,\n INVALID_REQUEST_BODY: 2007,\n\n // Not found errors (3000-3999)\n NOT_FOUND: 3001,\n USER_NOT_FOUND: 3002,\n CONVERSATION_NOT_FOUND: 3003,\n CALL_SESSION_NOT_FOUND: 3004,\n RESOURCE_NOT_FOUND: 3005,\n MESSAGE_NOT_FOUND: 3006,\n\n // Conflict errors (4000-4999)\n RESOURCE_ALREADY_EXISTS: 4001,\n EMAIL_ALREADY_REGISTERED: 4002,\n ACCOUNT_LINKING_REQUIRED: 4003,\n\n // Server errors (5000-5999)\n INTERNAL_ERROR: 5001,\n EXTERNAL_SERVICE_ERROR: 5002,\n DATABASE_ERROR: 5003,\n CONFIGURATION_ERROR: 5004,\n\n // Rate limiting (6000-6999)\n RATE_LIMIT_EXCEEDED: 6001,\n QUOTA_EXCEEDED: 6002,\n\n // B2B errors (7000-7999)\n B2B_PARTNER_NOT_FOUND: 7001,\n B2B_PROJECT_NOT_FOUND: 7002,\n B2B_CALL_NOT_FOUND: 7003,\n B2B_NO_PHONE_NUMBER: 7004,\n B2B_UNSUPPORTED_COUNTRY: 7005,\n B2B_TOOL_EXECUTION_FAILED: 7006,\n B2B_WEBHOOK_DELIVERY_FAILED: 7007,\n SUBSCRIPTION_EXPIRED: 7008,\n} as const;\n","import * as crypto from 'crypto';\n\nexport const verifyWebhookSignature = (\n payload: string | object,\n signature: string | undefined | null,\n secret: string\n): boolean => {\n if (!signature) {\n return false;\n }\n\n if (!secret) {\n throw new Error('Webhook secret cannot be empty');\n }\n\n const payloadString = typeof payload === 'string' ? payload : JSON.stringify(payload);\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payloadString)\n .digest('hex');\n\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n};\n\nexport const parseToolWebhook = (payload: Record<string, any>): {\n tool_name: string;\n arguments: Record<string, any>;\n call_id: string;\n correlation_id: string;\n call_session_id?: string;\n partner_id?: string;\n project_id?: string;\n} => {\n const requiredFields = ['tool_name', 'arguments', 'call_id', 'correlation_id'];\n const missing = requiredFields.filter((field) => !(field in payload));\n\n if (missing.length > 0) {\n throw new Error(`Missing required fields: ${missing.join(', ')}`);\n }\n\n return {\n tool_name: String(payload.tool_name),\n arguments: typeof payload.arguments === 'object' && payload.arguments\n ? payload.arguments\n : {},\n call_id: String(payload.call_id),\n correlation_id: String(payload.correlation_id),\n call_session_id: payload.call_session_id,\n partner_id: payload.partner_id,\n project_id: payload.project_id,\n };\n};\n"],"mappings":"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","names":["axios","config"]}
|