@sellable/mcp 0.1.190 → 0.1.191

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.
@@ -27,8 +27,8 @@ Re-cascade runs whenever ALL of the following are true:
27
27
  to continue processing more campaign rows.
28
28
  2. A subsequent check of rubric state shows rows that were pending at
29
29
  first message-generation pass are now passed.
30
- 3. Those newly-passed rows do NOT yet have current-revision generated messages
31
- (`currentRevisionGeneratedMessagesCount` flat relative to pre-cascade).
30
+ 3. Those newly-passed rows do NOT yet have generated messages
31
+ (`messagesCount` flat relative to pre-cascade).
32
32
  4. Step 15 has NOT yet transitioned to `awaiting-user-greenlight`.
33
33
 
34
34
  Before that first generated-message approval, do not run this loop just to wait
@@ -41,31 +41,25 @@ rows graduated.
41
41
  ## Re-Cascade Loop Shape
42
42
 
43
43
  ```text
44
- 1. use selector dry-run only if debugging:
45
- `select_campaign_cells({ columnRole: "generateMessage", rowSelector: { type: "needsGeneratedMessage" } })`
46
- The normal path can skip this and queue directly.
44
+ 1. paginate campaign table (get_rows_minimal, strip carryData) to
45
+ collect rowIds where:
46
+ - rubricStatus = "passed"
47
+ - messageStatus = "pending" OR messagesCount = 0
47
48
 
48
- 2. if selectedCellCount == 0:
49
+ 2. if newlyPassedRowIds.length == 0:
49
50
  proceed to awaiting-user-greenlight
50
51
  EXIT re-cascade loop
51
52
 
52
53
  3. else:
53
- queue_campaign_cells({
54
+ queue_cells({
54
55
  tableId,
55
- columnRole: "generateMessage",
56
- rowSelector: { type: "needsGeneratedMessage" }
56
+ cellIds: newlyPassedGenerateMessageCellIds
57
57
  })
58
58
 
59
- 4. wait_for_campaign_processing({
60
- tableId,
61
- minGeneratedMessages: 1,
62
- templateRevision: "current"
63
- })
64
-
65
- 5. re-check token contract on the cascaded subset (strict mode default)
59
+ 4. re-check token contract on the cascaded subset (strict mode default)
66
60
  — see references/thomas-revision-filters.md + gold-standard-message-patterns.md
67
61
 
68
- 6. go back to step 1 until selectedCellCount == 0
62
+ 5. go back to step 1 until newlyPassedRowIds == 0
69
63
  ```
70
64
 
71
65
  ## Cap
@@ -92,10 +86,9 @@ silently skipped.
92
86
  ## Hard Rules
93
87
 
94
88
  - Generate Message cells do not always auto-cascade on late-passed rows —
95
- Step 15 must explicitly queue `needsGeneratedMessage` cells.
89
+ Step 15 must explicitly queue newly-pending Generate Message cells.
96
90
  - Re-cascade iteration cap = 3. Trip escalates.
97
- - `currentRevisionGeneratedMessagesCount` flat + rubric graduating rows ⇒
98
- re-cascade required.
91
+ - `messagesCount` flat + rubric graduating rows ⇒ re-cascade required.
99
92
  - Token contract enforcement applies per-cascade, not once-for-all.
100
93
  - Re-cascade NEVER re-runs `import_leads`, `check_rubric`, or
101
94
  `enrich_with_prospeo`. Those are Step 13 / Step 14 actions.
@@ -30,8 +30,9 @@ Step 13 — materialize source list + confirm initial campaign slice
30
30
  materialize/reuse approved source with campaignOfferId
31
31
  import_leads(source-list target; SalesNav/Prospeo default ~1000, Signal Discovery default ~1500 engagers)
32
32
  wait_for_lead_list_ready
33
- confirm_lead_list(reviewBatchLimit=15) # compact reviewBatch metadata is stored on the campaign table
33
+ confirm_lead_list(reviewBatchLimit=15)
34
34
  wait_for_campaign_table_ready # campaign table exists
35
+ get_rows_minimal # read initial campaign-table execution slice
35
36
  update_campaign(currentStep=filter-choice)
36
37
 
37
38
  Post-import main thread
@@ -44,17 +45,22 @@ Post-import main thread
44
45
  only then start the initial-slice cascade
45
46
 
46
47
  Step 14 — kick initial-slice cascade + observe campaign rows
47
- queue_campaign_cells(columnRole=enrich, rowSelector=reviewBatch) <-- starts bounded chain
48
- wait_for_campaign_processing(minPassedCount=1)
48
+ queue_cells(cellIds=<first 15 campaign-table execution-slice Enrich Prospect cells only>) <-- starts bounded chain
49
+ wait_for_campaign_table_ready # wait until sample cascade starts returning filter results
50
+ get_rows_minimal # read passesRubric + message cell status per row
51
+ wait_for_rubric_results(minPassedCount=1, includeRows=false)
49
52
  if at least one row passes: update_campaign(currentStep=auto-execute-messaging)
50
53
  compute projectedPass for later reporting / revision decisions
51
- if zero rows pass: diagnose brief-vs-list; if brief: update_campaign_brief + re-queue + wait with changed args
54
+ if zero rows pass: diagnose brief-vs-list; if brief: update_campaign_brief + re-queue + wait
52
55
  (check_rubric / bulk_enrich_with_prospeo are NOT called here —
53
- cascade already did them.)
56
+ cascade already did them. wait_for_rubric_results is OK as a
57
+ read-only observation helper if you need to block until the first
58
+ passing filtered row exists.)
54
59
 
55
60
  Step 15 — observe messaging
56
- queue_campaign_cells(columnRole=generateMessage, rowSelector=needsGeneratedMessage)
57
- wait_for_campaign_processing({ minGeneratedMessages: 1, templateRevision: "current" })
61
+ wait_for_rubric_results({ minPassedCount: 1, minMessagesCount: 1, includeRows: false })
62
+ get_rows_minimal # confirm the first passing generated message exists
63
+ (rare) queue_cells on any pending Generate Message cells
58
64
  token-contract spot check via get_rows
59
65
  update_campaign(currentStep=auto-execute-messaging) with review-ready narration
60
66
  ask the user to approve the generated message before Settings
@@ -93,14 +99,19 @@ Message` column's http_request writes those cells via the cascade.
93
99
  - Do NOT call `check_rubric`, `enrich_with_prospeo`, or
94
100
  `bulk_enrich_with_prospeo` in the tail. Those are direct-API
95
101
  mutation tools that fetch data to the caller without writing to
96
- the workflow table cells. Step 14's `queue_campaign_cells` call
102
+ the workflow table cells. Step 13's `queue_cells` already
97
103
  triggers the column-level enrichment that populates those cells.
98
104
  Running these tools in the tail produces duplicate cost with no
99
105
  cell side effect.
100
- - `wait_for_campaign_processing` is the stats-only observation helper for the
101
- tail. In Step 14 pass `minPassedCount: 1`; in Step 15 pass
102
- `minGeneratedMessages: 1` and `templateRevision: "current"`. Do not repoll
103
- identical args after a timeout.
106
+ - `wait_for_rubric_results` is read-only and OK to use as an
107
+ observation helper when you need to block on rubric completion
108
+ it does not mutate cells. Prefer `get_rows_minimal` +
109
+ `wait_for_campaign_table_ready` for the primary cascade-observation
110
+ path, but use `wait_for_rubric_results({ targetCount: cohortSize })`
111
+ when the table-level wait returns before rubric cells finish. In
112
+ create-campaign-v2 Step 14, pass `minPassedCount: 1`; one passing
113
+ filtered row is enough to start observing Generate Message, even if
114
+ other sample rows are still processing.
104
115
  - `start_campaign` is FORBIDDEN in the autonomous tail. It belongs only
105
116
  in the Claude-greenlight path, AFTER the user signals "start". See
106
117
  `references/final-handoff-contract.md`.
@@ -110,16 +121,15 @@ Message` column's http_request writes those cells via the cascade.
110
121
  - You MAY NOT call `start_campaign` while ANY passing row has an
111
122
  empty `Generate Message` cell. If you discover empty message cells in
112
123
  the greenlight turn, ABORT greenlight and return to Step 15 first.
113
- - You MAY NOT call `attach_sequence` while ANY reviewed passing row has an
114
- empty or stale `Generate Message` cell. Before `attach_sequence`, call
115
- `select_campaign_cells({ tableId, columnRole: "generateMessage",
116
- rowSelector: { type: "needsGeneratedMessage" } })`. If any cells are
117
- selected, call `queue_campaign_cells` with the same selector and wait with
118
- `wait_for_campaign_processing({ minGeneratedMessages: 1,
119
- templateRevision: "current" })`. If rows truly won't message, ESCALATE.
120
- - You MAY NOT advance past Step 14 without calling `queue_campaign_cells` for
121
- `{ columnRole: "enrich", rowSelector: { type: "reviewBatch" } }`. Without it,
122
- every downstream cell stays `pending` and the campaign ships empty.
124
+ - You MAY NOT call `attach_sequence` while ANY passing row has an
125
+ empty `Generate Message` cell. Before `attach_sequence`, call
126
+ `get_rows_minimal` and confirm every row where `passesRubric=true`
127
+ has a `completed` Generate Message cell with non-empty `result`. If
128
+ any are pending, call `queue_cells` on those generateMessageCellIds
129
+ and wait. If rows truly won't message, ESCALATE.
130
+ - You MAY NOT advance past Step 13 without calling `queue_cells` on
131
+ the initial-slice Enrich Prospect cells. Without it, every downstream
132
+ cell stays `pending` and the campaign ships empty.
123
133
  - You MAY NOT queue enrichment for rows outside the configured internal
124
134
  execution slice before the user approves expansion. Full-list enrichment/message
125
135
  generation is a credit-spend decision and must happen after the user
@@ -131,8 +141,9 @@ All subsequent steps read the already-parsed config. Do not re-load mid-run,
131
141
  and do not read repo-local config files; packaged Claude Code and Codex runs
132
142
  must use the MCP asset loader.
133
143
  Load each subskill prompt (`create-campaign-v2`, `research-sender`,
134
- `generate-messages-compact`) at most once per run. If a tool result already told
135
- you to load a prompt, remember it; do not restart the same prompt later.
144
+ `generate-messages`) at most once per run. A multi-call chunk sequence counts
145
+ as one load. If a tool result already told you to load a prompt, load all
146
+ chunks once and remember; do not restart the same prompt from offset 0 later.
136
147
 
137
148
  After every `update_campaign({ currentStep: ... })` in the tail, narrate
138
149
  what changed and orient the user to what the already-open app will show next —
@@ -254,17 +265,16 @@ searchId, targetLeadCount: 1000 })`.
254
265
  the source list and `workflowTableId` is the campaign table.
255
266
  4. `wait_for_campaign_table_ready` until the initial campaign-table execution slice rows are
256
267
  available in the campaign table.
257
- 5. Confirm the compact `reviewBatch` returned by `confirm_lead_list` has the
258
- expected 15-row internal execution slice metadata. Do not fetch row payloads
259
- or queue cells in Step 13.
268
+ 5. Call `get_rows_minimal({ tableId: workflowTableId })` and confirm the
269
+ 15-row internal execution slice is present. Do not queue cells in Step 13.
260
270
  6. If the import returns zero usable leads, ESCALATE per
261
271
  `references/escalation-ladder.md` (hard fail).
262
272
  7. `update_campaign({ campaignId, currentStep: "filter-choice" })`.
263
273
  8. Describe the filter-choice screen now visible in the already-open app. Do not
264
274
  repeat the watch URL.
265
275
 
266
- **Do NOT call `check_rubric`, `wait_for_campaign_processing`,
267
- `queue_campaign_cells`, `enrich_with_prospeo`, or `bulk_enrich_with_prospeo` in Step 13.**
276
+ **Do NOT call `check_rubric`, `wait_for_rubric_results`,
277
+ `queue_cells`, `enrich_with_prospeo`, or `bulk_enrich_with_prospeo` in Step 13.**
268
278
  Those are direct-API tools that fetch enrichment/scoring data to the
269
279
  caller or start the workflow-table cascade too early. The cascade starts in
270
280
  Step 14 only after `save_rubrics` and `update_campaign_brief` have both
@@ -289,16 +299,18 @@ message is ready. It does NOT call `check_rubric`,
289
299
  Shape:
290
300
 
291
301
  ```text
292
- queue_campaign_cells({ tableId: workflowTableId, columnRole: "enrich", rowSelector: { type: "reviewBatch" } })
293
- wait_for_campaign_processing({ tableId: workflowTableId, minPassedCount: 1 })
302
+ queue_cells({ tableId: workflowTableId, cellIds: reviewBatchEnrichCellIds })
303
+ wait_for_campaign_table_ready({ tableId: workflowTableId })
304
+ get_rows_minimal({ tableId: workflowTableId })
305
+ wait_for_rubric_results({ tableId: workflowTableId, targetCount: cohortSize, minPassedCount: 1, includeRows: false })
294
306
  passInSample = count of first sampleSize review/process sample rows with passesRubric === true
295
307
  projectedPass = round(passInSample / sampleSize * importLimit)
296
308
 
297
- if wait_for_campaign_processing.ready === true and passRate.passed >= 1:
309
+ if wait_for_rubric_results.ready === true and passRate.passed >= 1:
298
310
  advance to Step 15 to observe or queue Generate Message for currently passing rows
299
311
  do not wait for every sample row to finish before message generation starts
300
312
  stop for review as soon as one passing generated message is ready
301
- else if wait_for_campaign_processing.ready === false and reason === "timeout":
313
+ else if wait_for_rubric_results.ready === false and reason === "timeout":
302
314
  use the partial passRate/stats as the sample diagnostic
303
315
  if passRate.passed >= 1:
304
316
  advance to Step 15 to observe/queue Generate Message for passing rows
@@ -310,10 +322,9 @@ else if wait_for_campaign_processing.ready === false and reason === "timeout":
310
322
  ask whether to revise source, revise filter/rubric, or wait once only if still processing
311
323
  else:
312
324
  diagnose brief-vs-list per sample-validation-loop.md
313
- - brief: autonomous update_campaign_brief, then re-kick cascade with
314
- queue_campaign_cells({ columnRole: "enrich", rowSelector:
315
- { type: "reviewBatch" }, forceRerun: true }) and wait for the
316
- new results
325
+ - brief: autonomous update_campaign_brief, then re-kick cascade
326
+ (queue_cells on enrichCellIds) and wait for the new
327
+ results
317
328
  - list: ESCALATE (no auto-revision of leads)
318
329
  - unknown: ESCALATE
319
330
  revisionRound += 1
@@ -350,8 +361,8 @@ Entered on `CampaignOffer.currentStep === "auto-execute-messaging"`.
350
361
 
351
362
  **Messages are produced by the `Generate Message` column cascade, not
352
363
  by a separate tool.** Do NOT call a `generate_messages` MCP tool —
353
- that tool does not exist; `generate-messages-compact` is the Message Draft
354
- Builder subskill prompt for the approved template. In the autonomous tail, messages
364
+ that tool does not exist; `generate-messages` is a subskill prompt
365
+ loaded during live messaging drafts. In the autonomous tail, messages
355
366
  flow through the column pipeline: `Enrich Prospect` →
356
367
  `DNC Check` → `ICP Score` → `Passes Rubric` → `Generate Message`.
357
368
  Each column's http_request auto-fires when its upstream dependency
@@ -362,19 +373,21 @@ the output — not to generate messages manually.
362
373
 
363
374
  **What Step 15 does:**
364
375
 
365
- 1. Before queueing or waiting on Generate Message cells, confirm the minted
366
- campaign brief still contains `{{...}}` in `## Approved Message Template`.
367
- If it does not, fail before the cascade runs. Do not repair after mint; the
368
- template must be present during mint so Step 15 never starts in freeform
369
- generation mode.
370
- 2. Use `select_campaign_cells({ tableId, columnRole: "generateMessage",
371
- rowSelector: { type: "needsGeneratedMessage" } })` only if you need a dry-run
372
- count. If any passing row has a pending, empty, or stale Generate Message
373
- cell, queue it explicitly with `queue_campaign_cells({ tableId, columnRole:
374
- "generateMessage", rowSelector: { type: "needsGeneratedMessage" } })`.
375
- 3. `wait_for_campaign_processing({ tableId, minGeneratedMessages: 1,
376
- templateRevision: "current" })` until the first current-revision generated
377
- message is ready. Do not wait for every passing row's
376
+ 1. `get_rows_minimal` to read `passesRubric` + `generateMessageCellId`
377
+ - the Generate Message cell's `status` and `result` per row.
378
+ Before queueing or waiting on Generate Message cells, confirm the
379
+ minted campaign brief still contains `{{...}}` in `## Approved Message
380
+ Template`. If it does not, fail before the cascade runs. Do not repair
381
+ after mint; the template must be present during mint so Step 15 never
382
+ starts in freeform generation mode.
383
+ 2. For every row where `passesRubric === true`:
384
+ - The Generate Message cell should be `running` or `completed`
385
+ already (cascade auto-fired it). If it is still `pending`, queue
386
+ it explicitly: `queue_cells({ tableId, cellIds:
387
+ <generateMessageCellIds> })`.
388
+ 3. `wait_for_rubric_results({ tableId, targetCount: reviewBatchSize,
389
+ minPassedCount: 1, minMessagesCount: 1, includeRows: false })` until the
390
+ first passing generated message is ready. Do not wait for every passing row's
378
391
  Generate Message cell, and do not add "one more wait" for a stronger sample.
379
392
  Remaining review/process sample rows can continue processing in the background.
380
393
  4. Read the first ready generated message back via `get_rows` (full) and
@@ -1,383 +0,0 @@
1
- type ColumnRole = "enrich" | "passesRubric" | "icpScore" | "generateMessage" | "approved";
2
- type RowSelector = {
3
- type: "reviewBatch";
4
- basisHash?: string;
5
- } | {
6
- type: "rowIds";
7
- rowIds: string[];
8
- } | {
9
- type: "passedRows";
10
- limit?: number;
11
- } | {
12
- type: "needsGeneratedMessage";
13
- limit?: number;
14
- } | {
15
- type: "staleGeneratedMessages";
16
- limit?: number;
17
- };
18
- type SchemaInput = {
19
- campaignId?: string;
20
- tableId?: string;
21
- };
22
- type SelectInput = SchemaInput & {
23
- columnRole: ColumnRole;
24
- rowSelector: RowSelector;
25
- limit?: number;
26
- };
27
- type QueueInput = SelectInput & {
28
- forceRerun?: boolean;
29
- reason?: string;
30
- };
31
- type WaitInput = SchemaInput & {
32
- minPassedCount?: number;
33
- minGeneratedMessages?: number;
34
- templateRevision?: "current" | string;
35
- timeoutMs?: number;
36
- intervalMs?: number;
37
- };
38
- type ReviseTemplateInput = SchemaInput & {
39
- campaignId: string;
40
- templateMarkdown?: string;
41
- approvedMessageTemplate?: string;
42
- rowSelector?: RowSelector;
43
- limit?: number;
44
- };
45
- type CampaignProcessingSchemaResponse = {
46
- campaignId: string | null;
47
- tableId: string;
48
- rowCount: number;
49
- currentApprovedBriefHash: string | null;
50
- reviewBatch?: {
51
- rowIds?: string[];
52
- rowCount?: number;
53
- basisHash?: string;
54
- };
55
- warnings?: string[];
56
- };
57
- type WorkflowTableStats = {
58
- tableId: string;
59
- totalRows: number;
60
- messagesCount?: number;
61
- generatedMessagesCount?: number;
62
- currentRevisionGeneratedMessagesCount?: number;
63
- staleGeneratedMessagesCount?: number;
64
- generatedWithoutPassCount?: number;
65
- currentTemplateRevisionHash?: string | null;
66
- processingCount?: number;
67
- queuedCount?: number;
68
- cancellableCount?: number;
69
- failedCount?: number;
70
- needsApprovalCount?: number;
71
- passRate?: {
72
- completed: number;
73
- passed: number;
74
- pending?: number;
75
- };
76
- };
77
- export declare const campaignProcessingToolDefinitions: ({
78
- name: string;
79
- description: string;
80
- inputSchema: {
81
- type: string;
82
- properties: {
83
- campaignId: {
84
- type: string;
85
- };
86
- tableId: {
87
- type: string;
88
- };
89
- columnRole?: undefined;
90
- rowSelector?: undefined;
91
- limit?: undefined;
92
- forceRerun?: undefined;
93
- reason?: undefined;
94
- minPassedCount?: undefined;
95
- minGeneratedMessages?: undefined;
96
- templateRevision?: undefined;
97
- timeoutMs?: undefined;
98
- intervalMs?: undefined;
99
- templateMarkdown?: undefined;
100
- approvedMessageTemplate?: undefined;
101
- };
102
- additionalProperties: boolean;
103
- required?: undefined;
104
- };
105
- } | {
106
- name: string;
107
- description: string;
108
- inputSchema: {
109
- type: string;
110
- properties: {
111
- campaignId: {
112
- type: string;
113
- };
114
- tableId: {
115
- type: string;
116
- };
117
- columnRole: {
118
- type: string;
119
- enum: string[];
120
- };
121
- rowSelector: {
122
- type: string;
123
- properties: {
124
- type: {
125
- type: string;
126
- enum: string[];
127
- };
128
- basisHash: {
129
- type: string;
130
- };
131
- rowIds: {
132
- type: string;
133
- items: {
134
- type: string;
135
- };
136
- };
137
- limit: {
138
- type: string;
139
- };
140
- };
141
- required: string[];
142
- additionalProperties: boolean;
143
- };
144
- limit: {
145
- type: string;
146
- };
147
- forceRerun?: undefined;
148
- reason?: undefined;
149
- minPassedCount?: undefined;
150
- minGeneratedMessages?: undefined;
151
- templateRevision?: undefined;
152
- timeoutMs?: undefined;
153
- intervalMs?: undefined;
154
- templateMarkdown?: undefined;
155
- approvedMessageTemplate?: undefined;
156
- };
157
- required: string[];
158
- additionalProperties: boolean;
159
- };
160
- } | {
161
- name: string;
162
- description: string;
163
- inputSchema: {
164
- type: string;
165
- properties: {
166
- campaignId: {
167
- type: string;
168
- };
169
- tableId: {
170
- type: string;
171
- };
172
- columnRole: {
173
- type: string;
174
- enum: string[];
175
- };
176
- rowSelector: {
177
- type: string;
178
- properties: {
179
- type: {
180
- type: string;
181
- enum: string[];
182
- };
183
- basisHash: {
184
- type: string;
185
- };
186
- rowIds: {
187
- type: string;
188
- items: {
189
- type: string;
190
- };
191
- };
192
- limit: {
193
- type: string;
194
- };
195
- };
196
- required: string[];
197
- additionalProperties: boolean;
198
- };
199
- forceRerun: {
200
- type: string;
201
- };
202
- limit: {
203
- type: string;
204
- };
205
- reason: {
206
- type: string;
207
- };
208
- minPassedCount?: undefined;
209
- minGeneratedMessages?: undefined;
210
- templateRevision?: undefined;
211
- timeoutMs?: undefined;
212
- intervalMs?: undefined;
213
- templateMarkdown?: undefined;
214
- approvedMessageTemplate?: undefined;
215
- };
216
- required: string[];
217
- additionalProperties: boolean;
218
- };
219
- } | {
220
- name: string;
221
- description: string;
222
- inputSchema: {
223
- type: string;
224
- properties: {
225
- campaignId: {
226
- type: string;
227
- };
228
- tableId: {
229
- type: string;
230
- };
231
- minPassedCount: {
232
- type: string;
233
- };
234
- minGeneratedMessages: {
235
- type: string;
236
- };
237
- templateRevision: {
238
- type: string;
239
- description: string;
240
- };
241
- timeoutMs: {
242
- type: string;
243
- };
244
- intervalMs: {
245
- type: string;
246
- };
247
- columnRole?: undefined;
248
- rowSelector?: undefined;
249
- limit?: undefined;
250
- forceRerun?: undefined;
251
- reason?: undefined;
252
- templateMarkdown?: undefined;
253
- approvedMessageTemplate?: undefined;
254
- };
255
- additionalProperties: boolean;
256
- required?: undefined;
257
- };
258
- } | {
259
- name: string;
260
- description: string;
261
- inputSchema: {
262
- type: string;
263
- properties: {
264
- campaignId: {
265
- type: string;
266
- };
267
- tableId: {
268
- type: string;
269
- };
270
- templateMarkdown: {
271
- type: string;
272
- };
273
- approvedMessageTemplate: {
274
- type: string;
275
- };
276
- rowSelector: {
277
- type: string;
278
- properties: {
279
- type: {
280
- type: string;
281
- enum: string[];
282
- };
283
- rowIds: {
284
- type: string;
285
- items: {
286
- type: string;
287
- };
288
- };
289
- limit: {
290
- type: string;
291
- };
292
- basisHash?: undefined;
293
- };
294
- required: string[];
295
- additionalProperties: boolean;
296
- };
297
- limit: {
298
- type: string;
299
- };
300
- columnRole?: undefined;
301
- forceRerun?: undefined;
302
- reason?: undefined;
303
- minPassedCount?: undefined;
304
- minGeneratedMessages?: undefined;
305
- templateRevision?: undefined;
306
- timeoutMs?: undefined;
307
- intervalMs?: undefined;
308
- };
309
- required: string[];
310
- additionalProperties: boolean;
311
- };
312
- })[];
313
- export declare function getCampaignTableSchema(input: SchemaInput): Promise<CampaignProcessingSchemaResponse>;
314
- export declare function selectCampaignCells(input: SelectInput): Promise<unknown>;
315
- export declare function queueCampaignCells(input: QueueInput): Promise<unknown>;
316
- export declare function reviseMessageTemplateAndRerun(input: ReviseTemplateInput): Promise<unknown>;
317
- export declare function waitForCampaignProcessing(input: WaitInput): Promise<{
318
- ready: boolean;
319
- reason: string;
320
- attempts: number;
321
- elapsedMs: number;
322
- tableId: string;
323
- pollKey: string;
324
- requestedTemplateRevision: string;
325
- currentTemplateRevisionHash: string;
326
- guidance: string;
327
- stats: WorkflowTableStats;
328
- floors?: undefined;
329
- result?: undefined;
330
- warning?: undefined;
331
- partialResult?: undefined;
332
- } | {
333
- ready: boolean;
334
- attempts: number;
335
- elapsedMs: number;
336
- tableId: string;
337
- pollKey: string;
338
- floors: {
339
- minPassedCount: number | null;
340
- minGeneratedMessages: number | null;
341
- templateRevision: string | null;
342
- };
343
- result: {
344
- passedCount: number;
345
- generatedMessagesCount: number;
346
- currentRevisionGeneratedMessagesCount: number;
347
- staleGeneratedMessagesCount: number;
348
- generatedWithoutPassCount: number;
349
- currentTemplateRevisionHash: string | null;
350
- };
351
- stats: WorkflowTableStats;
352
- reason?: undefined;
353
- requestedTemplateRevision?: undefined;
354
- currentTemplateRevisionHash?: undefined;
355
- guidance?: undefined;
356
- warning?: undefined;
357
- partialResult?: undefined;
358
- } | {
359
- ready: boolean;
360
- reason: string;
361
- attempts: number;
362
- elapsedMs: number;
363
- tableId: string;
364
- pollKey: string;
365
- warning: string | undefined;
366
- partialResult: {
367
- passedCount: number;
368
- generatedMessagesCount: number;
369
- currentRevisionGeneratedMessagesCount: number;
370
- staleGeneratedMessagesCount: number;
371
- generatedWithoutPassCount: number;
372
- currentTemplateRevisionHash: string | null;
373
- passFloorMet: boolean;
374
- generatedFloorMet: boolean;
375
- };
376
- guidance: string;
377
- stats: WorkflowTableStats | null;
378
- requestedTemplateRevision?: undefined;
379
- currentTemplateRevisionHash?: undefined;
380
- floors?: undefined;
381
- result?: undefined;
382
- }>;
383
- export {};