@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.
- package/README.md +28 -4
- package/cli/agents.mjs +23 -5
- package/cli/approach-operations.mjs +18 -6
- package/cli/assignment-operations.mjs +12 -12
- package/cli/assignment.mjs +6 -6
- package/cli/audience-operations.mjs +5 -0
- package/cli/audiences.mjs +7 -4
- package/cli/audienti.mjs +51 -9
- package/cli/audit-operations.mjs +17 -0
- package/cli/audit.mjs +39 -0
- package/cli/budget-operations.mjs +8 -0
- package/cli/budgets.mjs +34 -0
- package/cli/campaign-operations.mjs +26 -0
- package/cli/{experiments.mjs → campaigns.mjs} +6 -6
- package/cli/cohort-operations.mjs +22 -0
- package/cli/cohorts.mjs +45 -0
- package/cli/connection-registry-operations.mjs +2 -1
- package/cli/discovery-operations.mjs +2 -2
- package/cli/discovery.mjs +1 -1
- package/cli/file-operations.mjs +29 -0
- package/cli/files.mjs +14 -0
- package/cli/guardrails-operations.mjs +12 -0
- package/cli/guardrails.mjs +37 -0
- package/cli/mcp.mjs +1 -1
- package/cli/notification-operations.mjs +8 -0
- package/cli/offer-operations.mjs +1 -1
- package/cli/outbound-operations.mjs +16 -0
- package/cli/outbound.mjs +54 -0
- package/cli/progress.mjs +18 -6
- package/cli/question-operations.mjs +12 -0
- package/cli/questions.mjs +32 -0
- package/cli/queue-operations.mjs +11 -0
- package/cli/queue.mjs +24 -0
- package/cli/rooms-operations.mjs +27 -0
- package/cli/rooms.mjs +134 -0
- package/cli/search-operations.mjs +9 -0
- package/cli/skills-mcp.mjs +8 -5
- package/cli/skills.mjs +25 -11
- package/cli/usage-operations.mjs +8 -0
- package/cli/usage.mjs +41 -0
- package/cli/work-operations.mjs +4 -3
- package/cli/work.mjs +11 -6
- package/cli/workspaces.mjs +44 -4
- package/package.json +1 -1
- package/skills/audienti/SKILL.md +1 -1
- package/skills/audienti/references/profile-workflows.md +2 -2
- package/skills/getting-started/SKILL.md +193 -0
- package/skills/getting-started/references/audience.md +78 -0
- package/skills/getting-started/references/campaign-draft.md +37 -0
- package/skills/getting-started/references/inventory.md +52 -0
- package/source-manifest.json +52 -25
- 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 |
|
package/source-manifest.json
CHANGED
|
@@ -1,59 +1,86 @@
|
|
|
1
1
|
{
|
|
2
2
|
"repository": "https://github.com/omalab/exora",
|
|
3
|
-
"sourceCommit": "
|
|
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": "
|
|
12
|
-
"cli/approach-operations.mjs": "
|
|
13
|
-
"cli/assignment-operations.mjs": "
|
|
14
|
-
"cli/assignment.mjs": "
|
|
15
|
-
"cli/audience-operations.mjs": "
|
|
16
|
-
"cli/audiences.mjs": "
|
|
17
|
-
"cli/audienti.mjs": "
|
|
18
|
-
"cli/
|
|
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": "
|
|
21
|
-
"cli/discovery.mjs": "
|
|
22
|
-
"cli/
|
|
23
|
-
"cli/
|
|
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": "
|
|
26
|
-
"cli/
|
|
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": "
|
|
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": "
|
|
38
|
-
"cli/skills.mjs": "
|
|
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": "
|
|
48
|
-
"cli/work.mjs": "
|
|
49
|
-
"cli/workspaces.mjs": "
|
|
50
|
-
"package.json": "
|
|
51
|
-
"skills/audienti/SKILL.md": "
|
|
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": "
|
|
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
|
-
};
|