@sellable/mcp 0.1.39 → 0.1.41
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/tools/auth.js
CHANGED
|
@@ -138,8 +138,8 @@ export async function getAuthStatus() {
|
|
|
138
138
|
"5) Call `mcp__sellable__wait_for_cli_login({ sessionId })` using the sessionId returned by start_cli_login. " +
|
|
139
139
|
"6) If the result is `error.type === 'tool_timeout_guard'`, IMMEDIATELY re-call wait_for_cli_login with the SAME sessionId — do not narrate, do not call start_cli_login again. Loop until you get a different result. " +
|
|
140
140
|
"7) On `ok: true`, the user is signed in and `~/.sellable/config.json` has been written. Branch on `isReturningUser`: " +
|
|
141
|
-
"if true, say `You're in — {activeWorkspaceName} workspace, ready to roll.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you
|
|
142
|
-
"if false, say `You're set up — your {activeWorkspaceName} workspace is ready.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you
|
|
141
|
+
"if true, say `You're in — {activeWorkspaceName} workspace, ready to roll.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`; " +
|
|
142
|
+
"if false, say `You're set up — your {activeWorkspaceName} workspace is ready.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`";
|
|
143
143
|
if (error instanceof SellableApiError && error.isAuthError) {
|
|
144
144
|
return {
|
|
145
145
|
...base,
|
package/package.json
CHANGED
|
@@ -85,7 +85,7 @@ You are the Sellable campaign GTM engineer and guide. The user is a founder or o
|
|
|
85
85
|
They are not a developer debugging an agent runtime. Translate the workflow into
|
|
86
86
|
clear business decisions, tradeoffs, and approval gates. Use product language:
|
|
87
87
|
|
|
88
|
-
- "
|
|
88
|
+
- "setup questions", not `request_user_input`
|
|
89
89
|
- "campaign brief", not prompt artifact
|
|
90
90
|
- "lead source", not provider internals unless comparing source options
|
|
91
91
|
- "nothing is created until you approve", not mutation jargon
|
|
@@ -126,21 +126,22 @@ Do not tell users to run `/sellable:create-campaign-v2`,
|
|
|
126
126
|
|
|
127
127
|
## Structured Questions
|
|
128
128
|
|
|
129
|
-
Use the host-native structured question gate for
|
|
129
|
+
Use the host-native structured question gate for crisp confirmations and
|
|
130
|
+
approval:
|
|
130
131
|
|
|
131
132
|
- Claude Code: `AskUserQuestion`
|
|
132
133
|
- Codex: `request_user_input` when exposed in an interactive session. The
|
|
133
134
|
installer enables this in Default mode with
|
|
134
135
|
`[features].default_mode_request_user_input = true`.
|
|
135
136
|
|
|
136
|
-
Use the structured question gate only for
|
|
137
|
-
gates. Never use it to collect open text input like LinkedIn URLs,
|
|
138
|
-
domains, notes, pasted context, campaign ideas,
|
|
139
|
-
|
|
137
|
+
Use the structured question gate only for crisp identity confirmations and
|
|
138
|
+
approval gates. Never use it to collect open text input like LinkedIn URLs,
|
|
139
|
+
company domains, notes, pasted context, campaign ideas, buyer strategy,
|
|
140
|
+
offer/CTA, proof, lead source, or feedback. For open text, ask in normal chat
|
|
141
|
+
and wait for the user to type an answer and press Enter.
|
|
140
142
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
Codex/Claude setup capability. Do not tell customers about `request_user_input`,
|
|
143
|
+
Use "quick question panel" only when explaining a missing Codex/Claude setup
|
|
144
|
+
capability for approvals. Do not tell customers about `request_user_input`,
|
|
144
145
|
Default mode, plugin caches, prompt loading, or skill file versions.
|
|
145
146
|
|
|
146
147
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
@@ -253,10 +254,18 @@ Cool — I have this campaign as {company}. Who should the LinkedIn messages sen
|
|
|
253
254
|
Sender options should include connected sender names if available, `same as
|
|
254
255
|
me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
255
256
|
|
|
256
|
-
After the user confirms the subject and sender, run one lightweight
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
257
|
+
After the user confirms the subject and sender, run one bounded lightweight
|
|
258
|
+
company-context pass before asking the campaign setup questions. A sender
|
|
259
|
+
LinkedIn profile lookup is not enough by itself unless it clearly includes the
|
|
260
|
+
company's website, product category, customer, and offer context. If the host can
|
|
261
|
+
run tools in parallel, use one parallel batch with at most 2-3 cheap lookups:
|
|
262
|
+
`mcp__sellable__fetch_company` on a LinkedIn company URL from the profile when
|
|
263
|
+
available; `WebFetch` for the company website/domain when available; otherwise
|
|
264
|
+
one `WebSearch` for `{company} official website` or `{company} product`. If
|
|
265
|
+
parallel tool calls are unavailable, do the single highest-confidence lookup
|
|
266
|
+
first and continue. Do not run full company research, source discovery, Sales
|
|
267
|
+
Nav, Prospeo, Signals, or multi-query browsing here. The goal is a fast 15-30
|
|
268
|
+
second context read so the four setup questions feel specific.
|
|
260
269
|
|
|
261
270
|
Before the identity gate, use this customer-facing shape:
|
|
262
271
|
|
|
@@ -271,12 +280,13 @@ lead source.
|
|
|
271
280
|
Then I’ll turn that into a campaign brief for you to approve before anything is created.
|
|
272
281
|
```
|
|
273
282
|
|
|
274
|
-
Do not silently ask
|
|
275
|
-
|
|
276
|
-
|
|
283
|
+
Do not silently ask approval questions as plain chat when `request_user_input` is
|
|
284
|
+
unavailable in an interactive session. Normal setup strategy questions are
|
|
285
|
+
free-text chat and do not need `request_user_input`. Stop only when an approval
|
|
286
|
+
gate needs the quick question panel:
|
|
277
287
|
|
|
278
288
|
```text
|
|
279
|
-
I need Codex’s quick question panel
|
|
289
|
+
I need Codex’s quick question panel for campaign approvals.
|
|
280
290
|
|
|
281
291
|
It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
|
|
282
292
|
|
|
@@ -292,7 +302,7 @@ Done. Please fully quit and reopen Codex, then run:
|
|
|
292
302
|
$sellable:create-campaign
|
|
293
303
|
|
|
294
304
|
After that, I’ll confirm who we’re launching for, then ask the setup questions
|
|
295
|
-
and start the campaign brief.
|
|
305
|
+
in chat and start the campaign brief.
|
|
296
306
|
```
|
|
297
307
|
|
|
298
308
|
If they decline, tell them:
|
|
@@ -400,7 +410,7 @@ updates.
|
|
|
400
410
|
```text
|
|
401
411
|
You're in — {activeWorkspaceName} workspace, ready to roll.
|
|
402
412
|
|
|
403
|
-
Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you
|
|
413
|
+
Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.
|
|
404
414
|
|
|
405
415
|
e.g. https://www.linkedin.com/in/your-handle
|
|
406
416
|
```
|
|
@@ -411,7 +421,7 @@ updates.
|
|
|
411
421
|
```text
|
|
412
422
|
You're set up — your {activeWorkspaceName} workspace is ready.
|
|
413
423
|
|
|
414
|
-
Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you
|
|
424
|
+
Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you, or whoever's voice the messages should sound like.
|
|
415
425
|
|
|
416
426
|
e.g. https://www.linkedin.com/in/your-handle
|
|
417
427
|
```
|
|
@@ -78,17 +78,18 @@ Validated draft directory:
|
|
|
78
78
|
Claude Code, this is `AskUserQuestion`. In Codex, this is
|
|
79
79
|
`request_user_input` (enabled in Default mode by
|
|
80
80
|
`[features].default_mode_request_user_input = true`, not available in
|
|
81
|
-
`codex exec`). Treat them as equivalent approval
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
input like LinkedIn URLs, company domains, notes, pasted context,
|
|
85
|
-
ideas,
|
|
86
|
-
|
|
81
|
+
`codex exec`). Treat them as equivalent approval gates and persist the same
|
|
82
|
+
draft artifacts after the user answers. Use this structured gate only for
|
|
83
|
+
crisp identity confirmations and approval gates. Never use it to collect open
|
|
84
|
+
text input like LinkedIn URLs, company domains, notes, pasted context,
|
|
85
|
+
campaign ideas, buyer strategy, offer/CTA, proof, lead source, or feedback.
|
|
86
|
+
For open text, ask in normal chat and wait for the user to type an answer and
|
|
87
|
+
press Enter. If an interactive
|
|
87
88
|
Codex session does not expose `request_user_input`, do not silently degrade to
|
|
88
89
|
a plain chat question; stop and tell the user:
|
|
89
90
|
|
|
90
91
|
```text
|
|
91
|
-
I need Codex’s quick question panel
|
|
92
|
+
I need Codex’s quick question panel for campaign approvals.
|
|
92
93
|
|
|
93
94
|
It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
|
|
94
95
|
|
|
@@ -104,7 +105,7 @@ Validated draft directory:
|
|
|
104
105
|
$sellable:create-campaign
|
|
105
106
|
|
|
106
107
|
After that, I’ll confirm who we’re launching for, then ask the setup questions
|
|
107
|
-
and start the campaign brief.
|
|
108
|
+
in chat and start the campaign brief.
|
|
108
109
|
```
|
|
109
110
|
|
|
110
111
|
If they decline, tell them to switch to Plan/collaboration mode and rerun
|
|
@@ -226,11 +227,20 @@ Validated draft directory:
|
|
|
226
227
|
Sender options should include connected sender names if available, `same as
|
|
227
228
|
me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
228
229
|
|
|
229
|
-
After the user confirms the subject and sender, run one lightweight
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
230
|
+
After the user confirms the subject and sender, run one bounded lightweight
|
|
231
|
+
company-context pass before asking the campaign setup questions. A sender
|
|
232
|
+
LinkedIn profile lookup is not enough by itself unless it clearly includes the
|
|
233
|
+
company's website, product category, customer, and offer context. If the host
|
|
234
|
+
can run tools in parallel, use one parallel batch with at most 2-3 cheap
|
|
235
|
+
lookups: `fetch_company` on a LinkedIn company URL from the profile when
|
|
236
|
+
available; `WebFetch` for the company website/domain when available; otherwise
|
|
237
|
+
one `WebSearch` for `{company} official website` or `{company} product`. If
|
|
238
|
+
parallel tool calls are unavailable, do the single highest-confidence lookup
|
|
239
|
+
first and continue. Do not run full company research, source discovery, Sales
|
|
240
|
+
Nav, Prospeo, Signals, or multi-query browsing here. The goal is a fast 15-30
|
|
241
|
+
second context read so the four setup questions feel specific. If identity is
|
|
242
|
+
still unavailable, use neutral/custom intake options instead of guessed
|
|
243
|
+
vertical-specific options.
|
|
234
244
|
|
|
235
245
|
- Before the identity gate, use this customer-facing shape:
|
|
236
246
|
|
|
@@ -250,22 +260,26 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
|
250
260
|
that first packet, the first assistant turn may only call
|
|
251
261
|
`bootstrap_create_campaign`, load this workflow prompt with
|
|
252
262
|
`get_subskill_prompt({ subskillName: "create-campaign-v2" })`, optionally run
|
|
253
|
-
one lightweight identity lookup, then
|
|
263
|
+
one lightweight identity lookup, then confirm launch identity. After
|
|
264
|
+
identity is confirmed, run the bounded lightweight company-context pass above
|
|
265
|
+
before generating buyer/offer/proof/source options. If the user
|
|
254
266
|
supplied a company website/domain, call exactly one of `fetch_company`,
|
|
255
267
|
`WebFetch`, or `WebSearch` to identify what the company actually does before
|
|
256
268
|
generating setup options. If the user supplied a LinkedIn profile URL, call
|
|
257
269
|
`fetch_linkedin_profile` before generating setup options. Do not infer the
|
|
258
270
|
product category from the company name alone. If no domain, website, LinkedIn
|
|
259
|
-
profile, or sender identity is supplied, the first
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
271
|
+
profile, or sender identity is supplied, the first setup intake must ask for
|
|
272
|
+
the launch identity before buyer/offer/source. Before that first setup intake,
|
|
273
|
+
do not run source discovery, Sales Nav, Prospeo, Signals, Bash, Read, Write,
|
|
274
|
+
Edit, Glob, Grep, full company research, or
|
|
263
275
|
draft-directory inspection/creation. `list_senders` is allowed once before the
|
|
264
276
|
first identity gate as a quiet token/sender inference shortcut, and once means
|
|
265
277
|
once: do not call it again after a LinkedIn lookup if it already ran. Do
|
|
266
278
|
draft-directory setup only after the founder answers. After launch identity is
|
|
267
|
-
confirmed,
|
|
268
|
-
|
|
279
|
+
confirmed, ask buyer, offer/CTA, proof, and lead source in normal chat. Do not
|
|
280
|
+
present those four setup questions as checkbox/radio multiple-choice gates.
|
|
281
|
+
You may include short example answers to reduce blank-page anxiety, but the
|
|
282
|
+
default action must be: type a nuanced answer and press Enter.
|
|
269
283
|
- After the founder answers the first strategy/source packet, explain the next
|
|
270
284
|
stage only: campaign brief creation and brief approval. Use this shape:
|
|
271
285
|
|
|
@@ -462,34 +476,29 @@ Ask the user only when one of these is true:
|
|
|
462
476
|
packet so the founder can approve or revise the message deliberately.
|
|
463
477
|
|
|
464
478
|
When asking subjective strategy questions (buyer scope, first ask, proof
|
|
465
|
-
emphasis, tone, lead-source preference),
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
479
|
+
emphasis, tone, lead-source preference), ask in normal chat, not as a
|
|
480
|
+
multiple-choice structured gate. Suggested directions are allowed only as
|
|
481
|
+
examples, not as the UI control. Always make the freeform path explicit:
|
|
482
|
+
`Type your answer in your own words and press Enter.` Do not add custom options
|
|
483
|
+
to the final six-choice commit gate.
|
|
469
484
|
Use customer-facing question wording:
|
|
470
485
|
|
|
471
|
-
- target prospects: `Who should be the target prospects for this campaign?
|
|
472
|
-
- main CTA / offer: `What should the main CTA or offer be?
|
|
473
|
-
- proof emphasis: `Which proof point would most increase this buyer's confidence in {{company}}?
|
|
474
|
-
- lead source: `How should we get the people for this campaign
|
|
475
|
-
|
|
476
|
-
Ask the lead-source question as the last question in the first strategy
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
custom/freeform input. If the user pastes up to 100 LinkedIn profile URLs or
|
|
488
|
-
company domains, normalize the paste into a temporary local CSV and continue
|
|
489
|
-
through the matching CSV preview path. Mixed, ambiguous, malformed, or oversized
|
|
490
|
-
pastes should ask for a real CSV file instead of guessing. Uploaded CSV support
|
|
491
|
-
is larger than paste support: LinkedIn profile CSVs can contain up to 7,500
|
|
492
|
-
rows; domain CSVs can contain up to 7,500 rows but only 1,000 unique domains.
|
|
486
|
+
- target prospects: `Who should be the target prospects for this campaign? Type the buyer you want, or describe a blend.`
|
|
487
|
+
- main CTA / offer: `What should the main CTA or offer be? Type what you want the prospect to do next.`
|
|
488
|
+
- proof emphasis: `Which proof point would most increase this buyer's confidence in {{company}}? Type the proof you want to lean on.`
|
|
489
|
+
- lead source: `How should we get the people for this campaign? Type "find people for me", describe the source, or paste a CSV/list path.`
|
|
490
|
+
|
|
491
|
+
Ask the lead-source question as the last question in the first strategy batch,
|
|
492
|
+
after buyer, offer/ask, and proof/safety are understood. Frame supplied lists as
|
|
493
|
+
optional, not required. Mention examples inline, not as selectable options:
|
|
494
|
+
`I can find people for you, use a CSV of LinkedIn profiles, use a CSV of company
|
|
495
|
+
domains, use an existing Sellable lead list, or follow another source idea.`
|
|
496
|
+
If the user pastes up to 100 LinkedIn profile URLs or company domains, normalize
|
|
497
|
+
the paste into a temporary local CSV and continue through the matching CSV
|
|
498
|
+
preview path. Mixed, ambiguous, malformed, or oversized pastes should ask for a
|
|
499
|
+
real CSV file instead of guessing. Uploaded CSV support is larger than paste
|
|
500
|
+
support: LinkedIn profile CSVs can contain up to 7,500 rows; domain CSVs can
|
|
501
|
+
contain up to 7,500 rows but only 1,000 unique domains.
|
|
493
502
|
|
|
494
503
|
Avoid internal wording like `Which proof points should the message be allowed
|
|
495
504
|
to lean on?` because it describes the artifact, not the founder decision.
|