@sellable/mcp 0.1.133 → 0.1.135

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.
@@ -568,6 +568,12 @@ export interface CreateCampaignResult {
568
568
  watchUrl: string;
569
569
  resumed?: boolean;
570
570
  warning?: string;
571
+ approvalGate: {
572
+ kind: "brief-review";
573
+ mustShowBeforeQuestion: string[];
574
+ questionToolBlockedUntilShown: true;
575
+ };
576
+ nextStep: string;
571
577
  }
572
578
  export declare function createCampaign(input: CreateCampaignInput): Promise<CreateCampaignResult>;
573
579
  export interface UpdateCampaignResult {
@@ -658,6 +658,20 @@ function deriveOfferValue(name, briefContent) {
658
658
  return heading.slice(0, 120);
659
659
  return lines[0].slice(0, 120);
660
660
  }
661
+ function buildBriefApprovalGate(watchUrl) {
662
+ return {
663
+ approvalGate: {
664
+ kind: "brief-review",
665
+ mustShowBeforeQuestion: [
666
+ "the full campaignBrief markdown the user is approving",
667
+ `Watch link: ${watchUrl}`,
668
+ ],
669
+ questionToolBlockedUntilShown: true,
670
+ },
671
+ nextStep: "Before asking for approval, render the full campaign brief in normal chat text and then print " +
672
+ `Watch link: ${watchUrl}. Do not call AskUserQuestion or request_user_input until the user has seen both the brief content and this watch link.`,
673
+ };
674
+ }
661
675
  export async function createCampaign(input) {
662
676
  const api = getApi();
663
677
  const config = getConfig();
@@ -675,6 +689,7 @@ export async function createCampaign(input) {
675
689
  createdAt: existing.createdAt,
676
690
  currentStep: existing.currentStep ?? null,
677
691
  watchUrl,
692
+ ...buildBriefApprovalGate(watchUrl),
678
693
  resumed: true,
679
694
  warning: hasCreateFields
680
695
  ? "campaignId provided; resume mode ignores create fields."
@@ -790,6 +805,7 @@ export async function createCampaign(input) {
790
805
  createdAt: result.createdAt,
791
806
  currentStep: result.currentStep,
792
807
  watchUrl,
808
+ ...buildBriefApprovalGate(watchUrl),
793
809
  };
794
810
  }
795
811
  export async function updateCampaign(campaignId, input) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.133",
3
+ "version": "0.1.135",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -427,13 +427,20 @@ brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
427
427
  not visible in this session, use `Approve brief + compare source paths`
428
428
  instead. The customer approves the sourcing decision, not the host
429
429
  implementation detail.
430
- Include a `Watch link:` line before the approval question once
431
- `create_campaign` has returned `watchUrl`. The visible brief must come before
432
- any optional debug persistence. After the brief is synthesized, render the
433
- approval-ready brief in chat and create/update the campaign shell before any
434
- visible `mkdir`, `Write`, artifact-copy, or similar local draft setup. In
435
- normal customer runs, skip local draft setup entirely. File/folder creation is
436
- not the user's value moment; the live campaign brief is.
430
+ Include a `Watch link:` line in the normal chat text immediately before the
431
+ brief approval question once `create_campaign` has returned `watchUrl`. This
432
+ is a hard gate for `AskUserQuestion` / `request_user_input`: do not ask
433
+ `Approve this brief before I start finding leads?` until the user has already
434
+ seen both (1) the full brief content being approved and (2) the watch link for
435
+ the live campaign shell. A summary like `the brief is visible there` is not a
436
+ valid approval surface. If the question panel would appear without the full
437
+ brief and a preceding `Watch link:` line, stop and render those first.
438
+ The visible brief must come before any optional debug persistence. After the
439
+ brief is synthesized, render the approval-ready brief in chat and
440
+ create/update the campaign shell before any visible `mkdir`, `Write`,
441
+ artifact-copy, or similar local draft setup. In normal customer runs, skip
442
+ local draft setup entirely. File/folder creation is not the user's value
443
+ moment; the live campaign brief is.
437
444
 
438
445
  The approval question can be based on the rendered brief in chat and the live
439
446
  campaign brief. Do not wait for file-write chrome before asking for approval.
@@ -439,10 +439,13 @@
439
439
  "then I will find good-fit leads"
440
440
  ],
441
441
  "minimumVisibleBriefDetail": "full_readable_brief_before_question",
442
+ "forbiddenSubstituteApprovalSurface": "Do not replace the visible brief with a summary like `the brief is visible there`; the user must see the actual campaign brief content in chat before the approval question.",
442
443
  "requiredCampaignLinks": [
443
444
  "watchUrl"
444
445
  ],
445
446
  "campaignLinkTiming": "before_approval_question",
447
+ "questionToolGate": "Do not call AskUserQuestion or request_user_input for brief approval until the immediately preceding customer-visible chat text includes `Watch link:` with the create_campaign.watchUrl for this campaign shell.",
448
+ "missingWatchLinkRecovery": "If the brief approval question would appear before the watch link, stop and send the rendered brief checkpoint plus `Watch link: {watchUrl}` first; then ask the approve/revise question.",
446
449
  "forbiddenNormalCustomerLinks": [
447
450
  "brief.md",
448
451
  "local draft path",
@@ -452,6 +455,12 @@
452
455
  },
453
456
  {
454
457
  "action": "ask_continue_or_revise_only_if_needed",
458
+ "requiresPriorVisibleContent": [
459
+ "full readable brief",
460
+ "live campaign shell orientation",
461
+ "Watch link: {watchUrl}"
462
+ ],
463
+ "mustNotCallQuestionToolUntil": "The watch link has already been shown in normal chat text after create_campaign returned watchUrl.",
455
464
  "autoContinueWhen": {
456
465
  "artifactStatus": "confirmed",
457
466
  "confidenceIn": [
@@ -46,6 +46,11 @@ real-time updates from your signed-in session.
46
46
 
47
47
  Command-Enter or click that link to watch it in Sellable.
48
48
 
49
+ Now ask the brief approval question. Do not show the approve/revise question
50
+ panel until the full brief content and this `Watch link:` line have appeared in
51
+ normal chat text. A summary such as "the brief is visible there" is not enough
52
+ for approval.
53
+
49
54
  Cool, let's find leads.
50
55
  ```
51
56