@sellable/mcp 0.1.153 → 0.1.154
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/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/tools/leads.js +13 -4
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +26 -0
- package/skills/create-campaign-v2/SKILL.md +12 -0
- package/skills/create-campaign-v2/core/flow.v2.json +77 -12
- package/skills/research/config.json +0 -9
package/dist/index-dev.js
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/tools/leads.js
CHANGED
|
@@ -53,6 +53,11 @@ const defaultCampaignSourceDefaults = {
|
|
|
53
53
|
},
|
|
54
54
|
};
|
|
55
55
|
const defaultProviderSourceListTarget = 1000;
|
|
56
|
+
// Mirror the web app's Signal Discovery Harvest caps. The MCP tool selects and
|
|
57
|
+
// describes the scrape before the web API runs, so it must use the same capped
|
|
58
|
+
// capacity math instead of raw visible engagement counts.
|
|
59
|
+
const signalDiscoveryReactionFetchLimit = 1000;
|
|
60
|
+
const signalDiscoveryCommentFetchLimit = 1000;
|
|
56
61
|
const prospeoFilterValueSchema = {
|
|
57
62
|
type: "object",
|
|
58
63
|
description: "Include/exclude list filter (values must match Prospeo enums)",
|
|
@@ -341,11 +346,15 @@ function normalizePositiveInteger(value) {
|
|
|
341
346
|
}
|
|
342
347
|
return Math.floor(numeric);
|
|
343
348
|
}
|
|
349
|
+
function estimateScrapableSignalEngagers(post) {
|
|
350
|
+
return (Math.min(post.likes, signalDiscoveryReactionFetchLimit) +
|
|
351
|
+
Math.min(post.comments, signalDiscoveryCommentFetchLimit));
|
|
352
|
+
}
|
|
344
353
|
export function selectSignalPostsForImport(posts, options) {
|
|
345
354
|
const normalizedTargetEngagers = normalizePositiveInteger(options.targetEngagerCount);
|
|
346
355
|
const normalizedMaxPosts = normalizePositiveInteger(options.maxPostsToScrape);
|
|
347
356
|
if (!normalizedTargetEngagers && !normalizedMaxPosts) {
|
|
348
|
-
const availableEngagers = posts.reduce((sum, post) => sum + post
|
|
357
|
+
const availableEngagers = posts.reduce((sum, post) => sum + estimateScrapableSignalEngagers(post), 0);
|
|
349
358
|
return {
|
|
350
359
|
posts,
|
|
351
360
|
estimatedEngagers: availableEngagers,
|
|
@@ -355,8 +364,8 @@ export function selectSignalPostsForImport(posts, options) {
|
|
|
355
364
|
limited: false,
|
|
356
365
|
};
|
|
357
366
|
}
|
|
358
|
-
const ranked = [...posts].sort((a, b) => b
|
|
359
|
-
const availableEngagers = ranked.reduce((sum, post) => sum + post
|
|
367
|
+
const ranked = [...posts].sort((a, b) => estimateScrapableSignalEngagers(b) - estimateScrapableSignalEngagers(a));
|
|
368
|
+
const availableEngagers = ranked.reduce((sum, post) => sum + estimateScrapableSignalEngagers(post), 0);
|
|
360
369
|
const selected = [];
|
|
361
370
|
let estimatedEngagers = 0;
|
|
362
371
|
for (const post of ranked) {
|
|
@@ -364,7 +373,7 @@ export function selectSignalPostsForImport(posts, options) {
|
|
|
364
373
|
break;
|
|
365
374
|
}
|
|
366
375
|
selected.push(post);
|
|
367
|
-
estimatedEngagers += post
|
|
376
|
+
estimatedEngagers += estimateScrapableSignalEngagers(post);
|
|
368
377
|
if (normalizedTargetEngagers &&
|
|
369
378
|
estimatedEngagers >= normalizedTargetEngagers) {
|
|
370
379
|
break;
|
package/package.json
CHANGED
|
@@ -458,6 +458,32 @@ required field is missing, the supplied inputs conflict, or the campaign focus i
|
|
|
458
458
|
genuinely ambiguous. It is fine to include an explicit assumption line in the
|
|
459
459
|
brief; the approval gate lets the user revise it.
|
|
460
460
|
|
|
461
|
+
### YOLO Mode
|
|
462
|
+
|
|
463
|
+
If the invocation or any later user message explicitly asks for "yolo mode",
|
|
464
|
+
"YOLO", `--yolo`, `mode=yolo`, "autopilot", "use best guesses", "answer for
|
|
465
|
+
me", "use best estimates", or "just run it", enable YOLO mode for the rest of
|
|
466
|
+
the run. Treat YOLO as `interactionMode: "autonomous"` plus an intake policy:
|
|
467
|
+
|
|
468
|
+
- If campaign identity is missing, ask only for the LinkedIn profile or company
|
|
469
|
+
website in normal chat; do not ask buyer, offer, proof, source, or filter setup
|
|
470
|
+
questions before that.
|
|
471
|
+
- Treat any freeform directions already provided, or added later by the user, as
|
|
472
|
+
operator directions for the rest of the run. If directions conflict, the newest
|
|
473
|
+
user direction wins.
|
|
474
|
+
- After the lightweight identity/company lookup, infer the buyer segment,
|
|
475
|
+
offer/CTA, proof to use or avoid, first lead source, filter choice, and message
|
|
476
|
+
direction with best estimates from public/company context plus operator
|
|
477
|
+
directions. State the important assumptions in the brief and watch narration.
|
|
478
|
+
- Do not use structured setup questions in YOLO mode. For pre-launch approval
|
|
479
|
+
gates, choose the recommended path yourself when confidence is sufficient, show
|
|
480
|
+
the assumed choice briefly, and continue.
|
|
481
|
+
- Pause only when no reasonable estimate exists, a tool requires missing
|
|
482
|
+
credentials/data, the source/message quality floor fails, or the next action
|
|
483
|
+
would start the live campaign.
|
|
484
|
+
- Never call `start_campaign` from YOLO mode without explicit user launch
|
|
485
|
+
confirmation. Do not invent proof; mark proof gaps and use safer claims.
|
|
486
|
+
|
|
461
487
|
Before the identity gate, use this customer-facing shape:
|
|
462
488
|
|
|
463
489
|
```text
|
|
@@ -81,6 +81,18 @@ Use `research-sender` for concise identity/proof research and call
|
|
|
81
81
|
use the available Sellable profile/company/post tools and carry explicit proof
|
|
82
82
|
gaps into the brief.
|
|
83
83
|
|
|
84
|
+
## YOLO Mode
|
|
85
|
+
|
|
86
|
+
Enable YOLO mode when the user asks for yolo/autopilot, passes `--yolo` or
|
|
87
|
+
`mode=yolo`, or says to use best guesses/estimates and answer for them. Ask only
|
|
88
|
+
for the LinkedIn profile or company website if identity is missing. After the
|
|
89
|
+
identity lookup, infer buyer, offer/CTA, proof, source, filters, and message
|
|
90
|
+
direction from company evidence plus user directions; newest directions win.
|
|
91
|
+
Set `interactionMode: "autonomous"` once `campaignId` exists. Auto-select
|
|
92
|
+
pre-launch choices when confidence is sufficient, but show the assumed choice
|
|
93
|
+
briefly. Pause for missing credentials/data, failed quality floors, or final
|
|
94
|
+
launch. Never call `start_campaign` without explicit launch confirmation.
|
|
95
|
+
|
|
84
96
|
## Structured Questions
|
|
85
97
|
|
|
86
98
|
Use the host-native structured question gate (`request_user_input` or
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"campaignBrief",
|
|
23
23
|
"currentStep",
|
|
24
24
|
"watchNarration",
|
|
25
|
+
"interactionMode",
|
|
25
26
|
"providerSearchAssociation",
|
|
26
27
|
"selectedLeadListId",
|
|
27
28
|
"workflowTableId",
|
|
@@ -78,6 +79,40 @@
|
|
|
78
79
|
"Do not call start_campaign until the user explicitly confirms launch.",
|
|
79
80
|
"Do not use local files as durable state in normal customer runs."
|
|
80
81
|
],
|
|
82
|
+
"yoloMode": {
|
|
83
|
+
"triggerPhrases": [
|
|
84
|
+
"yolo",
|
|
85
|
+
"--yolo",
|
|
86
|
+
"mode=yolo",
|
|
87
|
+
"autopilot",
|
|
88
|
+
"use best guesses",
|
|
89
|
+
"use best estimates",
|
|
90
|
+
"answer for me",
|
|
91
|
+
"just run it"
|
|
92
|
+
],
|
|
93
|
+
"identityRequestOnlyWhenMissing": true,
|
|
94
|
+
"operatorDirectionsRule": "Treat freeform directions supplied at invocation or later as durable operator directions; newest conflicting direction wins.",
|
|
95
|
+
"setInteractionModeAfterCampaignCreate": "autonomous",
|
|
96
|
+
"autoSelectsPreLaunchChoices": [
|
|
97
|
+
"campaign focus",
|
|
98
|
+
"brief approval",
|
|
99
|
+
"source scouting plan",
|
|
100
|
+
"source review/import approval",
|
|
101
|
+
"filters vs skip filters",
|
|
102
|
+
"filter rubric approval",
|
|
103
|
+
"message template approval when recommendation is approve-message",
|
|
104
|
+
"generated message review when quality floor passes",
|
|
105
|
+
"sender selection when exactly one connected sender is safe"
|
|
106
|
+
],
|
|
107
|
+
"mustPauseFor": [
|
|
108
|
+
"missing campaign identity",
|
|
109
|
+
"missing credentials or required data",
|
|
110
|
+
"ambiguous choice with no reasonable estimate",
|
|
111
|
+
"source/message/filter quality floor failure",
|
|
112
|
+
"final live launch confirmation"
|
|
113
|
+
],
|
|
114
|
+
"neverAutoStart": true
|
|
115
|
+
},
|
|
81
116
|
"steps": [
|
|
82
117
|
{
|
|
83
118
|
"id": "bootstrap",
|
|
@@ -156,7 +191,23 @@
|
|
|
156
191
|
"uses": "request_user_input",
|
|
157
192
|
"singleChoice": true,
|
|
158
193
|
"requiredOption": "Other / custom",
|
|
159
|
-
"neverCollectOpenTextWithStructuredQuestion": true
|
|
194
|
+
"neverCollectOpenTextWithStructuredQuestion": true,
|
|
195
|
+
"skipIf": "yolo_mode with any reasonable best-estimate focus"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"action": "infer_strategy_packet_in_yolo_mode",
|
|
199
|
+
"when": "yolo_mode",
|
|
200
|
+
"skipStructuredSetupQuestions": true,
|
|
201
|
+
"inferFields": [
|
|
202
|
+
"buyer segment",
|
|
203
|
+
"offer/CTA",
|
|
204
|
+
"proof to use or avoid",
|
|
205
|
+
"lead source",
|
|
206
|
+
"filter choice",
|
|
207
|
+
"message direction"
|
|
208
|
+
],
|
|
209
|
+
"sourceOfTruth": "identity/company lookup plus operator directions",
|
|
210
|
+
"mustStateAssumptionsInBrief": true
|
|
160
211
|
},
|
|
161
212
|
{
|
|
162
213
|
"action": "create_watchable_campaign_shell_with_v1_brief",
|
|
@@ -231,7 +282,8 @@
|
|
|
231
282
|
{
|
|
232
283
|
"action": "ask_brief_choice",
|
|
233
284
|
"uses": "request_user_input",
|
|
234
|
-
"choices": ["Approve brief", "Revise brief", "Pause here"]
|
|
285
|
+
"choices": ["Approve brief", "Revise brief", "Pause here"],
|
|
286
|
+
"skipIf": "yolo_mode; auto_continue after rendering assumptions unless brief quality floor fails"
|
|
235
287
|
}
|
|
236
288
|
],
|
|
237
289
|
"requiredCampaignState": [
|
|
@@ -283,7 +335,12 @@
|
|
|
283
335
|
"fallback lane if the first lane is weak",
|
|
284
336
|
"what approval authorizes"
|
|
285
337
|
],
|
|
286
|
-
"approvalAuthorizes": "source scouting/search only; no import/send"
|
|
338
|
+
"approvalAuthorizes": "source scouting/search only; no import/send",
|
|
339
|
+
"yoloMode": {
|
|
340
|
+
"autoApproveRecommendedLane": true,
|
|
341
|
+
"mustShowAssumedChoice": true,
|
|
342
|
+
"pauseIfConfidenceLow": true
|
|
343
|
+
}
|
|
287
344
|
},
|
|
288
345
|
"defaultWhenSourceUnspecified": [
|
|
289
346
|
"signal-discovery",
|
|
@@ -325,7 +382,7 @@
|
|
|
325
382
|
"action": "show_pre_scout_source_recommendation",
|
|
326
383
|
"uses": "request_user_input",
|
|
327
384
|
"oneShot": true,
|
|
328
|
-
"skipIf": "approved or leadSourceProvider",
|
|
385
|
+
"skipIf": "approved or leadSourceProvider or yolo_mode auto-selected source_lane_approved",
|
|
329
386
|
"requiredBeforeTools": [
|
|
330
387
|
"get_provider_prompt",
|
|
331
388
|
"search_signals",
|
|
@@ -470,7 +527,8 @@
|
|
|
470
527
|
],
|
|
471
528
|
"requiredNextActionAfterApproval": "ack once; call import_leads immediately",
|
|
472
529
|
"signalDiscoveryNextTool": "import_leads({ provider: \"signal-discovery\", targetEngagerCount, maxPostsToScrape, confirmed: true })"
|
|
473
|
-
}
|
|
530
|
+
},
|
|
531
|
+
"autoSelectIf": "yolo_mode and projected usable pool clears the source quality floor"
|
|
474
532
|
}
|
|
475
533
|
],
|
|
476
534
|
"requiredCampaignState": [
|
|
@@ -615,7 +673,8 @@
|
|
|
615
673
|
{
|
|
616
674
|
"action": "ask_filter_choice",
|
|
617
675
|
"uses": "request_user_input",
|
|
618
|
-
"choices": ["Use filters", "Skip filters", "Revise source"]
|
|
676
|
+
"choices": ["Use filters", "Skip filters", "Revise source"],
|
|
677
|
+
"autoSelectIf": "yolo_mode; choose filters unless source is tightly curated or user directed otherwise"
|
|
619
678
|
}
|
|
620
679
|
],
|
|
621
680
|
"hardRules": [
|
|
@@ -729,7 +788,8 @@
|
|
|
729
788
|
"action": "ask_filter_rubric_review_choice",
|
|
730
789
|
"uses": "request_user_input",
|
|
731
790
|
"choices": ["Approve filters", "Revise filters", "Pause"],
|
|
732
|
-
"purpose": "let the user read saved rubrics before Filter Leads or enrichment"
|
|
791
|
+
"purpose": "let the user read saved rubrics before Filter Leads or enrichment",
|
|
792
|
+
"autoSelectIf": "yolo_mode and rubrics are production-shaped"
|
|
733
793
|
}
|
|
734
794
|
],
|
|
735
795
|
"requiredCampaignState": [
|
|
@@ -809,7 +869,8 @@
|
|
|
809
869
|
{
|
|
810
870
|
"action": "ask_filter_rubric_review_choice",
|
|
811
871
|
"uses": "request_user_input",
|
|
812
|
-
"choices": ["Approve filters", "Revise filters", "Pause"]
|
|
872
|
+
"choices": ["Approve filters", "Revise filters", "Pause"],
|
|
873
|
+
"autoSelectIf": "yolo_mode and rubrics are production-shaped"
|
|
813
874
|
}
|
|
814
875
|
],
|
|
815
876
|
"requiredCampaignState": ["campaignId", "workflowTableId"],
|
|
@@ -947,7 +1008,8 @@
|
|
|
947
1008
|
{
|
|
948
1009
|
"action": "ask_message_review_choice",
|
|
949
1010
|
"uses": "request_user_input",
|
|
950
|
-
"choices": ["approve-message", "revise-messaging"]
|
|
1011
|
+
"choices": ["approve-message", "revise-messaging"],
|
|
1012
|
+
"autoSelectIf": "yolo_mode and Recommendation is approve-message; revise autonomously when Recommendation is revise-messaging"
|
|
951
1013
|
},
|
|
952
1014
|
{
|
|
953
1015
|
"action": "sync_approved_message_set_to_campaign_brief",
|
|
@@ -1163,7 +1225,8 @@
|
|
|
1163
1225
|
"Revise filters",
|
|
1164
1226
|
"Revise message template",
|
|
1165
1227
|
"Pause here"
|
|
1166
|
-
]
|
|
1228
|
+
],
|
|
1229
|
+
"autoSelectIf": "yolo_mode and the first passing generated message clears the quality floor"
|
|
1167
1230
|
}
|
|
1168
1231
|
],
|
|
1169
1232
|
"allowedTools": [
|
|
@@ -1238,7 +1301,8 @@
|
|
|
1238
1301
|
"Use this connected sender",
|
|
1239
1302
|
"Connect a different sender in Settings",
|
|
1240
1303
|
"Pause here"
|
|
1241
|
-
]
|
|
1304
|
+
],
|
|
1305
|
+
"autoSelectIf": "yolo_mode and exactly one safe connected sender is available"
|
|
1242
1306
|
},
|
|
1243
1307
|
{
|
|
1244
1308
|
"action": "attach_selected_sender",
|
|
@@ -1266,7 +1330,8 @@
|
|
|
1266
1330
|
"uses": "request_user_input",
|
|
1267
1331
|
"singleChoice": true,
|
|
1268
1332
|
"choices": ["Start campaign", "Review campaign first", "Pause here"],
|
|
1269
|
-
"onUserStart": "claude-greenlight"
|
|
1333
|
+
"onUserStart": "claude-greenlight",
|
|
1334
|
+
"neverAutoSelectInYolo": true
|
|
1270
1335
|
}
|
|
1271
1336
|
],
|
|
1272
1337
|
"allowedTools": [
|