@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 +16 -0
- package/README.md +27 -0
- package/install +62 -0
- package/package.json +2 -1
- package/skills/audienti/SKILL.md +1 -1
- package/src/api-client.js +18 -0
- package/src/cli.js +175 -11
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.
|
|
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"
|
package/skills/audienti/SKILL.md
CHANGED
|
@@ -19,7 +19,7 @@ audienti --help
|
|
|
19
19
|
2. If it is unavailable, install the public package:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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",
|