@dench.com/cli 3.8.2-staging.392 → 3.8.4-staging.400
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 +246 -28
- package/campaign.ts +31 -9
- package/lib/api-schemas.ts +205 -9
- package/lib/app-sdk-catalog.generated.ts +23 -2
- package/lib/app-sdk-surface.ts +65 -5
- package/lib/campaign-agent.ts +69 -4
- package/lib/command-args.ts +13 -1
- package/lib/command-registry.ts +150 -8
- package/lib/references.generated.json +10 -10
- package/package.json +1 -1
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.
|
|
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.
|
|
3588
|
-
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
|
|
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
|
-
/**
|
|
7894
|
-
|
|
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
|
-
/**
|
|
9156
|
-
|
|
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
|
-
|
|
4312
|
-
dench campaign builder profile
|
|
4313
|
-
dench campaign builder
|
|
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
|
|
4319
|
-
dench campaign builder
|
|
4320
|
-
|
|
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);
|