@marlinjai/mail-sdk 0.13.0 → 0.15.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
@@ -350,11 +350,38 @@ const client = dashboardMail.forUser({ subject: session.subject }); // no worksp
350
350
  const workspace = await client.workspaces.create({
351
351
  slug: 'opuntia',
352
352
  name: 'ŌPUNTIA',
353
+ // Required since 0.14.0: every workspace belongs to a company of the shared login.
354
+ company_id: session.companyId,
353
355
  owner: { email: session.email, name: session.name },
354
356
  });
355
357
  // From here on, calls for this workspace pass its id: forUser({ subject, workspaceId: workspace.id }).
356
358
  ```
357
359
 
360
+ ### Company roles: who is in without an invitation (0.14.0)
361
+
362
+ An owner or admin of a workspace's company is in the workspace without being
363
+ invited. The service never talks to the shared login, so the dashboard tells
364
+ it: before acting for a person, it states that person's owner and admin roles
365
+ in companies, complete, exactly as the verified session reports them.
366
+
367
+ ```ts
368
+ const result = await dashboardMail.forUser({ subject: session.subject }).members.syncCompanyRole({
369
+ email: session.email,
370
+ name: session.name,
371
+ // Every company where the session says owner or admin, and nothing else.
372
+ companies: [{ company_id: 'tenant_opuntia', role: 'owner' }],
373
+ });
374
+ // { granted: [...workspace ids], revoked: [...], unchanged: [...] }
375
+ ```
376
+
377
+ The service gives the person a member row in every workspace of those
378
+ companies and takes away every company role the statement does not name, so an
379
+ empty list is how a lost role is reported. Only the dashboard's service token
380
+ may make this call (an API key and every trusted application are refused), it
381
+ takes no `Idempotency-Key`, and the roles must never come from anywhere but
382
+ the verified session: this call is believed because of who sends it. A role
383
+ not confirmed again within `COMPANY_ROLE_MAX_AGE_HOURS` (24) counts as absent.
384
+
358
385
  Adding a person to an existing workspace binds them by their auth-brain
359
386
  subject, not an email invite (the service never sees a login, so the caller
360
387
  resolves the person first):
package/dist/index.d.mts CHANGED
@@ -209,6 +209,11 @@ declare function createNamespaces(config: CoreConfig): {
209
209
  subject: string;
210
210
  created_at: string;
211
211
  role: "owner" | "admin" | "editor" | "viewer";
212
+ source?: "invited" | "company" | undefined;
213
+ company_role?: "owner" | "admin" | null | undefined;
214
+ company_checked_at?: string | null | undefined;
215
+ direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
216
+ inherited?: boolean | undefined;
212
217
  }[];
213
218
  next_cursor: string | null;
214
219
  }>;
@@ -224,6 +229,11 @@ declare function createNamespaces(config: CoreConfig): {
224
229
  subject: string;
225
230
  created_at: string;
226
231
  role: "owner" | "admin" | "editor" | "viewer";
232
+ source?: "invited" | "company" | undefined;
233
+ company_role?: "owner" | "admin" | null | undefined;
234
+ company_checked_at?: string | null | undefined;
235
+ direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
236
+ inherited?: boolean | undefined;
227
237
  }>;
228
238
  update: (id: string, body: RouteBody<"members.update">, opts?: RequestOpts) => Promise<{
229
239
  id: string;
@@ -232,10 +242,28 @@ declare function createNamespaces(config: CoreConfig): {
232
242
  subject: string;
233
243
  created_at: string;
234
244
  role: "owner" | "admin" | "editor" | "viewer";
245
+ source?: "invited" | "company" | undefined;
246
+ company_role?: "owner" | "admin" | null | undefined;
247
+ company_checked_at?: string | null | undefined;
248
+ direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
249
+ inherited?: boolean | undefined;
235
250
  }>;
236
251
  remove: (id: string, opts?: RequestOpts) => Promise<{
237
252
  ok: true;
238
253
  }>;
254
+ /**
255
+ * The dashboard only: states the signed-in person's owner and admin
256
+ * roles in companies, complete, as the shared login's verified session
257
+ * reports them. The service gives the person a member row in every
258
+ * workspace of those companies and takes away every company role not
259
+ * stated. Never send a role that came from anywhere but the verified
260
+ * session.
261
+ */
262
+ syncCompanyRole: (body: RouteBody<"members.syncCompanyRole">, opts?: RequestOpts) => Promise<{
263
+ unchanged: string[];
264
+ granted: string[];
265
+ revoked: string[];
266
+ }>;
239
267
  };
240
268
  /**
241
269
  * Invitations: an admin invites an address with a role (the token is in
@@ -245,7 +273,7 @@ declare function createNamespaces(config: CoreConfig): {
245
273
  invites: {
246
274
  create: (body: RouteBody<"invites.create">, opts?: RequestOpts) => Promise<{
247
275
  invite: {
248
- status: "pending" | "accepted" | "revoked" | "expired";
276
+ status: "pending" | "revoked" | "accepted" | "expired";
249
277
  id: string;
250
278
  email: string;
251
279
  created_at: string;
@@ -262,7 +290,7 @@ declare function createNamespaces(config: CoreConfig): {
262
290
  }>;
263
291
  list: (query?: RouteQuery<"invites.list">, opts?: RequestOpts) => Promise<{
264
292
  data: {
265
- status: "pending" | "accepted" | "revoked" | "expired";
293
+ status: "pending" | "revoked" | "accepted" | "expired";
266
294
  id: string;
267
295
  email: string;
268
296
  created_at: string;
@@ -278,7 +306,7 @@ declare function createNamespaces(config: CoreConfig): {
278
306
  next_cursor: string | null;
279
307
  }>;
280
308
  revoke: (id: string, opts?: RequestOpts) => Promise<{
281
- status: "pending" | "accepted" | "revoked" | "expired";
309
+ status: "pending" | "revoked" | "accepted" | "expired";
282
310
  id: string;
283
311
  email: string;
284
312
  created_at: string;
@@ -354,7 +382,7 @@ declare function createNamespaces(config: CoreConfig): {
354
382
  id: string;
355
383
  details: Record<string, unknown>;
356
384
  created_at: string;
357
- action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
385
+ action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.deleted" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
358
386
  actor: {
359
387
  type: "member";
360
388
  subject: string;
@@ -2343,6 +2371,16 @@ declare function createNamespaces(config: CoreConfig): {
2343
2371
  finished_at: string | null;
2344
2372
  pause_reason: string | null;
2345
2373
  }>;
2374
+ /**
2375
+ * Deletes a mailing that never started: a draft, or one cancelled before
2376
+ * any send began (`canDeleteMailing` answers for a mailing in hand).
2377
+ * Anything else is `mailing_invalid_state` (409) and nothing is deleted:
2378
+ * unschedule a scheduled mailing first; a mailing that started stays.
2379
+ * Test sends made from it stay in the archive, with `mailing_id` null.
2380
+ */
2381
+ delete: (id: string, opts?: RequestOpts) => Promise<{
2382
+ ok: true;
2383
+ }>;
2346
2384
  retryFailed: (id: string, body?: RouteBody<"mailings.retryFailed">, opts?: RequestOpts) => Promise<{
2347
2385
  status: "draft" | "scheduled" | "sending" | "paused" | "sent" | "partially_failed" | "cancelled";
2348
2386
  id: string;
package/dist/index.d.ts CHANGED
@@ -209,6 +209,11 @@ declare function createNamespaces(config: CoreConfig): {
209
209
  subject: string;
210
210
  created_at: string;
211
211
  role: "owner" | "admin" | "editor" | "viewer";
212
+ source?: "invited" | "company" | undefined;
213
+ company_role?: "owner" | "admin" | null | undefined;
214
+ company_checked_at?: string | null | undefined;
215
+ direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
216
+ inherited?: boolean | undefined;
212
217
  }[];
213
218
  next_cursor: string | null;
214
219
  }>;
@@ -224,6 +229,11 @@ declare function createNamespaces(config: CoreConfig): {
224
229
  subject: string;
225
230
  created_at: string;
226
231
  role: "owner" | "admin" | "editor" | "viewer";
232
+ source?: "invited" | "company" | undefined;
233
+ company_role?: "owner" | "admin" | null | undefined;
234
+ company_checked_at?: string | null | undefined;
235
+ direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
236
+ inherited?: boolean | undefined;
227
237
  }>;
228
238
  update: (id: string, body: RouteBody<"members.update">, opts?: RequestOpts) => Promise<{
229
239
  id: string;
@@ -232,10 +242,28 @@ declare function createNamespaces(config: CoreConfig): {
232
242
  subject: string;
233
243
  created_at: string;
234
244
  role: "owner" | "admin" | "editor" | "viewer";
245
+ source?: "invited" | "company" | undefined;
246
+ company_role?: "owner" | "admin" | null | undefined;
247
+ company_checked_at?: string | null | undefined;
248
+ direct_role?: "owner" | "admin" | "editor" | "viewer" | null | undefined;
249
+ inherited?: boolean | undefined;
235
250
  }>;
236
251
  remove: (id: string, opts?: RequestOpts) => Promise<{
237
252
  ok: true;
238
253
  }>;
254
+ /**
255
+ * The dashboard only: states the signed-in person's owner and admin
256
+ * roles in companies, complete, as the shared login's verified session
257
+ * reports them. The service gives the person a member row in every
258
+ * workspace of those companies and takes away every company role not
259
+ * stated. Never send a role that came from anywhere but the verified
260
+ * session.
261
+ */
262
+ syncCompanyRole: (body: RouteBody<"members.syncCompanyRole">, opts?: RequestOpts) => Promise<{
263
+ unchanged: string[];
264
+ granted: string[];
265
+ revoked: string[];
266
+ }>;
239
267
  };
240
268
  /**
241
269
  * Invitations: an admin invites an address with a role (the token is in
@@ -245,7 +273,7 @@ declare function createNamespaces(config: CoreConfig): {
245
273
  invites: {
246
274
  create: (body: RouteBody<"invites.create">, opts?: RequestOpts) => Promise<{
247
275
  invite: {
248
- status: "pending" | "accepted" | "revoked" | "expired";
276
+ status: "pending" | "revoked" | "accepted" | "expired";
249
277
  id: string;
250
278
  email: string;
251
279
  created_at: string;
@@ -262,7 +290,7 @@ declare function createNamespaces(config: CoreConfig): {
262
290
  }>;
263
291
  list: (query?: RouteQuery<"invites.list">, opts?: RequestOpts) => Promise<{
264
292
  data: {
265
- status: "pending" | "accepted" | "revoked" | "expired";
293
+ status: "pending" | "revoked" | "accepted" | "expired";
266
294
  id: string;
267
295
  email: string;
268
296
  created_at: string;
@@ -278,7 +306,7 @@ declare function createNamespaces(config: CoreConfig): {
278
306
  next_cursor: string | null;
279
307
  }>;
280
308
  revoke: (id: string, opts?: RequestOpts) => Promise<{
281
- status: "pending" | "accepted" | "revoked" | "expired";
309
+ status: "pending" | "revoked" | "accepted" | "expired";
282
310
  id: string;
283
311
  email: string;
284
312
  created_at: string;
@@ -354,7 +382,7 @@ declare function createNamespaces(config: CoreConfig): {
354
382
  id: string;
355
383
  details: Record<string, unknown>;
356
384
  created_at: string;
357
- action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
385
+ action: "workspace.created" | "workspace.updated" | "workspace.company_changed" | "member.added" | "member.role_changed" | "member.removed" | "member.invited" | "invite.revoked" | "api_key.created" | "api_key.revoked" | "provider.created" | "provider.updated" | "provider.deleted" | "provider.events_registered" | "provider.events_secret_set" | "provider.bounces_halted" | "provider.anomaly_cleared" | "topic.created" | "topic.updated" | "topic.deleted" | "template.created" | "template.updated" | "template.deleted" | "template.inputs_declared" | "saved_section.created" | "saved_section.updated" | "saved_section.deleted" | "asset.uploaded" | "asset.imported" | "contact.erased" | "suppression.created" | "suppression.deleted" | "mailing.created" | "mailing.sent" | "mailing.paused" | "mailing.resumed" | "mailing.cancelled" | "mailing.deleted" | "mailing.retried" | "webhook.created" | "webhook.updated" | "webhook.deleted" | "webhook.secret_rotated" | "webhook.redelivered" | "contact.unsubscribed" | "tag.created" | "tag.deleted" | "tag.assigned" | "tag.unassigned" | "contact_property.created" | "contact_property.deleted" | "segment.created" | "segment.updated" | "segment.deleted" | "signup_form.created" | "signup_form.updated" | "signup_form.deleted" | "contact.subscribed" | "import.created" | "import.mapped" | "import.committed" | "import.cancelled" | "import.finished" | "mailing.scheduled" | "mailing.unscheduled" | "mailing.schedule_failed" | "mailing.ab_test_updated" | "mailing.ab_winner_selected" | "tracking.updated" | "billing.checkout_started" | "billing.subscription_changed" | "billing.exemption_changed" | "automation.created" | "automation.updated" | "automation.published" | "automation.paused" | "automation.resumed" | "automation.archived" | "automation.deleted" | "automation.duplicated" | "automation.enrolled" | "automation.run_ended" | "event.recorded";
358
386
  actor: {
359
387
  type: "member";
360
388
  subject: string;
@@ -2343,6 +2371,16 @@ declare function createNamespaces(config: CoreConfig): {
2343
2371
  finished_at: string | null;
2344
2372
  pause_reason: string | null;
2345
2373
  }>;
2374
+ /**
2375
+ * Deletes a mailing that never started: a draft, or one cancelled before
2376
+ * any send began (`canDeleteMailing` answers for a mailing in hand).
2377
+ * Anything else is `mailing_invalid_state` (409) and nothing is deleted:
2378
+ * unschedule a scheduled mailing first; a mailing that started stays.
2379
+ * Test sends made from it stay in the archive, with `mailing_id` null.
2380
+ */
2381
+ delete: (id: string, opts?: RequestOpts) => Promise<{
2382
+ ok: true;
2383
+ }>;
2346
2384
  retryFailed: (id: string, body?: RouteBody<"mailings.retryFailed">, opts?: RequestOpts) => Promise<{
2347
2385
  status: "draft" | "scheduled" | "sending" | "paused" | "sent" | "partially_failed" | "cancelled";
2348
2386
  id: string;
package/dist/index.js CHANGED
@@ -414,7 +414,16 @@ function createNamespaces(config) {
414
414
  */
415
415
  add: (body, opts) => execute(config, "members.add", { body }, opts),
416
416
  update: (id, body, opts) => execute(config, "members.update", { params: { id }, body }, opts),
417
- remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts)
417
+ remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts),
418
+ /**
419
+ * The dashboard only: states the signed-in person's owner and admin
420
+ * roles in companies, complete, as the shared login's verified session
421
+ * reports them. The service gives the person a member row in every
422
+ * workspace of those companies and takes away every company role not
423
+ * stated. Never send a role that came from anywhere but the verified
424
+ * session.
425
+ */
426
+ syncCompanyRole: (body, opts) => execute(config, "members.syncCompanyRole", { body }, opts)
418
427
  },
419
428
  /**
420
429
  * Invitations: an admin invites an address with a role (the token is in
@@ -570,6 +579,14 @@ function createNamespaces(config) {
570
579
  pause: (id, opts) => execute(config, "mailings.pause", { params: { id }, body: {} }, opts),
571
580
  resume: (id, opts) => execute(config, "mailings.resume", { params: { id }, body: {} }, opts),
572
581
  cancel: (id, opts) => execute(config, "mailings.cancel", { params: { id }, body: {} }, opts),
582
+ /**
583
+ * Deletes a mailing that never started: a draft, or one cancelled before
584
+ * any send began (`canDeleteMailing` answers for a mailing in hand).
585
+ * Anything else is `mailing_invalid_state` (409) and nothing is deleted:
586
+ * unschedule a scheduled mailing first; a mailing that started stays.
587
+ * Test sends made from it stay in the archive, with `mailing_id` null.
588
+ */
589
+ delete: (id, opts) => execute(config, "mailings.delete", { params: { id } }, opts),
573
590
  retryFailed: (id, body = {}, opts) => execute(config, "mailings.retryFailed", { params: { id }, body }, opts),
574
591
  duplicate: (id, opts) => execute(config, "mailings.duplicate", { params: { id }, body: {} }, opts),
575
592
  // S4: scheduling, segments and A/B testing
package/dist/index.mjs CHANGED
@@ -398,7 +398,16 @@ function createNamespaces(config) {
398
398
  */
399
399
  add: (body, opts) => execute(config, "members.add", { body }, opts),
400
400
  update: (id, body, opts) => execute(config, "members.update", { params: { id }, body }, opts),
401
- remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts)
401
+ remove: (id, opts) => execute(config, "members.remove", { params: { id } }, opts),
402
+ /**
403
+ * The dashboard only: states the signed-in person's owner and admin
404
+ * roles in companies, complete, as the shared login's verified session
405
+ * reports them. The service gives the person a member row in every
406
+ * workspace of those companies and takes away every company role not
407
+ * stated. Never send a role that came from anywhere but the verified
408
+ * session.
409
+ */
410
+ syncCompanyRole: (body, opts) => execute(config, "members.syncCompanyRole", { body }, opts)
402
411
  },
403
412
  /**
404
413
  * Invitations: an admin invites an address with a role (the token is in
@@ -554,6 +563,14 @@ function createNamespaces(config) {
554
563
  pause: (id, opts) => execute(config, "mailings.pause", { params: { id }, body: {} }, opts),
555
564
  resume: (id, opts) => execute(config, "mailings.resume", { params: { id }, body: {} }, opts),
556
565
  cancel: (id, opts) => execute(config, "mailings.cancel", { params: { id }, body: {} }, opts),
566
+ /**
567
+ * Deletes a mailing that never started: a draft, or one cancelled before
568
+ * any send began (`canDeleteMailing` answers for a mailing in hand).
569
+ * Anything else is `mailing_invalid_state` (409) and nothing is deleted:
570
+ * unschedule a scheduled mailing first; a mailing that started stays.
571
+ * Test sends made from it stay in the archive, with `mailing_id` null.
572
+ */
573
+ delete: (id, opts) => execute(config, "mailings.delete", { params: { id } }, opts),
557
574
  retryFailed: (id, body = {}, opts) => execute(config, "mailings.retryFailed", { params: { id }, body }, opts),
558
575
  duplicate: (id, opts) => execute(config, "mailings.duplicate", { params: { id }, body: {} }, opts),
559
576
  // S4: scheduling, segments and A/B testing
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.13.0",
6
+ "version": "0.15.0",
7
7
  "description": "Typed client for the Lumitra Mail v1 API: Node and edge runtimes, retries with idempotency, cursor pagination, webhook verification",
8
8
  "license": "MIT",
9
9
  "repository": {
@@ -32,7 +32,7 @@
32
32
  "LICENSE"
33
33
  ],
34
34
  "dependencies": {
35
- "@marlinjai/mail-contract": "^0.13.0"
35
+ "@marlinjai/mail-contract": "^0.15.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "zod": "^3.25.0"