gtm-now 0.5.4 → 0.7.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.
package/dist/index.js CHANGED
@@ -928,61 +928,10 @@ var init_leadmagic = __esm({
928
928
  });
929
929
 
930
930
  // ../integrations/dist/enrichment/adapters/prospeo.js
931
- var ProspeoAdapter;
932
931
  var init_prospeo = __esm({
933
932
  "../integrations/dist/enrichment/adapters/prospeo.js"() {
934
933
  "use strict";
935
934
  init_dist();
936
- ProspeoAdapter = class {
937
- name = "prospeo";
938
- apiKey;
939
- constructor(apiKey) {
940
- this.apiKey = apiKey;
941
- }
942
- isConfigured() {
943
- return this.apiKey.length > 0;
944
- }
945
- async findEmail(params) {
946
- const domain = params.domain ?? `${params.company.toLowerCase().replace(/[^a-z0-9]/g, "")}.com`;
947
- if (!params.firstName || !params.lastName || !domain)
948
- return null;
949
- const controller = new AbortController();
950
- const timeout = setTimeout(() => controller.abort(), 15e3);
951
- try {
952
- const res = await fetch("https://api.prospeo.io/enrich-person", {
953
- method: "POST",
954
- headers: {
955
- "Content-Type": "application/json",
956
- "X-KEY": this.apiKey
957
- },
958
- body: JSON.stringify({
959
- only_verified_email: true,
960
- data: {
961
- first_name: params.firstName,
962
- last_name: params.lastName,
963
- company_website: domain,
964
- ...params.linkedinUrl ? { linkedin_url: params.linkedinUrl } : {}
965
- }
966
- }),
967
- signal: controller.signal
968
- });
969
- if (!res.ok) {
970
- logError("Prospeo:findEmail", new Error(`HTTP ${res.status}`), { domain });
971
- return null;
972
- }
973
- const data = await res.json();
974
- if (data.error || !data.person?.email?.email)
975
- return null;
976
- return {
977
- email: data.person.email.email,
978
- confidence: data.person.email.status === "verified" ? 95 : 70,
979
- provider: "prospeo"
980
- };
981
- } finally {
982
- clearTimeout(timeout);
983
- }
984
- }
985
- };
986
935
  }
987
936
  });
988
937
 
@@ -8098,9 +8047,70 @@ var init_client11 = __esm({
8098
8047
  }
8099
8048
  });
8100
8049
 
8050
+ // ../integrations/dist/prospeo/client.js
8051
+ var ProspeoClient;
8052
+ var init_client12 = __esm({
8053
+ "../integrations/dist/prospeo/client.js"() {
8054
+ "use strict";
8055
+ init_base_client();
8056
+ ProspeoClient = class extends BaseApiClient {
8057
+ constructor(config) {
8058
+ super({
8059
+ name: "Prospeo",
8060
+ baseUrl: config.baseUrl ?? "https://api.prospeo.io",
8061
+ headers: { "X-KEY": config.apiKey },
8062
+ timeoutMs: config.timeoutMs
8063
+ });
8064
+ }
8065
+ // ─── People Search ──────────────────────────────────────
8066
+ async searchPeople(query) {
8067
+ return this.request("/search-person", {
8068
+ method: "POST",
8069
+ body: JSON.stringify({
8070
+ query: {
8071
+ ...query.job_title?.length && { job_title: query.job_title },
8072
+ ...query.seniority?.length && { seniority: query.seniority },
8073
+ ...query.department?.length && { department: query.department },
8074
+ ...query.location?.length && { location: query.location },
8075
+ ...query.company_name && { company_name: query.company_name },
8076
+ ...query.company_domain && { company_domain: query.company_domain },
8077
+ ...query.industry?.length && { industry: query.industry },
8078
+ ...query.company_size?.length && { company_size: query.company_size },
8079
+ ...query.keywords?.length && { keywords: query.keywords }
8080
+ },
8081
+ limit: query.limit ?? 25,
8082
+ offset: query.offset ?? 0
8083
+ })
8084
+ });
8085
+ }
8086
+ // ─── Person Enrichment ──────────────────────────────────
8087
+ async enrichPerson(params) {
8088
+ return this.request("/enrich-person", {
8089
+ method: "POST",
8090
+ body: JSON.stringify({
8091
+ only_verified_email: true,
8092
+ data: {
8093
+ first_name: params.first_name,
8094
+ last_name: params.last_name,
8095
+ ...params.company_website && { company_website: params.company_website },
8096
+ ...params.linkedin_url && { linkedin_url: params.linkedin_url }
8097
+ }
8098
+ })
8099
+ });
8100
+ }
8101
+ // ─── Account Info ───────────────────────────────────────
8102
+ async getAccountInfo() {
8103
+ return this.request("/account-information", {
8104
+ method: "GET"
8105
+ });
8106
+ }
8107
+ };
8108
+ }
8109
+ });
8110
+
8101
8111
  // ../integrations/dist/disco/client.js
8102
8112
  var DiscoClient;
8103
- var init_client12 = __esm({
8113
+ var init_client13 = __esm({
8104
8114
  "../integrations/dist/disco/client.js"() {
8105
8115
  "use strict";
8106
8116
  init_base_client();
@@ -8257,7 +8267,7 @@ var init_client12 = __esm({
8257
8267
 
8258
8268
  // ../integrations/dist/apollo/client.js
8259
8269
  var ApolloClient;
8260
- var init_client13 = __esm({
8270
+ var init_client14 = __esm({
8261
8271
  "../integrations/dist/apollo/client.js"() {
8262
8272
  "use strict";
8263
8273
  init_base_client();
@@ -8328,7 +8338,7 @@ var init_client13 = __esm({
8328
8338
 
8329
8339
  // ../integrations/dist/smartlead/client.js
8330
8340
  var MAX_LEADS_PER_REQUEST2, SmartLeadClient;
8331
- var init_client14 = __esm({
8341
+ var init_client15 = __esm({
8332
8342
  "../integrations/dist/smartlead/client.js"() {
8333
8343
  "use strict";
8334
8344
  init_base_client();
@@ -8395,7 +8405,7 @@ var init_client14 = __esm({
8395
8405
  });
8396
8406
 
8397
8407
  // ../integrations/dist/slack/client.js
8398
- var init_client15 = __esm({
8408
+ var init_client16 = __esm({
8399
8409
  "../integrations/dist/slack/client.js"() {
8400
8410
  "use strict";
8401
8411
  init_base_client();
@@ -8403,7 +8413,7 @@ var init_client15 = __esm({
8403
8413
  });
8404
8414
 
8405
8415
  // ../integrations/dist/calcom/client.js
8406
- var init_client16 = __esm({
8416
+ var init_client17 = __esm({
8407
8417
  "../integrations/dist/calcom/client.js"() {
8408
8418
  "use strict";
8409
8419
  init_base_client();
@@ -8411,7 +8421,7 @@ var init_client16 = __esm({
8411
8421
  });
8412
8422
 
8413
8423
  // ../integrations/dist/gemini/client.js
8414
- var init_client17 = __esm({
8424
+ var init_client18 = __esm({
8415
8425
  "../integrations/dist/gemini/client.js"() {
8416
8426
  "use strict";
8417
8427
  init_base_client();
@@ -8419,7 +8429,7 @@ var init_client17 = __esm({
8419
8429
  });
8420
8430
 
8421
8431
  // ../integrations/dist/unipile/client.js
8422
- var init_client18 = __esm({
8432
+ var init_client19 = __esm({
8423
8433
  "../integrations/dist/unipile/client.js"() {
8424
8434
  "use strict";
8425
8435
  init_base_client();
@@ -8427,7 +8437,7 @@ var init_client18 = __esm({
8427
8437
  });
8428
8438
 
8429
8439
  // ../integrations/dist/twilio/client.js
8430
- var init_client19 = __esm({
8440
+ var init_client20 = __esm({
8431
8441
  "../integrations/dist/twilio/client.js"() {
8432
8442
  "use strict";
8433
8443
  init_dist();
@@ -8436,7 +8446,7 @@ var init_client19 = __esm({
8436
8446
  });
8437
8447
 
8438
8448
  // ../integrations/dist/linear/client.js
8439
- var init_client20 = __esm({
8449
+ var init_client21 = __esm({
8440
8450
  "../integrations/dist/linear/client.js"() {
8441
8451
  "use strict";
8442
8452
  init_base_client();
@@ -8444,7 +8454,7 @@ var init_client20 = __esm({
8444
8454
  });
8445
8455
 
8446
8456
  // ../integrations/dist/zapmail/client.js
8447
- var init_client21 = __esm({
8457
+ var init_client22 = __esm({
8448
8458
  "../integrations/dist/zapmail/client.js"() {
8449
8459
  "use strict";
8450
8460
  init_base_client();
@@ -8469,7 +8479,7 @@ var init_factory = __esm({
8469
8479
 
8470
8480
  // ../integrations/dist/harvest/client.js
8471
8481
  var HarvestClient;
8472
- var init_client22 = __esm({
8482
+ var init_client23 = __esm({
8473
8483
  "../integrations/dist/harvest/client.js"() {
8474
8484
  "use strict";
8475
8485
  init_base_client();
@@ -8561,9 +8571,10 @@ var init_dist2 = __esm({
8561
8571
  init_client19();
8562
8572
  init_client20();
8563
8573
  init_client21();
8574
+ init_client22();
8564
8575
  init_parser();
8565
8576
  init_factory();
8566
- init_client22();
8577
+ init_client23();
8567
8578
  }
8568
8579
  });
8569
8580
 
@@ -8752,12 +8763,57 @@ function parseName(fullName) {
8752
8763
  if (parts.length === 1) return { first: parts[0], last: "" };
8753
8764
  return { first: parts[0], last: parts.slice(1).join(" ") };
8754
8765
  }
8766
+ function parseLocation(location) {
8767
+ if (!location) return {};
8768
+ const lower = location.toLowerCase().trim();
8769
+ if (US_STATES[lower]) {
8770
+ return { person_country: "US", person_state: US_STATES[lower] };
8771
+ }
8772
+ if (location.length === 2 && US_STATE_CODES.has(location.toUpperCase())) {
8773
+ return { person_country: "US", person_state: location.toUpperCase() };
8774
+ }
8775
+ const cityStateMatch = location.match(/^(.+),\s*([A-Za-z]{2})$/);
8776
+ if (cityStateMatch && US_STATE_CODES.has(cityStateMatch[2].toUpperCase())) {
8777
+ return { person_country: "US", person_state: cityStateMatch[2].toUpperCase() };
8778
+ }
8779
+ const COUNTRY_MAP = {
8780
+ "united states": "US",
8781
+ usa: "US",
8782
+ "united kingdom": "UK",
8783
+ uk: "UK",
8784
+ germany: "DE",
8785
+ france: "FR",
8786
+ canada: "CA",
8787
+ australia: "AU",
8788
+ india: "IN",
8789
+ brazil: "BR",
8790
+ japan: "JP",
8791
+ "south korea": "KR",
8792
+ spain: "ES",
8793
+ italy: "IT",
8794
+ netherlands: "NL",
8795
+ sweden: "SE",
8796
+ switzerland: "CH",
8797
+ israel: "IL",
8798
+ singapore: "SG",
8799
+ mexico: "MX",
8800
+ ireland: "IE",
8801
+ poland: "PL"
8802
+ };
8803
+ if (COUNTRY_MAP[lower]) {
8804
+ return { person_country: COUNTRY_MAP[lower] };
8805
+ }
8806
+ if (location.length === 2) {
8807
+ return { person_country: location.toUpperCase() };
8808
+ }
8809
+ return { person_country: location };
8810
+ }
8755
8811
  function domainToCompanyName(domain) {
8756
8812
  const slug = domain.split(".")[0] ?? domain;
8757
8813
  const words = slug.replace(/[-_]/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").split(/\s+/).filter(Boolean);
8758
8814
  return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(" ");
8759
8815
  }
8760
- var SENIORITY_TO_DISCO, DiscoAdapter;
8816
+ var SENIORITY_TO_DISCO, DiscoAdapter, US_STATES, US_STATE_CODES;
8761
8817
  var init_disco = __esm({
8762
8818
  "src/providers/adapters/disco.ts"() {
8763
8819
  "use strict";
@@ -8880,7 +8936,7 @@ var init_disco = __esm({
8880
8936
  // Fall back to icp_text when company_name given without company_domain or company_domains
8881
8937
  icp_text: !query.company_domain && !query.company_domains && query.company_name ? query.company_name : void 0,
8882
8938
  title: query.job_title,
8883
- person_country: query.location,
8939
+ ...parseLocation(query.location),
8884
8940
  has_email: query.has_email ?? true,
8885
8941
  max_records: query.limit ?? 25,
8886
8942
  seniority: mapSeniority(query.seniority),
@@ -8919,31 +8975,105 @@ var init_disco = __esm({
8919
8975
  });
8920
8976
  }
8921
8977
  };
8978
+ US_STATES = {
8979
+ alabama: "AL",
8980
+ alaska: "AK",
8981
+ arizona: "AZ",
8982
+ arkansas: "AR",
8983
+ california: "CA",
8984
+ colorado: "CO",
8985
+ connecticut: "CT",
8986
+ delaware: "DE",
8987
+ florida: "FL",
8988
+ georgia: "GA",
8989
+ hawaii: "HI",
8990
+ idaho: "ID",
8991
+ illinois: "IL",
8992
+ indiana: "IN",
8993
+ iowa: "IA",
8994
+ kansas: "KS",
8995
+ kentucky: "KY",
8996
+ louisiana: "LA",
8997
+ maine: "ME",
8998
+ maryland: "MD",
8999
+ massachusetts: "MA",
9000
+ michigan: "MI",
9001
+ minnesota: "MN",
9002
+ mississippi: "MS",
9003
+ missouri: "MO",
9004
+ montana: "MT",
9005
+ nebraska: "NE",
9006
+ nevada: "NV",
9007
+ "new hampshire": "NH",
9008
+ "new jersey": "NJ",
9009
+ "new mexico": "NM",
9010
+ "new york": "NY",
9011
+ "north carolina": "NC",
9012
+ "north dakota": "ND",
9013
+ ohio: "OH",
9014
+ oklahoma: "OK",
9015
+ oregon: "OR",
9016
+ pennsylvania: "PA",
9017
+ "rhode island": "RI",
9018
+ "south carolina": "SC",
9019
+ "south dakota": "SD",
9020
+ tennessee: "TN",
9021
+ texas: "TX",
9022
+ utah: "UT",
9023
+ vermont: "VT",
9024
+ virginia: "VA",
9025
+ washington: "WA",
9026
+ "west virginia": "WV",
9027
+ wisconsin: "WI",
9028
+ wyoming: "WY"
9029
+ };
9030
+ US_STATE_CODES = new Set(Object.values(US_STATES));
8922
9031
  }
8923
9032
  });
8924
9033
 
8925
9034
  // src/providers/adapters/prospeo.ts
8926
- var ProspeoMcpAdapter;
9035
+ function mapSeniorityToProspeo(values) {
9036
+ if (!values || values.length === 0) return void 0;
9037
+ const mapped = values.map((v) => SENIORITY_TO_PROSPEO[v] ?? v);
9038
+ return [...new Set(mapped)];
9039
+ }
9040
+ function mapEmployeeRange(min, max) {
9041
+ if (min == null && max == null) return void 0;
9042
+ const ranges = ["1-10", "11-50", "51-200", "201-500", "501-1000", "1001-5000", "5001+"];
9043
+ return ranges.filter((r) => {
9044
+ const parts = r.replace("+", "").split("-").map(Number);
9045
+ const lo = parts[0] ?? 0;
9046
+ const hi = parts[1] ?? 1e5;
9047
+ return (min == null || hi >= min) && (max == null || lo <= max);
9048
+ });
9049
+ }
9050
+ var SENIORITY_TO_PROSPEO, ProspeoMcpAdapter;
8927
9051
  var init_prospeo2 = __esm({
8928
9052
  "src/providers/adapters/prospeo.ts"() {
8929
9053
  "use strict";
8930
9054
  init_dist();
8931
9055
  init_dist2();
9056
+ SENIORITY_TO_PROSPEO = {
9057
+ c_suite: "c_level",
9058
+ founder: "c_level",
9059
+ owner: "c_level",
9060
+ partner: "c_level",
9061
+ head: "director",
9062
+ senior: "senior",
9063
+ entry: "entry",
9064
+ intern: "entry"
9065
+ };
8932
9066
  ProspeoMcpAdapter = class {
8933
9067
  name = "prospeo";
8934
- capabilities = ["enrich_email"];
8935
- notes = "Best for: email finding from LinkedIn URLs. Good hit rate on LinkedIn-active professionals.";
9068
+ capabilities = ["find_people", "enrich_email"];
9069
+ notes = "Best for: city-level people search, industry filtering, email finding from LinkedIn URLs. Rich enrichment data (phone, title, company details).";
8936
9070
  client;
8937
9071
  constructor(apiKey) {
8938
- this.client = new ProspeoAdapter(apiKey);
9072
+ this.client = new ProspeoClient({ apiKey });
8939
9073
  }
8940
9074
  async checkCredentials() {
8941
9075
  try {
8942
- await this.client.findEmail({
8943
- firstName: "test",
8944
- lastName: "test",
8945
- company: "test.invalid"
8946
- });
9076
+ await this.client.getAccountInfo();
8947
9077
  return true;
8948
9078
  } catch (error) {
8949
9079
  logError(
@@ -8953,20 +9083,62 @@ var init_prospeo2 = __esm({
8953
9083
  return false;
8954
9084
  }
8955
9085
  }
9086
+ async checkCredits() {
9087
+ try {
9088
+ const info = await this.client.getAccountInfo();
9089
+ return {
9090
+ remaining: info.credits,
9091
+ unit: "credits",
9092
+ provider: this.name
9093
+ };
9094
+ } catch (error) {
9095
+ logError("prospeo:checkCredits", error instanceof Error ? error : new Error(String(error)));
9096
+ return null;
9097
+ }
9098
+ }
9099
+ // ─── PeopleFinder ────────────────────────────────────────
9100
+ async findPeople(query) {
9101
+ const response = await this.client.searchPeople({
9102
+ job_title: query.job_title ? [query.job_title] : void 0,
9103
+ seniority: mapSeniorityToProspeo(query.seniority),
9104
+ department: query.department,
9105
+ location: query.location ? [query.location] : void 0,
9106
+ company_name: query.company_name,
9107
+ company_domain: query.company_domain ?? (query.company_domains ? query.company_domains[0] : void 0),
9108
+ industry: query.filter_industry,
9109
+ company_size: mapEmployeeRange(query.min_employees, query.max_employees),
9110
+ limit: query.limit ?? 25,
9111
+ offset: query.offset ?? 0
9112
+ });
9113
+ return response.results.map((p) => ({
9114
+ first_name: p.first_name,
9115
+ last_name: p.last_name,
9116
+ job_title: p.job_title ?? void 0,
9117
+ company: p.company_name ?? void 0,
9118
+ company_domain: p.company_domain ?? void 0,
9119
+ email: p.email ?? void 0,
9120
+ phone: p.phone ?? void 0,
9121
+ linkedin_url: p.linkedin_url ?? void 0,
9122
+ seniority: p.seniority ?? void 0,
9123
+ department: p.department ?? void 0,
9124
+ location: p.location ?? void 0,
9125
+ sources: [this.name]
9126
+ }));
9127
+ }
8956
9128
  // ─── EmailEnricher ──────────────────────────────────────
8957
9129
  async enrichEmail(contact) {
8958
9130
  try {
8959
- const result = await this.client.findEmail({
8960
- firstName: contact.first_name,
8961
- lastName: contact.last_name,
8962
- company: contact.company ?? "",
8963
- domain: contact.company_domain,
8964
- linkedinUrl: contact.linkedin_url
9131
+ const domain = contact.company_domain ?? (contact.company ? `${contact.company.toLowerCase().replace(/[^a-z0-9]/g, "")}.com` : void 0);
9132
+ const response = await this.client.enrichPerson({
9133
+ first_name: contact.first_name,
9134
+ last_name: contact.last_name,
9135
+ company_website: domain,
9136
+ linkedin_url: contact.linkedin_url
8965
9137
  });
8966
- if (!result?.email) return null;
9138
+ if (response.error || !response.person?.email?.email) return null;
8967
9139
  return {
8968
- email: result.email,
8969
- quality: result.confidence ? `${result.confidence}%` : void 0,
9140
+ email: response.person.email.email,
9141
+ quality: response.person.email.status === "verified" ? "95%" : "70%",
8970
9142
  provider: this.name
8971
9143
  };
8972
9144
  } catch (error) {
@@ -9041,6 +9213,16 @@ var init_plusvibe = __esm({
9041
9213
  provider: this.name
9042
9214
  };
9043
9215
  }
9216
+ // ─── Campaign Creation ───────────────────────────────────
9217
+ async createCampaign(name) {
9218
+ const campaign = await this.client.createCampaign({ camp_name: name });
9219
+ return {
9220
+ id: campaign.id,
9221
+ name: campaign.name,
9222
+ status: campaign.status,
9223
+ provider: this.name
9224
+ };
9225
+ }
9044
9226
  };
9045
9227
  }
9046
9228
  });
@@ -10307,6 +10489,16 @@ async function handleCampaign(args, ctx) {
10307
10489
  if (!leads?.length) throw new Error("leads array is required for add_leads action");
10308
10490
  return manager.addLeadsToCampaign(campaignId, leads);
10309
10491
  }
10492
+ case "create": {
10493
+ const name = args.name;
10494
+ if (!name) throw new Error("name is required for create action");
10495
+ if (!manager.createCampaign) {
10496
+ throw new Error(
10497
+ `Provider "${provider.name}" does not support campaign creation. Currently only PlusVibe supports this action.`
10498
+ );
10499
+ }
10500
+ return manager.createCampaign(name);
10501
+ }
10310
10502
  default:
10311
10503
  throw new Error(`Unknown campaign action: ${action}`);
10312
10504
  }
@@ -10510,7 +10702,13 @@ var init_status = __esm({
10510
10702
  capability: "outreach_linkedin",
10511
10703
  setup: "Set GTM_HEYREACH_API_KEY"
10512
10704
  },
10513
- { tool: "gtm_crm", requires: "attio", capability: "crm_read", setup: "Set GTM_ATTIO_API_KEY" }
10705
+ { tool: "gtm_crm", requires: "attio", capability: "crm_read", setup: "Set GTM_ATTIO_API_KEY" },
10706
+ {
10707
+ tool: "gtm_ai",
10708
+ requires: "anthropic or openai",
10709
+ capability: "ai",
10710
+ setup: "Set GTM_ANTHROPIC_API_KEY or GTM_OPENAI_API_KEY"
10711
+ }
10514
10712
  ];
10515
10713
  }
10516
10714
  });
@@ -11184,14 +11382,14 @@ var init_campaign2 = __esm({
11184
11382
  campaignTools = [
11185
11383
  {
11186
11384
  name: "gtm_campaign",
11187
- description: "Manage cold email campaigns. List campaigns, get stats, or add leads to a campaign. Supports PlusVibe, Instantly, and Smartlead providers.",
11385
+ description: "Manage cold email campaigns. List campaigns, get stats, add leads, or create a new campaign. Supports PlusVibe, Instantly, and Smartlead providers.",
11188
11386
  inputSchema: {
11189
11387
  type: "object",
11190
11388
  properties: {
11191
11389
  action: {
11192
11390
  type: "string",
11193
- enum: ["list", "stats", "add_leads"],
11194
- description: "Action to perform: list (all campaigns), stats (campaign metrics), add_leads (push contacts)"
11391
+ enum: ["list", "stats", "add_leads", "create"],
11392
+ description: "Action to perform: list (all campaigns), stats (campaign metrics), add_leads (push contacts), create (new campaign)"
11195
11393
  },
11196
11394
  campaign_id: {
11197
11395
  type: "string",
@@ -11215,6 +11413,10 @@ var init_campaign2 = __esm({
11215
11413
  },
11216
11414
  description: "Leads to add (required for add_leads action)"
11217
11415
  },
11416
+ name: {
11417
+ type: "string",
11418
+ description: "Campaign name (required for create action)"
11419
+ },
11218
11420
  provider: {
11219
11421
  type: "string",
11220
11422
  description: "Provider override (uses first available campaign_email provider if omitted)"
@@ -11929,12 +12131,13 @@ var init_validation = __esm({
11929
12131
  }),
11930
12132
  // 8. Cold email campaign management
11931
12133
  gtm_campaign: z2.object({
11932
- action: z2.enum(["list", "stats", "add_leads"], {
11933
- message: "action must be one of: list, stats, add_leads"
12134
+ action: z2.enum(["list", "stats", "add_leads", "create"], {
12135
+ message: "action must be one of: list, stats, add_leads, create"
11934
12136
  }),
11935
12137
  campaign_id: z2.string().optional(),
11936
12138
  leads: z2.array(campaignLeadSchema).optional(),
11937
- name: z2.string().optional()
12139
+ name: z2.string().optional(),
12140
+ provider: z2.string().optional()
11938
12141
  }),
11939
12142
  // 9. LinkedIn outreach management
11940
12143
  gtm_outreach: z2.object({