@sellable/mcp 0.1.336 → 0.1.338
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 +34 -19
- package/dist/api.js +5 -3
- package/dist/auth.js +44 -13
- package/dist/server.js +15 -0
- package/dist/tools/campaign-fill-routing.d.ts +39 -0
- package/dist/tools/campaign-fill-routing.js +45 -0
- package/dist/tools/campaign-horizon-fill.d.ts +93 -0
- package/dist/tools/campaign-horizon-fill.js +92 -0
- package/dist/tools/campaign-message-preparation.d.ts +8 -0
- package/dist/tools/campaign-message-preparation.js +13 -6
- package/dist/tools/campaign-refill-state.d.ts +25 -0
- package/dist/tools/campaign-refill-state.js +32 -0
- package/dist/tools/campaigns.js +1 -1
- package/dist/tools/prompts.d.ts +3 -3
- package/dist/tools/prompts.js +2 -1
- package/dist/tools/refill-campaign-sends.d.ts +92 -0
- package/dist/tools/refill-campaign-sends.js +91 -0
- package/dist/tools/registry.d.ts +115 -2
- package/dist/tools/registry.js +6 -0
- package/dist/tools/tables.d.ts +4 -0
- package/dist/tools/tables.js +1 -1
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +39 -22
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2/references/sample-validation-loop.md +16 -0
- package/skills/create-evergreen-campaigns/SKILL.md +94 -14
- package/skills/fill-send-horizon/SKILL.md +21 -60
- package/skills/refill-sends/SKILL.md +54 -0
- package/skills/refill-sends-workflow/SKILL.md +172 -0
- package/skills/research/config.json +9 -0
|
@@ -1,72 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fill-send-horizon
|
|
3
|
-
description:
|
|
3
|
+
description: Compatibility alias for refill-sends. Fill horizon requests load the skill-led refill workflow; fill_campaign_horizon remains evergreen-only lower-level execution.
|
|
4
4
|
visibility: internal
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__sellable__get_subskill_prompt
|
|
7
|
+
- mcp__sellable__resolve_campaign_fill_route
|
|
8
|
+
- mcp__sellable__get_campaign_refill_state
|
|
9
|
+
- mcp__sellable__fill_campaign_horizon
|
|
5
10
|
---
|
|
6
11
|
|
|
7
12
|
# Fill Send Horizon
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
<inputs>
|
|
14
|
-
The invoking prompt (often a scheduled automation) names the targets. Accept any of:
|
|
15
|
-
|
|
16
|
-
- Campaign names or IDs ("fill send horizon for Christian Reyes - Post Engagers")
|
|
17
|
-
- Sender names ("…for csreyes92 and thomas") — resolve via `list_senders`, then `get_campaigns` and match campaigns attached to those senders
|
|
18
|
-
- Nothing specific ("fill send horizon") — operate on all non-archived campaign tables in the active workspace that have a sequence attached (`list_tables({ hasSequence: true })`), skipping ARCHIVED ones
|
|
19
|
-
|
|
20
|
-
Optional inputs: `targetPreparedMessages` (default: leave unset for the adaptive default), an explicit "approve" instruction (see safety rules), and a **waterfall priority order** (see below).
|
|
21
|
-
</inputs>
|
|
22
|
-
|
|
23
|
-
<objective>
|
|
24
|
-
For each target campaign:
|
|
25
|
-
|
|
26
|
-
1. `get_campaign` → confirm workspace, workflowTableId, and current stats. Skip and report any campaign whose table is ARCHIVED.
|
|
27
|
-
2. `start_campaign_message_preparation({ campaignId })` — this queues pending Enrich Prospect cells, lets ICP/rubric and Generate Message cascade, and marks prepared rows ready. Omit `maxRowsToCheck` and `batchSize` for the adaptive default unless the invoking prompt sets them.
|
|
28
|
-
3. Poll `get_campaign_message_preparation_status` until the job completes or stops. Read `progress.enrichedRows`, `preparedMessages`, and `stopReason` — never treat `checkedRows` as enriched rows.
|
|
29
|
-
4. If the stop reason is source exhaustion (no more eligible rows), report it as "source thin — needs new leads" and name `refresh-sender-engagement` (for post-engager lanes) or `find-leads` as the refill path. Do not invent leads.
|
|
30
|
-
5. Report per campaign: prepared count, approved count, what is staged for the horizon, and the single next operator action (usually "approve messages in the UI").
|
|
31
|
-
</objective>
|
|
32
|
-
|
|
33
|
-
<waterfall>
|
|
34
|
-
## Campaign hierarchy (waterfall order)
|
|
35
|
-
|
|
36
|
-
The fill order is **stored workspace state**, not something each automation restates. Resolve it in this precedence:
|
|
37
|
-
|
|
38
|
-
1. **Stored hierarchy (default)**: call `get_campaign_waterfall` first. It returns each waterfall (per sender or shared) with slots in stored priority order — campaign offer IDs included. Fill in that order.
|
|
39
|
-
2. **Per-invocation override**: if the invoking prompt states an explicit order ("fill in this order: Signal Discovery, Post Engagers"), use it for this run only and say in the report that the stored order was overridden. To change the order durably, use `set_campaign_waterfall_order` — but only when the user/automation explicitly asks to change the hierarchy, never as a side effect of a fill run.
|
|
40
|
-
3. **No stored hierarchy** (tool returns empty — evergreen reconcile hasn't run): fall back to the conventional order `<Sender> - Post Engagers` (warmest) → `Shared Signal Discovery` → `Shared Cold Fallback` (coldest), and note that running `create-evergreen-campaigns` will materialize a stored hierarchy.
|
|
41
|
-
|
|
42
|
-
Fill mechanics, whatever the source of the order:
|
|
43
|
-
|
|
44
|
-
- **Fill the top lane first.** Move to the next lane ONLY when the current one stops with source exhaustion / no more eligible rows — never because it is merely slow.
|
|
45
|
-
- **Stop descending once the horizon target is met.** If the warm lane alone fills the horizon, the cold lanes get nothing this run — that is correct, not a gap.
|
|
46
|
-
- **Report per lane** so the operator can see the waterfall working:
|
|
14
|
+
This is a compatibility alias. For plain operator language such as "fill",
|
|
15
|
+
"refill sends", "max out sends", "load everyone up", or "fill horizon sends",
|
|
16
|
+
load the canonical workflow first:
|
|
47
17
|
|
|
18
|
+
```text
|
|
19
|
+
get_subskill_prompt({ subskillName: "refill-sends-workflow" })
|
|
48
20
|
```
|
|
49
|
-
csreyes92 waterfall (stored order): Post Engagers filled 4/4 (horizon met — lower lanes skipped)
|
|
50
|
-
thomas waterfall (stored order): Post Engagers 1/4 (source thin) → Shared Signal Discovery 3/3 remaining
|
|
51
|
-
```
|
|
52
|
-
</waterfall>
|
|
53
21
|
|
|
54
|
-
|
|
55
|
-
- **Never call `start_campaign`, `start_on_demand_campaign`, or `start_direct_campaign`.** Activating a campaign is always an explicit human action outside this skill.
|
|
56
|
-
- Use `approvalMode: "approve"` ONLY when the invoking prompt explicitly says to auto-approve (e.g. "fill and approve"). Default is `mark_ready` — a human approves in the UI.
|
|
57
|
-
- Never use a sender from one workspace for another workspace's campaign. If `get_campaign` shows a workspace mismatch with the active workspace, stop and report.
|
|
58
|
-
- Paid InMail: never opt a campaign into paid-InMail templates or spend credits. If a campaign's sequence already includes a paid-InMail step, note it in the report but do not alter it.
|
|
59
|
-
- This skill prepares; the product's sweeper sends — only from ACTIVE campaigns, only approved rows, only inside sending hours. Say so in the report so the operator knows nothing went out.
|
|
60
|
-
</safety>
|
|
22
|
+
Then follow the workflow:
|
|
61
23
|
|
|
62
|
-
|
|
63
|
-
|
|
24
|
+
1. Call `resolve_campaign_fill_route`.
|
|
25
|
+
2. Call `get_campaign_refill_state` for the exact selected target.
|
|
26
|
+
3. Treat public targets as regular campaigns or evergreen campaigns only.
|
|
27
|
+
4. Stop on `unsupported_campaign_type` for internal direct campaign tables.
|
|
28
|
+
5. Use `fill_campaign_horizon` only after route and refill-state evidence prove
|
|
29
|
+
the target is an evergreen campaign.
|
|
64
30
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
• {Campaign B}: source thin after {k} prepared — refill via refresh-sender-engagement
|
|
69
|
-
Next operator action: approve {m} messages in {Campaign A}
|
|
70
|
-
Nothing was sent or launched; campaigns remain in their current status.
|
|
71
|
-
```
|
|
72
|
-
</output>
|
|
31
|
+
Do not start or launch campaigns. Do not raw-write scheduler fields. Do not
|
|
32
|
+
claim scheduled success without rereading scheduler-owned cells with non-null
|
|
33
|
+
`scheduledFor`.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refill-sends
|
|
3
|
+
description: Plan regular campaign and evergreen campaign send refill work through the skill-led refill workflow.
|
|
4
|
+
visibility: public
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__sellable__get_subskill_prompt
|
|
7
|
+
- mcp__sellable__search_subskill_prompts
|
|
8
|
+
- mcp__sellable__resolve_campaign_fill_route
|
|
9
|
+
- mcp__sellable__get_campaign_refill_state
|
|
10
|
+
- mcp__sellable__fill_campaign_horizon
|
|
11
|
+
- mcp__sellable__get_campaign
|
|
12
|
+
- mcp__sellable__get_campaign_message_preparation_status
|
|
13
|
+
- mcp__sellable__start_campaign_message_preparation
|
|
14
|
+
- mcp__sellable__cancel_campaign_message_preparation
|
|
15
|
+
- mcp__sellable__import_leads
|
|
16
|
+
- mcp__sellable__wait_for_lead_list_ready
|
|
17
|
+
- mcp__sellable__confirm_lead_list
|
|
18
|
+
- mcp__sellable__search_signals
|
|
19
|
+
- mcp__sellable__fetch_post_engagers
|
|
20
|
+
- mcp__sellable__search_sales_nav
|
|
21
|
+
- mcp__sellable__lookup_sales_nav_filter
|
|
22
|
+
- mcp__sellable__search_prospeo
|
|
23
|
+
- mcp__sellable__search_prospeo_companies
|
|
24
|
+
- mcp__sellable__confirm_prospeo_company_accounts
|
|
25
|
+
- mcp__sellable__load_csv_linkedin_leads
|
|
26
|
+
- mcp__sellable__load_csv_domains
|
|
27
|
+
- mcp__sellable__list_dnc_entries
|
|
28
|
+
- mcp__sellable__load_csv_dnc_entries
|
|
29
|
+
- mcp__sellable__get_rows
|
|
30
|
+
- mcp__sellable__get_rows_minimal
|
|
31
|
+
- mcp__sellable__get_table_rows
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
# Refill Sends
|
|
35
|
+
|
|
36
|
+
Use this public wrapper for plain operator requests such as "fill", "refill sends",
|
|
37
|
+
"max out sends", "load everyone up", or "fill horizon sends".
|
|
38
|
+
|
|
39
|
+
Load the internal workflow prompt before taking any operational step:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
get_subskill_prompt({ subskillName: "refill-sends-workflow" })
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Then follow that workflow exactly. The default path is read-only research:
|
|
46
|
+
resolve the route, read target refill state, report the next safe step, and stop
|
|
47
|
+
before mutation unless the user has explicitly approved the exact workspace,
|
|
48
|
+
campaign/table/source ids, caps/dates, approval mode, expected side effects,
|
|
49
|
+
and stop/rollback condition.
|
|
50
|
+
|
|
51
|
+
Public concepts are regular campaign and evergreen campaign. Internal direct
|
|
52
|
+
campaign types are unsupported refill targets. `fill_campaign_horizon` is only a
|
|
53
|
+
legacy evergreen-only lower-level primitive after route and refill-state
|
|
54
|
+
evidence proves an evergreen target.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refill-sends-workflow
|
|
3
|
+
description: Internal skill-led refill sends workflow for regular campaigns and evergreen campaigns.
|
|
4
|
+
visibility: internal
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__sellable__resolve_campaign_fill_route
|
|
7
|
+
- mcp__sellable__get_campaign_refill_state
|
|
8
|
+
- mcp__sellable__fill_campaign_horizon
|
|
9
|
+
- mcp__sellable__get_campaign
|
|
10
|
+
- mcp__sellable__get_campaign_message_preparation_status
|
|
11
|
+
- mcp__sellable__start_campaign_message_preparation
|
|
12
|
+
- mcp__sellable__cancel_campaign_message_preparation
|
|
13
|
+
- mcp__sellable__import_leads
|
|
14
|
+
- mcp__sellable__wait_for_lead_list_ready
|
|
15
|
+
- mcp__sellable__confirm_lead_list
|
|
16
|
+
- mcp__sellable__search_signals
|
|
17
|
+
- mcp__sellable__fetch_post_engagers
|
|
18
|
+
- mcp__sellable__search_sales_nav
|
|
19
|
+
- mcp__sellable__lookup_sales_nav_filter
|
|
20
|
+
- mcp__sellable__search_prospeo
|
|
21
|
+
- mcp__sellable__search_prospeo_companies
|
|
22
|
+
- mcp__sellable__confirm_prospeo_company_accounts
|
|
23
|
+
- mcp__sellable__load_csv_linkedin_leads
|
|
24
|
+
- mcp__sellable__load_csv_domains
|
|
25
|
+
- mcp__sellable__list_dnc_entries
|
|
26
|
+
- mcp__sellable__load_csv_dnc_entries
|
|
27
|
+
- mcp__sellable__get_rows
|
|
28
|
+
- mcp__sellable__get_rows_minimal
|
|
29
|
+
- mcp__sellable__get_table_rows
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Refill Sends Workflow
|
|
33
|
+
|
|
34
|
+
Default mode is read-only research. This workflow decides the next safe refill
|
|
35
|
+
step in the parent thread; backend tools remain narrow route, state, source,
|
|
36
|
+
prep, readiness, and evergreen primitives.
|
|
37
|
+
|
|
38
|
+
## Entry
|
|
39
|
+
|
|
40
|
+
Plain phrases that enter here include "fill", "refill sends", "max out sends",
|
|
41
|
+
"load everyone up", and "fill horizon sends".
|
|
42
|
+
|
|
43
|
+
1. Call `resolve_campaign_fill_route` first. Use `intent:"plain"` for generic
|
|
44
|
+
fill/load language, `intent:"active"` only when the user explicitly narrowed
|
|
45
|
+
to active regular campaigns, and `intent:"evergreen"` only when the user
|
|
46
|
+
explicitly asked for evergreen or horizon work.
|
|
47
|
+
2. Pick exact ids from the resolver result. Do not use campaign names or table
|
|
48
|
+
names as target identifiers.
|
|
49
|
+
3. Call `get_campaign_refill_state` for the selected `campaignId` or `tableId`.
|
|
50
|
+
This must be the next target-specific research primitive.
|
|
51
|
+
4. Classify the target from refill state:
|
|
52
|
+
- regular campaign: campaign-backed workflow table with normal source,
|
|
53
|
+
sequence, senders, and send/refill stages.
|
|
54
|
+
- evergreen campaign: managed always-on lane with current source evidence.
|
|
55
|
+
- `unsupported_campaign_type`: internal direct campaign table; report the
|
|
56
|
+
blocker and stop without mutation.
|
|
57
|
+
|
|
58
|
+
## Research Checklist
|
|
59
|
+
|
|
60
|
+
Use the refill-state response as the current facts receipt:
|
|
61
|
+
|
|
62
|
+
- campaign status/current step, workflow table id, table config type, and public
|
|
63
|
+
type;
|
|
64
|
+
- selected source list/provider identity, source id, target prospect gap,
|
|
65
|
+
cursor/inventory state, dedupe/DNC/provider exclusions, good-prospect yield,
|
|
66
|
+
scan/import caps, and proof;
|
|
67
|
+
- sender ids, healthy senders, disconnected senders, and daily capacity;
|
|
68
|
+
- row/stage counts: source available, rows, enriched, passed, generated,
|
|
69
|
+
approved, ready to schedule, scheduled;
|
|
70
|
+
- active message prep job;
|
|
71
|
+
- scheduler-owned scheduled counts by date/action from cells with non-null
|
|
72
|
+
`scheduledFor`;
|
|
73
|
+
- `freshness.stateHash` and exact campaign/table/workspace ids.
|
|
74
|
+
|
|
75
|
+
Empty or unsafe states stop with the blocker: no fillable target, missing or deleted campaign,
|
|
76
|
+
missing table, paused/archive campaign, zero sender capacity, zero source candidates,
|
|
77
|
+
zero viable rows, no approved/preparable rows, active prep job, awaiting
|
|
78
|
+
scheduler, or unsupported direct campaign type.
|
|
79
|
+
|
|
80
|
+
## Regular Campaign Decision
|
|
81
|
+
|
|
82
|
+
For regular campaign workspaces, rank regular campaigns from route and
|
|
83
|
+
`get_campaign_refill_state` evidence. Choose the best existing refill target.
|
|
84
|
+
Do not create side campaigns, warm-post-engager side campaigns, on-demand campaigns,
|
|
85
|
+
or unrelated campaigns as the default answer to a fill request.
|
|
86
|
+
|
|
87
|
+
When the best regular campaign is source-exhausted, recommend same-campaign source-ladder replenishment.
|
|
88
|
+
Keep `selectedLeadListId` source identity distinct
|
|
89
|
+
from the campaign `workflowTableId`.
|
|
90
|
+
|
|
91
|
+
Source replenishment choices:
|
|
92
|
+
|
|
93
|
+
- existing source list reuse: append/confirm the existing source list when it
|
|
94
|
+
has enough eligible rows;
|
|
95
|
+
- CSV path: load CSV profiles/domains, then import into the same campaign/source
|
|
96
|
+
path;
|
|
97
|
+
- Sales Nav path: use Sales Nav lookup/search, then import selected prospects;
|
|
98
|
+
- Prospeo path: use account/person search as appropriate, then import selected
|
|
99
|
+
prospects;
|
|
100
|
+
- Signal Discovery path: search/select posts or engagers, import selected
|
|
101
|
+
source prospects into the same campaign/source-list path, then confirm
|
|
102
|
+
readiness.
|
|
103
|
+
|
|
104
|
+
Before any source mutation, show exact approval evidence: workspace id,
|
|
105
|
+
campaign id, workflow table id, source/provider id, source-list id when known,
|
|
106
|
+
import caps, target dates/caps, dedupe/DNC/provider exclusion expectations, and
|
|
107
|
+
expected row side effects. Then reread `get_campaign_refill_state`; if
|
|
108
|
+
`freshness.stateHash` or exact ids changed, stop and ask for a fresh approval.
|
|
109
|
+
|
|
110
|
+
After source import, call `wait_for_lead_list_ready` and `confirm_lead_list`
|
|
111
|
+
with the source-list id and campaign id. Imports append to the existing
|
|
112
|
+
campaign/source path; they must not reset campaign state, sequence, sender
|
|
113
|
+
assignment, current step, or watch state. If provider auth, rate limit, timeout,
|
|
114
|
+
partial import, duplicate-only import, DNC-only result, CSV parse failure,
|
|
115
|
+
readiness timeout, or `confirm_lead_list` failure occurs, stop before prep and
|
|
116
|
+
report the blocker/retry path.
|
|
117
|
+
|
|
118
|
+
## Prep, Approval, And Scheduler Proof
|
|
119
|
+
|
|
120
|
+
Existing rows normally move through enrichment/prep/approval using
|
|
121
|
+
`start_campaign_message_preparation` and
|
|
122
|
+
`get_campaign_message_preparation_status`. Standalone Generate Message is not the normal refill action;
|
|
123
|
+
it is only for a manual/user-authored message path
|
|
124
|
+
that requires it.
|
|
125
|
+
|
|
126
|
+
Approval mode:
|
|
127
|
+
|
|
128
|
+
- default is `approvalMode:"mark_ready"`, not approve;
|
|
129
|
+
- use `approvalMode:"approve"` only when the user explicitly asks to approve
|
|
130
|
+
messages or schedule sends and has approved the exact bounded cohort;
|
|
131
|
+
- never launch/start a campaign from refill.
|
|
132
|
+
|
|
133
|
+
Before prep or approval mutation, reread `get_campaign_refill_state` and compare
|
|
134
|
+
`freshness.stateHash`, campaign id, table id, workspace id, source id, and caps.
|
|
135
|
+
If they changed, stop. A second concurrent refill run must see the first run's
|
|
136
|
+
import/prep state on reread and avoid duplicate work.
|
|
137
|
+
|
|
138
|
+
Scheduled success requires a post-action reread proving scheduler-owned cells
|
|
139
|
+
with non-null `scheduledFor`. Prepared, approved, and ready-to-schedule rows are
|
|
140
|
+
intermediate states; report them as awaiting scheduler unless scheduled cells
|
|
141
|
+
are present.
|
|
142
|
+
|
|
143
|
+
## Evergreen Campaign Discipline
|
|
144
|
+
|
|
145
|
+
`fill_campaign_horizon` is a legacy evergreen-only lower-level primitive. Call it
|
|
146
|
+
only after `resolve_campaign_fill_route` and `get_campaign_refill_state` prove an
|
|
147
|
+
evergreen campaign target.
|
|
148
|
+
|
|
149
|
+
For evergreen campaigns, do not advance down the source ladder while the current source can produce enough good prospects.
|
|
150
|
+
The current source is exhausted, or
|
|
151
|
+
unable to produce enough good prospects, only when evidence includes source id,
|
|
152
|
+
target prospect gap, cursor/inventory state, dedupe/DNC/provider exclusions,
|
|
153
|
+
good-prospect yield, and scan/import caps. If that proof is missing, continue
|
|
154
|
+
the current source or ask for more research instead of walking the ladder.
|
|
155
|
+
|
|
156
|
+
## Hard Safety Rules
|
|
157
|
+
|
|
158
|
+
- Never call start or launch tools.
|
|
159
|
+
- Never raw-write `scheduledFor`, `scheduledAt`, scheduled status, or sender
|
|
160
|
+
assignment fields.
|
|
161
|
+
- Never expose internal direct campaign types as an operator refill path.
|
|
162
|
+
- Never claim scheduled success without rereading scheduler-owned cells with
|
|
163
|
+
non-null `scheduledFor`.
|
|
164
|
+
- No mutation in production unless Christian explicitly approves exact
|
|
165
|
+
workspace, campaign/table ids, source/action ids, caps/dates, approval mode,
|
|
166
|
+
expected side effects, and rollback/stop condition.
|
|
167
|
+
|
|
168
|
+
## Report
|
|
169
|
+
|
|
170
|
+
Report the selected target, target type, source state, blockers, exact next
|
|
171
|
+
primitive, approval required, and the freshness hash used. Say explicitly that
|
|
172
|
+
nothing was launched and nothing was sent.
|