@dench.com/cli 3.6.6-staging.386 → 3.7.0-staging.387

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/agent-config.ts CHANGED
@@ -81,6 +81,12 @@ type CliCtx = {
81
81
  sessionToken?: string;
82
82
  };
83
83
 
84
+ function consumeOutputFlag(ctx: CliCtx): void {
85
+ // Drain even when the parent already resolved JSON mode: otherwise a free
86
+ // text body or an optional model positional would consume the literal flag.
87
+ ctx.jsonOutput = hasFlag(ctx.args, "--json") || ctx.jsonOutput;
88
+ }
89
+
84
90
  function out(ctx: CliCtx, value: unknown): void {
85
91
  if (ctx.jsonOutput) {
86
92
  console.log(JSON.stringify(value, null, 2));
@@ -229,7 +235,7 @@ async function handleSimpleMagicFile(
229
235
  }
230
236
  if (sub === "edit" || sub === "set") {
231
237
  let content: string;
232
- if (hasFlag(args, "--stdin") || getFlag(args, "--content")) {
238
+ if (args.includes("--stdin") || args.includes("--content")) {
233
239
  content = await resolveContent(args);
234
240
  } else {
235
241
  const config = await loadAgentConfig(ctx);
@@ -315,7 +321,7 @@ async function handleBootstrap(ctx: CliCtx, args: string[]): Promise<void> {
315
321
  }
316
322
  if (sub === "template") {
317
323
  let content: string;
318
- if (hasFlag(args, "--stdin") || getFlag(args, "--content")) {
324
+ if (args.includes("--stdin") || args.includes("--content")) {
319
325
  content = await resolveContent(args);
320
326
  } else {
321
327
  const config = await loadAgentConfig(ctx);
@@ -399,6 +405,7 @@ async function handleModel(ctx: CliCtx, args: string[]): Promise<void> {
399
405
  // ── Entry points consumed by cli/dench.ts ────────────────────────────────
400
406
 
401
407
  export async function runIdentityCommand(ctx: CliCtx): Promise<void> {
408
+ consumeOutputFlag(ctx);
402
409
  await handleSimpleMagicFile(ctx, ctx.args, {
403
410
  label: "identity",
404
411
  field: "identity",
@@ -406,6 +413,7 @@ export async function runIdentityCommand(ctx: CliCtx): Promise<void> {
406
413
  }
407
414
 
408
415
  export async function runOrganisationCommand(ctx: CliCtx): Promise<void> {
416
+ consumeOutputFlag(ctx);
409
417
  await handleSimpleMagicFile(ctx, ctx.args, {
410
418
  label: "organisation",
411
419
  field: "organisation",
@@ -413,6 +421,7 @@ export async function runOrganisationCommand(ctx: CliCtx): Promise<void> {
413
421
  }
414
422
 
415
423
  export async function runUserCommand(ctx: CliCtx): Promise<void> {
424
+ consumeOutputFlag(ctx);
416
425
  await handleSimpleMagicFile(ctx, ctx.args, {
417
426
  label: "user",
418
427
  field: "identity", // unused (perMember=true)
@@ -421,6 +430,7 @@ export async function runUserCommand(ctx: CliCtx): Promise<void> {
421
430
  }
422
431
 
423
432
  export async function runToolsCommand(ctx: CliCtx): Promise<void> {
433
+ consumeOutputFlag(ctx);
424
434
  await handleSimpleMagicFile(ctx, ctx.args, {
425
435
  label: "tools",
426
436
  field: "toolsNotes",
@@ -433,6 +443,7 @@ export async function runToolsCommand(ctx: CliCtx): Promise<void> {
433
443
  * show | append <text> | set
434
444
  */
435
445
  export async function runMemoryAggregateCommand(ctx: CliCtx): Promise<void> {
446
+ consumeOutputFlag(ctx);
436
447
  const sub = ctx.args[0];
437
448
  if (!sub || sub === "show") {
438
449
  const config = await loadAgentConfig(ctx);
@@ -451,7 +462,7 @@ export async function runMemoryAggregateCommand(ctx: CliCtx): Promise<void> {
451
462
  }
452
463
  if (sub === "set" || sub === "edit") {
453
464
  let content: string;
454
- if (hasFlag(ctx.args, "--stdin") || getFlag(ctx.args, "--content")) {
465
+ if (ctx.args.includes("--stdin") || ctx.args.includes("--content")) {
455
466
  content = await resolveContent(ctx.args);
456
467
  } else {
457
468
  const config = await loadAgentConfig(ctx);
@@ -476,10 +487,12 @@ export async function runMemoryAggregateCommand(ctx: CliCtx): Promise<void> {
476
487
  }
477
488
 
478
489
  export async function runBootstrapCommand(ctx: CliCtx): Promise<void> {
490
+ consumeOutputFlag(ctx);
479
491
  await handleBootstrap(ctx, ctx.args);
480
492
  }
481
493
 
482
494
  export async function runModelCommand(ctx: CliCtx): Promise<void> {
495
+ consumeOutputFlag(ctx);
483
496
  await handleModel(ctx, ctx.args);
484
497
  }
485
498
 
@@ -490,6 +503,7 @@ export async function runModelCommand(ctx: CliCtx): Promise<void> {
490
503
  * heading wrappers stay consistent.
491
504
  */
492
505
  export async function runDailyCommand(ctx: CliCtx): Promise<void> {
506
+ consumeOutputFlag(ctx);
493
507
  const sub = ctx.args[0];
494
508
  if (!sub || sub === "today") {
495
509
  const today = new Date();
package/app-sdk.d.ts CHANGED
@@ -722,6 +722,8 @@ export interface ApiRequests {
722
722
  };
723
723
  /** List CRM objects. — `dench crm objects list` — GET /api/v1/crm/objects */
724
724
  "crm.objects.list": Record<string, unknown>;
725
+ /** List names, display labels, visibility and workspace counts without internal state. — `dench crm objects list --compact` — GET /api/v1/crm/catalog/objects */
726
+ "crm.objects.listCompact": Record<string, unknown>;
725
727
  /** Get a CRM object. — `dench crm objects get` — GET /api/v1/crm/objects/{name} */
726
728
  "crm.objects.get": {
727
729
  name: string;
@@ -883,6 +885,10 @@ export interface ApiRequests {
883
885
  "crm.fields.list": {
884
886
  objectName: string;
885
887
  };
888
+ /** List field names, types and effective constraints without indexing or enrichment internals. — `dench crm fields list --compact` — GET /api/v1/crm/catalog/objects/{objectName}/fields */
889
+ "crm.fields.listCompact": {
890
+ objectName: string;
891
+ };
886
892
  /** Create a CRM field or read-only campaign activity boolean column. — `dench crm fields create` — POST /api/v1/crm/objects/{objectName}/fields */
887
893
  "crm.fields.create": {
888
894
  objectName: string;
@@ -1374,6 +1380,16 @@ export interface ApiRequests {
1374
1380
  objectName?: string;
1375
1381
  limit?: number;
1376
1382
  };
1383
+ /** Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone. — `dench crm search --page` — GET /api/v1/crm/search/page */
1384
+ "crm.search.page": {
1385
+ /** Full-text query over readable entries. */
1386
+ text: string;
1387
+ objectName?: string;
1388
+ select?: string[];
1389
+ limit?: number;
1390
+ /** Use the preceding continueCursor, with the same query and projection. */
1391
+ cursor?: string;
1392
+ };
1377
1393
  /** List CRM statuses. — `dench crm statuses list` — GET /api/v1/crm/objects/{objectName}/statuses */
1378
1394
  "crm.statuses.list": {
1379
1395
  objectName: string;
@@ -2179,6 +2195,32 @@ export interface ApiRequests {
2179
2195
  /** Identity id, sender email, or domain (deletes every sender on the domain). Permanent: re-adding requires re-verification. */
2180
2196
  identity: string;
2181
2197
  };
2198
+ /** Search authorized synced mailbox headers with bounded cursor pagination. isDone covers stored records, not provider completeness. — `dench email inbox search` — GET /api/v1/email/inbox/search */
2199
+ "email.inbox.search": {
2200
+ limit?: number;
2201
+ cursor?: string;
2202
+ mailbox?: string;
2203
+ from?: string;
2204
+ to?: string;
2205
+ subject?: string;
2206
+ /** Inclusive Unix milliseconds; missing sentAt falls back to createdAt. */
2207
+ after?: number;
2208
+ /** Exclusive Unix milliseconds. */
2209
+ before?: number;
2210
+ direction?: "inbound" | "outbound";
2211
+ };
2212
+ /** Read a bounded page of synced headers using an exact thread handle from inbox search; bodies remain on demand. — `dench email inbox thread` — GET /api/v1/email/inbox/threads/{threadHandle} */
2213
+ "email.inbox.thread": {
2214
+ limit?: number;
2215
+ cursor?: string;
2216
+ threadHandle: string;
2217
+ };
2218
+ /** Read a bounded stored body using an exact message handle from inbox search; rechecks mailbox and record privacy. — `dench email inbox message` — GET /api/v1/email/inbox/messages/{messageHandle} */
2219
+ "email.inbox.message": {
2220
+ messageHandle: string;
2221
+ format?: "text" | "html";
2222
+ maxBytes?: number;
2223
+ };
2182
2224
  /** Create an editable Dench email draft and synchronize its selected native mailbox asynchronously. Use a stable requestId for retries. — `dench email draft create` — POST /api/v1/email/drafts */
2183
2225
  "email.drafts.create": {
2184
2226
  organizationId?: string;
@@ -2261,13 +2303,13 @@ export interface ApiRequests {
2261
2303
  "email.drafts.signature": {
2262
2304
  draftId: string;
2263
2305
  };
2264
- /** Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request. — `dench email send --mailbox` — POST /api/v1/email/native/send */
2306
+ /** Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request. — `dench email send [--mailbox <id/email>]` — POST /api/v1/email/native/send */
2265
2307
  "email.native.send": {
2266
2308
  organizationId?: string;
2267
2309
  threadId?: string;
2268
2310
  mailbox?: string;
2269
2311
  requestId: string;
2270
- to?: {
2312
+ to: {
2271
2313
  email: string;
2272
2314
  name?: string;
2273
2315
  }[];
@@ -2289,7 +2331,7 @@ export interface ApiRequests {
2289
2331
  size: number;
2290
2332
  }[];
2291
2333
  };
2292
- /** Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId. — `dench email send` — POST /api/v1/email/send */
2334
+ /** Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId. — `dench email send --from <verified-email>` — POST /api/v1/email/send */
2293
2335
  "email.send": {
2294
2336
  /** Verified sender mailbox. */
2295
2337
  fromEmail: string;
@@ -3165,7 +3207,7 @@ export interface ApiRequests {
3165
3207
  /** Execution ref from a prior search, OR pass session_id+tool_slug. */
3166
3208
  execution_ref?: string;
3167
3209
  session_id?: string;
3168
- /** Tool slug, e.g. GMAIL_FETCH_EMAILS. */
3210
+ /** Tool slug, e.g. SLACK_LIST_CHANNELS. */
3169
3211
  tool_slug?: string;
3170
3212
  /** Tool arguments object. */
3171
3213
  arguments?: Record<string, unknown>;
@@ -3213,7 +3255,7 @@ export interface ApiRequests {
3213
3255
  };
3214
3256
  /** Read tool notes. — `dench tools show` — GET /api/v1/agent-config/tools */
3215
3257
  "agentConfig.tools.show": Record<string, unknown>;
3216
- /** Update tool notes. — `dench tools notes-edit` — PUT /api/v1/agent-config/tools */
3258
+ /** Update tool notes. — `dench tools edit` — PUT /api/v1/agent-config/tools */
3217
3259
  "agentConfig.tools.edit": {
3218
3260
  content: string;
3219
3261
  };
@@ -4097,6 +4139,16 @@ export interface ApiResponses {
4097
4139
  updatedAt: number;
4098
4140
  [key: string]: unknown;
4099
4141
  }>;
4142
+ "crm.objects.listCompact": Array<{
4143
+ _id: string;
4144
+ name: string;
4145
+ displayName: string;
4146
+ description?: string;
4147
+ entryCount: number | null;
4148
+ countScope: "workspace" | "private_unknown";
4149
+ visibility: "workspace" | "owner_only" | "owner_plus_members";
4150
+ archived: boolean;
4151
+ }>;
4100
4152
  "crm.objects.get": {
4101
4153
  _id: string;
4102
4154
  _creationTime: number;
@@ -4235,6 +4287,18 @@ export interface ApiResponses {
4235
4287
  updatedAt: number;
4236
4288
  [key: string]: unknown;
4237
4289
  }>;
4290
+ "crm.fields.listCompact": {
4291
+ _id: string;
4292
+ name: string;
4293
+ type: string;
4294
+ required: boolean;
4295
+ readOnly: boolean;
4296
+ defaultValue?: string;
4297
+ enumValues?: string[];
4298
+ enumMultiple: boolean;
4299
+ relatedObjectId?: string;
4300
+ relationshipType?: string;
4301
+ }[];
4238
4302
  "crm.fields.create": {
4239
4303
  id: string;
4240
4304
  };
@@ -4576,6 +4640,19 @@ export interface ApiResponses {
4576
4640
  updatedBy: string;
4577
4641
  [key: string]: unknown;
4578
4642
  }[];
4643
+ "crm.search.page": {
4644
+ page: {
4645
+ _id: string;
4646
+ objectId: string;
4647
+ /** Field-name -> cell value map. */
4648
+ data: Record<string, unknown>;
4649
+ }[];
4650
+ isDone: boolean;
4651
+ continueCursor: string | null;
4652
+ returnedCount: number;
4653
+ selectedFields: string[] | null;
4654
+ completeness: "page";
4655
+ };
4579
4656
  "crm.statuses.list": {
4580
4657
  _id: string;
4581
4658
  _creationTime: number;
@@ -5447,6 +5524,150 @@ export interface ApiResponses {
5447
5524
  disabled: boolean;
5448
5525
  }[];
5449
5526
  };
5527
+ "email.inbox.search": {
5528
+ page: Array<{
5529
+ messageHandle: string;
5530
+ threadHandle: string;
5531
+ mailboxId: string;
5532
+ from: {
5533
+ email: string;
5534
+ name?: string;
5535
+ };
5536
+ to: {
5537
+ email: string;
5538
+ name?: string;
5539
+ }[];
5540
+ subject: string;
5541
+ at: number;
5542
+ dateSource: "sentAt" | "createdAt";
5543
+ direction: "inbound" | "outbound";
5544
+ status: string;
5545
+ hasAttachments: boolean;
5546
+ headersTruncated: boolean;
5547
+ }>;
5548
+ continueCursor: string | null;
5549
+ isDone: boolean;
5550
+ coverage: {
5551
+ source: "synced";
5552
+ scope: "mailbox_linked_messages";
5553
+ mailboxId: string;
5554
+ mailboxEmail: string;
5555
+ mailboxStatus: string;
5556
+ ingestionMode: string;
5557
+ phase: string;
5558
+ syncStatus: string | null;
5559
+ lastPolledAt: number | null;
5560
+ lastBackfillCompletedAt: number | null;
5561
+ oldestSeenAt: number | null;
5562
+ backfillStatus: string | null;
5563
+ backfillCapped: boolean;
5564
+ providerComplete: false;
5565
+ privacyLimited: boolean;
5566
+ };
5567
+ order: "sentAt_desc_then_undated";
5568
+ };
5569
+ "email.inbox.thread": {
5570
+ page: Array<{
5571
+ messageHandle: string;
5572
+ threadHandle: string;
5573
+ mailboxId: string;
5574
+ from: {
5575
+ email: string;
5576
+ name?: string;
5577
+ };
5578
+ to: {
5579
+ email: string;
5580
+ name?: string;
5581
+ }[];
5582
+ subject: string;
5583
+ at: number;
5584
+ dateSource: "sentAt" | "createdAt";
5585
+ direction: "inbound" | "outbound";
5586
+ status: string;
5587
+ hasAttachments: boolean;
5588
+ headersTruncated: boolean;
5589
+ }>;
5590
+ continueCursor: string | null;
5591
+ isDone: boolean;
5592
+ coverage: {
5593
+ source: "synced";
5594
+ scope: "mailbox_linked_messages";
5595
+ mailboxId: string;
5596
+ mailboxEmail: string;
5597
+ mailboxStatus: string;
5598
+ ingestionMode: string;
5599
+ phase: string;
5600
+ syncStatus: string | null;
5601
+ lastPolledAt: number | null;
5602
+ lastBackfillCompletedAt: number | null;
5603
+ oldestSeenAt: number | null;
5604
+ backfillStatus: string | null;
5605
+ backfillCapped: boolean;
5606
+ providerComplete: false;
5607
+ privacyLimited: boolean;
5608
+ };
5609
+ order: "sentAt_desc_then_undated";
5610
+ };
5611
+ "email.inbox.message": {
5612
+ header: {
5613
+ messageHandle: string;
5614
+ threadHandle: string;
5615
+ mailboxId: string;
5616
+ from: {
5617
+ email: string;
5618
+ name?: string;
5619
+ };
5620
+ to: {
5621
+ email: string;
5622
+ name?: string;
5623
+ }[];
5624
+ subject: string;
5625
+ at: number;
5626
+ dateSource: "sentAt" | "createdAt";
5627
+ direction: "inbound" | "outbound";
5628
+ status: string;
5629
+ hasAttachments: boolean;
5630
+ headersTruncated: boolean;
5631
+ };
5632
+ coverage: {
5633
+ source: "synced";
5634
+ scope: "mailbox_linked_messages";
5635
+ mailboxId: string;
5636
+ mailboxEmail: string;
5637
+ mailboxStatus: string;
5638
+ ingestionMode: string;
5639
+ phase: string;
5640
+ syncStatus: string | null;
5641
+ lastPolledAt: number | null;
5642
+ lastBackfillCompletedAt: number | null;
5643
+ oldestSeenAt: number | null;
5644
+ backfillStatus: string | null;
5645
+ backfillCapped: boolean;
5646
+ providerComplete: false;
5647
+ privacyLimited: boolean;
5648
+ };
5649
+ body: {
5650
+ format: "text" | "html";
5651
+ content: string;
5652
+ truncated: boolean;
5653
+ totalBytes: number;
5654
+ };
5655
+ recipients: {
5656
+ to: {
5657
+ email: string;
5658
+ name?: string;
5659
+ }[];
5660
+ cc: {
5661
+ email: string;
5662
+ name?: string;
5663
+ }[];
5664
+ bcc: {
5665
+ email: string;
5666
+ name?: string;
5667
+ }[];
5668
+ truncated: boolean;
5669
+ };
5670
+ };
5450
5671
  "email.drafts.create": {
5451
5672
  ok: boolean;
5452
5673
  kind: "email";
@@ -7369,7 +7590,7 @@ export type DenchApiTree = {
7369
7590
  show(args?: Req<"agentConfig.organisation.show">): Promise<Res<"agentConfig.organisation.show">>;
7370
7591
  };
7371
7592
  tools: {
7372
- /** Update tool notes. (`dench tools notes-edit`) */
7593
+ /** Update tool notes. (`dench tools edit`) */
7373
7594
  edit(args: Req<"agentConfig.tools.edit">): Promise<Res<"agentConfig.tools.edit">>;
7374
7595
  /** Read tool notes. (`dench tools show`) */
7375
7596
  show(args?: Req<"agentConfig.tools.show">): Promise<Res<"agentConfig.tools.show">>;
@@ -7770,6 +7991,8 @@ export type DenchApiTree = {
7770
7991
  };
7771
7992
  /** List fields for a CRM object, including read-only calculation metadata. (`dench crm fields list`) */
7772
7993
  list(args: Req<"crm.fields.list">): Promise<Res<"crm.fields.list">>;
7994
+ /** List field names, types and effective constraints without indexing or enrichment internals. (`dench crm fields list --compact`) */
7995
+ listCompact(args: Req<"crm.fields.listCompact">): Promise<Res<"crm.fields.listCompact">>;
7773
7996
  /** Reorder CRM fields. (`dench crm fields reorder`) */
7774
7997
  reorder(args: Req<"crm.fields.reorder">): Promise<Res<"crm.fields.reorder">>;
7775
7998
  /** Update a CRM field or change/explicitly clear an existing campaign calculation. (`dench crm fields update`) */
@@ -7796,6 +8019,8 @@ export type DenchApiTree = {
7796
8019
  get(args: Req<"crm.objects.get">): Promise<Res<"crm.objects.get">>;
7797
8020
  /** List CRM objects. (`dench crm objects list`) */
7798
8021
  list(args?: Req<"crm.objects.list">): Promise<Res<"crm.objects.list">>;
8022
+ /** List names, display labels, visibility and workspace counts without internal state. (`dench crm objects list --compact`) */
8023
+ listCompact(args?: Req<"crm.objects.listCompact">): Promise<Res<"crm.objects.listCompact">>;
7799
8024
  /** Rename a CRM object. (`dench crm objects rename`) */
7800
8025
  rename(args: Req<"crm.objects.rename">): Promise<Res<"crm.objects.rename">>;
7801
8026
  /** Restore a CRM object's workspace sidebar row. Admin-only. (`dench crm objects unarchive`) */
@@ -7821,8 +8046,13 @@ export type DenchApiTree = {
7821
8046
  /** Generate a CRM report. (`dench crm reports generate`) */
7822
8047
  generate(args: Req<"crm.reports.generate">): Promise<Res<"crm.reports.generate">>;
7823
8048
  };
7824
- /** Search CRM entries. (`dench crm search`) */
7825
- search(args?: Req<"crm.search">): Promise<Res<"crm.search">>;
8049
+ search: {
8050
+ /** Search CRM entries. (`dench crm search`) */
8051
+ (args?: Req<"crm.search">): Promise<Res<"crm.search">>;
8052
+ $call(args?: Req<"crm.search">): Promise<Res<"crm.search">>;
8053
+ /** Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone. (`dench crm search --page`) */
8054
+ page(args?: Req<"crm.search.page">): Promise<Res<"crm.search.page">>;
8055
+ };
7826
8056
  sidebar: {
7827
8057
  groups: {
7828
8058
  /** Create a named sidebar group (e.g. "Hiring") in the workspace-shared Library. Open to any member. (`dench crm sidebar group create`) */
@@ -8035,6 +8265,14 @@ export type DenchApiTree = {
8035
8265
  /** Start Dench Emailing Service sender verification. (`dench email identity verify`) */
8036
8266
  verify(args: Req<"email.identity.verify">): Promise<Res<"email.identity.verify">>;
8037
8267
  };
8268
+ inbox: {
8269
+ /** Read a bounded stored body using an exact message handle from inbox search; rechecks mailbox and record privacy. (`dench email inbox message`) */
8270
+ message(args: Req<"email.inbox.message">): Promise<Res<"email.inbox.message">>;
8271
+ /** Search authorized synced mailbox headers with bounded cursor pagination. isDone covers stored records, not provider completeness. (`dench email inbox search`) */
8272
+ search(args?: Req<"email.inbox.search">): Promise<Res<"email.inbox.search">>;
8273
+ /** Read a bounded page of synced headers using an exact thread handle from inbox search; bodies remain on demand. (`dench email inbox thread`) */
8274
+ thread(args: Req<"email.inbox.thread">): Promise<Res<"email.inbox.thread">>;
8275
+ };
8038
8276
  message: {
8039
8277
  /** Read a raw email message's status and open/click counters. (`dench email message status`) */
8040
8278
  get(args: Req<"email.message.get">): Promise<Res<"email.message.get">>;
@@ -8042,10 +8280,10 @@ export type DenchApiTree = {
8042
8280
  list(args?: Req<"email.message.list">): Promise<Res<"email.message.list">>;
8043
8281
  };
8044
8282
  native: {
8045
- /** Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request. (`dench email send --mailbox`) */
8283
+ /** Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request. (`dench email send [--mailbox <id/email>]`) */
8046
8284
  send(args: Req<"email.native.send">): Promise<Res<"email.native.send">>;
8047
8285
  };
8048
- /** Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId. (`dench email send`) */
8286
+ /** Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId. (`dench email send --from <verified-email>`) */
8049
8287
  send(args: Req<"email.send">): Promise<Res<"email.send">>;
8050
8288
  sequence: {
8051
8289
  /** Activate a sequence so its enrollments begin sending. (`dench email sequence activate`) */