@amigo-ai/platform-sdk 0.1.0 → 0.2.1
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/README.md +114 -2
- package/dist/core/branded-types.js +1 -0
- package/dist/core/branded-types.js.map +1 -1
- package/dist/core/errors.js +43 -3
- package/dist/core/errors.js.map +1 -1
- package/dist/core/openapi-client.js +60 -48
- package/dist/core/openapi-client.js.map +1 -1
- package/dist/core/rate-limit.js +13 -0
- package/dist/core/rate-limit.js.map +1 -0
- package/dist/core/webhooks.js +17 -0
- package/dist/core/webhooks.js.map +1 -0
- package/dist/generated/api.js +2 -0
- package/dist/{types → generated}/api.js.map +1 -1
- package/dist/index.cjs +1668 -371
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +59 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1658 -371
- package/dist/index.mjs.map +4 -4
- package/dist/resources/actions.js +52 -0
- package/dist/resources/actions.js.map +1 -0
- package/dist/resources/agents.js +30 -30
- package/dist/resources/agents.js.map +1 -1
- package/dist/resources/analytics.js +34 -15
- package/dist/resources/analytics.js.map +1 -1
- package/dist/resources/api-keys.js +17 -19
- package/dist/resources/api-keys.js.map +1 -1
- package/dist/resources/audit.js +35 -0
- package/dist/resources/audit.js.map +1 -0
- package/dist/resources/base.js +12 -44
- package/dist/resources/base.js.map +1 -1
- package/dist/resources/billing.js +35 -7
- package/dist/resources/billing.js.map +1 -1
- package/dist/resources/calls.js +25 -9
- package/dist/resources/calls.js.map +1 -1
- package/dist/resources/compliance.js +19 -0
- package/dist/resources/compliance.js.map +1 -0
- package/dist/resources/context-graphs.js +46 -18
- package/dist/resources/context-graphs.js.map +1 -1
- package/dist/resources/data-sources.js +30 -12
- package/dist/resources/data-sources.js.map +1 -1
- package/dist/resources/functions.js +42 -0
- package/dist/resources/functions.js.map +1 -0
- package/dist/resources/integrations.js +32 -15
- package/dist/resources/integrations.js.map +1 -1
- package/dist/resources/memory.js +13 -4
- package/dist/resources/memory.js.map +1 -1
- package/dist/resources/operators.js +102 -0
- package/dist/resources/operators.js.map +1 -0
- package/dist/resources/personas.js +31 -0
- package/dist/resources/personas.js.map +1 -0
- package/dist/resources/phone-numbers.js +31 -16
- package/dist/resources/phone-numbers.js.map +1 -1
- package/dist/resources/recordings.js +19 -0
- package/dist/resources/recordings.js.map +1 -0
- package/dist/resources/review-queue.js +94 -0
- package/dist/resources/review-queue.js.map +1 -0
- package/dist/resources/safety.js +31 -0
- package/dist/resources/safety.js.map +1 -0
- package/dist/resources/services.js +18 -12
- package/dist/resources/services.js.map +1 -1
- package/dist/resources/settings.js +50 -24
- package/dist/resources/settings.js.map +1 -1
- package/dist/resources/simulations.js +23 -17
- package/dist/resources/simulations.js.map +1 -1
- package/dist/resources/skills.js +22 -16
- package/dist/resources/skills.js.map +1 -1
- package/dist/resources/triggers.js +51 -0
- package/dist/resources/triggers.js.map +1 -0
- package/dist/resources/webhook-destinations.js +44 -0
- package/dist/resources/webhook-destinations.js.map +1 -0
- package/dist/resources/workspaces.js +24 -38
- package/dist/resources/workspaces.js.map +1 -1
- package/dist/resources/world.js +58 -60
- package/dist/resources/world.js.map +1 -1
- package/dist/types/core/branded-types.d.ts +3 -0
- package/dist/types/core/branded-types.d.ts.map +1 -1
- package/dist/types/core/errors.d.ts +3 -0
- package/dist/types/core/errors.d.ts.map +1 -1
- package/dist/types/core/openapi-client.d.ts +13 -5
- package/dist/types/core/openapi-client.d.ts.map +1 -1
- package/dist/types/core/rate-limit.d.ts +8 -0
- package/dist/types/core/rate-limit.d.ts.map +1 -0
- package/dist/types/core/webhooks.d.ts +9 -0
- package/dist/types/core/webhooks.d.ts.map +1 -0
- package/dist/types/generated/api.d.ts +35120 -0
- package/dist/types/generated/api.d.ts.map +1 -0
- package/dist/types/index.d.ts +45 -43
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/resources/actions.d.ts +158 -0
- package/dist/types/resources/actions.d.ts.map +1 -0
- package/dist/types/resources/agents.d.ts +70 -22
- package/dist/types/resources/agents.d.ts.map +1 -1
- package/dist/types/resources/analytics.d.ts +100 -118
- package/dist/types/resources/analytics.d.ts.map +1 -1
- package/dist/types/resources/api-keys.d.ts +36 -7
- package/dist/types/resources/api-keys.d.ts.map +1 -1
- package/dist/types/resources/audit.d.ts +70 -0
- package/dist/types/resources/audit.d.ts.map +1 -0
- package/dist/types/resources/base.d.ts +13 -13
- package/dist/types/resources/base.d.ts.map +1 -1
- package/dist/types/resources/billing.d.ts +52 -12
- package/dist/types/resources/billing.d.ts.map +1 -1
- package/dist/types/resources/calls.d.ts +89 -35
- package/dist/types/resources/calls.d.ts.map +1 -1
- package/dist/types/resources/compliance.d.ts +45 -0
- package/dist/types/resources/compliance.d.ts.map +1 -0
- package/dist/types/resources/context-graphs.d.ts +77 -14
- package/dist/types/resources/context-graphs.d.ts.map +1 -1
- package/dist/types/resources/data-sources.d.ts +105 -9
- package/dist/types/resources/data-sources.d.ts.map +1 -1
- package/dist/types/resources/functions.d.ts +46 -0
- package/dist/types/resources/functions.d.ts.map +1 -0
- package/dist/types/resources/integrations.d.ts +83 -12
- package/dist/types/resources/integrations.d.ts.map +1 -1
- package/dist/types/resources/memory.d.ts +26 -73
- package/dist/types/resources/memory.d.ts.map +1 -1
- package/dist/types/resources/operators.d.ts +157 -0
- package/dist/types/resources/operators.d.ts.map +1 -0
- package/dist/types/resources/personas.d.ts +60 -0
- package/dist/types/resources/personas.d.ts.map +1 -0
- package/dist/types/resources/phone-numbers.d.ts +70 -10
- package/dist/types/resources/phone-numbers.d.ts.map +1 -1
- package/dist/types/resources/recordings.d.ts +29 -0
- package/dist/types/resources/recordings.d.ts.map +1 -0
- package/dist/types/resources/review-queue.d.ts +184 -0
- package/dist/types/resources/review-queue.d.ts.map +1 -0
- package/dist/types/resources/safety.d.ts +57 -0
- package/dist/types/resources/safety.d.ts.map +1 -0
- package/dist/types/resources/services.d.ts +85 -5
- package/dist/types/resources/services.d.ts.map +1 -1
- package/dist/types/resources/settings.d.ts +79 -78
- package/dist/types/resources/settings.d.ts.map +1 -1
- package/dist/types/resources/simulations.d.ts +41 -12
- package/dist/types/resources/simulations.d.ts.map +1 -1
- package/dist/types/resources/skills.d.ts +131 -6
- package/dist/types/resources/skills.d.ts.map +1 -1
- package/dist/types/resources/triggers.d.ts +129 -0
- package/dist/types/resources/triggers.d.ts.map +1 -0
- package/dist/types/resources/webhook-destinations.d.ts +75 -0
- package/dist/types/resources/webhook-destinations.d.ts.map +1 -0
- package/dist/types/resources/workspaces.d.ts +60 -15
- package/dist/types/resources/workspaces.d.ts.map +1 -1
- package/dist/types/resources/world.d.ts +152 -143
- package/dist/types/resources/world.d.ts.map +1 -1
- package/package.json +6 -3
- package/dist/types/api.js +0 -12
- package/dist/types/types/api.d.ts +0 -739
- package/dist/types/types/api.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -41,6 +41,7 @@ console.log(stats.total_calls, stats.avg_duration_seconds)
|
|
|
41
41
|
| `workspaceId` | `string` | Yes | Your workspace ID — all resource operations are scoped to this |
|
|
42
42
|
| `baseUrl` | `string` | No | Override the API base URL (default: `https://api.platform.amigo.ai`) |
|
|
43
43
|
| `retry` | `RetryOptions` | No | Retry configuration for transient failures |
|
|
44
|
+
| `fetch` | `typeof fetch` | No | Custom fetch for BFF proxy, cookie forwarding, or test mocking |
|
|
44
45
|
|
|
45
46
|
### Retry options
|
|
46
47
|
|
|
@@ -256,10 +257,121 @@ console.log(memory.dimensions) // list of configured memory dimensions
|
|
|
256
257
|
### Billing
|
|
257
258
|
|
|
258
259
|
```typescript
|
|
260
|
+
const dashboard = await client.billing.getDashboard()
|
|
259
261
|
const usage = await client.billing.getUsage()
|
|
260
|
-
console.log(usage.meters, usage.total_events)
|
|
261
|
-
|
|
262
262
|
const { items: invoices } = await client.billing.listInvoices()
|
|
263
|
+
const pdf = await client.billing.getInvoicePdf('invoice-id')
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Operators
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
const { items: operators } = await client.operators.list()
|
|
270
|
+
const dashboard = await client.operators.getDashboard()
|
|
271
|
+
const queue = await client.operators.getQueue()
|
|
272
|
+
const escalations = await client.operators.getActiveEscalations()
|
|
273
|
+
|
|
274
|
+
// Join/leave calls, switch mode, send guidance
|
|
275
|
+
await client.operators.joinCall('operator-id', { call_sid: 'call-sid' })
|
|
276
|
+
await client.operators.sendGuidance('operator-id', { text: 'Ask about allergies' })
|
|
277
|
+
await client.operators.wrapUp('operator-id', { outcome: 'resolved' })
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Triggers (Automations)
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
const trigger = await client.triggers.create({
|
|
284
|
+
name: 'Daily outreach',
|
|
285
|
+
schedule: '0 9 * * 1-5',
|
|
286
|
+
timezone: 'America/New_York',
|
|
287
|
+
action_id: 'skill-id',
|
|
288
|
+
event_type: 'trigger.scheduled',
|
|
289
|
+
input_template: { campaign: 'follow-up' },
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
await client.triggers.fire(trigger.id)
|
|
293
|
+
await client.triggers.pause(trigger.id)
|
|
294
|
+
await client.triggers.resume(trigger.id)
|
|
295
|
+
const runs = await client.triggers.listRuns(trigger.id)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Review Queue
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
const stats = await client.reviewQueue.getStats()
|
|
302
|
+
const dashboard = await client.reviewQueue.getDashboard()
|
|
303
|
+
const { items } = await client.reviewQueue.list({ status: 'pending' })
|
|
304
|
+
|
|
305
|
+
// Claim, approve, reject, correct
|
|
306
|
+
await client.reviewQueue.claim('item-id')
|
|
307
|
+
await client.reviewQueue.approve('item-id', { notes: 'Verified correct' })
|
|
308
|
+
await client.reviewQueue.reject('item-id', { reason: 'Data mismatch' })
|
|
309
|
+
await client.reviewQueue.batchApprove({ item_ids: ['id1', 'id2'] })
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Personas
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
const persona = await client.personas.create({
|
|
316
|
+
name: 'Friendly Scheduler',
|
|
317
|
+
voice_style: 'warm and professional',
|
|
318
|
+
})
|
|
319
|
+
const { items: personas } = await client.personas.list()
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Compliance & Safety
|
|
323
|
+
|
|
324
|
+
```typescript
|
|
325
|
+
const hipaa = await client.compliance.getHipaa()
|
|
326
|
+
const safetyConfig = await client.safety.getConfig()
|
|
327
|
+
const templates = await client.safety.listTemplates()
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Audit
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
const { items: events } = await client.audit.list({ limit: 50 })
|
|
334
|
+
const summary = await client.audit.getSummary()
|
|
335
|
+
await client.audit.createExport({ start_date: '2026-01-01', end_date: '2026-03-31' })
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Recordings
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
const urls = await client.recordings.getUrls('call-sid')
|
|
342
|
+
const metadata = await client.recordings.getMetadata('call-sid')
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Functions (UC Functions)
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
const catalog = await client.functions.getCatalog()
|
|
349
|
+
const { items: functions } = await client.functions.list()
|
|
350
|
+
const result = await client.functions.test('my-function', { input: { query: 'test' } })
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Webhook Destinations
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
const dest = await client.webhookDestinations.create({
|
|
357
|
+
name: 'My Webhook',
|
|
358
|
+
url: 'https://example.com/webhook',
|
|
359
|
+
events: ['call.completed'],
|
|
360
|
+
})
|
|
361
|
+
const deliveries = await client.webhookDestinations.listDeliveries(dest.id)
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## BFF Proxy (Next.js)
|
|
365
|
+
|
|
366
|
+
For frontend apps that use a Backend-for-Frontend proxy:
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
const client = new AmigoClient({
|
|
370
|
+
apiKey: 'bff-proxy',
|
|
371
|
+
workspaceId: 'ws-id',
|
|
372
|
+
baseUrl: '/api/platform',
|
|
373
|
+
fetch: customFetchWithCookies,
|
|
374
|
+
})
|
|
263
375
|
```
|
|
264
376
|
|
|
265
377
|
## Pagination
|
|
@@ -4,6 +4,7 @@ export const apiKeyId = (id) => id;
|
|
|
4
4
|
export const agentId = (id) => id;
|
|
5
5
|
export const personaId = (id) => id;
|
|
6
6
|
export const skillId = (id) => id;
|
|
7
|
+
export const actionId = (id) => id;
|
|
7
8
|
export const serviceId = (id) => id;
|
|
8
9
|
export const contextGraphId = (id) => id;
|
|
9
10
|
export const callId = (id) => id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branded-types.js","sourceRoot":"","sources":["../../src/core/branded-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"branded-types.js","sourceRoot":"","sources":["../../src/core/branded-types.ts"],"names":[],"mappings":"AAgCA,uBAAuB;AACvB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAe,EAAE,CAAC,EAAiB,CAAA;AACzE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAY,EAAE,CAAC,EAAc,CAAA;AAChE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,EAAa,CAAA;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,EAAe,CAAA;AACnE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,EAAa,CAAA;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAY,EAAE,CAAC,EAAc,CAAA;AAChE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,EAAe,CAAA;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAU,EAAkB,EAAE,CAAC,EAAoB,CAAA;AAClF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,EAAY,CAAA;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,EAAmB,CAAA;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,EAAmB,CAAA;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAY,EAAE,CAAC,EAAc,CAAA;AAChE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,EAAa,CAAA;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,EAAe,CAAA;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,EAAgB,CAAA;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAa,EAAE,CAAC,EAAe,CAAA;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAmB,EAAE,CAAC,EAAqB,CAAA;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAU,EAAuB,EAAE,CAAC,EAAyB,CAAA;AACjG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAmB,EAAE,CAAC,EAAqB,CAAA;AACrF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAc,EAAE,CAAC,EAAgB,CAAA;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAgB,EAAE,CAAC,EAAkB,CAAA"}
|
package/dist/core/errors.js
CHANGED
|
@@ -2,12 +2,37 @@
|
|
|
2
2
|
* Error hierarchy for the Amigo Platform SDK.
|
|
3
3
|
* All errors extend AmigoError which can be caught with a single catch.
|
|
4
4
|
*/
|
|
5
|
+
const SENSITIVE_FIELDS = new Set([
|
|
6
|
+
'id_token', 'access_token', 'refresh_token', 'authorization',
|
|
7
|
+
'api_key', 'apikey', 'token', 'secret', 'password', 'x-api-key',
|
|
8
|
+
'cookie', 'set-cookie',
|
|
9
|
+
]);
|
|
10
|
+
function sanitizeErrorContext(obj) {
|
|
11
|
+
if (typeof obj !== 'object' || !obj)
|
|
12
|
+
return obj;
|
|
13
|
+
if (Array.isArray(obj))
|
|
14
|
+
return obj.map(sanitizeErrorContext);
|
|
15
|
+
const result = {};
|
|
16
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
17
|
+
if (SENSITIVE_FIELDS.has(key.toLowerCase())) {
|
|
18
|
+
result[key] = '[REDACTED]';
|
|
19
|
+
}
|
|
20
|
+
else if (typeof value === 'object' && value !== null) {
|
|
21
|
+
result[key] = sanitizeErrorContext(value);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result[key] = value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
5
29
|
/** Base class for all Amigo Platform SDK errors */
|
|
6
30
|
export class AmigoError extends Error {
|
|
7
31
|
statusCode;
|
|
8
32
|
errorCode;
|
|
9
33
|
requestId;
|
|
10
34
|
detail;
|
|
35
|
+
context;
|
|
11
36
|
constructor(message, ctx = {}) {
|
|
12
37
|
super(message);
|
|
13
38
|
this.name = this.constructor.name;
|
|
@@ -15,8 +40,23 @@ export class AmigoError extends Error {
|
|
|
15
40
|
this.errorCode = ctx.errorCode;
|
|
16
41
|
this.requestId = ctx.requestId;
|
|
17
42
|
this.detail = ctx.detail;
|
|
18
|
-
|
|
43
|
+
this.context = ctx.context ? sanitizeErrorContext(ctx.context) : undefined;
|
|
19
44
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
45
|
+
if (typeof Error.captureStackTrace === 'function') {
|
|
46
|
+
Error.captureStackTrace(this, this.constructor);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
toJSON() {
|
|
50
|
+
return {
|
|
51
|
+
name: this.name,
|
|
52
|
+
message: this.message,
|
|
53
|
+
statusCode: this.statusCode,
|
|
54
|
+
errorCode: this.errorCode,
|
|
55
|
+
requestId: this.requestId,
|
|
56
|
+
detail: this.detail,
|
|
57
|
+
context: this.context,
|
|
58
|
+
stack: this.stack,
|
|
59
|
+
};
|
|
20
60
|
}
|
|
21
61
|
}
|
|
22
62
|
/** 400 Bad Request */
|
|
@@ -80,8 +120,7 @@ export class NetworkError extends AmigoError {
|
|
|
80
120
|
constructor(message, cause) {
|
|
81
121
|
super(message);
|
|
82
122
|
if (cause !== undefined) {
|
|
83
|
-
;
|
|
84
|
-
this.cause = cause;
|
|
123
|
+
Object.defineProperty(this, 'cause', { value: cause, writable: false, enumerable: true });
|
|
85
124
|
}
|
|
86
125
|
}
|
|
87
126
|
}
|
|
@@ -114,6 +153,7 @@ export async function createApiError(response) {
|
|
|
114
153
|
errorCode: body.error_code,
|
|
115
154
|
requestId: body.request_id,
|
|
116
155
|
detail: body.detail,
|
|
156
|
+
context: { url: response.url, response: body },
|
|
117
157
|
};
|
|
118
158
|
const message = body.message ?? body.detail ?? response.statusText ?? `HTTP ${response.status}`;
|
|
119
159
|
switch (response.status) {
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +1,75 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Creates a configured openapi-fetch client with auth, error handling,
|
|
2
|
+
* Creates a configured openapi-fetch client with auth, error handling,
|
|
3
|
+
* and retry middleware.
|
|
4
|
+
*
|
|
5
|
+
* Supports custom `fetch` for BFF proxy patterns (e.g., developer-console
|
|
6
|
+
* routing through Next.js API routes).
|
|
3
7
|
*/
|
|
4
|
-
import
|
|
8
|
+
import createClientImport from 'openapi-fetch';
|
|
5
9
|
import { createAuthMiddleware } from './auth.js';
|
|
6
|
-
import { createApiError } from './errors.js';
|
|
10
|
+
import { createApiError, NetworkError } from './errors.js';
|
|
7
11
|
import { shouldRetry, computeDelay, resolveRetryOptions } from './retry.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
// Handle ESM/CJS interop for openapi-fetch (esbuild __toESM wrapper)
|
|
13
|
+
const createClient = typeof createClientImport === 'function'
|
|
14
|
+
? createClientImport
|
|
15
|
+
: createClientImport.default;
|
|
16
|
+
export function createPlatformClient(config) {
|
|
17
|
+
const retryOpts = resolveRetryOptions(config.retry);
|
|
18
|
+
const baseFetch = config.fetch ?? globalThis.fetch;
|
|
19
|
+
// Wrap fetch with retry logic
|
|
20
|
+
const retryingFetch = async (input, init) => {
|
|
21
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
22
|
+
const signal = init?.signal;
|
|
23
|
+
const isIdempotent = method === 'GET' || method === 'HEAD' || method === 'OPTIONS';
|
|
24
|
+
for (let attempt = 0; attempt < retryOpts.maxAttempts; attempt++) {
|
|
25
|
+
let response;
|
|
26
|
+
let error;
|
|
27
|
+
try {
|
|
28
|
+
response = await baseFetch(input, init);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
error = err;
|
|
32
|
+
}
|
|
33
|
+
if (!error && response && response.ok)
|
|
34
|
+
return response;
|
|
35
|
+
const ctx = { method, attempt, response: response, options: retryOpts };
|
|
36
|
+
const attemptsRemain = attempt + 1 < retryOpts.maxAttempts;
|
|
37
|
+
if (error) {
|
|
38
|
+
if (isIdempotent && attemptsRemain) {
|
|
39
|
+
await sleep(computeDelay(attempt, new Response(), retryOpts));
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
throw new NetworkError(`Network error: ${error instanceof Error ? error.message : String(error)}`, error);
|
|
43
|
+
}
|
|
44
|
+
if (response && attemptsRemain && shouldRetry(ctx)) {
|
|
45
|
+
const delay = computeDelay(attempt, response, retryOpts);
|
|
46
|
+
if (signal?.aborted)
|
|
47
|
+
return response;
|
|
48
|
+
await sleep(delay);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
return response;
|
|
52
|
+
}
|
|
53
|
+
throw new NetworkError('Retry loop exhausted');
|
|
54
|
+
};
|
|
55
|
+
const client = createClient({
|
|
56
|
+
baseUrl: config.baseUrl,
|
|
57
|
+
fetch: retryingFetch,
|
|
58
|
+
});
|
|
59
|
+
// Error middleware — convert HTTP errors to typed AmigoError subclasses
|
|
14
60
|
const errorMiddleware = {
|
|
15
61
|
async onResponse({ response }) {
|
|
16
|
-
if (response.
|
|
62
|
+
if (!response.ok) {
|
|
17
63
|
throw await createApiError(response);
|
|
18
64
|
}
|
|
19
65
|
return response;
|
|
20
66
|
},
|
|
21
67
|
};
|
|
68
|
+
// Auth middleware — attach Bearer token
|
|
69
|
+
const authMiddleware = createAuthMiddleware({ apiKey: config.apiKey });
|
|
70
|
+
// Order: auth first (adds header), then error (converts failures)
|
|
71
|
+
client.use(authMiddleware);
|
|
22
72
|
client.use(errorMiddleware);
|
|
23
|
-
// Retry middleware — exponential backoff with jitter
|
|
24
|
-
const retryMiddleware = {
|
|
25
|
-
async onRequest({ request, schemaPath }) {
|
|
26
|
-
// Store method for use in onResponse
|
|
27
|
-
;
|
|
28
|
-
request._method =
|
|
29
|
-
request.method.toUpperCase();
|
|
30
|
-
void schemaPath;
|
|
31
|
-
return request;
|
|
32
|
-
},
|
|
33
|
-
async onResponse({ request, response }) {
|
|
34
|
-
const method = request._method ?? request.method.toUpperCase();
|
|
35
|
-
let attempt = 0;
|
|
36
|
-
let currentResponse = response;
|
|
37
|
-
while (shouldRetry({
|
|
38
|
-
method,
|
|
39
|
-
attempt,
|
|
40
|
-
response: currentResponse,
|
|
41
|
-
options: retryOptions,
|
|
42
|
-
})) {
|
|
43
|
-
const delayMs = computeDelay(attempt, currentResponse, retryOptions);
|
|
44
|
-
await sleep(delayMs);
|
|
45
|
-
attempt++;
|
|
46
|
-
try {
|
|
47
|
-
const retried = await fetch(request.clone());
|
|
48
|
-
currentResponse = retried;
|
|
49
|
-
if (currentResponse.status < 400)
|
|
50
|
-
return currentResponse;
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// Network error on retry — fall through to throw original
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return currentResponse;
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
client.use(retryMiddleware);
|
|
61
73
|
return client;
|
|
62
74
|
}
|
|
63
75
|
function sleep(ms) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-client.js","sourceRoot":"","sources":["../../src/core/openapi-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openapi-client.js","sourceRoot":"","sources":["../../src/core/openapi-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function parseRateLimitHeaders(headers) {
|
|
2
|
+
const limit = headers.get('x-ratelimit-limit');
|
|
3
|
+
const remaining = headers.get('x-ratelimit-remaining');
|
|
4
|
+
const reset = headers.get('x-ratelimit-reset');
|
|
5
|
+
const retryAfter = headers.get('retry-after');
|
|
6
|
+
return {
|
|
7
|
+
limit: limit ? parseInt(limit, 10) : null,
|
|
8
|
+
remaining: remaining ? parseInt(remaining, 10) : null,
|
|
9
|
+
reset: reset ? new Date(parseInt(reset, 10) * 1000) : null,
|
|
10
|
+
retryAfter: retryAfter ? parseInt(retryAfter, 10) : null,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/core/rate-limit.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAE7C,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QACzC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1D,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;KACzD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function verifyWebhookSignature(payload, signature, secret) {
|
|
2
|
+
const encoder = new TextEncoder();
|
|
3
|
+
const key = await crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
4
|
+
const mac = await crypto.subtle.sign('HMAC', key, typeof payload === 'string' ? encoder.encode(payload) : payload);
|
|
5
|
+
const expected = Array.from(new Uint8Array(mac))
|
|
6
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
7
|
+
.join('');
|
|
8
|
+
return signature === `sha256=${expected}`;
|
|
9
|
+
}
|
|
10
|
+
export async function parseWebhookEvent(payload, signature, secret) {
|
|
11
|
+
const valid = await verifyWebhookSignature(payload, signature, secret);
|
|
12
|
+
if (!valid) {
|
|
13
|
+
throw new Error('Invalid webhook signature');
|
|
14
|
+
}
|
|
15
|
+
return JSON.parse(payload);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/core/webhooks.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA4B,EAC5B,SAAiB,EACjB,MAAc;IAEd,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAA;IACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAClC,MAAM,EACN,GAAG,EACH,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAChE,CAAA;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAA;IACX,OAAO,SAAS,KAAK,UAAU,QAAQ,EAAE,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,SAAiB,EACjB,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACtE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAA;AAC/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/generated/api.ts"],"names":[],"mappings":""}
|