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 +293 -90
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
9072
|
+
this.client = new ProspeoClient({ apiKey });
|
|
8939
9073
|
}
|
|
8940
9074
|
async checkCredentials() {
|
|
8941
9075
|
try {
|
|
8942
|
-
await this.client.
|
|
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
|
|
8960
|
-
|
|
8961
|
-
|
|
8962
|
-
|
|
8963
|
-
|
|
8964
|
-
|
|
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 (!
|
|
9138
|
+
if (response.error || !response.person?.email?.email) return null;
|
|
8967
9139
|
return {
|
|
8968
|
-
email:
|
|
8969
|
-
quality:
|
|
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,
|
|
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({
|