@audienti/cli 0.1.11 → 0.1.17

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/CHANGELOG.md CHANGED
@@ -4,12 +4,62 @@ All notable changes to the Audienti CLI are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.1.17] - 2026-07-17
8
+
9
+ ### Added
10
+
11
+ - Add `audienti dnc list/add/import/remove` for account DNC settings.
12
+ - Add `audienti company-rules list/create/update/remove/apply` for account-wide and user-scoped company disposition policies.
13
+
14
+ ## [0.1.16] - 2026-07-17
15
+
16
+ ### Added
17
+
18
+ - Add direct prospect emergency state commands: `audienti prospects set-status`, `audienti prospects lock`, and `audienti prospects unlock`.
19
+
20
+ ## [0.1.15] - 2026-07-16
21
+
22
+ ### Added
23
+
24
+ - Add `audienti prospects check` for listing people missing certified company employment citations, with direct app URLs for operator review.
25
+ - Add `audienti motions run-discovery` for queuing immediate discovery through the API launch gate.
26
+ - Add `audienti analytics dashboard` for CLI access to campaign cohort counts, including distinct company targets filtered by play tag, motion, offer, ICP, or user.
27
+
28
+ ## [0.1.14] - 2026-07-16
29
+
30
+ ### Added
31
+
32
+ - Add `audienti update check` for comparing the local CLI version to the latest published `@audienti/cli` package.
33
+
34
+ ## [0.1.13] - 2026-07-16
35
+
36
+ ### Added
37
+
38
+ - Add ICP tags to `audienti icps list/create/update` and add `audienti icps add-tag/remove-tag`.
39
+ - Include ICP usage in `audienti tags list` and `audienti tags show <tag>`.
40
+ - Add `audienti icps show <icp_id>` for single ICP inspection.
41
+ - Add full offer CLI/API CRUD with `audienti offers show/update/delete`.
42
+ - Add `audienti prospects reject`, `audienti prospects nurture`, and `audienti prospects restore` through the shared prospect disposition paths.
43
+
44
+ ## [0.1.12] - 2026-07-16
45
+
46
+ ### Added
47
+
48
+ - Add `audienti motions add-tag/remove-tag` and `audienti lists add-tag/remove-tag` for managing play and list tags through the CLI/API contract.
49
+ - Allow tags to be sent during list create/update and motion create/update payloads.
50
+ - Add `audienti tags list` to show normalized list and motion tags currently in use.
51
+ - Add `audienti tags show <tag>` plus `--tag` filters for list and motion listing commands.
52
+
7
53
  ## [0.1.11] - 2026-07-15
8
54
 
9
55
  ### Added
10
56
 
11
57
  - Add `audienti users select <account_user_id|email|name|me>` to save a default account user for CLI commands that accept `me` or default to the current operator.
12
58
 
59
+ ### Changed
60
+
61
+ - Restrict inbound motion creation to the executable LinkedIn and Reddit channels and reject undeployed channel names.
62
+
13
63
  ## [0.1.10] - 2026-07-15
14
64
 
15
65
  ### Added
package/README.md CHANGED
@@ -57,23 +57,38 @@ creating, changing, or deleting data.
57
57
  Common inspection commands:
58
58
 
59
59
  ```bash
60
+ audienti update check
60
61
  audienti operator next --plan
61
62
  audienti writer test-run <prsp_id>
62
63
  audienti motions analytics <motn_id>
64
+ audienti motions run-discovery <motn_id>
63
65
  audienti motions update <motn_id> --status paused
64
66
  audienti motions activate <motn_id>
65
67
  audienti motions delete <motn_id> --confirm yes
66
68
  audienti prospects show <prsp_id> --json
67
69
  audienti prospects list --profiles
68
70
  audienti prospects list --assigned-user unassigned
71
+ audienti prospects check --all --csv
69
72
  audienti prospects assign <prsp_id> --assigned-user me
73
+ audienti prospects set-status <prsp_id> --status not_fit
74
+ audienti prospects lock <prsp_id> --note "Emergency hold"
75
+ audienti dnc list
76
+ audienti company-rules list
70
77
  audienti users activity --window 7d
71
78
  audienti analytics prospects --window 24h
79
+ audienti analytics dashboard --play-tag wine_campaign
72
80
  audienti analytics users --user me --window 30d
73
81
  audienti analytics visibility --window 24h --user me
74
82
  audienti analytics content --window week
75
83
  ```
76
84
 
85
+ To let an agent or operator check whether the local CLI is behind the latest
86
+ published package:
87
+
88
+ ```bash
89
+ audienti update check --json
90
+ ```
91
+
77
92
  To work the supported prospect operator queue from the CLI, inspect the next move
78
93
  and record the outcome against that same row:
79
94
 
@@ -102,6 +117,20 @@ produced-day cohort currently sits in the funnel:
102
117
  audienti motions analytics <motn_id>
103
118
  ```
104
119
 
120
+ To count the people and distinct companies currently targeted by one campaign
121
+ tag without waiting on the web dashboard filter:
122
+
123
+ ```bash
124
+ audienti analytics dashboard --play-tag wine_campaign --cohort-start 2026-07-01 --cohort-end 2026-07-07
125
+ ```
126
+
127
+ To queue an immediate discovery run for a motion through the same launch gate
128
+ used by the operator surface:
129
+
130
+ ```bash
131
+ audienti motions run-discovery <motn_id>
132
+ ```
133
+
105
134
  To audit one account user's outbound actions, optionally narrowed to one motion
106
135
  and one AccountProspect.created_at cohort:
107
136
 
@@ -145,6 +174,25 @@ audienti prospects assign <prsp_id> --assigned-user <account_user_id|me>
145
174
  audienti prospects assign <prsp_id> --assigned-user unassign
146
175
  ```
147
176
 
177
+ To make emergency prospect state changes without going through a motion:
178
+
179
+ ```bash
180
+ audienti prospects set-status <prsp_id> --status nurture
181
+ audienti prospects set-status <prsp_id> --status not_fit
182
+ audienti prospects lock <prsp_id> --note "Emergency hold"
183
+ audienti prospects unlock <prsp_id>
184
+ ```
185
+
186
+ To manage account DNC and company disposition rules from the CLI:
187
+
188
+ ```bash
189
+ audienti dnc add prospect@example.com
190
+ audienti dnc import --file dnc.txt
191
+ audienti company-rules create --linkedin-url https://www.linkedin.com/company/example --disposition monitor
192
+ audienti company-rules create --domain example.com --disposition not_fit --user me
193
+ audienti company-rules apply --all
194
+ ```
195
+
148
196
  To import multiple LinkedIn people through the same per-prospect import path:
149
197
 
150
198
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audienti/cli",
3
- "version": "0.1.11",
3
+ "version": "0.1.17",
4
4
  "description": "Agent-first command-line client for Audienti.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -53,6 +53,9 @@ audienti help agent-workflows
53
53
  audienti prospects list --query "name or company" --wide --json
54
54
  audienti prospects list --assigned-user unassigned --json
55
55
  audienti prospects assign <prsp_id> --assigned-user me --json
56
+ audienti prospects set-status <prsp_id> --status not_fit --json
57
+ audienti prospects lock <prsp_id> --note "Emergency hold" --json
58
+ audienti prospects unlock <prsp_id> --json
56
59
  audienti users activity me --window 7d --json
57
60
  audienti prospects import-batch --file prospects.csv --motion <motn_id> --assigned-user me --json
58
61
  audienti lists create --name "Target list" --json
package/src/api-client.js CHANGED
@@ -51,6 +51,10 @@ export class AudientiClient {
51
51
  return this.requestJson(accountPath(accountId, ["offers"]));
52
52
  }
53
53
 
54
+ offer(accountId, offerId) {
55
+ return this.requestJson(accountPath(accountId, ["offers", offerId]));
56
+ }
57
+
54
58
  createOffer(accountId, body) {
55
59
  return this.requestJson(accountPath(accountId, ["offers"]), {
56
60
  method: "POST",
@@ -58,10 +62,27 @@ export class AudientiClient {
58
62
  });
59
63
  }
60
64
 
65
+ updateOffer(accountId, offerId, body) {
66
+ return this.requestJson(accountPath(accountId, ["offers", offerId]), {
67
+ method: "PATCH",
68
+ body
69
+ });
70
+ }
71
+
72
+ deleteOffer(accountId, offerId) {
73
+ return this.requestJson(accountPath(accountId, ["offers", offerId]), {
74
+ method: "DELETE"
75
+ });
76
+ }
77
+
61
78
  icps(accountId) {
62
79
  return this.requestJson(accountPath(accountId, ["icps"]));
63
80
  }
64
81
 
82
+ icp(accountId, icpId) {
83
+ return this.requestJson(accountPath(accountId, ["icps", icpId]));
84
+ }
85
+
65
86
  createIcp(accountId, body) {
66
87
  return this.requestJson(accountPath(accountId, ["icps"]), {
67
88
  method: "POST",
@@ -69,10 +90,95 @@ export class AudientiClient {
69
90
  });
70
91
  }
71
92
 
93
+ updateIcp(accountId, icpId, body) {
94
+ return this.requestJson(accountPath(accountId, ["icps", icpId]), {
95
+ method: "PATCH",
96
+ body
97
+ });
98
+ }
99
+
100
+ addIcpTag(accountId, icpId, body) {
101
+ return this.requestJson(accountPath(accountId, ["icps", icpId, "add_tag"]), {
102
+ method: "POST",
103
+ body
104
+ });
105
+ }
106
+
107
+ removeIcpTag(accountId, icpId, body) {
108
+ return this.requestJson(accountPath(accountId, ["icps", icpId, "remove_tag"]), {
109
+ method: "DELETE",
110
+ body
111
+ });
112
+ }
113
+
72
114
  companies(accountId, query = {}) {
73
115
  return this.requestJson(accountPath(accountId, ["companies"], query));
74
116
  }
75
117
 
118
+ dncEntries(accountId, query = {}) {
119
+ return this.requestJson(accountPath(accountId, ["dnc"], query));
120
+ }
121
+
122
+ createDncEntry(accountId, body) {
123
+ return this.requestJson(accountPath(accountId, ["dnc"]), {
124
+ method: "POST",
125
+ body
126
+ });
127
+ }
128
+
129
+ importDncEntries(accountId, body) {
130
+ return this.requestJson(accountPath(accountId, ["dnc", "import"]), {
131
+ method: "POST",
132
+ body
133
+ });
134
+ }
135
+
136
+ deleteDncEntry(accountId, entryId) {
137
+ return this.requestJson(accountPath(accountId, ["dnc", entryId]), {
138
+ method: "DELETE"
139
+ });
140
+ }
141
+
142
+ companyRules(accountId) {
143
+ return this.requestJson(accountPath(accountId, ["company_rules"]));
144
+ }
145
+
146
+ createCompanyRule(accountId, body) {
147
+ return this.requestJson(accountPath(accountId, ["company_rules"]), {
148
+ method: "POST",
149
+ body
150
+ });
151
+ }
152
+
153
+ updateCompanyRule(accountId, ruleId, body) {
154
+ return this.requestJson(accountPath(accountId, ["company_rules", ruleId]), {
155
+ method: "PATCH",
156
+ body
157
+ });
158
+ }
159
+
160
+ deleteCompanyRule(accountId, ruleId) {
161
+ return this.requestJson(accountPath(accountId, ["company_rules", ruleId]), {
162
+ method: "DELETE"
163
+ });
164
+ }
165
+
166
+ applyCompanyRule(accountId, ruleId) {
167
+ return this.requestJson(accountPath(accountId, ["company_rules", ruleId, "apply"]), {
168
+ method: "POST"
169
+ });
170
+ }
171
+
172
+ applyAllCompanyRules(accountId) {
173
+ return this.requestJson(accountPath(accountId, ["company_rules", "apply_all"]), {
174
+ method: "POST"
175
+ });
176
+ }
177
+
178
+ tags(accountId) {
179
+ return this.requestJson(accountPath(accountId, ["tags"]));
180
+ }
181
+
76
182
  lists(accountId) {
77
183
  return this.requestJson(accountPath(accountId, ["lists"]));
78
184
  }
@@ -95,6 +201,20 @@ export class AudientiClient {
95
201
  });
96
202
  }
97
203
 
204
+ addListTag(accountId, listId, body) {
205
+ return this.requestJson(accountPath(accountId, ["lists", listId, "add_tag"]), {
206
+ method: "POST",
207
+ body
208
+ });
209
+ }
210
+
211
+ removeListTag(accountId, listId, body) {
212
+ return this.requestJson(accountPath(accountId, ["lists", listId, "remove_tag"]), {
213
+ method: "DELETE",
214
+ body
215
+ });
216
+ }
217
+
98
218
  deleteList(accountId, listId) {
99
219
  return this.requestJson(accountPath(accountId, ["lists", listId]), {
100
220
  method: "DELETE"
@@ -141,6 +261,20 @@ export class AudientiClient {
141
261
  });
142
262
  }
143
263
 
264
+ addMotionTag(accountId, motionId, body) {
265
+ return this.requestJson(accountPath(accountId, ["motions", motionId, "add_tag"]), {
266
+ method: "POST",
267
+ body
268
+ });
269
+ }
270
+
271
+ removeMotionTag(accountId, motionId, body) {
272
+ return this.requestJson(accountPath(accountId, ["motions", motionId, "remove_tag"]), {
273
+ method: "DELETE",
274
+ body
275
+ });
276
+ }
277
+
144
278
  deleteMotion(accountId, motionId) {
145
279
  return this.requestJson(accountPath(accountId, ["motions", motionId]), {
146
280
  method: "DELETE"
@@ -165,6 +299,13 @@ export class AudientiClient {
165
299
  return this.requestJson(accountPath(accountId, ["motions", motionId, "status"]));
166
300
  }
167
301
 
302
+ runMotionDiscovery(accountId, motionId, body = {}) {
303
+ return this.requestJson(accountPath(accountId, ["motions", motionId, "run_discovery"]), {
304
+ method: "POST",
305
+ body
306
+ });
307
+ }
308
+
168
309
  motionProspects(accountId, motionId, query = {}) {
169
310
  return this.requestJson(accountPath(accountId, ["motions", motionId, "prospects"], query));
170
311
  }
@@ -206,6 +347,38 @@ export class AudientiClient {
206
347
  });
207
348
  }
208
349
 
350
+ rejectProspect(accountId, prospectId) {
351
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "reject"]), {
352
+ method: "POST"
353
+ });
354
+ }
355
+
356
+ nurtureProspect(accountId, prospectId, body = {}) {
357
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "nurture"]), {
358
+ method: "POST",
359
+ body
360
+ });
361
+ }
362
+
363
+ restoreProspect(accountId, prospectId) {
364
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "restore"]), {
365
+ method: "POST"
366
+ });
367
+ }
368
+
369
+ lockProspect(accountId, prospectId, body = {}) {
370
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "lock"]), {
371
+ method: "POST",
372
+ body
373
+ });
374
+ }
375
+
376
+ unlockProspect(accountId, prospectId) {
377
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "unlock"]), {
378
+ method: "POST"
379
+ });
380
+ }
381
+
209
382
  prospectSequencePreview(accountId, prospectId, body = {}) {
210
383
  return this.requestJson(accountPath(accountId, ["prospects", prospectId, "sequence_preview"]), {
211
384
  method: "POST",
@@ -283,6 +456,10 @@ export class AudientiClient {
283
456
  return this.requestJson(accountPath(accountId, ["analytics", "content"], query));
284
457
  }
285
458
 
459
+ analyticsDashboard(accountId, query = {}) {
460
+ return this.requestJson(accountPath(accountId, ["analytics", "dashboard"], query));
461
+ }
462
+
286
463
  async requestJson(path, { method = "GET", body } = {}) {
287
464
  const response = await this.fetchImpl(new URL(path, `${this.host}/`), {
288
465
  method,