@dench.com/cli 3.7.0-staging.387 → 3.8.1-staging.390
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 +43 -44
- package/agent-config.ts +5 -55
- package/app-sdk.d.ts +253 -43
- package/campaign.ts +335 -54
- package/chat-spawn.ts +11 -2
- package/chat.ts +3 -5
- package/context-settings.ts +86 -0
- package/cron.ts +19 -0
- package/dench.ts +202 -83
- package/environments.ts +694 -0
- package/lib/api-schemas.ts +190 -20
- package/lib/app-sdk-catalog.generated.ts +34 -20
- package/lib/campaign-steps.ts +474 -12
- package/lib/campaign-timeline.ts +69 -4
- package/lib/command-args.ts +19 -4
- package/lib/command-help.ts +17 -2
- package/lib/command-registry.ts +225 -11
- package/lib/environment-archive.ts +255 -0
- package/lib/environment-cli-args.ts +96 -0
- package/lib/environment-contract.ts +237 -0
- package/lib/environment-execution.ts +769 -0
- package/lib/environment-source.ts +165 -0
- package/lib/load-dev-env.mjs +3 -1
- package/lib/load-dev-env.test.mjs +26 -9
- package/lib/parent-argv.ts +20 -0
- package/lib/references.generated.json +26 -18
- package/package.json +5 -3
- package/workspace-secrets.ts +231 -0
- package/agent.ts +0 -37
package/app-sdk.d.ts
CHANGED
|
@@ -12,6 +12,67 @@
|
|
|
12
12
|
// ── Operation request/response types (from cli/lib/api-schemas.ts) ──────
|
|
13
13
|
|
|
14
14
|
export interface ApiRequests {
|
|
15
|
+
/** List workspace-shared reusable setups and ready revisions (metadata only). — `dench env list` — GET /api/v1/environments */
|
|
16
|
+
"environments.list": {
|
|
17
|
+
limit?: number;
|
|
18
|
+
cursor?: string;
|
|
19
|
+
};
|
|
20
|
+
/** Inspect a saved setup, its manifest, and an optional immutable revision. — `dench env show` — GET /api/v1/environments/{name} */
|
|
21
|
+
"environments.get": {
|
|
22
|
+
name: string;
|
|
23
|
+
revision?: string;
|
|
24
|
+
};
|
|
25
|
+
/** Reserve an owner-bound source upload. Prefix the uploaded bytes with the returned proof before saving. — `dench env save` — POST /api/v1/environments/uploads */
|
|
26
|
+
"environments.upload": {
|
|
27
|
+
kind: "source";
|
|
28
|
+
size: number;
|
|
29
|
+
sha256: string;
|
|
30
|
+
};
|
|
31
|
+
/** Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task. — `dench env save` — POST /api/v1/environments/{name} */
|
|
32
|
+
"environments.save": {
|
|
33
|
+
name: string;
|
|
34
|
+
manifest: {
|
|
35
|
+
version: 1;
|
|
36
|
+
name: string;
|
|
37
|
+
purpose: string;
|
|
38
|
+
files: string[];
|
|
39
|
+
prepare: string[];
|
|
40
|
+
verify: string[];
|
|
41
|
+
env?: Record<string, string>;
|
|
42
|
+
secretEnv?: Record<string, string>;
|
|
43
|
+
secretFiles?: {
|
|
44
|
+
path: string;
|
|
45
|
+
secret: string;
|
|
46
|
+
mutable?: boolean;
|
|
47
|
+
}[];
|
|
48
|
+
statePaths?: string[];
|
|
49
|
+
portable?: boolean;
|
|
50
|
+
};
|
|
51
|
+
uploadId: string;
|
|
52
|
+
storageId: string;
|
|
53
|
+
sha256: string;
|
|
54
|
+
};
|
|
55
|
+
/** Retire a saved setup from new selection; retain immutable revisions and active job evidence. — `dench env delete` — DELETE /api/v1/environments/{name} */
|
|
56
|
+
"environments.delete": {
|
|
57
|
+
name: string;
|
|
58
|
+
};
|
|
59
|
+
/** List workspace-shared credential names, kinds and versions; never values. — `dench secrets list` — GET /api/v1/secrets */
|
|
60
|
+
"secrets.list": {
|
|
61
|
+
limit?: number;
|
|
62
|
+
cursor?: string;
|
|
63
|
+
};
|
|
64
|
+
/** Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts. — `dench secrets set` — PUT /api/v1/secrets/{name} */
|
|
65
|
+
"secrets.set": {
|
|
66
|
+
name: string;
|
|
67
|
+
kind: "env" | "file";
|
|
68
|
+
value: string;
|
|
69
|
+
expectedVersion?: number;
|
|
70
|
+
};
|
|
71
|
+
/** Revoke a workspace credential for future resolution, optionally checking its version. — `dench secrets delete` — DELETE /api/v1/secrets/{name} */
|
|
72
|
+
"secrets.delete": {
|
|
73
|
+
name: string;
|
|
74
|
+
expectedVersion?: number;
|
|
75
|
+
};
|
|
15
76
|
/** Create an idempotent empty campaign draft with the caller's available sender pools. Does not launch or send. — `dench campaign draft` — POST /api/v1/campaigns/drafts */
|
|
16
77
|
"campaigns.drafts.create": {
|
|
17
78
|
/** Your stable id for this request, 8-64 characters. Retrying with the same id returns the same draft instead of creating another. */
|
|
@@ -699,6 +760,7 @@ export interface ApiRequests {
|
|
|
699
760
|
};
|
|
700
761
|
/** Start a new chat-turn workflow. — `dench chat new` — POST /api/v1/chat/threads */
|
|
701
762
|
"chat.new": {
|
|
763
|
+
environment?: string;
|
|
702
764
|
/** The user message that starts the turn. */
|
|
703
765
|
prompt: string;
|
|
704
766
|
model?: string;
|
|
@@ -2532,7 +2594,7 @@ export interface ApiRequests {
|
|
|
2532
2594
|
"campaigns.get": {
|
|
2533
2595
|
sequenceId: string;
|
|
2534
2596
|
};
|
|
2535
|
-
/** Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks. — `dench campaign get` — GET /api/v1/campaigns/{sequenceId}/analytics */
|
|
2597
|
+
/** Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks, and for a workflow how many people took each If / else and Wait for them to accept path (branchStats). — `dench campaign get` — GET /api/v1/campaigns/{sequenceId}/analytics */
|
|
2536
2598
|
"campaigns.analytics": {
|
|
2537
2599
|
sequenceId: string;
|
|
2538
2600
|
};
|
|
@@ -2581,13 +2643,13 @@ export interface ApiRequests {
|
|
|
2581
2643
|
/** Cold emails per day, 1-100. */
|
|
2582
2644
|
dailySendCap?: number;
|
|
2583
2645
|
};
|
|
2584
|
-
/** Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail). Steps are checked first: a field the step type would drop, missing text
|
|
2646
|
+
/** Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail, If / else, Wait for them to accept). A workflow (stepModel workflow, or steps with key, next, yesNext or noNext) branches: condition and wait_for_connection steps continue on yesNext or noNext, other steps on next; each points at another step's key or end. Steps are checked first: a field the step type would drop, missing text, {TOKEN} single braces or paths that don't hold together are rejected, not saved. Configure sender pools on the campaign; step sender ids are legacy-only. — `dench campaign steps set` — PUT /api/v1/campaigns/{sequenceId}/steps */
|
|
2585
2647
|
"campaigns.steps.replace": {
|
|
2586
2648
|
sequenceId: string;
|
|
2587
|
-
/** Every step, in send order. Rejected, not trimmed: a field the step type would drop (onlyIf off email/post-like steps, a body on a visit, reply-in-thread on the first email), a missing subject or required body, an overlength note/message/InMail subject, out-of-range wait/withdrawal/post-age values,
|
|
2649
|
+
/** Every step, in send order (a workflow may list them in any order; they are stored in path order). Rejected, not trimmed: a field the step type would drop (onlyIf off email/post-like steps, a body on a visit, reply-in-thread on the first email, condition fields its check ignores), a missing subject or required body, an overlength note/message/InMail subject, out-of-range wait/withdrawal/post-age/acceptance values, {TOKEN} single braces, which would be sent as typed, and workflow paths that don't hold together (duplicate keys, a target that isn't a key or end, a condition or wait_for_connection without both yesNext and noNext, or any other step with them). */
|
|
2588
2650
|
steps: Array<{
|
|
2589
|
-
/** Step type. */
|
|
2590
|
-
type: "
|
|
2651
|
+
/** Step type. condition (If / else) and wait_for_connection (Wait for them to accept) send nothing; they continue on yesNext or noNext and make the campaign a workflow. */
|
|
2652
|
+
type: "wait" | "email" | "linkedin_connection" | "linkedin_message" | "linkedin_visit" | "linkedin_like_post" | "linkedin_inmail" | "condition" | "wait_for_connection";
|
|
2591
2653
|
/** wait steps: hours to wait before the next step. */
|
|
2592
2654
|
waitHours?: number;
|
|
2593
2655
|
/** Legacy email step sender. Pool campaigns choose senders in emailMailboxAccountIds on the campaign, not on individual steps. */
|
|
@@ -2602,35 +2664,57 @@ export interface ApiRequests {
|
|
|
2602
2664
|
emailReplyToPrevious?: boolean;
|
|
2603
2665
|
/** email and linkedin_like_post only: always (default), connected or not_connected. InMail automatically skips connected people; do not set a condition on it. */
|
|
2604
2666
|
onlyIf?: "always" | "connected" | "not_connected";
|
|
2605
|
-
/** Legacy LinkedIn step sender. Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
2667
|
+
/** Legacy LinkedIn step sender (also on wait_for_connection, and on a condition that checks linkedin_connected). Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
2606
2668
|
linkedinAccountId?: string;
|
|
2607
2669
|
/** linkedin_connection: the invite note (optional, up to 300 chars; sent without it if LinkedIn refuses the note); linkedin_message: the required message (up to 3000 chars); linkedin_inmail: the required message (up to 1900 chars). */
|
|
2608
2670
|
linkedinMessageBody?: string;
|
|
2609
2671
|
/** linkedin_message: what to do when the invite is still pending. */
|
|
2610
2672
|
linkedinMessageMode?: "skip_if_not_connected" | "wait_until_connected";
|
|
2611
|
-
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720)
|
|
2673
|
+
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720); after a connection step this mode is the default in a linear campaign. wait_for_connection: wait 24-2160 hours (1-90 days, default 720) before taking the Not accepted path. */
|
|
2612
2674
|
connectionTimeoutHours?: number;
|
|
2613
2675
|
/** linkedin_like_post only: the reaction to leave (default like). */
|
|
2614
2676
|
likeReaction?: "like" | "celebrate" | "support" | "love" | "insightful" | "funny";
|
|
2615
2677
|
/** linkedin_like_post only: select the newest eligible original post from the last 1-365 days (default 30). */
|
|
2616
2678
|
likeMaxPostAgeDays?: number;
|
|
2679
|
+
/** linkedin_like_post only: before the immediately preceding wait starts, check for eligible posts. If none exist, skip that wait and the like step, keeping following waits. Defaults to false when omitted. */
|
|
2680
|
+
likeSkipPreviousWait?: boolean;
|
|
2617
2681
|
/** linkedin_like_post only: skip consecutive following wait steps whenever the reaction step is skipped (default true). False keeps those waits. */
|
|
2618
2682
|
likeSkipNextWait?: boolean;
|
|
2683
|
+
/** linkedin_like_post only: how many recent posts to react to, 1-3 (default 1). */
|
|
2684
|
+
likeCount?: number;
|
|
2619
2685
|
/** linkedin_inmail only: optional subject, up to 200 characters; merge tokens allowed. Clear with an empty string. */
|
|
2620
2686
|
inmailSubject?: string;
|
|
2621
2687
|
/** linkedin_connection only: withdraw a still-pending invitation sent by this campaign after 168-2160 hours (7-90 days). Omitted means off on creation; null turns it off on edit. */
|
|
2622
2688
|
withdrawAfterHours?: number | null;
|
|
2689
|
+
/** Workflow steps: this step's id, unique in the campaign, which next, yesNext and noNext point at (not "end"). Left out, one is made. */
|
|
2690
|
+
key?: string;
|
|
2691
|
+
/** Workflow steps: where a step that isn't a condition or wait_for_connection goes; left out, the following step: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
2692
|
+
next?: string;
|
|
2693
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the Yes (Accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
2694
|
+
yesNext?: string;
|
|
2695
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the No (Not accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
2696
|
+
noNext?: string;
|
|
2697
|
+
/** condition only, required: linkedin_connected, has_email, opened_last_email (needs an email before it on every path) or field_value. Fixed once the campaign launches. */
|
|
2698
|
+
check?: "linkedin_connected" | "has_email" | "opened_last_email" | "field_value";
|
|
2699
|
+
/** condition with check=field_value: the lead field to check, like "Job Title" or "Source" (the campaign itself changes Status, Last touch and LinkedIn connection). Fixed once the campaign launches. */
|
|
2700
|
+
conditionField?: string;
|
|
2701
|
+
/** condition with check=field_value: is, is_not, contains, is_empty or is_not_empty (all case-insensitive). Fixed once the campaign launches. */
|
|
2702
|
+
conditionOperator?: "is" | "is_not" | "is_empty" | "is_not_empty" | "contains";
|
|
2703
|
+
/** condition with check=field_value and is, is_not or contains: the text to compare with. Editable after launch. */
|
|
2704
|
+
conditionValue?: string;
|
|
2623
2705
|
}>;
|
|
2706
|
+
/** linear: steps run in order. workflow: steps have keys and paths (next, yesNext, noNext) and may include condition and wait_for_connection. Left out, a workflow stays one and steps with keys, paths or those types make one; nothing turns a workflow back into a list. When replacing a workflow's steps, send workflow, so steps without keys or paths are checked here the way they will be saved. */
|
|
2707
|
+
stepModel?: "linear" | "workflow";
|
|
2624
2708
|
/** Send {single braces} exactly as typed instead of rejecting them. Merge tokens always use {{double braces}}. */
|
|
2625
2709
|
allowSingleBraces?: boolean;
|
|
2626
2710
|
};
|
|
2627
|
-
/** Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace. — `dench campaign steps edit` — PATCH /api/v1/campaigns/{sequenceId}/steps */
|
|
2711
|
+
/** Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. A workflow keeps its paths and what each If / else checks (key, next, yesNext, noNext, check, conditionField, conditionOperator); conditionValue and acceptance waits stay editable. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace. — `dench campaign steps edit` — PATCH /api/v1/campaigns/{sequenceId}/steps */
|
|
2628
2712
|
"campaigns.steps.update": {
|
|
2629
2713
|
sequenceId: string;
|
|
2630
|
-
/** The steps to change. Rejected, not trimmed: a field the step type would drop, an overlength note/message/InMail subject, out-of-range wait/withdrawal/post-age values,
|
|
2714
|
+
/** The steps to change. Rejected, not trimmed: a field the step type would drop, an overlength note/message/InMail subject, out-of-range wait/withdrawal/post-age/acceptance values, {TOKEN} single braces, and a changed path or If / else check. */
|
|
2631
2715
|
steps: Array<{
|
|
2632
2716
|
/** The step's current type. A launched step's type can't change. */
|
|
2633
|
-
type: "
|
|
2717
|
+
type: "wait" | "email" | "linkedin_connection" | "linkedin_message" | "linkedin_visit" | "linkedin_like_post" | "linkedin_inmail" | "condition" | "wait_for_connection";
|
|
2634
2718
|
/** wait steps: hours to wait before the next step. */
|
|
2635
2719
|
waitHours?: number;
|
|
2636
2720
|
/** Legacy email step sender. Pool campaigns choose senders in emailMailboxAccountIds on the campaign, not on individual steps. */
|
|
@@ -2645,24 +2729,44 @@ export interface ApiRequests {
|
|
|
2645
2729
|
emailReplyToPrevious?: boolean;
|
|
2646
2730
|
/** email and linkedin_like_post only: always (default), connected or not_connected. InMail automatically skips connected people; do not set a condition on it. */
|
|
2647
2731
|
onlyIf?: "always" | "connected" | "not_connected";
|
|
2648
|
-
/** Legacy LinkedIn step sender. Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
2732
|
+
/** Legacy LinkedIn step sender (also on wait_for_connection, and on a condition that checks linkedin_connected). Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
2649
2733
|
linkedinAccountId?: string;
|
|
2650
2734
|
/** linkedin_connection: the invite note (optional, up to 300 chars; sent without it if LinkedIn refuses the note); linkedin_message: the required message (up to 3000 chars); linkedin_inmail: the required message (up to 1900 chars). */
|
|
2651
2735
|
linkedinMessageBody?: string;
|
|
2652
2736
|
/** linkedin_message: what to do when the invite is still pending. */
|
|
2653
2737
|
linkedinMessageMode?: "skip_if_not_connected" | "wait_until_connected";
|
|
2654
|
-
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720)
|
|
2738
|
+
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720); after a connection step this mode is the default in a linear campaign. wait_for_connection: wait 24-2160 hours (1-90 days, default 720) before taking the Not accepted path. */
|
|
2655
2739
|
connectionTimeoutHours?: number;
|
|
2656
2740
|
/** linkedin_like_post only: the reaction to leave (default like). */
|
|
2657
2741
|
likeReaction?: "like" | "celebrate" | "support" | "love" | "insightful" | "funny";
|
|
2658
2742
|
/** linkedin_like_post only: select the newest eligible original post from the last 1-365 days (default 30). */
|
|
2659
2743
|
likeMaxPostAgeDays?: number;
|
|
2744
|
+
/** linkedin_like_post only: before the immediately preceding wait starts, check for eligible posts. If none exist, skip that wait and the like step, keeping following waits. Defaults to false when omitted. */
|
|
2745
|
+
likeSkipPreviousWait?: boolean;
|
|
2660
2746
|
/** linkedin_like_post only: skip consecutive following wait steps whenever the reaction step is skipped (default true). False keeps those waits. */
|
|
2661
2747
|
likeSkipNextWait?: boolean;
|
|
2748
|
+
/** linkedin_like_post only: how many recent posts to react to, 1-3 (default 1). */
|
|
2749
|
+
likeCount?: number;
|
|
2662
2750
|
/** linkedin_inmail only: optional subject, up to 200 characters; merge tokens allowed. Clear with an empty string. */
|
|
2663
2751
|
inmailSubject?: string;
|
|
2664
2752
|
/** linkedin_connection only: withdraw a still-pending invitation sent by this campaign after 168-2160 hours (7-90 days). Omitted means off on creation; null turns it off on edit. */
|
|
2665
2753
|
withdrawAfterHours?: number | null;
|
|
2754
|
+
/** Workflow steps: this step's id, unique in the campaign, which next, yesNext and noNext point at (not "end"). Left out, one is made. */
|
|
2755
|
+
key?: string;
|
|
2756
|
+
/** Workflow steps: where a step that isn't a condition or wait_for_connection goes; left out, the following step: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
2757
|
+
next?: string;
|
|
2758
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the Yes (Accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
2759
|
+
yesNext?: string;
|
|
2760
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the No (Not accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
2761
|
+
noNext?: string;
|
|
2762
|
+
/** condition only, required: linkedin_connected, has_email, opened_last_email (needs an email before it on every path) or field_value. Fixed once the campaign launches. */
|
|
2763
|
+
check?: "linkedin_connected" | "has_email" | "opened_last_email" | "field_value";
|
|
2764
|
+
/** condition with check=field_value: the lead field to check, like "Job Title" or "Source" (the campaign itself changes Status, Last touch and LinkedIn connection). Fixed once the campaign launches. */
|
|
2765
|
+
conditionField?: string;
|
|
2766
|
+
/** condition with check=field_value: is, is_not, contains, is_empty or is_not_empty (all case-insensitive). Fixed once the campaign launches. */
|
|
2767
|
+
conditionOperator?: "is" | "is_not" | "is_empty" | "is_not_empty" | "contains";
|
|
2768
|
+
/** condition with check=field_value and is, is_not or contains: the text to compare with. Editable after launch. */
|
|
2769
|
+
conditionValue?: string;
|
|
2666
2770
|
/** The step's _id from campaigns.get steps[]. */
|
|
2667
2771
|
stepId: string;
|
|
2668
2772
|
/** The step's updatedAt when you read it. If someone saved it since, the edit is refused instead of overwriting theirs. */
|
|
@@ -3235,30 +3339,34 @@ export interface ApiRequests {
|
|
|
3235
3339
|
"browser.session.status": Record<string, unknown>;
|
|
3236
3340
|
/** Stop a Dench Browser session and release the remote browser. — `dench browser session stop` — DELETE /api/v1/browser/sessions/{sessionId} */
|
|
3237
3341
|
"browser.session.stop": Record<string, unknown>;
|
|
3238
|
-
/** Read IDENTITY.md. — `dench identity
|
|
3342
|
+
/** Read IDENTITY.md. — `dench context --sections identity` — GET /api/v1/agent-config/identity */
|
|
3239
3343
|
"agentConfig.identity.show": Record<string, unknown>;
|
|
3240
|
-
/** Update IDENTITY.md. — `dench identity
|
|
3344
|
+
/** Update IDENTITY.md. — `dench context set identity` — PUT /api/v1/agent-config/identity */
|
|
3241
3345
|
"agentConfig.identity.edit": {
|
|
3242
3346
|
content: string;
|
|
3243
3347
|
};
|
|
3244
|
-
/** Read ORGANISATION.md. — `dench organisation
|
|
3348
|
+
/** Read ORGANISATION.md. — `dench context --sections organisation` — GET /api/v1/agent-config/organisation */
|
|
3245
3349
|
"agentConfig.organisation.show": Record<string, unknown>;
|
|
3246
|
-
/** Update ORGANISATION.md. — `dench organisation
|
|
3350
|
+
/** Update ORGANISATION.md. — `dench context set organisation` — PUT /api/v1/agent-config/organisation */
|
|
3247
3351
|
"agentConfig.organisation.edit": {
|
|
3248
3352
|
content: string;
|
|
3249
3353
|
};
|
|
3250
|
-
/** Read USER.md. — `dench user
|
|
3354
|
+
/** Read USER.md. — `dench context --sections user` — GET /api/v1/agent-config/user */
|
|
3251
3355
|
"agentConfig.user.show": Record<string, unknown>;
|
|
3252
|
-
/** Update USER.md. — `dench user
|
|
3356
|
+
/** Update USER.md. — `dench context set user` — PUT /api/v1/agent-config/user */
|
|
3253
3357
|
"agentConfig.user.edit": {
|
|
3254
3358
|
content: string;
|
|
3255
3359
|
};
|
|
3256
|
-
/** Read tool notes. — `dench tools
|
|
3360
|
+
/** Read tool notes. — `dench context --sections tools` — GET /api/v1/agent-config/tools */
|
|
3257
3361
|
"agentConfig.tools.show": Record<string, unknown>;
|
|
3258
|
-
/** Update tool notes. — `dench tools
|
|
3362
|
+
/** Update tool notes. — `dench context set tools` — PUT /api/v1/agent-config/tools */
|
|
3259
3363
|
"agentConfig.tools.edit": {
|
|
3260
3364
|
content: string;
|
|
3261
3365
|
};
|
|
3366
|
+
/** Update standing workspace rules; credentials belong in secrets and runnable setup in environments. — `dench context set rules` — PUT /api/v1/context/rules */
|
|
3367
|
+
"workspace.context.rules.set": {
|
|
3368
|
+
content: string;
|
|
3369
|
+
};
|
|
3262
3370
|
/** Read aggregate memory. — `dench mem show` — GET /api/v1/agent-config/mem */
|
|
3263
3371
|
"agentConfig.mem.show": Record<string, unknown>;
|
|
3264
3372
|
/** Update aggregate memory. — `dench mem set` — PUT /api/v1/agent-config/mem */
|
|
@@ -3347,6 +3455,20 @@ export interface ApiRequests {
|
|
|
3347
3455
|
}
|
|
3348
3456
|
|
|
3349
3457
|
export interface ApiResponses {
|
|
3458
|
+
"environments.list": unknown;
|
|
3459
|
+
"environments.get": unknown;
|
|
3460
|
+
"environments.upload": unknown;
|
|
3461
|
+
"environments.save": unknown;
|
|
3462
|
+
"environments.delete": unknown;
|
|
3463
|
+
"secrets.list": unknown;
|
|
3464
|
+
"secrets.set": {
|
|
3465
|
+
name: string;
|
|
3466
|
+
kind: "env" | "file";
|
|
3467
|
+
version: number;
|
|
3468
|
+
revision: number;
|
|
3469
|
+
status: "stored";
|
|
3470
|
+
};
|
|
3471
|
+
"secrets.delete": unknown;
|
|
3350
3472
|
"campaigns.drafts.create": {
|
|
3351
3473
|
sequenceId: string;
|
|
3352
3474
|
};
|
|
@@ -6037,6 +6159,8 @@ export interface ApiResponses {
|
|
|
6037
6159
|
}[];
|
|
6038
6160
|
dailySendCap?: number;
|
|
6039
6161
|
stepCount: number;
|
|
6162
|
+
/** linear: steps run in order. workflow: steps have keys and paths (next, yesNext, noNext) and may include condition and wait_for_connection. Left out, a workflow stays one and steps with keys, paths or those types make one; nothing turns a workflow back into a list. */
|
|
6163
|
+
stepModel?: "linear" | "workflow";
|
|
6040
6164
|
totalEnrolled: number;
|
|
6041
6165
|
activeCount: number;
|
|
6042
6166
|
pausedCount: number;
|
|
@@ -6086,6 +6210,8 @@ export interface ApiResponses {
|
|
|
6086
6210
|
}[];
|
|
6087
6211
|
dailySendCap?: number;
|
|
6088
6212
|
stepCount: number;
|
|
6213
|
+
/** linear: steps run in order. workflow: steps have keys and paths (next, yesNext, noNext) and may include condition and wait_for_connection. Left out, a workflow stays one and steps with keys, paths or those types make one; nothing turns a workflow back into a list. */
|
|
6214
|
+
stepModel?: "linear" | "workflow";
|
|
6089
6215
|
totalEnrolled: number;
|
|
6090
6216
|
activeCount: number;
|
|
6091
6217
|
pausedCount: number;
|
|
@@ -6100,9 +6226,10 @@ export interface ApiResponses {
|
|
|
6100
6226
|
updatedAt: number;
|
|
6101
6227
|
[key: string]: unknown;
|
|
6102
6228
|
};
|
|
6229
|
+
/** The steps in order, each with its _id. condition and wait_for_connection steps also carry a readable label. */
|
|
6103
6230
|
steps: Array<{
|
|
6104
|
-
/** Step type. */
|
|
6105
|
-
type: "
|
|
6231
|
+
/** Step type. condition (If / else) and wait_for_connection (Wait for them to accept) send nothing; they continue on yesNext or noNext and make the campaign a workflow. */
|
|
6232
|
+
type: "wait" | "email" | "linkedin_connection" | "linkedin_message" | "linkedin_visit" | "linkedin_like_post" | "linkedin_inmail" | "condition" | "wait_for_connection";
|
|
6106
6233
|
/** wait steps: hours to wait before the next step. */
|
|
6107
6234
|
waitHours?: number;
|
|
6108
6235
|
/** Legacy email step sender. Pool campaigns choose senders in emailMailboxAccountIds on the campaign, not on individual steps. */
|
|
@@ -6117,24 +6244,44 @@ export interface ApiResponses {
|
|
|
6117
6244
|
emailReplyToPrevious?: boolean;
|
|
6118
6245
|
/** email and linkedin_like_post only: always (default), connected or not_connected. InMail automatically skips connected people; do not set a condition on it. */
|
|
6119
6246
|
onlyIf?: "always" | "connected" | "not_connected";
|
|
6120
|
-
/** Legacy LinkedIn step sender. Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
6247
|
+
/** Legacy LinkedIn step sender (also on wait_for_connection, and on a condition that checks linkedin_connected). Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
6121
6248
|
linkedinAccountId?: string;
|
|
6122
6249
|
/** linkedin_connection: the invite note (optional, up to 300 chars; sent without it if LinkedIn refuses the note); linkedin_message: the required message (up to 3000 chars); linkedin_inmail: the required message (up to 1900 chars). */
|
|
6123
6250
|
linkedinMessageBody?: string;
|
|
6124
6251
|
/** linkedin_message: what to do when the invite is still pending. */
|
|
6125
6252
|
linkedinMessageMode?: "skip_if_not_connected" | "wait_until_connected";
|
|
6126
|
-
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720)
|
|
6253
|
+
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720); after a connection step this mode is the default in a linear campaign. wait_for_connection: wait 24-2160 hours (1-90 days, default 720) before taking the Not accepted path. */
|
|
6127
6254
|
connectionTimeoutHours?: number;
|
|
6128
6255
|
/** linkedin_like_post only: the reaction to leave (default like). */
|
|
6129
6256
|
likeReaction?: "like" | "celebrate" | "support" | "love" | "insightful" | "funny";
|
|
6130
6257
|
/** linkedin_like_post only: select the newest eligible original post from the last 1-365 days (default 30). */
|
|
6131
6258
|
likeMaxPostAgeDays?: number;
|
|
6259
|
+
/** linkedin_like_post only: before the immediately preceding wait starts, check for eligible posts. If none exist, skip that wait and the like step, keeping following waits. Defaults to false when omitted. */
|
|
6260
|
+
likeSkipPreviousWait?: boolean;
|
|
6132
6261
|
/** linkedin_like_post only: skip consecutive following wait steps whenever the reaction step is skipped (default true). False keeps those waits. */
|
|
6133
6262
|
likeSkipNextWait?: boolean;
|
|
6263
|
+
/** linkedin_like_post only: how many recent posts to react to, 1-3 (default 1). */
|
|
6264
|
+
likeCount?: number;
|
|
6134
6265
|
/** linkedin_inmail only: optional subject, up to 200 characters; merge tokens allowed. Clear with an empty string. */
|
|
6135
6266
|
inmailSubject?: string;
|
|
6136
6267
|
/** linkedin_connection only: withdraw a still-pending invitation sent by this campaign after 168-2160 hours (7-90 days). Omitted means off on creation; null turns it off on edit. */
|
|
6137
6268
|
withdrawAfterHours?: number | null;
|
|
6269
|
+
/** Workflow steps: this step's id, unique in the campaign, which next, yesNext and noNext point at (not "end"). Left out, one is made. */
|
|
6270
|
+
key?: string;
|
|
6271
|
+
/** Workflow steps: where a step that isn't a condition or wait_for_connection goes; left out, the following step: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
6272
|
+
next?: string;
|
|
6273
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the Yes (Accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
6274
|
+
yesNext?: string;
|
|
6275
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the No (Not accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
6276
|
+
noNext?: string;
|
|
6277
|
+
/** condition only, required: linkedin_connected, has_email, opened_last_email (needs an email before it on every path) or field_value. Fixed once the campaign launches. */
|
|
6278
|
+
check?: "linkedin_connected" | "has_email" | "opened_last_email" | "field_value";
|
|
6279
|
+
/** condition with check=field_value: the lead field to check, like "Job Title" or "Source" (the campaign itself changes Status, Last touch and LinkedIn connection). Fixed once the campaign launches. */
|
|
6280
|
+
conditionField?: string;
|
|
6281
|
+
/** condition with check=field_value: is, is_not, contains, is_empty or is_not_empty (all case-insensitive). Fixed once the campaign launches. */
|
|
6282
|
+
conditionOperator?: "is" | "is_not" | "is_empty" | "is_not_empty" | "contains";
|
|
6283
|
+
/** condition with check=field_value and is, is_not or contains: the text to compare with. Editable after launch. */
|
|
6284
|
+
conditionValue?: string;
|
|
6138
6285
|
[key: string]: unknown;
|
|
6139
6286
|
}>;
|
|
6140
6287
|
enrollments: Record<string, unknown>[];
|
|
@@ -6170,6 +6317,14 @@ export interface ApiResponses {
|
|
|
6170
6317
|
replyRate: number;
|
|
6171
6318
|
openRate: number;
|
|
6172
6319
|
clickRate: number;
|
|
6320
|
+
/** Workflows only: each condition and wait_for_connection step, in step order, with how many people took each path. */
|
|
6321
|
+
branchStats?: {
|
|
6322
|
+
stepId: string;
|
|
6323
|
+
/** People who took the Yes (Accepted) path. */
|
|
6324
|
+
yes: number;
|
|
6325
|
+
/** People who took the No (Not accepted) path. */
|
|
6326
|
+
no: number;
|
|
6327
|
+
}[];
|
|
6173
6328
|
truncated: boolean;
|
|
6174
6329
|
[key: string]: unknown;
|
|
6175
6330
|
};
|
|
@@ -6182,7 +6337,15 @@ export interface ApiResponses {
|
|
|
6182
6337
|
dailySendCap: number | null;
|
|
6183
6338
|
nextEmailAt: number | null;
|
|
6184
6339
|
now: Record<string, unknown> | null;
|
|
6185
|
-
next:
|
|
6340
|
+
next: {
|
|
6341
|
+
/** profile, visit, invite, message, like, inmail, withdraw, email, wait or check (an If / else). */
|
|
6342
|
+
kind: string;
|
|
6343
|
+
/** Waiting for them to accept: when the wait ends either way. */
|
|
6344
|
+
acceptanceDeadline?: number;
|
|
6345
|
+
/** kind check: what the If / else checks, e.g. "Has an email address". */
|
|
6346
|
+
label?: string;
|
|
6347
|
+
[key: string]: unknown;
|
|
6348
|
+
} | null;
|
|
6186
6349
|
paused: Record<string, unknown> | null;
|
|
6187
6350
|
senders: Record<string, unknown>[];
|
|
6188
6351
|
[key: string]: unknown;
|
|
@@ -6458,8 +6621,8 @@ export interface ApiResponses {
|
|
|
6458
6621
|
sequence: Record<string, unknown> | null;
|
|
6459
6622
|
/** The campaign's steps in order, each with its _id. */
|
|
6460
6623
|
steps: Array<{
|
|
6461
|
-
/** Step type. */
|
|
6462
|
-
type: "
|
|
6624
|
+
/** Step type. condition (If / else) and wait_for_connection (Wait for them to accept) send nothing; they continue on yesNext or noNext and make the campaign a workflow. */
|
|
6625
|
+
type: "wait" | "email" | "linkedin_connection" | "linkedin_message" | "linkedin_visit" | "linkedin_like_post" | "linkedin_inmail" | "condition" | "wait_for_connection";
|
|
6463
6626
|
/** wait steps: hours to wait before the next step. */
|
|
6464
6627
|
waitHours?: number;
|
|
6465
6628
|
/** Legacy email step sender. Pool campaigns choose senders in emailMailboxAccountIds on the campaign, not on individual steps. */
|
|
@@ -6474,24 +6637,44 @@ export interface ApiResponses {
|
|
|
6474
6637
|
emailReplyToPrevious?: boolean;
|
|
6475
6638
|
/** email and linkedin_like_post only: always (default), connected or not_connected. InMail automatically skips connected people; do not set a condition on it. */
|
|
6476
6639
|
onlyIf?: "always" | "connected" | "not_connected";
|
|
6477
|
-
/** Legacy LinkedIn step sender. Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
6640
|
+
/** Legacy LinkedIn step sender (also on wait_for_connection, and on a condition that checks linkedin_connected). Pool campaigns use the campaign's linkedinAccountIds instead. */
|
|
6478
6641
|
linkedinAccountId?: string;
|
|
6479
6642
|
/** linkedin_connection: the invite note (optional, up to 300 chars; sent without it if LinkedIn refuses the note); linkedin_message: the required message (up to 3000 chars); linkedin_inmail: the required message (up to 1900 chars). */
|
|
6480
6643
|
linkedinMessageBody?: string;
|
|
6481
6644
|
/** linkedin_message: what to do when the invite is still pending. */
|
|
6482
6645
|
linkedinMessageMode?: "skip_if_not_connected" | "wait_until_connected";
|
|
6483
|
-
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720)
|
|
6646
|
+
/** linkedin_message with linkedinMessageMode=wait_until_connected: wait 1-2160 hours for acceptance (default 720); after a connection step this mode is the default in a linear campaign. wait_for_connection: wait 24-2160 hours (1-90 days, default 720) before taking the Not accepted path. */
|
|
6484
6647
|
connectionTimeoutHours?: number;
|
|
6485
6648
|
/** linkedin_like_post only: the reaction to leave (default like). */
|
|
6486
6649
|
likeReaction?: "like" | "celebrate" | "support" | "love" | "insightful" | "funny";
|
|
6487
6650
|
/** linkedin_like_post only: select the newest eligible original post from the last 1-365 days (default 30). */
|
|
6488
6651
|
likeMaxPostAgeDays?: number;
|
|
6652
|
+
/** linkedin_like_post only: before the immediately preceding wait starts, check for eligible posts. If none exist, skip that wait and the like step, keeping following waits. Defaults to false when omitted. */
|
|
6653
|
+
likeSkipPreviousWait?: boolean;
|
|
6489
6654
|
/** linkedin_like_post only: skip consecutive following wait steps whenever the reaction step is skipped (default true). False keeps those waits. */
|
|
6490
6655
|
likeSkipNextWait?: boolean;
|
|
6656
|
+
/** linkedin_like_post only: how many recent posts to react to, 1-3 (default 1). */
|
|
6657
|
+
likeCount?: number;
|
|
6491
6658
|
/** linkedin_inmail only: optional subject, up to 200 characters; merge tokens allowed. Clear with an empty string. */
|
|
6492
6659
|
inmailSubject?: string;
|
|
6493
6660
|
/** linkedin_connection only: withdraw a still-pending invitation sent by this campaign after 168-2160 hours (7-90 days). Omitted means off on creation; null turns it off on edit. */
|
|
6494
6661
|
withdrawAfterHours?: number | null;
|
|
6662
|
+
/** Workflow steps: this step's id, unique in the campaign, which next, yesNext and noNext point at (not "end"). Left out, one is made. */
|
|
6663
|
+
key?: string;
|
|
6664
|
+
/** Workflow steps: where a step that isn't a condition or wait_for_connection goes; left out, the following step: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
6665
|
+
next?: string;
|
|
6666
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the Yes (Accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
6667
|
+
yesNext?: string;
|
|
6668
|
+
/** Workflow steps: condition and wait_for_connection only, required: where the No (Not accepted) path goes: another step's key, or "end" to stop there. Fixed once the campaign launches. */
|
|
6669
|
+
noNext?: string;
|
|
6670
|
+
/** condition only, required: linkedin_connected, has_email, opened_last_email (needs an email before it on every path) or field_value. Fixed once the campaign launches. */
|
|
6671
|
+
check?: "linkedin_connected" | "has_email" | "opened_last_email" | "field_value";
|
|
6672
|
+
/** condition with check=field_value: the lead field to check, like "Job Title" or "Source" (the campaign itself changes Status, Last touch and LinkedIn connection). Fixed once the campaign launches. */
|
|
6673
|
+
conditionField?: string;
|
|
6674
|
+
/** condition with check=field_value: is, is_not, contains, is_empty or is_not_empty (all case-insensitive). Fixed once the campaign launches. */
|
|
6675
|
+
conditionOperator?: "is" | "is_not" | "is_empty" | "is_not_empty" | "contains";
|
|
6676
|
+
/** condition with check=field_value and is, is_not or contains: the text to compare with. Editable after launch. */
|
|
6677
|
+
conditionValue?: string;
|
|
6495
6678
|
[key: string]: unknown;
|
|
6496
6679
|
}>;
|
|
6497
6680
|
/** One run for each step the person has reached, in order. */
|
|
@@ -6501,8 +6684,8 @@ export interface ApiResponses {
|
|
|
6501
6684
|
stepId: string;
|
|
6502
6685
|
/** The step's place, from 0. */
|
|
6503
6686
|
stepIndex: number;
|
|
6504
|
-
/** Step type. */
|
|
6505
|
-
type: "
|
|
6687
|
+
/** Step type. condition (If / else) and wait_for_connection (Wait for them to accept) send nothing; they continue on yesNext or noNext and make the campaign a workflow. */
|
|
6688
|
+
type: "wait" | "email" | "linkedin_connection" | "linkedin_message" | "linkedin_visit" | "linkedin_like_post" | "linkedin_inmail" | "condition" | "wait_for_connection";
|
|
6506
6689
|
/** sent: done (a wait that finished is sent too). skipped: see result.reason. retry: will be tried again at retryAt. unknown: needs a look. */
|
|
6507
6690
|
status: "queued" | "running" | "waiting" | "retry" | "sent" | "skipped" | "failed" | "unknown";
|
|
6508
6691
|
scheduledAt?: number;
|
|
@@ -6513,7 +6696,9 @@ export interface ApiResponses {
|
|
|
6513
6696
|
/** The email this run sent, in emailMessages[]. */
|
|
6514
6697
|
emailMessageId?: string;
|
|
6515
6698
|
lastError?: string;
|
|
6516
|
-
/**
|
|
6699
|
+
/** wait_for_connection: when it stops waiting for the accept. */
|
|
6700
|
+
timeoutAt?: number;
|
|
6701
|
+
/** For a skipped step, { reason } says why. A finished condition or wait_for_connection has { branch: "yes" | "no" } (Yes / Accepted or No / Not accepted), and { reason } for some No paths. */
|
|
6517
6702
|
result?: unknown;
|
|
6518
6703
|
[key: string]: unknown;
|
|
6519
6704
|
}>;
|
|
@@ -7255,6 +7440,7 @@ export interface ApiResponses {
|
|
|
7255
7440
|
template?: string;
|
|
7256
7441
|
};
|
|
7257
7442
|
};
|
|
7443
|
+
"workspace.context.rules.set": unknown;
|
|
7258
7444
|
"agentConfig.mem.show": {
|
|
7259
7445
|
agentConfig: {
|
|
7260
7446
|
identity: {
|
|
@@ -7566,9 +7752,9 @@ export type DenchApiTree = {
|
|
|
7566
7752
|
today(args?: Req<"agentConfig.daily.today">): Promise<Res<"agentConfig.daily.today">>;
|
|
7567
7753
|
};
|
|
7568
7754
|
identity: {
|
|
7569
|
-
/** Update IDENTITY.md. (`dench identity
|
|
7755
|
+
/** Update IDENTITY.md. (`dench context set identity`) */
|
|
7570
7756
|
edit(args: Req<"agentConfig.identity.edit">): Promise<Res<"agentConfig.identity.edit">>;
|
|
7571
|
-
/** Read IDENTITY.md. (`dench identity
|
|
7757
|
+
/** Read IDENTITY.md. (`dench context --sections identity`) */
|
|
7572
7758
|
show(args?: Req<"agentConfig.identity.show">): Promise<Res<"agentConfig.identity.show">>;
|
|
7573
7759
|
};
|
|
7574
7760
|
mem: {
|
|
@@ -7584,21 +7770,21 @@ export type DenchApiTree = {
|
|
|
7584
7770
|
thread(args: Req<"agentConfig.model.thread">): Promise<Res<"agentConfig.model.thread">>;
|
|
7585
7771
|
};
|
|
7586
7772
|
organisation: {
|
|
7587
|
-
/** Update ORGANISATION.md. (`dench organisation
|
|
7773
|
+
/** Update ORGANISATION.md. (`dench context set organisation`) */
|
|
7588
7774
|
edit(args: Req<"agentConfig.organisation.edit">): Promise<Res<"agentConfig.organisation.edit">>;
|
|
7589
|
-
/** Read ORGANISATION.md. (`dench organisation
|
|
7775
|
+
/** Read ORGANISATION.md. (`dench context --sections organisation`) */
|
|
7590
7776
|
show(args?: Req<"agentConfig.organisation.show">): Promise<Res<"agentConfig.organisation.show">>;
|
|
7591
7777
|
};
|
|
7592
7778
|
tools: {
|
|
7593
|
-
/** Update tool notes. (`dench tools
|
|
7779
|
+
/** Update tool notes. (`dench context set tools`) */
|
|
7594
7780
|
edit(args: Req<"agentConfig.tools.edit">): Promise<Res<"agentConfig.tools.edit">>;
|
|
7595
|
-
/** Read tool notes. (`dench tools
|
|
7781
|
+
/** Read tool notes. (`dench context --sections tools`) */
|
|
7596
7782
|
show(args?: Req<"agentConfig.tools.show">): Promise<Res<"agentConfig.tools.show">>;
|
|
7597
7783
|
};
|
|
7598
7784
|
user: {
|
|
7599
|
-
/** Update USER.md. (`dench user
|
|
7785
|
+
/** Update USER.md. (`dench context set user`) */
|
|
7600
7786
|
edit(args: Req<"agentConfig.user.edit">): Promise<Res<"agentConfig.user.edit">>;
|
|
7601
|
-
/** Read USER.md. (`dench user
|
|
7787
|
+
/** Read USER.md. (`dench context --sections user`) */
|
|
7602
7788
|
show(args?: Req<"agentConfig.user.show">): Promise<Res<"agentConfig.user.show">>;
|
|
7603
7789
|
};
|
|
7604
7790
|
};
|
|
@@ -7679,7 +7865,7 @@ export type DenchApiTree = {
|
|
|
7679
7865
|
/** Discover LinkedIn sender ids, labels, availability and remaining capacity visible to the acting workspace member. Never returns provider credentials. (`dench campaign accounts`) */
|
|
7680
7866
|
linkedin(args?: Req<"campaigns.accounts.linkedin">): Promise<Res<"campaigns.accounts.linkedin">>;
|
|
7681
7867
|
};
|
|
7682
|
-
/** Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks. (`dench campaign get`) */
|
|
7868
|
+
/** Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks, and for a workflow how many people took each If / else and Wait for them to accept path (branchStats). (`dench campaign get`) */
|
|
7683
7869
|
analytics(args: Req<"campaigns.analytics">): Promise<Res<"campaigns.analytics">>;
|
|
7684
7870
|
/** Archive a campaign and stop everyone still in flight. This is the app's Delete: campaigns are never erased, and their people, leads and activity stay. (`dench campaign archive`) */
|
|
7685
7871
|
archive(args: Req<"campaigns.archive">): Promise<Res<"campaigns.archive">>;
|
|
@@ -7793,9 +7979,9 @@ export type DenchApiTree = {
|
|
|
7793
7979
|
update(args: Req<"campaigns.sources.update">): Promise<Res<"campaigns.sources.update">>;
|
|
7794
7980
|
};
|
|
7795
7981
|
steps: {
|
|
7796
|
-
/** Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail). Steps are checked first: a field the step type would drop, missing text
|
|
7982
|
+
/** Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail, If / else, Wait for them to accept). A workflow (stepModel workflow, or steps with key, next, yesNext or noNext) branches: condition and wait_for_connection steps continue on yesNext or noNext, other steps on next; each points at another step's key or end. Steps are checked first: a field the step type would drop, missing text, {TOKEN} single braces or paths that don't hold together are rejected, not saved. Configure sender pools on the campaign; step sender ids are legacy-only. (`dench campaign steps set`) */
|
|
7797
7983
|
replace(args: Req<"campaigns.steps.replace">): Promise<Res<"campaigns.steps.replace">>;
|
|
7798
|
-
/** Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace. (`dench campaign steps edit`) */
|
|
7984
|
+
/** Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. A workflow keeps its paths and what each If / else checks (key, next, yesNext, noNext, check, conditionField, conditionOperator); conditionValue and acceptance waits stay editable. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace. (`dench campaign steps edit`) */
|
|
7799
7985
|
update(args: Req<"campaigns.steps.update">): Promise<Res<"campaigns.steps.update">>;
|
|
7800
7986
|
};
|
|
7801
7987
|
/** Change a campaign's name, sender pools, send windows, daily email cap, stop-on-reply, start or end. Works until archived; existing conversations keep their assigned sender. (`dench campaign set`) */
|
|
@@ -8362,6 +8548,18 @@ export type DenchApiTree = {
|
|
|
8362
8548
|
preview(args: Req<"enrichment.search.preview">): Promise<Res<"enrichment.search.preview">>;
|
|
8363
8549
|
};
|
|
8364
8550
|
};
|
|
8551
|
+
environments: {
|
|
8552
|
+
/** Retire a saved setup from new selection; retain immutable revisions and active job evidence. (`dench env delete`) */
|
|
8553
|
+
delete(args: Req<"environments.delete">): Promise<Res<"environments.delete">>;
|
|
8554
|
+
/** Inspect a saved setup, its manifest, and an optional immutable revision. (`dench env show`) */
|
|
8555
|
+
get(args: Req<"environments.get">): Promise<Res<"environments.get">>;
|
|
8556
|
+
/** List workspace-shared reusable setups and ready revisions (metadata only). (`dench env list`) */
|
|
8557
|
+
list(args?: Req<"environments.list">): Promise<Res<"environments.list">>;
|
|
8558
|
+
/** Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task. (`dench env save`) */
|
|
8559
|
+
save(args: Req<"environments.save">): Promise<Res<"environments.save">>;
|
|
8560
|
+
/** Reserve an owner-bound source upload. Prefix the uploaded bytes with the returned proof before saving. (`dench env save`) */
|
|
8561
|
+
upload(args: Req<"environments.upload">): Promise<Res<"environments.upload">>;
|
|
8562
|
+
};
|
|
8365
8563
|
files: {
|
|
8366
8564
|
/** Read a workspace file's text. (`dench files cat`) */
|
|
8367
8565
|
content(args?: Req<"files.content">): Promise<Res<"files.content">>;
|
|
@@ -8506,6 +8704,14 @@ export type DenchApiTree = {
|
|
|
8506
8704
|
/** Search the web through the Dench gateway. (`dench search`) */
|
|
8507
8705
|
web(args: Req<"search.web">): Promise<Res<"search.web">>;
|
|
8508
8706
|
};
|
|
8707
|
+
secrets: {
|
|
8708
|
+
/** Revoke a workspace credential for future resolution, optionally checking its version. (`dench secrets delete`) */
|
|
8709
|
+
delete(args: Req<"secrets.delete">): Promise<Res<"secrets.delete">>;
|
|
8710
|
+
/** List workspace-shared credential names, kinds and versions; never values. (`dench secrets list`) */
|
|
8711
|
+
list(args?: Req<"secrets.list">): Promise<Res<"secrets.list">>;
|
|
8712
|
+
/** Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts. (`dench secrets set`) */
|
|
8713
|
+
set(args: Req<"secrets.set">): Promise<Res<"secrets.set">>;
|
|
8714
|
+
};
|
|
8509
8715
|
settings: {
|
|
8510
8716
|
sync: {
|
|
8511
8717
|
/** Read the workspace's Sync switches (accounts from email, contacts from LinkedIn, Slack Connect, calendar, dossier, tasks from email, lead auto-qualify, summaries and Brief). All on by default. (`dench settings sync`) */
|
|
@@ -8575,6 +8781,10 @@ export type DenchApiTree = {
|
|
|
8575
8781
|
/** Return the current Dench workspace context for the bearer. (`dench context`) */
|
|
8576
8782
|
(args?: Req<"workspace.context">): Promise<Res<"workspace.context">>;
|
|
8577
8783
|
$call(args?: Req<"workspace.context">): Promise<Res<"workspace.context">>;
|
|
8784
|
+
rules: {
|
|
8785
|
+
/** Update standing workspace rules; credentials belong in secrets and runnable setup in environments. (`dench context set rules`) */
|
|
8786
|
+
set(args: Req<"workspace.context.rules.set">): Promise<Res<"workspace.context.rules.set">>;
|
|
8787
|
+
};
|
|
8578
8788
|
/** Read selected scoped workspace documents and a compact context index without writes. (`dench context --sections`) */
|
|
8579
8789
|
sections(args?: Req<"workspace.context.sections">): Promise<Res<"workspace.context.sections">>;
|
|
8580
8790
|
};
|