@sellable/mcp 0.1.33 → 0.1.34
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 +19 -6
- package/dist/tools/cli-login.js +1 -1
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +30 -6
package/dist/tools/auth.js
CHANGED
|
@@ -116,17 +116,30 @@ export async function getAuthStatus() {
|
|
|
116
116
|
// thing instead of dumping the technical fallback guidance.
|
|
117
117
|
const ftuxAgentInstruction = "AGENT INSTRUCTION (verbatim, do not paraphrase, do not show the user `error.guidance`): " +
|
|
118
118
|
"The user has not signed in to Sellable yet. Run the magic-link CLI handoff. " +
|
|
119
|
-
"1) Say to the user verbatim
|
|
119
|
+
"1) Say to the user verbatim:\\n" +
|
|
120
|
+
"`Welcome to Sellable! I'll help you launch a LinkedIn outbound campaign right here, all via chat — leads, messages, the whole thing.\\n\\n" +
|
|
121
|
+
"First, let's connect your Sellable account:\\n\\n" +
|
|
122
|
+
" 1. Drop your email below\\n" +
|
|
123
|
+
" 2. I'll send a magic login link to your inbox\\n" +
|
|
124
|
+
" 3. Click it, come back here, and we'll keep going\\n\\n" +
|
|
125
|
+
"What email should I use?` " +
|
|
120
126
|
"2) Wait for the user to type their email in normal chat (do NOT use AskUserQuestion / request_user_input). " +
|
|
121
127
|
"3) Call `mcp__sellable__start_cli_login({ email })` with that email. " +
|
|
122
|
-
"4) On `ok: true`, say verbatim (substituting the email exactly as typed)
|
|
123
|
-
"`Magic link sent to {email}
|
|
124
|
-
"
|
|
128
|
+
"4) On `ok: true`, say verbatim (substituting the email exactly as typed):\\n" +
|
|
129
|
+
"`Magic link sent to {email}.\\n\\n" +
|
|
130
|
+
"─────────────────────────────────────────────\\n" +
|
|
131
|
+
" Your turn — check your inbox\\n" +
|
|
132
|
+
"─────────────────────────────────────────────\\n\\n" +
|
|
133
|
+
" 1. Open the email from Sellable\\n" +
|
|
134
|
+
" 2. Click the magic link\\n" +
|
|
135
|
+
" 3. Come back here when you're done\\n\\n" +
|
|
136
|
+
"I'll be waiting right here.\\n\\n" +
|
|
137
|
+
" (If your team already uses Sellable, ask an admin to invite you into their shared workspace instead — that gets you straight in.)` " +
|
|
125
138
|
"5) Call `mcp__sellable__wait_for_cli_login({ sessionId })` using the sessionId returned by start_cli_login. " +
|
|
126
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. " +
|
|
127
140
|
"7) On `ok: true`, the user is signed in and `~/.sellable/config.json` has been written. Branch on `isReturningUser`: " +
|
|
128
|
-
"if true, say `You're in —
|
|
129
|
-
"if false, say `
|
|
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 (the founder), 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 (the founder), or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`";
|
|
130
143
|
if (error instanceof SellableApiError && error.isAuthError) {
|
|
131
144
|
return {
|
|
132
145
|
...base,
|
package/dist/tools/cli-login.js
CHANGED
|
@@ -131,7 +131,7 @@ export async function handleStartCliLogin(args) {
|
|
|
131
131
|
sessionId: body.sessionId,
|
|
132
132
|
confirmUrl: body.confirmUrl,
|
|
133
133
|
expiresInSec: body.expiresInSec,
|
|
134
|
-
humanMessage: `Magic link sent to ${args.email}
|
|
134
|
+
humanMessage: `Magic link sent to ${args.email}.\n\n─────────────────────────────────────────────\n Your turn — check your inbox\n─────────────────────────────────────────────\n\n 1. Open the email from Sellable\n 2. Click the magic link\n 3. Come back here when you're done\n\nI'll be waiting right here.\n\n (If your team already uses Sellable, ask an admin to invite you into their shared workspace instead — that gets you straight in.)`,
|
|
135
135
|
};
|
|
136
136
|
}
|
|
137
137
|
export async function handleWaitForCliLogin(args) {
|
package/package.json
CHANGED
|
@@ -331,7 +331,15 @@ updates.
|
|
|
331
331
|
a. Say to the user verbatim:
|
|
332
332
|
|
|
333
333
|
```text
|
|
334
|
-
Welcome to Sellable
|
|
334
|
+
Welcome to Sellable! I'll help you launch a LinkedIn outbound campaign right here, all via chat — leads, messages, the whole thing.
|
|
335
|
+
|
|
336
|
+
First, let's connect your Sellable account:
|
|
337
|
+
|
|
338
|
+
1. Drop your email below
|
|
339
|
+
2. I'll send a magic login link to your inbox
|
|
340
|
+
3. Click it, come back here, and we'll keep going
|
|
341
|
+
|
|
342
|
+
What email should I use?
|
|
335
343
|
```
|
|
336
344
|
|
|
337
345
|
b. Wait for the user to paste their email in normal chat. Do NOT use
|
|
@@ -347,7 +355,19 @@ updates.
|
|
|
347
355
|
as the user typed it):
|
|
348
356
|
|
|
349
357
|
```text
|
|
350
|
-
Magic link sent to {email}.
|
|
358
|
+
Magic link sent to {email}.
|
|
359
|
+
|
|
360
|
+
─────────────────────────────────────────────
|
|
361
|
+
Your turn — check your inbox
|
|
362
|
+
─────────────────────────────────────────────
|
|
363
|
+
|
|
364
|
+
1. Open the email from Sellable
|
|
365
|
+
2. Click the magic link
|
|
366
|
+
3. Come back here when you're done
|
|
367
|
+
|
|
368
|
+
I'll be waiting right here.
|
|
369
|
+
|
|
370
|
+
(If your team already uses Sellable, ask an admin to invite you into their shared workspace instead — that gets you straight in.)
|
|
351
371
|
```
|
|
352
372
|
|
|
353
373
|
f. Call `mcp__sellable__wait_for_cli_login({ sessionId })` using the
|
|
@@ -378,18 +398,22 @@ updates.
|
|
|
378
398
|
(substituting `activeWorkspaceName` exactly):
|
|
379
399
|
|
|
380
400
|
```text
|
|
381
|
-
You're in —
|
|
401
|
+
You're in — {activeWorkspaceName} workspace, ready to roll.
|
|
382
402
|
|
|
383
|
-
Now — paste the LinkedIn profile URL of the person you
|
|
403
|
+
Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
|
|
404
|
+
|
|
405
|
+
e.g. https://www.linkedin.com/in/your-handle
|
|
384
406
|
```
|
|
385
407
|
|
|
386
408
|
- If `isReturningUser === false`, prepend ONE line confirming the new
|
|
387
409
|
workspace, then the locked Step 3 narration verbatim:
|
|
388
410
|
|
|
389
411
|
```text
|
|
390
|
-
|
|
412
|
+
You're set up — your {activeWorkspaceName} workspace is ready.
|
|
413
|
+
|
|
414
|
+
Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
|
|
391
415
|
|
|
392
|
-
|
|
416
|
+
e.g. https://www.linkedin.com/in/your-handle
|
|
393
417
|
```
|
|
394
418
|
|
|
395
419
|
No other lines. No "all set", no "signed in", no other acknowledgement.
|