gtm-now 0.7.1 → 0.7.3

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
@@ -8742,10 +8742,30 @@ var init_bettercontact = __esm({
8742
8742
 
8743
8743
  // src/providers/adapters/disco.ts
8744
8744
  function mapSeniority(values) {
8745
- if (!values || values.length === 0) return void 0;
8745
+ if (!values?.length) return void 0;
8746
8746
  const mapped = values.map((v) => SENIORITY_TO_DISCO[v] ?? v);
8747
8747
  return [...new Set(mapped)];
8748
8748
  }
8749
+ function buildGrowthSignals(data) {
8750
+ if (!data) return void 0;
8751
+ const signals = {
8752
+ quarterly_growth: data.quarterly_growth,
8753
+ growth_trend: data.growth_trend,
8754
+ digital_footprint_score: data.digital_footprint_score,
8755
+ digital_footprint_trend: data.digital_footprint_trend
8756
+ };
8757
+ return Object.values(signals).some((v) => v != null) ? signals : void 0;
8758
+ }
8759
+ function buildEngagementMetrics(data) {
8760
+ if (!data) return void 0;
8761
+ const metrics = {
8762
+ traffic_estimate: data.traffic_estimate,
8763
+ social_presence: data.social_presence,
8764
+ monthly_visitors: data.monthly_visitors,
8765
+ bounce_rate: data.bounce_rate
8766
+ };
8767
+ return Object.values(metrics).some((v) => v != null) ? metrics : void 0;
8768
+ }
8749
8769
  function parseName(fullName) {
8750
8770
  const parts = fullName.trim().split(/\s+/);
8751
8771
  if (parts.length === 0) return { first: "", last: "" };
@@ -8859,7 +8879,9 @@ var init_disco = __esm({
8859
8879
  country: c.address?.country,
8860
8880
  linkedin_url: c.social_urls?.find((u) => u.includes("linkedin")),
8861
8881
  score: c.score,
8862
- tech_stack: c.keywords ? Object.keys(c.keywords) : void 0,
8882
+ tech_stack: void 0,
8883
+ // Discovery doesn't have vendor data; keywords are not tech_stack
8884
+ keywords: c.keywords ? Object.keys(c.keywords) : void 0,
8863
8885
  sources: [this.name]
8864
8886
  }));
8865
8887
  }
@@ -8889,9 +8911,8 @@ var init_disco = __esm({
8889
8911
  const growthData = growth.status === "fulfilled" ? growth.value : void 0;
8890
8912
  const vendorsData = vendors.status === "fulfilled" ? vendors.value : void 0;
8891
8913
  const metricsData = metrics.status === "fulfilled" ? metrics.value : void 0;
8892
- const keywordTech = data.keywords ? Object.keys(data.keywords) : [];
8893
8914
  const vendorTech = vendorsData?.vendors?.map((v) => v.name) ?? [];
8894
- const mergedTech = [.../* @__PURE__ */ new Set([...keywordTech, ...vendorTech])];
8915
+ const keywordList = data.keywords ? Object.keys(data.keywords) : [];
8895
8916
  return {
8896
8917
  domain: data.domain,
8897
8918
  name: data.name,
@@ -8900,15 +8921,10 @@ var init_disco = __esm({
8900
8921
  employees: data.employees ? parseInt(data.employees, 10) || void 0 : void 0,
8901
8922
  country: data.address?.country,
8902
8923
  linkedin_url: data.social_urls?.find((u) => u.includes("linkedin")),
8903
- tech_stack: mergedTech.length > 0 ? mergedTech : void 0,
8904
- growth_signals: growthData ? {
8905
- quarterly_growth: growthData.quarterly_growth,
8906
- digital_footprint_trend: growthData.digital_footprint_trend
8907
- } : void 0,
8908
- engagement_metrics: metricsData ? {
8909
- traffic_estimate: metricsData.traffic_estimate,
8910
- social_presence: metricsData.social_presence
8911
- } : void 0,
8924
+ tech_stack: vendorTech.length > 0 ? vendorTech : void 0,
8925
+ keywords: keywordList.length > 0 ? keywordList : void 0,
8926
+ growth_signals: buildGrowthSignals(growthData),
8927
+ engagement_metrics: buildEngagementMetrics(metricsData),
8912
8928
  sources: [this.name]
8913
8929
  };
8914
8930
  } catch (error) {
@@ -8959,6 +8975,7 @@ var init_disco = __esm({
8959
8975
  skills: c.skills,
8960
8976
  connections: c.connections,
8961
8977
  location: c.country,
8978
+ industry: Array.isArray(c.industry) ? c.industry[0] : c.industry,
8962
8979
  sources: [this.name]
8963
8980
  };
8964
8981
  });
@@ -9024,11 +9041,7 @@ var init_disco = __esm({
9024
9041
  function mapSeniority2(values) {
9025
9042
  if (!values?.length) return void 0;
9026
9043
  const mapped = values.map((v) => SENIORITY_TO_PROSPEO[v] ?? v);
9027
- return [...new Set(mapped)];
9028
- }
9029
- function mapHeadcountCustom(min, max) {
9030
- if (min == null && max == null) return void 0;
9031
- return { ...min != null && { min }, ...max != null && { max } };
9044
+ return { include: [...new Set(mapped)] };
9032
9045
  }
9033
9046
  var SENIORITY_TO_PROSPEO, ProspeoMcpAdapter;
9034
9047
  var init_prospeo2 = __esm({
@@ -9052,7 +9065,7 @@ var init_prospeo2 = __esm({
9052
9065
  ProspeoMcpAdapter = class {
9053
9066
  name = "prospeo";
9054
9067
  capabilities = ["find_people", "enrich_email"];
9055
- notes = "Best for: city-level people search with industry/seniority/department/headcount filters, email enrichment, company technology detection, funding data. 200M+ contacts.";
9068
+ notes = "Best for: city-level people search with industry/seniority/headcount filters, email enrichment, company technology detection, funding data. 200M+ contacts.";
9056
9069
  client;
9057
9070
  constructor(apiKey) {
9058
9071
  this.client = new ProspeoClient({ apiKey });
@@ -9081,40 +9094,51 @@ var init_prospeo2 = __esm({
9081
9094
  // ─── PeopleFinder ────────────────────────────────────────
9082
9095
  async findPeople(query) {
9083
9096
  const filters = {};
9084
- if (query.job_title) filters.person_job_title = query.job_title;
9085
- if (query.seniority) filters.person_seniority = mapSeniority2(query.seniority);
9086
- if (query.department?.length) filters.person_department = query.department[0];
9087
- if (query.location) filters.person_location_search = query.location;
9097
+ if (query.job_title) {
9098
+ filters.person_job_title = { include: [query.job_title] };
9099
+ }
9100
+ if (query.seniority) {
9101
+ filters.person_seniority = mapSeniority2(query.seniority);
9102
+ }
9103
+ if (query.department?.length) {
9104
+ filters.person_department = query.department[0];
9105
+ }
9106
+ if (query.location) {
9107
+ filters.person_location_search = { include: [query.location] };
9108
+ }
9088
9109
  if (query.company_domain) filters.company = query.company_domain;
9089
9110
  if (query.company_domains?.length) filters.company = query.company_domains[0];
9090
- if (query.company_name) filters.company = query.company_name;
9111
+ if (query.company_name && !query.company_domain && !query.company_domains?.length) {
9112
+ filters.company = query.company_name;
9113
+ }
9091
9114
  if (query.filter_industry?.length) {
9092
9115
  filters.company_industry = { include: query.filter_industry };
9093
9116
  }
9094
9117
  if (query.min_employees != null || query.max_employees != null) {
9095
- filters.company_headcount_custom = mapHeadcountCustom(
9096
- query.min_employees,
9097
- query.max_employees
9098
- );
9118
+ filters.company_headcount_custom = {
9119
+ ...query.min_employees != null && { min: query.min_employees },
9120
+ ...query.max_employees != null && { max: query.max_employees }
9121
+ };
9099
9122
  }
9100
9123
  if (query.skills?.length) {
9101
9124
  filters.company_keywords = { include: query.skills };
9102
9125
  }
9103
9126
  const page = query.offset ? Math.floor(query.offset / (query.limit ?? 25)) + 1 : 1;
9104
9127
  const response = await this.client.searchPeople({ page, filters });
9105
- if (response.error || !response.data?.length) return [];
9106
- return response.data.map((r) => ({
9128
+ if (response.error || !response.results?.length) return [];
9129
+ return response.results.map((r) => ({
9107
9130
  first_name: r.person?.first_name ?? "",
9108
9131
  last_name: r.person?.last_name ?? "",
9109
- job_title: r.person?.job_title,
9110
- company: r.company?.name,
9111
- company_domain: r.company?.domain,
9112
- email: r.person?.email,
9113
- phone: r.person?.phone,
9114
- linkedin_url: r.person?.linkedin_url,
9115
- seniority: r.person?.seniority,
9116
- department: r.person?.department,
9117
- location: r.person?.location ?? r.company?.location,
9132
+ job_title: r.person?.current_job_title ?? void 0,
9133
+ company: r.company?.name ?? void 0,
9134
+ company_domain: r.company?.domain ?? void 0,
9135
+ // Email is masked until revealed — show what we have
9136
+ email: r.person?.email?.email ?? void 0,
9137
+ phone: r.person?.mobile?.mobile ?? void 0,
9138
+ linkedin_url: r.person?.linkedin_url ?? void 0,
9139
+ seniority: r.person?.job_history?.[0]?.seniority ?? void 0,
9140
+ department: r.person?.job_history?.[0]?.departments?.[0] ?? void 0,
9141
+ location: r.person?.location ? [r.person.location.city, r.person.location.state, r.person.location.country].filter(Boolean).join(", ") : void 0,
9118
9142
  sources: [this.name]
9119
9143
  }));
9120
9144
  }
@@ -9977,11 +10001,21 @@ async function findCompanies(args, ctx) {
9977
10001
  });
9978
10002
  const limit = args.limit ?? 50;
9979
10003
  const offset = args.offset ?? 0;
10004
+ const applied_filters = {};
10005
+ if (query.icp_text) applied_filters.icp_text = query.icp_text;
10006
+ if (query.domain) applied_filters.domain = query.domain;
10007
+ if (query.domains?.length) applied_filters.domains = query.domains;
10008
+ if (query.country) applied_filters.country = query.country;
10009
+ if (query.category) applied_filters.category = query.category;
10010
+ if (query.tech_stack?.length) applied_filters.tech_stack = query.tech_stack;
10011
+ if (query.min_employees != null) applied_filters.min_employees = query.min_employees;
10012
+ if (query.max_employees != null) applied_filters.max_employees = query.max_employees;
9980
10013
  return {
9981
10014
  provider: provider.name,
9982
10015
  count: results.length,
9983
10016
  has_more: results.length >= limit,
9984
10017
  offset,
10018
+ ...Object.keys(applied_filters).length > 0 && { applied_filters },
9985
10019
  companies: slimmedResults
9986
10020
  };
9987
10021
  }
@@ -10029,11 +10063,26 @@ async function findPeople(args, ctx) {
10029
10063
  });
10030
10064
  const limit = args.limit ?? 25;
10031
10065
  const offset = args.offset ?? 0;
10066
+ const applied_filters = {};
10067
+ if (query.job_title) applied_filters.job_title = query.job_title;
10068
+ if (query.company_name) applied_filters.company_name = query.company_name;
10069
+ if (query.company_domain) applied_filters.company_domain = query.company_domain;
10070
+ if (query.company_domains?.length) applied_filters.company_domains = query.company_domains;
10071
+ if (query.seniority?.length) applied_filters.seniority = query.seniority;
10072
+ if (query.department?.length) applied_filters.department = query.department;
10073
+ if (query.filter_industry?.length) applied_filters.filter_industry = query.filter_industry;
10074
+ if (query.skills?.length) applied_filters.skills = query.skills;
10075
+ if (query.location) applied_filters.location = query.location;
10076
+ if (query.email_validated) applied_filters.email_validated = query.email_validated;
10077
+ if (query.min_employees != null) applied_filters.min_employees = query.min_employees;
10078
+ if (query.max_employees != null) applied_filters.max_employees = query.max_employees;
10079
+ if (query.revenue_range) applied_filters.revenue_range = query.revenue_range;
10032
10080
  return {
10033
10081
  provider: provider.name,
10034
10082
  count: dedupedResults.length,
10035
10083
  has_more: dedupedResults.length >= limit,
10036
10084
  offset,
10085
+ ...Object.keys(applied_filters).length > 0 && { applied_filters },
10037
10086
  people: slimmedResults
10038
10087
  };
10039
10088
  }
@@ -12020,7 +12069,21 @@ var init_validation = __esm({
12020
12069
  company_domain: z2.string().optional(),
12021
12070
  location: z2.string().optional(),
12022
12071
  limit: z2.number().int().min(1).max(1e3).optional(),
12023
- seniority: z2.array(z2.string()).optional(),
12072
+ seniority: z2.array(
12073
+ z2.enum([
12074
+ "owner",
12075
+ "founder",
12076
+ "c_suite",
12077
+ "partner",
12078
+ "vp",
12079
+ "head",
12080
+ "director",
12081
+ "manager",
12082
+ "senior",
12083
+ "entry",
12084
+ "intern"
12085
+ ])
12086
+ ).optional(),
12024
12087
  department: z2.array(z2.string()).optional(),
12025
12088
  has_email: z2.boolean().optional(),
12026
12089
  has_phone: z2.boolean().optional(),
@@ -12037,7 +12100,12 @@ var init_validation = __esm({
12037
12100
  max_employees: z2.number().int().min(1).optional(),
12038
12101
  revenue_range: z2.string().optional(),
12039
12102
  fields: z2.union([z2.literal("all"), z2.array(z2.string())]).optional()
12040
- }),
12103
+ }).refine(
12104
+ (data) => !!(data.job_title || data.company_name || data.company_domain || data.company_domains && data.company_domains.length > 0 || data.seniority && data.seniority.length > 0 || data.filter_industry && data.filter_industry.length > 0 || data.skills && data.skills.length > 0 || data.location),
12105
+ {
12106
+ message: "At least one search filter required (job_title, company_name, company_domain, company_domains, seniority, filter_industry, skills, or location)"
12107
+ }
12108
+ ),
12041
12109
  // StorLeads — DTC/e-commerce company search
12042
12110
  gtm_storeleads: z2.object({
12043
12111
  search: z2.string().optional(),