sadasend 0.0.0-stage → 0.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.
@@ -0,0 +1,452 @@
1
+ import { SadaSendError, type DnsRecord } from './errors.js';
2
+ import { type RetryPolicy } from './retry.js';
3
+ /**
4
+ * The SadaSend client.
5
+ *
6
+ * **Results are a union, not exceptions.** Every guardrail refusal — an agent
7
+ * stopped from mailing outside its allowlist, a send held for approval, a
8
+ * suppressed recipient — is the product working as designed. Throwing on those
9
+ * makes the normal case an exception, and `catch` blocks are where errors go to
10
+ * be swallowed. So `{ ok: true, ... } | { ok: false, error }`, and the compiler
11
+ * makes you look at it.
12
+ *
13
+ * The one thing that *does* throw is `ConnectionError`: not knowing whether the
14
+ * API saw the request is a different situation from being told no.
15
+ */
16
+ export type Attachment = {
17
+ filename: string;
18
+ content: string;
19
+ contentType?: string;
20
+ contentId?: string;
21
+ };
22
+ export type SendInput = {
23
+ from: string;
24
+ to: string | string[];
25
+ subject?: string;
26
+ html?: string;
27
+ text?: string;
28
+ /** Template name or id, rendered server-side with `variables`. */
29
+ template?: string;
30
+ variables?: Record<string, unknown>;
31
+ /**
32
+ * Where replies go. Not a recipient: it costs no quota and is checked against
33
+ * neither the key's allowlist nor your suppression list.
34
+ */
35
+ replyTo?: string | string[];
36
+ /**
37
+ * Copied recipients, and recipients in every sense the guardrails care about.
38
+ *
39
+ * They count against quota and are checked against the key's allowlist and
40
+ * your suppression list exactly as `to` is. Putting an address in `bcc` is not
41
+ * a way around a guardrail — it only changes who can see it.
42
+ */
43
+ cc?: string | string[];
44
+ bcc?: string | string[];
45
+ /**
46
+ * Up to ten labels for the log and the stats.
47
+ *
48
+ * Lowercased and de-duplicated server-side, so `Welcome` and `welcome` are one
49
+ * tag rather than two rows in a breakdown nobody can read. `GET
50
+ * /account/stats?by_tag=true` then gives each its own bounce and complaint
51
+ * rate, against its own send count.
52
+ */
53
+ tags?: string[];
54
+ headers?: Record<string, string>;
55
+ attachments?: Attachment[];
56
+ scheduledAt?: Date | string;
57
+ /**
58
+ * Run every check and send nothing. The cheapest way to be sure, and the
59
+ * same code path as a real send — a preview down a different path would be a
60
+ * preview of something else.
61
+ */
62
+ dryRun?: boolean;
63
+ /**
64
+ * Sent as `Idempotency-Key`. **Generated for you if you leave it out**, so a
65
+ * retried request cannot become two emails. Pass your own when the natural
66
+ * key is in your domain — an order id makes "send this receipt once" true
67
+ * across process restarts, which a generated one cannot.
68
+ */
69
+ idempotencyKey?: string;
70
+ /** Ingress channel override: `sdk` (default), `api`, `mcp`, `smtp`. */
71
+ channel?: string;
72
+ /** Sending source persona: `backend`, `agent`, `automation`, `system`. */
73
+ source?: string;
74
+ /** Associated AI agent identifier or name (e.g. `billing-bot`, `claude-code`). */
75
+ agentName?: string;
76
+ agent_name?: string;
77
+ };
78
+ export type SendResult = {
79
+ ok: true;
80
+ id: string;
81
+ status: 'queued' | 'pending_approval';
82
+ dryRun?: true;
83
+ rendered?: unknown;
84
+ } | {
85
+ ok: false;
86
+ error: SadaSendError;
87
+ };
88
+ export type BatchItemResult = {
89
+ index: number;
90
+ ok: boolean;
91
+ id?: string;
92
+ status?: string;
93
+ error?: string;
94
+ message?: string;
95
+ allowlist?: string[];
96
+ };
97
+ export type BatchResult = {
98
+ results: BatchItemResult[];
99
+ accepted: number;
100
+ refused: number;
101
+ total: number;
102
+ };
103
+ export type MessageStatus = 'queued' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'refused' | 'cancelled' | 'pending_approval';
104
+ export type Message = {
105
+ id: string;
106
+ to: string[];
107
+ from: string;
108
+ subject: string | null;
109
+ status: MessageStatus;
110
+ at: string;
111
+ events?: {
112
+ type: string;
113
+ at: string;
114
+ detail?: string;
115
+ }[];
116
+ channel?: string;
117
+ source?: string;
118
+ agentName?: string | null;
119
+ };
120
+ export type AccountInfo = {
121
+ org: string;
122
+ plan: string;
123
+ state: string;
124
+ emailsUsed: number;
125
+ emailQuota: number;
126
+ domainsUsed: number;
127
+ domainQuota: number;
128
+ retentionDays: number;
129
+ trackOpens: boolean;
130
+ trackClicks: boolean;
131
+ seatsUsed: number;
132
+ seatQuota: number;
133
+ quotaPeriodStart?: string | null;
134
+ quotaPeriodEnd?: string | null;
135
+ nextResetAt?: string | null;
136
+ daysUntilReset?: number | null;
137
+ dailySendLimit?: number | null;
138
+ dailySendsUsed?: number | null;
139
+ dailyResetAt?: string | null;
140
+ dailyResetSeconds?: number | null;
141
+ reputationLevel?: string;
142
+ warmup?: {
143
+ applies: boolean;
144
+ day: number;
145
+ totalDays: number;
146
+ dailyLimit: number;
147
+ dailyUsed: number | null;
148
+ nextDayLimit: number | null;
149
+ resetSeconds: number | null;
150
+ dailyResetAt?: string | null;
151
+ };
152
+ };
153
+ export type AccountStats = {
154
+ window: string;
155
+ sent: number;
156
+ delivered: number;
157
+ deliveryRate: number;
158
+ bounced: number;
159
+ bounceRate: number;
160
+ complained: number;
161
+ complaintRate: number;
162
+ };
163
+ export type AccountVolumeDay = {
164
+ date: string;
165
+ sent: number;
166
+ delivered: number;
167
+ bounced: number;
168
+ complained: number;
169
+ };
170
+ export type AccountVolume = {
171
+ window: string;
172
+ days: AccountVolumeDay[];
173
+ };
174
+ export type ChecklistItem = {
175
+ key: string;
176
+ title: string;
177
+ completed: boolean;
178
+ };
179
+ export type AccountChecklist = {
180
+ items: ChecklistItem[];
181
+ completed: number;
182
+ total: number;
183
+ };
184
+ export type TemplateSummary = {
185
+ id: string;
186
+ name: string;
187
+ version: number;
188
+ };
189
+ export type TemplateDetail = {
190
+ id: string;
191
+ name: string;
192
+ subject: string;
193
+ html?: string;
194
+ text?: string;
195
+ version: number;
196
+ };
197
+ export type WebhookEndpoint = {
198
+ id: string;
199
+ url: string;
200
+ events: string[];
201
+ enabled: boolean;
202
+ };
203
+ export type WebhookDelivery = {
204
+ id: string;
205
+ event: string;
206
+ status: number;
207
+ success: boolean;
208
+ };
209
+ export type CircuitBreaker = {
210
+ agentIdentifier: string;
211
+ agentName: string;
212
+ channel: string;
213
+ trippedAt: string;
214
+ reason: string;
215
+ };
216
+ export type StaffAccess = {
217
+ id: string;
218
+ at: string;
219
+ staff: string;
220
+ role: string;
221
+ reason: string;
222
+ reference?: string;
223
+ messageId?: string;
224
+ subject?: string;
225
+ };
226
+ export type ApiKeySummary = {
227
+ id: string;
228
+ name: string;
229
+ prefix: string;
230
+ mode: string;
231
+ scopes: string[];
232
+ createdAt: string;
233
+ lastUsedAt?: string | null;
234
+ };
235
+ export type HeldApproval = {
236
+ id: string;
237
+ to: string;
238
+ subject: string;
239
+ requestedBy: string;
240
+ at: string;
241
+ };
242
+ export type SupportTicketSummary = {
243
+ id: string;
244
+ subject: string;
245
+ status: string;
246
+ priority: string;
247
+ createdAt: string;
248
+ };
249
+ export type TeamMember = {
250
+ id: string;
251
+ name: string;
252
+ email: string;
253
+ role: string;
254
+ };
255
+ export type DeliverabilityTool = {
256
+ id: string;
257
+ name: string;
258
+ description: string;
259
+ };
260
+ export type Result<T> = {
261
+ ok: true;
262
+ data: T;
263
+ } | {
264
+ ok: false;
265
+ error: SadaSendError;
266
+ };
267
+ export type ClientOptions = {
268
+ apiKey?: string;
269
+ baseUrl?: string;
270
+ /** Per attempt, not for the whole call including retries. */
271
+ timeoutMs?: number;
272
+ retry?: Partial<RetryPolicy>;
273
+ /** For tests and for a runtime with its own instrumented fetch. */
274
+ fetch?: typeof globalThis.fetch;
275
+ /** Default ingress channel: `sdk` (default), `api`, `mcp`, `smtp`. */
276
+ channel?: string;
277
+ /** Default sending source persona: `backend`, `agent`, `automation`, `system`. */
278
+ source?: string;
279
+ /** Default AI agent identifier or name. */
280
+ agentName?: string;
281
+ };
282
+ export declare class SadaSend {
283
+ #private;
284
+ constructor(apiKeyOrOptions?: string | ClientOptions, options?: ClientOptions);
285
+ /**
286
+ * Send an email.
287
+ *
288
+ * ```ts
289
+ * const r = await sadasend.emails.send({ from, to, subject, html });
290
+ * if (!r.ok) return console.error(r.error.message);
291
+ * ```
292
+ *
293
+ * `r.status` is `'pending_approval'` when the key is in approval mode — the
294
+ * message is real and waiting for a person, not lost. Treating that as a
295
+ * success is correct: the send was accepted.
296
+ */
297
+ readonly emails: {
298
+ send: (input: SendInput) => Promise<SendResult>;
299
+ batch: (items: SendInput[], options?: {
300
+ idempotencyKey?: string;
301
+ }) => Promise<Result<BatchResult>>;
302
+ get: (id: string) => Promise<Result<Message>>;
303
+ resend: (id: string, options?: {
304
+ idempotencyKey?: string;
305
+ }) => Promise<Result<{
306
+ id: string;
307
+ status: MessageStatus;
308
+ }>>;
309
+ list: (params?: {
310
+ status?: MessageStatus;
311
+ q?: string;
312
+ tag?: string;
313
+ channel?: string;
314
+ source?: string;
315
+ agentName?: string;
316
+ agent_name?: string;
317
+ limit?: number;
318
+ cursor?: string;
319
+ }) => Promise<{
320
+ ok: false;
321
+ error: SadaSendError;
322
+ } | {
323
+ ok: true;
324
+ data: {
325
+ messages: Message[];
326
+ total?: number;
327
+ nextCursor: string | null;
328
+ };
329
+ }>;
330
+ cancel: (id: string) => Promise<Result<{
331
+ id: string;
332
+ status: MessageStatus;
333
+ scheduledAt?: string | null;
334
+ }>>;
335
+ };
336
+ readonly account: {
337
+ get: () => Promise<Result<AccountInfo>>;
338
+ stats: (params?: {
339
+ window?: string;
340
+ by_tag?: boolean;
341
+ }) => Promise<Result<AccountStats>>;
342
+ volume: (params?: {
343
+ window?: string;
344
+ }) => Promise<Result<AccountVolume>>;
345
+ checklist: () => Promise<Result<AccountChecklist>>;
346
+ circuitBreakers: () => Promise<Result<{
347
+ circuitBreakers: CircuitBreaker[];
348
+ }>>;
349
+ staffAccess: (params?: {
350
+ limit?: number;
351
+ }) => Promise<Result<{
352
+ accesses: StaffAccess[];
353
+ note?: string;
354
+ }>>;
355
+ };
356
+ readonly domains: {
357
+ list: () => Promise<Result<{
358
+ domains: {
359
+ id: string;
360
+ name: string;
361
+ status: string;
362
+ }[];
363
+ }>>;
364
+ records: (id: string) => Promise<Result<{
365
+ records: DnsRecord[];
366
+ }>>;
367
+ verify: (id: string) => Promise<Result<{
368
+ status: string;
369
+ verified?: boolean;
370
+ inconclusive?: boolean;
371
+ checks?: DnsRecord[];
372
+ records?: DnsRecord[];
373
+ }>>;
374
+ };
375
+ readonly suppressions: {
376
+ list: (params?: {
377
+ q?: string;
378
+ reason?: string;
379
+ limit?: number;
380
+ }) => Promise<Result<{
381
+ suppressions: {
382
+ address: string;
383
+ reason: string;
384
+ createdAt: string;
385
+ }[];
386
+ total: number;
387
+ }>>;
388
+ add: (address: string, reason?: string) => Promise<Result<{
389
+ address: string;
390
+ reason: string;
391
+ already?: boolean;
392
+ }>>;
393
+ };
394
+ readonly templates: {
395
+ list: () => Promise<Result<{
396
+ templates: TemplateSummary[];
397
+ }>>;
398
+ get: (id: string) => Promise<Result<TemplateDetail>>;
399
+ render: (id: string, variables?: Record<string, unknown>) => Promise<Result<{
400
+ subject?: string;
401
+ html?: string;
402
+ text?: string;
403
+ }>>;
404
+ test: (id: string, options: {
405
+ to: string;
406
+ variables?: Record<string, unknown>;
407
+ }) => Promise<Result<{
408
+ ok: boolean;
409
+ messageId: string;
410
+ }>>;
411
+ };
412
+ readonly keys: {
413
+ list: () => Promise<Result<{
414
+ keys: ApiKeySummary[];
415
+ }>>;
416
+ approvals: () => Promise<Result<{
417
+ pending: HeldApproval[];
418
+ }>>;
419
+ };
420
+ readonly support: {
421
+ tickets: (params?: {
422
+ limit?: number;
423
+ }) => Promise<Result<{
424
+ tickets: SupportTicketSummary[];
425
+ }>>;
426
+ ticket: (id: string) => Promise<Result<any>>;
427
+ };
428
+ readonly team: {
429
+ get: () => Promise<Result<{
430
+ members: TeamMember[];
431
+ invitations?: any[];
432
+ }>>;
433
+ };
434
+ readonly tools: {
435
+ list: () => Promise<Result<{
436
+ tools: DeliverabilityTool[];
437
+ }>>;
438
+ check: (check: string, subject: string, selector?: string) => Promise<Result<any>>;
439
+ };
440
+ readonly webhooks: {
441
+ list: () => Promise<Result<{
442
+ webhooks: WebhookEndpoint[];
443
+ }>>;
444
+ deliveries: (id: string, params?: {
445
+ limit?: number;
446
+ event?: string;
447
+ }) => Promise<Result<{
448
+ deliveries: WebhookDelivery[];
449
+ }>>;
450
+ };
451
+ }
452
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}