@audienti/cli 0.1.62 → 0.1.64
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 +12 -0
- package/README.md +3 -1
- package/package.json +1 -1
- package/skills/audienti/SKILL.md +5 -4
- package/src/cli.js +30 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@ All notable changes to the Audienti CLI are documented here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.1.64] - 2026-09-10
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- List routing-rule create and update resolve `locations` and `company_locations` labels to a known LinkedIn geography at save time. Unknown labels return 422. Read responses include `geo_key` on those entries.
|
|
12
|
+
|
|
13
|
+
## [0.1.63] - 2026-09-10
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- `inbox-ops queue` retries a page read that returns HTTP 502, 503, or 504 up to three times with backoff before failing, since one Inbox Ops page can take the server most of the proxy timeout.
|
|
18
|
+
|
|
7
19
|
## [0.1.62] - 2026-09-10
|
|
8
20
|
|
|
9
21
|
### Added
|
package/README.md
CHANGED
|
@@ -321,7 +321,9 @@ audienti lists routing-rules <list_id> apply
|
|
|
321
321
|
Use `action_kind: "route_to_list"` with `target_list_id` to route to another
|
|
322
322
|
working list. `apply` queues the existing list-routing background job, just like
|
|
323
323
|
the UI; it reports that work was enqueued, not that every prospect has finished
|
|
324
|
-
routing.
|
|
324
|
+
routing. Location and company_location labels must resolve to a known geography
|
|
325
|
+
at save time; unknown labels return 422. Run `audienti lists routing-rules help`
|
|
326
|
+
for the full condition contract.
|
|
325
327
|
|
|
326
328
|
To inspect activity for prospects that entered the account during a specific
|
|
327
329
|
cohort while keeping a separate activity window:
|
package/package.json
CHANGED
package/skills/audienti/SKILL.md
CHANGED
|
@@ -246,10 +246,11 @@ Never infer that `ready: true`, paused motions, or prepared queue work authorize
|
|
|
246
246
|
provider execution.
|
|
247
247
|
|
|
248
248
|
List routing-rule create and update commands accept the same normalized
|
|
249
|
-
condition and action data as the list UI.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
249
|
+
condition and action data as the list UI. Location and company_location labels
|
|
250
|
+
must resolve to a known geography or the request returns 422. Inspect the
|
|
251
|
+
ordered rules first, use `audienti lists routing-rules help` for the payload
|
|
252
|
+
contract, and treat `apply` as an asynchronous relaunch: it queues the existing
|
|
253
|
+
routing job and does not mean every list member has finished routing.
|
|
253
254
|
|
|
254
255
|
Motion start and end dates are optional lifecycle controls. A due start can
|
|
255
256
|
activate a configured preparing or paused motion; an end date is the final
|
package/src/cli.js
CHANGED
|
@@ -84,6 +84,9 @@ const INBOX_OPS_BULK_LABELS = {
|
|
|
84
84
|
const INBOX_OPS_SNAPSHOT_FILENAME = "inbox-ops-snapshot.json";
|
|
85
85
|
const INBOX_OPS_MAX_PAGES = 50;
|
|
86
86
|
const INBOX_OPS_BATCH_SIZE = 50;
|
|
87
|
+
const INBOX_OPS_PAGE_ATTEMPTS = 4;
|
|
88
|
+
const INBOX_OPS_RETRY_STATUSES = [502, 503, 504];
|
|
89
|
+
const INBOX_OPS_RETRY_DELAY_MS = 2000;
|
|
87
90
|
const NETWORK_OPS_QUEUE_USAGE = "Usage: audienti network-ops queue [--page <n>] [--offset <n>|--cursor <token>] [--json] [--account <acct_id>]";
|
|
88
91
|
const NETWORK_OPS_ACCEPT_USAGE = "Usage: audienti network-ops accept <row_id> [--json] [--account <acct_id>]";
|
|
89
92
|
const NETWORK_OPS_DECLINE_USAGE = "Usage: audienti network-ops decline <row_id> [--json] [--account <acct_id>]";
|
|
@@ -3312,7 +3315,7 @@ async function inboxOpsQueue(args, context, { accountOverride } = {}) {
|
|
|
3312
3315
|
return;
|
|
3313
3316
|
}
|
|
3314
3317
|
|
|
3315
|
-
const { rows, pages, truncated } = await fetchAllInboxOpsRows(client, accountId, query);
|
|
3318
|
+
const { rows, pages, truncated } = await fetchAllInboxOpsRows(client, accountId, query, context);
|
|
3316
3319
|
await writeInboxOpsSnapshot(context, { accountId, rows });
|
|
3317
3320
|
if (values.json) {
|
|
3318
3321
|
return writeJson(context.stdout, {
|
|
@@ -3331,7 +3334,22 @@ async function inboxOpsQueue(args, context, { accountOverride } = {}) {
|
|
|
3331
3334
|
}
|
|
3332
3335
|
}
|
|
3333
3336
|
|
|
3334
|
-
|
|
3337
|
+
// One inbox page read can take the server 15-30s, so a busy proxy sometimes
|
|
3338
|
+
// answers 502/503/504. Retry that page a few times before failing the listing.
|
|
3339
|
+
async function fetchInboxOpsPageWithRetry(client, accountId, query, context) {
|
|
3340
|
+
for (let attempt = 1; ; attempt += 1) {
|
|
3341
|
+
try {
|
|
3342
|
+
return await client.operatorQueue(accountId, query);
|
|
3343
|
+
} catch (error) {
|
|
3344
|
+
const retryable = error instanceof ApiError && INBOX_OPS_RETRY_STATUSES.includes(error.status);
|
|
3345
|
+
if (!retryable || attempt >= INBOX_OPS_PAGE_ATTEMPTS) throw error;
|
|
3346
|
+
writeLine(context.stderr, `Page read returned HTTP ${error.status}; retrying (${attempt}/${INBOX_OPS_PAGE_ATTEMPTS - 1})...`);
|
|
3347
|
+
await context.sleep(INBOX_OPS_RETRY_DELAY_MS * attempt);
|
|
3348
|
+
}
|
|
3349
|
+
}
|
|
3350
|
+
}
|
|
3351
|
+
|
|
3352
|
+
async function fetchAllInboxOpsRows(client, accountId, baseQuery, context) {
|
|
3335
3353
|
const rows = [];
|
|
3336
3354
|
const seen = new Set();
|
|
3337
3355
|
let query = { ...baseQuery };
|
|
@@ -3339,7 +3357,7 @@ async function fetchAllInboxOpsRows(client, accountId, baseQuery) {
|
|
|
3339
3357
|
let truncated = false;
|
|
3340
3358
|
|
|
3341
3359
|
for (;;) {
|
|
3342
|
-
const payload = await client
|
|
3360
|
+
const payload = await fetchInboxOpsPageWithRetry(client, accountId, query, context);
|
|
3343
3361
|
pages += 1;
|
|
3344
3362
|
for (const row of inboxOpsPayloadRows(payload)) {
|
|
3345
3363
|
if (seen.has(row.id)) continue;
|
|
@@ -9495,6 +9513,15 @@ const HELP_TOPICS = new Map([
|
|
|
9495
9513
|
" locations, company_locations, seniorities, job_titles, bio_texts,",
|
|
9496
9514
|
" company_sizes, company_types, company_keywords, seniority_match_mode, industry_groups",
|
|
9497
9515
|
"",
|
|
9516
|
+
"Location and company_location entries:",
|
|
9517
|
+
" name: string | required; must resolve to a known geography",
|
|
9518
|
+
" negative: boolean | optional",
|
|
9519
|
+
" geo_key: LinkedIn geography id or app key such as app:north_america | optional on write, filled on save",
|
|
9520
|
+
" id: legacy LinkedIn id | treated as geo_key",
|
|
9521
|
+
" Known labels include countries, US states, Canadian provinces, and named regions",
|
|
9522
|
+
" (North America, Europe, EMEA, DACH, Nordics, ANZ, UK and Ireland, Middle East,",
|
|
9523
|
+
" APAC, LATAM, Africa, Oceania). Unknown labels fail with 422.",
|
|
9524
|
+
"",
|
|
9498
9525
|
"Example payload file:",
|
|
9499
9526
|
" {",
|
|
9500
9527
|
" \"name\": \"VP prospects to Alice\",",
|