@audienti/cli 0.1.145 → 0.2.0-exora.1

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.
Files changed (66) hide show
  1. package/README.md +30 -902
  2. package/bin/audienti-mcp.mjs +2 -0
  3. package/cli/account-intake-operations.mjs +28 -0
  4. package/cli/account-intake.mjs +33 -0
  5. package/cli/account-replies.mjs +35 -0
  6. package/cli/account-reply-operations.mjs +30 -0
  7. package/cli/agents.mjs +107 -0
  8. package/cli/approach-operations.mjs +12 -0
  9. package/cli/assignment-operations.mjs +218 -0
  10. package/cli/assignment.mjs +116 -0
  11. package/cli/audience-operations.mjs +16 -0
  12. package/cli/audiences.mjs +26 -0
  13. package/cli/audienti.mjs +124 -0
  14. package/cli/connection-registry-operations.mjs +7 -0
  15. package/cli/content.mjs +29 -0
  16. package/cli/discovery-operations.mjs +27 -0
  17. package/cli/discovery.mjs +14 -0
  18. package/cli/experiment-operations.mjs +25 -0
  19. package/cli/experiments.mjs +26 -0
  20. package/cli/json-file.mjs +13 -0
  21. package/cli/mcp.mjs +47 -0
  22. package/cli/offer-operations.mjs +12 -0
  23. package/cli/offers.mjs +24 -0
  24. package/cli/owner-account-client.mjs +18 -0
  25. package/cli/profiles.mjs +29 -0
  26. package/cli/progress.mjs +12 -0
  27. package/cli/prospecting-settings-operations.mjs +16 -0
  28. package/cli/prospecting-settings.mjs +15 -0
  29. package/cli/recipient-operations.mjs +13 -0
  30. package/cli/recipients.mjs +30 -0
  31. package/cli/sender-account-operations.mjs +24 -0
  32. package/cli/sender-accounts.mjs +23 -0
  33. package/cli/skills-mcp.mjs +24 -0
  34. package/cli/skills.mjs +56 -0
  35. package/cli/suppression-operations.mjs +8 -0
  36. package/cli/suppression.mjs +12 -0
  37. package/cli/tools-operations.mjs +70 -0
  38. package/cli/tools.mjs +72 -0
  39. package/cli/work-execution-operations.mjs +35 -0
  40. package/cli/work-execution.mjs +29 -0
  41. package/cli/work-feedback-operations.mjs +17 -0
  42. package/cli/work-feedback.mjs +18 -0
  43. package/cli/work-operations.mjs +28 -0
  44. package/cli/work.mjs +27 -0
  45. package/cli/workspaces.mjs +158 -0
  46. package/package.json +15 -26
  47. package/skills/audienti/SKILL.md +61 -323
  48. package/skills/audienti/references/helpers.md +149 -0
  49. package/skills/audienti/references/profile-workflows.md +212 -0
  50. package/skills/audienti/references/workflow-receipt.md +49 -0
  51. package/skills/audienti/scripts/contracts.mjs +72 -0
  52. package/skills/audienti/scripts/profile-helpers.mjs +138 -0
  53. package/skills/audienti/scripts/run.mjs +40 -0
  54. package/source-manifest.json +59 -0
  55. package/.mcp.json +0 -13
  56. package/CHANGELOG.md +0 -1018
  57. package/bin/audienti-mcp.js +0 -5
  58. package/bin/audienti.js +0 -6
  59. package/install +0 -83
  60. package/skills/audienti/references/methodology.md +0 -111
  61. package/skills/audienti-gift-research/SKILL.md +0 -47
  62. package/src/agent-skills.js +0 -60
  63. package/src/api-client.js +0 -1639
  64. package/src/cli.js +0 -16992
  65. package/src/config.js +0 -130
  66. package/src/mcp.js +0 -103
package/README.md CHANGED
@@ -1,917 +1,45 @@
1
- # Audienti CLI
1
+ # Audienti CLI for Exora
2
2
 
3
- Audienti CLI is the agent-first command-line client for the Audienti production
4
- API and the local bridge for Audienti's app-hosted MCP endpoint. It lets local
5
- coding agents and operators inspect accounts,
6
- create and manage plays, import prospects, build lists, manage task reminders,
7
- configure list routing rules and account-user automation safety, and work
8
- supported operator flows.
3
+ Use Node 24. This release connects agents to **https://exo.audienti.com**.
4
+ The `exora` npm tag selects this client; the legacy `latest` tag is unchanged.
9
5
 
10
- The Motion Approach guides post-accept planning and writing. Set it with `audienti motions update motn_123 --approach "Test the premise before asking for a meeting"` or the `approach` field in a create/update payload. A nonblank Approach automatically chooses adaptive planning; blank, nil, or whitespace uses the existing sequence. `--approach ""` explicitly clears it and restores the existing sequence. There is no separate planning-mode selector. Existing sending controls still apply.
11
-
12
- `audienti operator queue` and `operator next` show planner and writer questions with candidate options. Answer one with `audienti operator answer <row_id> --choice <id>` or `--answer "Your guidance"`. The command fetches that exact row even when it is not the next move, then submits its current fingerprints. Stale or double answers return 409; an accepted answer returns 202 planning. Answers guide only the current decision. Planning and preview never authorize sending.
13
-
14
- ## Install
15
-
16
- Requires Node.js 20 or newer.
17
-
18
- ```bash
19
- curl -fsSL https://cli.audienti.com/install | bash
20
- ```
21
-
22
- At a terminal, the installer runs `audienti start` for you. Or install directly
23
- through npm, then start:
24
-
25
- ```bash
26
- npm install --global @audienti/cli
27
- audienti start
28
- ```
29
-
30
- For one-off use, run `npx @audienti/cli --help`.
31
-
32
- ## First run
33
-
34
- ```bash
35
- audienti start
36
- audienti setup
37
- ```
38
-
39
- `audienti start` walks you through the same path as the web:
40
-
41
- 1. It prints the intro: what Audienti does and how it warms people up.
42
- 2. It opens Audienti in your browser so you can sign in or create an account,
43
- then picks your account and account user (automatically when there is only
44
- one).
45
- 3. If the account has not paid, it shows the price and credits. Press Enter to
46
- pay by card on the pay page (it opens in your browser and the address is
47
- printed; the terminal waits until the payment shows), or type a signup code.
48
- 4. It runs setup in the terminal from the step you are on. Step 1, your
49
- company: website, who you sell to, what they should say yes to, and your
50
- city, state or province, and country when the account needs them. Step 2,
51
- verify your targeting: the audience, offer and signals cards. Type `a`, `o`
52
- or `s` to change one card, or press Enter to create the experiment.
53
- 5. Step 3, go live: connecting LinkedIn is not in the terminal yet. The command
54
- prints the web page where you finish it.
55
-
56
- `audienti setup` runs steps 1 and 2 on their own. Nothing is sent without your
57
- approval.
58
-
59
- Without a terminal, `audienti start` never prompts and reports what to do next
60
- (`payment_required` with the pay page when the account has not paid), and
61
- `setup` takes flags:
62
-
63
- ```bash
64
- audienti setup --url https://acme.com --sell-to "<who you sell to>" --ask "<what they say yes to>" --yes --json
65
- ```
66
-
67
- Add `--city <city> --state <code> --country <code>` when setup says it needs
68
- your place.
69
-
70
- Without `--yes`, a non-interactive setup drafts but creates nothing. Running
71
- `audienti` with no saved login starts `audienti start`; `audienti --help` still
72
- prints help.
73
-
74
- ## Authenticate
75
-
76
- Authenticate through the browser, then configure the default account context:
77
-
78
- ```bash
79
- audienti auth login
80
- audienti accounts list --json
81
- audienti accounts create --name Doppel --parent OMALab --json
82
- audienti accounts select <acct_id>
83
- audienti users list
84
- audienti users select <account_user_id|email|name|me>
85
- ```
86
-
87
- `audienti auth login` opens Audienti in your browser, creates an API token from
88
- your signed-in web session, sends it back to a temporary `127.0.0.1` callback,
89
- and stores it in the local CLI config after validating it.
90
-
91
- If you already have a token, you can still configure it directly:
92
-
93
- ```bash
94
- audienti auth token <token>
95
- ```
96
-
97
- The CLI writes its local configuration to `~/.config/audienti/config.json` with
98
- owner-only permissions. Do not place a production token in an agent prompt,
99
- repository file, issue, or CI secret.
100
-
101
- The selected account user is used when commands accept `me` or default to the
102
- current operator, such as `audienti users activity`, `audienti analytics users`,
103
- and `audienti prospects assign --assigned-user me`.
104
-
105
- ## Agent Workflows
106
-
107
- Before creating, changing or judging an experiment, read the strategy:
108
-
109
- ```bash
110
- audienti help methodology
111
- ```
112
-
113
- The guide explains premises, signals, informants, validating and gifting,
114
- cadence, mature-cohort verdicts, and accepted opportunities. Motion mutations
115
- print a short reminder to stderr; `--json` stdout remains machine-readable.
116
- `experiments`, `experiment` and `plays` are aliases for `motions`, including help.
117
-
118
- For gift research that stays outside the Audienti app:
119
-
120
- ```bash
121
- audienti tools gift-research --url https://example.com
122
- audienti tools gift-research --url https://example.com --json
123
- ```
124
-
125
- This prints a research skill and the website for the agent to investigate with
126
- its own browsing tools. It does not crawl the site, require login, scan through
127
- Audienti, save gifts or send outreach. The agent returns evidence-linked existing
128
- assets and clearly marked adaptations that someone would still need to build.
129
-
130
- Discover the bundled skills and the Audienti marketplace snapshot:
131
-
132
- ```bash
133
- audienti skills list
134
- audienti skills show audienti-gift-research
135
- audienti skills show signal-prospect-research
136
- ```
137
-
138
- Bundled skills print their instructions. Marketplace entries print source links
139
- and host-specific install commands; the CLI does not install or execute them.
140
- Upstream repositories own those skills, dependencies and updates. The snapshot's
141
- source commit is included in `skills list --json`; check the upstream catalog
142
- for later additions.
143
-
144
- The selected marketplace entries are the six social-network finders,
145
- `signal-prospect-research`, and `sales-sheet-builder`. Before using a social
146
- finder, agents must check their local browser/search tools, connectors, skills,
147
- CLIs and network access. `skills show <finder>` includes that environment check
148
- before the upstream instructions; JSON discovery includes it too. Missing access
149
- must be reported rather than assumed.
150
-
151
- Start with the built-in, production-safe workflow guide:
152
-
153
- ```bash
154
- audienti help agent-workflows
155
- ```
156
-
157
- Use `--json` whenever another program or agent will consume the result. Inspect
158
- the target state before mutations, and use the command-specific help before
159
- creating, changing, or deleting data.
160
-
161
- ## MCP
162
-
163
- Audienti serves MCP from the app at `/mcp`. The package ships a small stdio
164
- bridge for MCP hosts that need a local command:
165
-
166
- ```bash
167
- audienti-mcp
168
- ```
169
-
170
- Use it this way:
171
-
172
- 1. Install the package.
173
- 2. Run `audienti auth login`.
174
- 3. Run `audienti accounts select <acct_id>`.
175
- 4. Configure your MCP host with the packaged `.mcp.json`, or point it at the
176
- `audienti-mcp` command.
177
- 5. In the MCP host, list tools and call the account-scoped tool you need.
178
-
179
- The bridge reads the same `~/.config/audienti/config.json` as the CLI, forwards
180
- MCP JSON-RPC messages to the app, and injects the selected account when a tool
181
- call does not include `account_id`. If you want a tool to run against a
182
- different account, pass `account_id` in that tool call.
183
-
184
- MCP clients that can call HTTP directly may use the hosted endpoint instead of
185
- the stdio bridge:
186
-
187
- ```bash
188
- curl https://app.audienti.com/mcp \
189
- -H "Authorization: Bearer $AUDIENTI_API_TOKEN" \
190
- -H "Content-Type: application/json" \
191
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
192
- ```
193
-
194
- Example tool call:
195
-
196
- ```json
197
- {
198
- "jsonrpc": "2.0",
199
- "id": 2,
200
- "method": "tools/call",
201
- "params": {
202
- "name": "analytics.stages",
203
- "arguments": {
204
- "account_id": "acct_...",
205
- "query": {
206
- "interval": "weekly",
207
- "cohort_start_date": "2026-07-01",
208
- "cohort_end_date": "2026-07-31"
209
- }
210
- }
211
- }
212
- }
213
- ```
214
-
215
- Useful MCP tools to start with:
216
-
217
- - `auth.me` confirms the token identity.
218
- - `accounts.list` shows accessible accounts.
219
- - `setup.play_preflight` returns LinkedIn connected-account readiness and setup
220
- or mapping URLs.
221
- - `offers.create`, `icps.create`, and `motions.create` set up the offer, ICP,
222
- and play.
223
- - `analytics.stages` returns stage conversion cohorts and stage aging.
224
- - `analytics.cohort_lists.create` materializes event cohorts as reusable lists.
225
-
226
- Common inspection commands:
227
-
228
- ```bash
229
- audienti update check
230
- audienti operator next --plan
231
- audienti writer test-run <prsp_id>
232
- audienti analytics motions --json
233
- audienti analytics icps --json
234
- audienti motions analytics <motn_id>
235
- audienti motions run-discovery <motn_id>
236
- audienti motions runs <motn_id> [--cursor <id>] [--limit <1-10>] [--json]
237
- audienti motions quick-start --url https://example.com --wait --confirm
238
- audienti motions abm-companies <motn_id> add --file abm-domains.txt
239
- audienti motions abm-companies <motn_id> list
240
- audienti motions update <motn_id> --status closing
241
- audienti motions update <motn_id> --status paused
242
- audienti motions update <motn_id> --start-date 2026-09-01 --end-date 2026-09-30 --maximum-company-count 25
243
- audienti motions update <motn_id> --own-post-engagement true
244
- audienti motions update <motn_id> --payload motion-principal-list.json
245
- audienti motions update <motn_id> --payload motion-signals.json
246
- audienti motions activate <motn_id>
247
- audienti motions delete <motn_id> --confirm yes
248
- audienti content programs
249
- audienti content track <linkedin_post_url>
250
- audienti content posts
251
- audienti content engagement <cpwi_id> --json
252
- audienti content plan <cprg_id>
253
- audienti content plans --user me
254
- audienti content plan <rprt_id> --report --user me
255
- audienti content plan-update <rprt_id> --day 1 --payload edits.json
256
- audienti content plan-approve <rprt_id> --day 1
257
- audienti content plan-research <rprt_id> --day 1
258
- audienti content plan-draft <rprt_id> --day 1 --feedback "Revise the opening"
259
- audienti content plan-visuals <rprt_id> --day 1 --style <id>
260
- audienti content post-reply <cpwi_id> --comment <task_id> --body "Approved reply"
261
- audienti content approve <cpwi_id>
262
- audienti content comments
263
- audienti social-cookies sync-messages <scok_id> [--folder <folder>] [--retry] --json
264
- audienti prospects show <prsp_id> --json
265
- audienti prospects list --profiles
266
- audienti prospects list --assigned-user unassigned
267
- audienti prospects check --all --csv
268
- audienti prospects assign <prsp_id> --assigned-user me
269
- audienti prospects set-status <prsp_id> --status not_fit
270
- audienti prospects lock <prsp_id> --note "Emergency hold"
271
- audienti tasks list
272
- audienti tasks add --title "Review Cristina" --due 2026-07-24T11:00 --prospect <prsp_id> --notes "Check the renewal note before replying."
273
- audienti tasks complete <ptsk_id>
274
- audienti dnc list
275
- audienti company-rules list
276
- audienti lists routing-rules <list_id> list
277
- audienti lists routing-rules <list_id> apply
278
- audienti users activity --window 7d
279
- audienti users automation show 136 --platform linkedin --json --account <acct_id>
280
- audienti users automation update 136 --payload automation-controls.json --json --account <acct_id>
281
- audienti users automation update 136 --payload automation-controls.json --apply --json --account <acct_id>
282
- audienti analytics prospects --window 24h
283
- audienti analytics dashboard --play-tag wine_campaign
284
- audienti analytics metrics --cohort-preset week-to-date
285
- audienti analytics cohorts create-list --name "Blank note test" --start 2026-07-20 --end 2026-07-20 --note-mode blank
286
- audienti analytics users --user me --window 30d
287
- audienti analytics visibility --window 24h --user me
288
- audienti analytics content --window week
289
- audienti tools list
290
- audienti tools humanize --file draft.txt --tone professional --language English
291
- audienti tools linkedin-review --url https://www.linkedin.com/in/example --icp <icp_id>
292
- audienti tools linkedin-review reports
293
- audienti tools linkedin-review show <rprt_id>
294
- audienti tools linkedin-review status <rprt_id>
295
- ```
296
-
297
- To humanize arbitrary text without exposing the underlying provider key, pass a
298
- UTF-8 file. Plain output contains only the transformed text, so it can be
299
- redirected directly to another file:
300
-
301
- ```bash
302
- audienti tools humanize --file draft.txt --tone professional > revised.txt
303
- audienti tools humanize --file draft.txt --language English --json
304
- ```
305
-
306
- ### Standalone account tools
307
-
308
- These run without creating prospects or experiments. Each command returns a run
309
- id at once and keeps working on the server; `--wait` polls until the run
310
- finishes and prints the results. If the CLI exits, read the run later with
311
- `tools runs show|results`. Details expire after 90 days; the summary stays.
312
-
313
- ```bash
314
- audienti tools email-find --first-name Ada --last-name Lovelace --company-domain example.com --wait
315
- audienti tools email-find --file people.csv --request-key batch-2026-10-03 # csv, jsonl or json
316
- audienti tools linkedin-enrich --url https://www.linkedin.com/in/example --wait --json
317
- audienti tools signals-find --icp "Mid-size US logistics companies" --question "Who announced warehouse automation?" --count 5
318
- audienti tools write --purpose "Book a call" --audience "Finance leads" --fact "Approvals take 2 days" --channel email
319
- audienti tools humanize --file draft.txt --async --wait
320
- audienti tools runs list --tool email-find
321
- audienti tools runs results <trun_id> --json
322
- audienti tools runs export <trun_id> --format csv --output results.csv
323
- ```
324
-
325
- `--file` takes JSON (an array or `{"items": [...]}`), JSONL, or CSV with a
326
- header row. CSV is one row per line; quoted commas are allowed, line breaks
327
- inside fields are not. With `--wait`, the exit code is 1 on an API error, a
328
- timeout or an aborted (failed) run; per-item outcomes such as `no_match` do
329
- not change it.
330
-
331
- For active paid Email Find or Signal search work, review a server quote first:
332
-
333
- ```bash
334
- audienti tools email-find --file people.csv --quote
335
- audienti tools signals-find --icp "Logistics companies" --question "Warehouse expansion" --count 5 --quote
336
- audienti tools email-find --file people.csv --accept-quote <quote_reference>
337
- audienti tools runs review <run_id>
338
- audienti tools runs resume <run_id> --item <item_id> --revision <revision> --idempotency-key <unique_key>
339
- ```
340
-
341
- Use the same input when accepting the quote. Queued rows retain the accepted price.
342
- Review reports available credits and the rows that can continue. Select fewer rows
343
- or top up; a top-up does not restart manually paused work. Use `pause` or `cancel`
344
- in place of `resume` with the same reviewed selection. `approve-payer` requires the
345
- new root administrator and does not resume work. `tools runs usage <usage_reference>`
346
- opens the exact receipt data. Tool history displays credits; supplier costs stay internal.
347
- Real prices and production charging require separate approval.
348
-
349
- Prefer `tools email-find` for an email lookup. `tools get email` still runs the
350
- prospect import pipeline and creates a prospect.
351
-
352
- ### Saved network
353
-
354
- Your own connected account's saved connections and following, from what
355
- normal work has already seen. Only the account's owner can read it, and it
356
- never visits LinkedIn or X. Coverage says partial, not yet observed, or
357
- capture not supported yet; none of these mean zero.
358
-
359
- ```bash
360
- audienti network list --cookie <scok_id> --kind connection --query acme
361
- audienti network list --cookie <scok_id> --kind follow --direction outgoing --json
362
- audienti network export --cookie <scok_id> --kind connection --format csv --output connections.csv
363
- ```
364
-
365
- To let an agent or operator check whether the local CLI is behind the latest
366
- published package:
367
-
368
- ```bash
369
- audienti update check --json
370
- ```
371
-
372
- To work the supported prospect operator queue from the CLI, inspect the next move
373
- and record the outcome against that same row:
374
-
375
- ```bash
376
- audienti operator next --plan
377
- audienti operator next --done --note "Connection request sent."
378
- ```
379
-
380
- `operator queue`, `operator failed-drafts`, `network-ops queue`, and
381
- `inbox-ops queue` print a
382
- continuation command when more rows remain. Read-only `operator next` (including
383
- `--plan`) also prints one when its page has no focal move but more rows remain;
384
- when a move is present, inspect or act on it and rerun `operator next`.
385
- Follow the continuation command even when the current page has no ready
386
- rows. It preserves the account and filters and uses the API's exact `--page` and
387
- `--offset` (which can be zero), or its opaque `--cursor`. Do not combine a cursor
388
- with an offset. If the scan limit is reached, narrow the filters; an incomplete
389
- scan does not mean the queue is empty. JSON output preserves the API response.
390
- Pagination flags are not accepted when recording outcomes or requeueing drafts.
391
-
392
- Network Ops has its own owner-scoped CLI surface for pending inbound LinkedIn
393
- connection requests. It shows the already-synced LinkedIn profile headline when
394
- one is present, keeps the exact invitation-bound message when one was captured,
395
- and queues the same canonical provider actions as the product UI:
396
-
397
- ```bash
398
- audienti network-ops queue [--page <n>] [--offset <n>|--cursor <token>]
399
- audienti network-ops accept <row_id>
400
- audienti network-ops decline <row_id>
401
- ```
402
-
403
- `reject` is accepted as an alias for `decline`. An accepted API response means
404
- the provider action was queued; it is not confirmation that LinkedIn completed
405
- the action. The same queue can be read with
406
- `audienti operator queue --opportunity-kind network`.
407
-
408
- Inbox Ops has its own owner-scoped CLI surface built for clearing a backlog in
409
- bulk. `inbox-ops queue` follows every page, numbers each row, and saves the
410
- numbered list locally for the selected account. The bulk verbs select rows by
411
- number, range, row id, `--domain`, or `--sender`, print a manifest, and apply
412
- only with `--yes` (or an interactive confirmation). `--dry-run` validates every
413
- row on the server and reports planned, skipped, and rejected rows without
414
- changing anything:
415
-
416
- ```bash
417
- audienti inbox-ops queue
418
- audienti inbox-ops queue --group-by domain
419
- audienti inbox-ops ignore 1-25 --dry-run
420
- audienti inbox-ops ignore 1-25 --yes
421
- audienti inbox-ops filter-domain 3,7 --yes
422
- audienti inbox-ops filter-domain --domain alerts.example.com --yes
423
- audienti inbox-ops filter-sender 12 --yes
424
- audienti inbox-ops allow-sender 4 --yes
425
- audienti inbox-ops allow-domain --domain customer.example --yes
426
- audienti inbox-ops filters
427
- audienti inbox-ops rule <row_id> --scope sender --disposition filter
428
- audienti inbox-ops rule set --scope sender --key news@example.com --disposition filter
429
- audienti inbox-ops rule remove --scope domain --key example.com
430
- ```
431
-
432
- Numbers stay valid until `inbox-ops queue` runs again. `ignore` hides one
433
- thread until a newer reply arrives; `filter-*` and `allow-*` write durable rules
434
- that apply to every current and future matching message across the owner's
435
- accounts. Rule verbs given only `--domain` or `--sender` write the keyed rule
436
- directly, even when the matching rows are no longer listed. Every row is
437
- authorized individually on the server: rows another owner controls, stale rows,
438
- and malformed ids are rejected one by one while the rest still apply. Pass
439
- `--page`, `--offset`, or `--cursor` to read exactly one page instead.
440
-
441
- All Inbox Ops commands update only the authenticated owner's personal/global
442
- Inbox Ops preferences or private ignore receipts. They do not archive mail, call
443
- the provider, or add a DNC entry.
444
-
445
- To manage simple reminders for yourself:
446
-
447
- ```bash
448
- audienti tasks list
449
- audienti tasks list --status completed
450
- audienti tasks add --title "Review target account" --due 2026-07-24T11:00 --list <list_id> --notes "Check the latest notes."
451
- audienti tasks complete <ptsk_id>
452
- ```
453
-
454
- To manage the same ordered rules shown in a list's Routing Rules UI, use a JSON
455
- payload for create and update operations:
456
-
457
- ```bash
458
- audienti lists routing-rules <list_id> list
459
- audienti lists routing-rules <list_id> create --payload routing-rule.json
460
- audienti lists routing-rules <list_id> update <rule_id> --payload routing-rule.json
461
- audienti lists routing-rules <list_id> move <rule_id> up
462
- audienti lists routing-rules <list_id> remove <rule_id>
463
- audienti lists routing-rules <list_id> apply
464
- ```
465
-
466
- ```json
467
- {
468
- "name": "VP prospects to Alice",
469
- "enabled": true,
470
- "action_kind": "assign_user",
471
- "target_account_user_id": "alice@example.com",
472
- "conditions": {
473
- "seniorities": [
474
- {"id": "5", "name": "Vice President", "negative": false}
475
- ],
476
- "seniority_match_mode": "at_least"
477
- }
478
- }
479
- ```
480
-
481
- Use `action_kind: "route_to_list"` with `target_list_id` to route to another
482
- working list. `apply` queues the existing list-routing background job, just like
483
- the UI; it reports that work was enqueued, not that every prospect has finished
484
- routing. Location and company_location labels must resolve to a known geography
485
- at save time; unknown labels return 422. Run `audienti lists routing-rules help`
486
- for the full condition contract.
487
-
488
- To inspect activity for prospects that entered the account during a specific
489
- cohort while keeping a separate activity window:
490
-
491
- ```bash
492
- audienti analytics prospects --cohort-start 2026-07-01 --cohort-end 2026-07-07 --window 7d
493
- ```
494
-
495
- To compare recent weekly prospect cohorts by their current pipeline stages:
496
-
497
- ```bash
498
- audienti analytics prospects cohort-analysis --weeks 4 --motion <motn_id>
6
+ ```sh
7
+ npm install -g @audienti/cli@exora
8
+ export AUDIENTI_API_URL=https://exo.audienti.com/api/v1
9
+ audienti agent connect --name "My agent" --profile "$HOME/.audienti/exo-agent.json"
499
10
  ```
500
11
 
501
- To inspect the current outcomes of outbound operations created in a date range,
502
- use the account-scoped metrics report:
12
+ Open the returned approval URL yourself, sign in, check the code, and approve.
13
+ Give the agent the profile path, not your password or a human API token.
503
14
 
504
- ```bash
505
- audienti analytics metrics --cohort-start 2026-08-24 --cohort-end 2026-08-30 --interval daily
506
- audienti analytics metrics --cohort-start 2026-08-24 --cohort-end 2026-08-30 --interval weekly
507
- audienti analytics metrics --cohort-preset week-to-date --user me --motion <motn_id> --play-tag <tag> --list <list_id> --offer <offr_id> --icp <icp_id> --social-cookie <scok_id> --platform linkedin --action messaging.message_sent --outcome succeeded_after_retry
508
- audienti analytics metrics --cohort-preset week-to-date --json
15
+ ```sh
16
+ audienti agent poll --profile "$HOME/.audienti/exo-agent.json"
17
+ audienti workspace list --profile "$HOME/.audienti/exo-agent.json"
18
+ audienti workspace use WORKSPACE_UUID --profile "$HOME/.audienti/exo-agent.json"
19
+ audienti tools balance --profile "$HOME/.audienti/exo-agent.json"
20
+ audienti profiles list --profile "$HOME/.audienti/exo-agent.json"
21
+ audienti skills show audienti
509
22
  ```
510
23
 
511
- This is an `events.created_at` root-operation cohort, and each operation is
512
- classified by its current outcome across all of its attempts. It is distinct
513
- from the `AccountProspect.created_at` entry cohorts used by dashboard, stages,
514
- and prospect cohort analysis. The command
515
- makes one authenticated request to the account Metrics API. Plain text formats
516
- only the returned cohort ranges, Operations, First-try success, Recovered, Final
517
- failures, In progress, Attempts, selected daily or weekly grid rows, action rows,
518
- and account-wide Social Cookie rows. `--json` prints the API response deeply
519
- unchanged; the CLI does not recalculate cohorts, outcomes, counts, or rates.
520
-
521
- The six leaf outcomes are `first_attempt_success`, `succeeded_after_retry`,
522
- `failed_without_retry`, `failed_after_retry`, `in_progress`, and `unresolved`.
523
- The `success` and `failure` values are umbrella filters over their corresponding
524
- two terminal leaf outcomes.
525
-
526
- For example, the human output uses the server-provided values directly:
527
-
528
- ```text
529
- Outbound metrics
530
- Cohort: 2026-08-24 to 2026-08-30 (events.created_at)
531
- Current: 2026-08-24T00:00:00-05:00 to 2026-08-31T00:00:00-05:00
532
- Previous: 2026-08-17T00:00:00-05:00 to 2026-08-24T00:00:00-05:00
533
- Operations: 1347
534
- First-try success: 1275 (94.7%)
535
- Recovered: 40 (3%)
536
- Final failures: 16 (1.2%)
537
- In progress: 16 (1.2%)
538
- Attempts: 1400
539
- ```
540
-
541
- To materialize a connection-request activity cohort as a reusable list selector,
542
- then reuse it in analytics:
543
-
544
- ```bash
545
- audienti analytics cohorts create-list --name "Connection requests 2026-07-01 to 2026-07-07" --event connection_request_sent --start 2026-07-01 --end 2026-07-07
546
- audienti analytics dashboard --list <list_id>
547
- audienti analytics prospects --list <list_id> --window 30d
548
- audienti analytics users --user me --list <list_id> --start 2026-07-01 --end 2026-07-31
549
- ```
550
-
551
- For prospect, dashboard, and stages analytics, use `--cohort-start` and
552
- `--cohort-end` when the cohort is based on when people entered Audienti, a
553
- motion, or a receiving segment. Use `analytics cohorts
554
- create-list` followed by `--list` when the cohort is based on an event that
555
- happened later, such as connection requests sent in a date range. Rebuild the
556
- list when the event definition or date window changes so the analytics question
557
- stays auditable.
558
-
559
- `audienti setup play preflight` includes the selected sender's server-derived
560
- working schedule under `social_cookie.automation`, including `active_days`,
561
- normalized `working_hours`, effective `time_zone`, and current
562
- `in_working_hours` state. The human-readable output reports the same timezone,
563
- today's window, and whether provider execution is currently inside the window.
564
- It also reports the configured user fallback location, the connected account's
565
- configured and last-verified effective proxy geography, and the proxy source
566
- without exposing proxy URLs, credentials, egress IPs, or browser session data.
567
- For authorized LinkedIn account owners and admins, `social_cookie.capabilities.linkedin`
568
- reports Audienti's stored `premium` and `sales_navigator` booleans plus the
569
- `checked_at` timestamp. Text output shows yes, no, or unknown and when detection
570
- last ran. Null or missing values mean unknown, including older server responses
571
- and unavailable access. These are stored observations that may be stale;
572
- preflight does not perform a fresh provider check. `--json` preserves the server
573
- payload unchanged.
574
- For LinkedIn, `social_cookie.automation.pacing` includes effective weekly
575
- quotas, daily targets, motion active days, the outstanding-invitation cap, ramp
576
- configuration, current outstanding inventory, any inventory blocker, and current
577
- invitation capacity calculated by the server. A `null` weekly quota means
578
- unlimited.
579
-
580
- For an email social cookie, `social-cookies sync-messages` requests the shared
581
- account-scoped cookie/folder sync slot and prints the server's durable status.
582
- Pass `--folder` to select a provider folder and `--retry` only when an explicit
583
- retry is intended. The command does not call a provider directly; `--json`
584
- returns the accepted request and `sync_states` payload unchanged.
24
+ Approval initially grants read access. For CRM writes or paid tools, grant the agent
25
+ workspace access on your Agents page. Workspace policy and current permissions still
26
+ apply. Only a verified human Admin can purchase or redeem credits through Billing.
27
+ Paid calls spend shared workspace credits; development credits are local-only.
585
28
 
586
- Use `users automation` to inspect or change one account user's LinkedIn safety
587
- policy without changing the saved account selection:
588
-
589
- ```bash
590
- audienti users automation show 136 --platform linkedin --json --account acct_example
591
- audienti users automation update 136 --payload automation-controls.json --json --account acct_example
592
- audienti users automation update 136 --payload automation-controls.json --apply --json --account acct_example
593
- ```
594
-
595
- `update` is preview-only unless `--apply` is present. The CLI always sends
596
- `platform: "linkedin"` and an explicit `apply` boolean after the file fields,
597
- so a payload file cannot silently opt into applying a change. The server scopes
598
- the connected account through the selected account plus account user, preserves
599
- omitted controls, returns the before and proposed/actual after states, and
600
- records an audit event only for an applied update. `--json` prints the server
601
- payload unchanged.
602
-
603
- Follow (including unfollow) and invitation withdrawal are enabled by default. Set
604
- `follow_autopilot_enabled` or `withdraw_connection_autopilot_enabled` to `false`
605
- to disable that action. These preferences still respect automatic sending and
606
- other execution limits; follows also require visibility automation.
607
-
608
- An `automation-controls.json` warm-up payload can use every automation gate,
609
- independent action limits, an aggregate visibility limit, and a weekly ramp:
610
-
611
- ```json
612
- {
613
- "automation_controls": {
614
- "automatic_sending_enabled": false,
615
- "visibility_operations_autopilot_enabled": true,
616
- "follow_autopilot_enabled": true,
617
- "withdraw_connection_autopilot_enabled": true,
618
- "post_comment_autopilot_enabled": false,
619
- "connection_request_autopilot_enabled": false,
620
- "inmail_autopilot_enabled": false,
621
- "direct_message_autopilot_enabled": false,
622
- "email_sending_autopilot_enabled": false,
623
- "manual_action_handoff_enabled": false,
624
- "risk_cooldown_enabled": true
625
- },
626
- "action_limits": {
627
- "profile_view": { "hourly": 2, "daily": 4, "weekly": 20 },
628
- "follow": { "hourly": 2, "daily": 3, "weekly": 15 },
629
- "like": { "hourly": 1, "daily": 2, "weekly": 10 },
630
- "invite": { "hourly": 1, "daily": 2, "weekly": 10 },
631
- "message": { "hourly": 1, "daily": 2, "weekly": 10 },
632
- "comment": { "hourly": 1, "daily": 1, "weekly": 5 },
633
- "visibility": { "hourly": 3, "daily": 8, "weekly": 40 }
634
- },
635
- "visibility_ramp": {
636
- "enabled": true,
637
- "starting_daily_limit": 8,
638
- "weekly_increment": 2
639
- }
640
- }
641
- ```
642
-
643
- `follow` covers follows and unfollows; `like` covers likes and unlikes;
644
- `message` covers messages and InMail. `visibility` is the aggregate cap across
645
- profile views, follows/unfollows, and likes/unlikes. The show/preview readback
646
- includes configured, default, effective, used, and remaining hourly, daily,
647
- and weekly values plus the currently binding limits.
648
-
649
- Motion update payload mode can replace the selected principal and backing list:
29
+ To connect an MCP client, use this command and environment after selecting a workspace:
650
30
 
651
31
  ```json
652
32
  {
653
- "principal_account_user_id": 136,
654
- "list_id": "list_abc123"
33
+ "command": "audienti-mcp",
34
+ "env": { "AUDIENTI_PROFILE": "/absolute/path/to/.audienti/exo-agent.json" }
655
35
  }
656
36
  ```
657
37
 
658
- The principal and list are resolved inside the selected account. Use
659
- `"list_id": null` to clear the backing list.
660
-
661
- To inspect the account's current prospect mix by motion type and compare it
662
- with the rolling seven-day recorded-source contribution:
663
-
664
- ```bash
665
- audienti analytics motions
666
- audienti analytics motions --json
667
- ```
668
-
669
- Current Unattributed counts mean no current motion association. Rolling
670
- seven-day Unattributed counts mean no attributable recorded source motion; the
671
- server falls back to the current motion only when recorded source data is
672
- blank.
673
-
674
- To inspect the account's current prospect mix by source ICP and compare it
675
- with the rolling seven-day source contribution:
676
-
677
- ```bash
678
- audienti analytics icps
679
- audienti analytics icps --json
680
- ```
681
-
682
- Unattributed means no attributable account source ICP. The server falls back
683
- to the current motion ICP only when recorded ICP source data is blank.
684
-
685
- To see whether one motion is producing prospects by day, and where each
686
- produced-day cohort currently sits in the funnel:
687
-
688
- ```bash
689
- audienti motions analytics <motn_id>
690
- ```
691
-
692
- To count the people and distinct companies currently targeted by one campaign
693
- tag without waiting on the web dashboard filter:
694
-
695
- ```bash
696
- audienti analytics dashboard --play-tag wine_campaign --cohort-start 2026-07-01 --cohort-end 2026-07-07
697
- ```
698
-
699
- To queue an immediate discovery run for a motion through the same launch gate
700
- used by the operator surface:
701
-
702
- ```bash
703
- audienti motions run-discovery <motn_id>
704
- ```
705
-
706
- Outbound, inbound, and LOPA motions are accepted only when their current
707
- configuration and discovery producer are executable. An accepted response
708
- includes a durable `run` receipt that starts in `pending` before the discovery
709
- job is queued. Rejected launches exit nonzero and report the authoritative
710
- `reason`, optional `next_eligible_at`, and `suggested_action`; `--json` preserves
711
- that structured response on stdout for automation. Completed receipts keep
712
- candidate `submitted_count` separate from the current persisted
713
- `promoted_count`, and expose completed, failed, and blocked scope counts.
714
-
715
- To check whether a motion has executable configuration before preparing,
716
- activating, or running discovery:
717
-
718
- ```bash
719
- audienti motions status <motn_id>
720
- audienti motions status <motn_id> --json
721
- ```
722
-
723
- The JSON response includes `executable_configuration.valid` plus a reason when
724
- the config is incomplete, such as missing outbound signals or missing LOPA
725
- tracked profile URLs. Its latest discovery receipt uses the same submitted,
726
- promoted, and scope outcome fields as `run-discovery`.
727
-
728
- To create and launch a quick-start motion from a company URL:
729
-
730
- ```bash
731
- audienti motions quick-start --url https://example.com --wait --confirm
732
- ```
733
-
734
- To create or update an ICP from a rich JSON payload:
735
-
736
- ```bash
737
- audienti icps create --payload icp.json
738
- audienti icps update <icp_id> --payload icp-patch.json
739
- audienti icps list --status all
740
- audienti icps archive <icp_id>
741
- audienti icps restore <icp_id>
742
- ```
743
-
744
- `icps update --payload` accepts the same human-readable facet keys as create.
745
- Supplied facet collections, such as `company_sizes_attributes`, replace that
746
- collection in place; omitted fields and collections remain unchanged. Invalid
747
- lookup values fail server-side without partially applying the patch.
748
- Archive is reversible and is the normal cleanup action. It removes the ICP from
749
- new selection, closes active primary motions so admitted work can drain,
750
- archives inactive primary motions, and preserves secondary motion links.
751
- Restoring the ICP does not reactivate motions.
752
-
753
- To audit one account user's outbound actions, optionally narrowed to one motion
754
- and one AccountProspect.created_at cohort:
755
-
756
- ```bash
757
- audienti analytics users --user me --start 2026-07-01 --end 2026-07-07 --cohort-start 2026-06-01 --cohort-end 2026-06-30 --motion <motn_id>
758
- ```
759
-
760
- To start a report-backed writer session for one prospect, including the no-reply
761
- path, planned actions, channel changes, and planned message rows:
762
-
763
- ```bash
764
- audienti writer test-run <prsp_id>
765
- ```
766
-
767
- The output includes a `Report: rprt_...` id. Treat that report id as the writing
768
- session handle while the generated report is retained.
769
-
770
- To draft every message into that report-backed session, opt into full report
771
- mode:
772
-
773
- ```bash
774
- audienti writer test-run <prsp_id> --mode report --report <rprt_id>
775
- ```
776
-
777
- For writer debugging, draft only one selected timeline row on one branch into
778
- the same report:
779
-
780
- ```bash
781
- audienti writer test-run <prsp_id> --mode step --branch no-accept --step 3 --report <rprt_id>
782
- ```
783
-
784
- The CLI queues the report job on the API and polls until the report finishes, so
785
- slower writer calls do not depend on a single long HTTP request. Use
786
- `--timeout-seconds <n>` to adjust the CLI wait budget.
787
-
788
- To queue work into the report and come back later:
789
-
790
- ```bash
791
- audienti writer test-run <prsp_id> --mode step --branch no-accept --step 3 --report <rprt_id> --no-wait
792
- ```
793
-
794
- If the CLI stops waiting before the server job finishes, fetch the completed
795
- report later with:
796
-
797
- ```bash
798
- audienti writer test-run show <prsp_id> <rprt_id>
799
- ```
800
-
801
- To update a prospect's attached profile channels through the same paths used by
802
- the prospect show page:
803
-
804
- ```bash
805
- audienti prospects add-profile <prsp_id> --url prospect@example.com
806
- audienti prospects add-profile <prsp_id> --url +12025550123
807
- audienti prospects add-profile <prsp_id> --url https://www.linkedin.com/in/example
808
- audienti prospects report-bad-profile <prsp_id> <prof_id>
809
- ```
810
-
811
- To queue a personal LinkedIn profile authority review and ICP-fit positioning
812
- blueprint, then check whether it is waiting on enrichment, running, completed,
813
- or failed:
814
-
815
- ```bash
816
- audienti tools list
817
- audienti tools linkedin-review --url https://www.linkedin.com/in/example --icp <icp_id>
818
- audienti tools linkedin-review reports
819
- audienti tools linkedin-review show <rprt_id>
820
- audienti tools linkedin-review status <rprt_id>
821
- ```
822
-
823
- To reassign or clear ownership for existing prospects:
824
-
825
- ```bash
826
- audienti prospects assign <prsp_id> --assigned-user <account_user_id|me>
827
- audienti prospects assign <prsp_id> --assigned-user unassign
828
- ```
829
-
830
- To preview moving a prospect and its account-scoped history into another
831
- account where you are also an administrator:
832
-
833
- ```bash
834
- audienti prospects move-account <prsp_id> --account <source_acct_id> --target-account <target_acct_id>
835
- audienti prospects move-account <prsp_id> --account <source_acct_id> --target-account <target_acct_id> --assigned-user me --target-motion <motn_id> --target-list <list_id> --apply
836
- ```
837
-
838
- The command is preview-only unless `--apply` is present. Apply always requests
839
- a fresh preview first and submits the returned `manifest_digest`, so a move is
840
- rejected when the underlying state changes. `--json` prints the preview or final
841
- apply response unchanged.
842
-
843
- To make emergency prospect state changes without going through a motion:
844
-
845
- ```bash
846
- audienti prospects set-status <prsp_id> --status nurture
847
- audienti prospects set-status <prsp_id> --status not_fit
848
- audienti prospects lock <prsp_id> --note "Emergency hold"
849
- audienti prospects unlock <prsp_id>
850
- ```
851
-
852
- To manage account DNC and company disposition rules from the CLI:
853
-
854
- ```bash
855
- audienti dnc add prospect@example.com
856
- audienti dnc import --file dnc.txt
857
- audienti company-rules create --linkedin-url https://www.linkedin.com/company/example --disposition monitor
858
- audienti company-rules create --domain example.com --disposition not_fit --user me
859
- audienti company-rules apply --all
860
- ```
861
-
862
- The direct intake action supports the same destination names and optional experiment:
863
-
864
- ```bash
865
- audienti prospects intake --url https://www.linkedin.com/in/example --new-list "Target list" --new-transition "Fit transition" --json
866
- ```
867
-
868
- Use `--motion <motn_id>` for an existing experiment. Explicit new names, including blank names, are sent to the API for validation.
869
-
870
- To import multiple LinkedIn people through the same per-prospect import path:
871
-
872
- ```bash
873
- audienti prospects import-batch --file prospects.csv --new-list "Target list" --new-transition "Fit transition" --assigned-user me
874
- ```
875
-
876
- CSV files should include a `linkedin_url` or `url` header. Optional row columns
877
- `list_id`, `motion_id`, `new_list_name`, `new_transition_name`, and `assigned_user_id` override command defaults. The command parses the file and sends one batch request; the API owns validation, destination creation, row outcomes, and queueing.
878
-
879
- ## Compatibility
880
-
881
- The CLI talks to the versioned Audienti `/api/v1` contract at
882
- `https://app.audienti.com` by default. A release occurs only after the matching
883
- server deploy succeeds.
884
-
885
- The canonical source lives with the Audienti application under
886
- `packages/audienti-cli`. This public repository is a CI-managed mirror; direct
887
- changes are unsupported and cause the next source release to fail safely.
888
-
889
- ## Plugins
890
-
891
- This repository includes Codex and Claude Code plugin manifests plus an
892
- `audienti` skill. The plugin provides workflow instructions; it does not grant
893
- credentials or silently authenticate an agent.
894
-
895
- ## License
896
-
897
- Copyright (c) 2026 OMALab, Inc. All rights reserved. See [LICENSE](LICENSE).
898
-
899
- Batch import accepts up to 50 rows per API request. Split larger files before importing. Row destination IDs or new names override batch defaults; failed rows stay visible in the response.
900
- Bulk destinations: `audienti prospects set-destination <prsp_id> --type list --destination <list_id>` adds by default. Use `--name "New list"` to create a list, `--type experiment --name "Existing relationships"` to create a transition without setup, or `--mode move` for explicit reassignment. Add preserves existing memberships; experiment Add skips people assigned elsewhere.
901
-
902
- Create a child workspace with `audienti accounts create --name <name> --parent <name-or-id> [--json]`. The parent can be a visible name, unique name fragment, numeric ID, or prefixed ID. You must administer a root team account. All parent admins receive access to the child; ordinary members do not. Ambiguous names show matching IDs and stop. A duplicate child name under the same parent fails clearly. The response includes the new account ID. Creation keeps your selected account unchanged: use `audienti accounts select <new_acct_id>` or `--account <new_acct_id>` before creating a motion there.
903
-
904
- ### Credit history and root approvals
905
-
906
- `audienti credits history` lists credit charges. `credits show <usage_id>` opens an
907
- exact receipt. A root billing role does not grant access to private saved results.
908
- `credits approvals` shows action prices and changed-payer requests. After the
909
- root billing admin explicitly agrees, use `credits accept-price <price_id>` or
910
- `credits approve-payer <operation_id> --revision <revision> --request-key <unique_key>`.
911
- Approval never resumes waiting work. Increased prices also require the notice period.
38
+ Restart the MCP process after changing workspace or credentials. Tools may appear
39
+ in the catalog before the agent has permission to invoke them. The server remains
40
+ authoritative. Agent-executable skills are in `skills/audienti`; helpers do not call
41
+ providers or execute hidden workflows.
912
42
 
913
- Omalab staff can use `credits refund-review <usage_id>` to inspect the exact charge,
914
- result and previous reviews. After confirming a defect, `credits refund <usage_id>
915
- --cumulative-principal <exact_credits> --evidence-token <uuid> --reason <reason>
916
- --evidence <exact_result_evidence>` records the cumulative credit return. Customer
917
- billing admins cannot use these staff actions. This never refunds cash.
43
+ Start with saved-record reads and inspect the credit balance. Explicit enrichment
44
+ uses the configured hosted provider; registration of an external agent-managed
45
+ connection does not configure a hosted provider or imply successful synchronization.