@sellable/mcp 0.1.0

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.
Files changed (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,210 @@
1
+ import { getApi } from "../api.js";
2
+ import { getSkillByName, listSkills, stripFrontmatter } from "../skills.js";
3
+ import { markCreateCampaignPromptLoaded, markResearchPromptLoaded, markSenderResearchCompleted, } from "./flow-preflight.js";
4
+ export const promptToolDefinitions = [
5
+ {
6
+ name: "get_message_prompt",
7
+ description: "Get the REPLY framework prompt for crafting LinkedIn messages. Returns the full prompt with 11 quality gates inline. Load this when actively crafting to ensure quality standards.",
8
+ inputSchema: {
9
+ type: "object",
10
+ properties: {},
11
+ required: [],
12
+ },
13
+ },
14
+ {
15
+ name: "list_subskill_prompts",
16
+ description: "List available Sellable subskill prompts with visibility controls. Use this when the host does not expose prompts/list.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ limit: {
21
+ type: "number",
22
+ description: "Max matches to return (default: 25, max: 100)",
23
+ },
24
+ includePublic: {
25
+ type: "boolean",
26
+ description: "Include public skills in results (default: false). Internal skills are included by default.",
27
+ },
28
+ includeInternal: {
29
+ type: "boolean",
30
+ description: "Include internal skills in results (default: true). Set false to return only public skills.",
31
+ },
32
+ },
33
+ required: [],
34
+ additionalProperties: false,
35
+ },
36
+ },
37
+ {
38
+ name: "get_subskill_prompt",
39
+ description: "Load a Sellable subskill prompt by name. Internal subskills are not listed in prompts/list; use search_subskill_prompts when you are unsure of the exact name.",
40
+ inputSchema: {
41
+ type: "object",
42
+ properties: {
43
+ subskillName: {
44
+ type: "string",
45
+ description: "Subskill prompt name (e.g., create-rubric, find-leads)",
46
+ },
47
+ offset: {
48
+ type: "number",
49
+ description: "Optional character offset for chunked prompt reads. Use for very large prompts.",
50
+ },
51
+ limit: {
52
+ type: "number",
53
+ description: "Optional max characters to return for chunked prompt reads. Use a bounded value for very large prompts.",
54
+ },
55
+ },
56
+ required: ["subskillName"],
57
+ additionalProperties: false,
58
+ },
59
+ },
60
+ {
61
+ name: "search_subskill_prompts",
62
+ description: "Search Sellable subskills by name/description. Use this before get_subskill_prompt if you are unsure which prompt to load.",
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {
66
+ query: {
67
+ type: "string",
68
+ description: "Search query (name, task, or keyword)",
69
+ },
70
+ limit: {
71
+ type: "number",
72
+ description: "Max matches to return (default: 5, max: 10)",
73
+ },
74
+ includePublic: {
75
+ type: "boolean",
76
+ description: "Include public skills in results (default: false). Internal skills are included by default.",
77
+ },
78
+ includeInternal: {
79
+ type: "boolean",
80
+ description: "Include internal skills in results (default: true). Set false to search only public skills.",
81
+ },
82
+ },
83
+ required: ["query"],
84
+ additionalProperties: false,
85
+ },
86
+ },
87
+ {
88
+ name: "complete_sender_research",
89
+ description: "Mark sender research as completed for create-campaign preflight. Call this after research-sender synthesis and before create_campaign.",
90
+ inputSchema: {
91
+ type: "object",
92
+ properties: {
93
+ depth: {
94
+ type: "string",
95
+ enum: ["minimal-verification", "deep-proof"],
96
+ description: "Research depth used: minimal verification or deeper proof-focused pass.",
97
+ },
98
+ proofItemsFound: {
99
+ type: "number",
100
+ description: "Count of concrete proof items found (named customers, quantified outcomes, etc.).",
101
+ },
102
+ caseStudyItemsFound: {
103
+ type: "number",
104
+ description: "Count of usable case study items found for messaging/brief context.",
105
+ },
106
+ credibilitySignalsFound: {
107
+ type: "number",
108
+ description: "Count of credibility signals found (reviews, ratings, hiring/funding/press, etc.).",
109
+ },
110
+ notes: {
111
+ type: "string",
112
+ description: "Optional one-line summary of what was verified or still missing.",
113
+ },
114
+ },
115
+ additionalProperties: false,
116
+ },
117
+ },
118
+ ];
119
+ export async function getMessagePrompt() {
120
+ const api = getApi();
121
+ return api.get("/api/v3/prompts/edit-message");
122
+ }
123
+ function filterSubskills(includePublic = false, includeInternal = true) {
124
+ return listSkills().filter((skill) => {
125
+ if (skill.visibility === "public")
126
+ return includePublic;
127
+ if (skill.visibility === "internal")
128
+ return includeInternal;
129
+ return false;
130
+ });
131
+ }
132
+ export function listSubskillPrompts(limit, includePublic, includeInternal) {
133
+ const safeLimit = Math.min(Math.max(limit ?? 25, 1), 100);
134
+ const filtered = filterSubskills(includePublic, includeInternal).sort((a, b) => a.name.localeCompare(b.name));
135
+ return {
136
+ total: filtered.length,
137
+ matches: filtered.slice(0, safeLimit).map((skill) => ({
138
+ name: skill.name,
139
+ description: skill.description,
140
+ visibility: skill.visibility,
141
+ })),
142
+ };
143
+ }
144
+ export function getSubskillPrompt(subskillName, offset, limit) {
145
+ const skill = getSkillByName(subskillName);
146
+ if (!skill) {
147
+ throw new Error(`Unknown subskill prompt: ${subskillName}`);
148
+ }
149
+ if (subskillName === "create-campaign") {
150
+ markCreateCampaignPromptLoaded();
151
+ }
152
+ if (subskillName === "research") {
153
+ markResearchPromptLoaded("generic", "research");
154
+ }
155
+ if (subskillName === "research-sender") {
156
+ markResearchPromptLoaded("sender", "research-sender");
157
+ }
158
+ if (subskillName === "research-prospect") {
159
+ markResearchPromptLoaded("prospect", "research-prospect");
160
+ }
161
+ const fullPrompt = stripFrontmatter(skill.content);
162
+ const safeOffset = Math.min(Math.max(Number.isFinite(offset) ? Math.floor(offset ?? 0) : 0, 0), fullPrompt.length);
163
+ const safeLimit = Number.isFinite(limit) && limit !== undefined
164
+ ? Math.max(Math.floor(limit), 1)
165
+ : null;
166
+ const prompt = safeLimit === null
167
+ ? fullPrompt
168
+ : fullPrompt.slice(safeOffset, safeOffset + safeLimit);
169
+ const nextOffset = safeLimit === null
170
+ ? null
171
+ : Math.min(safeOffset + safeLimit, fullPrompt.length);
172
+ return {
173
+ name: skill.name,
174
+ description: skill.description,
175
+ visibility: skill.visibility,
176
+ prompt,
177
+ promptLength: fullPrompt.length,
178
+ offset: safeOffset,
179
+ limit: safeLimit ?? undefined,
180
+ hasMore: nextOffset !== null && nextOffset < fullPrompt.length,
181
+ nextOffset: nextOffset !== null && nextOffset < fullPrompt.length ? nextOffset : null,
182
+ };
183
+ }
184
+ export function completeSenderResearch(input) {
185
+ return markSenderResearchCompleted(input);
186
+ }
187
+ export function searchSubskillPrompts(query, limit, includePublic, includeInternal) {
188
+ const safeLimit = Math.min(Math.max(limit ?? 5, 1), 10);
189
+ const queryLower = query.trim().toLowerCase();
190
+ const matches = filterSubskills(includePublic, includeInternal)
191
+ .filter((skill) => {
192
+ const name = skill.name.toLowerCase();
193
+ const description = skill.description.toLowerCase();
194
+ return name.includes(queryLower) || description.includes(queryLower);
195
+ })
196
+ .sort((a, b) => {
197
+ const aName = a.name.toLowerCase().includes(queryLower) ? 0 : 1;
198
+ const bName = b.name.toLowerCase().includes(queryLower) ? 0 : 1;
199
+ if (aName !== bName)
200
+ return aName - bName;
201
+ return a.name.localeCompare(b.name);
202
+ })
203
+ .slice(0, safeLimit)
204
+ .map((skill) => ({
205
+ name: skill.name,
206
+ description: skill.description,
207
+ visibility: skill.visibility,
208
+ }));
209
+ return { query, matches };
210
+ }
@@ -0,0 +1,21 @@
1
+ export type ProviderId = "apollo" | "sales-nav" | "prospeo" | "signal-discovery";
2
+ export declare function markProviderPromptLoaded(params: {
3
+ provider: ProviderId;
4
+ campaignOfferId?: string | null;
5
+ }): {
6
+ readonly scope: "campaign" | "provider";
7
+ readonly provider: ProviderId;
8
+ readonly campaignOfferId: string | null;
9
+ readonly loadedAt: string;
10
+ };
11
+ export declare function assertProviderPromptLoaded(params: {
12
+ provider: ProviderId;
13
+ campaignOfferId?: string | null;
14
+ }): {
15
+ readonly ok: true;
16
+ readonly provider: ProviderId;
17
+ readonly campaignOfferId: string | null;
18
+ readonly loadedAt: string;
19
+ readonly scope: "campaign" | "provider";
20
+ };
21
+ export declare function resetProviderPromptPreflightState(): void;
@@ -0,0 +1,59 @@
1
+ const providerPromptLoadedState = new Map();
2
+ function scopedKey(provider, campaignOfferId) {
3
+ return `${campaignOfferId ?? "*"}::${provider}`;
4
+ }
5
+ function resolveLoadedState(provider, campaignOfferId) {
6
+ if (campaignOfferId) {
7
+ const campaignScoped = providerPromptLoadedState.get(scopedKey(provider, campaignOfferId));
8
+ if (campaignScoped)
9
+ return campaignScoped;
10
+ }
11
+ const providerScoped = providerPromptLoadedState.get(scopedKey(provider));
12
+ return providerScoped ?? null;
13
+ }
14
+ export function markProviderPromptLoaded(params) {
15
+ const entry = {
16
+ provider: params.provider,
17
+ campaignOfferId: params.campaignOfferId ?? null,
18
+ loadedAt: new Date().toISOString(),
19
+ };
20
+ providerPromptLoadedState.set(scopedKey(params.provider, params.campaignOfferId), entry);
21
+ return {
22
+ ...entry,
23
+ scope: entry.campaignOfferId ? "campaign" : "provider",
24
+ };
25
+ }
26
+ export function assertProviderPromptLoaded(params) {
27
+ const loadedState = resolveLoadedState(params.provider, params.campaignOfferId);
28
+ if (loadedState) {
29
+ return {
30
+ ok: true,
31
+ provider: params.provider,
32
+ campaignOfferId: params.campaignOfferId ?? null,
33
+ loadedAt: loadedState.loadedAt,
34
+ scope: loadedState.campaignOfferId ? "campaign" : "provider",
35
+ };
36
+ }
37
+ const scopeText = params.campaignOfferId
38
+ ? `campaign ${params.campaignOfferId}`
39
+ : "this run";
40
+ const blockingMessage = `Provider prompt preflight missing for ${params.provider} (${scopeText}).`;
41
+ const diagnostics = {
42
+ provider: params.provider,
43
+ campaignOfferId: params.campaignOfferId ?? null,
44
+ safeToProceed: false,
45
+ blockingErrors: [
46
+ `${blockingMessage} Call get_provider_prompt({ provider: "${params.provider}"${params.campaignOfferId
47
+ ? `, campaignOfferId: "${params.campaignOfferId}"`
48
+ : ""} }) before search/import.`,
49
+ ],
50
+ nextStep: `Call get_provider_prompt for ${params.provider}, then retry the provider tool.`,
51
+ };
52
+ const error = new Error(`${diagnostics.blockingErrors[0]} Next step: ${diagnostics.nextStep}`);
53
+ error.diagnostics =
54
+ diagnostics;
55
+ throw error;
56
+ }
57
+ export function resetProviderPromptPreflightState() {
58
+ providerPromptLoadedState.clear();
59
+ }
@@ -0,0 +1,261 @@
1
+ type WaitForCampaignTableReadyInput = {
2
+ campaignId: string;
3
+ timeoutMs?: number;
4
+ intervalMs?: number;
5
+ requireRows?: boolean;
6
+ };
7
+ type WaitForLeadListReadyInput = {
8
+ leadListId?: string;
9
+ campaignOfferId?: string;
10
+ provider?: "apollo" | "sales-nav" | "prospeo" | "signal-discovery" | "csv-linkedin";
11
+ jobId?: string;
12
+ targetLeadCount?: number;
13
+ timeoutMs?: number;
14
+ intervalMs?: number;
15
+ requireRows?: boolean;
16
+ requireComplete?: boolean;
17
+ };
18
+ export declare function resolveWaitTimeout(timeoutMs?: number): {
19
+ requestedTimeoutMs: number;
20
+ effectiveTimeoutMs: number;
21
+ guardApplied: boolean;
22
+ };
23
+ export declare const readinessToolDefinitions: ({
24
+ name: string;
25
+ description: string;
26
+ inputSchema: {
27
+ type: string;
28
+ properties: {
29
+ campaignId: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ timeoutMs: {
34
+ type: string;
35
+ description: string;
36
+ };
37
+ intervalMs: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ requireRows: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ leadListId?: undefined;
46
+ campaignOfferId?: undefined;
47
+ provider?: undefined;
48
+ jobId?: undefined;
49
+ targetLeadCount?: undefined;
50
+ requireComplete?: undefined;
51
+ };
52
+ required: string[];
53
+ additionalProperties: boolean;
54
+ };
55
+ } | {
56
+ name: string;
57
+ description: string;
58
+ inputSchema: {
59
+ type: string;
60
+ properties: {
61
+ leadListId: {
62
+ type: string;
63
+ description: string;
64
+ };
65
+ campaignOfferId: {
66
+ type: string;
67
+ description: string;
68
+ };
69
+ provider: {
70
+ type: string;
71
+ description: string;
72
+ };
73
+ jobId: {
74
+ type: string;
75
+ description: string;
76
+ };
77
+ targetLeadCount: {
78
+ type: string;
79
+ description: string;
80
+ };
81
+ timeoutMs: {
82
+ type: string;
83
+ description: string;
84
+ };
85
+ intervalMs: {
86
+ type: string;
87
+ description: string;
88
+ };
89
+ requireRows: {
90
+ type: string;
91
+ description: string;
92
+ };
93
+ requireComplete: {
94
+ type: string;
95
+ description: string;
96
+ };
97
+ campaignId?: undefined;
98
+ };
99
+ required: never[];
100
+ additionalProperties: boolean;
101
+ };
102
+ })[];
103
+ export declare function waitForCampaignTableReady(input: WaitForCampaignTableReadyInput): Promise<{
104
+ ready: boolean;
105
+ reason: string;
106
+ attempts: number;
107
+ elapsedMs: number;
108
+ navigation: {
109
+ campaignId: string;
110
+ computedStep: "campaign-created" | "pick-provider" | "provider-search" | "confirm-lead-list";
111
+ blockedAt: ("campaign-created" | "pick-provider" | "provider-search" | "confirm-lead-list") | null;
112
+ missing: string[];
113
+ expectedHeadlessStep: string | null;
114
+ headlessCurrentStep: string | null;
115
+ uiStep: string | null;
116
+ table: {
117
+ workflowTableId: string | null;
118
+ checked: boolean;
119
+ rowCount: number | null;
120
+ hasRows: boolean | null;
121
+ };
122
+ context: {
123
+ leadSourceType: string | null;
124
+ leadSourceProvider: string | null;
125
+ selectedLeadListId: string | null;
126
+ providerCurrentStep: string | null;
127
+ };
128
+ warnings: string[];
129
+ };
130
+ warning?: undefined;
131
+ } | {
132
+ ready: boolean;
133
+ attempts: number;
134
+ elapsedMs: number;
135
+ navigation: {
136
+ campaignId: string;
137
+ computedStep: "campaign-created" | "pick-provider" | "provider-search" | "confirm-lead-list";
138
+ blockedAt: ("campaign-created" | "pick-provider" | "provider-search" | "confirm-lead-list") | null;
139
+ missing: string[];
140
+ expectedHeadlessStep: string | null;
141
+ headlessCurrentStep: string | null;
142
+ uiStep: string | null;
143
+ table: {
144
+ workflowTableId: string | null;
145
+ checked: boolean;
146
+ rowCount: number | null;
147
+ hasRows: boolean | null;
148
+ };
149
+ context: {
150
+ leadSourceType: string | null;
151
+ leadSourceProvider: string | null;
152
+ selectedLeadListId: string | null;
153
+ providerCurrentStep: string | null;
154
+ };
155
+ warnings: string[];
156
+ };
157
+ reason?: undefined;
158
+ warning?: undefined;
159
+ } | {
160
+ ready: boolean;
161
+ reason: string;
162
+ attempts: number;
163
+ elapsedMs: number;
164
+ navigation: {
165
+ campaignId: string;
166
+ computedStep: "campaign-created" | "pick-provider" | "provider-search" | "confirm-lead-list";
167
+ blockedAt: ("campaign-created" | "pick-provider" | "provider-search" | "confirm-lead-list") | null;
168
+ missing: string[];
169
+ expectedHeadlessStep: string | null;
170
+ headlessCurrentStep: string | null;
171
+ uiStep: string | null;
172
+ table: {
173
+ workflowTableId: string | null;
174
+ checked: boolean;
175
+ rowCount: number | null;
176
+ hasRows: boolean | null;
177
+ };
178
+ context: {
179
+ leadSourceType: string | null;
180
+ leadSourceProvider: string | null;
181
+ selectedLeadListId: string | null;
182
+ providerCurrentStep: string | null;
183
+ };
184
+ warnings: string[];
185
+ } | null;
186
+ warning: string | undefined;
187
+ }>;
188
+ export declare function waitForLeadListReady(input: WaitForLeadListReadyInput): Promise<{
189
+ ready: boolean;
190
+ reason: string;
191
+ attempts: number;
192
+ elapsedMs: number;
193
+ leadListId: null;
194
+ provider?: undefined;
195
+ rowCount?: undefined;
196
+ status?: undefined;
197
+ targetLeadCount?: undefined;
198
+ error?: undefined;
199
+ warning?: undefined;
200
+ } | {
201
+ ready: boolean;
202
+ reason: string;
203
+ leadListId: string;
204
+ provider: "signal-discovery" | "apollo" | "sales-nav" | "prospeo" | "csv-linkedin" | null;
205
+ attempts: number;
206
+ elapsedMs: number;
207
+ rowCount: number;
208
+ status: string;
209
+ targetLeadCount: number | undefined;
210
+ error?: undefined;
211
+ warning?: undefined;
212
+ } | {
213
+ ready: boolean;
214
+ reason: string;
215
+ leadListId: string;
216
+ provider: "signal-discovery" | "apollo" | "sales-nav" | "prospeo" | "csv-linkedin" | null;
217
+ attempts: number;
218
+ elapsedMs: number;
219
+ rowCount: number;
220
+ status: string | null;
221
+ targetLeadCount: number | undefined;
222
+ error: string;
223
+ warning?: undefined;
224
+ } | {
225
+ ready: boolean;
226
+ reason: string;
227
+ leadListId: string;
228
+ provider: "signal-discovery" | "apollo" | "sales-nav" | "prospeo" | "csv-linkedin" | null;
229
+ attempts: number;
230
+ elapsedMs: number;
231
+ rowCount: number;
232
+ status: string;
233
+ targetLeadCount: number | undefined;
234
+ error: string | null;
235
+ warning?: undefined;
236
+ } | {
237
+ ready: boolean;
238
+ leadListId: string;
239
+ provider: "signal-discovery" | "apollo" | "sales-nav" | "prospeo" | "csv-linkedin" | null;
240
+ attempts: number;
241
+ elapsedMs: number;
242
+ rowCount: number;
243
+ status: string | null;
244
+ targetLeadCount: number | null;
245
+ reason?: undefined;
246
+ error?: undefined;
247
+ warning?: undefined;
248
+ } | {
249
+ ready: boolean;
250
+ reason: string;
251
+ leadListId: string;
252
+ provider: "signal-discovery" | "apollo" | "sales-nav" | "prospeo" | "csv-linkedin" | null;
253
+ attempts: number;
254
+ elapsedMs: number;
255
+ rowCount: number | null;
256
+ status: string | undefined;
257
+ targetLeadCount: number | undefined;
258
+ warning: string | undefined;
259
+ error: string | undefined;
260
+ }>;
261
+ export {};