@sellable/mcp 0.1.134 → 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.134",
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",
@@ -431,8 +431,10 @@ brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
431
431
  brief approval question once `create_campaign` has returned `watchUrl`. This
432
432
  is a hard gate for `AskUserQuestion` / `request_user_input`: do not ask
433
433
  `Approve this brief before I start finding leads?` until the user has already
434
- seen the watch link for the live campaign shell. If the question panel would
435
- appear without a preceding `Watch link:` line, stop and send the link first.
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.
436
438
  The visible brief must come before any optional debug persistence. After the
437
439
  brief is synthesized, render the approval-ready brief in chat and
438
440
  create/update the campaign shell before any visible `mkdir`, `Write`,
@@ -439,6 +439,7 @@
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
  ],
@@ -47,7 +47,9 @@ real-time updates from your signed-in session.
47
47
  Command-Enter or click that link to watch it in Sellable.
48
48
 
49
49
  Now ask the brief approval question. Do not show the approve/revise question
50
- panel until this `Watch link:` line has appeared in normal chat text.
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.
51
53
 
52
54
  Cool, let's find leads.
53
55
  ```