@sellable/mcp 0.1.505 → 0.1.507

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.
@@ -10,13 +10,6 @@ const SAFE_PACKET_ACTION_TYPES = new Set([
10
10
  "approve_messages",
11
11
  "start_paused_campaign",
12
12
  "wait_for_scheduler",
13
- "wait_for_active_work",
14
- "wait_for_source_import",
15
- "copy_selected_source_rows",
16
- "continue_signal_discovery_source",
17
- "continue_sales_nav_source",
18
- "continue_prospeo_source",
19
- "manual_source_replenishment",
20
13
  "refresh_paid_inmail_credits",
21
14
  "lower_paid_inmail_threshold",
22
15
  "switch_to_connection_lane",
@@ -26,14 +19,6 @@ const MANUAL_ONLY_PACKET_ACTION_TYPES = new Set([
26
19
  "lower_paid_inmail_threshold",
27
20
  "switch_to_connection_lane",
28
21
  "create_connection_campaign",
29
- "continue_sales_nav_source",
30
- "continue_prospeo_source",
31
- "manual_source_replenishment",
32
- ]);
33
- const TERMINAL_NO_ACTION_BLOCKER_CODES = new Set([
34
- "paid_inmail_below_threshold",
35
- "paid_inmail_credit_missing",
36
- "paid_inmail_credit_stale",
37
22
  ]);
38
23
  const SOURCE_PLAN_STATES = new Set([
39
24
  "not_needed",
@@ -42,8 +27,6 @@ const SOURCE_PLAN_STATES = new Set([
42
27
  "needs_signal_import",
43
28
  "waiting_for_import",
44
29
  "needs_confirm",
45
- "needs_same_source_copy",
46
- "needs_provider_continuation",
47
30
  "source_shortfall",
48
31
  "provider_exhausted",
49
32
  "provider_missing",
@@ -173,16 +156,6 @@ function sanitizeActionCandidate(candidate) {
173
156
  tableId: stringValue(candidate.tableId),
174
157
  tableName: stringValue(candidate.tableName) ?? null,
175
158
  columnId: stringValue(candidate.columnId) ?? null,
176
- sourceLeadListId: stringValue(candidate.sourceLeadListId) ?? null,
177
- leadSourceProvider: stringValue(candidate.leadSourceProvider) ?? null,
178
- sourceFingerprint: stringValue(candidate.sourceFingerprint) ?? null,
179
- sourceInventoryStatus: stringValue(candidate.sourceInventoryStatus) ?? null,
180
- sourceRowIds: stringArray(candidate.sourceRowIds),
181
- sourceRowLimit: typeof candidate.sourceRowLimit === "number"
182
- ? candidate.sourceRowLimit
183
- : undefined,
184
- activeJobId: stringValue(candidate.activeJobId) ?? null,
185
- activeImportStatus: stringValue(candidate.activeImportStatus) ?? null,
186
159
  targetRows: typeof candidate.targetRows === "number" ? candidate.targetRows : undefined,
187
160
  columnRole: stringValue(candidate.columnRole),
188
161
  rowSelector: sanitizeRowSelector(candidate.rowSelector),
@@ -217,25 +190,9 @@ function sanitizeToolInput(value) {
217
190
  return {};
218
191
  return {
219
192
  senderId: stringValue(value.senderId),
220
- actionType: allowedActionType(value.actionType),
221
193
  campaignId: stringValue(value.campaignId),
222
194
  tableId: stringValue(value.tableId),
223
195
  columnId: stringValue(value.columnId) ?? null,
224
- sourceLeadListId: stringValue(value.sourceLeadListId) ?? null,
225
- leadSourceProvider: stringValue(value.leadSourceProvider) ?? null,
226
- sourceFingerprint: stringValue(value.sourceFingerprint) ?? null,
227
- activeJobId: stringValue(value.activeJobId) ?? null,
228
- activeImportStatus: stringValue(value.activeImportStatus) ?? null,
229
- sourceInventoryStatus: stringValue(value.sourceInventoryStatus) ?? null,
230
- sourceRowIds: stringArray(value.sourceRowIds),
231
- sourceRowLimit: typeof value.sourceRowLimit === "number"
232
- ? value.sourceRowLimit
233
- : undefined,
234
- campaignOfferId: stringValue(value.campaignOfferId),
235
- provider: stringValue(value.provider),
236
- allowDifferentSourceLeadList: typeof value.allowDifferentSourceLeadList === "boolean"
237
- ? value.allowDifferentSourceLeadList
238
- : undefined,
239
196
  targetPreparedMessages: typeof value.targetPreparedMessages === "number"
240
197
  ? value.targetPreparedMessages
241
198
  : undefined,
@@ -262,10 +219,6 @@ function sanitizePacketIds(value) {
262
219
  campaignId: stringValue(value.campaignId),
263
220
  tableId: stringValue(value.tableId),
264
221
  columnId: stringValue(value.columnId) ?? null,
265
- sourceLeadListId: stringValue(value.sourceLeadListId) ?? null,
266
- leadSourceProvider: stringValue(value.leadSourceProvider) ?? null,
267
- sourceFingerprint: stringValue(value.sourceFingerprint) ?? null,
268
- activeJobId: stringValue(value.activeJobId) ?? null,
269
222
  };
270
223
  }
271
224
  function sanitizeStructuredAction(action, selectedBySender, mode, rank) {
@@ -288,7 +241,6 @@ function sanitizeStructuredAction(action, selectedBySender, mode, rank) {
288
241
  return {
289
242
  rank,
290
243
  type: action.type,
291
- actionType: allowedActionType(action.actionType),
292
244
  toolName: stringValue(action.toolName) ?? null,
293
245
  sideEffectClass: stringValue(action.sideEffectClass),
294
246
  ids,
@@ -386,9 +338,6 @@ function sanitizeSourcePlan(value) {
386
338
  reason: stringValue(value.reason),
387
339
  campaignId: stringValue(value.campaignId),
388
340
  tableId: stringValue(value.tableId),
389
- sourceLeadListId: stringValue(value.sourceLeadListId) ?? null,
390
- leadSourceProvider: stringValue(value.leadSourceProvider) ?? null,
391
- sourceFingerprint: stringValue(value.sourceFingerprint) ?? null,
392
341
  remainingRowsNeeded: typeof value.remainingRowsNeeded === "number"
393
342
  ? value.remainingRowsNeeded
394
343
  : undefined,
@@ -637,16 +586,14 @@ function sanitizeRefillTargetPlanResult(result) {
637
586
  const eligibleSenderLedger = sanitizeEligibleSenderLedger(target.eligibleSenderLedger, selectedBySender);
638
587
  const senderRefillPlans = sanitizeStructuredSenderPlans(target.senderRefillPlans, selectedBySender);
639
588
  const globalActionQueue = buildSanitizedGlobalActionQueue(senderRefillPlans);
640
- const hasTerminalNoActionBlocker = globalActionQueue.length === 0 &&
641
- blockers.some((blocker) => TERMINAL_NO_ACTION_BLOCKER_CODES.has(String(blocker.code)));
642
- const status = remainingProjectedGap === 0
643
- ? "complete"
644
- : grossTarget <= 0
645
- ? "blocked"
646
- : remainingReadyOrProjectedGap === 0
647
- ? "awaiting_scheduler_after_ready_buffer"
648
- : hasTerminalNoActionBlocker
649
- ? "blocked"
589
+ const status = blockers.some((blocker) => ["sender_disconnected", "sender_sales_nav_disconnected"].includes(String(blocker.code)))
590
+ ? "blocked"
591
+ : remainingProjectedGap === 0
592
+ ? "complete"
593
+ : grossTarget <= 0
594
+ ? "blocked"
595
+ : remainingReadyOrProjectedGap === 0
596
+ ? "awaiting_scheduler_after_ready_buffer"
650
597
  : "needs_refill";
651
598
  return {
652
599
  ...result,
@@ -584,6 +584,89 @@ export declare const allTools: ({
584
584
  required: string[];
585
585
  additionalProperties: boolean;
586
586
  };
587
+ } | {
588
+ name: string;
589
+ description: string;
590
+ inputSchema: {
591
+ type: string;
592
+ properties: {
593
+ campaignId: {
594
+ type: string;
595
+ description: string;
596
+ };
597
+ tableId: {
598
+ type: string;
599
+ };
600
+ targetPreparedMessages: {
601
+ type: string;
602
+ minimum: number;
603
+ maximum: number;
604
+ };
605
+ maxRowsToCheck: {
606
+ type: string;
607
+ minimum: number;
608
+ maximum: number;
609
+ description: string;
610
+ };
611
+ batchSize: {
612
+ type: string;
613
+ minimum: number;
614
+ maximum: number;
615
+ description: string;
616
+ };
617
+ maxBatchRows: {
618
+ type: string;
619
+ minimum: number;
620
+ maximum: number;
621
+ description: string;
622
+ };
623
+ approvalMode: {
624
+ type: string;
625
+ enum: string[];
626
+ description: string;
627
+ };
628
+ autoContinue: {
629
+ type: string;
630
+ };
631
+ disableLowPassRateStop: {
632
+ type: string;
633
+ description: string;
634
+ };
635
+ rowSelector: {
636
+ type: string;
637
+ description: string;
638
+ properties: {
639
+ type: {
640
+ type: string;
641
+ enum: string[];
642
+ };
643
+ basisHash: {
644
+ type: string;
645
+ };
646
+ rowIds: {
647
+ type: string;
648
+ items: {
649
+ type: string;
650
+ };
651
+ };
652
+ limit: {
653
+ type: string;
654
+ minimum: number;
655
+ maximum: number;
656
+ };
657
+ };
658
+ required: string[];
659
+ additionalProperties: boolean;
660
+ };
661
+ workspaceId: {
662
+ type: string;
663
+ description: string;
664
+ };
665
+ jobId?: undefined;
666
+ };
667
+ required: string[];
668
+ additionalProperties: boolean;
669
+ };
587
670
  } | {
588
671
  name: string;
589
672
  description: string;
@@ -609,11 +692,9 @@ export declare const allTools: ({
609
692
  batchSize?: undefined;
610
693
  maxBatchRows?: undefined;
611
694
  approvalMode?: undefined;
612
- rowSelector?: undefined;
613
695
  autoContinue?: undefined;
614
- senderId?: undefined;
615
- actionType?: undefined;
616
696
  disableLowPassRateStop?: undefined;
697
+ rowSelector?: undefined;
617
698
  };
618
699
  additionalProperties: boolean;
619
700
  required?: undefined;
@@ -3050,8 +3131,6 @@ export declare const allTools: ({
3050
3131
  keepInSync?: undefined;
3051
3132
  jobId?: undefined;
3052
3133
  reviewBatchLimit?: undefined;
3053
- sourceRowIds?: undefined;
3054
- sourceRowLimit?: undefined;
3055
3134
  allowPartialSourceList?: undefined;
3056
3135
  includeRawImportResult?: undefined;
3057
3136
  selections?: undefined;
@@ -3246,8 +3325,6 @@ export declare const allTools: ({
3246
3325
  keepInSync?: undefined;
3247
3326
  jobId?: undefined;
3248
3327
  reviewBatchLimit?: undefined;
3249
- sourceRowIds?: undefined;
3250
- sourceRowLimit?: undefined;
3251
3328
  allowPartialSourceList?: undefined;
3252
3329
  includeRawImportResult?: undefined;
3253
3330
  selections?: undefined;
@@ -3341,8 +3418,6 @@ export declare const allTools: ({
3341
3418
  keepInSync?: undefined;
3342
3419
  jobId?: undefined;
3343
3420
  reviewBatchLimit?: undefined;
3344
- sourceRowIds?: undefined;
3345
- sourceRowLimit?: undefined;
3346
3421
  allowPartialSourceList?: undefined;
3347
3422
  includeRawImportResult?: undefined;
3348
3423
  selections?: undefined;
@@ -3508,8 +3583,6 @@ export declare const allTools: ({
3508
3583
  keepInSync?: undefined;
3509
3584
  jobId?: undefined;
3510
3585
  reviewBatchLimit?: undefined;
3511
- sourceRowIds?: undefined;
3512
- sourceRowLimit?: undefined;
3513
3586
  allowPartialSourceList?: undefined;
3514
3587
  includeRawImportResult?: undefined;
3515
3588
  selections?: undefined;
@@ -3617,8 +3690,6 @@ export declare const allTools: ({
3617
3690
  keepInSync?: undefined;
3618
3691
  jobId?: undefined;
3619
3692
  reviewBatchLimit?: undefined;
3620
- sourceRowIds?: undefined;
3621
- sourceRowLimit?: undefined;
3622
3693
  allowPartialSourceList?: undefined;
3623
3694
  includeRawImportResult?: undefined;
3624
3695
  selections?: undefined;
@@ -3735,8 +3806,6 @@ export declare const allTools: ({
3735
3806
  keepInSync?: undefined;
3736
3807
  jobId?: undefined;
3737
3808
  reviewBatchLimit?: undefined;
3738
- sourceRowIds?: undefined;
3739
- sourceRowLimit?: undefined;
3740
3809
  allowPartialSourceList?: undefined;
3741
3810
  includeRawImportResult?: undefined;
3742
3811
  selections?: undefined;
@@ -3842,8 +3911,6 @@ export declare const allTools: ({
3842
3911
  keepInSync?: undefined;
3843
3912
  jobId?: undefined;
3844
3913
  reviewBatchLimit?: undefined;
3845
- sourceRowIds?: undefined;
3846
- sourceRowLimit?: undefined;
3847
3914
  allowPartialSourceList?: undefined;
3848
3915
  includeRawImportResult?: undefined;
3849
3916
  selections?: undefined;
@@ -3954,8 +4021,6 @@ export declare const allTools: ({
3954
4021
  keepInSync?: undefined;
3955
4022
  jobId?: undefined;
3956
4023
  reviewBatchLimit?: undefined;
3957
- sourceRowIds?: undefined;
3958
- sourceRowLimit?: undefined;
3959
4024
  allowPartialSourceList?: undefined;
3960
4025
  includeRawImportResult?: undefined;
3961
4026
  selections?: undefined;
@@ -4054,8 +4119,6 @@ export declare const allTools: ({
4054
4119
  keepInSync?: undefined;
4055
4120
  jobId?: undefined;
4056
4121
  reviewBatchLimit?: undefined;
4057
- sourceRowIds?: undefined;
4058
- sourceRowLimit?: undefined;
4059
4122
  allowPartialSourceList?: undefined;
4060
4123
  includeRawImportResult?: undefined;
4061
4124
  selections?: undefined;
@@ -4946,8 +5009,6 @@ export declare const allTools: ({
4946
5009
  keepInSync?: undefined;
4947
5010
  jobId?: undefined;
4948
5011
  reviewBatchLimit?: undefined;
4949
- sourceRowIds?: undefined;
4950
- sourceRowLimit?: undefined;
4951
5012
  allowPartialSourceList?: undefined;
4952
5013
  includeRawImportResult?: undefined;
4953
5014
  selections?: undefined;
@@ -5055,8 +5116,6 @@ export declare const allTools: ({
5055
5116
  keepInSync?: undefined;
5056
5117
  jobId?: undefined;
5057
5118
  reviewBatchLimit?: undefined;
5058
- sourceRowIds?: undefined;
5059
- sourceRowLimit?: undefined;
5060
5119
  allowPartialSourceList?: undefined;
5061
5120
  includeRawImportResult?: undefined;
5062
5121
  selections?: undefined;
@@ -6102,8 +6161,6 @@ export declare const allTools: ({
6102
6161
  keepInSync?: undefined;
6103
6162
  jobId?: undefined;
6104
6163
  reviewBatchLimit?: undefined;
6105
- sourceRowIds?: undefined;
6106
- sourceRowLimit?: undefined;
6107
6164
  allowPartialSourceList?: undefined;
6108
6165
  includeRawImportResult?: undefined;
6109
6166
  selections?: undefined;
@@ -6258,8 +6315,6 @@ export declare const allTools: ({
6258
6315
  keepInSync?: undefined;
6259
6316
  jobId?: undefined;
6260
6317
  reviewBatchLimit?: undefined;
6261
- sourceRowIds?: undefined;
6262
- sourceRowLimit?: undefined;
6263
6318
  allowPartialSourceList?: undefined;
6264
6319
  includeRawImportResult?: undefined;
6265
6320
  selections?: undefined;
@@ -6401,8 +6456,6 @@ export declare const allTools: ({
6401
6456
  keepInSync?: undefined;
6402
6457
  jobId?: undefined;
6403
6458
  reviewBatchLimit?: undefined;
6404
- sourceRowIds?: undefined;
6405
- sourceRowLimit?: undefined;
6406
6459
  allowPartialSourceList?: undefined;
6407
6460
  includeRawImportResult?: undefined;
6408
6461
  selections?: undefined;
@@ -6499,8 +6552,6 @@ export declare const allTools: ({
6499
6552
  keepInSync?: undefined;
6500
6553
  jobId?: undefined;
6501
6554
  reviewBatchLimit?: undefined;
6502
- sourceRowIds?: undefined;
6503
- sourceRowLimit?: undefined;
6504
6555
  allowPartialSourceList?: undefined;
6505
6556
  includeRawImportResult?: undefined;
6506
6557
  selections?: undefined;
@@ -6547,17 +6598,6 @@ export declare const allTools: ({
6547
6598
  type: string;
6548
6599
  description: string;
6549
6600
  };
6550
- sourceRowIds: {
6551
- type: string;
6552
- items: {
6553
- type: string;
6554
- };
6555
- description: string;
6556
- };
6557
- sourceRowLimit: {
6558
- type: string;
6559
- description: string;
6560
- };
6561
6601
  allowPartialSourceList: {
6562
6602
  type: string;
6563
6603
  description: string;
@@ -6767,8 +6807,6 @@ export declare const allTools: ({
6767
6807
  keepInSync?: undefined;
6768
6808
  jobId?: undefined;
6769
6809
  reviewBatchLimit?: undefined;
6770
- sourceRowIds?: undefined;
6771
- sourceRowLimit?: undefined;
6772
6810
  allowPartialSourceList?: undefined;
6773
6811
  includeRawImportResult?: undefined;
6774
6812
  };
@@ -6866,8 +6904,6 @@ export declare const allTools: ({
6866
6904
  keepInSync?: undefined;
6867
6905
  jobId?: undefined;
6868
6906
  reviewBatchLimit?: undefined;
6869
- sourceRowIds?: undefined;
6870
- sourceRowLimit?: undefined;
6871
6907
  allowPartialSourceList?: undefined;
6872
6908
  includeRawImportResult?: undefined;
6873
6909
  selections?: undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.505",
3
+ "version": "0.1.507",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -92,16 +92,10 @@ When the host can call typed MCP tools, start with:
92
92
  refill_sends({ yolo?: boolean, executionMode?: "manual" | "scheduled" | "yolo", requireWorkspace?: boolean, workspaceId?: string, senders?: string[], senderIds?: string[], senderNames?: string[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
93
93
  ```
94
94
 
95
- That command helper normalizes arguments and returns the execution contract. In
96
- non-yolo mode it does not mutate. In `--yolo`, it may execute exactly one safe
97
- bounded primitive from the fresh `target.globalActionQueue[0]`, then reread and
98
- return the new target plan; currently safe primitives are paid-credit refresh,
99
- existing-row message preparation, same-source row copy, and read-only wait
100
- rereads. It does not run unbounded approval, lower
101
- paid-InMail thresholds, switch source families, create campaigns, launch, send,
102
- or write scheduler rows. Continue with the workflow below for route selection,
103
- state rereads, approval gating, source import, preparation, and bounded
104
- approval.
95
+ That command helper only normalizes arguments and returns the execution
96
+ contract. It does not mutate. Continue with the workflow below for route
97
+ selection, state rereads, approval gating, source import, preparation, and
98
+ bounded approval.
105
99
 
106
100
  ## Workspace Contract
107
101
 
@@ -205,20 +199,12 @@ Structured planner packet:
205
199
  - `manualAlternates` are not yolo actions. Threshold lowering and campaign
206
200
  creation are manual continuations only.
207
201
 
208
- Refill action ladder: approve generated rows only when an explicit bounded
209
- approval gate exists, process all existing same-campaign unenriched/unprepared
210
- rows in bounded batches before any source work, then copy bounded net-new rows
211
- from the selected source (`selectedLeadListId`, provider, and source
212
- fingerprint preserved), then use provider-aligned source-more. A new source or
213
- provider switch changes the reply-rate baseline and is a manual alternate, not a
214
- `--yolo` side effect.
215
-
216
202
  Run-local paid-credit guard: in `--yolo`, the `refill_sends` MCP command
217
203
  automatically maintains a `refreshedPaidInmailSenderIds` set for the current
218
204
  command call. If its first target plan has stale/missing paid-InMail credit
219
205
  facts, it refreshes each selected sender at most once, reruns
220
206
  `get_refill_target_plan`, and returns the post-refresh `targetPlan` before
221
- choosing the next prep/source-copy/bounded-approval/read-only wait action. If fresh facts are still below
207
+ choosing the next prep/approval/start action. If fresh facts are still below
222
208
  threshold, below-threshold paid-InMail facts fall back to an existing connection
223
209
  lane, the same Sales Nav cascade campaign's connection branch, or a manual
224
210
  continuation.
@@ -252,7 +238,10 @@ next action in `--yolo`. Do not present paid-credit refresh as the next operator
252
238
  action after `refill_sends` returns `autoPaidInmailRefresh` and the
253
239
  post-refresh `targetPlan`. Trust `refill_sends.autoPaidInmailRefresh`: it should
254
240
  show the exact sender ids refreshed once, sender-credit-cache write receipts,
255
- and a returned post-refresh `targetPlan`. Continue from that post-refresh packet.
241
+ and a returned post-refresh `targetPlan`. Also inspect
242
+ `refill_sends.yoloExecution`: if it applied a supported yolo action, continue
243
+ from the final returned `targetPlan`; otherwise continue from the post-refresh
244
+ packet or `targetPlanBeforeYoloAction`.
256
245
  If paid InMail is below threshold after the fresh credit read, report the exact
257
246
  campaign/table/column threshold action or same-campaign connection fallback;
258
247
  `--yolo` does not lower paid-InMail thresholds or create campaigns.
@@ -307,7 +296,7 @@ they change `stateRevision`, not `targetShapeRevision`, and do not require a
307
296
  second approval.
308
297
 
309
298
  In `--yolo`, continue as far as the rendered packet safely allows. After each
310
- apply/prep/source-copy/bounded-approval/read-only wait result, reread state, settle processing when needed, and move to
299
+ apply/prep/start result, reread state, settle processing when needed, and move to
311
300
  the next selected sender or start-eligible same-packet campaign instead of
312
301
  stopping after the first partial result. If no in-packet safe action remains,
313
302
  return concrete continuation options with campaign names, exact ids, which option
@@ -321,7 +310,7 @@ selected sender: selected send days, gross capacity, actual sent cells, future
321
310
  scheduler-owned scheduled cells with non-null `scheduledFor`, projected count,
322
311
  ready-to-schedule buffer, remaining projected gap, paid-InMail feasibility,
323
312
  `targetShapeRevision`, `stateRevision`, and the next MCP primitive that can
324
- reduce the gap. After every apply/prep/source-copy/bounded-approval/read-only wait result, wait for processing, reread
313
+ reduce the gap. After every apply/prep/start result, wait for processing, reread
325
314
  the target plan/refill state, recompute the ledger, then keep applying safe
326
315
  bounded actions until projected coverage fills the target window or a concrete
327
316
  non-scheduler blocker is proven.
@@ -120,19 +120,12 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
120
120
  - `nextActions[0]` is the current sender's smallest safe primitive.
121
121
  - `manualAlternates` are not yolo actions. Threshold lowering and campaign
122
122
  creation are manual continuations only.
123
- Refill action ladder: approve generated rows only when an explicit bounded
124
- approval gate exists, process all existing same-campaign
125
- unenriched/unprepared rows in bounded batches before any source work, then
126
- copy bounded net-new rows from the selected source (`selectedLeadListId`,
127
- provider, and source fingerprint preserved), then use provider-aligned
128
- source-more. A new source or provider switch changes the reply-rate baseline
129
- and is a manual alternate, not a `--yolo` side effect.
130
123
  Run-local paid-credit guard: in `--yolo`, the `refill_sends` MCP command
131
124
  automatically maintains a `refreshedPaidInmailSenderIds` set for the current
132
125
  command call. If its first target plan has stale/missing paid-InMail credit
133
126
  facts, it refreshes each selected sender at most once, reruns
134
127
  `get_refill_target_plan`, and returns the post-refresh `targetPlan` before
135
- choosing the next prep/source-copy/bounded-approval/read-only wait action. If fresh facts are still below
128
+ choosing the next prep/approval/start action. If fresh facts are still below
136
129
  threshold, below-threshold paid-InMail facts fall back to an existing
137
130
  connection lane, the same Sales Nav cascade campaign's connection branch, or
138
131
  a manual continuation.
@@ -168,8 +161,10 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
168
161
  operator action after `refill_sends` returns `autoPaidInmailRefresh` and the
169
162
  post-refresh `targetPlan`. Trust `refill_sends.autoPaidInmailRefresh`: it
170
163
  should show the exact sender ids refreshed once, sender-credit-cache write
171
- receipts, and a returned post-refresh `targetPlan`. Continue from that
172
- post-refresh packet. If paid InMail is below threshold after the fresh credit read, report
164
+ receipts, and a returned post-refresh `targetPlan`. Also inspect
165
+ `refill_sends.yoloExecution`: if it applied a supported yolo action,
166
+ continue from the final returned `targetPlan`; otherwise continue from the
167
+ post-refresh packet or `targetPlanBeforeYoloAction`. If paid InMail is below threshold after the fresh credit read, report
173
168
  the exact campaign/table/column threshold action or same-campaign
174
169
  connection fallback; `--yolo` does not lower paid-InMail thresholds or create campaigns.
175
170
  2. Call `resolve_campaign_fill_route`. Use `intent:"plain"` for generic
@@ -571,7 +566,7 @@ same refill request, do not ask the `Accept` / `Decline` question. Instead:
571
566
  caps/dates, approval mode, blockers, and side-effect class still match the
572
567
  packet;
573
568
  4. execute only the exact packet;
574
- 5. after each terminal credit-refresh/apply/prep/source-copy/bounded-approval/read-only wait result, rerun
569
+ 5. after each terminal credit-refresh/apply/prep/start result, rerun
575
570
  `get_refill_target_plan`, reread state, settle processing when needed,
576
571
  recompute the target-window saturation ledger, and continue with the next smallest
577
572
  safe action inside the same bounded packet until every selected sender is