@audienti/cli 0.1.34 → 0.1.35
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 +11 -0
- package/README.md +2 -0
- package/package.json +1 -1
- package/skills/audienti/SKILL.md +4 -0
- package/src/api-client.js +17 -0
- package/src/cli.js +195 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,17 @@ All notable changes to the Audienti CLI are documented here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.1.35] - 2026-08-18
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Add `audienti motions abm-companies` commands for listing, adding, and removing motion-scoped positive company filters through the account API.
|
|
12
|
+
- Surface ICP `seniority_match_mode`, motion inbound channels, LOPA profile rows, signal rows, and ABM company filters in CLI/API readbacks.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Reject `posting_language` on non-hiring signal rows instead of accepting a field that cannot persist outside company-scope hiring signals.
|
|
17
|
+
|
|
7
18
|
## [0.1.34] - 2026-08-17
|
|
8
19
|
|
|
9
20
|
### Added
|
package/README.md
CHANGED
|
@@ -140,6 +140,8 @@ audienti writer test-run <prsp_id>
|
|
|
140
140
|
audienti motions analytics <motn_id>
|
|
141
141
|
audienti motions run-discovery <motn_id>
|
|
142
142
|
audienti motions quick-start --url https://example.com --wait --confirm
|
|
143
|
+
audienti motions abm-companies <motn_id> add --file abm-domains.txt
|
|
144
|
+
audienti motions abm-companies <motn_id> list
|
|
143
145
|
audienti motions update <motn_id> --status paused
|
|
144
146
|
audienti motions update <motn_id> --own-post-engagement true
|
|
145
147
|
audienti motions update <motn_id> --payload motion-signals.json
|
package/package.json
CHANGED
package/skills/audienti/SKILL.md
CHANGED
|
@@ -73,6 +73,8 @@ Useful MCP tools:
|
|
|
73
73
|
mapping URLs.
|
|
74
74
|
- `offers.create`, `icps.create`, and `motions.create` set up the offer, ICP,
|
|
75
75
|
and play.
|
|
76
|
+
- Use `audienti motions abm-companies <motn_id> add --file <txt|json>` to attach
|
|
77
|
+
a positive company filter list for isolated ABM discovery runs.
|
|
76
78
|
- `analytics.stages` returns stage conversion cohorts and stage aging.
|
|
77
79
|
- `analytics.cohort_lists.create` materializes event cohorts as reusable lists.
|
|
78
80
|
|
|
@@ -101,6 +103,8 @@ audienti users activity me --window 7d --json
|
|
|
101
103
|
audienti prospects import-batch --file prospects.csv --motion <motn_id> --assigned-user me --json
|
|
102
104
|
audienti lists create --name "Target list" --json
|
|
103
105
|
audienti motions quick-start --url https://example.com --wait --confirm --json
|
|
106
|
+
audienti motions abm-companies <motn_id> add --file abm-domains.txt --json
|
|
107
|
+
audienti motions abm-companies <motn_id> list --json
|
|
104
108
|
audienti motions update <motn_id> --status paused --json
|
|
105
109
|
audienti motions activate <motn_id> --json
|
|
106
110
|
audienti motions delete <motn_id> --confirm yes --json
|
package/src/api-client.js
CHANGED
|
@@ -290,6 +290,23 @@ export class AudientiClient {
|
|
|
290
290
|
});
|
|
291
291
|
}
|
|
292
292
|
|
|
293
|
+
motionAbmCompanies(accountId, motionId) {
|
|
294
|
+
return this.requestJson(accountPath(accountId, ["motions", motionId, "abm_companies"]));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
addMotionAbmCompanies(accountId, motionId, body) {
|
|
298
|
+
return this.requestJson(accountPath(accountId, ["motions", motionId, "abm_companies"]), {
|
|
299
|
+
method: "POST",
|
|
300
|
+
body
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
removeMotionAbmCompany(accountId, motionId, rowId) {
|
|
305
|
+
return this.requestJson(accountPath(accountId, ["motions", motionId, "abm_companies", rowId]), {
|
|
306
|
+
method: "DELETE"
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
293
310
|
contentPrograms(accountId, query = {}) {
|
|
294
311
|
return this.requestJson(accountPath(accountId, ["content_ops", "programs"], query));
|
|
295
312
|
}
|
package/src/cli.js
CHANGED
|
@@ -90,6 +90,9 @@ const MOTIONS_CLONE_USAGE = "Usage: audienti motions clone <motn_id> --name <tex
|
|
|
90
90
|
const MOTIONS_MOVE_PROSPECTS_USAGE = "Usage: audienti motions move-prospects <source_motn_id> --target <target_motn_id> <prsp_id> [prsp_id...] [--json] [--account <acct_id>]";
|
|
91
91
|
const MOTIONS_RUN_DISCOVERY_USAGE = "Usage: audienti motions run-discovery <motn_id> [--target-count <n>] [--json] [--account <acct_id>]";
|
|
92
92
|
const MOTIONS_QUICK_START_USAGE = "Usage: audienti motions quick-start --url <company_url> [--principal <account_user_id|me>] [--feedback <text>] [--offer-type <type>] [--force] [--confirm] [--wait] [--timeout-seconds <n>] [--poll-interval-seconds <n>] [--json] [--account <acct_id>]";
|
|
93
|
+
const MOTIONS_ABM_COMPANIES_LIST_USAGE = "Usage: audienti motions abm-companies <motn_id> list [--json] [--account <acct_id>]";
|
|
94
|
+
const MOTIONS_ABM_COMPANIES_ADD_USAGE = "Usage: audienti motions abm-companies <motn_id> add (<domain_or_linkedin_url>... | --file <txt|json>) [--json] [--account <acct_id>]";
|
|
95
|
+
const MOTIONS_ABM_COMPANIES_REMOVE_USAGE = "Usage: audienti motions abm-companies <motn_id> remove <row_id> [--json] [--account <acct_id>]";
|
|
93
96
|
const ICPS_SHOW_USAGE = "Usage: audienti icps show <icp_id> [--json] [--account <acct_id>]";
|
|
94
97
|
const ICPS_UPDATE_USAGE = "Usage: audienti icps update <icp_id> ([--name <text>] [--notes <text>] [--discovery-keyword <text>] [--tags <tag[,tag...]>] | --payload <file.json>) [--json] [--account <acct_id>]";
|
|
95
98
|
const ICPS_ADD_TAG_USAGE = "Usage: audienti icps add-tag <icp_id> <tag> [--json] [--account <acct_id>]";
|
|
@@ -237,6 +240,7 @@ async function dispatch(argv, context) {
|
|
|
237
240
|
if (normalizedResource === "motions" && action === "list") return motionsList(rest, context, { accountOverride });
|
|
238
241
|
if (normalizedResource === "motions" && action === "show") return motionsShow(rest, context, { accountOverride });
|
|
239
242
|
if (normalizedResource === "motions" && action === "status") return motionsStatus(rest, context, { accountOverride });
|
|
243
|
+
if (normalizedResource === "motions" && ["abm-companies", "company-filters"].includes(action)) return motionsAbmCompanies(rest, context, { accountOverride });
|
|
240
244
|
if (normalizedResource === "motions" && action === "analytics") return motionsAnalytics(rest, context, { accountOverride });
|
|
241
245
|
if (normalizedResource === "motions" && action === "prospects") return motionsProspects(rest, context, { accountOverride });
|
|
242
246
|
if (normalizedResource === "motions" && action === "add-prospects") return motionsAddProspects(rest, context, { accountOverride });
|
|
@@ -1687,12 +1691,68 @@ async function motionsCreate(args, context, { accountOverride } = {}) {
|
|
|
1687
1691
|
|
|
1688
1692
|
function normalizeMotionCreatePayload(payload) {
|
|
1689
1693
|
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return payload;
|
|
1694
|
+
validateMotionSignalRows(payload);
|
|
1690
1695
|
if (String(payload.kind || "").trim().toLowerCase() !== "inbound") return payload;
|
|
1691
1696
|
if (Object.prototype.hasOwnProperty.call(payload, "inbound_channels")) return payload;
|
|
1692
1697
|
|
|
1693
1698
|
return { ...payload, inbound_channels: ["linkedin"] };
|
|
1694
1699
|
}
|
|
1695
1700
|
|
|
1701
|
+
async function motionsAbmCompanies(args, context, { accountOverride } = {}) {
|
|
1702
|
+
const [motionId, subaction, ...rest] = args;
|
|
1703
|
+
if (!motionId || !subaction) throw new CommandError("Usage: audienti motions abm-companies <motn_id> <list|add|remove> [args] [--json] [--account <acct_id>]");
|
|
1704
|
+
|
|
1705
|
+
if (subaction === "list") return motionsAbmCompaniesList(motionId, rest, context, { accountOverride });
|
|
1706
|
+
if (subaction === "add") return motionsAbmCompaniesAdd(motionId, rest, context, { accountOverride });
|
|
1707
|
+
if (["remove", "delete"].includes(subaction)) return motionsAbmCompaniesRemove(motionId, rest, context, { accountOverride });
|
|
1708
|
+
|
|
1709
|
+
throw new CommandError("Usage: audienti motions abm-companies <motn_id> <list|add|remove> [args] [--json] [--account <acct_id>]");
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
async function motionsAbmCompaniesList(motionId, args, context, { accountOverride } = {}) {
|
|
1713
|
+
const { values, positionals } = parseCommandArgs(args, jsonOptions());
|
|
1714
|
+
if (positionals.length > 0) throw new CommandError(MOTIONS_ABM_COMPANIES_LIST_USAGE);
|
|
1715
|
+
|
|
1716
|
+
const { client, accountId } = await requireAccountContext(context, { accountOverride });
|
|
1717
|
+
const payload = await client.motionAbmCompanies(accountId, motionId);
|
|
1718
|
+
if (values.json) return writeJson(context.stdout, payload);
|
|
1719
|
+
|
|
1720
|
+
renderMotionAbmCompanies(payload, context);
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
async function motionsAbmCompaniesAdd(motionId, args, context, { accountOverride } = {}) {
|
|
1724
|
+
const { values, positionals } = parseCommandArgs(args, {
|
|
1725
|
+
...jsonOptions(),
|
|
1726
|
+
file: { type: "string" }
|
|
1727
|
+
});
|
|
1728
|
+
if ((positionals.length === 0 && !values.file) || (positionals.length > 0 && values.file)) {
|
|
1729
|
+
throw new CommandError(MOTIONS_ABM_COMPANIES_ADD_USAGE);
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
const entries = values.file ? await motionAbmCompanyEntriesFromFile(values.file) : positionals;
|
|
1733
|
+
if (entries.length === 0) throw new CommandError(MOTIONS_ABM_COMPANIES_ADD_USAGE);
|
|
1734
|
+
|
|
1735
|
+
const { client, accountId } = await requireAccountContext(context, { accountOverride });
|
|
1736
|
+
const payload = await client.addMotionAbmCompanies(accountId, motionId, { abm_companies: entries });
|
|
1737
|
+
if (values.json) return writeJson(context.stdout, payload);
|
|
1738
|
+
|
|
1739
|
+
writeLine(context.stdout, `Company filters: ${Array.isArray(payload?.abm_companies) ? payload.abm_companies.length : 0}`);
|
|
1740
|
+
renderMotionAbmCompanies(payload, context);
|
|
1741
|
+
renderMotionAbmCompanyErrors(payload, context);
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
async function motionsAbmCompaniesRemove(motionId, args, context, { accountOverride } = {}) {
|
|
1745
|
+
const { values, positionals } = parseCommandArgs(args, jsonOptions());
|
|
1746
|
+
if (positionals.length !== 1) throw new CommandError(MOTIONS_ABM_COMPANIES_REMOVE_USAGE);
|
|
1747
|
+
|
|
1748
|
+
const { client, accountId } = await requireAccountContext(context, { accountOverride });
|
|
1749
|
+
const payload = await client.removeMotionAbmCompany(accountId, motionId, positionals[0]);
|
|
1750
|
+
if (values.json) return writeJson(context.stdout, payload);
|
|
1751
|
+
|
|
1752
|
+
writeLine(context.stdout, `Removed company filter ${display(positionals[0])} from motion ${display(payload?.motion_id || motionId)}.`);
|
|
1753
|
+
renderMotionAbmCompanies(payload, context);
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1696
1756
|
async function motionsDelete(args, context, { accountOverride } = {}) {
|
|
1697
1757
|
const { values, positionals } = parseCommandArgs(args, {
|
|
1698
1758
|
...jsonOptions(),
|
|
@@ -1737,7 +1797,9 @@ async function motionUpdatePayload(values) {
|
|
|
1737
1797
|
throw new CommandError("Choose one motion input mode: either --payload <file.json> or the simple --status/--tags/--own-post-engagement flags.");
|
|
1738
1798
|
}
|
|
1739
1799
|
|
|
1740
|
-
|
|
1800
|
+
const payload = await readJsonPayload(values.payload);
|
|
1801
|
+
validateMotionSignalRows(payload);
|
|
1802
|
+
return payload;
|
|
1741
1803
|
}
|
|
1742
1804
|
|
|
1743
1805
|
return compactObject({
|
|
@@ -1751,6 +1813,41 @@ function motionSimpleFieldsPresent(values) {
|
|
|
1751
1813
|
return Boolean(values.status) || values.tags !== undefined || values["own-post-engagement"] !== undefined;
|
|
1752
1814
|
}
|
|
1753
1815
|
|
|
1816
|
+
function validateMotionSignalRows(payload) {
|
|
1817
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return;
|
|
1818
|
+
|
|
1819
|
+
for (const row of Array.isArray(payload.signal_rows) ? payload.signal_rows : []) {
|
|
1820
|
+
if (!row || typeof row !== "object" || Array.isArray(row)) continue;
|
|
1821
|
+
if (!String(row.posting_language || "").trim()) continue;
|
|
1822
|
+
|
|
1823
|
+
const scope = String(row.scope || "company").trim().toLowerCase();
|
|
1824
|
+
const category = String(row.company_signal_category || "").trim().toLowerCase();
|
|
1825
|
+
if (scope === "company" && category === "hiring") continue;
|
|
1826
|
+
|
|
1827
|
+
throw new CommandError("posting_language is only supported on company-scope hiring signal rows.");
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
async function motionAbmCompanyEntriesFromFile(path) {
|
|
1832
|
+
const contents = await readFile(path, "utf8");
|
|
1833
|
+
const trimmed = contents.trim();
|
|
1834
|
+
if (!trimmed) return [];
|
|
1835
|
+
|
|
1836
|
+
try {
|
|
1837
|
+
const parsed = JSON.parse(trimmed);
|
|
1838
|
+
if (Array.isArray(parsed)) return parsed;
|
|
1839
|
+
if (parsed && typeof parsed === "object") {
|
|
1840
|
+
return Array.isArray(parsed.abm_companies) ? parsed.abm_companies :
|
|
1841
|
+
(Array.isArray(parsed.company_filters) ? parsed.company_filters :
|
|
1842
|
+
(Array.isArray(parsed.items) ? parsed.items : []));
|
|
1843
|
+
}
|
|
1844
|
+
} catch {
|
|
1845
|
+
// Plain text files use one company domain or LinkedIn company URL per line.
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
return trimmed.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
1849
|
+
}
|
|
1850
|
+
|
|
1754
1851
|
async function motionsStatusShortcut(action, args, context, { accountOverride } = {}) {
|
|
1755
1852
|
const usage = `Usage: audienti motions ${action} <motn_id> [--json] [--account <acct_id>]`;
|
|
1756
1853
|
const { values, positionals } = parseCommandArgs(args, jsonOptions());
|
|
@@ -4228,7 +4325,7 @@ function renderOffer(offer, context) {
|
|
|
4228
4325
|
function renderIcps(icps, context) {
|
|
4229
4326
|
if (!Array.isArray(icps) || icps.length === 0) return writeLine(context.stdout, "No ICPs found.");
|
|
4230
4327
|
|
|
4231
|
-
writeLine(context.stdout, "ICP ID\tNAME\tTAGS\tDISCOVERY KEYWORD\tAGENT");
|
|
4328
|
+
writeLine(context.stdout, "ICP ID\tNAME\tTAGS\tDISCOVERY KEYWORD\tSENIORITY MODE\tAGENT");
|
|
4232
4329
|
for (const icp of icps) {
|
|
4233
4330
|
writeLine(
|
|
4234
4331
|
context.stdout,
|
|
@@ -4237,6 +4334,7 @@ function renderIcps(icps, context) {
|
|
|
4237
4334
|
display(icp.name),
|
|
4238
4335
|
display(Array.isArray(icp.tags) && icp.tags.length > 0 ? icp.tags.join(",") : "-"),
|
|
4239
4336
|
display(icp.discovery_keyword),
|
|
4337
|
+
display(icp.seniority_match_mode),
|
|
4240
4338
|
display(icp.agent?.name)
|
|
4241
4339
|
].join("\t")
|
|
4242
4340
|
);
|
|
@@ -4248,6 +4346,7 @@ function renderIcp(icp, context) {
|
|
|
4248
4346
|
if (Array.isArray(icp?.tags)) writeLine(context.stdout, `Tags: ${display(icp.tags.join(", "), "-")}`);
|
|
4249
4347
|
if (icp?.notes) writeLine(context.stdout, `Notes: ${icp.notes}`);
|
|
4250
4348
|
if (icp?.discovery_keyword) writeLine(context.stdout, `Discovery keyword: ${icp.discovery_keyword}`);
|
|
4349
|
+
if (icp?.seniority_match_mode) writeLine(context.stdout, `Seniority match mode: ${icp.seniority_match_mode}`);
|
|
4251
4350
|
if (icp?.agent?.name) writeLine(context.stdout, `Agent: ${icp.agent.name}`);
|
|
4252
4351
|
}
|
|
4253
4352
|
|
|
@@ -4365,6 +4464,10 @@ function renderMotion(motion, context) {
|
|
|
4365
4464
|
if (motion?.icp?.name) writeLine(context.stdout, `ICP: ${motion.icp.name} (${display(motion.icp.prefix_id)})`);
|
|
4366
4465
|
if (motion?.list?.name) writeLine(context.stdout, `List: ${motion.list.name} (${display(motion.list.prefix_id)})`);
|
|
4367
4466
|
writeLine(context.stdout, `Own-post engagement: ${motion?.own_post_engagement ? "enabled" : "disabled"}`);
|
|
4467
|
+
if (Array.isArray(motion?.inbound_channels)) writeLine(context.stdout, `Inbound channels: ${display(motion.inbound_channels.join(", "), "-")}`);
|
|
4468
|
+
renderMotionLopaProfiles(motion?.lopa_profiles, context);
|
|
4469
|
+
renderMotionSignalRows(motion?.signal_rows, context);
|
|
4470
|
+
renderMotionAbmCompanies(motion, context, { showEmpty: false });
|
|
4368
4471
|
if (Array.isArray(motion?.play_tags)) writeLine(context.stdout, `Tags: ${display(motion.play_tags.join(", "), "-")}`);
|
|
4369
4472
|
if (motion?.principal_account_user?.id) {
|
|
4370
4473
|
writeLine(
|
|
@@ -4374,6 +4477,55 @@ function renderMotion(motion, context) {
|
|
|
4374
4477
|
}
|
|
4375
4478
|
}
|
|
4376
4479
|
|
|
4480
|
+
function renderMotionLopaProfiles(rows, context) {
|
|
4481
|
+
if (!Array.isArray(rows) || rows.length === 0) return;
|
|
4482
|
+
|
|
4483
|
+
writeLine(context.stdout, "LOPA profiles:");
|
|
4484
|
+
for (const row of rows) {
|
|
4485
|
+
writeLine(context.stdout, `- ${display(row.url)} (${display(row.source_type, "other")})`);
|
|
4486
|
+
}
|
|
4487
|
+
}
|
|
4488
|
+
|
|
4489
|
+
function renderMotionSignalRows(rows, context) {
|
|
4490
|
+
if (!Array.isArray(rows) || rows.length === 0) return;
|
|
4491
|
+
|
|
4492
|
+
writeLine(context.stdout, "Signal rows:");
|
|
4493
|
+
for (const row of rows) {
|
|
4494
|
+
const filters = [
|
|
4495
|
+
row.company_signal_category ? `category=${row.company_signal_category}` : null,
|
|
4496
|
+
row.role_terms ? `roles=${singleLine(row.role_terms)}` : null,
|
|
4497
|
+
row.posting_language ? `posting_language=${singleLine(row.posting_language)}` : null,
|
|
4498
|
+
row.topics ? `topics=${singleLine(row.topics)}` : null
|
|
4499
|
+
].filter(Boolean).join("; ");
|
|
4500
|
+
writeLine(context.stdout, `- ${display(row.scope)}: ${display(row.question)}${filters ? ` [${filters}]` : ""}`);
|
|
4501
|
+
}
|
|
4502
|
+
}
|
|
4503
|
+
|
|
4504
|
+
function renderMotionAbmCompanies(payload, context, { showEmpty = true } = {}) {
|
|
4505
|
+
const rows = Array.isArray(payload?.abm_companies) ? payload.abm_companies : [];
|
|
4506
|
+
if (rows.length === 0) {
|
|
4507
|
+
if (showEmpty) writeLine(context.stdout, "No company filters found.");
|
|
4508
|
+
return;
|
|
4509
|
+
}
|
|
4510
|
+
|
|
4511
|
+
writeAlignedTable(context, ["ROW ID", "KIND", "VALUE", "STATUS"], rows.map((row) => [
|
|
4512
|
+
display(row.id),
|
|
4513
|
+
display(row.kind),
|
|
4514
|
+
display(row.normalized_value || row.raw_value),
|
|
4515
|
+
display(row.status)
|
|
4516
|
+
]));
|
|
4517
|
+
}
|
|
4518
|
+
|
|
4519
|
+
function renderMotionAbmCompanyErrors(payload, context) {
|
|
4520
|
+
const errors = Array.isArray(payload?.errors) ? payload.errors : [];
|
|
4521
|
+
if (errors.length === 0) return;
|
|
4522
|
+
|
|
4523
|
+
writeLine(context.stdout, "Errors:");
|
|
4524
|
+
for (const error of errors) {
|
|
4525
|
+
writeLine(context.stdout, `- ${display(error.input)}: ${display(error.error)}`);
|
|
4526
|
+
}
|
|
4527
|
+
}
|
|
4528
|
+
|
|
4377
4529
|
function renderContentPrograms(programs, context) {
|
|
4378
4530
|
if (!Array.isArray(programs) || programs.length === 0) return writeLine(context.stdout, "No ContentOps programs found.");
|
|
4379
4531
|
|
|
@@ -5992,6 +6144,10 @@ function display(value, fallback = "") {
|
|
|
5992
6144
|
return value === undefined || value === null || value === "" ? fallback : value;
|
|
5993
6145
|
}
|
|
5994
6146
|
|
|
6147
|
+
function singleLine(value) {
|
|
6148
|
+
return String(value || "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean).join(", ");
|
|
6149
|
+
}
|
|
6150
|
+
|
|
5995
6151
|
function prospectsToCsv(prospects) {
|
|
5996
6152
|
const profileIdentifiers = profileIdentifiersForPayload({ meta: {} }, prospects);
|
|
5997
6153
|
const headers = [
|
|
@@ -6288,6 +6444,8 @@ const HELP_TOPICS = new Map([
|
|
|
6288
6444
|
" audienti motions run-discovery <motn_id>",
|
|
6289
6445
|
" audienti motions quick-start --url <company_url> --confirm --wait",
|
|
6290
6446
|
" audienti motions prospects <motn_id>",
|
|
6447
|
+
" audienti motions abm-companies <motn_id> list",
|
|
6448
|
+
" audienti motions abm-companies <motn_id> add <domain_or_linkedin_url>...",
|
|
6291
6449
|
" audienti motions create --payload <file.json>",
|
|
6292
6450
|
" audienti motions update <motn_id> [--status <state>] [--tags <tag[,tag...]>] [--own-post-engagement <true|false>]",
|
|
6293
6451
|
" audienti motions update <motn_id> --payload <file.json>",
|
|
@@ -7555,6 +7713,9 @@ const HELP_TOPICS = new Map([
|
|
|
7555
7713
|
" audienti motions analytics <motn_id> [--window 30d] [--json]",
|
|
7556
7714
|
" audienti motions prospects <motn_id> [--json]",
|
|
7557
7715
|
" audienti motions add-prospects <motn_id> <prsp_id> [prsp_id...] [--json]",
|
|
7716
|
+
" audienti motions abm-companies <motn_id> list [--json]",
|
|
7717
|
+
" audienti motions abm-companies <motn_id> add (<domain_or_linkedin_url>... | --file <txt|json>) [--json]",
|
|
7718
|
+
" audienti motions abm-companies <motn_id> remove <row_id> [--json]",
|
|
7558
7719
|
" audienti motions create --payload <file.json> [--json]",
|
|
7559
7720
|
" audienti motions update <motn_id> ([--status <draft|preparing|active|paused|archived>] [--tags <tag[,tag...]>] [--own-post-engagement <true|false>] | --payload <file.json>) [--json]",
|
|
7560
7721
|
" audienti motions add-tag <motn_id> <tag> [--json]",
|
|
@@ -7637,10 +7798,38 @@ const HELP_TOPICS = new Map([
|
|
|
7637
7798
|
"Input shape:",
|
|
7638
7799
|
" motn_id: motn_ prefix id",
|
|
7639
7800
|
"",
|
|
7801
|
+
"Output shape:",
|
|
7802
|
+
" inbound_channels: enabled inbound collectors for inbound motions",
|
|
7803
|
+
" lopa_profiles[]: tracked LinkedIn profile rows for LOPA motions",
|
|
7804
|
+
" signal_rows[]: outbound signal configuration rows",
|
|
7805
|
+
" abm_companies[]: motion-scoped positive company filter rows",
|
|
7806
|
+
"",
|
|
7640
7807
|
"API:",
|
|
7641
7808
|
" GET /api/v1/accounts/:account_id/motions/:id.json"
|
|
7642
7809
|
].join("\n")],
|
|
7643
7810
|
|
|
7811
|
+
["motions abm-companies", [
|
|
7812
|
+
"Usage:",
|
|
7813
|
+
` ${MOTIONS_ABM_COMPANIES_LIST_USAGE.slice("Usage: ".length)}`,
|
|
7814
|
+
` ${MOTIONS_ABM_COMPANIES_ADD_USAGE.slice("Usage: ".length)}`,
|
|
7815
|
+
` ${MOTIONS_ABM_COMPANIES_REMOVE_USAGE.slice("Usage: ".length)}`,
|
|
7816
|
+
"",
|
|
7817
|
+
"Status: implemented",
|
|
7818
|
+
"",
|
|
7819
|
+
"Purpose:",
|
|
7820
|
+
" Manage a motion-scoped positive company filter list for isolated ABM discovery runs.",
|
|
7821
|
+
"",
|
|
7822
|
+
"Input shape:",
|
|
7823
|
+
" motn_id: motn_ prefix id",
|
|
7824
|
+
" domain_or_linkedin_url: company domain or LinkedIn company page URL",
|
|
7825
|
+
" file: plain text one entry per line, or JSON array / { abm_companies: [...] }",
|
|
7826
|
+
"",
|
|
7827
|
+
"API:",
|
|
7828
|
+
" GET /api/v1/accounts/:account_id/motions/:motion_id/abm_companies.json",
|
|
7829
|
+
" POST /api/v1/accounts/:account_id/motions/:motion_id/abm_companies.json",
|
|
7830
|
+
" DELETE /api/v1/accounts/:account_id/motions/:motion_id/abm_companies/:row_id.json"
|
|
7831
|
+
].join("\n")],
|
|
7832
|
+
|
|
7644
7833
|
["motions status", [
|
|
7645
7834
|
"Usage:",
|
|
7646
7835
|
" audienti motions status <motn_id> [--json] [--account <acct_id>]",
|
|
@@ -7806,7 +7995,7 @@ const HELP_TOPICS = new Map([
|
|
|
7806
7995
|
" icp_id: icpp_ prefix id | optional",
|
|
7807
7996
|
" list_id: list_ prefix id | optional",
|
|
7808
7997
|
" play_tags: [string] | optional",
|
|
7809
|
-
" signal_rows: [{ scope: company | person | both, question: string, company_signal_category: string | optional, role_terms: string | optional, posting_language: string | optional, topics: string | optional }] | optional for outbound motions",
|
|
7998
|
+
" signal_rows: [{ scope: company | person | both, question: string, company_signal_category: string | optional, role_terms: string | optional, posting_language: hiring-only string | optional, topics: string | optional }] | optional for outbound motions",
|
|
7810
7999
|
" signal_questions: newline-delimited company::, person::, or both:: legacy question text | optional for outbound motions",
|
|
7811
8000
|
" inbound_channels: [linkedin | reddit] | optional; defaults to [linkedin] for inbound motions",
|
|
7812
8001
|
" lopa_profiles: [{ url: string, source_type: creator | competitor | partner | customer | other }] | optional",
|
|
@@ -7825,6 +8014,7 @@ const HELP_TOPICS = new Map([
|
|
|
7825
8014
|
"",
|
|
7826
8015
|
"Behavior:",
|
|
7827
8016
|
" The API calls Motions::Setup and the managed graph provisioner. If principal_account_user_id is omitted, the authenticated account user is used.",
|
|
8017
|
+
" posting_language is only supported on company-scope hiring signal rows; use topics for person discussion evidence.",
|
|
7828
8018
|
" Use `audienti offers list`, `audienti icps list`, and `audienti users list` to resolve valid ids before calling this command."
|
|
7829
8019
|
].join("\n")],
|
|
7830
8020
|
|
|
@@ -7874,6 +8064,7 @@ const HELP_TOPICS = new Map([
|
|
|
7874
8064
|
"Behavior:",
|
|
7875
8065
|
" Choose either --payload or simple flags. Updates only the provided fields. Sending --tags replaces the motion's full tag set.",
|
|
7876
8066
|
" Payload mode supports outbound signal_rows or legacy signal_questions; supplied rows replace the motion's active ready signals.",
|
|
8067
|
+
" posting_language is only supported on company-scope hiring signal rows; use topics for person discussion evidence.",
|
|
7877
8068
|
"",
|
|
7878
8069
|
"API:",
|
|
7879
8070
|
" PATCH /api/v1/accounts/:account_id/motions/:id.json",
|
|
@@ -9298,6 +9489,7 @@ const HELP_TOPICS = new Map([
|
|
|
9298
9489
|
"2. Create a motion or play",
|
|
9299
9490
|
" audienti setup play preflight --principal <account_user_id|me> --platform linkedin",
|
|
9300
9491
|
" audienti motions create --payload <file.json>",
|
|
9492
|
+
" audienti motions abm-companies <motn_id> add --file abm-domains.txt",
|
|
9301
9493
|
" audienti motions clone <motn_id> --name \"New subset motion\"",
|
|
9302
9494
|
" audienti motions move-prospects <source_motn_id> --target <target_motn_id> <prsp_id> [prsp_id...]",
|
|
9303
9495
|
" audienti motions activate <motn_id>",
|