@sellable/mcp 0.1.205 → 0.1.207
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 +22 -20
- package/agents/post-find-leads-filter-scout.md +2 -2
- package/agents/post-find-leads-message-scout.md +39 -23
- package/agents/registry.json +17 -17
- package/agents/source-scout-linkedin-engagement.md +2 -2
- package/agents/source-scout-prospeo-contact.md +3 -3
- package/agents/source-scout-sales-nav.md +3 -3
- package/dist/engage-memory.js +5 -0
- package/dist/identity-memory.js +4 -0
- package/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/tools/engage-memory.js +2 -2
- package/dist/tools/leads.js +7 -11
- package/dist/tools/prompts.js +10 -10
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +43 -21
- package/skills/create-campaign/context/learnings.md +1 -1
- package/skills/create-campaign/references/brief-template.md +2 -2
- package/skills/create-campaign-brief/references/brief-template.md +2 -2
- package/skills/create-campaign-brief/references/draft-lifecycle.md +1 -1
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +2 -2
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +28 -41
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +9 -12
- package/skills/create-campaign-v2/SKILL.md +102 -105
- package/skills/create-campaign-v2/SOUL.md +28 -23
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2/references/ai-tells.md +10 -35
- package/skills/create-campaign-v2/references/approval-gate-framing.md +3 -3
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +16 -30
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +1 -1
- package/skills/create-campaign-v2/references/step-13-import-leads.md +2 -2
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +3 -12
- package/skills/create-campaign-v2/references/validation-criteria.md +5 -8
- package/skills/create-campaign-v2/references/watch-guide-narration.md +2 -2
- package/skills/create-campaign-v2-tail/SKILL.md +9 -9
- package/skills/create-campaign-v2-validation/SKILL.md +1 -1
- package/skills/create-post/SKILL.md +27 -27
- package/skills/engage/SKILL.md +12 -12
- package/skills/engage/core/README.md +14 -14
- package/skills/find-leads/SKILL.md +1 -1
- package/skills/generate-messages/SKILL.md +75 -175
- package/skills/interview/SKILL.md +24 -24
- package/skills/interview/references/legacy-linkedin-interview.md +12 -12
- package/skills/interview/references/reference-curation.md +4 -4
- package/skills/interview/references/voice-capture-method.md +1 -1
- package/skills/load-voice/SKILL.md +25 -21
- package/skills/providers/signal-discovery.md +2 -2
- package/skills/research/SKILL.md +1 -1
- package/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md +0 -252
- package/skills/research/config.json +0 -9
package/README.md
CHANGED
|
@@ -277,19 +277,21 @@ Parallel execution contract:
|
|
|
277
277
|
recommendation is reviewed. If filters are skipped, move to Messages/message
|
|
278
278
|
review. Enrichment/filtering and Generate Message cells wait for message
|
|
279
279
|
approval.
|
|
280
|
-
- Claude host: use the installed
|
|
281
|
-
`source-scout-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
- Codex host:
|
|
286
|
-
|
|
287
|
-
`source-scout-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
280
|
+
- Claude host: after Find Buyers Plan approval, use the installed
|
|
281
|
+
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
282
|
+
`source-scout-prospeo-contact` Task/Agent subagents as the normal source
|
|
283
|
+
path. Launch the approved single lane, or launch all credible lanes in one
|
|
284
|
+
assistant message when comparison/fallback is needed.
|
|
285
|
+
- Codex host: after Find Buyers Plan approval, use the named custom scout for
|
|
286
|
+
the approved source lane when subagents are available:
|
|
287
|
+
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, or
|
|
288
|
+
`source-scout-prospeo-contact`. Use a generic background agent when the named
|
|
289
|
+
scout is unavailable and the host can spawn one; parent-thread provider MCP
|
|
290
|
+
calls are the explicit fallback, not the default path.
|
|
291
|
+
- For prospect setup, Codex/Claude should launch Prospect Filters
|
|
292
|
+
(`post-find-leads-filter-scout`) and Message Drafting
|
|
293
|
+
(`post-find-leads-message-scout`) in the same turn/message when those
|
|
294
|
+
subagents are available in the current session.
|
|
293
295
|
If not, run them sequentially with MCP tools/assets, do not surface install
|
|
294
296
|
status to the customer, and do not claim parallel work.
|
|
295
297
|
- If neither backend is available, run sequentially with the same output schema.
|
|
@@ -345,12 +347,12 @@ with outcomes, and tracked people (LinkedIn profiles), all scoped by workspace.
|
|
|
345
347
|
|
|
346
348
|
- Auth + active workspace: `~/.sellable/config.json` (or `SELLABLE_CONFIG_PATH`; old `$CODEX_HOME/sellable.json`, `~/.codex/sellable.json`, and `~/.claude/sellable.json` files remain compatibility fallbacks)
|
|
347
349
|
- Engage memory (style guide + searches + tracked people): `sellable.engage.json` (or `SELLABLE_ENGAGE_MEMORY_PATH`)
|
|
348
|
-
- Team-editable
|
|
349
|
-
-
|
|
350
|
-
-
|
|
351
|
-
-
|
|
352
|
-
-
|
|
353
|
-
-
|
|
350
|
+
- Team-editable, project-local configs (recommended to edit in git):
|
|
351
|
+
- `./.sellable/configs/writing/styleguide.md`
|
|
352
|
+
- `./.sellable/configs/audience/icp-filters.md`
|
|
353
|
+
- `./.sellable/configs/proof/claims.md`
|
|
354
|
+
- `./.sellable/configs/discovery/influencers.md`
|
|
355
|
+
- `./.sellable/configs/discovery/post-filters.md`
|
|
354
356
|
|
|
355
357
|
Files under `mcp/sellable/skills/**/core/*` are **package repo files**, not the intended user config surface.
|
|
356
358
|
|
|
@@ -363,7 +365,7 @@ Primary public entrypoint for the approval-gated campaign creation flow.
|
|
|
363
365
|
### interview
|
|
364
366
|
|
|
365
367
|
Public identity/company memory interview. Builds durable core files under
|
|
366
|
-
|
|
368
|
+
`./.sellable/configs/core/**`, raw archives under `./.sellable/interviews/**`,
|
|
367
369
|
and reusable answer/proof/story/transcript/reference memory for downstream
|
|
368
370
|
Sellable writing workflows.
|
|
369
371
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
You are
|
|
1
|
+
You are Prospect Filters for Sellable create-campaign-v2.
|
|
2
2
|
|
|
3
|
-
Your job starts only after the
|
|
3
|
+
Your job starts only after the Start Import gate is approved or auto-confirmed,
|
|
4
4
|
the confirmed source list has been copied into the campaign table, and the first
|
|
5
5
|
campaign-table execution slice exists.
|
|
6
6
|
Work only on the lead filter branch. Do not source new leads, draft messages,
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
You are Message
|
|
1
|
+
You are Message Drafting for Sellable create-campaign-v2.
|
|
2
|
+
|
|
3
|
+
Your job starts only after the Start Import gate is approved, the confirmed
|
|
4
|
+
source list has been copied into the campaign table, the first campaign-table
|
|
5
|
+
execution slice exists, and the parent has recorded the filter choice. Work only
|
|
6
|
+
on the message-draft branch.
|
|
7
|
+
|
|
8
|
+
This worker exists to keep the long `generate-messages` prompt, reference asset
|
|
9
|
+
loading, token strategy, and skeptical copy review out of the parent campaign
|
|
10
|
+
thread. The parent thread is only the orchestrator: it supplies campaign/table
|
|
11
|
+
basis, receives the recommendation, persists the approved template after user
|
|
12
|
+
approval, and handles Settings/launch.
|
|
2
13
|
|
|
3
|
-
Your job starts only after the source is approved, the confirmed source list has
|
|
4
|
-
been copied into the campaign table, the first campaign-table execution slice
|
|
5
|
-
exists, and the parent has recorded the filter choice. Work only on the
|
|
6
|
-
message-draft branch.
|
|
7
14
|
Do not source leads, create lead filters, import leads, confirm lead lists, queue
|
|
8
15
|
cells, attach sequences, start campaigns, ask the user questions, or mutate live
|
|
9
16
|
campaign state. The main thread owns approval and campaign writes.
|
|
@@ -44,15 +51,9 @@ the branch input.
|
|
|
44
51
|
2. Use that prompt as the drafting contract. Do not use any alternate prompt,
|
|
45
52
|
examples-only shortcut, or create-campaign safety/checklist instructions as a
|
|
46
53
|
substitute for the full message prompt.
|
|
47
|
-
3.
|
|
48
|
-
pre-draft reference pack before drafting, load final-pass references before
|
|
49
|
-
approval, and report which assets were used and why. If those required
|
|
50
|
-
assets cannot be loaded, return `blocked` / `retry-needed`; do not draft from
|
|
51
|
-
the prompt alone. `ai-tells.md` is part of the required pack and is never
|
|
52
|
-
optional.
|
|
53
|
-
4. Draft only from the campaign brief, selected source context, and initial
|
|
54
|
+
3. Draft only from the campaign brief, selected source context, and initial
|
|
54
55
|
campaign-table execution slice rows supplied by the parent.
|
|
55
|
-
|
|
56
|
+
4. Keep the work provisional until the user chooses `Use Template` in Messages.
|
|
56
57
|
|
|
57
58
|
## Owned Output
|
|
58
59
|
|
|
@@ -60,8 +61,6 @@ Return the following to the parent thread:
|
|
|
60
61
|
|
|
61
62
|
- proposed first-message template using supported `{{...}}` tokens
|
|
62
63
|
- token fill rules and fallbacks
|
|
63
|
-
- `Reference Asset Loading` note naming the required and conditional assets used
|
|
64
|
-
and why each was used
|
|
65
64
|
- one rendered good-fill sample for a plausible passing campaign-table row
|
|
66
65
|
- one omit/fallback sample when the row signal is not safe
|
|
67
66
|
- pass/fail notes against the generate-messages quality gates
|
|
@@ -87,13 +86,13 @@ When reporting branch runtime proof, use this shape under
|
|
|
87
86
|
- `basisToken` and `basis`
|
|
88
87
|
- optional `messageDraftOutputRef`, `messageDraftOutput`, and `error`
|
|
89
88
|
|
|
90
|
-
Do not tell the UI to show Message
|
|
89
|
+
Do not tell the UI to show Message Drafting as running unless this proof
|
|
91
90
|
exists and points at the current non-empty campaign-table execution slice.
|
|
92
91
|
|
|
93
92
|
## Basis Changes And Rewrites
|
|
94
93
|
|
|
95
94
|
The first completed recommendation is the default message review candidate.
|
|
96
|
-
Do not automatically retry or regenerate only because
|
|
95
|
+
Do not automatically retry or regenerate only because Prospect Filters finished,
|
|
97
96
|
rubrics were saved, Filter Leads completed, enrichment cells populated, or more
|
|
98
97
|
row data became available after this branch started.
|
|
99
98
|
|
|
@@ -111,6 +110,27 @@ brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
|
|
|
111
110
|
execution-slice rows. Filter/rubric/enrichment basis drift alone is not a stale
|
|
112
111
|
blocker.
|
|
113
112
|
|
|
113
|
+
## User Revision Feedback
|
|
114
|
+
|
|
115
|
+
If the parent sends user feedback about the template before `approve-message`,
|
|
116
|
+
treat it as a Message Drafting revision, not a campaign write. Use the current
|
|
117
|
+
`messageDraftRecommendation`, basis token/hash, campaign/table basis, and the
|
|
118
|
+
latest user feedback as inputs. Load or reuse the full
|
|
119
|
+
`generate-messages` contract, then return a revised recommendation with:
|
|
120
|
+
|
|
121
|
+
- revised proposed template
|
|
122
|
+
- what changed and why
|
|
123
|
+
- token fill rule/fallback changes, if any
|
|
124
|
+
- one rendered good-fill sample
|
|
125
|
+
- pass/fail notes against the same quality gates
|
|
126
|
+
- updated output timestamp/hash and basis token
|
|
127
|
+
|
|
128
|
+
Keep the revision grounded in the same source/list/table rows unless the parent
|
|
129
|
+
explicitly supplies a new selected list or review slice. Do not call
|
|
130
|
+
`update_campaign_brief`, do not persist the template, and do not approve your
|
|
131
|
+
own revision. The parent renders the revised template and waits for
|
|
132
|
+
`approve-message`.
|
|
133
|
+
|
|
114
134
|
## Hard Rules
|
|
115
135
|
|
|
116
136
|
- Do not call product Generate Message cells. This worker drafts the template
|
|
@@ -133,14 +153,10 @@ reacted to`, `saw you engaging with`, or equivalent source-citation copy as a
|
|
|
133
153
|
hope this is relevant`, `saw you in a few conversations about [topic], so
|
|
134
154
|
may be off, but this seemed relevant`, `saw you might be interested in [topic],
|
|
135
155
|
so hope this is relevant`, `hope this is relevant if [topic] is on your plate`,
|
|
136
|
-
or `
|
|
137
|
-
Only use `saw you raise your hand for [topic], so figured this was (hopefully)
|
|
138
|
-
worth sending` when the source was an explicit lead-magnet comment, reply, or
|
|
139
|
-
opt-in.
|
|
156
|
+
or `saw you raise your hand for [topic], so figured this was (hopefully) worth sending`.
|
|
140
157
|
The cheekier `saw you raise your hand for [topic] (creepy to reach out based
|
|
141
158
|
on that, i know) - but this felt too on the nose to ignore` version is also
|
|
142
|
-
allowed
|
|
143
|
-
sender's voice can carry it. Bad: `you commented on...`, `you reacted
|
|
159
|
+
allowed when the sender's voice can carry it. Bad: `you commented on...`, `you reacted
|
|
144
160
|
to...`, `saw you engaging with...`, `your LinkedIn activity...`, `you might
|
|
145
161
|
not remember the thread...`, or `found you through [source] and your role
|
|
146
162
|
looked close...`. Otherwise omit the engagement signal and use role/company/problem context.
|
package/agents/registry.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"name": "source-scout-linkedin-engagement",
|
|
7
7
|
"kind": "source-scout",
|
|
8
8
|
"promptFile": "source-scout-linkedin-engagement.md",
|
|
9
|
-
"displayName": "LinkedIn
|
|
9
|
+
"displayName": "LinkedIn Source Discovery",
|
|
10
10
|
"provider": "signal-discovery",
|
|
11
11
|
"lane": "linkedin-engagement",
|
|
12
12
|
"legacy": {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"name": "source-scout-sales-nav",
|
|
57
57
|
"kind": "source-scout",
|
|
58
58
|
"promptFile": "source-scout-sales-nav.md",
|
|
59
|
-
"displayName": "Sales Nav
|
|
59
|
+
"displayName": "Sales Nav Source Discovery",
|
|
60
60
|
"provider": "sales-nav",
|
|
61
61
|
"lane": "sales-nav",
|
|
62
62
|
"legacy": {
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"name": "source-scout-prospeo-contact",
|
|
106
106
|
"kind": "source-scout",
|
|
107
107
|
"promptFile": "source-scout-prospeo-contact.md",
|
|
108
|
-
"displayName": "Prospeo
|
|
108
|
+
"displayName": "Prospeo Source Discovery",
|
|
109
109
|
"provider": "prospeo",
|
|
110
110
|
"lane": "prospeo-contact",
|
|
111
111
|
"legacy": {
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
"name": "post-find-leads-filter-scout",
|
|
156
156
|
"kind": "post-find-leads-scout",
|
|
157
157
|
"promptFile": "post-find-leads-filter-scout.md",
|
|
158
|
-
"displayName": "
|
|
158
|
+
"displayName": "Prospect Filters",
|
|
159
159
|
"target": "filter-leads",
|
|
160
160
|
"inputs": [
|
|
161
161
|
"campaignId",
|
|
@@ -166,20 +166,20 @@
|
|
|
166
166
|
],
|
|
167
167
|
"producesArtifacts": [],
|
|
168
168
|
"optionalProducesArtifacts": [],
|
|
169
|
-
"ownership": "
|
|
169
|
+
"ownership": "prospect-fit criteria, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
|
|
170
170
|
"codex": {
|
|
171
|
-
"description": "
|
|
171
|
+
"description": "Prospect Filters worker for campaign-backed fit criteria and rubric persistence after review-batch import and filter approval.",
|
|
172
172
|
"model": "gpt-5.5",
|
|
173
173
|
"modelReasoningEffort": "high",
|
|
174
174
|
"sandboxMode": "read-only",
|
|
175
175
|
"nicknameCandidates": [
|
|
176
|
-
"
|
|
177
|
-
"Fit
|
|
176
|
+
"Prospect Filters",
|
|
177
|
+
"Fit Criteria",
|
|
178
178
|
"Rubric Builder"
|
|
179
179
|
]
|
|
180
180
|
},
|
|
181
181
|
"claude": {
|
|
182
|
-
"description": "Use proactively as
|
|
182
|
+
"description": "Use proactively as Prospect Filters after review-batch import and filter approval to persist campaign rubrics from campaign state.",
|
|
183
183
|
"model": "inherit",
|
|
184
184
|
"background": true,
|
|
185
185
|
"maxTurns": 8,
|
|
@@ -196,8 +196,8 @@
|
|
|
196
196
|
"name": "post-find-leads-message-scout",
|
|
197
197
|
"kind": "post-find-leads-scout",
|
|
198
198
|
"promptFile": "post-find-leads-message-scout.md",
|
|
199
|
-
"displayName": "Message
|
|
200
|
-
"target": "generate-messages
|
|
199
|
+
"displayName": "Message Drafting",
|
|
200
|
+
"target": "generate-messages",
|
|
201
201
|
"inputs": [
|
|
202
202
|
"campaignId",
|
|
203
203
|
"campaignBrief",
|
|
@@ -212,20 +212,20 @@
|
|
|
212
212
|
"rendered sample"
|
|
213
213
|
],
|
|
214
214
|
"optionalProducesArtifacts": [],
|
|
215
|
-
"ownership": "proof inventory, token
|
|
215
|
+
"ownership": "message strategy, proof inventory, token rules, skeptical-prospect review, and selected winner only",
|
|
216
216
|
"codex": {
|
|
217
|
-
"description": "Message
|
|
217
|
+
"description": "Message Drafting worker for campaign-backed template proposals after confirm_lead_list imports a non-empty bounded review batch.",
|
|
218
218
|
"model": "gpt-5.5",
|
|
219
|
-
"modelReasoningEffort": "
|
|
219
|
+
"modelReasoningEffort": "xhigh",
|
|
220
220
|
"sandboxMode": "read-only",
|
|
221
221
|
"nicknameCandidates": [
|
|
222
|
-
"Message
|
|
223
|
-
"Draft
|
|
222
|
+
"Message Drafting",
|
|
223
|
+
"Draft Writer",
|
|
224
224
|
"Template Builder"
|
|
225
225
|
]
|
|
226
226
|
},
|
|
227
227
|
"claude": {
|
|
228
|
-
"description": "Use proactively as Message
|
|
228
|
+
"description": "Use proactively as Message Drafting after confirm_lead_list imports a non-empty bounded review batch; load generate-messages and draft only from scoped campaign/tool state.",
|
|
229
229
|
"model": "inherit",
|
|
230
230
|
"background": true,
|
|
231
231
|
"maxTurns": 10,
|
|
@@ -45,8 +45,8 @@ sales Claude`; do not treat broad anchor-only lanes like `Claude Code`, `MCP`,
|
|
|
45
45
|
campaignOfferId, selectionMode: "replace", selections, headlineICPCriteria,
|
|
46
46
|
scrapePlanMode: "all-selected", currentStep: "signal-discovery" })` before sampling so the watched Signal
|
|
47
47
|
Discovery table shows the promoted posts and the exact posts being tested.
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
|
|
49
|
+
visible transition after Start Import approval.
|
|
50
50
|
6. Fetch or sample engagers for promoted posts and score rough ICP fit from
|
|
51
51
|
visible headline/display-name cues only. Do not enrich people during
|
|
52
52
|
viability estimation.
|
|
@@ -12,8 +12,8 @@ campaignOfferId, confirmed: true })` and include that same `campaignOfferId`
|
|
|
12
12
|
If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
|
|
13
13
|
searches with `campaignOfferId` as campaign-attached persisted search tabs;
|
|
14
14
|
do not run a live campaign search without the campaign ID.
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
|
|
16
|
+
visible transition after Start Import approval.
|
|
17
17
|
|
|
18
18
|
Use the inherited Sellable MCP tools when available:
|
|
19
19
|
|
|
@@ -57,7 +57,7 @@ Evidence standards:
|
|
|
57
57
|
below 10% after reasonable refinement, recommend tightening the ICP/source
|
|
58
58
|
direction rather than switching providers again.
|
|
59
59
|
- Never recommend "import 25 leads" as the Prospeo source action. Recommend
|
|
60
|
-
|
|
60
|
+
Start Import for the approved source list; the parent thread later
|
|
61
61
|
copies the confirmed source rows into the campaign and internally uses the
|
|
62
62
|
first campaign-table execution slice for filter and message setup.
|
|
63
63
|
- Treat Prospeo as an account/contact and company hiring-signal lane, not as proof of fresh LinkedIn intent.
|
|
@@ -12,8 +12,8 @@ campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
|
|
|
12
12
|
route. If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
|
|
13
13
|
searches with `campaignOfferId` as campaign-attached persisted search tabs;
|
|
14
14
|
do not run a live campaign search without the campaign ID.
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
|
|
16
|
+
visible transition after Start Import approval.
|
|
17
17
|
|
|
18
18
|
Use the inherited Sellable MCP tools when available:
|
|
19
19
|
|
|
@@ -81,7 +81,7 @@ Evidence standards:
|
|
|
81
81
|
- If projected good-fit after cleanup is below 10%, do not recommend Sales Nav
|
|
82
82
|
as the winning source; recommend Prospeo as the next provider.
|
|
83
83
|
- Never recommend "import 25 leads" as the Sales Nav source action. Recommend
|
|
84
|
-
|
|
84
|
+
Start Import for the approved source list; the parent thread later
|
|
85
85
|
copies the confirmed source rows into the campaign and internally uses the
|
|
86
86
|
first campaign-table execution slice for filter and message setup.
|
|
87
87
|
- Do not hand-wave missing filter IDs.
|
package/dist/engage-memory.js
CHANGED
|
@@ -8,6 +8,11 @@ function resolveConfigsDir() {
|
|
|
8
8
|
if (process.env.SELLABLE_CONFIGS_DIR) {
|
|
9
9
|
candidates.push(path.resolve(process.env.SELLABLE_CONFIGS_DIR));
|
|
10
10
|
}
|
|
11
|
+
// Same resolution strategy as skills.ts
|
|
12
|
+
if (process.argv[1]) {
|
|
13
|
+
candidates.push(path.resolve(path.dirname(process.argv[1]), "../../.sellable/configs"));
|
|
14
|
+
}
|
|
15
|
+
candidates.push(path.resolve(process.cwd(), ".sellable/configs"));
|
|
11
16
|
candidates.push(path.resolve(os.homedir(), ".sellable/configs"));
|
|
12
17
|
for (const candidate of candidates) {
|
|
13
18
|
if (fs.existsSync(candidate)) {
|
package/dist/identity-memory.js
CHANGED
|
@@ -20,6 +20,10 @@ export function resolveIdentityConfigsDir() {
|
|
|
20
20
|
if (process.env.SELLABLE_CONFIGS_DIR) {
|
|
21
21
|
candidates.push(path.resolve(process.env.SELLABLE_CONFIGS_DIR));
|
|
22
22
|
}
|
|
23
|
+
if (process.argv[1]) {
|
|
24
|
+
candidates.push(path.resolve(path.dirname(process.argv[1]), "../../.sellable/configs"));
|
|
25
|
+
}
|
|
26
|
+
candidates.push(path.resolve(process.cwd(), ".sellable/configs"));
|
|
23
27
|
candidates.push(path.resolve(os.homedir(), ".sellable/configs"));
|
|
24
28
|
for (const candidate of candidates) {
|
|
25
29
|
if (fs.existsSync(candidate)) {
|
package/dist/index-dev.js
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -2,7 +2,7 @@ import { copySenderConfig, getEngageMemory, migrateFlatConfigs, recordProvenSear
|
|
|
2
2
|
export const engageMemoryToolDefinitions = [
|
|
3
3
|
{
|
|
4
4
|
name: "get_engage_memory",
|
|
5
|
-
description: "Load backward-compatible engage memory from
|
|
5
|
+
description: "Load backward-compatible engage memory from .sellable/configs/: style guide, proven search keywords, tracked people, plus optional core identity/company memory. All data lives in readable markdown files the user can also edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
|
|
6
6
|
inputSchema: {
|
|
7
7
|
type: "object",
|
|
8
8
|
properties: {
|
|
@@ -17,7 +17,7 @@ export const engageMemoryToolDefinitions = [
|
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
name: "set_engage_style_guide",
|
|
20
|
-
description: "Write the user's commenting style guide. When senderId is provided, writes to
|
|
20
|
+
description: "Write the user's commenting style guide. When senderId is provided, writes to .sellable/configs/senders/{senderId}/styleguide-core.md. Otherwise writes to .sellable/configs/writing/styleguide-core.md.",
|
|
21
21
|
inputSchema: {
|
|
22
22
|
type: "object",
|
|
23
23
|
properties: {
|
package/dist/tools/leads.js
CHANGED
|
@@ -1364,7 +1364,7 @@ export const leadToolDefinitions = [
|
|
|
1364
1364
|
},
|
|
1365
1365
|
limit: {
|
|
1366
1366
|
type: "number",
|
|
1367
|
-
description: "Max posts (default 25, max 50). Used for profile
|
|
1367
|
+
description: "Max posts (default 25, max 50). Used for profile search.",
|
|
1368
1368
|
},
|
|
1369
1369
|
headlineICPCriteria: {
|
|
1370
1370
|
type: "array",
|
|
@@ -3087,7 +3087,7 @@ export async function confirmLeadList(input) {
|
|
|
3087
3087
|
messageDraftBuilder: {
|
|
3088
3088
|
firstAllowedStartPoint: "confirm_lead_list",
|
|
3089
3089
|
startAllowed: true,
|
|
3090
|
-
requiredBeforeRunningCopy: "Persist watchNarration.workerDetails.messageDraftBuilder with runId or fallbackId, statusSource, status, startedAt, updatedAt, and current basis before showing Message
|
|
3090
|
+
requiredBeforeRunningCopy: "Persist watchNarration.workerDetails.messageDraftBuilder with runId or fallbackId, statusSource, status, startedAt, updatedAt, and current basis before showing Message Drafting as In Progress.",
|
|
3091
3091
|
requiredLiveInputs: {
|
|
3092
3092
|
campaignOfferId,
|
|
3093
3093
|
selectedLeadListId: resolvedLeadListId,
|
|
@@ -3133,10 +3133,10 @@ export async function confirmLeadList(input) {
|
|
|
3133
3133
|
warning: partialSourceListWarning,
|
|
3134
3134
|
},
|
|
3135
3135
|
message: copyStillRunning
|
|
3136
|
-
? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}First ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} are copied into the campaign table and the rest of the confirmed source list is still copying. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading
|
|
3136
|
+
? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}First ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} are copied into the campaign table and the rest of the confirmed source list is still copying. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading prospect setup workers.`
|
|
3137
3137
|
: importedRowCount > keptReviewRowCount
|
|
3138
|
-
? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading
|
|
3139
|
-
: `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table for the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading
|
|
3138
|
+
? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading prospect setup workers.`
|
|
3139
|
+
: `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table for the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading prospect setup workers.`,
|
|
3140
3140
|
};
|
|
3141
3141
|
}
|
|
3142
3142
|
export function getProviderPrompt(input) {
|
|
@@ -3176,9 +3176,7 @@ export async function selectPromisingPosts(input) {
|
|
|
3176
3176
|
const { campaignOfferId, selections, headlineICPCriteria, selectionMode, mode, scrapePlanMode, targetEngagerCount, maxPostsToScrape, } = input;
|
|
3177
3177
|
const effectiveMode = selectionMode ?? mode ?? "replace";
|
|
3178
3178
|
const effectiveScrapePlanMode = scrapePlanMode ??
|
|
3179
|
-
(targetEngagerCount || maxPostsToScrape
|
|
3180
|
-
? "capacity-target"
|
|
3181
|
-
: "all-selected");
|
|
3179
|
+
(targetEngagerCount || maxPostsToScrape ? "capacity-target" : "all-selected");
|
|
3182
3180
|
if (selections.length > MAX_SIGNAL_DISCOVERY_POSTS) {
|
|
3183
3181
|
return {
|
|
3184
3182
|
success: false,
|
|
@@ -3250,9 +3248,7 @@ export async function selectPromisingPosts(input) {
|
|
|
3250
3248
|
}
|
|
3251
3249
|
const recommendation = buildSignalDiscoverySourceRecommendation({
|
|
3252
3250
|
selectedPosts: Array.from(selectedByUrl.values()),
|
|
3253
|
-
targetEngagerCount: effectiveScrapePlanMode === "capacity-target"
|
|
3254
|
-
? targetEngagerCount
|
|
3255
|
-
: null,
|
|
3251
|
+
targetEngagerCount: effectiveScrapePlanMode === "capacity-target" ? targetEngagerCount : null,
|
|
3256
3252
|
maxPostsToScrape: effectiveScrapePlanMode === "capacity-target" ? maxPostsToScrape : null,
|
|
3257
3253
|
});
|
|
3258
3254
|
sourceRecommendation = recommendation.message;
|
package/dist/tools/prompts.js
CHANGED
|
@@ -157,7 +157,7 @@ export const promptToolDefinitions = [
|
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
name: "get_post_find_leads_scout_registry",
|
|
160
|
-
description: "Return
|
|
160
|
+
description: "Return canonical Sellable prospect-setup worker names for Prospect Filters and Message Drafting after Start Import copies confirmed source rows.",
|
|
161
161
|
inputSchema: {
|
|
162
162
|
type: "object",
|
|
163
163
|
properties: {},
|
|
@@ -257,9 +257,9 @@ export function getSourceScoutRegistry() {
|
|
|
257
257
|
legacy: agent.legacy,
|
|
258
258
|
})),
|
|
259
259
|
usage: {
|
|
260
|
-
codex: "Source finding is
|
|
261
|
-
claude: "Source finding is
|
|
262
|
-
parentThreadRule: "Named
|
|
260
|
+
codex: "Source finding is agent-first after Find Buyers Plan approval. Launch the approved returned `name` as a Codex custom agent whenever the host exposes it; YOLO/autonomous mode counts as campaign-scoped permission. Launch multiple returned `name` values in one assistant turn only when comparing lanes, a prior lane failed, or the active flow marks the first lane borderline.",
|
|
261
|
+
claude: "Source finding is agent-first after Find Buyers Plan approval. Invoke the approved returned `name` with Task/Agent when the current Claude session lists it. Invoke multiple Task/Agent subagents with subagent_type equal to returned `name` values only when comparison, fallback, or borderline-source conditions apply.",
|
|
262
|
+
parentThreadRule: "Named source scouts are the normal path, not optional acceleration, after the Find Buyers Plan approval. If the approved named scout is absent or blocked, do not customer-surface install status; either spawn a generic gpt-5.5 high background agent with the same source-lane basis or continue inline only when the user explicitly approves parent-thread fallback. Default fallback order: Signal Discovery / LinkedIn engagement, then Sales Nav recent activity, then broader Sales Nav title search, then Prospeo account/contact search. Do not preload every provider prompt before spawning agents; each scout loads only the provider prompt for its lane.",
|
|
263
263
|
},
|
|
264
264
|
};
|
|
265
265
|
}
|
|
@@ -330,7 +330,7 @@ export function getPostFindLeadsScoutRegistry() {
|
|
|
330
330
|
"basis.workflowTableId",
|
|
331
331
|
"basis.reviewSampleRowHash or basis.reviewSampleRowIds",
|
|
332
332
|
],
|
|
333
|
-
promptRequired: 'get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt
|
|
333
|
+
promptRequired: 'get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt and its Reference Asset Loading pack are required inside the Message Drafting branch for normal message drafting. If required assets cannot be loaded, return blocked/retry-needed instead of drafting from prompt memory.',
|
|
334
334
|
basisFields: [
|
|
335
335
|
"campaign revision or updatedAt",
|
|
336
336
|
"brief hash",
|
|
@@ -343,9 +343,9 @@ export function getPostFindLeadsScoutRegistry() {
|
|
|
343
343
|
messageDraftOutputFields: [
|
|
344
344
|
"templateRecommendation",
|
|
345
345
|
"tokenFillRules",
|
|
346
|
-
"referenceAssetLoading",
|
|
347
346
|
"renderedSample",
|
|
348
347
|
"concerns",
|
|
348
|
+
"revisionNotes when user feedback triggered a revision",
|
|
349
349
|
"status",
|
|
350
350
|
"basisStatus",
|
|
351
351
|
"basisToken",
|
|
@@ -353,12 +353,12 @@ export function getPostFindLeadsScoutRegistry() {
|
|
|
353
353
|
"outputHash",
|
|
354
354
|
"error or retry detail",
|
|
355
355
|
],
|
|
356
|
-
reusePolicy: "The first completed Message
|
|
356
|
+
reusePolicy: "The first completed Message Drafting recommendation remains the default review candidate. Later Prospect Filters, Filter Leads, enrichment, or rubric completion may make an enriched rewrite available, but does not automatically retry or replace the initial draft unless campaign/brief/source/list/table/review-sample identity mismatches or the initial output failed. User copy feedback before approve-message is an explicit Message Drafting revision and must be routed back through the message branch with the current recommendation and basis.",
|
|
357
357
|
},
|
|
358
358
|
usage: {
|
|
359
|
-
codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn returned
|
|
360
|
-
claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke returned
|
|
361
|
-
parentThreadRule: '
|
|
359
|
+
codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn returned prospect-setup worker names before that question. Once the user answers, spawn Message Drafting from the same campaign/table basis whenever Codex agent-launch policy is satisfied. Treat YOLO/autonomous mode as campaign-scoped permission to use Sellable background agents for pre-launch work. If the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once for permission before loading generate-messages in the parent. If permission is granted and the named custom agent is unavailable, spawn a generic gpt-5.5 xhigh background agent with the same campaign/table basis. If the user chooses filters, also spawn Prospect Filters when allowed, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
|
|
360
|
+
claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke returned prospect-setup Task/Agent names before that question. Once the user answers, invoke Message Drafting from the same campaign/table basis. If the user chooses filters, also invoke Prospect Filters, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
|
|
361
|
+
parentThreadRule: 'Message drafting is agent-first, not optional acceleration. If post-find-leads-message-scout is available, run that compatibility agent as background Message Drafting after the filter-choice answer. In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use Sellable background agents for pre-launch work; if the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once for that permission before loading generate-messages in the parent. If permission is granted and the named custom agent is unavailable, spawn a generic gpt-5.5 xhigh background agent with the same campaign/table basis. Do not silently fall back to parent-thread message drafting. The parent may run the message branch inline only if the user explicitly says to continue without a background agent; when doing so, state that message generation is running inline. Local markdown/json files are not normal-path inputs. The filter-choice question is the first post-import user gate; do not load prospect-setup registries or filter references before it. Message drafting starts after the filter-choice answer, must load get_subskill_prompt({ subskillName: "generate-messages" }) and its Reference Asset Loading pack inside the branch or explicitly approved inline fallback, must read live campaign table state through scoped MCP/product tools, and must reject mismatched selectedLeadListId/workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. User copy feedback before approve-message must be routed back to Message Drafting with the current recommendation, basis token, campaign/table basis, and latest user text; the parent must not rewrite the template or call update_campaign_brief before approve-message. On the filter path, keep the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt ran for the current campaign/table execution slice. Do not automatically rerun Message Drafting after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
|
|
362
362
|
},
|
|
363
363
|
};
|
|
364
364
|
}
|