@sellable/mcp 0.1.117 → 0.1.118
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/package.json
CHANGED
|
@@ -435,19 +435,32 @@ brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
|
|
|
435
435
|
currentStep: "pick-provider", watchNarration: { ... } })` after approval so
|
|
436
436
|
the watch link moves out of Plan while the main thread compares source paths.
|
|
437
437
|
|
|
438
|
-
- After the brief is approved, show the next progress line
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
438
|
+
- After the brief is approved, show the next progress line. When the user has
|
|
439
|
+
not given a specific source direction, use the default sequential source
|
|
440
|
+
funnel:
|
|
441
|
+
`Cool. I'm going to find people who are both a good fit and active enough to
|
|
442
|
+
be worth a LinkedIn test. I'll start with warm LinkedIn post engagement because
|
|
443
|
+
that gives the strongest message context if enough ICP-looking people are
|
|
444
|
+
engaging. If that does not clear a quick viability check, I'll switch to Sales
|
|
445
|
+
Nav with recent activity, then broader Sales Nav, and use Prospeo only as the
|
|
446
|
+
fallback. No leads import until you approve the source.`
|
|
447
|
+
- If the user's request already points to a source, do not force the default
|
|
448
|
+
funnel. Start with the matching lane and say why:
|
|
449
|
+
- specific posts, creators, topics, comments, or engagement signals ->
|
|
450
|
+
Signal Discovery
|
|
451
|
+
- title/persona/company filters or broad LinkedIn people search -> Sales Nav
|
|
452
|
+
- hiring signals, account/domain lists, company growth triggers, email/domain
|
|
453
|
+
search, or target accounts -> Prospeo
|
|
454
|
+
- supplied CSV/profile list -> existing/supplied list preview
|
|
455
|
+
- explicit compare request -> compare only the requested sources
|
|
444
456
|
- In watch mode, do not leave the user sitting on only `pick-provider` while
|
|
445
|
-
source
|
|
446
|
-
(`signal-discovery`, `sales-nav`,
|
|
447
|
-
|
|
448
|
-
in the parent thread with `campaignOfferId`, `confirmed: true`, and
|
|
449
|
-
`currentStep` when the tool accepts it.
|
|
450
|
-
the
|
|
457
|
+
source viability is checked. Move the campaign to the first source lane that
|
|
458
|
+
will actually be tested (`signal-discovery`, `sales-nav`, `prospeo`, or the
|
|
459
|
+
user-directed lane), then run the campaign-attached provider prompt + provider
|
|
460
|
+
search in the parent thread with `campaignOfferId`, `confirmed: true`, and
|
|
461
|
+
`currentStep` when the tool accepts it. If that lane fails the quick viability
|
|
462
|
+
gate, update the campaign step and watchNarration before trying the next lane
|
|
463
|
+
so the user sees the source switch happen in the app.
|
|
451
464
|
- After the lead sample/source decision is ready and approved,
|
|
452
465
|
show the next progress line:
|
|
453
466
|
`Lead source is set. I'll import the first 15-row review batch into the
|
|
@@ -787,42 +800,47 @@ Required behavior:
|
|
|
787
800
|
allowed by `flow.v2.json`
|
|
788
801
|
- only mutate campaign-attached source preview state in the narrow watch-mode
|
|
789
802
|
ways allowed by the active flow step
|
|
790
|
-
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
If
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
803
|
+
- use the default sequential source viability funnel when the user did not
|
|
804
|
+
specify a source. The goal is to choose a source quickly enough to keep the
|
|
805
|
+
watched campaign moving, not to compare every plausible lane in parallel.
|
|
806
|
+
Run only enough evidence for the current lane to pass or fail the quick gate,
|
|
807
|
+
then stop on the first viable source unless the user asked to compare.
|
|
808
|
+
1. Start with LinkedIn Engagement / active LinkedIn posts (internal provider:
|
|
809
|
+
Signals / `signal-discovery`) because recent engagement gives the strongest
|
|
810
|
+
message context and expected reply-rate upside. Search relevant keyword
|
|
811
|
+
lanes, review finalist posts, promote the sampled posts with
|
|
812
|
+
`select_promising_posts` before fetching engagers when a campaign shell
|
|
813
|
+
exists, fetch top-post engagers, and estimate warm-fit volume.
|
|
814
|
+
2. If Signals does not have enough recent, relevant, ICP-looking engagers,
|
|
815
|
+
switch to Sales Nav with recent activity when the target can be expressed
|
|
816
|
+
as title/persona/company filters. Run preview filters, inspect preview rows,
|
|
817
|
+
validate the filters applied, and estimate scalable-fit volume.
|
|
818
|
+
3. If recent-activity Sales Nav is too small or noisy, broaden to normal Sales
|
|
819
|
+
Nav title + company filters and call out the weaker activity context.
|
|
820
|
+
4. Use Prospeo Contact only when the campaign has a domain/account path, the
|
|
821
|
+
user supplied domains, the user asked for hiring/growth/account triggers,
|
|
822
|
+
or the LinkedIn-first paths fail. Estimate email/contact scale and call out
|
|
823
|
+
weaker LinkedIn activity.
|
|
824
|
+
- source-specific user direction overrides the default funnel. If the user
|
|
825
|
+
names hiring signals, account/domain lists, company growth triggers, or target
|
|
826
|
+
accounts, start with Prospeo. If they supply profiles or a CSV, start with the
|
|
827
|
+
supplied-list preview. If they name posts, comments, creators, or engagement,
|
|
828
|
+
start with Signal Discovery. If they name titles/personas/company filters,
|
|
829
|
+
start with Sales Nav. If they explicitly ask for a comparison, compare only
|
|
830
|
+
those requested sources.
|
|
831
|
+
- run source scouts in parallel only when the user explicitly requested a
|
|
832
|
+
comparison, the current turn is resuming from already-started parallel scouts,
|
|
833
|
+
or the first viable source is borderline and one cheap fallback check is
|
|
834
|
+
necessary for the recommendation. Call `get_source_scout_registry` first so
|
|
835
|
+
new scouts can be added without prompt rewrites. In Codex, explicitly spawn
|
|
836
|
+
named custom subagents in the same turn when the host exposes them:
|
|
837
|
+
`source-scout-linkedin-engagement` / LinkedIn Engagement Scout,
|
|
838
|
+
`source-scout-sales-nav`, and `source-scout-prospeo-contact` for the requested
|
|
839
|
+
or fallback lanes. Codex does not infer this from generic "compare paths"
|
|
840
|
+
wording. In Claude Code, launch the matching Task/Agent subagents only when
|
|
841
|
+
the current session lists those names. If they are absent, run the same
|
|
806
842
|
provider probes with MCP tools from the parent thread and keep
|
|
807
843
|
`lead-review.md` focused on source evidence, not host-agent availability.
|
|
808
|
-
- Branch A: LinkedIn Engagement / active LinkedIn posts (internal provider:
|
|
809
|
-
Signals / `signal-discovery`). Search relevant keyword lanes, review
|
|
810
|
-
finalist posts, promote the sampled posts with `select_promising_posts`
|
|
811
|
-
before fetching engagers when a campaign shell exists, fetch top-post
|
|
812
|
-
engagers, and estimate warm-fit volume.
|
|
813
|
-
- Branch B: Sales Nav / title + company filters. Run preview filters, inspect
|
|
814
|
-
preview rows, and estimate scalable-fit volume.
|
|
815
|
-
- Branch C: Prospeo Contact / domains only when the campaign has a
|
|
816
|
-
domain/account path or the user supplied domains. Estimate email/contact
|
|
817
|
-
scale and call out weaker LinkedIn activity.
|
|
818
|
-
If the host cannot run these branches in parallel, run them sequentially and
|
|
819
|
-
do not claim they ran in parallel. If only one source angle is credible, say
|
|
820
|
-
that and run the best primary source plus one cheap fallback/quality check
|
|
821
|
-
when available. For Signals-first campaigns, search multiple Signals keyword
|
|
822
|
-
lanes and fetch top-post engagers in parallel when tool batching allows it.
|
|
823
|
-
For Sales Nav-first or Prospeo/account-first campaigns, run multiple preview
|
|
824
|
-
lanes for that provider in parallel and use Signals only as a warmth/quality
|
|
825
|
-
check when relevant.
|
|
826
844
|
- after every Sales Nav preview, validate that filters actually applied before
|
|
827
845
|
using the lane in `lead-review.md`: `searchUrl` should include filters, the
|
|
828
846
|
first page should match the intended roles/companies, and the result count
|
|
@@ -508,6 +508,30 @@
|
|
|
508
508
|
{
|
|
509
509
|
"id": "find-leads",
|
|
510
510
|
"label": "Find leads",
|
|
511
|
+
"sourceSelectionFunnel": {
|
|
512
|
+
"defaultWhenSourceUnspecified": [
|
|
513
|
+
"signal-discovery",
|
|
514
|
+
"sales-nav-recent-active",
|
|
515
|
+
"sales-nav-general",
|
|
516
|
+
"prospeo"
|
|
517
|
+
],
|
|
518
|
+
"sourceDirectionOverrides": {
|
|
519
|
+
"postEngagement": "signal-discovery",
|
|
520
|
+
"creatorOrCommentSignals": "signal-discovery",
|
|
521
|
+
"titlePersonaCompanyFilters": "sales-nav",
|
|
522
|
+
"hiringSignals": "prospeo",
|
|
523
|
+
"companyGrowthTriggers": "prospeo",
|
|
524
|
+
"targetAccountsOrDomains": "prospeo",
|
|
525
|
+
"suppliedProfilesOrCsv": "supplied-list",
|
|
526
|
+
"explicitCompare": "compare-requested-sources"
|
|
527
|
+
},
|
|
528
|
+
"quickViabilityRule": "Run only enough of the current lane to decide whether it can supply relevant, reachable ICP-looking leads. Stop on the first viable source unless the user asked for comparison.",
|
|
529
|
+
"parallelAllowedOnlyWhen": [
|
|
530
|
+
"user explicitly requested source comparison",
|
|
531
|
+
"resuming already-started parallel scouts",
|
|
532
|
+
"first viable source is borderline and one cheap fallback check is needed"
|
|
533
|
+
]
|
|
534
|
+
},
|
|
511
535
|
"onEnter": [
|
|
512
536
|
{
|
|
513
537
|
"action": "advance_watch_to_source_selection",
|
|
@@ -521,8 +545,8 @@
|
|
|
521
545
|
"currentStep": "pick-provider",
|
|
522
546
|
"watchNarration.stage": "find-leads"
|
|
523
547
|
},
|
|
524
|
-
"when": "
|
|
525
|
-
"chatRenderRule": "Move the campaign watch view to Find Leads before the main thread starts
|
|
548
|
+
"when": "before_sequential_source_funnel",
|
|
549
|
+
"chatRenderRule": "Move the campaign watch view to Find Leads before the main thread starts source viability work. If the user did not specify a source, explain the default order: start with warm LinkedIn post engagement because it gives stronger message context and expected reply-rate upside when enough ICP-looking engagers exist; if it is not viable, switch to Sales Nav with recent activity, then broader Sales Nav, and use Prospeo only as the fallback. If the user did specify hiring signals, domains/accounts, supplied lists, posts/comments, or titles/personas, explain that the matching source overrides the default funnel. State that no leads import until a source is approved. The watchNarration headline/body must name the lane being tested, why this lane now, the quick viability gate, and the safety boundary. Do not mention MCP or local artifacts."
|
|
526
550
|
},
|
|
527
551
|
{
|
|
528
552
|
"action": "advance_watch_to_initial_source_lane",
|
|
@@ -540,8 +564,8 @@
|
|
|
540
564
|
"existingList": "saved-lists",
|
|
541
565
|
"uploadedDomains": "prospeo"
|
|
542
566
|
},
|
|
543
|
-
"when": "
|
|
544
|
-
"rule": "Choose the
|
|
567
|
+
"when": "before_first_source_attempt",
|
|
568
|
+
"rule": "Choose the first visible source lane from explicit source direction when present, otherwise default to Signal Discovery. Send watchNarration with stage find-leads that says why this lane is being tried now, what quick sample or filter gate will pass/fail it, and why that helps this campaign. For Signal Discovery sampling, promote/select the posts with select_promising_posts before fetch_post_engagers so the watched table shows the exact posts being sampled; the guide copy should say Codex is pulling sample engagers from these posts to confirm the ICP is actually engaging and the source is viable. If the lane fails, update currentStep and watchNarration before moving to Sales Nav recent activity, normal Sales Nav, or Prospeo."
|
|
545
569
|
},
|
|
546
570
|
{
|
|
547
571
|
"action": "run_first_campaign_attached_source_search",
|
|
@@ -549,8 +573,8 @@
|
|
|
549
573
|
"campaignOfferId",
|
|
550
574
|
"currentStep"
|
|
551
575
|
],
|
|
552
|
-
"before": "
|
|
553
|
-
"rule": "
|
|
576
|
+
"before": "evaluating_source_viability_gate",
|
|
577
|
+
"rule": "The parent thread must run the campaign-attached provider prompt + provider search for the current visible lane with campaignOfferId and currentStep (signal-discovery, sales-nav, prospeo, or the user-directed lane) so the campaign UI creates the corresponding live search/tab. Do not wait on background scouts before the user sees the active lane. Run only enough evidence to pass/fail this lane, then either recommend it or update the visible lane before trying the next fallback."
|
|
554
578
|
},
|
|
555
579
|
{
|
|
556
580
|
"action": "render_find_leads_progress",
|
|
@@ -558,6 +582,9 @@
|
|
|
558
582
|
"good fit and active enough to be worth a LinkedIn test",
|
|
559
583
|
"campaign source step",
|
|
560
584
|
"primary source",
|
|
585
|
+
"source hypothesis",
|
|
586
|
+
"why this source now",
|
|
587
|
+
"quick viability gate",
|
|
561
588
|
"expected volume",
|
|
562
589
|
"sampled ICP fit",
|
|
563
590
|
"activity/warmth signal",
|
|
@@ -587,7 +614,7 @@
|
|
|
587
614
|
"action": "run_subskill",
|
|
588
615
|
"target": "find-leads",
|
|
589
616
|
"mode": "campaign-attached-required",
|
|
590
|
-
"sourceScoutRule": "Shell-first flow requires the CampaignOffer campaignId from durable state. Pass campaignId as campaignOfferId into every provider prompt/search that can persist source state (`get_provider_prompt({ provider, campaignOfferId, confirmed: true })`, `search_signals`, `search_sales_nav`, `search_prospeo`) and include currentStep for tools that accept it so the user can watch the selected source inside the campaign.
|
|
617
|
+
"sourceScoutRule": "Shell-first flow requires the CampaignOffer campaignId from durable state. Pass campaignId as campaignOfferId into every provider prompt/search that can persist source state (`get_provider_prompt({ provider, campaignOfferId, confirmed: true })`, `search_signals`, `search_sales_nav`, `search_prospeo`) and include currentStep for tools that accept it so the user can watch the selected source inside the campaign. Use the default sequential source viability funnel when the user did not specify a source: Signal Discovery first, then Sales Nav with recent activity, then general Sales Nav, then Prospeo only as fallback. Stop on the first viable source unless the user explicitly asked to compare. If the user names hiring signals, domains/accounts, supplied lists, posts/comments, or title/persona filters, start with the matching source instead. Parallel source scouts only when the user requested comparison, an existing parallel run is being resumed, or the first viable source is borderline and one cheap fallback check is needed. The later import_leads call must use the same campaignOfferId. Do not import, confirm, enrich, queue, or start leads during source discovery."
|
|
591
618
|
},
|
|
592
619
|
{
|
|
593
620
|
"action": "optional_debug_artifacts",
|
|
@@ -74,6 +74,45 @@ Signal Discovery:
|
|
|
74
74
|
}
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
+
Default source funnel:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"stage": "find-leads",
|
|
82
|
+
"headline": "Testing warm LinkedIn activity",
|
|
83
|
+
"visibleState": "Codex is starting with recent post engagement because it gives the strongest message context if enough ICP-looking people are active there.",
|
|
84
|
+
"agentIntent": "If this lane does not clear the quick sample gate, it will switch to Sales Nav with recent activity, then broader Sales Nav, and use Prospeo only as the fallback.",
|
|
85
|
+
"nextAction": "Review source",
|
|
86
|
+
"safety": "No leads import until you approve the source."
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Source direction override:
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"stage": "find-leads",
|
|
95
|
+
"headline": "Testing the requested source",
|
|
96
|
+
"visibleState": "The campaign asked for hiring and account signals, so Codex is starting with Prospeo instead of the default LinkedIn engagement path.",
|
|
97
|
+
"agentIntent": "It is checking whether this source has enough reachable ICP-looking people before importing a review batch.",
|
|
98
|
+
"nextAction": "Review source",
|
|
99
|
+
"safety": "No leads import until you approve the source."
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Source fallback:
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"stage": "find-leads",
|
|
108
|
+
"headline": "Switching source lanes",
|
|
109
|
+
"visibleState": "The Signal Discovery sample did not show enough ICP-looking engagers for a confident first batch.",
|
|
110
|
+
"agentIntent": "Codex is trying Sales Nav with recent activity so the source can still preserve some buyer activity context.",
|
|
111
|
+
"nextAction": "Review source",
|
|
112
|
+
"safety": "No leads import until you approve the source."
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
77
116
|
Search iteration:
|
|
78
117
|
|
|
79
118
|
```json
|