@audienti/cli 0.1.4 → 0.1.5

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,6 +4,22 @@ All notable changes to the Audienti CLI are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.1.5] - 2026-07-11
8
+
9
+ ### Added
10
+
11
+ - Add the `https://cli.audienti.com/install` curl installer backed by the public CLI mirror and npm package.
12
+ - Add `audienti operator next --done|--skip|--fail|--return` shortcuts for recording the current prospect next-move outcome without hand-building a payload file.
13
+ - Add `audienti prospects add-profile` and `audienti prospects report-bad-profile` for updating prospect profile channels through the same server paths used by the prospect show page.
14
+
15
+ ### Changed
16
+
17
+ - Send fingerprinted `operator next` outcome shortcuts through the server-derived row contract so queue-row semantics stay on the API side.
18
+
19
+ ### Fixed
20
+
21
+ - Reject `audienti operator next --note` and `--occurred-at` unless an outcome flag is present.
22
+
7
23
  ## [0.1.4] - 2026-07-11
8
24
 
9
25
  ### Added
package/README.md CHANGED
@@ -8,6 +8,13 @@ manage plays, import prospects, build lists, and work supported operator flows.
8
8
 
9
9
  Requires Node.js 20 or newer.
10
10
 
11
+ ```bash
12
+ curl -fsSL https://cli.audienti.com/install | bash
13
+ audienti --help
14
+ ```
15
+
16
+ Or install directly through npm:
17
+
11
18
  ```bash
12
19
  npm install --global @audienti/cli
13
20
  audienti --help
@@ -45,11 +52,31 @@ Common inspection commands:
45
52
 
46
53
  ```bash
47
54
  audienti operator next --plan
55
+ audienti prospects show <prsp_id> --json
56
+ audienti prospects list --profiles
48
57
  audienti analytics prospects --window 24h
49
58
  audienti analytics visibility --window 24h --user me
50
59
  audienti analytics content --window week
51
60
  ```
52
61
 
62
+ To work the supported prospect operator queue from the CLI, inspect the next move
63
+ and record the outcome against that same row:
64
+
65
+ ```bash
66
+ audienti operator next --plan
67
+ audienti operator next --done --note "Connection request sent."
68
+ ```
69
+
70
+ To update a prospect's attached profile channels through the same paths used by
71
+ the prospect show page:
72
+
73
+ ```bash
74
+ audienti prospects add-profile <prsp_id> --url prospect@example.com
75
+ audienti prospects add-profile <prsp_id> --url +12025550123
76
+ audienti prospects add-profile <prsp_id> --url https://www.linkedin.com/in/example
77
+ audienti prospects report-bad-profile <prsp_id> <prof_id>
78
+ ```
79
+
53
80
  ## Compatibility
54
81
 
55
82
  The CLI talks to the versioned Audienti `/api/v1` contract at
package/install ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ package="@audienti/cli"
5
+ binary="audienti"
6
+ minimum_node_major=20
7
+
8
+ say() {
9
+ printf '%s\n' "$*"
10
+ }
11
+
12
+ fail() {
13
+ printf 'Audienti CLI install failed: %s\n' "$*" >&2
14
+ exit 1
15
+ }
16
+
17
+ require_command() {
18
+ if ! command -v "$1" >/dev/null 2>&1; then
19
+ fail "$2"
20
+ fi
21
+ }
22
+
23
+ require_command node "Node.js ${minimum_node_major} or newer is required. Install Node.js, then rerun this script."
24
+ require_command npm "npm is required. Install Node.js ${minimum_node_major} or newer with npm, then rerun this script."
25
+
26
+ node_major="$(node -p 'Number(process.versions.node.split(".")[0])' 2>/dev/null || true)"
27
+ case "$node_major" in
28
+ ''|*[!0-9]*)
29
+ fail "could not determine the installed Node.js version."
30
+ ;;
31
+ esac
32
+
33
+ if [ "$node_major" -lt "$minimum_node_major" ]; then
34
+ fail "Node.js ${minimum_node_major} or newer is required. Current version: $(node --version)."
35
+ fi
36
+
37
+ say "Installing ${package}..."
38
+ npm install --global --no-audit --no-fund "$package"
39
+
40
+ global_prefix="$(npm prefix --global 2>/dev/null || true)"
41
+ if [ -n "$global_prefix" ] && [ -d "$global_prefix/bin" ]; then
42
+ export PATH="$global_prefix/bin:$PATH"
43
+ fi
44
+
45
+ if ! command -v "$binary" >/dev/null 2>&1; then
46
+ if [ -n "$global_prefix" ] && [ -x "$global_prefix/bin/$binary" ]; then
47
+ fail "${binary} installed at ${global_prefix}/bin/${binary}, but that directory is not on PATH."
48
+ fi
49
+
50
+ fail "${binary} was not found on PATH after installation."
51
+ fi
52
+
53
+ "$binary" --help >/dev/null
54
+
55
+ cat <<'NEXT'
56
+ Audienti CLI installed.
57
+
58
+ Next:
59
+ audienti auth token <token>
60
+ audienti accounts list --json
61
+ audienti accounts select <acct_id>
62
+ NEXT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audienti/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Agent-first command-line client for Audienti.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,6 +10,7 @@
10
10
  "bin/",
11
11
  "src/",
12
12
  "skills/",
13
+ "install",
13
14
  "README.md",
14
15
  "LICENSE",
15
16
  "CHANGELOG.md"
@@ -19,7 +19,7 @@ audienti --help
19
19
  2. If it is unavailable, install the public package:
20
20
 
21
21
  ```bash
22
- npm install --global @audienti/cli
22
+ curl -fsSL https://cli.audienti.com/install | bash
23
23
  ```
24
24
 
25
25
  3. Authentication is explicit and per machine. Do not ask a user to paste a
package/src/api-client.js CHANGED
@@ -189,6 +189,20 @@ export class AudientiClient {
189
189
  });
190
190
  }
191
191
 
192
+ addProspectProfile(accountId, prospectId, body) {
193
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "profiles"]), {
194
+ method: "POST",
195
+ body
196
+ });
197
+ }
198
+
199
+ reportBadProspectProfile(accountId, prospectId, body) {
200
+ return this.requestJson(accountPath(accountId, ["prospects", prospectId, "report_bad_profile"]), {
201
+ method: "POST",
202
+ body
203
+ });
204
+ }
205
+
192
206
  prospectImport(accountId, body) {
193
207
  return this.requestJson(accountPath(accountId, ["prospect_imports"]), {
194
208
  method: "POST",
@@ -308,6 +322,10 @@ function errorMessage(status, body) {
308
322
  return "The requested Audienti resource was not found.";
309
323
  }
310
324
 
325
+ if (status === 409) {
326
+ return body?.error || "Audienti rejected the request because the resource changed. Re-fetch and try again.";
327
+ }
328
+
311
329
  if (status === 422) {
312
330
  const reasons = [body?.errors, body?.details].find(Array.isArray);
313
331
  const details = reasons?.length > 0 ? reasons.join(", ") : body?.error;
package/src/cli.js CHANGED
@@ -26,6 +26,8 @@ const DEFAULT_PROFILE_IDENTIFIERS = [
26
26
  const DELETE_CONFIRMATION_VALUES = new Set(["yes", "true", "y"]);
27
27
  const PROSPECTS_ADD_NOTE_USAGE = "Usage: audienti prospects add-note <prsp_id> (--message <text> [--type <note|steer|voicemail_outreach|video_outreach>] [--engagement-type <key>] | --payload <file.json>) [--json] [--account <acct_id>]";
28
28
  const PROSPECTS_ADD_STEER_USAGE = "Usage: audienti prospects add-steer <prsp_id> (--message <text> [--engagement-type <key>] | --payload <file.json>) [--json] [--account <acct_id>]";
29
+ const PROSPECTS_ADD_PROFILE_USAGE = "Usage: audienti prospects add-profile <prsp_id> --url <profile_url|email|phone> [--json] [--account <acct_id>]";
30
+ const PROSPECTS_REPORT_BAD_PROFILE_USAGE = "Usage: audienti prospects report-bad-profile <prsp_id> <prof_id|citation_id> [--json] [--account <acct_id>]";
29
31
  const SEQUENCE_EXPORT_CSV_COLUMNS = [
30
32
  "prospect_id",
31
33
  "prospect_name",
@@ -114,6 +116,8 @@ async function dispatch(argv, context) {
114
116
  if (normalizedResource === "prospects" && action === "write") return prospectsWrite(rest, context, { accountOverride });
115
117
  if (normalizedResource === "prospects" && action === "add-note") return prospectsAddNote(rest, context, { accountOverride });
116
118
  if (normalizedResource === "prospects" && action === "add-steer") return prospectsAddSteer(rest, context, { accountOverride });
119
+ if (normalizedResource === "prospects" && action === "add-profile") return prospectsAddProfile(rest, context, { accountOverride });
120
+ if (normalizedResource === "prospects" && action === "report-bad-profile") return prospectsReportBadProfile(rest, context, { accountOverride });
117
121
  if (normalizedResource === "prospects" && action === "sequence-preview") return prospectsSequencePreview(rest, context, { accountOverride });
118
122
  if (normalizedResource === "prospects" && action === "sequence-export") return prospectsSequenceExport(rest, context, { accountOverride });
119
123
  if (normalizedResource === "prospects" && action === "import") return prospectsImport(rest, context, { accountOverride });
@@ -861,6 +865,31 @@ async function prospectsAddSteer(args, context, { accountOverride } = {}) {
861
865
  });
862
866
  }
863
867
 
868
+ async function prospectsAddProfile(args, context, { accountOverride } = {}) {
869
+ const { values, positionals } = parseCommandArgs(args, {
870
+ ...jsonOptions(),
871
+ url: { type: "string" }
872
+ });
873
+ if (positionals.length !== 1 || !values.url) throw new CommandError(PROSPECTS_ADD_PROFILE_USAGE);
874
+
875
+ const { client, accountId } = await requireAccountContext(context, { accountOverride });
876
+ const response = await client.addProspectProfile(accountId, positionals[0], { url: values.url });
877
+ if (values.json) return writeJson(context.stdout, response);
878
+
879
+ renderProspectProfileMutation(response, context, { action: "Added" });
880
+ }
881
+
882
+ async function prospectsReportBadProfile(args, context, { accountOverride } = {}) {
883
+ const { values, positionals } = parseCommandArgs(args, jsonOptions());
884
+ if (positionals.length !== 2) throw new CommandError(PROSPECTS_REPORT_BAD_PROFILE_USAGE);
885
+
886
+ const { client, accountId } = await requireAccountContext(context, { accountOverride });
887
+ const response = await client.reportBadProspectProfile(accountId, positionals[0], { profile_id: positionals[1] });
888
+ if (values.json) return writeJson(context.stdout, response);
889
+
890
+ renderProspectProfileMutation(response, context, { action: "Reported" });
891
+ }
892
+
864
893
  async function prospectNoteCommand(args, context, { accountOverride, forcedType, usageText }) {
865
894
  const { values, positionals } = parseCommandArgs(args, {
866
895
  ...jsonOptions(),
@@ -1013,7 +1042,7 @@ async function toolsGet(args, context, { accountOverride } = {}) {
1013
1042
  }
1014
1043
 
1015
1044
  async function operatorQueue(args, context, { accountOverride } = {}) {
1016
- const { values, positionals } = parseCommandArgs(args, operatorOptions());
1045
+ const { values, positionals } = parseCommandArgs(args, operatorFilterOptions());
1017
1046
  if (positionals.length > 0) throw new CommandError("Usage: audienti operator queue [--json] [filters] [--account <acct_id>]");
1018
1047
 
1019
1048
  const { client, accountId } = await requireAccountContext(context, { accountOverride });
@@ -1024,12 +1053,28 @@ async function operatorQueue(args, context, { accountOverride } = {}) {
1024
1053
  }
1025
1054
 
1026
1055
  async function operatorNext(args, context, { accountOverride } = {}) {
1027
- const { values, positionals } = parseCommandArgs(args, operatorOptions());
1028
- if (positionals.length > 0) throw new CommandError("Usage: audienti operator next [--json|--plan] [filters] [--account <acct_id>]");
1056
+ const { values, positionals } = parseCommandArgs(args, operatorNextOptions());
1057
+ if (positionals.length > 0) throw new CommandError("Usage: audienti operator next [--json|--plan|--done|--skip|--fail|--return] [filters] [--note <text>] [--account <acct_id>]");
1029
1058
  if (values.json && values.plan) throw new CommandError("Choose one output format: use either --json or --plan.");
1059
+ const outcomeStatus = operatorNextOutcomeStatus(values);
1060
+ if (values.plan && outcomeStatus) throw new CommandError("Choose one mode: use either --plan or an outcome flag.");
1061
+ if (!outcomeStatus && (values.note !== undefined || values["occurred-at"] !== undefined)) {
1062
+ throw new CommandError("--note and --occurred-at require an outcome flag: --done, --skip, --fail, or --return.");
1063
+ }
1030
1064
 
1031
1065
  const { client, accountId } = await requireAccountContext(context, { accountOverride });
1032
1066
  const payload = await client.operatorNext(accountId, operatorQuery(values));
1067
+ if (outcomeStatus) {
1068
+ const response = await client.operatorOutcome(accountId, operatorNextOutcomePayload(payload?.next_move, {
1069
+ status: outcomeStatus,
1070
+ note: values.note,
1071
+ occurredAt: values["occurred-at"],
1072
+ filters: payload?.filters
1073
+ }));
1074
+ if (values.json) return writeJson(context.stdout, response);
1075
+
1076
+ return renderOperatorOutcome(response, context);
1077
+ }
1033
1078
  if (values.json) return writeJson(context.stdout, payload);
1034
1079
  if (values.plan) return renderOperatorPlan(payload?.next_move, context);
1035
1080
 
@@ -1144,19 +1189,31 @@ function jsonOptions() {
1144
1189
  };
1145
1190
  }
1146
1191
 
1147
- function operatorOptions() {
1192
+ function operatorFilterOptions(extra = {}) {
1148
1193
  return {
1149
1194
  ...jsonOptions(),
1150
- plan: { type: "boolean" },
1151
1195
  principal: { type: "string" },
1152
1196
  motion: { type: "string" },
1153
1197
  list: { type: "string" },
1154
1198
  stage: { type: "string" },
1155
1199
  "opportunity-kind": { type: "string" },
1156
- "writing-status": { type: "string" }
1200
+ "writing-status": { type: "string" },
1201
+ ...extra
1157
1202
  };
1158
1203
  }
1159
1204
 
1205
+ function operatorNextOptions() {
1206
+ return operatorFilterOptions({
1207
+ plan: { type: "boolean" },
1208
+ done: { type: "boolean" },
1209
+ skip: { type: "boolean" },
1210
+ fail: { type: "boolean" },
1211
+ return: { type: "boolean" },
1212
+ note: { type: "string" },
1213
+ "occurred-at": { type: "string" }
1214
+ });
1215
+ }
1216
+
1160
1217
  function operatorQuery(values) {
1161
1218
  return compactObject({
1162
1219
  principal_account_user_id: values.principal,
@@ -1168,6 +1225,33 @@ function operatorQuery(values) {
1168
1225
  });
1169
1226
  }
1170
1227
 
1228
+ function operatorNextOutcomeStatus(values) {
1229
+ const selected = [
1230
+ values.done ? "done" : null,
1231
+ values.skip ? "skipped" : null,
1232
+ values.fail ? "failed" : null,
1233
+ values.return ? "returned" : null
1234
+ ].filter(Boolean);
1235
+ if (selected.length > 1) throw new CommandError("Choose one outcome flag: --done, --skip, --fail, or --return.");
1236
+
1237
+ return selected[0];
1238
+ }
1239
+
1240
+ function operatorNextOutcomePayload(row, { status, note, occurredAt, filters }) {
1241
+ if (!row) throw new CommandError("No operator moves found.");
1242
+ if (!row.id) throw new CommandError("The next operator move is missing a row id.");
1243
+ if (!row.fingerprint) throw new CommandError("The next operator move is missing a fingerprint; update the server before using outcome shortcuts.");
1244
+
1245
+ return compactObject({
1246
+ row_id: row.id,
1247
+ status,
1248
+ fingerprint: row.fingerprint,
1249
+ queue_filters: filters,
1250
+ note,
1251
+ occurred_at: occurredAt
1252
+ });
1253
+ }
1254
+
1171
1255
  function analyticsOptions() {
1172
1256
  return {
1173
1257
  ...jsonOptions(),
@@ -1676,6 +1760,19 @@ function renderProspectNote(payload, context) {
1676
1760
  }
1677
1761
  }
1678
1762
 
1763
+ function renderProspectProfileMutation(payload, context, { action }) {
1764
+ const prospect = payload?.prospect || {};
1765
+ const profile = payload?.profile || {};
1766
+ const status = payload?.status ? ` (${payload.status})` : "";
1767
+
1768
+ writeLine(context.stdout, `${action} profile${status}.`);
1769
+ writeLine(context.stdout, `Prospect: ${display(prospect.display_name || prospect.name)} (${display(prospect.prefix_id)})`);
1770
+ writeLine(context.stdout, `Profile: ${display(profile.citation_id || profile.prefix_id)}`);
1771
+ if (profile.identifier) writeLine(context.stdout, `Type: ${profile.identifier}`);
1772
+ if (profile.username) writeLine(context.stdout, `Username: ${profile.username}`);
1773
+ if (profile.url) writeLine(context.stdout, `URL: ${profile.url}`);
1774
+ }
1775
+
1679
1776
  function renderProspectSequencePreview(payload, context) {
1680
1777
  const prospect = payload?.prospect || {};
1681
1778
  const report = payload?.report || {};
@@ -2269,12 +2366,14 @@ const HELP_TOPICS = new Map([
2269
2366
  " audienti prospects write <prsp_id> --type <surface_key> [--json]",
2270
2367
  " audienti prospects add-note <prsp_id> --message <text> [--json]",
2271
2368
  " audienti prospects add-steer <prsp_id> --message <text> [--json]",
2369
+ " audienti prospects add-profile <prsp_id> --url <profile_url|email|phone> [--json]",
2370
+ " audienti prospects report-bad-profile <prsp_id> <prof_id|citation_id> [--json]",
2272
2371
  " audienti prospects sequence-preview <prsp_id> [--json]",
2273
2372
  " audienti prospects sequence-export <prsp_id> [--csv]",
2274
2373
  " audienti prospects import <linkedin_url> [--list <list_id>] [--motion <motn_id>] [--json]",
2275
2374
  " audienti prospects import-status <primp_id> [--json]",
2276
2375
  " audienti tools get <email|phone> --url <linkedin_url> [--json]",
2277
- " audienti operator next [--json|--plan]",
2376
+ " audienti operator next [--json|--plan|--done|--skip|--fail|--return]",
2278
2377
  " audienti operator queue [--json]",
2279
2378
  " audienti operator outcome <row_id> --payload <file.json> [--json]",
2280
2379
  " audienti analytics prospects [--window 24h] [--user <account_user_id|email|name|me>] [--json]",
@@ -2970,6 +3069,8 @@ const HELP_TOPICS = new Map([
2970
3069
  " audienti prospects write <prsp_id> --type <surface_key> [--json]",
2971
3070
  " audienti prospects add-note <prsp_id> --message <text> [--json]",
2972
3071
  " audienti prospects add-steer <prsp_id> --message <text> [--json]",
3072
+ " audienti prospects add-profile <prsp_id> --url <profile_url|email|phone> [--json]",
3073
+ " audienti prospects report-bad-profile <prsp_id> <prof_id|citation_id> [--json]",
2973
3074
  " audienti prospects sequence-preview <prsp_id> [--json]",
2974
3075
  " audienti prospects sequence-export <prsp_id> [--csv]",
2975
3076
  " audienti prospects import <linkedin_url> [--list <list_id>] [--motion <motn_id>] [--json]",
@@ -3181,6 +3282,60 @@ const HELP_TOPICS = new Map([
3181
3282
  " }"
3182
3283
  ].join("\n")],
3183
3284
 
3285
+ ["prospects add-profile", [
3286
+ "Usage:",
3287
+ ` ${PROSPECTS_ADD_PROFILE_USAGE.slice("Usage: ".length)}`,
3288
+ "",
3289
+ "Status: implemented",
3290
+ "",
3291
+ "Purpose:",
3292
+ " Add a profile, email address, or phone number to an existing prospect through the same add-profile path used by the prospect show page.",
3293
+ "",
3294
+ "Input shape:",
3295
+ " prsp_id: prsp_ prospect prefix id",
3296
+ " url: supported profile URL, plain email address, mailto: URL, plain phone number, or tel: URL",
3297
+ "",
3298
+ "Output shape:",
3299
+ " prospect: prospect summary",
3300
+ " profile: attached profile with prefix_id, citation_id, identifier, username, url, and status",
3301
+ " status: attached | already_attached",
3302
+ "",
3303
+ "API:",
3304
+ " POST /api/v1/accounts/:account_id/prospects/:id/profiles.json",
3305
+ "",
3306
+ "JSON body:",
3307
+ " {",
3308
+ " \"url\": \"prospect@example.com\"",
3309
+ " }"
3310
+ ].join("\n")],
3311
+
3312
+ ["prospects report-bad-profile", [
3313
+ "Usage:",
3314
+ ` ${PROSPECTS_REPORT_BAD_PROFILE_USAGE.slice("Usage: ".length)}`,
3315
+ "",
3316
+ "Status: implemented",
3317
+ "",
3318
+ "Purpose:",
3319
+ " Report one of a prospect's attached profiles as bad through the same report action used by the prospect show page.",
3320
+ "",
3321
+ "Input shape:",
3322
+ " prsp_id: prsp_ prospect prefix id",
3323
+ " prof_id: prof_ prefix id or citation id such as email/profile:name@example.com",
3324
+ "",
3325
+ "Output shape:",
3326
+ " prospect: prospect summary",
3327
+ " profile: reported profile",
3328
+ " status: reported",
3329
+ "",
3330
+ "API:",
3331
+ " POST /api/v1/accounts/:account_id/prospects/:id/report_bad_profile.json",
3332
+ "",
3333
+ "JSON body:",
3334
+ " {",
3335
+ " \"profile_id\": \"prof_abc123\"",
3336
+ " }"
3337
+ ].join("\n")],
3338
+
3184
3339
  ["prospects sequence-preview", [
3185
3340
  "Usage:",
3186
3341
  " audienti prospects sequence-preview <prsp_id> [--json] [--connection-state <state>] [--account <acct_id>]",
@@ -3345,11 +3500,11 @@ const HELP_TOPICS = new Map([
3345
3500
 
3346
3501
  ["operator", [
3347
3502
  "Usage:",
3348
- " audienti operator next [--json|--plan]",
3503
+ " audienti operator next [--json|--plan|--done|--skip|--fail|--return]",
3349
3504
  " audienti operator queue [--json]",
3350
3505
  " audienti operator outcome <row_id> --payload <file.json>",
3351
3506
  "",
3352
- "Status: read commands and prospect outcome writeback implemented",
3507
+ "Status: read commands and prospect next-move writeback implemented",
3353
3508
  "",
3354
3509
  "Filters:",
3355
3510
  " --principal <account_user_id>",
@@ -3362,12 +3517,18 @@ const HELP_TOPICS = new Map([
3362
3517
 
3363
3518
  ["operator next", [
3364
3519
  "Usage:",
3365
- " audienti operator next [--json|--plan] [filters] [--account <acct_id>]",
3520
+ " audienti operator next [--json|--plan|--done|--skip|--fail|--return] [filters] [--note <text>] [--account <acct_id>]",
3366
3521
  "",
3367
3522
  "Status: implemented",
3368
3523
  "",
3369
3524
  "Options:",
3370
3525
  " --plan Render a deterministic static plan from the existing next-action coach payload, CTA, and operator draft state",
3526
+ " --done Mark the current next prospect move completed through the operator outcome API",
3527
+ " --skip Mark the current next prospect move skipped through the operator outcome API",
3528
+ " --fail Mark the current next prospect move failed through the operator outcome API",
3529
+ " --return Mark the current next prospect move returned through the operator outcome API",
3530
+ " --note <text> Optional outcome note used with --done, --skip, --fail, or --return",
3531
+ " --occurred-at <ISO8601> Optional completion timestamp used with an outcome flag",
3371
3532
  "",
3372
3533
  "Output shape:",
3373
3534
  " next_move.id: row id",
@@ -3380,7 +3541,8 @@ const HELP_TOPICS = new Map([
3380
3541
  " metrics: queue-builder metrics",
3381
3542
  "",
3382
3543
  "API:",
3383
- " GET /api/v1/accounts/:account_id/operator/next.json"
3544
+ " GET /api/v1/accounts/:account_id/operator/next.json",
3545
+ " POST /api/v1/accounts/:account_id/operator/outcome.json when an outcome flag is used"
3384
3546
  ].join("\n")],
3385
3547
 
3386
3548
  ["operator queue", [
@@ -3537,6 +3699,8 @@ const HELP_TOPICS = new Map([
3537
3699
  " audienti prospects show <prsp_id>",
3538
3700
  " audienti prospects timeline <prsp_id> --types post,comment,reaction --json",
3539
3701
  " audienti prospects message-types <prsp_id>",
3702
+ " audienti prospects add-profile <prsp_id> --url prospect@example.com",
3703
+ " audienti prospects report-bad-profile <prsp_id> <prof_id>",
3540
3704
  " audienti prospects add-note <prsp_id> --type steer --message \"Meeting will not happen\" --engagement-type action.meeting.canceled",
3541
3705
  " audienti prospects sequence-preview <prsp_id>",
3542
3706
  " audienti prospects sequence-export <prsp_id> --csv",