@sellable/mcp 0.1.335 → 0.1.336

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: create-evergreen-campaigns
3
- description: Reconcile a sender team's evergreen campaigns — create-or-reuse the standing campaigns (per-sender post engagers + shared signal/cold lanes) idempotently, and when asked for customer-ready/full setup, complete each customer-visible campaign to paused send review with brief, rows, generated review messages, one approval gate row, and sequence. Never duplicates, never launches.
3
+ description: Reconcile a sender team's evergreen campaign structure — create-or-reuse the standing campaigns (per-sender post engagers + shared fallback lanes) idempotently, with sequences attached and prospect-safe message briefs. Never duplicates, never launches. Schedule-automation friendly ("make sure evergreen campaigns exist for these users").
4
4
  visibility: internal
5
5
  ---
6
6
 
@@ -10,49 +10,21 @@ visibility: internal
10
10
  You are a campaign structure reconciler. Evergreen campaigns are the standing
11
11
  always-on lanes every sender should have. Your job is to make reality match the
12
12
  plan — creating only what is missing, reusing everything that exists, and never
13
- producing duplicates. This skill never launches campaigns; customer-visible
14
- completion stops at paused send review.
13
+ producing duplicates. Reconcile/create-reuse only; this skill never launches campaigns.
15
14
  </role>
16
15
 
17
16
  <inputs>
18
17
  The invoking prompt names the senders ("create evergreen campaigns for csreyes92 and thomas"). Resolve each via `list_senders`.
19
18
 
20
- If the invoking prompt says scheduled, automation, cron, heartbeat, fresh-thread,
21
- run without user input, or similar, run in **automation mode**:
22
-
23
- - Do not ask the user to confirm templates, delivery format, or sample output.
24
- - Reconcile structure and record any template/config polish as `created`,
25
- `reused`, `repaired`, `flagged`, or `blocked`.
26
- - Choose the automation depth from the invoking prompt:
27
- - **Structure-only reconcile** is for heartbeat prompts that only say to
28
- ensure slots exist. It may create/reuse shells and apply metadata repairs,
29
- but it does not create rows, generate messages, approve rows, or attach new
30
- send work.
31
- - **Customer-visible completion** is required when the prompt says full
32
- campaign, customer-ready, send-review-ready, went through
33
- `$sellable:create-campaign`, fill out, approve one, only needs enrich and
34
- approve more, or similar. For every dashboard campaign card in that mode,
35
- mirror the create-campaign completion path: brief -> source rows -> filter
36
- decision -> Message Drafting -> first review batch -> generated messages ->
37
- sender/settings validation -> recommended sequence -> `currentStep:"send"`.
38
- This mode may create/copy bounded rows, generate review messages, approve
39
- exactly one quality-valid route-proof row when needed, and attach the
40
- recommended sequence, but it still must not launch campaigns, schedule
41
- sends, send messages, or spend paid InMail.
42
-
43
- If the invoking prompt explicitly asks for interactive message polish or sample
44
- proof, run in **interactive polish mode** and use the confirmation/sample steps
45
- below.
46
-
47
19
  Default evergreen plan per workspace (override only if the prompt specifies different lanes):
48
20
 
49
21
  1. **`<Sender Name> - Post Engagers`** — one per sender (warm lane, highest priority)
50
- 2. **`<Workspace/Team> - Shared Signal Discovery`** — one shared warm-signal campaign lane across senders
51
- 3. **`<Workspace/Team> - Shared Cold Fallback`** — one shared cold/fallback campaign lane across senders
22
+ 2. **`<Workspace/Team> - Shared Signal Discovery`** — one shared across senders
23
+ 3. **`<Workspace/Team> - Shared Cold Fallback`** — one shared across senders
52
24
  </inputs>
53
25
 
54
26
  <objective>
55
- 1. **Inventory first**: `get_campaigns` + `list_tables` + `get_campaign_waterfall` in the active workspace. Treat `list_tables` and the managed waterfall as authoritative for older managed slots; `get_campaigns` is a recent campaign page and may miss canonical evergreen lanes. Match existing campaigns/tables/waterfall slots to the plan by name (case-insensitive, ignore suffixes like "(Copy)") and stored slot identity. `list_tables.campaignStatus` and `list_tables.dashboardBucket` are part of the identity check: a matching `ARCHIVED` table/campaign is not a plain `REUSE`. If it is the canonical prod slot and the invocation explicitly allows dashboard visibility repair, repair it to `PAUSED`; otherwise mark it `flagged`/`blocked` and do not create a duplicate. A matching non-archived campaign/table/waterfall slot = REUSE; record it and move on. Never create a second campaign for a slot that already has one in any of those inventories.
27
+ 1. **Inventory first**: `get_campaigns` + `list_tables` in the active workspace. Match existing campaigns to the plan by name (case-insensitive, ignore suffixes like "(Copy)"). A matching non-archived campaign = REUSE; record it and move on. Never create a second campaign for a slot that already has one.
56
28
  2. **Create only the missing slots** with `create_on_demand_campaign({ name, senderIds, campaignBrief })`:
57
29
  - Post Engagers lanes: that sender's ID only. Shared lanes: all the senders' IDs.
58
30
  - The brief must include the warm post-engager first-message template style — short, casual, references the post they engaged with, closed question, **no internal vocabulary, no pitch, no meeting ask** in message one:
@@ -70,76 +42,24 @@ Default evergreen plan per workspace (override only if the prompt specifies diff
70
42
  - **InMail lanes can never be multiline**: an InMail is one message and the recipient must reply before anything else can be sent. InMail-bound templates must read as one cohesive message — declare `Delivery format: single message (InMail — no follow-up until reply)` and never structure the copy to depend on multi-message pacing.
71
43
 
72
44
  - The sequence is auto-selected by sender tier; do not hand-author sequence templates here. Never select a paid-InMail template.
73
- 3. **Customer-Visible Completion Contract**: a named evergreen lane that appears
74
- as a campaign card or campaign-backed table is not done when the shell exists.
75
- It is done only when the customer can open the campaign and land on final
76
- send review with all setup state present:
77
- - `currentStep:"send"`.
78
- - The linked workflow table has `campaignStatus:"PAUSED"`; `ACTIVE` means
79
- already launched and must be reported separately, and `ARCHIVED` must be
80
- repaired only when the prompt explicitly allows dashboard visibility repair.
81
- - A full campaign brief exists, including delivery format, token rules,
82
- hard avoids, source-use rules, and the approved first-message template.
83
- - A source/list decision has been resolved and campaign rows are loaded. If
84
- there is no approved source or no rows can be copied, report `blocked` with
85
- the missing source detail; do not call the campaign complete.
86
- - The filter step is resolved: either saved/applied filters are present, or
87
- the campaign explicitly skipped filters. Do not leave customer-visible
88
- campaigns at `filter-choice`, `filter-rules`, or `apply-icp-rubric` and
89
- report success.
90
- - Message Drafting has run from the current campaign/table basis, using the
91
- create-campaign message prompt/assets and validation gate. Updating
92
- `currentStep:"messages"` is not proof. Parent-thread handwritten copy is
93
- not a substitute.
94
- - The first review batch exists and at least 3 review rows have generated
95
- messages from the approved brief. If fewer than 3 usable rows exist, report
96
- the actual count and why.
97
- - At least one generated row is approved as a route-proof gate. If zero rows
98
- are approved and the prompt explicitly asked for full/customer-ready
99
- completion, approve exactly one quality-valid generated row. If one or more
100
- rows are already approved, do not add more approvals during evergreen
101
- completion. Never broad approve all rows.
102
- - The recommended non-paid sequence is attached, and the watched campaign is
103
- on Send. Use `attach_recommended_sequence({ campaignId, currentStep:"send" })`
104
- when a safe attach is needed. Existing sequence proof may come from
105
- `SEQUENCE_EXISTS`; do not replace it without explicit user confirmation.
106
- - No scheduled, queued outbound, sent outbound, campaign launch, or paid
107
- InMail spend is created by this skill.
108
- 4. **Verify each slot** after create/reuse/repair:
109
- - `get_campaign` shows the campaign exists, remains unlaunched, and has the expected workflow table.
110
- - 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.
111
- - Send/action lanes such as Post Engagers have a sequence attached. Use `list_tables({ hasSequence: true })` as a quick cross-check, but do not treat that filter as the only proof. If the canonical campaign/table is missing from the sequence-filtered table list but a safe `attach_recommended_sequence({ campaignId })` repair/precheck returns `SEQUENCE_EXISTS`, record `sequence attached (verified by SEQUENCE_EXISTS precheck; list_tables.hasSequence mismatch)` and do not retry.
112
- - Only use `attach_recommended_sequence({ campaignId })` for a send-lane sequence repair/precheck when the target is a canonical prod slot and the invoking prompt allows sequence repair. Call it at most once without `confirmed`; a successful response is `repaired`, and `SEQUENCE_EXISTS` is non-mutating proof that a sequence already exists. Never call `attach_recommended_sequence` or `attach_sequence` with `confirmed:true` in evergreen automation unless the user explicitly asks to replace an existing sequence.
113
- - Do not report `source-only/no sequence expected` for any named evergreen
114
- campaign that appears in Campaigns, has a CampaignOffer ID, or is backed by
115
- a campaign dashboard table. Shared Signal Discovery and Shared Cold
116
- Fallback campaign cards are still customer-visible campaigns and must
117
- satisfy the Customer-Visible Completion Contract when the prompt asks for
118
- full/customer-ready completion.
119
- - Source-only shared lanes are allowed only for explicitly internal waterfall
120
- inventory objects that are not represented as campaign cards. For those
121
- internal-only objects, verify the active waterfall linkage, table ID,
122
- source type, and priority, and label them `internal source pool` rather
123
- than treating them as completed campaigns.
124
- - Post Engagers lanes are sender-owned source lanes. The selected/source LinkedIn posts must be authored by that exact sender (for example, Thomas post-engager source posts must visibly be Thomas-authored posts). If selected/source posts include another person or company author, mark the slot `blocked`/`flagged` for source repair; do not scrape/import engagers or report completion until the source is sender-owned. Shared Signal Discovery lanes are the only evergreen lanes allowed to mix authors.
125
- 5. **Interactive polish mode only: confirm the message template with the user — and check it reads chat-native.** Show the exact first-message template each created campaign's brief carries and ask the user to confirm or adjust it before moving on. Because DM copy may send paragraph-by-paragraph (each blank-line block becomes its own message), every paragraph must read like something a human literally typed as a separate chat message:
45
+ 3. **Verify each slot** after create/reuse: `get_campaign` shows the table exists and a sequence is attached (`list_tables({ hasSequence: true })` as a cross-check).
46
+ 4. **Confirm the message template with the user — and check it reads chat-native.** Show the exact first-message template each created campaign's brief carries and ask the user to confirm or adjust it before moving on. Because DM copy may send paragraph-by-paragraph (each blank-line block becomes its own message), every paragraph must read like something a human literally typed as a separate chat message:
126
47
  - **No letter punctuation.** `Hey {{first_name}}` — never `Hey {{first_name}},` (nobody types a trailing comma and hits send). No `Dear`, no sign-offs, no `Best,`.
127
48
  - Each paragraph stands alone as a message — short, lowercase-casual is fine, sentence fragments are fine.
128
49
  - No paragraph should depend on letter formatting (no "As I mentioned above" referencing layout).
129
50
  If the template violates these, propose the chat-native version and ask; on approval, update the brief via `update_campaign_brief` and show the final version.
130
51
 
131
52
  **Also confirm the delivery format and keep config in sync.** Ask the user whether DM lanes should send multiline (paragraph-per-message) or as a single message. Record the answer as the brief's `Delivery format:` line, and when multiline is chosen, set `actionConfig.sendEachParagraphAsMessage: true` on that campaign's `send_dm` column via `update_column` (config edits run no cells and nothing sends from unlaunched campaigns). Never set the paragraph-split flag on InMail columns — the option does not apply to InMail.
132
- 6. **Interactive polish mode only: prove the template on one real row.** For ONE campaign that has at least one lead row (add one via `add_on_demand_leads` if every lane is empty and the user provides/approves a test lead), generate a message for exactly one row (`queue_campaign_cells` with `columnRole: "generateMessage"`, `rowSelector: { type: "reviewBatch", limit: 1 }` or the single row's ID), wait for it, then show the user the generated message next to the template — AND show how it would split if paragraph-per-message sending is enabled (list each paragraph as `msg 1:`, `msg 2:`, …) so the user confirms each one reads like a real typed message. Check alignment: tone, structure, no internal vocabulary, correct token substitution, no letter punctuation. Do NOT approve the row or generate for more rows — one sample only.
133
- 7. **Automation mode template/config audit**: inspect existing send-lane briefs for a `Delivery format:` line and chat-native warm template. If a send lane is missing the line and the prompt allows cleanup, update only the campaign brief metadata with the safest default for that lane (`Delivery format: single message (LinkedIn DM; line breaks remain inside one generated message; no follow-up until reply)`). If cleanup is not allowed, flag it. Do not generate a sample row in automation mode unless the invocation explicitly asks for sample proof. In structure-only automation, do not generate a sample row unless the invocation explicitly asks for sample proof. In customer-visible completion, follow the Customer-Visible Completion Contract instead.
134
- 8. **Report the reconcile plan and result** — every slot tagged `reused`, `created`, `repaired`, `flagged`, or `blocked`, plus template/sample details only when that mode ran:
53
+ 5. **Prove the template on one real row.** For ONE campaign that has at least one lead row (add one via `add_on_demand_leads` if every lane is empty and the user provides/approves a test lead), generate a message for exactly one row (`queue_campaign_cells` with `columnRole: "generateMessage"`, `rowSelector: { type: "reviewBatch", limit: 1 }` or the single row's ID), wait for it, then show the user the generated message next to the template — AND show how it would split if paragraph-per-message sending is enabled (list each paragraph as `msg 1:`, `msg 2:`, …) so the user confirms each one reads like a real typed message. Check alignment: tone, structure, no internal vocabulary, correct token substitution, no letter punctuation. Do NOT approve the row or generate for more rows — one sample only.
54
+ 6. **Report the reconcile plan and result** every slot tagged `reused` or `created`, plus the confirmed template and the sample message:
135
55
 
136
56
  ```
137
57
  Evergreen Reconcile — {date}
138
- • Christian Reyes - Post Engagers: reused (send review ready; 18 rows, 3 generated, 1 approved gate row, sequence attached, paused)
139
- • Thomas Nobbs - Post Engagers: reused (send review ready; 8 rows, 3 generated, 1 approved gate row, sequence attached, paused)
140
- • Sellable.dev - Shared Signal Discovery: repaired (send review ready; 50 rows, 3 generated, 1 approved gate row, sequence attached, paused)
141
- • Sellable.dev - Shared Cold Fallback: created (send review ready; 50 rows, 3 generated, 1 approved gate row, sequence attached, paused)
142
- All campaigns remain unlaunched. Next: enrich/approve more rows when you want more items ready to schedule.
58
+ • Christian Reyes - Post Engagers: reused (18 rows)
59
+ • Thomas Nobbs - Post Engagers: reused (8 rows)
60
+ • Sellable.dev - Shared Signal Discovery: reused
61
+ • Sellable.dev - Shared Cold Fallback: created (empty needs leads)
62
+ All campaigns remain unlaunched. Next: refresh-sender-engagement to supply the warm lanes, then fill-send-horizon.
143
63
  ```
144
64
  </objective>
145
65
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: fill-send-horizon
3
- description: Fill campaigns' next N-day send horizon through product-native enrichment, message prep, exact-row approval, and scheduler-owned scheduling proof. Prepared/generated/approved rows are intermediate only; success requires scheduled workflow cells with scheduledFor assigned by the existing scheduler. Never launches campaigns, never spends paid InMail.
3
+ description: Keep campaigns' send queues full for the next N days — enrich, score, and prepare messages for eligible rows so approved sends are always staged ahead. Schedule-automation friendly ("fill send horizon for these users/campaigns"). Never launches campaigns, never spends paid InMail.
4
4
  visibility: internal
5
5
  ---
6
6
 
7
7
  # Fill Send Horizon
8
8
 
9
9
  <role>
10
- You are a campaign operations agent keeping send queues full. Your job: for each target campaign, make sure the next two working days (or the requested horizon) have actual scheduled workflow-table action cells with `scheduledFor` assigned by the existing scheduler path. Enriched, generated, prepared, approved, or `ready_to_schedule` rows are progress only; they are not completion by themselves. Never launch a campaign or send anything yourself.
10
+ You are a campaign operations agent keeping send queues full. Your job: for each target campaign, make sure the next two working days (or the requested horizon) have prepared, ready-to-send messages staged without ever launching a campaign or sending anything yourself.
11
11
  </role>
12
12
 
13
13
  <inputs>
@@ -23,16 +23,11 @@ Optional inputs: `targetPreparedMessages` (default: leave unset for the adaptive
23
23
  <objective>
24
24
  For each target campaign:
25
25
 
26
- 1. `get_campaign` -> confirm workspace, workflowTableId, campaign status, sender IDs, current stats, and scheduled/ready/approved/prepared counts where the tool exposes them. Skip and report any campaign whose table is ARCHIVED.
27
- 2. If the campaign already has enough scheduled workflow-table action cells with non-null `scheduledFor` for the requested horizon, stop as `already scheduled`.
28
- 3. If there are eligible rows but the horizon is not scheduled, use the product-native fill/prep tools only on the bounded target cohort:
29
- - Prefer `fill_campaign_horizon({ action: "audit" })` then `fill_campaign_horizon({ action: "apply", stateRevision })` when the campaign has a source lead list / Signal Discovery source and needs import plus message prep.
30
- - Use `start_campaign_message_preparation({ campaignId })` when rows already exist and only enrichment/rubric/message prep/approval readiness is needed.
31
- - Omit `maxRowsToCheck` and `batchSize` for the adaptive default unless the invoking prompt sets them.
32
- 4. Poll `get_campaign_message_preparation_status` until the job completes or stops. Read `progress.enrichedRows`, `preparedMessages`, `approvedMessages`, `activeCellCount`, and `stopReason`; never treat `checkedRows` as enriched rows.
33
- 5. After any prep/approval work, re-read campaign/table state. Do not report the horizon as scheduled unless the re-read proves scheduler-owned scheduled cells with non-null `scheduledFor`. If only prepared/approved/ready cells exist, report the exact state as `prepared/approved/ready - awaiting scheduler`, not complete.
34
- 6. If the stop reason is source exhaustion (no more eligible rows), report it as "source thin - needs new leads" and name `refresh-sender-engagement` (for post-engager lanes) or `find-leads` as the refill path. Do not invent leads.
35
- 7. Report per campaign: scheduled count, ready-to-schedule count, prepared count, approved count, remaining horizon gap, and the single next operator action.
26
+ 1. `get_campaign` confirm workspace, workflowTableId, and current stats. Skip and report any campaign whose table is ARCHIVED.
27
+ 2. `start_campaign_message_preparation({ campaignId })` this queues pending Enrich Prospect cells, lets ICP/rubric and Generate Message cascade, and marks prepared rows ready. Omit `maxRowsToCheck` and `batchSize` for the adaptive default unless the invoking prompt sets them.
28
+ 3. Poll `get_campaign_message_preparation_status` until the job completes or stops. Read `progress.enrichedRows`, `preparedMessages`, and `stopReason` never treat `checkedRows` as enriched rows.
29
+ 4. If the stop reason is source exhaustion (no more eligible rows), report it as "source thin needs new leads" and name `refresh-sender-engagement` (for post-engager lanes) or `find-leads` as the refill path. Do not invent leads.
30
+ 5. Report per campaign: prepared count, approved count, what is staged for the horizon, and the single next operator action (usually "approve messages in the UI").
36
31
  </objective>
37
32
 
38
33
  <waterfall>
@@ -59,11 +54,9 @@ thomas waterfall (stored order): Post Engagers 1/4 (source thin) → Shared Sign
59
54
  <safety>
60
55
  - **Never call `start_campaign`, `start_on_demand_campaign`, or `start_direct_campaign`.** Activating a campaign is always an explicit human action outside this skill.
61
56
  - Use `approvalMode: "approve"` ONLY when the invoking prompt explicitly says to auto-approve (e.g. "fill and approve"). Default is `mark_ready` — a human approves in the UI.
62
- - Auto-approval is not scheduling. It can make rows eligible for the scheduler, but only scheduler-owned `scheduledFor` cells count as scheduled completion.
63
57
  - Never use a sender from one workspace for another workspace's campaign. If `get_campaign` shows a workspace mismatch with the active workspace, stop and report.
64
58
  - Paid InMail: never opt a campaign into paid-InMail templates or spend credits. If a campaign's sequence already includes a paid-InMail step, note it in the report but do not alter it.
65
- - Do not write `WorkflowTableCell.scheduledFor` directly. Scheduling must happen through the existing workflow-table scheduler/sweeper path.
66
- - This skill fills readiness and verifies scheduling; the product's sweeper sends only from ACTIVE campaigns, only approved rows, only inside sending hours. Say so in the report so the operator knows nothing went out.
59
+ - This skill prepares; the product's sweeper sends — only from ACTIVE campaigns, only approved rows, only inside sending hours. Say so in the report so the operator knows nothing went out.
67
60
  </safety>
68
61
 
69
62
  <output>
@@ -71,9 +64,9 @@ One compact report:
71
64
 
72
65
  ```
73
66
  Fill Send Horizon — {date}
74
- • {Campaign A}: scheduled {s}/{target} for the horizon ({r} ready, {p} prepared, {a} approved) {state}
67
+ • {Campaign A}: {n} messages prepared ({m} awaiting approval) horizon staged through {date}
75
68
  • {Campaign B}: source thin after {k} prepared — refill via refresh-sender-engagement
76
- Next operator action: {approve messages | wait for scheduler | refresh source | launch separately if you intentionally want sends to go out}
77
- Nothing was sent or launched; campaigns remain in their current status. Prepared/approved/ready rows were not counted as scheduled unless scheduler-owned scheduledFor cells were re-read.
69
+ Next operator action: approve {m} messages in {Campaign A}
70
+ Nothing was sent or launched; campaigns remain in their current status.
78
71
  ```
79
72
  </output>
@@ -1,93 +0,0 @@
1
- type FillCampaignHorizonInput = {
2
- action: "audit" | "apply";
3
- campaignId: string;
4
- tableId?: string;
5
- stateRevision?: string;
6
- excludedPostIds?: string[];
7
- excludedPostUrls?: string[];
8
- excludedAuthorProfileUrls?: string[];
9
- excludedAuthorNames?: string[];
10
- targetPreparedMessages?: number;
11
- maxRowsToCheck?: number;
12
- batchSize?: number;
13
- };
14
- export declare const campaignHorizonFillToolDefinitions: {
15
- name: string;
16
- description: string;
17
- inputSchema: {
18
- type: string;
19
- properties: {
20
- action: {
21
- type: string;
22
- enum: string[];
23
- description: string;
24
- };
25
- campaignId: {
26
- type: string;
27
- description: string;
28
- };
29
- tableId: {
30
- type: string;
31
- description: string;
32
- };
33
- stateRevision: {
34
- type: string;
35
- description: string;
36
- };
37
- excludedPostIds: {
38
- type: string;
39
- items: {
40
- type: string;
41
- };
42
- maxItems: number;
43
- description: string;
44
- };
45
- excludedPostUrls: {
46
- type: string;
47
- items: {
48
- type: string;
49
- };
50
- maxItems: number;
51
- description: string;
52
- };
53
- excludedAuthorProfileUrls: {
54
- type: string;
55
- items: {
56
- type: string;
57
- };
58
- maxItems: number;
59
- description: string;
60
- };
61
- excludedAuthorNames: {
62
- type: string;
63
- items: {
64
- type: string;
65
- };
66
- maxItems: number;
67
- description: string;
68
- };
69
- targetPreparedMessages: {
70
- type: string;
71
- minimum: number;
72
- maximum: number;
73
- description: string;
74
- };
75
- maxRowsToCheck: {
76
- type: string;
77
- minimum: number;
78
- maximum: number;
79
- description: string;
80
- };
81
- batchSize: {
82
- type: string;
83
- minimum: number;
84
- maximum: number;
85
- description: string;
86
- };
87
- };
88
- required: string[];
89
- additionalProperties: boolean;
90
- };
91
- }[];
92
- export declare function fillCampaignHorizon(input: FillCampaignHorizonInput): Promise<unknown>;
93
- export {};
@@ -1,92 +0,0 @@
1
- import { getApi } from "../api.js";
2
- async function postHorizonFill(body) {
3
- const api = getApi();
4
- return api.post("/api/v3/mcp/campaign-horizon-fill", body);
5
- }
6
- export const campaignHorizonFillToolDefinitions = [
7
- {
8
- name: "fill_campaign_horizon",
9
- description: "Audit or apply a bounded CampaignOffer horizon fill from Signal Discovery/source lead-list rows. Use audit first to get stateRevision, then apply with that stateRevision. Apply imports at most 300 eligible non-excluded source rows, starts bounded message preparation in approval mode, skips rows from excluded posts/authors, and does not start, launch, send, or directly write scheduledFor. Prepared/approved rows are intermediate only; report scheduled completion only after re-reading scheduler-owned scheduled cells with non-null scheduledFor.",
10
- inputSchema: {
11
- type: "object",
12
- properties: {
13
- action: {
14
- type: "string",
15
- enum: ["audit", "apply"],
16
- description: 'Use "audit" to inspect counts/receipt without writes. Use "apply" with the audit stateRevision to import/prep.',
17
- },
18
- campaignId: {
19
- type: "string",
20
- description: "CampaignOffer.id for the campaign to fill.",
21
- },
22
- tableId: {
23
- type: "string",
24
- description: "Optional workflow table id. Must match the campaign workflowTableId when provided.",
25
- },
26
- stateRevision: {
27
- type: "string",
28
- description: "Required for apply. Copy from the immediately preceding audit receipt.",
29
- },
30
- excludedPostIds: {
31
- type: "array",
32
- items: { type: "string" },
33
- maxItems: 100,
34
- description: "Exact SignalSearchPost ids to exclude from import/preparation.",
35
- },
36
- excludedPostUrls: {
37
- type: "array",
38
- items: { type: "string" },
39
- maxItems: 100,
40
- description: "Exact LinkedIn post URLs to exclude from import/preparation.",
41
- },
42
- excludedAuthorProfileUrls: {
43
- type: "array",
44
- items: { type: "string" },
45
- maxItems: 100,
46
- description: "Exact LinkedIn author profile URLs whose source rows should be excluded.",
47
- },
48
- excludedAuthorNames: {
49
- type: "array",
50
- items: { type: "string" },
51
- maxItems: 25,
52
- description: "Exact author names to exclude only when they resolve unambiguously inside campaign Signal Discovery posts.",
53
- },
54
- targetPreparedMessages: {
55
- type: "number",
56
- minimum: 1,
57
- maximum: 300,
58
- description: "Prepared/approved message target for the first pass. Backend caps this at 300.",
59
- },
60
- maxRowsToCheck: {
61
- type: "number",
62
- minimum: 1,
63
- maximum: 300,
64
- description: "Hard first-pass row cap. Backend caps import and prep at 300 rows.",
65
- },
66
- batchSize: {
67
- type: "number",
68
- minimum: 1,
69
- maximum: 100,
70
- description: "Preparation batch size. Backend caps newly checked rows at 100 per batch.",
71
- },
72
- },
73
- required: ["action", "campaignId"],
74
- additionalProperties: false,
75
- },
76
- },
77
- ];
78
- export function fillCampaignHorizon(input) {
79
- return postHorizonFill({
80
- action: input.action,
81
- campaignId: input.campaignId,
82
- tableId: input.tableId,
83
- stateRevision: input.stateRevision,
84
- excludedPostIds: input.excludedPostIds,
85
- excludedPostUrls: input.excludedPostUrls,
86
- excludedAuthorProfileUrls: input.excludedAuthorProfileUrls,
87
- excludedAuthorNames: input.excludedAuthorNames,
88
- targetPreparedMessages: input.targetPreparedMessages,
89
- maxRowsToCheck: input.maxRowsToCheck,
90
- batchSize: input.batchSize,
91
- });
92
- }
@@ -1,9 +0,0 @@
1
- {
2
- "parallelMode": "wide",
3
- "agentCount": 6,
4
- "maxToolCallsPerAgent": 2,
5
- "senderMaxAgents": 2,
6
- "senderMaxToolCallsPerAgent": 3,
7
- "progressMode": true,
8
- "debugMode": true
9
- }