@sellable/mcp 0.1.145 → 0.1.146

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.
@@ -137,8 +137,12 @@ Return a concise status with:
137
137
  - quality-gate pass/fail summary
138
138
  - whether final template review is ready or needs revision
139
139
 
140
- When the parent will show the recommendation in chat, format the customer-facing
141
- message review as Markdown with distinct copy blocks:
140
+ When the parent will show the recommendation in chat, keep the customer-facing
141
+ message review lightweight. Format only the approval target and one strong
142
+ good-fill example as Markdown with distinct copy blocks. Keep token rules,
143
+ omit/fallback examples, and bad-fill avoidance notes in your internal
144
+ recommendation so the parent can persist them to the campaign brief after
145
+ approval; do not print them in the default chat approval packet.
142
146
 
143
147
  ````markdown
144
148
  ## Message Template
@@ -155,19 +159,9 @@ message review as Markdown with distinct copy blocks:
155
159
  {{tokenized_message_body}}
156
160
  ```
157
161
 
158
- ## Rendered Examples
162
+ ## Rendered Example
159
163
 
160
- ### Good token fill
161
-
162
- ```text
163
- Subject: ...
164
-
165
- Hey First,
166
-
167
- ...
168
- ```
169
-
170
- ### Good omit / fallback
164
+ Good token fill:
171
165
 
172
166
  ```text
173
167
  Subject: ...
@@ -499,17 +499,18 @@ function buildSourceImportWatchNarration({ provider, selectedPostCount, estimate
499
499
  : ""}`
500
500
  : `the approved ${providerLabel} source`;
501
501
  const targetDetail = typeof targetLeadCount === "number"
502
- ? ` Targeting ${targetLeadCount.toLocaleString("en-US")} source candidates before the bounded review batch is cloned.`
502
+ ? ` Targeting ${targetLeadCount.toLocaleString("en-US")} source leads before the bounded review batch is cloned.`
503
503
  : "";
504
504
  return {
505
- stage: "review-batch",
505
+ stage: "find-leads",
506
506
  headline: provider === "signal-discovery"
507
- ? "Scraping source candidates from posts"
508
- : "Importing source candidates",
507
+ ? "Scraping source leads from posts"
508
+ : "Importing source leads",
509
509
  visibleState: `The browser is showing ${providerLabel} import progress for ${sourceDetail}.${targetDetail}`,
510
510
  agentIntent: "Codex is materializing the approved source into a lead list before cloning only the bounded review batch into the campaign.",
511
- nextAction: "Wait for source candidates, then import the review batch",
511
+ nextAction: "Wait for source leads, then import the 15-row review batch",
512
512
  safety: "Import is limited to the review batch.",
513
+ progressLabel: "Source scouting",
513
514
  };
514
515
  }
515
516
  function buildSourceImportRecoveryWatchNarration(args) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.145",
3
+ "version": "0.1.146",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -158,6 +158,12 @@ approval label must describe the action with the count, such as "Approve
158
158
  scraping 3 Signal Discovery posts?" For Sales Nav or Prospeo, the label should
159
159
  name the specific search/import lane. Do not call `import_leads` or
160
160
  `confirm_lead_list` until this second source-action approval is granted.
161
+ After the user approves this concrete source-action gate, do not show the
162
+ Source Recommendation again and do not ask another source approval question.
163
+ Acknowledge once, then call `import_leads` immediately with the approved source
164
+ math. For Signal Discovery, pass `provider: "signal-discovery"`,
165
+ `targetEngagerCount`, `maxPostsToScrape`, and `confirmed: true`; the tool owns
166
+ moving the watch UI to source-list progress after a lead-list/job id exists.
161
167
 
162
168
  For Signal Discovery, use this compact source-action approval shape after
163
169
  selected posts exist:
@@ -243,6 +243,10 @@ table, total visible pool, estimated good-fit pool, first-pass review
243
243
  batch, and fallback. The approval question should be "Approve scraping N Signal
244
244
  Discovery posts?"
245
245
 
246
+ That scrape approval is single-use. Once the user approves it, do not replay
247
+ the source card or ask for the same approval again. Acknowledge the approval in
248
+ one sentence and call `import_leads` for the approved source immediately.
249
+
246
250
  ## Parallelism + Naming
247
251
 
248
252
  Source selection is sequential by default. Start with the first recommended
@@ -485,6 +485,16 @@
485
485
  "signal-discovery": "Approve scraping {selectedPostCount} Signal Discovery posts?",
486
486
  "sales-nav": "Import the approved Sales Nav review batch",
487
487
  "prospeo": "Import the approved Prospeo review batch"
488
+ },
489
+ "postApprovalContract": {
490
+ "singleUseApproval": true,
491
+ "doNotRepeatAfterApproval": [
492
+ "Source Recommendation",
493
+ "show_source_decision_card",
494
+ "ask_source_review_choice"
495
+ ],
496
+ "requiredNextActionAfterApproval": "acknowledge in one sentence, then call import_leads immediately",
497
+ "signalDiscoveryNextTool": "import_leads({ campaignOfferId, provider: \"signal-discovery\", targetEngagerCount, maxPostsToScrape, confirmed: true })"
488
498
  }
489
499
  }
490
500
  ],
@@ -925,12 +935,24 @@
925
935
  "messageDraftRecommendation"
926
936
  ],
927
937
  "requiredVisibleLabels": [
928
- "Subject:",
929
- "Sample prospect fill:",
938
+ "## Message Template",
939
+ "## Rendered Example",
940
+ "Good token fill:",
930
941
  "My take:",
931
- "Concern:",
932
942
  "Question: approve-message or revise-messaging?",
933
943
  "Recommendation:"
944
+ ],
945
+ "doNotShowByDefault": [
946
+ "Token Notes",
947
+ "Good omit / fallback",
948
+ "Bad fill to avoid",
949
+ "Token Adherence Table"
950
+ ],
951
+ "internalPersistenceOnly": [
952
+ "Token Fill Rules",
953
+ "Token Fill Examples",
954
+ "fallback guidance",
955
+ "bad-fill avoidance notes"
934
956
  ]
935
957
  },
936
958
  {
@@ -31,8 +31,11 @@ instead of pulling the long prompt into the main thread.
31
31
  local markdown/json artifacts in normal customer runs; emit debug artifacts
32
32
  only when the parent explicitly asks for debug/UAT output.
33
33
  5. Render the customer-facing message review in chat before asking for approval.
34
- After approval, the parent persists template and token rules into campaign
35
- state with `update_campaign_brief`.
34
+ Keep chat lightweight: show the tokenized template and one strong rendered
35
+ good-fill example only. Do not print the token notes table, omit/fallback
36
+ example, or bad-fill analysis in chat unless the user explicitly asks.
37
+ After approval, the parent persists template, token rules, fallback guidance,
38
+ and bad-fill avoidance notes into campaign state with `update_campaign_brief`.
36
39
  6. Ask exactly `approve-message` or `revise-messaging`. Do not import, queue,
37
40
  attach sequence, or start before `approve-message`.
38
41
 
@@ -89,10 +92,17 @@ but the [topic] thread felt close enough to send`. Otherwise omit the
89
92
  - If the message is plausible but not ready to send, set
90
93
  `Recommendation: revise-messaging`.
91
94
 
95
+ ## Internal Message Recommendation
96
+
97
+ The message scout or parent safety gate should still produce complete internal
98
+ review data: token-fill rules, one rendered omit/fallback example, and bad-fill
99
+ avoidance notes. This data is for campaign-brief persistence and safety checks,
100
+ not for the default chat approval packet.
101
+
92
102
  ## Customer-Facing Message Review
93
103
 
94
104
  Render this in chat before asking. Use Markdown structure so the approval target
95
- is visually scannable:
105
+ is visually scannable and low-overhead:
96
106
 
97
107
  ````markdown
98
108
  Status: message-review
@@ -111,33 +121,11 @@ Status: message-review
111
121
  {{tokenized_message_body}}
112
122
  ```
113
123
 
114
- ## Rendered Examples
115
-
116
- ### Good token fill
117
-
118
- Use when the row has a clean, supported fill.
119
-
120
- ```text
121
- Subject: ...
122
-
123
- Hey First,
124
-
125
- ...
126
- ```
127
-
128
- ### Good omit / fallback
129
-
130
- Use when a row signal or company context is missing, weak, or awkward.
131
-
132
- ```text
133
- Subject: ...
134
-
135
- Hey First,
124
+ ## Rendered Example
136
125
 
137
- ...
138
- ```
126
+ ### Example
139
127
 
140
- ### Bad fill to avoid
128
+ Good token fill:
141
129
 
142
130
  ```text
143
131
  Subject: ...
@@ -147,14 +135,6 @@ Hey First,
147
135
  ...
148
136
  ```
149
137
 
150
- **Why this is wrong:** one sentence naming the exact token-fill failure.
151
-
152
- ## Token Notes
153
-
154
- | Token | Use when | Fallback |
155
- | ---------------- | ------------------------ | -------- |
156
- | `{{first_name}}` | Clean first name exists. | `there` |
157
-
158
138
  ## Recommendation
159
139
 
160
140
  **My take:** ...
@@ -168,15 +148,13 @@ Hey First,
168
148
 
169
149
  Formatting requirements:
170
150
 
171
- - Put the tokenized template and every rendered example in fenced `text` blocks
151
+ - Put the tokenized template and rendered example in fenced `text` blocks
172
152
  so chat gives them a distinct background.
173
- - `Good token fill` and `Good omit / fallback` must each contain a complete
174
- rendered subject + body, not a bullet list of token names or a single
175
- bridge-line fragment.
176
- - Include `Bad fill to avoid` when the row sample has a tempting but unsafe
177
- source-mechanics or raw-headline fill; otherwise include `Bad fill to avoid:
178
- none found`.
179
- - Use a token notes table, not paragraph-only token notes.
153
+ - The chat example must contain a complete rendered subject + body, not a
154
+ bullet list of token names or a single bridge-line fragment.
155
+ - Do not show `Good omit / fallback`, `Bad fill to avoid`, or `Token Notes` in
156
+ the default chat approval packet. Keep those in the internal recommendation
157
+ and persist them to the campaign brief after approval.
180
158
  - Keep reasoning outside the code blocks so the blocks are easy to inspect and
181
159
  approve.
182
160
 
@@ -57,7 +57,7 @@ Supported branches:
57
57
  list from the approved source-capacity plan; it is not the same target as the
58
58
  default 25-row campaign review batch.
59
59
  - **Supplied LinkedIn profile CSV** — confirm `load_csv_linkedin_leads` only
60
- after rubrics and the approved message set are ready. Batch/materialize the
60
+ after the user approves that supplied-list source. Batch/materialize the
61
61
  uploaded CSV into a Sellable lead-list table. Persist the returned
62
62
  `leadListId`, then import the bounded review batch into the campaign table
63
63
  with
@@ -219,8 +219,10 @@ cannot scale further without a new source lane.
219
219
  - Zero-imported + zero-skipped ⇒ hard-fail escalate.
220
220
  - Zero-imported + high-skipped ⇒ lane-exhausted operator notice (NOT a
221
221
  silent proceed).
222
- - `import_leads` is NOT called before rubrics are saved and the approved message
223
- set is synced into the campaign brief.
222
+ - `import_leads` is allowed immediately after the concrete source-action
223
+ approval. It materializes the source list and then `confirm_lead_list` imports
224
+ only the bounded review batch. Enrichment, fit scoring, and message cells wait
225
+ for saved rubrics plus the approved message set.
224
226
  - Step 13 MUST reuse an approved source already attached with `campaignOfferId`
225
227
  before `import_leads`; it does not replay provider searches.
226
228
  - `import_leads` is NOT called again in Step 14 (validate-sample). Full