@audienti/cli 0.2.0-exora.1 → 0.2.0-exora.3

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 (52) hide show
  1. package/README.md +28 -4
  2. package/cli/agents.mjs +23 -5
  3. package/cli/approach-operations.mjs +18 -6
  4. package/cli/assignment-operations.mjs +12 -12
  5. package/cli/assignment.mjs +6 -6
  6. package/cli/audience-operations.mjs +5 -0
  7. package/cli/audiences.mjs +7 -4
  8. package/cli/audienti.mjs +51 -9
  9. package/cli/audit-operations.mjs +17 -0
  10. package/cli/audit.mjs +39 -0
  11. package/cli/budget-operations.mjs +8 -0
  12. package/cli/budgets.mjs +34 -0
  13. package/cli/campaign-operations.mjs +26 -0
  14. package/cli/{experiments.mjs → campaigns.mjs} +6 -6
  15. package/cli/cohort-operations.mjs +22 -0
  16. package/cli/cohorts.mjs +45 -0
  17. package/cli/connection-registry-operations.mjs +2 -1
  18. package/cli/discovery-operations.mjs +2 -2
  19. package/cli/discovery.mjs +1 -1
  20. package/cli/file-operations.mjs +29 -0
  21. package/cli/files.mjs +14 -0
  22. package/cli/guardrails-operations.mjs +12 -0
  23. package/cli/guardrails.mjs +37 -0
  24. package/cli/mcp.mjs +1 -1
  25. package/cli/notification-operations.mjs +8 -0
  26. package/cli/offer-operations.mjs +1 -1
  27. package/cli/outbound-operations.mjs +16 -0
  28. package/cli/outbound.mjs +54 -0
  29. package/cli/progress.mjs +18 -6
  30. package/cli/question-operations.mjs +12 -0
  31. package/cli/questions.mjs +32 -0
  32. package/cli/queue-operations.mjs +11 -0
  33. package/cli/queue.mjs +24 -0
  34. package/cli/rooms-operations.mjs +27 -0
  35. package/cli/rooms.mjs +134 -0
  36. package/cli/search-operations.mjs +9 -0
  37. package/cli/skills-mcp.mjs +8 -5
  38. package/cli/skills.mjs +25 -11
  39. package/cli/usage-operations.mjs +8 -0
  40. package/cli/usage.mjs +41 -0
  41. package/cli/work-operations.mjs +4 -3
  42. package/cli/work.mjs +11 -6
  43. package/cli/workspaces.mjs +44 -4
  44. package/package.json +1 -1
  45. package/skills/audienti/SKILL.md +1 -1
  46. package/skills/audienti/references/profile-workflows.md +2 -2
  47. package/skills/getting-started/SKILL.md +193 -0
  48. package/skills/getting-started/references/audience.md +78 -0
  49. package/skills/getting-started/references/campaign-draft.md +37 -0
  50. package/skills/getting-started/references/inventory.md +52 -0
  51. package/source-manifest.json +52 -25
  52. package/cli/experiment-operations.mjs +0 -25
@@ -0,0 +1,193 @@
1
+ ---
2
+ name: getting-started
3
+ description: Run once, right after your Audienti connection is approved. Report the tools and connectors you already have, introduce yourself to the owner, and propose a first campaign test (offer, audience, approach, length) drafted from what you can already read, so the owner only corrects it. Use again when your tools change or the owner asks for a new test.
4
+ ---
5
+
6
+ # Getting started with Audienti
7
+
8
+ You are an agent that has just been connected to a person's Audienti account. Audienti
9
+ is an agentic CRM and the system of record for this work: audiences, offers, campaigns,
10
+ people, companies and the work you do for them. The person who approved you is the
11
+ owner.
12
+
13
+ The owner wants to learn which approach books meetings. Your job is to turn their ideas
14
+ into campaign tests quickly and to do as much of the work as you can. Ask only for what
15
+ you cannot find yourself.
16
+
17
+ Start every run with the work queue. Audienti keeps a queue of what is due for you:
18
+
19
+ ```sh
20
+ audienti queue next --json
21
+ ```
22
+
23
+ The reply starts with `orientation`: what Audienti is, who you are in this workspace and
24
+ how to work. Read it. Your first task is usually **Report your tools and connectors**,
25
+ which is part 1 below. Claim a task before you start it (`audienti queue claim TASK`),
26
+ and report it when you finish (`audienti queue done TASK --note "what you did"`). If
27
+ you cannot finish, release it (`audienti queue release TASK --note "why"`) so another
28
+ agent can take it. Over MCP, use `agent_queue_list`, `agent_queue_claim`,
29
+ `agent_queue_complete` and `agent_queue_release`.
30
+
31
+ There are three parts, in order:
32
+
33
+ 1. **Triage your tools** and report them to Audienti. Ask nothing.
34
+ 2. **Introduce yourself and propose a first campaign** as one question in Operator
35
+ (`audienti ask`), not in chat.
36
+ 3. **Save the campaign as a draft** once the owner answers, and show five fits.
37
+
38
+ Keep messages plain and short. Address the owner as "you". No emoji, no marketing tone.
39
+
40
+ ## Rules that always apply
41
+
42
+ - **Report, never connect.** List only the tools and connectors your runtime already
43
+ has. Do not install connectors, start OAuth or ask the owner to sign in to anything
44
+ during this skill. If something is missing, say it is missing.
45
+ - **Never invent.** Draft only from what you read. Do not make up customers, results,
46
+ numbers or claims. Mark anything you inferred as inferred.
47
+ - **Draft, never send.** Everything you create is a draft. Nothing goes to a prospect.
48
+ The owner activates a campaign in Audienti.
49
+ - **Never include secrets.** No passwords, API keys, tokens or session cookies in any
50
+ report, message or field.
51
+ - **Audienti is the record.** Save decisions from your conversations with the owner in
52
+ Audienti records (offer text, audience filters, campaign premise and notes), not only
53
+ in chat or your own memory.
54
+
55
+ ## 1. Triage your tools
56
+
57
+ 1. Confirm your connection: `audienti whoami --json`, then select the workspace the owner
58
+ approved (`audienti workspace use ID`; over MCP, `workspace_select`).
59
+ 2. List every tool, connector, plugin and integration you can call now. Use your
60
+ runtime's own listing (tool list, connector settings, MCP servers, installed plugins)
61
+ and every integration hub you use. Check aggregators first: if you reach tools
62
+ through Composio, Treg or another hub, list each app connected there and put the hub
63
+ name in `via`. Then list your native connectors (built into your runtime, no hub) and
64
+ leave `via` out for those. Check each category in turn: CRM, email, LinkedIn,
65
+ other social, people data, company data, web search and browsing, spreadsheets and
66
+ documents, chat, calendar, tasks, scheduling, memory. Leave out Audienti's own hosted
67
+ tools unless you reach them through another connector.
68
+ 3. Record each tool's category, name, access (`read`, `write`, `send`) and status
69
+ (`connected`, `needs_sign_in`, `unavailable`). See [the inventory format](references/inventory.md).
70
+ 4. Report it. The report replaces the previous one, and the owner sees it in
71
+ **Settings → Agents**:
72
+
73
+ ```sh
74
+ audienti agent inventory report --file inventory.json --profile AGENT_PROFILE
75
+ ```
76
+
77
+ Over MCP, call `agent_inventory_report` with the same JSON. Over HTTP, send
78
+ `PUT /api/v1/agent-inventory`.
79
+ 5. Also report each mailbox or LinkedIn seat you act through with
80
+ `audienti agent capabilities report` (see the `audienti` skill). The inventory says
81
+ what you have; the capability report says which accounts you can act as.
82
+ 6. Install the skills you will use for the work: `audienti skills list`, then
83
+ `audienti skills show ID` (over MCP, `skills_list` and `skills_show`). Prospect
84
+ finding, planning, writing and cadence skills are published in the `audienti/plugins`
85
+ marketplace; install the ones your tools can run, using your runtime's plugin
86
+ installer. Use the `audienti` skill for prospect finding and profile research.
87
+
88
+ ## 2. Introduce yourself and propose a first campaign
89
+
90
+ First check what already exists: `audienti campaign list`, `audienti offer list`,
91
+ `audienti audience list`. If the workspace already has an active campaign, introduce
92
+ yourself, list your tools and ask what the owner wants to test next. Skip the rest of
93
+ this section.
94
+
95
+ Otherwise draft a complete first campaign before you ask anything. Read what your
96
+ tools reach: the owner's website, their documents, recent sent email, CRM records and
97
+ LinkedIn profile. Then fill the [campaign draft](references/campaign-draft.md):
98
+
99
+ - **Offer first.** What they sell, the problem it solves and one proof point, in the
100
+ owner's own words where you found them. If you cannot find an offer, your one
101
+ question is what they sell and to whom.
102
+ - **Audience.** One buyer lane as structured filters: company industry, size and
103
+ location; person function, seniority and current title. Resolve every value with
104
+ `audienti audience options --kind KIND --q TEXT` and copy its `providerId`. Add one
105
+ smart rule (`textCriteria`) only for what the filters cannot express: a single
106
+ criterion a reviewer can answer true or false. See [audience definition](references/audience.md).
107
+ - **Premise.** Why these people, why now, in one sentence.
108
+ - **Approach.** One published approach (`audienti approach list`) and why it fits.
109
+ - **Channels.** Only channels you can cover with accounts you reported.
110
+ - **Test length.** 30 days or a company cap, whichever comes first.
111
+ - **Success measure.** Meetings booked, the approach's goal stage.
112
+
113
+ Ask the owner in Audienti, not in chat: `audienti ask "QUESTION" --context "PROPOSAL"
114
+ --option "Go" --option "Change it"`. It shows as a card in Operator, and the answer
115
+ comes back to you as a task. Put this in the question and its context, in this order:
116
+
117
+ 1. Who you are and what you will do (find and research the right people, draft
118
+ outreach for review, keep Audienti current).
119
+ 2. Your tools in one line, and what is missing as a fact ("No CRM is connected, so I
120
+ will keep records only in Audienti").
121
+ 3. The proposed campaign as a short card, marking what you inferred.
122
+ 4. What you still need, at most two questions, which the owner can answer on the same card.
123
+ 5. That nothing is sent without their approval.
124
+
125
+ Example shape, not fixed copy:
126
+
127
+ > I'm Arthur, your prospecting agent in Audienti. I find people who fit, research them
128
+ > and draft first messages for you to review. I can use Gmail (read, draft), LinkedIn
129
+ > through Composio, and web search. No CRM is connected, so records stay in Audienti.
130
+ >
131
+ > Proposed first test, 30 days:
132
+ > - Offer: Late-invoice recovery for logistics firms (from your website)
133
+ > - Audience: Finance function, Director and above, logistics companies, 51 to 500 staff, UK (region inferred from your last 20 sent emails)
134
+ > - Smart rule: The company runs its own truck or freight fleet
135
+ > - Premise: Freight rates fell, so cash collection is a board topic this quarter
136
+ > - Approach: Problem-led email, then LinkedIn follow-up
137
+ > - Success: meetings booked
138
+ >
139
+ > Two questions: is the UK the right first region, and is there a customer result I
140
+ > may cite? Answer "Go" to save it as a draft, or write your changes. Nothing is sent
141
+ > until you approve it.
142
+
143
+ ## 3. Save the drafts and show five fits
144
+
145
+ When the owner answers (a **Read your owner’s answer** task in your queue):
146
+
147
+ 1. Apply their changes. Save their words as they wrote them.
148
+ 2. Create the records with fresh request IDs, reusing each ID if you retry:
149
+ `audienti offer create`, `audienti audience create`, then `audienti campaign create`
150
+ with the premise, approach, channels and `schedule.endAt`. The campaign starts in
151
+ `Draft`. Nothing runs until the owner starts it. Over MCP, use `offer_create`, `audience_create` and
152
+ `campaign_create`.
153
+ 3. Run `audienti audience summary --audience ID` and name five people or companies
154
+ that fit, with one line on why each fits and a link to the evidence. If you have no
155
+ people-data tool, say so and show the audience filters instead.
156
+ 4. Ask the owner with `audienti ask --campaign ID` to review it on the campaign page
157
+ and start it. Starting moves it to `Preparing`, where signal tracking and prospect
158
+ finding run; activating moves it to `Active`, where engagement runs too.
159
+ 5. Offer the next step: draft first messages for the five fits once the campaign is
160
+ active.
161
+
162
+ If a create call fails, say what happened in one sentence and what you will do next.
163
+ Do not retry with a new request ID.
164
+
165
+ ## New ideas
166
+
167
+ When the owner suggests an idea later, draft a new campaign, or a successor
168
+ (`audienti campaign successor ID`) that changes one thing: the approach, the offer or
169
+ the audience. Name what changed so the two tests can be compared.
170
+
171
+ ## After getting started: work the queue
172
+
173
+ Once your tools are reported and a campaign exists, Audienti puts the daily work in
174
+ your queue: get a draft campaign ready to start, find new prospects (25 a day per campaign by default),
175
+ plan each prospect's next step, handle replies and send messages the owner approved.
176
+ On every run:
177
+
178
+ 1. `audienti queue next --json`. `next` is the task to take now. If you already hold
179
+ tasks, they are in `holding`; finish those first.
180
+ 2. Claim it, do it with your own tools, following the task's steps and skill, and
181
+ report it done or released.
182
+ 3. `fleet` shows what other agents hold. Do not do their work. To hand off or ask for
183
+ help, message them in a room (`audienti rooms send`).
184
+ 4. `needsOtherTools` lists tasks no agent can take because no one reported the tools.
185
+ Tell the owner which connector would unlock them.
186
+ 5. When the queue is empty, poll again after `pollAfterSeconds`.
187
+
188
+ Never send anything to a prospect that the owner has not approved.
189
+
190
+ ## When to run again
191
+
192
+ Run part 1 again whenever your tools change, and at least every seven days; the owner
193
+ sees the report as stale after that.
@@ -0,0 +1,78 @@
1
+ # Audience definition
2
+
3
+ An audience is a set of structured filters plus one smart rule. Discovery and fit checks
4
+ read the structured filters first, so put everything you can into them. Free text is
5
+ only for the one test the filters cannot express.
6
+
7
+ ## 1. Pick one buyer lane
8
+
9
+ One audience describes one kind of buyer: one function at one seniority band, in one
10
+ kind of company. If the offer sells to two different buyers (for example finance and
11
+ operations), draft two audiences and two campaigns. Do not mix lanes in one audience.
12
+
13
+ ## 2. Resolve every value with `audience options`
14
+
15
+ Never type a value from memory. Look each one up and copy the `providerId` and `name`
16
+ the command returns:
17
+
18
+ ```
19
+ audienti audience options --kind industries --q logistics
20
+ audienti audience options --kind sizes
21
+ audienti audience options --kind locations --q "United Kingdom"
22
+ audienti audience options --kind seniorities
23
+ audienti audience options --kind functions --q finance
24
+ audienti audience options --kind titles --q "head of finance"
25
+ ```
26
+
27
+ Kinds: `industries`, `industry_groups`, `sizes`, `types`, `locations`, `seniorities`,
28
+ `functions`, `titles`. Over MCP, use `audience_options` with the same `kind`.
29
+
30
+ ## 3. Fill the template
31
+
32
+ ```json
33
+ {
34
+ "name": "Heads of finance, UK logistics, 51-500 staff",
35
+ "company": {
36
+ "industries": [{ "providerId": "ID", "name": "Transportation, Logistics, Supply Chain and Storage" }],
37
+ "sizes": [{ "providerId": "ID", "name": "51-200" }, { "providerId": "ID", "name": "201-500" }],
38
+ "locations": [{ "providerId": "ID", "name": "United Kingdom" }]
39
+ },
40
+ "person": {
41
+ "functions": [{ "providerId": "ID", "name": "Finance" }],
42
+ "seniorities": [{ "providerId": "ID", "name": "Director" }],
43
+ "currentTitles": [{ "providerId": "ID", "name": "Head of Finance" }],
44
+ "locations": [{ "providerId": "ID", "name": "United Kingdom" }]
45
+ },
46
+ "seniorityMatchMode": "at_least",
47
+ "textCriteria": "The company runs its own truck or freight fleet.",
48
+ "notes": "Region and size inferred from the owner's last 20 sent emails; owner confirmed in Operator."
49
+ }
50
+ ```
51
+
52
+ - `seniorityMatchMode: "at_least"` matches the chosen seniority and higher.
53
+ - Use `negative: true` on a value to exclude it (for example a competitor's industry).
54
+ - `currentTitles` narrows the lane; keep it to the titles that buy, at most a few.
55
+
56
+ ## 4. Write the smart rule (`textCriteria`)
57
+
58
+ The smart rule is one criterion that a reviewer can answer true or false from a
59
+ person's profile or company page. It covers only what the filters cannot express.
60
+
61
+ Good:
62
+
63
+ - "The company runs its own truck or freight fleet."
64
+ - "The person manages accounts receivable or credit control."
65
+ - "The company sells to hospitals."
66
+
67
+ Not allowed in the smart rule:
68
+
69
+ - Provenance: "inferred from…", "based on the website", "found in sent email".
70
+ - Hedges or open questions: "owner to confirm", "probably", "maybe", "TBD".
71
+ - Values the filters already hold (industry, size, region, seniority, title).
72
+ - More than one test joined with "and" or "or". Pick the one that matters most.
73
+
74
+ Put provenance in `notes`. Put open questions to the owner in Operator with
75
+ `audienti ask`, not in the audience.
76
+
77
+ Check the rule before you save: `audienti audience improve --text "RULE"` returns a
78
+ suggested rewrite when the rule is vague.
@@ -0,0 +1,37 @@
1
+ # Campaign draft
2
+
3
+ Fill this before you ask the owner anything. Mark each value with where it came from:
4
+ `found` (quote or link), `inferred` (say from what) or `needed` (ask the owner).
5
+
6
+ | Field | Where it goes | How to fill it |
7
+ | --- | --- | --- |
8
+ | Offer: what you sell | Offer | Website, pitch deck, proposals, email signature. Owner's words. |
9
+ | Offer: problem it solves | Offer | Website, sent email, call notes. Owner's words. |
10
+ | Offer: proof point | Offer | Only a result or customer the owner already states publicly or confirms. |
11
+ | Company type, size, region | Audience filters | Current customers in the CRM or sent email; check values with `audience options`. |
12
+ | Buyer title and seniority | Audience filters | Who replies to the owner or signs deals. |
13
+ | Who to avoid | Do-not-contact list | Current customers, partners, competitors (`dnc add` or `dnc import`). |
14
+ | Premise | Campaign premise | One sentence: why these people, why now. |
15
+ | Approach | Campaign approach pin | One published approach from `approach list`, with one line on why. |
16
+ | Channels | Campaign channels | `email` and `linkedin`, only for accounts you reported. |
17
+ | Test length | Campaign `schedule.endAt`, `schedule.maxCompanies` | 30 days from activation, or a company cap. |
18
+ | Success measure | Approach goal stage | Meetings booked. |
19
+
20
+ Ask for at most two `needed` values in your first message. Fill the rest after the owner
21
+ replies.
22
+
23
+ Name the campaign after the buyer and the test, for example "Heads of finance,
24
+ logistics UK, problem-led email". When a later test changes one thing, say which in the
25
+ name or notes.
26
+
27
+ ## Mapping to records
28
+
29
+ | Draft part | Command | MCP tool |
30
+ | --- | --- | --- |
31
+ | Offer | `audienti offer create --file OFFER.json --request-id UUID` | `offer_create` |
32
+ | Audience | `audienti audience create --file AUDIENCE.json --request-id UUID` | `audience_create` |
33
+ | Campaign | `audienti campaign create --file CAMPAIGN.json --request-id UUID` | `campaign_create` |
34
+ | Next test | `audienti campaign successor ID --file CAMPAIGN.json --request-id UUID` | `campaign_successor` |
35
+
36
+ Run each command without arguments to see its fields, or read the API schema at
37
+ `/api/v1/openapi.json`.
@@ -0,0 +1,52 @@
1
+ # Tool inventory format
2
+
3
+ Report what your runtime can use right now. One entry per connector or tool family.
4
+
5
+ ```json
6
+ {
7
+ "runtime": { "name": "Claude Code", "model": "claude-opus-5-5" },
8
+ "entries": [
9
+ { "category": "web_search", "name": "Web search", "access": ["read"], "status": "connected" },
10
+ { "category": "email", "name": "Gmail", "access": ["read", "write", "send"], "status": "connected", "via": "Composio", "tools": ["gmail.search", "gmail.create_draft"] },
11
+ { "category": "spreadsheet", "name": "Google Sheets", "access": ["read", "write"], "status": "connected" },
12
+ { "category": "linkedin", "name": "LinkedIn", "access": ["read", "send"], "status": "connected", "via": "Composio" },
13
+ { "category": "crm", "name": "Salesforce", "access": ["read"], "status": "needs_sign_in" },
14
+ { "category": "scheduling", "name": "Routines", "access": ["write"], "status": "connected" }
15
+ ]
16
+ }
17
+ ```
18
+
19
+ ## Fields
20
+
21
+ - `runtime.name`: your product or runtime as the owner knows it. `runtime.model` is
22
+ optional.
23
+ - `category`: one of `web_search`, `web_browse`, `people_data`, `company_data`,
24
+ `email`, `linkedin`, `social`, `crm`, `spreadsheet`, `docs`, `chat`, `calendar`,
25
+ `tasks`, `files`, `code`, `scheduling`, `memory`, `other`.
26
+ - `name`: the connector name as the owner would recognize it (Gmail, HubSpot, Slack,
27
+ X). At most 80 characters. One entry per category and name.
28
+ - `access`: any of `read`, `write`, `send`. `send` means it can deliver a message to
29
+ another person (email, DM, post). Drafting is `write`.
30
+ - `status`: `connected` when you can call it now, `needs_sign_in` when it is installed
31
+ but signed out, `unavailable` when it exists but fails.
32
+ - `via`: optional. How you reach it when it is not built in: an integration hub or
33
+ aggregator such as Composio or Treg, or an MCP server name. Leave it out for native
34
+ connectors built into your runtime.
35
+ - `tools`: optional tool IDs you would call, at most 16.
36
+
37
+ At most 64 entries and 32 KiB. Leave out anything you cannot call. Never include
38
+ account secrets, tokens or personal data about the owner's contacts.
39
+
40
+ ## Categories, with examples
41
+
42
+ | Category | Examples |
43
+ | --- | --- |
44
+ | `web_search`, `web_browse` | built-in search, a browser, a fetch tool |
45
+ | `people_data`, `company_data` | enrichment or lookup providers |
46
+ | `email` | Gmail, Outlook |
47
+ | `linkedin`, `social` | LinkedIn seat tools, X, Reddit |
48
+ | `crm` | Salesforce, HubSpot, Attio |
49
+ | `spreadsheet`, `docs` | Google Sheets, Excel, Notion, Google Docs |
50
+ | `chat`, `calendar`, `tasks` | Slack, Google Calendar, Linear |
51
+ | `files`, `code` | file storage, a code or shell sandbox |
52
+ | `scheduling`, `memory` | routines, cron, saved memories |
@@ -1,59 +1,86 @@
1
1
  {
2
2
  "repository": "https://github.com/omalab/exora",
3
- "sourceCommit": "9cd6c048e9a33ac0b08ebf4980ac07c8c78a0446",
3
+ "sourceCommit": "cb380552e9a5b1515caae60c768bc4c80e1925d2",
4
4
  "files": {
5
5
  "LICENSE": "220f297cfcd5c38eb64e6b4b4a77cab4ebc7f4686d4d99c6260a475d02ca11e5",
6
+ "README.md": "87a67b553f899a9ffdc12b9561e8c467d20463ce5d60c8ea8b744e9517a4b661",
6
7
  "bin/audienti-mcp.mjs": "6df1d6eb3a5bc65e7592e5b8f73cd4c98c159f2583723d042338633b356301df",
7
8
  "cli/account-intake-operations.mjs": "b43d764c628beabafad753d711ddb2af2c64276e4a6506ed0b854839091ea5db",
8
9
  "cli/account-intake.mjs": "aa77f2f96fd030f8830d6de278932186aea7c82cfda086a5a6cf569202feebc8",
9
10
  "cli/account-replies.mjs": "699e34e5c736ba316df8f164b4c50f82a7e4e2d5e51303e6b13944c3f2c854ab",
10
11
  "cli/account-reply-operations.mjs": "b4d65cf4459138909dba916012f78cc6cf4580748ed350d220132ec96adbdd83",
11
- "cli/agents.mjs": "8d0f7a940f61a74408956b2c597aceb107a25d08877d733db9fddfa68aa33bdb",
12
- "cli/approach-operations.mjs": "a84d0d406c60dd239b9fb1cbd1a6923c51a23a332e2afd6a789c680c6a7ef46c",
13
- "cli/assignment-operations.mjs": "60d672702dcaca9514a7eff5cfde094844884361a22a7cf667c465a80c59a75d",
14
- "cli/assignment.mjs": "44255a329529f897af1055828d5ca0bd2ea5182df62c4983006f4c5ab2547f0a",
15
- "cli/audience-operations.mjs": "632fe13f59dbeeb0d264943b5df5643d1dc631a504363e2d1dbe1297f5ab9b78",
16
- "cli/audiences.mjs": "6aa845c4351bd04577e74e0c7803e1d5d32acdf5de77e51a5413abbfa0db1263",
17
- "cli/audienti.mjs": "8438c2034823571c6c79687ee8262af4daa3d9b29f6da4d12db2b3de9c10eba7",
18
- "cli/connection-registry-operations.mjs": "2de6a46a4cace8392cb3705e7dc1d18e1d782ca136a170a6b556e60957749c05",
12
+ "cli/agents.mjs": "55a6cecff1bb1e353165f9383de1db622fa6e294a63af07111ed29746ff4d487",
13
+ "cli/approach-operations.mjs": "a6554effe45d3b3b1caefa3c63203b8e18716a05a665907819795484bbca8be6",
14
+ "cli/assignment-operations.mjs": "fc74e3fd79975cfcbac14891d5dec5f25e662777050fc46a8ad3aae5cf361c59",
15
+ "cli/assignment.mjs": "90cb85e0df8aadca2ff8391c99e778b41261183b5f38e8c6c32afee2f98f871a",
16
+ "cli/audience-operations.mjs": "c8454fae4140c016e1753fe104121161be7e590d0be2e23402fb3e367067ad20",
17
+ "cli/audiences.mjs": "3c377346efc1a8bdde432a16c2d19a3f51f34f3333d344d3a2bfa94c188a017d",
18
+ "cli/audienti.mjs": "623f68b34e44e2ff68db9829ea71a168232df33f60cdd3d8fb9dd1262c462c69",
19
+ "cli/audit-operations.mjs": "184eb58bc479225314b77d6019a185670cd843895a10d9bf58a28de7f1355d91",
20
+ "cli/audit.mjs": "a7becaed67c58b063e668b5e66844b6dc15c11a63b428faa171b542ad922c001",
21
+ "cli/budget-operations.mjs": "d74916551ef393e29734c6e13cf9021251e0ed126eeaa529e18cf2332146e1e0",
22
+ "cli/budgets.mjs": "683e06cb4d410c851286fbd1cdd4fb9f1902726c60fd4fcddb2c13d164786525",
23
+ "cli/campaign-operations.mjs": "180f031a957c27503824ea30854ee738f7e5ccf051ed2455dbb5aa2224e82156",
24
+ "cli/campaigns.mjs": "0095373773dad0c7502a6ecd6793eb3a9acae01d2e5ad7850d9450822c07d652",
25
+ "cli/cohort-operations.mjs": "f3e47fd024ffe8809c894e04549ab1970ec8acb7d879050464ecc4150d88d7be",
26
+ "cli/cohorts.mjs": "c71940903430f3e6834608f113534910b75a98b3e410a5942f04051607488485",
27
+ "cli/connection-registry-operations.mjs": "888ea440d00ffc9ed68d4cc084ff73a5a00d0e60bd6293baba8bb4539a25ae62",
19
28
  "cli/content.mjs": "db3fcbf7f96c314227a8172a442b70b46405126e0d61f8358cee1bfe6c627ebd",
20
- "cli/discovery-operations.mjs": "dc564a591bd920df67ba2df65f31d973491c21687e6fba12125430a8ecad2c95",
21
- "cli/discovery.mjs": "c0c23378ff93ecd86cba8d9e0add1fcc5a26f5e849cbc561860b93f50f0adb27",
22
- "cli/experiment-operations.mjs": "68879e83e29b6a86ddaff5931fb3c38c072aadf40dee57513e33c43b8f9fdc5c",
23
- "cli/experiments.mjs": "80a672d056b1f2cdff882c63ee39420c0b9e68167fbe4f8486a905e51c0de4cb",
29
+ "cli/discovery-operations.mjs": "64e166798b7e79203d5e7f26fe31c19f9fe8b1b3f18a89176b450a32c3b90009",
30
+ "cli/discovery.mjs": "f78f45af45b30acd75d5be96174e48f35dd88171d256f19da4f2fe908645dc82",
31
+ "cli/file-operations.mjs": "564f334dd9d52e9c56f44d58b5c3b0bda59ff72f54126b755bc472144069349e",
32
+ "cli/files.mjs": "2221b067d6ade7ef5cc8965929aea2eb485781953d3f2b50600995b65fbdedae",
33
+ "cli/guardrails-operations.mjs": "aa5a911663133b3287bea805df9e2a5d8b5bbc4a3df972c52f91fee315954ded",
34
+ "cli/guardrails.mjs": "e8b9c0a19956a9eab84475d3c56a4b6c77baf7ed9a55e8686d660ef1ad562aa8",
24
35
  "cli/json-file.mjs": "e1fa747c2ba7cdb1f013ed99789a7e4811c3f569cd7d9715f30ddededa34159e",
25
- "cli/mcp.mjs": "4e746d5eb34ca68b32f544eb9085777a57e2e9bbddd3d2810c51cf9e10a1e6df",
26
- "cli/offer-operations.mjs": "29587e874faed3db86bfdde9faf8aec6ea767152617879859f3f7b9236610874",
36
+ "cli/mcp.mjs": "2468dfa2bdf5e8d384ba70707ecc3a2d229cb24918aa75b9c0f1ef24268c459b",
37
+ "cli/notification-operations.mjs": "7225dbcfd87d29921e72ee247f61aaee323a4a2e5a48a9ba9c945b02f66e4978",
38
+ "cli/offer-operations.mjs": "a03d467622be38bbf52bbfbbd54e6969bdd55af15a627f54356bb03eb1b4f508",
27
39
  "cli/offers.mjs": "4a97007e1e25352707bbecda0b2519affcd0024e52ae8d9446d76d459460feca",
40
+ "cli/outbound-operations.mjs": "52992bea63195efa8150c6ca2ff0b37ee6010f03fa366055c70c755ee0eb028e",
41
+ "cli/outbound.mjs": "23903eb0fec4d7af3aa0031d63488ed9a8697e07ccf1314d194b48e109d15f82",
28
42
  "cli/owner-account-client.mjs": "712b2fd5a8cb21f1baa88ebce1ee1750a44b34cf7d15a93be61e530aacf202c4",
29
43
  "cli/profiles.mjs": "45929b224ffc916b6dbd7a94e06ac09a1ff7feec430633b10d160c1608fc2d32",
30
- "cli/progress.mjs": "7bf270872d95c06aa48d49c3393e6e48e628b74cffb69a7929641ff7a0717b58",
44
+ "cli/progress.mjs": "76cf8bcd17d2e84b45220be79099edca4c74bff7b64726965e14aa27b8f7f6eb",
31
45
  "cli/prospecting-settings-operations.mjs": "37b881a867c19d9e5f2d02316038284ea0cf09de4f37b6dee2370a1faedf245e",
32
46
  "cli/prospecting-settings.mjs": "b09f47c84416d9892d7d5b17dcf684cbb560e1cacb25513826ff04ef9307626e",
47
+ "cli/question-operations.mjs": "eedaaaf207d77d507be0687c7653ad7406eb7e593e25c6200ff84d1cec7eea82",
48
+ "cli/questions.mjs": "21a4da459b7c150ab64b751a8c4325b83f34cad7aa8ca394ed6c47b50c77994b",
49
+ "cli/queue-operations.mjs": "2d1d3d856e1abd28db93606f9f31b675d5e2959a1846923dfab348b56817f56b",
50
+ "cli/queue.mjs": "6faf6dde6530dc057936edb9b39f6222a710a688b73a3f2cf62639fd5d233c30",
33
51
  "cli/recipient-operations.mjs": "efc06c75d263169a35f5bac76dce133d4e78cf96a4b4a661531234a4d4007cdf",
34
52
  "cli/recipients.mjs": "e5e30fc30ab325a43cffdc51ad8872cb657ce0f5d3cb304dd8af65c6d9224c75",
53
+ "cli/rooms-operations.mjs": "8bd034a4a9a6c934a31a4455ee6645942b8a9649cf118b718b4db478a96e063f",
54
+ "cli/rooms.mjs": "d3701b2d54e5966915b1fc8b1cdf904ad6b018799cd36260d778aec964f9779d",
55
+ "cli/search-operations.mjs": "903f12fffb6824872160c4136925ab5638142bb4e39236b37f927cd2c6a43776",
35
56
  "cli/sender-account-operations.mjs": "f54b0e5ef6d6563752df95b2ce39c9a9a2e6ae2d53d13d6ef6c899cc92456aa7",
36
57
  "cli/sender-accounts.mjs": "a3c569b5da55c22226f37d65d5a9144229860bf37fbfc7b5ac3c307a9ee9b048",
37
- "cli/skills-mcp.mjs": "8eae2f456b0a3c39b905856e70c21204fe208e86d05f23a38949fb4fc584f808",
38
- "cli/skills.mjs": "85f7ecc76e85b4014ac1356f399b3108eec4a152256aa6b4e0a7dfc44aaf2676",
58
+ "cli/skills-mcp.mjs": "abb64cc91f96b5bd594c17cfef5da2319527b93cc2d1c8786f2bcdb69611e32d",
59
+ "cli/skills.mjs": "44de193612adaa934fcf4bca7525321d8ea9ad9a556c6df84ee5ce045aa3b8d9",
39
60
  "cli/suppression-operations.mjs": "d1f827a785670fc6e44d87b18e4cfb6596b09e5be7c4f84c4b9a75ed13a962c6",
40
61
  "cli/suppression.mjs": "2b10be67e290deec9ed915139c3d98d45d7d10fd41abb67b5a35a630d636a4ed",
41
62
  "cli/tools-operations.mjs": "ae8bbb8cc919aa8a9c796367f488911f2eda3670e81f85829972b13582827963",
42
63
  "cli/tools.mjs": "229b096d8d858a22e0a08a2a745906e83873827c3d74a5b13a6607ae198c465f",
64
+ "cli/usage-operations.mjs": "64dd1ae850f52bb72c7648be78a8ab2dfab986afba2d2d2cd08034c4f7b3ace6",
65
+ "cli/usage.mjs": "cd582c061f83ca4f220ddd3cd2a174a1a3a3c0ee308b3d5a5f47752a501e322e",
43
66
  "cli/work-execution-operations.mjs": "cb5926acdb9e5cd3173c48868436b1a5e5ebd1b6cab372aec2e2ce447f4f62da",
44
67
  "cli/work-execution.mjs": "5d9dba0dde20a7ec6ff6a2cbee140497171af9bfdd403f90e8ff8286a72862e7",
45
68
  "cli/work-feedback-operations.mjs": "a998f2b2dbe38ceb2bad74f7fa61c31f87f842755449248b7eb0c04185c0ee3d",
46
69
  "cli/work-feedback.mjs": "f3b77ecfd7ea1aba9c9f03c9d894137547e9c5575d9daa359ed94505ad025852",
47
- "cli/work-operations.mjs": "f6544b69b424f839919e2c6c336b70a7be3aa0d147b18bc25479ca7a634117a5",
48
- "cli/work.mjs": "b029727fb2a9e931e9e077d04e1976bfedc496e2ffcd74ccfa6490d109b5f139",
49
- "cli/workspaces.mjs": "58e28acf3f5f82bbee35ea03478ec948390c908c6714330ace90118d552249cd",
50
- "package.json": "a4d48a4c8704437707e7991b07af0f81296140bff1d50e662607c857a4ae7f50",
51
- "skills/audienti/SKILL.md": "f6f8b3d74979c0e2e214d17a7fc77dcb93e957c37304d76791ddab88a6187914",
70
+ "cli/work-operations.mjs": "eea99ee9d20a944fbd60fc809ae43eec45fce730baeaa4e4c15e02d1c93c8ba8",
71
+ "cli/work.mjs": "077a5e263386f5a36704302e1f8fda085971531d19305114f2ffefb55d8a7f72",
72
+ "cli/workspaces.mjs": "f32ec20da6af544f0a293381cb0db09eff77e54499d11b5ab062aef3acfcc647",
73
+ "package.json": "725e801e9f993b092f0184d8557a73988f681be7433b3eeaad810d6b75cf6af7",
74
+ "skills/audienti/SKILL.md": "668e2ebaa306962e395861f78fd958d1850b0079263a37a50f6a8afeae43d14b",
52
75
  "skills/audienti/references/helpers.md": "b1eda3787dc0b10746c1272ada2689bfc29f014c2ea432d94733a8205a7d8dc3",
53
- "skills/audienti/references/profile-workflows.md": "c44fcc0ce9142281aa309c3f0e771883a084100c86fbdd06561a3dc16e58c6db",
76
+ "skills/audienti/references/profile-workflows.md": "45164a5acc7e9f2f17a2beecdc9ebe5d11a9bd94c2e77c25a9e35d2d846bfded",
54
77
  "skills/audienti/references/workflow-receipt.md": "349f9a85472832b8bdc6a5d16c5b10b8e32d48d3e81523ad8d42f9a03b3655ff",
55
78
  "skills/audienti/scripts/contracts.mjs": "214aecaf3eec080196233e4e0fcf1e8cb07c5b30350aed70c3fec9db9f8e1f32",
56
79
  "skills/audienti/scripts/profile-helpers.mjs": "7f62afdefd8e1b1bfec95f1ca6f48cfc4e204d1bff35f805261c45c6d5fcb46a",
57
- "skills/audienti/scripts/run.mjs": "652094ff8b642d13f5e0bb30756bb49464c051511c37f202249fde917b319208"
80
+ "skills/audienti/scripts/run.mjs": "652094ff8b642d13f5e0bb30756bb49464c051511c37f202249fde917b319208",
81
+ "skills/getting-started/SKILL.md": "94091682271dc6807ecebbf3a8b9160d3f6738de783ac76fac098259ca456575",
82
+ "skills/getting-started/references/audience.md": "a0eddf3c4ff9073256e5dc0eed5b9cef24ba1bdefbb5a528a07dd92c91aa7d89",
83
+ "skills/getting-started/references/campaign-draft.md": "183f941896b6e35a1bf5fdc6fcf0cb0cbe08b86f51e51e9034aee5459b88b12c",
84
+ "skills/getting-started/references/inventory.md": "64ee38be078fec0ccaa8ff74685f10e672d8fc381e5a7fa1cb6186bec481cb28"
58
85
  }
59
86
  }
@@ -1,25 +0,0 @@
1
- import {z} from 'zod';
2
- const uuid=z.string().uuid(),workspace={workspaceId:uuid.optional()},locator={...workspace,experimentId:uuid};
3
- const state=z.enum(['Preparing','Active','Paused','Closing','Archived']);
4
- const signalBase={id:uuid,scope:z.enum(['company','person']),details:z.string().optional()};
5
- const signal=z.discriminatedUnion('kind',[
6
- z.object({...signalBase,kind:z.literal('research'),question:z.string(),expected:z.boolean().optional()}).strict(),
7
- z.object({...signalBase,kind:z.literal('topic'),topic:z.string()}).strict(),
8
- z.object({...signalBase,kind:z.literal('profile'),url:z.string(),track:z.enum(['audience','activity']).optional(),interactions:z.array(z.enum(['comments','reactions'])).optional()}).strict(),
9
- ]);
10
- const fields=z.object({name:z.string(),audienceId:uuid,audienceRevision:z.number().int(),offerId:uuid,offerRevision:z.number().int(),premise:z.string(),approach:z.string().optional(),approachPin:z.object({id:uuid,revision:z.number().int().positive()}).strict().optional(),notes:z.string().optional(),ownerUserId:uuid.nullable().optional(),tags:z.array(z.string()).optional(),signalMatch:z.enum(['any','all']).optional(),signals:z.array(signal).optional(),targets:z.discriminatedUnion('kind',[
11
- z.object({kind:z.literal('none'),values:z.array(z.never())}).strict(),
12
- z.object({kind:z.literal('companies'),values:z.array(z.object({type:z.enum(['domain','linkedin-company']),value:z.string()}).strict())}).strict(),
13
- z.object({kind:z.literal('people'),values:z.array(z.object({type:z.literal('linkedin-person'),value:z.string()}).strict())}).strict(),
14
- ]).optional(),channels:z.array(z.enum(['email','linkedin'])).optional(),approvalMode:z.literal('manual').optional(),contentOpsEnabled:z.boolean().optional(),schedule:z.object({startAt:z.string().nullable().optional(),endAt:z.string().nullable().optional(),maxCompanies:z.number().int().nullable().optional()}).strict().optional()}).strict();
15
- const path=a=>`/workspaces/${a.workspaceId}/experiments`,detail=a=>path(a)+`/${a.experimentId}`;
16
- const qs=a=>new URLSearchParams(Object.fromEntries(Object.entries(a).filter(([k,v])=>!['workspaceId','experimentId'].includes(k)&&v!==undefined).map(([k,v])=>[k,String(v)])));
17
- export const experimentOperations={
18
- experiment_list:{schema:z.object({...workspace,state:state.optional(),archived:z.boolean().optional(),q:z.string().optional(),limit:z.number().int().optional(),after:uuid.optional()}).strict(),method:'GET',path:a=>path(a)+'?'+qs(a),scoped:true},
19
- experiment_get:{schema:z.object({...locator,revision:z.number().int().optional()}).strict(),method:'GET',path:a=>detail(a)+'?'+qs(a),scoped:true},
20
- experiment_events:{schema:z.object({...locator,limit:z.number().int().optional(),after:uuid.optional()}).strict(),method:'GET',path:a=>detail(a)+'/events?'+qs(a),scoped:true},
21
- experiment_create:{schema:z.object({...workspace,requestId:uuid,fields}).strict(),method:'POST',path,body:a=>({requestId:a.requestId,fields:a.fields}),scoped:true},
22
- experiment_update:{schema:z.object({...locator,expectedRevision:z.number().int(),fields}).strict(),method:'POST',path:a=>detail(a)+'/revisions',body:a=>({expectedRevision:a.expectedRevision,fields:a.fields}),scoped:true},
23
- experiment_transition:{schema:z.object({...locator,expectedState:state,operation:z.enum(['activate','pause','resume','close','archive','restore']),reason:z.string().optional()}).strict(),method:'POST',path:a=>detail(a)+'/transitions',body:a=>({expectedState:a.expectedState,operation:a.operation,...(a.reason===undefined?{}:{reason:a.reason})}),scoped:true},
24
- experiment_successor:{schema:z.object({...locator,requestId:uuid,expectedRevision:z.number().int(),fields}).strict(),method:'POST',path:a=>detail(a)+'/successors',body:a=>({requestId:a.requestId,expectedRevision:a.expectedRevision,fields:a.fields}),scoped:true},
25
- };