@dench.com/cli 3.8.2-staging.391 → 3.8.3-staging.398

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/app-sdk.d.ts CHANGED
@@ -413,6 +413,8 @@ export interface ApiRequests {
413
413
  status?: "active" | "paused";
414
414
  cadence?: "daily" | "weekly" | "monthly";
415
415
  findMoreMatching?: boolean;
416
+ /** auto: new people a signal finds start the sequence on their own. manual: they wait for approval. */
417
+ approvalMode?: "auto" | "manual";
416
418
  targeting?: {
417
419
  titles: string[];
418
420
  locations: string[];
@@ -420,22 +422,45 @@ export interface ApiRequests {
420
422
  industries: string[];
421
423
  excludes: string[];
422
424
  companies?: string[];
425
+ companyTypes?: string[];
423
426
  };
424
427
  signal?: {
425
- signal: "post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader";
428
+ signal: "post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike";
426
429
  enabled: boolean;
427
430
  };
428
431
  terms?: {
429
- signal: "post_engagement" | "keyword" | "hiring";
432
+ signal: "post_engagement" | "keyword" | "hiring" | "voice_engagement" | "company_engagement" | "brand_engagement";
430
433
  values: string[];
431
434
  };
432
435
  };
433
436
  /** Preview a signal source using its current audience. Provider credits may apply; does not enroll people. — `dench campaign sources preview` — POST /api/v1/campaigns/{sequenceId}/sources/preview */
434
437
  "campaigns.sources.preview": {
435
438
  sequenceId: string;
436
- signal: "post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader";
439
+ signal: "post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike";
437
440
  terms?: string[];
438
441
  };
442
+ /** Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour. — `dench campaign sources run` — POST /api/v1/campaigns/{sequenceId}/sources/run */
443
+ "campaigns.sources.run": {
444
+ sequenceId: string;
445
+ };
446
+ /** Read the Sources tab: each signal's status, last and next run, people found and anything needing attention. — `dench campaign sources overview` — GET /api/v1/campaigns/{sequenceId}/sources/overview */
447
+ "campaigns.sources.overview": {
448
+ sequenceId: string;
449
+ };
450
+ /** List people a signal found who are waiting for approval (manual approval mode). — `dench campaign sources pending` — GET /api/v1/campaigns/{sequenceId}/sources/pending */
451
+ "campaigns.sources.pending": {
452
+ sequenceId: string;
453
+ };
454
+ /** Approve people waiting for review (they start the sequence) or reject them. — `dench campaign sources approve|reject` — POST /api/v1/campaigns/{sequenceId}/sources/review */
455
+ "campaigns.sources.review": {
456
+ sequenceId: string;
457
+ enrollmentIds: string[];
458
+ decision: "approve" | "reject";
459
+ };
460
+ /** Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits. — `dench campaign queue` — GET /api/v1/campaigns/{sequenceId}/queue */
461
+ "campaigns.queue": {
462
+ sequenceId: string;
463
+ };
439
464
  /** Read the company profile and suggested campaign audience. — `dench campaign builder profile` — GET /api/v1/campaigns/builder/profile */
440
465
  "campaigns.builder.profile": Record<string, unknown>;
441
466
  /** Save a signal campaign's audience, signals and terms idempotently. Does not start a build. — `dench campaign builder save` — POST /api/v1/campaigns/builder/drafts */
@@ -449,12 +474,52 @@ export interface ApiRequests {
449
474
  industries: string[];
450
475
  excludes: string[];
451
476
  companies?: string[];
477
+ companyTypes?: string[];
452
478
  };
453
- signals: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader">;
479
+ signals: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike">;
454
480
  signalTerms?: {
481
+ /** Post topics, phrased as what the buyer does ("using AI for outbound"), not bare product names. */
455
482
  post_engagement?: string[];
456
483
  keyword?: string[];
484
+ /** Roles being hired for. */
457
485
  hiring?: string[];
486
+ /** LinkedIn profile URLs of market voices whose posts to watch. */
487
+ voice_engagement?: string[];
488
+ /** LinkedIn company page URLs of companies and competitors. */
489
+ company_engagement?: string[];
490
+ /** The sender's own LinkedIn company page URL. */
491
+ brand_engagement?: string[];
492
+ /** Topic signals searched by their exact keywords only (no drafted phrases). */
493
+ exact?: Array<"post_engagement" | "keyword">;
494
+ };
495
+ /** Also add people who match the audience without a signal. */
496
+ findMoreMatching?: boolean;
497
+ name?: string;
498
+ /** How people come in: buying signals, people like one best lead, a pasted list or CSV, CRM records, or a people search. */
499
+ source?: "signals" | "lookalike" | "existing" | "crm" | "search";
500
+ screen?: "source" | "signals" | "lookalike" | "target" | "messages" | "outreach" | "review";
501
+ /** For source lookalike: the edited result of builder lookalike, with signals ["lookalike"]. */
502
+ lookalike?: {
503
+ seed: {
504
+ name: string;
505
+ linkedinUrl: string;
506
+ title?: string;
507
+ companyName?: string;
508
+ companyDomain?: string;
509
+ avatarUrl?: string;
510
+ };
511
+ title: string;
512
+ similarRoles: boolean;
513
+ roles: string[];
514
+ location?: string;
515
+ industry?: string;
516
+ relatedIndustries: boolean;
517
+ industries: string[];
518
+ companySizes: string[];
519
+ companies: {
520
+ name: string;
521
+ domain: string;
522
+ }[];
458
523
  };
459
524
  };
460
525
  /** Read signal build progress, preview people, messages and errors. — `dench campaign builder get` — GET /api/v1/campaigns/builder/drafts/{draftId} */
@@ -470,6 +535,8 @@ export interface ApiRequests {
470
535
  draftId: string;
471
536
  name?: string;
472
537
  timezone?: string;
538
+ /** Save paused: signals wait to run until launch. */
539
+ paused?: boolean;
473
540
  };
474
541
  /** Edit or reset one preview person's opening line before creating the campaign. — `dench campaign builder opener` — PUT /api/v1/campaigns/builder/drafts/{draftId}/people/{leadId}/opener */
475
542
  "campaigns.builder.opener": {
@@ -477,21 +544,98 @@ export interface ApiRequests {
477
544
  leadId: string;
478
545
  opener: string;
479
546
  };
547
+ /** List saved, unfinished campaign drafts that can be resumed. — `dench campaign builder drafts` — GET /api/v1/campaigns/builder/drafts */
548
+ "campaigns.builder.drafts": Record<string, unknown>;
549
+ /** Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it. — `dench campaign builder resume` — GET /api/v1/campaigns/builder/drafts/{draftId}/setup */
550
+ "campaigns.builder.resume": {
551
+ draftId: string;
552
+ };
553
+ /** Discard a saved draft that has not become a campaign. — `dench campaign builder discard` — DELETE /api/v1/campaigns/builder/drafts/{draftId} */
554
+ "campaigns.builder.discard": {
555
+ draftId: string;
556
+ };
557
+ /** Save a draft's Outreach and Review choices: AI or manual steps, the brief, the steps, who sends and when, and auto or manual approval. — `dench campaign builder outreach` — PATCH /api/v1/campaigns/builder/drafts/{draftId}/outreach */
558
+ "campaigns.builder.outreach": {
559
+ draftId: string;
560
+ /** ai: generate the sequence from the brief. manual: write steps. */
561
+ outreachMode?: "ai" | "manual";
562
+ brief?: {
563
+ /** What a reply should lead to, e.g. a demo. */
564
+ goal: string;
565
+ /** The problem the product solves for them. */
566
+ helpWith: string;
567
+ tone: "conversational" | "warm" | "direct" | "formal";
568
+ channels: "both" | "email" | "linkedin";
569
+ };
570
+ steps?: Array<{
571
+ type: "email" | "wait" | "linkedin_connection" | "linkedin_message";
572
+ waitHours?: number;
573
+ emailSubject?: string;
574
+ emailTextBody?: string;
575
+ emailReplyToPrevious?: boolean;
576
+ onlyIf?: "always" | "connected" | "not_connected";
577
+ linkedinMessageBody?: string;
578
+ linkedinMessageMode?: "skip_if_not_connected" | "wait_until_connected";
579
+ connectionTimeoutHours?: number;
580
+ }>;
581
+ sending?: {
582
+ emailMailboxAccountIds: string[];
583
+ linkedinAccountIds: string[];
584
+ timezone: string;
585
+ startHour: number;
586
+ endHour: number;
587
+ /** 0 is Sunday, 6 is Saturday. */
588
+ weekdays: number[];
589
+ dailySendCap?: number;
590
+ };
591
+ /** auto: new people a signal finds start the sequence on their own. manual: they wait for approval. */
592
+ approvalMode?: "auto" | "manual";
593
+ };
594
+ /** Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply. — `dench campaign builder sequence` — POST /api/v1/campaigns/builder/drafts/{draftId}/sequence */
595
+ "campaigns.builder.sequence": {
596
+ draftId: string;
597
+ brief: {
598
+ /** What a reply should lead to, e.g. a demo. */
599
+ goal: string;
600
+ /** The problem the product solves for them. */
601
+ helpWith: string;
602
+ tone: "conversational" | "warm" | "direct" | "formal";
603
+ channels: "both" | "email" | "linkedin";
604
+ };
605
+ };
606
+ /** Set up a lookalike from the best lead's LinkedIn URL (role, similar roles, place, industry, similar companies), suggest roles again, or re-scope to a company. Nothing is saved. Provider credits apply. — `dench campaign builder lookalike` — POST /api/v1/campaigns/builder/lookalike */
607
+ "campaigns.builder.lookalike": {
608
+ /** The best lead's LinkedIn profile URL. */
609
+ linkedinUrl?: string;
610
+ /** Suggest similar roles and related industries again. */
611
+ suggest?: {
612
+ title: string;
613
+ industry?: string;
614
+ };
615
+ /** Re-scope the lookalike to a different company. */
616
+ rescope?: {
617
+ seed: {
618
+ name: string;
619
+ linkedinUrl: string;
620
+ title?: string;
621
+ companyName?: string;
622
+ companyDomain?: string;
623
+ avatarUrl?: string;
624
+ };
625
+ company: string;
626
+ title?: string;
627
+ location?: string;
628
+ };
629
+ };
630
+ /** Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply. — `dench campaign builder voices` — POST /api/v1/campaigns/builder/voices */
631
+ "campaigns.builder.voices": {
632
+ topics?: string[];
633
+ market?: string;
634
+ };
480
635
  /** Turn an audience description into targeting filters. AI credits apply. — `dench campaign builder autofill` — POST /api/v1/campaigns/builder/autofill */
481
636
  "campaigns.builder.autofill": {
482
637
  description: string;
483
638
  };
484
- /** Suggest signal terms for the selected audience. AI credits apply. — `dench campaign builder terms` — POST /api/v1/campaigns/builder/terms */
485
- "campaigns.builder.terms": {
486
- targeting: {
487
- titles: string[];
488
- locations: string[];
489
- companySizes: string[];
490
- industries: string[];
491
- excludes: string[];
492
- companies?: string[];
493
- };
494
- };
495
639
  /** Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply. — `dench campaign builder estimate` — POST /api/v1/campaigns/builder/estimate */
496
640
  "campaigns.builder.estimate": {
497
641
  kind: "people" | "week";
@@ -502,12 +646,23 @@ export interface ApiRequests {
502
646
  industries: string[];
503
647
  excludes: string[];
504
648
  companies?: string[];
649
+ companyTypes?: string[];
505
650
  };
506
- signals?: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader">;
651
+ signals?: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike">;
507
652
  signalTerms?: {
653
+ /** Post topics, phrased as what the buyer does ("using AI for outbound"), not bare product names. */
508
654
  post_engagement?: string[];
509
655
  keyword?: string[];
656
+ /** Roles being hired for. */
510
657
  hiring?: string[];
658
+ /** LinkedIn profile URLs of market voices whose posts to watch. */
659
+ voice_engagement?: string[];
660
+ /** LinkedIn company page URLs of companies and competitors. */
661
+ company_engagement?: string[];
662
+ /** The sender's own LinkedIn company page URL. */
663
+ brand_engagement?: string[];
664
+ /** Topic signals searched by their exact keywords only (no drafted phrases). */
665
+ exact?: Array<"post_engagement" | "keyword">;
511
666
  };
512
667
  };
513
668
  /** List all CLI/API operations and parity classifications. — `dench help` — GET /api/v1/commands */
@@ -3535,6 +3690,11 @@ export interface ApiResponses {
3535
3690
  ok: boolean;
3536
3691
  [key: string]: unknown;
3537
3692
  };
3693
+ "campaigns.sources.run": null;
3694
+ "campaigns.sources.overview": Record<string, unknown>;
3695
+ "campaigns.sources.pending": Record<string, unknown>[];
3696
+ "campaigns.sources.review": Record<string, unknown>;
3697
+ "campaigns.queue": Record<string, unknown> | null;
3538
3698
  "campaigns.builder.profile": {
3539
3699
  hasProfile: boolean;
3540
3700
  targeting: {
@@ -3544,6 +3704,7 @@ export interface ApiResponses {
3544
3704
  industries: string[];
3545
3705
  excludes: string[];
3546
3706
  companies?: string[];
3707
+ companyTypes?: string[];
3547
3708
  };
3548
3709
  [key: string]: unknown;
3549
3710
  };
@@ -3559,8 +3720,9 @@ export interface ApiResponses {
3559
3720
  industries: string[];
3560
3721
  excludes: string[];
3561
3722
  companies?: string[];
3723
+ companyTypes?: string[];
3562
3724
  };
3563
- signals: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader">;
3725
+ signals: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike">;
3564
3726
  people: Record<string, unknown>[];
3565
3727
  [key: string]: unknown;
3566
3728
  };
@@ -3573,7 +3735,10 @@ export interface ApiResponses {
3573
3735
  enrolled: number;
3574
3736
  };
3575
3737
  "campaigns.builder.opener": null;
3576
- "campaigns.builder.autofill": {
3738
+ "campaigns.builder.drafts": Record<string, unknown>[];
3739
+ "campaigns.builder.resume": {
3740
+ clientRequestId: string;
3741
+ status: string;
3577
3742
  targeting: {
3578
3743
  titles: string[];
3579
3744
  locations: string[];
@@ -3581,14 +3746,25 @@ export interface ApiResponses {
3581
3746
  industries: string[];
3582
3747
  excludes: string[];
3583
3748
  companies?: string[];
3749
+ companyTypes?: string[];
3584
3750
  };
3751
+ signals: Array<"post_engagement" | "keyword" | "hiring" | "funding" | "launch" | "new_leader" | "voice_engagement" | "company_engagement" | "brand_engagement" | "lookalike">;
3585
3752
  [key: string]: unknown;
3586
- };
3587
- "campaigns.builder.terms": {
3588
- signalTerms: {
3589
- post_engagement?: string[];
3590
- keyword?: string[];
3591
- hiring?: string[];
3753
+ } | null;
3754
+ "campaigns.builder.discard": null;
3755
+ "campaigns.builder.outreach": null;
3756
+ "campaigns.builder.sequence": Record<string, unknown>;
3757
+ "campaigns.builder.lookalike": Record<string, unknown>;
3758
+ "campaigns.builder.voices": Record<string, unknown>;
3759
+ "campaigns.builder.autofill": {
3760
+ targeting: {
3761
+ titles: string[];
3762
+ locations: string[];
3763
+ companySizes: string[];
3764
+ industries: string[];
3765
+ excludes: string[];
3766
+ companies?: string[];
3767
+ companyTypes?: string[];
3592
3768
  };
3593
3769
  [key: string]: unknown;
3594
3770
  };
@@ -7880,18 +8056,30 @@ export type DenchApiTree = {
7880
8056
  build(args: Req<"campaigns.builder.build">): Promise<Res<"campaigns.builder.build">>;
7881
8057
  /** Create a campaign from a reviewed signal draft. Does not launch the campaign. (`dench campaign builder create`) */
7882
8058
  create(args: Req<"campaigns.builder.create">): Promise<Res<"campaigns.builder.create">>;
8059
+ /** Discard a saved draft that has not become a campaign. (`dench campaign builder discard`) */
8060
+ discard(args: Req<"campaigns.builder.discard">): Promise<Res<"campaigns.builder.discard">>;
8061
+ /** List saved, unfinished campaign drafts that can be resumed. (`dench campaign builder drafts`) */
8062
+ drafts(args?: Req<"campaigns.builder.drafts">): Promise<Res<"campaigns.builder.drafts">>;
7883
8063
  /** Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply. (`dench campaign builder estimate`) */
7884
8064
  estimate(args: Req<"campaigns.builder.estimate">): Promise<Res<"campaigns.builder.estimate">>;
7885
8065
  /** Read signal build progress, preview people, messages and errors. (`dench campaign builder get`) */
7886
8066
  get(args: Req<"campaigns.builder.get">): Promise<Res<"campaigns.builder.get">>;
8067
+ /** Set up a lookalike from the best lead's LinkedIn URL (role, similar roles, place, industry, similar companies), suggest roles again, or re-scope to a company. Nothing is saved. Provider credits apply. (`dench campaign builder lookalike`) */
8068
+ lookalike(args: Req<"campaigns.builder.lookalike">): Promise<Res<"campaigns.builder.lookalike">>;
7887
8069
  /** Edit or reset one preview person's opening line before creating the campaign. (`dench campaign builder opener`) */
7888
8070
  opener(args: Req<"campaigns.builder.opener">): Promise<Res<"campaigns.builder.opener">>;
8071
+ /** Save a draft's Outreach and Review choices: AI or manual steps, the brief, the steps, who sends and when, and auto or manual approval. (`dench campaign builder outreach`) */
8072
+ outreach(args: Req<"campaigns.builder.outreach">): Promise<Res<"campaigns.builder.outreach">>;
7889
8073
  /** Read the company profile and suggested campaign audience. (`dench campaign builder profile`) */
7890
8074
  profile(args?: Req<"campaigns.builder.profile">): Promise<Res<"campaigns.builder.profile">>;
8075
+ /** Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it. (`dench campaign builder resume`) */
8076
+ resume(args: Req<"campaigns.builder.resume">): Promise<Res<"campaigns.builder.resume">>;
7891
8077
  /** Save a signal campaign's audience, signals and terms idempotently. Does not start a build. (`dench campaign builder save`) */
7892
8078
  save(args: Req<"campaigns.builder.save">): Promise<Res<"campaigns.builder.save">>;
7893
- /** Suggest signal terms for the selected audience. AI credits apply. (`dench campaign builder terms`) */
7894
- terms(args: Req<"campaigns.builder.terms">): Promise<Res<"campaigns.builder.terms">>;
8079
+ /** Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply. (`dench campaign builder sequence`) */
8080
+ sequence(args: Req<"campaigns.builder.sequence">): Promise<Res<"campaigns.builder.sequence">>;
8081
+ /** Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply. (`dench campaign builder voices`) */
8082
+ voices(args: Req<"campaigns.builder.voices">): Promise<Res<"campaigns.builder.voices">>;
7895
8083
  };
7896
8084
  /** Create a draft outreach campaign with email and LinkedIn sender pools and a business-hours send window in the given timezone. (`dench campaign create`) */
7897
8085
  create(args: Req<"campaigns.create">): Promise<Res<"campaigns.create">>;
@@ -7966,13 +8154,23 @@ export type DenchApiTree = {
7966
8154
  pipeline(args: Req<"campaigns.pipeline">): Promise<Res<"campaigns.pipeline">>;
7967
8155
  /** Show the message one person gets at one email or LinkedIn step, with their fields and personalized lines filled in: subject, body, sender, recipient, merge fields still missing, warnings, and why the step would be skipped. Nothing is sent, prepared or charged. (`dench campaign preview`) */
7968
8156
  preview(args: Req<"campaigns.preview">): Promise<Res<"campaigns.preview">>;
8157
+ /** Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits. (`dench campaign queue`) */
8158
+ queue(args: Req<"campaigns.queue">): Promise<Res<"campaigns.queue">>;
7969
8159
  /** Resume a paused campaign. (`dench campaign resume`) */
7970
8160
  resume(args: Req<"campaigns.resume">): Promise<Res<"campaigns.resume">>;
7971
8161
  sources: {
7972
8162
  /** Read a campaign's saved signal source, targeting and schedule. (`dench campaign sources get`) */
7973
8163
  get(args: Req<"campaigns.sources.get">): Promise<Res<"campaigns.sources.get">>;
8164
+ /** Read the Sources tab: each signal's status, last and next run, people found and anything needing attention. (`dench campaign sources overview`) */
8165
+ overview(args: Req<"campaigns.sources.overview">): Promise<Res<"campaigns.sources.overview">>;
8166
+ /** List people a signal found who are waiting for approval (manual approval mode). (`dench campaign sources pending`) */
8167
+ pending(args: Req<"campaigns.sources.pending">): Promise<Res<"campaigns.sources.pending">>;
7974
8168
  /** Preview a signal source using its current audience. Provider credits may apply; does not enroll people. (`dench campaign sources preview`) */
7975
8169
  preview(args: Req<"campaigns.sources.preview">): Promise<Res<"campaigns.sources.preview">>;
8170
+ /** Approve people waiting for review (they start the sequence) or reject them. (`dench campaign sources approve|reject`) */
8171
+ review(args: Req<"campaigns.sources.review">): Promise<Res<"campaigns.sources.review">>;
8172
+ /** Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour. (`dench campaign sources run`) */
8173
+ run(args: Req<"campaigns.sources.run">): Promise<Res<"campaigns.sources.run">>;
7976
8174
  /** Read signal choices, suggested terms and current source configuration. (`dench campaign sources signals`) */
7977
8175
  signals(args: Req<"campaigns.sources.signals">): Promise<Res<"campaigns.sources.signals">>;
7978
8176
  /** Update source cadence, pause/resume, targeting, signals or terms. Active sources may perform billable future work. (`dench campaign sources set`) */
@@ -9152,8 +9350,28 @@ export interface DenchCampaigns {
9152
9350
  setDraftOpener(opts: Req<"campaigns.builder.opener">): Promise<Res<"campaigns.builder.opener">>;
9153
9351
  /** Translate a description into targeting. AI credits apply. Permission: `campaigns:write`. Wraps `campaigns.builder.autofill`. */
9154
9352
  autofill(opts: Req<"campaigns.builder.autofill">): Promise<Res<"campaigns.builder.autofill">>;
9155
- /** Suggest signal terms. AI credits apply. Permission: `campaigns:write`. Wraps `campaigns.builder.terms`. */
9156
- suggestTerms(opts: Req<"campaigns.builder.terms">): Promise<Res<"campaigns.builder.terms">>;
9353
+ /** List saved, unfinished campaign drafts. Permission: `campaigns:read`. Wraps `campaigns.builder.drafts`. */
9354
+ savedDrafts(): Promise<Res<"campaigns.builder.drafts">>;
9355
+ /** Read a saved draft's setup to resume it. Permission: `campaigns:read`. Wraps `campaigns.builder.resume`. */
9356
+ resumeDraft(draftId: string): Promise<Res<"campaigns.builder.resume">>;
9357
+ /** Discard a saved draft. Permission: `campaigns:write`. Wraps `campaigns.builder.discard`. */
9358
+ discardDraft(draftId: string): Promise<Res<"campaigns.builder.discard">>;
9359
+ /** Save a draft's steps, brief, senders, schedule and approval mode. Permission: `campaigns:write`. Wraps `campaigns.builder.outreach`. */
9360
+ saveOutreach(opts: Req<"campaigns.builder.outreach">): Promise<Res<"campaigns.builder.outreach">>;
9361
+ /** Generate a draft's sequence from a brief. AI credits apply. Permission: `campaigns:write`. Wraps `campaigns.builder.sequence`. */
9362
+ generateSequence(opts: Req<"campaigns.builder.sequence">): Promise<Res<"campaigns.builder.sequence">>;
9363
+ /** Set up a lookalike from a best lead's LinkedIn URL. Provider credits apply. Permission: `campaigns:write`. Wraps `campaigns.builder.lookalike`. */
9364
+ lookalike(opts: Req<"campaigns.builder.lookalike">): Promise<Res<"campaigns.builder.lookalike">>;
9365
+ /** Suggest LinkedIn experts to watch for the topics. AI credits apply. Permission: `campaigns:write`. Wraps `campaigns.builder.voices`. */
9366
+ suggestVoices(opts: Req<"campaigns.builder.voices">): Promise<Res<"campaigns.builder.voices">>;
9367
+ /** Run a live campaign's signals now. Provider credits apply. Permission: `campaigns:write`. Wraps `campaigns.sources.run`. */
9368
+ runSources(sequenceId: string): Promise<Res<"campaigns.sources.run">>;
9369
+ /** People a signal found who wait for approval. Permission: `campaigns:read`. Wraps `campaigns.sources.pending`. */
9370
+ pendingReview(sequenceId: string): Promise<Res<"campaigns.sources.pending">>;
9371
+ /** Approve or reject people waiting for review. Permission: `campaigns:write`. Wraps `campaigns.sources.review`. */
9372
+ reviewPeople(opts: Req<"campaigns.sources.review">): Promise<Res<"campaigns.sources.review">>;
9373
+ /** Who the campaign plans to contact today. Permission: `campaigns:read`. Wraps `campaigns.queue`. */
9374
+ todayQueue(sequenceId: string): Promise<Res<"campaigns.queue">>;
9157
9375
  /** Estimate audience or signal volume. Permission: `campaigns:write`. Wraps `campaigns.builder.estimate`. */
9158
9376
  estimate(opts: Req<"campaigns.builder.estimate">): Promise<Res<"campaigns.builder.estimate">>;
9159
9377
  /** Mailboxes campaigns can send from, with warm-up and daily cap. Permission: `campaigns:read`. Wraps `campaigns.accounts.email`. */
package/campaign.ts CHANGED
@@ -4176,6 +4176,7 @@ async function runAccounts(ctx: CampaignCliContext): Promise<void> {
4176
4176
 
4177
4177
  const SUBCOMMAND_ALIASES: Record<string, string> = {
4178
4178
  ls: "list",
4179
+ today: "queue",
4179
4180
  new: "create",
4180
4181
  status: "get",
4181
4182
  show: "get",
@@ -4308,20 +4309,38 @@ Personalized lines (written by AI for each person, about 3 cents a person; up to
4308
4309
  dench campaign personalize rewrite <campaign> --person <enrollmentId|name> [--line <key>] # a fresh line for one person
4309
4310
  dench campaign personalize clear <campaign> # turn lines off (take the {{keys}} out of the steps first)
4310
4311
 
4311
- Signal builder and sources:
4312
- dench campaign builder profile
4313
- dench campaign builder save --file draft.json
4312
+ Campaign builder (the app's New campaign flow; references/CAMPAIGNS.md walks it):
4313
+ dench campaign builder profile # workspace ICP, suggested targeting, signals and terms, connected senders
4314
+ dench campaign builder autofill --description "VP Sales at US software companies" # description -> targeting
4315
+ dench campaign builder estimate --file estimate.json # {"kind":"people"|"week","targeting":{...},"signals":[...]}
4316
+ dench campaign builder lookalike --linkedin-url <best lead's LinkedIn URL> # lookalike setup to edit; also --data '{"suggest":{...}}'|'{"rescope":{...}}'
4317
+ dench campaign builder voices --topics "AI for sales,outbound" [--market "..."] # LinkedIn experts to watch
4318
+ dench campaign builder save --file draft.json # source, name, targeting, signals, signalTerms, findMoreMatching, lookalike
4319
+ dench campaign builder build <draftId> # finds the first people and writes messages; poll builder get
4314
4320
  dench campaign builder get <draftId>
4315
- dench campaign builder build <draftId>
4316
- dench campaign builder create <draftId> [--name "New campaign"] [--timezone <tz>]
4317
4321
  dench campaign builder opener <draftId> <leadId> --text "Opening line"
4318
- dench campaign builder autofill --description "VP Sales at US software companies"
4319
- dench campaign builder terms --file targeting.json
4320
- dench campaign builder estimate --file estimate.json
4322
+ dench campaign builder sequence <draftId> --goal "Book a demo" --help-with "..." [--tone conversational|warm|direct|formal] [--channels both|email|linkedin]
4323
+ dench campaign builder outreach <draftId> --file outreach.json [--mode ai|manual] [--approval auto|manual]
4324
+ outreach.json: {"brief":{...},"steps":[...],"sending":{"emailMailboxAccountIds":[],"linkedinAccountIds":[],
4325
+ "timezone":"America/New_York","startHour":9,"endHour":17,"weekdays":[1,2,3,4,5],"dailySendCap":30}}
4326
+ dench campaign builder create <draftId> [--name "New campaign"] [--timezone <tz>] [--paused]
4327
+ dench campaign builder drafts # saved drafts that were never created
4328
+ dench campaign builder resume <draftId> # a saved draft's setup
4329
+ dench campaign builder discard <draftId>
4330
+
4331
+ Signals on a campaign (the Sources tab):
4332
+ dench campaign sources overview <campaign> # each signal's status, last and next run, people found, problems
4321
4333
  dench campaign sources get <campaign>
4322
4334
  dench campaign sources signals <campaign>
4323
- dench campaign sources set <campaign> --data '{"cadence":"weekly"}'
4335
+ dench campaign sources set <campaign> --data '{"cadence":"weekly"}' [--approval auto|manual]
4336
+ Also: status active|paused, findMoreMatching, targeting, {"signal":{"signal":"hiring","enabled":true}},
4337
+ {"terms":{"signal":"post_engagement","values":["..."]}}. One change per call is safest.
4324
4338
  dench campaign sources preview <campaign> --signal hiring
4339
+ dench campaign sources run <campaign> # Run now: search the signals now (live campaigns, 6 an hour)
4340
+ dench campaign sources pending <campaign> # people waiting for approval (manual approval)
4341
+ dench campaign sources approve <campaign> --people <enrollmentId,...>
4342
+ dench campaign sources reject <campaign> --people <enrollmentId,...>
4343
+ dench campaign queue <campaign> # who goes out today, warmest first
4325
4344
 
4326
4345
  --filters and --search take the same JSON with every people filter (@file.json
4327
4346
  works) on both search and add. The dench leads find filter flags (--titles,
@@ -4478,7 +4497,10 @@ export async function runCampaignCommand(opts: {
4478
4497
  case "search":
4479
4498
  case "sources":
4480
4499
  case "builder":
4500
+ case "queue":
4481
4501
  return runAgentCommand(ctx, subcommand);
4502
+ case "today":
4503
+ return runAgentCommand(ctx, "queue");
4482
4504
  case "list":
4483
4505
  case "ls":
4484
4506
  return await runList(ctx);