@stackshift-cloud/sdk 0.1.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,16 +44,16 @@ const message = await stackshift.mail.send({
44
44
  console.log(message.id, message.status, message.idempotencyStatus)
45
45
  ```
46
46
 
47
- Inspect sent messages:
47
+ Inspect MTA-accepted messages:
48
48
 
49
49
  ```ts
50
- const messages = await stackshift.mail.messages.list({ status: 'sent', limit: 20 })
50
+ const messages = await stackshift.mail.messages.list({ status: 'mta_accepted', limit: 20 })
51
51
  const detail = await stackshift.mail.messages.get(messages.data[0].id)
52
52
  const attempts = await stackshift.mail.messages.attempts(detail.id)
53
53
  const logs = await stackshift.mail.messages.logs(detail.id)
54
54
  ```
55
55
 
56
- In this MVP, `sent` means the message was accepted by StackShift's outbound MTA. It does not mean inbox delivery, opens, clicks, or spam placement. A `sent` message can later become `bounced` if StackShift receives a delivery-status notification.
56
+ `mta_accepted` means StackShift's outbound MTA accepted the message. `delivered` means the recipient MX accepted a recipient; it does not claim inbox placement or human receipt. Recipient records remain authoritative for mixed outcomes.
57
57
 
58
58
  ## Send a template
59
59
 
package/dist/index.d.ts CHANGED
@@ -4,12 +4,17 @@ export { createResponsiveImage, namedResponsiveSource, uploadBrowserFile } from
4
4
  export type { ArtDirectionSource, ResponsiveImageDescriptor, ResponsiveImageOptions } from './assets-framework.js';
5
5
  export { assetContractOperations } from './generated/assets-contract.js';
6
6
  export type { AssetAPIScope, AssetContractOperation, AssetOperationId } from './generated/assets-contract.js';
7
- export { MailBouncesClient, MailClient, MailDomainsClient, MailEventsClient, MailLimitsClient, MailMessagesClient, MailScheduledClient, MailBatchClient, MailInboundClient, MailAnalyticsClient, MailOtpChallengesClient, MailOtpClient, MailReputationClient, MailReputationEventsClient, MailSuppressionsClient, MailTemplatesClient, MailWebhooksClient, } from './mail.js';
7
+ export { MailBouncesClient, MailClient, MailDomainsClient, MailEventsClient, MailLimitsClient, MailMessagesClient, MailScheduledClient, MailBatchClient, MailInboundClient, MailAnalyticsClient, MailOtpChallengesClient, MailOtpClient, MailReputationClient, MailReputationEventsClient, MailSuppressionsClient, MailTemplatesClient, MailWebhooksClient, MailStreamsClient, MailAudiencesClient, MailCampaignsClient, } from './mail.js';
8
+ export type { MailAudience, MailAudienceMember, MailAudienceMemberImport, MailCampaign } from './mail-campaigns.js';
9
+ export { MailExportsClient } from './mail-exports.js';
10
+ export type { MailExport, MailExportCreateInput } from './mail-exports.js';
11
+ export type { MailDiagnosticFinding, MailTemplateDiagnosticInput, MailTemplateDiagnosticResult } from './mail-diagnostics.js';
8
12
  export { ProjectsClient } from './projects.js';
9
- export type { Asset, AssetAIAnnotation, AssetAIInfo, AssetCollection, AssetListOptions, AssetListResult, AssetModerationResult, AssetSavedSearch, AssetSignedUploadUrl, AssetSignedUploadUrlOptions, AssetSignedUrl, AssetSignedUrlOptions, AssetTranscript, AssetTransformOptions, AssetTransformPreset, AssetTransformPresetCategory, AssetUploadOptions, AssetVisibility, AssetVersion, JsonValue, MailAddress, MailAddressInput, MailDnsRecord, MailDomain, MailDomainListResult, MailDomainStatus, MailIdempotencyStatus, MailLog, MailMessage, MailMessageListOptions, MailMessageListResult, MailMessageSummary, MailRecordStatus, MailSendAttempt, MailSendInput, MailSendResponse, MailStatus, Project, ProjectListOptions, StackShiftOptions, } from './types.js';
10
- export type { MailBounce, MailBounceListOptions, MailBounceListResult, MailBounceType, MailSuppression, MailSuppressionCreateInput, MailSuppressionListOptions, MailSuppressionListResult, MailSuppressionReason, MailSuppressionSource, } from './mail-phase4-types.js';
13
+ export type { Asset, AssetAIAnnotation, AssetAIInfo, AssetCollection, AssetListOptions, AssetListResult, AssetModerationResult, AssetSavedSearch, AssetSignedUploadUrl, AssetSignedUploadUrlOptions, AssetSignedUrl, AssetSignedUrlOptions, AssetTranscript, AssetTransformOptions, AssetTransformPreset, AssetTransformPresetCategory, AssetUploadOptions, AssetVisibility, AssetVersion, JsonValue, MailAddress, MailAddressInput, MailDnsRecord, MailDomain, MailDomainListResult, MailDomainStatus, MailIdempotencyStatus, MailLog, MailMessage, MailMessageListOptions, MailMessageListResult, MailMessageSummary, MailRecordStatus, MailSendAttempt, MailSendInput, MailSendResponse, MailStatus, MailRecipient, MailRecipientStatus, MailRecipientSummary, Project, ProjectListOptions, StackShiftOptions, } from './types.js';
14
+ export type { MailBounce, MailBounceListOptions, MailBounceListResult, MailBounceType, MailSuppression, MailSuppressionCreateInput, MailSuppressionListOptions, MailSuppressionListResult, MailSuppressionReason, MailSuppressionSource, } from './mail-delivery-types.js';
11
15
  export type { MailOtpChallenge, MailOtpChallengeListOptions, MailOtpChallengeListResult, MailOtpSendInput, MailOtpSendResponse, MailOtpStatus, MailOtpVerifyInput, MailOtpVerifyResponse, } from './mail-otp-types.js';
12
16
  export type { MailSendTemplateInput, MailSendTemplateResponse, MailTemplate, MailTemplateCreateInput, MailTemplateDetail, MailTemplateListOptions, MailTemplateListResult, MailTemplatePreview, MailTemplatePreviewInput, MailTemplateStatus, MailTemplateTestSendInput, MailTemplateTestSendResponse, MailTemplateUpdateInput, MailTemplateVersion, } from './mail-template-types.js';
13
- export type { MailEvent, MailEventListOptions, MailEventListResult, MailEventType, MailTimelineItem, MailWebhook, MailWebhookCreateInput, MailWebhookCreateResponse, MailWebhookDelivery, MailWebhookDeliveryAttempt, MailWebhookDeliveryDetail, MailWebhookDeliveryListOptions, MailWebhookListOptions, MailWebhookListResult, MailWebhookUpdateInput, } from './mail-webhook-types.js';
17
+ export type { MailEvent, MailEventListOptions, MailEventListResult, MailEventType, MailTimelineItem, MailWebhook, MailWebhookCreateInput, MailWebhookCreateResponse, MailWebhookDelivery, MailWebhookDeliveryAttempt, MailWebhookDeliveryDetail, MailWebhookDeliveryListOptions, MailWebhookListOptions, MailWebhookListResult, MailWebhookUpdateInput, MailWebhookReplay, MailWebhookReplayInput, } from './mail-webhook-types.js';
18
+ export type { MailMessageStream, MailMessageStreamCreateInput, MailMessageStreamListResult } from './mail-streams.js';
14
19
  export type { MailDomainReputation, MailLimits, MailManualReviewStatus, MailReputation, MailReputationEvent, MailReputationEventListOptions, MailReputationEventListResult, MailReputationEventSeverity, MailReputationStatus, MailReputationTier, MailReputationWorkspace, } from './mail-reputation-types.js';
15
- export type { MailAnalytics, MailAnalyticsInput, MailAttachmentInput, MailBatch, MailBatchSendInput, MailBatchTemplateInput, MailInboundDomain, MailInboundMessage, MailScheduledCreateInput, MailScheduledMessage, } from './mail-advanced-types.js';
20
+ export type { MailAnalytics, MailAnalyticsInput, MailAttachmentInput, MailBatch, MailBatchItem, MailBatchSendInput, MailBatchTemplateInput, MailInboundDomain, MailInboundMessage, MailScheduledCreateInput, MailScheduledMessage, } from './mail-advanced-types.js';
package/dist/index.js CHANGED
@@ -2,5 +2,6 @@ export { StackShift, StackShiftAPIError } from './client.js';
2
2
  export { AssetsClient, assetTransformOptions, assetTransformPresets, assetTransformSpec, getAssetTransformPreset } from './assets.js';
3
3
  export { createResponsiveImage, namedResponsiveSource, uploadBrowserFile } from './assets-framework.js';
4
4
  export { assetContractOperations } from './generated/assets-contract.js';
5
- export { MailBouncesClient, MailClient, MailDomainsClient, MailEventsClient, MailLimitsClient, MailMessagesClient, MailScheduledClient, MailBatchClient, MailInboundClient, MailAnalyticsClient, MailOtpChallengesClient, MailOtpClient, MailReputationClient, MailReputationEventsClient, MailSuppressionsClient, MailTemplatesClient, MailWebhooksClient, } from './mail.js';
5
+ export { MailBouncesClient, MailClient, MailDomainsClient, MailEventsClient, MailLimitsClient, MailMessagesClient, MailScheduledClient, MailBatchClient, MailInboundClient, MailAnalyticsClient, MailOtpChallengesClient, MailOtpClient, MailReputationClient, MailReputationEventsClient, MailSuppressionsClient, MailTemplatesClient, MailWebhooksClient, MailStreamsClient, MailAudiencesClient, MailCampaignsClient, } from './mail.js';
6
+ export { MailExportsClient } from './mail-exports.js';
6
7
  export { ProjectsClient } from './projects.js';
@@ -1,10 +1,12 @@
1
- import type { JsonValue, MailAddress, MailAddressInput, MailSendInput, MailSendResponse } from './types.js';
1
+ import type { JsonValue, MailAddress, MailAddressInput, MailRecipient, MailSendInput, MailSendResponse } from './types.js';
2
2
  import type { MailSendTemplateInput } from './mail-template-types.js';
3
3
  export interface MailAttachmentInput {
4
4
  assetId?: string;
5
5
  uploadId?: string;
6
6
  filename: string;
7
7
  contentType?: string;
8
+ disposition?: 'attachment' | 'inline';
9
+ contentId?: string;
8
10
  }
9
11
  export interface MailScheduledCreateInput {
10
12
  sendAt: string;
@@ -16,15 +18,18 @@ export interface MailScheduledCreateInput {
16
18
  data?: Record<string, JsonValue>;
17
19
  idempotencyKey?: string;
18
20
  attachments?: MailAttachmentInput[];
21
+ headers?: Record<string, string>;
22
+ tags?: Record<string, string>;
23
+ stream?: string;
19
24
  }
20
25
  export interface MailScheduledMessage {
21
26
  id: string;
22
- status: 'scheduled' | 'queued' | 'sent' | 'canceled' | 'failed';
27
+ status: 'scheduled' | 'queued' | 'dispatched' | 'canceled' | 'failed';
23
28
  sendAt: string;
24
29
  messageId?: string | null;
25
30
  createdAt?: string;
26
31
  canceledAt?: string | null;
27
- sentAt?: string | null;
32
+ dispatchedAt?: string | null;
28
33
  }
29
34
  export interface MailBatchSendInput {
30
35
  from: string | MailAddress;
@@ -39,11 +44,28 @@ export interface MailBatchTemplateInput {
39
44
  data?: Record<string, JsonValue>;
40
45
  idempotencyKey?: string;
41
46
  }>;
47
+ headers?: Record<string, string>;
48
+ tags?: Record<string, string>;
49
+ stream?: string;
42
50
  }
43
51
  export interface MailBatch {
44
52
  id: string;
45
53
  status: 'queued' | 'processing' | 'completed' | 'failed';
46
54
  messageCount: number;
55
+ queuedCount: number;
56
+ acceptedCount: number;
57
+ failedCount: number;
58
+ suppressedCount: number;
59
+ }
60
+ export interface MailBatchItem {
61
+ id: string;
62
+ batchId: string;
63
+ messageId?: string | null;
64
+ recipientEmail: string;
65
+ status: 'queued' | 'sending' | 'accepted' | 'failed' | 'suppressed';
66
+ errorCode?: string | null;
67
+ errorMessage?: string | null;
68
+ recipients: MailRecipient[];
47
69
  }
48
70
  export interface MailInboundDomain {
49
71
  id: string;
@@ -1,5 +1,5 @@
1
1
  import type { StackShift } from './client.js';
2
- import type { MailAnalytics, MailAnalyticsInput, MailBatch, MailBatchSendInput, MailBatchTemplateInput, MailInboundDomain, MailInboundMessage, MailScheduledCreateInput, MailScheduledMessage } from './mail-advanced-types.js';
2
+ import type { MailAnalytics, MailAnalyticsInput, MailBatch, MailBatchItem, MailBatchSendInput, MailBatchTemplateInput, MailInboundDomain, MailInboundMessage, MailScheduledCreateInput, MailScheduledMessage } from './mail-advanced-types.js';
3
3
  export declare class MailScheduledClient {
4
4
  private readonly client;
5
5
  constructor(client: StackShift);
@@ -15,6 +15,13 @@ export declare class MailBatchClient {
15
15
  constructor(client: StackShift);
16
16
  send(input: MailBatchSendInput): Promise<MailBatch>;
17
17
  sendTemplate(input: MailBatchTemplateInput): Promise<MailBatch>;
18
+ list(): Promise<{
19
+ data: MailBatch[];
20
+ }>;
21
+ get(id: string): Promise<MailBatch>;
22
+ items(id: string): Promise<{
23
+ data: MailBatchItem[];
24
+ }>;
18
25
  }
19
26
  export declare class MailInboundClient {
20
27
  readonly domains: MailInboundDomainsClient;
@@ -27,6 +27,15 @@ export class MailBatchClient {
27
27
  sendTemplate(input) {
28
28
  return this.client.mailRequest('/mail/batch-template', { method: 'POST', body: input });
29
29
  }
30
+ list() {
31
+ return this.client.mailRequest('/mail/batches');
32
+ }
33
+ get(id) {
34
+ return this.client.mailRequest(`/mail/batches/${encodeURIComponent(id)}`);
35
+ }
36
+ items(id) {
37
+ return this.client.mailRequest(`/mail/batches/${encodeURIComponent(id)}/items`);
38
+ }
30
39
  }
31
40
  export class MailInboundClient {
32
41
  domains;
@@ -0,0 +1,76 @@
1
+ import type { StackShift } from './client.js';
2
+ export interface MailAudience {
3
+ id: string;
4
+ workspaceId: string;
5
+ name: string;
6
+ description?: string;
7
+ status: 'active' | 'archived';
8
+ memberCount: number;
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ }
12
+ export interface MailAudienceMember {
13
+ id: string;
14
+ audienceId: string;
15
+ email: string;
16
+ name?: string;
17
+ status: 'subscribed' | 'unsubscribed' | 'complained' | 'hard_bounced';
18
+ consentSource: string;
19
+ consentAt: string;
20
+ consentIp?: string;
21
+ }
22
+ export interface MailAudienceMemberImport {
23
+ email: string;
24
+ name?: string;
25
+ consentSource: string;
26
+ consentAt: string;
27
+ consentIp?: string;
28
+ }
29
+ export interface MailCampaign {
30
+ id: string;
31
+ audienceId: string;
32
+ batchId?: string;
33
+ name: string;
34
+ template: string;
35
+ versionId?: string;
36
+ from: string;
37
+ status: 'draft' | 'processing' | 'queued' | 'completed' | 'failed';
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ queuedAt?: string;
41
+ }
42
+ export declare class MailAudiencesClient {
43
+ private readonly client;
44
+ constructor(client: StackShift);
45
+ create(input: {
46
+ name: string;
47
+ description?: string;
48
+ }): Promise<MailAudience>;
49
+ list(): Promise<{
50
+ data: MailAudience[];
51
+ }>;
52
+ get(id: string): Promise<MailAudience>;
53
+ members(id: string): Promise<{
54
+ data: MailAudienceMember[];
55
+ }>;
56
+ import(id: string, members: MailAudienceMemberImport[]): Promise<{
57
+ imported: number;
58
+ skipped: number;
59
+ }>;
60
+ }
61
+ export declare class MailCampaignsClient {
62
+ private readonly client;
63
+ constructor(client: StackShift);
64
+ create(input: {
65
+ name: string;
66
+ audienceId: string;
67
+ template: string;
68
+ versionId?: string;
69
+ from: string;
70
+ }): Promise<MailCampaign>;
71
+ list(): Promise<{
72
+ data: MailCampaign[];
73
+ }>;
74
+ get(id: string): Promise<MailCampaign>;
75
+ send(id: string): Promise<MailCampaign>;
76
+ }
@@ -0,0 +1,42 @@
1
+ export class MailAudiencesClient {
2
+ client;
3
+ constructor(client) {
4
+ this.client = client;
5
+ }
6
+ create(input) {
7
+ return this.client.mailRequest('/mail/audiences', { method: 'POST', body: input });
8
+ }
9
+ list() {
10
+ return this.client.mailRequest('/mail/audiences');
11
+ }
12
+ get(id) {
13
+ return this.client.mailRequest(`/mail/audiences/${encodeURIComponent(id)}`);
14
+ }
15
+ members(id) {
16
+ return this.client.mailRequest(`/mail/audiences/${encodeURIComponent(id)}/members`);
17
+ }
18
+ import(id, members) {
19
+ return this.client.mailRequest(`/mail/audiences/${encodeURIComponent(id)}/imports`, {
20
+ method: 'POST',
21
+ body: { members },
22
+ });
23
+ }
24
+ }
25
+ export class MailCampaignsClient {
26
+ client;
27
+ constructor(client) {
28
+ this.client = client;
29
+ }
30
+ create(input) {
31
+ return this.client.mailRequest('/mail/campaigns', { method: 'POST', body: input });
32
+ }
33
+ list() {
34
+ return this.client.mailRequest('/mail/campaigns');
35
+ }
36
+ get(id) {
37
+ return this.client.mailRequest(`/mail/campaigns/${encodeURIComponent(id)}`);
38
+ }
39
+ send(id) {
40
+ return this.client.mailRequest(`/mail/campaigns/${encodeURIComponent(id)}/send`, { method: 'POST' });
41
+ }
42
+ }
@@ -0,0 +1,23 @@
1
+ export interface MailTemplateDiagnosticInput {
2
+ versionId?: string;
3
+ data?: Record<string, unknown>;
4
+ stream?: 'transactional' | 'broadcast';
5
+ }
6
+ export interface MailDiagnosticFinding {
7
+ code: string;
8
+ severity: 'info' | 'warning' | 'error';
9
+ field: string;
10
+ message: string;
11
+ recommendation: string;
12
+ }
13
+ export interface MailTemplateDiagnosticResult {
14
+ status: 'pass' | 'warning' | 'error';
15
+ stream: 'transactional' | 'broadcast';
16
+ subjectLength: number;
17
+ htmlBytes: number;
18
+ textBytes: number;
19
+ linkCount: number;
20
+ remoteImageCount: number;
21
+ missingAltCount: number;
22
+ findings: MailDiagnosticFinding[];
23
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,5 @@
1
1
  import type { StackShift } from './client.js';
2
- import type { MailEvent, MailEventListOptions, MailEventListResult, MailTimelineItem, MailWebhook, MailWebhookCreateInput, MailWebhookCreateResponse, MailWebhookDelivery, MailWebhookDeliveryDetail, MailWebhookDeliveryListOptions, MailWebhookListOptions, MailWebhookListResult, MailWebhookUpdateInput } from './mail-webhook-types.js';
2
+ import type { MailEvent, MailEventListOptions, MailEventListResult, MailTimelineItem, MailWebhook, MailWebhookCreateInput, MailWebhookCreateResponse, MailWebhookDelivery, MailWebhookDeliveryDetail, MailWebhookDeliveryListOptions, MailWebhookListOptions, MailWebhookListResult, MailWebhookReplay, MailWebhookReplayInput, MailWebhookUpdateInput } from './mail-webhook-types.js';
3
3
  export declare class MailEventsClient {
4
4
  private readonly client;
5
5
  constructor(client: StackShift);
@@ -23,6 +23,7 @@ export declare class MailWebhooksClient {
23
23
  }>;
24
24
  getDelivery(deliveryId: string): Promise<MailWebhookDeliveryDetail>;
25
25
  retryDelivery(deliveryId: string): Promise<MailWebhookDelivery>;
26
+ replay(webhookId: string, input: MailWebhookReplayInput): Promise<MailWebhookReplay>;
26
27
  verifySignature(input: {
27
28
  rawBody: string | Uint8Array;
28
29
  signatureHeader?: string | null;
@@ -38,6 +39,6 @@ export declare function verifyWebhookSignature(input: {
38
39
  secret: string;
39
40
  toleranceSeconds?: number;
40
41
  }): boolean;
41
- export declare function timeline(client: StackShift, messageId: string): Promise<{
42
+ export declare function timeline(client: StackShift, messageId: string, recipient?: string): Promise<{
42
43
  data: MailTimelineItem[];
43
44
  }>;
@@ -55,6 +55,13 @@ export class MailWebhooksClient {
55
55
  method: 'POST',
56
56
  });
57
57
  }
58
+ replay(webhookId, input) {
59
+ return this.client.mailRequest(`/mail/webhooks/${encodeURIComponent(webhookId)}/replay`, {
60
+ method: 'POST',
61
+ headers: { 'Idempotency-Key': input.idempotencyKey },
62
+ body: { eventIds: input.eventIds },
63
+ });
64
+ }
58
65
  verifySignature(input) {
59
66
  return verifyWebhookSignature(input);
60
67
  }
@@ -72,8 +79,9 @@ export function verifyWebhookSignature(input) {
72
79
  return false;
73
80
  return constantTimeEqual(actual, expected);
74
81
  }
75
- export function timeline(client, messageId) {
76
- return client.mailRequest(`/mail/messages/${encodeURIComponent(messageId)}/timeline`);
82
+ export function timeline(client, messageId, recipient) {
83
+ const query = recipient ? `?recipient=${encodeURIComponent(recipient)}` : '';
84
+ return client.mailRequest(`/mail/messages/${encodeURIComponent(messageId)}/timeline${query}`);
77
85
  }
78
86
  function queryString(options) {
79
87
  const query = new URLSearchParams();
@@ -0,0 +1,32 @@
1
+ import type { StackShift } from './client.js';
2
+ export interface MailExport {
3
+ id: string;
4
+ kind: 'recipient_delivery';
5
+ format: 'jsonl';
6
+ status: 'queued' | 'processing' | 'ready' | 'failed' | 'expired';
7
+ from: string;
8
+ to: string;
9
+ recordCount: number;
10
+ sizeBytes: number;
11
+ checksum?: string;
12
+ error?: string;
13
+ createdAt: string;
14
+ completedAt?: string;
15
+ expiresAt: string;
16
+ }
17
+ export interface MailExportCreateInput {
18
+ kind?: 'recipient_delivery';
19
+ format?: 'jsonl';
20
+ from?: string;
21
+ to?: string;
22
+ }
23
+ export declare class MailExportsClient {
24
+ private readonly client;
25
+ constructor(client: StackShift);
26
+ create(input?: MailExportCreateInput): Promise<MailExport>;
27
+ list(): Promise<{
28
+ data: MailExport[];
29
+ }>;
30
+ get(id: string): Promise<MailExport>;
31
+ downloadPath(id: string): string;
32
+ }
@@ -0,0 +1,18 @@
1
+ export class MailExportsClient {
2
+ client;
3
+ constructor(client) {
4
+ this.client = client;
5
+ }
6
+ create(input = {}) {
7
+ return this.client.mailRequest('/mail/exports', { method: 'POST', body: input });
8
+ }
9
+ list() {
10
+ return this.client.mailRequest('/mail/exports');
11
+ }
12
+ get(id) {
13
+ return this.client.mailRequest(`/mail/exports/${encodeURIComponent(id)}`);
14
+ }
15
+ downloadPath(id) {
16
+ return `/mail/exports/${encodeURIComponent(id)}/download`;
17
+ }
18
+ }
@@ -0,0 +1,27 @@
1
+ import type { StackShift } from './client.js';
2
+ export interface MailMessageStream {
3
+ id: string;
4
+ workspaceId: string;
5
+ name: string;
6
+ slug: string;
7
+ type: 'transactional' | 'broadcast';
8
+ status: 'active' | 'paused';
9
+ protected: boolean;
10
+ ipPoolId: string;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ export interface MailMessageStreamCreateInput {
15
+ name: string;
16
+ slug: string;
17
+ type: 'transactional' | 'broadcast';
18
+ }
19
+ export interface MailMessageStreamListResult {
20
+ data: MailMessageStream[];
21
+ }
22
+ export declare class MailStreamsClient {
23
+ private readonly client;
24
+ constructor(client: StackShift);
25
+ create(input: MailMessageStreamCreateInput): Promise<MailMessageStream>;
26
+ list(): Promise<MailMessageStreamListResult>;
27
+ }
@@ -0,0 +1,12 @@
1
+ export class MailStreamsClient {
2
+ client;
3
+ constructor(client) {
4
+ this.client = client;
5
+ }
6
+ create(input) {
7
+ return this.client.mailRequest('/mail/streams', { method: 'POST', body: input });
8
+ }
9
+ list() {
10
+ return this.client.mailRequest('/mail/streams');
11
+ }
12
+ }
@@ -1,5 +1,5 @@
1
1
  import type { JsonValue } from './types.js';
2
- export type MailEventType = 'mail.message.queued' | 'mail.message.sending' | 'mail.message.sent' | 'mail.message.deferred' | 'mail.message.failed' | 'mail.message.bounced' | 'mail.message.suppressed' | 'mail.suppression.created' | 'mail.suppression.deleted' | 'mail.otp.created' | 'mail.otp.sent' | 'mail.otp.verified' | 'mail.otp.failed_attempt' | 'mail.otp.failed' | 'mail.otp.expired' | 'mail.otp.canceled' | 'mail.template.created' | 'mail.template.updated' | 'mail.template.deleted' | 'mail.template.version.created' | 'mail.template.test_sent' | 'mail.domain.created' | 'mail.domain.verified' | 'mail.domain.failed' | 'mail.domain.deleted' | 'mail.webhook.created' | 'mail.webhook.updated' | 'mail.webhook.disabled' | 'mail.webhook.delivery.succeeded' | 'mail.webhook.delivery.failed';
2
+ export type MailEventType = 'mail.message.accepted' | 'mail.message.queued' | 'mail.message.sending' | 'mail.message.mta_accepted' | 'mail.delivery.delayed' | 'mail.delivery.delivered' | 'mail.message.failed' | 'mail.message.bounced' | 'mail.message.suppressed' | 'mail.message.complained' | 'mail.suppression.created' | 'mail.suppression.deleted' | 'mail.otp.created' | 'mail.otp.sent' | 'mail.otp.verified' | 'mail.otp.failed_attempt' | 'mail.otp.failed' | 'mail.otp.expired' | 'mail.otp.canceled' | 'mail.template.created' | 'mail.template.updated' | 'mail.template.deleted' | 'mail.template.version.created' | 'mail.template.test_queued' | 'mail.domain.created' | 'mail.domain.verified' | 'mail.domain.failed' | 'mail.domain.deleted' | 'mail.webhook.created' | 'mail.webhook.updated' | 'mail.webhook.disabled' | 'mail.webhook.delivery.succeeded' | 'mail.webhook.delivery.failed' | 'mail.audience.created' | 'mail.audience.members.imported' | 'mail.campaign.created' | 'mail.campaign.queued';
3
3
  export interface MailEvent {
4
4
  id: string;
5
5
  type: MailEventType | string;
@@ -89,6 +89,17 @@ export interface MailWebhookDeliveryAttempt {
89
89
  export interface MailWebhookDeliveryDetail extends MailWebhookDelivery {
90
90
  attempts: MailWebhookDeliveryAttempt[];
91
91
  }
92
+ export interface MailWebhookReplayInput {
93
+ eventIds: string[];
94
+ idempotencyKey: string;
95
+ }
96
+ export interface MailWebhookReplay {
97
+ id: string;
98
+ webhookId: string;
99
+ eventIds: string[];
100
+ deliveries: MailWebhookDelivery[];
101
+ createdAt: string;
102
+ }
92
103
  export interface MailWebhookDeliveryListOptions {
93
104
  status?: string;
94
105
  limit?: number;
package/dist/mail.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { StackShift } from './client.js';
2
2
  import type { MailLog, MailDomain, MailDomainListResult, MailMessage, MailMessageListOptions, MailMessageListResult, MailSendAttempt, MailSendInput, MailSendResponse } from './types.js';
3
- import type { MailBounce, MailBounceListOptions, MailBounceListResult, MailSuppression, MailSuppressionCreateInput, MailSuppressionListOptions, MailSuppressionListResult } from './mail-phase4-types.js';
3
+ import type { MailBounce, MailBounceListOptions, MailBounceListResult, MailSuppression, MailSuppressionCreateInput, MailSuppressionListOptions, MailSuppressionListResult } from './mail-delivery-types.js';
4
4
  import type { MailOtpChallenge, MailOtpChallengeListOptions, MailOtpChallengeListResult, MailOtpSendInput, MailOtpSendResponse, MailOtpVerifyInput, MailOtpVerifyResponse } from './mail-otp-types.js';
5
5
  import type { MailSendTemplateInput, MailSendTemplateResponse, MailTemplate, MailTemplateCreateInput, MailTemplateDetail, MailTemplateListOptions, MailTemplateListResult, MailTemplatePreview, MailTemplatePreviewInput, MailTemplateTestSendInput, MailTemplateTestSendResponse, MailTemplateUpdateInput, MailTemplateVersion } from './mail-template-types.js';
6
6
  import { MailAnalyticsClient, MailBatchClient, MailInboundClient, MailScheduledClient } from './mail-advanced.js';
@@ -8,6 +8,13 @@ export { MailAnalyticsClient, MailBatchClient, MailInboundClient, MailScheduledC
8
8
  import type { MailLimits, MailReputation, MailReputationEventListOptions, MailReputationEventListResult } from './mail-reputation-types.js';
9
9
  export { MailEventsClient, MailWebhooksClient, verifyWebhookSignature } from './mail-events-webhooks.js';
10
10
  import { MailEventsClient, MailWebhooksClient } from './mail-events-webhooks.js';
11
+ import { MailStreamsClient } from './mail-streams.js';
12
+ export { MailStreamsClient } from './mail-streams.js';
13
+ import { MailAudiencesClient, MailCampaignsClient } from './mail-campaigns.js';
14
+ export { MailAudiencesClient, MailCampaignsClient } from './mail-campaigns.js';
15
+ import { MailExportsClient } from './mail-exports.js';
16
+ export { MailExportsClient } from './mail-exports.js';
17
+ import type { MailTemplateDiagnosticInput, MailTemplateDiagnosticResult } from './mail-diagnostics.js';
11
18
  export declare class MailClient {
12
19
  private readonly client;
13
20
  readonly domains: MailDomainsClient;
@@ -18,6 +25,10 @@ export declare class MailClient {
18
25
  readonly templates: MailTemplatesClient;
19
26
  readonly events: MailEventsClient;
20
27
  readonly webhooks: MailWebhooksClient;
28
+ readonly streams: MailStreamsClient;
29
+ readonly audiences: MailAudiencesClient;
30
+ readonly campaigns: MailCampaignsClient;
31
+ readonly exports: MailExportsClient;
21
32
  readonly limits: MailLimitsClient;
22
33
  readonly reputation: MailReputationClient;
23
34
  readonly scheduled: MailScheduledClient;
@@ -58,6 +69,7 @@ export declare class MailTemplatesClient {
58
69
  getVersion(templateId: string, versionId: string): Promise<MailTemplateVersion>;
59
70
  activateVersion(templateId: string, versionId: string): Promise<MailTemplate>;
60
71
  preview(templateId: string, input: MailTemplatePreviewInput): Promise<MailTemplatePreview>;
72
+ diagnostics(templateId: string, input?: MailTemplateDiagnosticInput): Promise<MailTemplateDiagnosticResult>;
61
73
  testSend(templateId: string, input: MailTemplateTestSendInput): Promise<MailTemplateTestSendResponse>;
62
74
  }
63
75
  export declare class MailDomainsClient {
@@ -83,7 +95,7 @@ export declare class MailMessagesClient {
83
95
  bounces(messageId: string): Promise<{
84
96
  data: MailBounce[];
85
97
  }>;
86
- timeline(messageId: string): Promise<{
98
+ timeline(messageId: string, recipient?: string): Promise<{
87
99
  data: import("./mail-webhook-types.js").MailTimelineItem[];
88
100
  }>;
89
101
  }
package/dist/mail.js CHANGED
@@ -2,6 +2,12 @@ import { MailAnalyticsClient, MailBatchClient, MailInboundClient, MailScheduledC
2
2
  export { MailAnalyticsClient, MailBatchClient, MailInboundClient, MailScheduledClient } from './mail-advanced.js';
3
3
  export { MailEventsClient, MailWebhooksClient, verifyWebhookSignature } from './mail-events-webhooks.js';
4
4
  import { MailEventsClient, MailWebhooksClient, timeline } from './mail-events-webhooks.js';
5
+ import { MailStreamsClient } from './mail-streams.js';
6
+ export { MailStreamsClient } from './mail-streams.js';
7
+ import { MailAudiencesClient, MailCampaignsClient } from './mail-campaigns.js';
8
+ export { MailAudiencesClient, MailCampaignsClient } from './mail-campaigns.js';
9
+ import { MailExportsClient } from './mail-exports.js';
10
+ export { MailExportsClient } from './mail-exports.js';
5
11
  export class MailClient {
6
12
  client;
7
13
  domains;
@@ -12,6 +18,10 @@ export class MailClient {
12
18
  templates;
13
19
  events;
14
20
  webhooks;
21
+ streams;
22
+ audiences;
23
+ campaigns;
24
+ exports;
15
25
  limits;
16
26
  reputation;
17
27
  scheduled;
@@ -28,6 +38,10 @@ export class MailClient {
28
38
  this.templates = new MailTemplatesClient(client);
29
39
  this.events = new MailEventsClient(client);
30
40
  this.webhooks = new MailWebhooksClient(client);
41
+ this.streams = new MailStreamsClient(client);
42
+ this.audiences = new MailAudiencesClient(client);
43
+ this.campaigns = new MailCampaignsClient(client);
44
+ this.exports = new MailExportsClient(client);
31
45
  this.limits = new MailLimitsClient(client);
32
46
  this.reputation = new MailReputationClient(client);
33
47
  this.scheduled = new MailScheduledClient(client);
@@ -134,6 +148,12 @@ export class MailTemplatesClient {
134
148
  body: input,
135
149
  });
136
150
  }
151
+ diagnostics(templateId, input = {}) {
152
+ return this.client.mailRequest(`/mail/templates/${encodeURIComponent(templateId)}/diagnostics`, {
153
+ method: 'POST',
154
+ body: input,
155
+ });
156
+ }
137
157
  testSend(templateId, input) {
138
158
  return this.client.mailRequest(`/mail/templates/${encodeURIComponent(templateId)}/test-send`, {
139
159
  method: 'POST',
@@ -196,8 +216,8 @@ export class MailMessagesClient {
196
216
  bounces(messageId) {
197
217
  return this.client.mailRequest(`/mail/messages/${encodeURIComponent(messageId)}/bounces`);
198
218
  }
199
- timeline(messageId) {
200
- return timeline(this.client, messageId);
219
+ timeline(messageId, recipient) {
220
+ return timeline(this.client, messageId, recipient);
201
221
  }
202
222
  }
203
223
  export class MailSuppressionsClient {
package/dist/types.d.ts CHANGED
@@ -9,7 +9,8 @@ export interface StackShiftOptions {
9
9
  cdnBaseUrl?: string;
10
10
  fetch?: typeof fetch;
11
11
  }
12
- export type MailStatus = 'queued' | 'sending' | 'sent' | 'deferred' | 'failed' | 'bounced' | 'suppressed';
12
+ export type MailStatus = 'queued' | 'sending' | 'mta_accepted' | 'delayed' | 'delivered' | 'bounced' | 'failed' | 'suppressed' | 'complained' | 'partial';
13
+ export type MailRecipientStatus = Exclude<MailStatus, 'partial'>;
13
14
  export type MailIdempotencyStatus = 'created' | 'reused';
14
15
  export type MailDomainStatus = 'pending' | 'verified' | 'failed' | 'disabled';
15
16
  export type MailRecordStatus = 'missing' | 'pending' | 'verified' | 'failed';
@@ -58,7 +59,12 @@ export interface MailSendInput {
58
59
  uploadId?: string;
59
60
  filename: string;
60
61
  contentType?: string;
62
+ disposition?: 'attachment' | 'inline';
63
+ contentId?: string;
61
64
  }>;
65
+ headers?: Record<string, string>;
66
+ tags?: Record<string, string>;
67
+ stream?: string;
62
68
  }
63
69
  export interface MailSendResponse {
64
70
  id: string;
@@ -81,7 +87,7 @@ export interface MailMessage {
81
87
  createdAt: string;
82
88
  queuedAt?: string | null;
83
89
  sendingAt?: string | null;
84
- sentAt?: string | null;
90
+ mtaAcceptedAt?: string | null;
85
91
  failedAt?: string | null;
86
92
  bouncedAt?: string | null;
87
93
  suppressedAt?: string | null;
@@ -89,6 +95,47 @@ export interface MailMessage {
89
95
  bounceReason?: string | null;
90
96
  finalSmtpStatusCode?: string | null;
91
97
  finalSmtpResponse?: string | null;
98
+ recipients?: MailRecipient[];
99
+ recipientSummary?: MailRecipientSummary;
100
+ headers?: Record<string, string>;
101
+ tags?: Record<string, string>;
102
+ stream?: string;
103
+ streamType?: string;
104
+ }
105
+ export interface MailRecipient {
106
+ id: string;
107
+ messageId: string;
108
+ kind: 'to' | 'cc' | 'bcc';
109
+ email: string;
110
+ status: MailRecipientStatus;
111
+ rfcMessageId?: string | null;
112
+ postfixQueueId?: string | null;
113
+ remoteMx?: string | null;
114
+ provider?: string | null;
115
+ smtpStatus?: string | null;
116
+ enhancedStatus?: string | null;
117
+ smtpResponse?: string | null;
118
+ latencyMs?: number | null;
119
+ disposition?: string | null;
120
+ bounceCategory?: string | null;
121
+ suppressionAction?: string | null;
122
+ createdAt: string;
123
+ updatedAt: string;
124
+ mtaAcceptedAt?: string | null;
125
+ deliveredAt?: string | null;
126
+ bouncedAt?: string | null;
127
+ complainedAt?: string | null;
128
+ }
129
+ export interface MailRecipientSummary {
130
+ queued: number;
131
+ sending: number;
132
+ mtaAccepted: number;
133
+ delayed: number;
134
+ delivered: number;
135
+ bounced: number;
136
+ failed: number;
137
+ suppressed: number;
138
+ complained: number;
92
139
  }
93
140
  export interface MailMessageSummary {
94
141
  id: string;
@@ -98,7 +145,7 @@ export interface MailMessageSummary {
98
145
  status: MailStatus;
99
146
  createdAt: string;
100
147
  queuedAt?: string | null;
101
- sentAt?: string | null;
148
+ mtaAcceptedAt?: string | null;
102
149
  }
103
150
  export interface MailMessageListOptions {
104
151
  status?: MailStatus;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackshift-cloud/sdk",
3
- "version": "0.1.4",
3
+ "version": "1.0.0",
4
4
  "description": "Official JavaScript and TypeScript SDK for StackShift.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "scripts": {
19
19
  "build": "tsc -p tsconfig.json",
20
- "test": "npm run build && node test/mail.test.mjs && node test/mail-webhooks.test.mjs && node test/mail-advanced.test.mjs && node test/assets.test.mjs"
20
+ "test": "npm run build && node test/mail.test.mjs && node test/mail-webhooks.test.mjs && node test/mail-advanced.test.mjs && node test/mail-exports.test.mjs && node test/mail-diagnostics.test.mjs && node test/assets.test.mjs"
21
21
  },
22
22
  "devDependencies": {
23
23
  "typescript": "^5.4.0"