@sellable/mcp 0.1.552 → 0.1.553
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.
- package/dist/tools/refill-executors.d.ts +30 -0
- package/dist/tools/refill-executors.js +126 -0
- package/dist/tools/refill-sends.d.ts +181 -39
- package/dist/tools/refill-sends.js +141 -13
- package/dist/tools/refill-target-plan.js +179 -1
- package/dist/tools/registry.d.ts +8 -0
- package/dist/tools/scheduler-run.d.ts +10 -0
- package/dist/tools/scheduler-run.js +20 -0
- package/package.json +1 -1
- package/skills/refill-sends/SKILL.md +38 -7
- package/skills/refill-sends-workflow/SKILL.md +44 -6
- package/skills/refill-sends-workflow/core/flow.v1.json +63 -1
|
@@ -83,6 +83,8 @@ Accepted invocation flags in the same user request:
|
|
|
83
83
|
- `senderIds: <id>, <id>` or `senderNames: <name>, <name>`: explicit selector
|
|
84
84
|
alternatives when the host preserves natural-language arguments better than
|
|
85
85
|
shell-style flags.
|
|
86
|
+
- `actionTypes: send_invite, send_inmail_closed`: optional lane selector. Omit
|
|
87
|
+
`actionTypes` to preserve the target planner's lane inference.
|
|
86
88
|
- `untilDate: YYYY-MM-DD`: explicit date selector alternative when the host
|
|
87
89
|
preserves natural-language arguments better than shell-style flags.
|
|
88
90
|
- `targetDate: YYYY-MM-DD`: exact-date selector alternative when the host
|
|
@@ -91,7 +93,7 @@ Accepted invocation flags in the same user request:
|
|
|
91
93
|
When the host can call typed MCP tools, start with:
|
|
92
94
|
|
|
93
95
|
```text
|
|
94
|
-
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" })
|
|
96
|
+
refill_sends({ yolo?: boolean, executionMode?: "manual" | "scheduled" | "yolo", requireWorkspace?: boolean, workspaceId?: string, senders?: string[], senderIds?: string[], senderNames?: string[], actionTypes?: ("send_invite" | "send_inmail_closed")[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
|
|
95
97
|
```
|
|
96
98
|
|
|
97
99
|
That command helper normalizes arguments and returns the execution contract. In
|
|
@@ -99,14 +101,22 @@ non-yolo mode it does not mutate. In `--yolo`, it may execute exactly one safe
|
|
|
99
101
|
bounded primitive from the fresh `target.globalActionQueue[0]`, then reread and
|
|
100
102
|
return the new target plan; currently safe primitives are paid-credit refresh,
|
|
101
103
|
existing-row message preparation, generated-message approval, receipt-proven
|
|
102
|
-
same-source row copy,
|
|
104
|
+
same-source row copy, a request-scoped exact-date product scheduler sweep, and
|
|
105
|
+
read-only wait rereads. Same-source copy/source
|
|
103
106
|
fallback is safe only after receipt-proven exhaustion:
|
|
104
107
|
`hasMoreFrontierRows:false`, zero `approvalCandidates`, no `stuckActiveCells`,
|
|
105
|
-
and no non-terminal `approvedNotDispatched` work. It does not run unbounded
|
|
106
|
-
paid-InMail thresholds, switch source families, create
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
approval.
|
|
108
|
+
and no non-terminal `approvedNotDispatched` work. It does not run unbounded
|
|
109
|
+
approval, lower paid-InMail thresholds, switch source families, create
|
|
110
|
+
campaigns, launch, or send directly; it never raw-writes scheduler fields.
|
|
111
|
+
Continue with the workflow below for route selection, state rereads, approval
|
|
112
|
+
gating, source import, preparation, and bounded approval.
|
|
113
|
+
|
|
114
|
+
The approval scope is the exact `workspaceId`, `targetDate`, sender ids, action
|
|
115
|
+
types, campaign/table/source ids, `targetShapeRevision`, and `actionKey` in the
|
|
116
|
+
rendered packet. `stateRevision` and sent/scheduled/ready counts are mutable
|
|
117
|
+
progress, not approval-scope drift. Execute only
|
|
118
|
+
`target.globalActionQueue[0]`, then perform a full authoritative reread before
|
|
119
|
+
deciding any next action.
|
|
110
120
|
|
|
111
121
|
## Workspace Contract
|
|
112
122
|
|
|
@@ -284,6 +294,19 @@ When the refill loop has ready rows and needs scheduler pickup now, use
|
|
|
284
294
|
`run_scheduler_sweep` with the same explicit `workspaceId`; it can place cells
|
|
285
295
|
within existing scheduler gates and returns the receipt, but it never sends or
|
|
286
296
|
bypasses limits.
|
|
297
|
+
A scheduler sweep is a visible workspace-wide scheduling side effect. The
|
|
298
|
+
request packet limits the expected target changes to its exact date, senders,
|
|
299
|
+
action types, campaigns, tables, and stable sources, but the product scheduler
|
|
300
|
+
may also place unrelated eligible workspace work; disclose that possibility in
|
|
301
|
+
the approval packet and receipt. For an exact-date sweep action, execute it
|
|
302
|
+
once, then reread the full target plan before taking or presenting another
|
|
303
|
+
action.
|
|
304
|
+
The exact-date `run_scheduler_sweep` may schedule eligible workspace cells
|
|
305
|
+
through existing product gates; it never sends directly or raw-writes scheduler
|
|
306
|
+
fields. Only non-exact or no-sweep scheduler waits are read-only.
|
|
307
|
+
On resume, reconcile the current target plan and matching sweep status/receipt
|
|
308
|
+
before retrying. A matching same-key terminal receipt replays; an
|
|
309
|
+
`uncertain_outcome` stops for reconciliation and must not schedule again.
|
|
287
310
|
Scheduler-run receipt interpretation: `cellsConsidered is allocation-attempt
|
|
288
311
|
count`, not total ready supply, while `readyCellsFound` is ready inventory found
|
|
289
312
|
before prefilters. Inspect `campaignScopeSummary` before assuming the selected
|
|
@@ -396,6 +419,14 @@ scheduler wait loop. Do not finish the refill goal, mark it complete, or mark it
|
|
|
396
419
|
blocked only because it is still `awaiting_scheduler_after_ready_buffer`; keep
|
|
397
420
|
waiting unless Christian stops the run or the host cannot continue.
|
|
398
421
|
|
|
422
|
+
Future scheduled coverage and already sent actions are distinct; only
|
|
423
|
+
scheduler-owned future scheduled actions count as scheduled coverage. For
|
|
424
|
+
multiple target dates, finish D1 execution and the full D1 reread before
|
|
425
|
+
planning D2. Completion proof is product-native Sellable MCP evidence only:
|
|
426
|
+
target plan, campaign refill state, scheduler capacity, sweep/status, and
|
|
427
|
+
bounded receipts. Never use individual cell ids, Prisma, SQL, direct database
|
|
428
|
+
access, or production-environment scripts as completion proof.
|
|
429
|
+
|
|
399
430
|
In `--yolo`, the default fill target is the scheduler-forward 48-hour window
|
|
400
431
|
unless `--target-date`/`targetDate`, `--until`/`untilDate`, or an explicit
|
|
401
432
|
compatibility `horizonSendDays` is provided. If a target date is provided,
|
|
@@ -75,6 +75,20 @@ calls, preparation calls, approval calls, and campaign start calls. Missing
|
|
|
75
75
|
interactive workspace switching is diagnostic setup only and is not an
|
|
76
76
|
automation control path.
|
|
77
77
|
|
|
78
|
+
Typed command scope:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
refill_sends({ yolo?: boolean, executionMode?: "manual" | "scheduled" | "yolo", requireWorkspace?: boolean, workspaceId?: string, senders?: string[], senderIds?: string[], senderNames?: string[], actionTypes?: ("send_invite" | "send_inmail_closed")[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Omit `actionTypes` to preserve the target planner's lane inference. The
|
|
85
|
+
approval scope is the exact `workspaceId`, `targetDate`, sender ids, action
|
|
86
|
+
types, campaign/table/source ids, `targetShapeRevision`, and `actionKey` in the
|
|
87
|
+
rendered packet. `stateRevision` and sent/scheduled/ready counts are mutable
|
|
88
|
+
progress, not approval-scope drift. Execute only
|
|
89
|
+
`target.globalActionQueue[0]`, then perform a full authoritative reread before
|
|
90
|
+
deciding any next action.
|
|
91
|
+
|
|
78
92
|
Goal-mode continuation: a skill cannot create or invoke `/goal` by itself. When
|
|
79
93
|
this workflow is already running inside an active Codex goal, keep that goal
|
|
80
94
|
open until every selected sender lane is horizon-filled by projected coverage
|
|
@@ -192,6 +206,19 @@ files or memory.
|
|
|
192
206
|
`run_scheduler_sweep` with the same explicit `workspaceId` to request the
|
|
193
207
|
product scheduler placement pass now and read its receipt. This may place
|
|
194
208
|
cells within existing gates, never sends messages, and never bypasses limits.
|
|
209
|
+
A scheduler sweep is a visible workspace-wide scheduling side effect. The
|
|
210
|
+
request packet limits expected target changes to the exact date, senders,
|
|
211
|
+
action types, campaigns, tables, and stable sources, but unrelated eligible
|
|
212
|
+
workspace work may also be scheduled by the product scheduler and must be
|
|
213
|
+
disclosed. For an exact-date sweep action, execute it once and perform the
|
|
214
|
+
full target-plan reread before taking or presenting another action.
|
|
215
|
+
The exact-date `run_scheduler_sweep` may schedule eligible workspace cells
|
|
216
|
+
through existing product gates; it never sends directly or raw-writes
|
|
217
|
+
scheduler fields. Only non-exact or no-sweep scheduler waits are read-only.
|
|
218
|
+
On resume, reconcile the current target plan and matching sweep
|
|
219
|
+
status/receipt before retrying. A matching same-key terminal receipt
|
|
220
|
+
replays; an `uncertain_outcome` stops for reconciliation and must not
|
|
221
|
+
schedule again.
|
|
195
222
|
Scheduler-run receipt interpretation: `cellsConsidered is
|
|
196
223
|
allocation-attempt count`, not total ready supply, while `readyCellsFound`
|
|
197
224
|
is ready inventory found before prefilters. Inspect `campaignScopeSummary`
|
|
@@ -210,8 +237,10 @@ files or memory.
|
|
|
210
237
|
scheduled count, projected count, campaign ids, and no-op proof without
|
|
211
238
|
asking for approval or mutating.
|
|
212
239
|
If `remainingReadyOrProjectedGap:0` but `remainingProjectedGap>0`, and paid
|
|
213
|
-
InMail credit freshness is clean for every selected paid-InMail lane,
|
|
214
|
-
|
|
240
|
+
InMail credit freshness is clean for every selected paid-InMail lane,
|
|
241
|
+
execute an exact-date `run_scheduler_sweep` action once when it is
|
|
242
|
+
`target.globalActionQueue[0]`, then fully reread. Otherwise, run only a
|
|
243
|
+
persistent read-only scheduler wait/reread loop; do not ask for
|
|
215
244
|
prep/import/approval. Poll `get_refill_target_plan` every 60-120 seconds, or
|
|
216
245
|
on the host's next continuation interval, until projected coverage fills,
|
|
217
246
|
a concrete non-scheduler blocker appears, or Christian explicitly asks to
|
|
@@ -384,10 +413,11 @@ exceeds the sender's capacity for the selected target window. Put another way:
|
|
|
384
413
|
complete when the same daily-limit/readback model would show no remaining
|
|
385
414
|
send-day capacity for that selected lane. Ready-to-schedule rows are only buffer
|
|
386
415
|
for the product scheduler. If ready plus projected coverage covers the target
|
|
387
|
-
window but scheduled cells do not yet,
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
416
|
+
window but scheduled cells do not yet, execute the exact-date sweep when the
|
|
417
|
+
planner emits it; otherwise run a persistent read-only scheduler wait loop:
|
|
418
|
+
wait, reread, recompute the ledger, and continue until projected coverage is
|
|
419
|
+
proved, a concrete non-scheduler blocker appears, or Christian explicitly stops
|
|
420
|
+
or asks for status only. `awaiting_scheduler_after_ready_buffer` is not
|
|
391
421
|
success and is not a terminal blocker for an active refill goal; it is the
|
|
392
422
|
loaded, awaiting scheduler poll state that keeps the thread waiting. It does not
|
|
393
423
|
need a prep/import/approval packet.
|
|
@@ -720,6 +750,14 @@ with non-null `scheduledFor`. Prepared, approved, and ready-to-schedule rows are
|
|
|
720
750
|
intermediate states; report them as awaiting scheduler unless scheduled cells
|
|
721
751
|
are present.
|
|
722
752
|
|
|
753
|
+
Future scheduled coverage and already sent actions are distinct; only
|
|
754
|
+
scheduler-owned future scheduled actions count as scheduled coverage. For
|
|
755
|
+
multiple target dates, finish D1 execution and the full D1 reread before
|
|
756
|
+
planning D2. Completion proof is product-native Sellable MCP evidence only:
|
|
757
|
+
target plan, campaign refill state, scheduler capacity, sweep/status, and
|
|
758
|
+
bounded receipts. Never use individual cell ids, Prisma, SQL, direct database
|
|
759
|
+
access, or production-environment scripts as completion proof.
|
|
760
|
+
|
|
723
761
|
preparedMessages can remain 0 while scheduler-ready state changes downstream.
|
|
724
762
|
After a prep job reaches a terminal state, run `wait_for_campaign_processing`
|
|
725
763
|
when generated/pass counts are still settling, then poll `get_campaign_refill_state` until `readyToSchedule` drops, scheduled counts increase, or the state clearly
|
|
@@ -61,6 +61,44 @@
|
|
|
61
61
|
"scheduled",
|
|
62
62
|
"projected"
|
|
63
63
|
],
|
|
64
|
+
"scopeContract": {
|
|
65
|
+
"immutableApprovalEnvelope": [
|
|
66
|
+
"workspaceId",
|
|
67
|
+
"targetDate",
|
|
68
|
+
"senderIds",
|
|
69
|
+
"actionTypes",
|
|
70
|
+
"campaignIds",
|
|
71
|
+
"tableIds",
|
|
72
|
+
"sourceIds",
|
|
73
|
+
"targetShapeRevision",
|
|
74
|
+
"actionKey"
|
|
75
|
+
],
|
|
76
|
+
"mutableProgress": [
|
|
77
|
+
"stateRevision",
|
|
78
|
+
"sent",
|
|
79
|
+
"scheduled",
|
|
80
|
+
"readyToSchedule",
|
|
81
|
+
"remainingProjectedGap"
|
|
82
|
+
],
|
|
83
|
+
"executionRules": [
|
|
84
|
+
"Execute only target.globalActionQueue[0].",
|
|
85
|
+
"Execute one action, then perform a full authoritative reread before selecting any next action.",
|
|
86
|
+
"Mutable progress must not be treated as approval-scope drift while targetShapeRevision remains stable."
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"interruptionRecovery": {
|
|
90
|
+
"rules": [
|
|
91
|
+
"On resume, reread the canonical target plan and reconcile scheduler status or receipt with the matching requestKey and actionKey before retrying.",
|
|
92
|
+
"A matching terminal receipt must replay without a second scheduler execution.",
|
|
93
|
+
"An uncertain_outcome requires reconciliation; do not schedule again with the same or a replacement key until a canonical read resolves it."
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"multiDayOrdering": {
|
|
97
|
+
"rules": [
|
|
98
|
+
"For multiple target dates, finish D1 execution and the full D1 reread before planning D2.",
|
|
99
|
+
"Do not pre-plan or execute a later date from stale earlier-date state."
|
|
100
|
+
]
|
|
101
|
+
},
|
|
64
102
|
"states": [
|
|
65
103
|
{
|
|
66
104
|
"id": "target_plan_read",
|
|
@@ -188,7 +226,7 @@
|
|
|
188
226
|
},
|
|
189
227
|
{
|
|
190
228
|
"id": "scheduler_wait_readback",
|
|
191
|
-
"description": "
|
|
229
|
+
"description": "Exact-date scheduler sweep or read-only polling after rows are ready and paid-credit facts are fresh.",
|
|
192
230
|
"allowedTools": [
|
|
193
231
|
"get_refill_target_plan",
|
|
194
232
|
"get_scheduler_fill_capacity",
|
|
@@ -203,6 +241,9 @@
|
|
|
203
241
|
"rules": [
|
|
204
242
|
"Poll every 60-120 seconds or on the host continuation interval.",
|
|
205
243
|
"Use run_scheduler_sweep with the explicit workspaceId when ready rows need scheduler pickup now; it places cells only inside existing gates and never sends.",
|
|
244
|
+
"A scheduler sweep is a visible workspace-wide scheduling side effect; the packet limits expected target changes but must disclose that unrelated eligible workspace work may also be scheduled.",
|
|
245
|
+
"For an explicit targetDate, execute only the request-scoped run_scheduler_sweep from target.globalActionQueue[0], then perform a full authoritative target-plan reread before any next action.",
|
|
246
|
+
"Reuse the matching requestKey and actionKey only for status or receipt reconciliation; replay a matching terminal receipt and stop on uncertain_outcome rather than scheduling again.",
|
|
206
247
|
"cellsConsidered is allocation-attempt count; inspect campaignScopeSummary before assuming the selected refill campaign/table was included or ready-but-blocked.",
|
|
207
248
|
"Read prefiltered, skipped, and deferred separately: prefiltered ready closed-InMail cells with stale paid-credit facts require refresh_paid_inmail_credits_then_rerun once, then rerun/status.",
|
|
208
249
|
"wait_for_capacity_or_window means report loaded/capped/waiting and do not source or prep more rows; no_ready_cells_continue_refill_prep means return to the refill/prep ladder.",
|
|
@@ -211,6 +252,11 @@
|
|
|
211
252
|
"Do not mark complete or blocked only because awaiting_scheduler_after_ready_buffer persists."
|
|
212
253
|
],
|
|
213
254
|
"transitions": [
|
|
255
|
+
{
|
|
256
|
+
"when": "explicit targetDate and target.globalActionQueue[0] is request-scoped run_scheduler_sweep",
|
|
257
|
+
"action": "execute exactly one request-scoped run_scheduler_sweep, capture its complete receipt, and do not execute a returned next action",
|
|
258
|
+
"to": "target_plan_read"
|
|
259
|
+
},
|
|
214
260
|
{
|
|
215
261
|
"when": "projected coverage fills target",
|
|
216
262
|
"to": "completion_or_blocker"
|
|
@@ -243,6 +289,7 @@
|
|
|
243
289
|
"start_campaign_message_preparation",
|
|
244
290
|
"same_source_copy",
|
|
245
291
|
"bounded_generated_message_approval",
|
|
292
|
+
"run_scheduler_sweep",
|
|
246
293
|
"wait_for_scheduler"
|
|
247
294
|
],
|
|
248
295
|
"neverAutoExecute": [
|
|
@@ -271,11 +318,26 @@
|
|
|
271
318
|
"verification": {
|
|
272
319
|
"requiredProof": [
|
|
273
320
|
"final get_refill_target_plan",
|
|
321
|
+
"get_campaign_refill_state for selected campaign/table facts",
|
|
322
|
+
"get_scheduler_fill_capacity for the exact sender/action/date",
|
|
323
|
+
"run_scheduler_sweep status or receipt for any executed sweep",
|
|
274
324
|
"projected coverage sent + scheduled",
|
|
275
325
|
"scheduler-owned cells with non-null scheduledFor when claiming scheduled",
|
|
276
326
|
"paid-InMail freshness status clean before scheduler wait",
|
|
277
327
|
"refresh receipt for each refreshed sender"
|
|
278
328
|
],
|
|
329
|
+
"forbiddenProof": [
|
|
330
|
+
"individual cell ids",
|
|
331
|
+
"Prisma",
|
|
332
|
+
"SQL",
|
|
333
|
+
"direct database access",
|
|
334
|
+
"production-environment scripts"
|
|
335
|
+
],
|
|
336
|
+
"completionRules": [
|
|
337
|
+
"Report already sent actions separately from future scheduled actions.",
|
|
338
|
+
"Only scheduler-owned future scheduled actions count as scheduled coverage.",
|
|
339
|
+
"Prepared, approved, and ready rows remain intermediate evidence."
|
|
340
|
+
],
|
|
279
341
|
"notCompletionProof": [
|
|
280
342
|
"prepared rows alone",
|
|
281
343
|
"approved rows alone",
|