@sellable/mcp 0.1.356 → 0.1.358

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.
@@ -6,7 +6,7 @@ async function postSetupEvergreenCampaigns(body) {
6
6
  export const setupEvergreenCampaignsToolDefinitions = [
7
7
  {
8
8
  name: "setup_evergreen_campaigns",
9
- description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; this backend command remains read-only in plan mode and verifies receipts in verify mode. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. Lane workers must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, and review readiness through existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must include createCampaignStepReceipt with setupPlanCall, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall. messageDraftingReceipt must include validationResult:'passed', a passed qualityReview, and at least 3 concrete sampleMessages with row ids, generated message text, pass verdicts, and no issues; Shared Cold Fallback samples with a standalone name followed by 'Hey there' are rejected. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not archive/delete cleanup targets, and does not spend paid credits.",
9
+ description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; this backend command remains read-only in plan mode and verifies receipts in verify mode. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. Lane workers must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, pause_campaign review-state transition when the current table is still DRAFT, and review readiness through existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must include createCampaignStepReceipt with setupPlanCall, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall. messageDraftingReceipt must include validationResult:'passed', a passed qualityReview, and at least 3 concrete sampleMessages with row ids, generated message text, pass verdicts, and no issues; Shared Cold Fallback samples with a standalone name followed by 'Hey there' are rejected. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not raw-write campaign status, does not archive/delete cleanup targets, and does not spend paid credits.",
10
10
  inputSchema: {
11
11
  type: "object",
12
12
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.356",
3
+ "version": "0.1.358",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -186,6 +186,12 @@ not a parent-thread summary. The receipt must include:
186
186
  - `sequenceReceipt`: exact current workflowTableId, recommended non-paid
187
187
  sequence attach/precheck result, and readback showing `hasSequence:true` when
188
188
  completion is claimed.
189
+ - final paused-send proof: if the current campaign table is `DRAFT` after the
190
+ sequence is attached, call the product `pause_campaign({ campaignId })`
191
+ endpoint/tool to put the unlaunched campaign into `PAUSED` review state, then
192
+ reread the campaign/table. Do not raw-write `campaignStatus`, do not start or
193
+ launch, and do not schedule/send. Completion requires reread proof of
194
+ `currentStep:"send"` and `campaignStatus:"PAUSED"`.
189
195
  - `verifyCall`: the exact `setup_evergreen_campaigns({ mode:"verify",
190
196
  planRevision, selectedActionIds, receipts })` call/result used before the
191
197
  parent reports completion.
@@ -194,6 +200,17 @@ If any required field is missing, report
194
200
  `blocked: missing_create_campaign_step_receipt` for that lane and do not call it
195
201
  complete.
196
202
 
203
+ One lane may produce exactly one CampaignOffer/campaign id and one current
204
+ workflow table id. For `intent:"create"`, the first successful
205
+ `create_campaign` result establishes the lane's only allowed campaign/table
206
+ target. Every later source/import/confirm/message/filter/sequence/readback call
207
+ must use that same campaign id and current workflow table id. If any tool
208
+ returns or creates a different CampaignOffer, workflow table, "Campaign from
209
+ Source" campaign, or shell for the same lane, stop immediately with
210
+ `blocked: duplicate_campaign_offer_created`, include both ids in the receipt,
211
+ and do not report completion. Do not hide the earlier shell by reporting only
212
+ the later imported campaign.
213
+
197
214
  Each customer-visible lane receipt must also include message proof from
198
215
  `watchNarration.workerDetails.messageDraftBuilder` or the worker's equivalent
199
216
  branch handoff record. Valid evergreen message proof names the current campaign
@@ -224,9 +241,17 @@ create-campaign Message Drafting branch ran. If this receipt is missing, report
224
241
  `blocked: missing_message_drafting_receipt` and do not call the lane complete.
225
242
 
226
243
  The parent then calls
227
- `setup_evergreen_campaigns({ mode:"verify", planRevision, selectedActionIds,
228
- receipts })` and report only verified completion. If verify blocks, report the
229
- blocker and repair only the missing postconditions from the same current plan.
244
+ `setup_evergreen_campaigns({ mode:"verify", postEngagerSenderIds,
245
+ sharedSenderIds, planRevision, selectedActionIds, receipts })` using the same
246
+ sender scopes as the plan call, and reports only verified completion. A verify
247
+ call without the same sender scopes can recompute an empty or different plan and
248
+ is invalid proof. After verify succeeds, rerun
249
+ `setup_evergreen_campaigns({ mode:"plan", postEngagerSenderIds,
250
+ sharedSenderIds, yolo:true })` without explicit campaign/table bindings. That
251
+ idempotency plan must return `intent:"reuse"` for every completed lane and no
252
+ duplicate-lane blockers before you call the command finished. If verify blocks,
253
+ report the blocker and repair only the missing postconditions from the same
254
+ current plan.
230
255
 
231
256
  Message proof for every customer-visible lane must come from the current
232
257
  campaign/table basis and include at least 3 generated review rows from the
@@ -323,10 +348,10 @@ Parent-thread handwritten copy or setting `currentStep` is not proof.
323
348
  completion, approve exactly one quality-valid generated row. If one or more
324
349
  rows are already approved, do not add more approvals during evergreen
325
350
  completion. Never broad approve all rows.
326
- - The recommended non-paid sequence is attached to the current campaign
327
- table, and the watched campaign is on Send. Use
328
- `attach_recommended_sequence({ campaignId, currentStep:"send" })` when a
329
- safe attach is needed. After `confirm_lead_list` or any source-list copy,
351
+ - The recommended non-paid sequence is attached to the current campaign
352
+ table, and the watched campaign is on Send. Use
353
+ `attach_recommended_sequence({ campaignId, currentStep:"send" })` when a
354
+ safe attach is needed. After `confirm_lead_list` or any source-list copy,
330
355
  immediately reread `get_campaign({ campaignId })`; the returned
331
356
  `workflowTableId` is the current campaign table. Cross-check that exact
332
357
  current workflowTableId with `list_tables` and require `hasSequence:true`
@@ -334,11 +359,15 @@ Parent-thread handwritten copy or setting `currentStep` is not proof.
334
359
  the current campaign table does not, `SEQUENCE_EXISTS` is not enough:
335
360
  record the stale shell table id, then repair the current workflowTableId
336
361
  with `attach_sequence` using the same non-paid product template
337
- `attach_recommended_sequence` would have selected. Never use a paid-InMail
338
- template and never attach/replace sequence outside the current table unless
339
- the current lane packet explicitly allowed sequence repair.
340
- - No scheduled, queued outbound, sent outbound, campaign launch, or paid
341
- InMail spend is created by this skill.
362
+ `attach_recommended_sequence` would have selected. Never use a paid-InMail
363
+ template and never attach/replace sequence outside the current table unless
364
+ the current lane packet explicitly allowed sequence repair.
365
+ - If the current campaign table is still `DRAFT` after sequence/readiness
366
+ proof, call `pause_campaign({ campaignId })` and reread. `pause_campaign`
367
+ is the product-native review-state transition; it is not a launch and does
368
+ not schedule or send. Never raw-write campaign status.
369
+ - No scheduled, queued outbound, sent outbound, campaign launch, or paid
370
+ InMail spend is created by this skill.
342
371
  4. **Verify each slot** after create/reuse/repair:
343
372
  - `get_campaign` shows the campaign exists, remains unlaunched, and has the expected workflow table.
344
373
  - Builder truth must match dashboard truth. `currentStep:"running"` is valid only when the linked table has `campaignStatus:"ACTIVE"`. For a `PAUSED` or `ARCHIVED` campaign/table, repair or flag stale `currentStep:"running"` back to launch review (`send` / review-ready) before reporting the slot done. Never call `start_campaign` just to make a stale `running` step true.