@coldiq/mcp 0.3.11 → 0.3.13
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/client.d.ts.map +1 -1
- package/dist/client.js +4 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/session-usage.d.ts +59 -0
- package/dist/session-usage.d.ts.map +1 -0
- package/dist/session-usage.js +96 -0
- package/dist/session-usage.js.map +1 -0
- package/dist/tools/enrich-company.d.ts +3 -9
- package/dist/tools/enrich-company.d.ts.map +1 -1
- package/dist/tools/enrich-company.js +3 -16
- package/dist/tools/enrich-company.js.map +1 -1
- package/dist/tools/enrich-person.d.ts +3 -9
- package/dist/tools/enrich-person.d.ts.map +1 -1
- package/dist/tools/enrich-person.js +3 -12
- package/dist/tools/enrich-person.js.map +1 -1
- package/dist/tools/fetch-page-content.d.ts +3 -9
- package/dist/tools/fetch-page-content.d.ts.map +1 -1
- package/dist/tools/fetch-page-content.js +3 -12
- package/dist/tools/fetch-page-content.js.map +1 -1
- package/dist/tools/find-email.d.ts +3 -9
- package/dist/tools/find-email.d.ts.map +1 -1
- package/dist/tools/find-email.js +3 -40
- package/dist/tools/find-email.js.map +1 -1
- package/dist/tools/find-emails.d.ts +3 -4
- package/dist/tools/find-emails.d.ts.map +1 -1
- package/dist/tools/find-emails.js +8 -423
- package/dist/tools/find-emails.js.map +1 -1
- package/dist/tools/find-influencers.d.ts +3 -9
- package/dist/tools/find-influencers.d.ts.map +1 -1
- package/dist/tools/find-influencers.js +3 -12
- package/dist/tools/find-influencers.js.map +1 -1
- package/dist/tools/find-people.d.ts +3 -8
- package/dist/tools/find-people.d.ts.map +1 -1
- package/dist/tools/find-people.js +3 -98
- package/dist/tools/find-people.js.map +1 -1
- package/dist/tools/find-phone.d.ts +3 -9
- package/dist/tools/find-phone.d.ts.map +1 -1
- package/dist/tools/find-phone.js +4 -41
- package/dist/tools/find-phone.js.map +1 -1
- package/dist/tools/find-signals.d.ts +3 -9
- package/dist/tools/find-signals.d.ts.map +1 -1
- package/dist/tools/find-signals.js +3 -83
- package/dist/tools/find-signals.js.map +1 -1
- package/dist/tools/get-place-reviews.d.ts +3 -9
- package/dist/tools/get-place-reviews.d.ts.map +1 -1
- package/dist/tools/get-place-reviews.js +3 -12
- package/dist/tools/get-place-reviews.js.map +1 -1
- package/dist/tools/get-session-usage.d.ts +10 -0
- package/dist/tools/get-session-usage.d.ts.map +1 -0
- package/dist/tools/get-session-usage.js +14 -0
- package/dist/tools/get-session-usage.js.map +1 -0
- package/dist/tools/search-ads.d.ts +3 -9
- package/dist/tools/search-ads.d.ts.map +1 -1
- package/dist/tools/search-ads.js +3 -12
- package/dist/tools/search-ads.js.map +1 -1
- package/dist/tools/search-companies.d.ts +3 -9
- package/dist/tools/search-companies.d.ts.map +1 -1
- package/dist/tools/search-companies.js +3 -24
- package/dist/tools/search-companies.js.map +1 -1
- package/dist/tools/search-jobs.d.ts +3 -9
- package/dist/tools/search-jobs.d.ts.map +1 -1
- package/dist/tools/search-jobs.js +3 -27
- package/dist/tools/search-jobs.js.map +1 -1
- package/dist/tools/search-places.d.ts +3 -15
- package/dist/tools/search-places.d.ts.map +1 -1
- package/dist/tools/search-places.js +5 -76
- package/dist/tools/search-places.js.map +1 -1
- package/dist/tools/search-reddit.d.ts +3 -9
- package/dist/tools/search-reddit.d.ts.map +1 -1
- package/dist/tools/search-reddit.js +3 -12
- package/dist/tools/search-reddit.js.map +1 -1
- package/dist/tools/search-seo.d.ts +3 -9
- package/dist/tools/search-seo.d.ts.map +1 -1
- package/dist/tools/search-seo.js +3 -12
- package/dist/tools/search-seo.js.map +1 -1
- package/dist/tools/search-web.d.ts +3 -9
- package/dist/tools/search-web.d.ts.map +1 -1
- package/dist/tools/search-web.js +3 -12
- package/dist/tools/search-web.js.map +1 -1
- package/dist/tools/verify-email.d.ts +3 -10
- package/dist/tools/verify-email.d.ts.map +1 -1
- package/dist/tools/verify-email.js +3 -68
- package/dist/tools/verify-email.js.map +1 -1
- package/dist/verb-client.d.ts +35 -0
- package/dist/verb-client.d.ts.map +1 -0
- package/dist/verb-client.js +57 -0
- package/dist/verb-client.js.map +1 -0
- package/package.json +1 -1
- package/src/client.ts +4 -0
- package/src/index.ts +8 -0
- package/src/session-usage.ts +130 -0
- package/src/tools/enrich-company.ts +3 -16
- package/src/tools/enrich-person.ts +3 -12
- package/src/tools/fetch-page-content.ts +3 -12
- package/src/tools/find-email.ts +3 -42
- package/src/tools/find-emails.ts +8 -506
- package/src/tools/find-influencers.ts +3 -12
- package/src/tools/find-people.ts +3 -107
- package/src/tools/find-phone.ts +4 -42
- package/src/tools/find-signals.ts +3 -88
- package/src/tools/get-place-reviews.ts +3 -12
- package/src/tools/get-session-usage.ts +18 -0
- package/src/tools/search-ads.ts +3 -12
- package/src/tools/search-companies.ts +3 -23
- package/src/tools/search-jobs.ts +3 -30
- package/src/tools/search-places.ts +5 -72
- package/src/tools/search-reddit.ts +3 -12
- package/src/tools/search-seo.ts +3 -12
- package/src/tools/search-web.ts +3 -12
- package/src/tools/verify-email.ts +3 -76
- package/src/verb-client.ts +93 -0
- package/tests/executor.test.ts +69 -0
- package/tests/session-usage.test.ts +130 -0
- package/tests/tools/get-session-usage.test.ts +44 -0
- package/tests/verb-client.test.ts +152 -0
- package/tests/tools/enrich-company.test.ts +0 -92
- package/tests/tools/enrich-person.test.ts +0 -140
- package/tests/tools/fetch-page-content.test.ts +0 -108
- package/tests/tools/find-email.test.ts +0 -137
- package/tests/tools/find-emails.test.ts +0 -818
- package/tests/tools/find-influencers.test.ts +0 -91
- package/tests/tools/find-people.test.ts +0 -621
- package/tests/tools/find-phone.test.ts +0 -100
- package/tests/tools/find-signals.test.ts +0 -175
- package/tests/tools/get-place-reviews.test.ts +0 -73
- package/tests/tools/search-ads.test.ts +0 -182
- package/tests/tools/search-companies.test.ts +0 -192
- package/tests/tools/search-jobs.test.ts +0 -210
- package/tests/tools/search-places.test.ts +0 -210
- package/tests/tools/search-reddit.test.ts +0 -194
- package/tests/tools/search-seo.test.ts +0 -183
- package/tests/tools/search-web.test.ts +0 -79
- package/tests/tools/verify-email.test.ts +0 -142
|
@@ -1,58 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { resolvePreferredProviders, buildAllFailedError, FIND_EMAILS_PROVIDERS } from '../utils/provider-resolver.js';
|
|
5
|
-
import { providerDisplayName } from '../utils/provider-display.js';
|
|
6
|
-
import { buildSelectionInsight } from '../utils/selection-insight.js';
|
|
7
|
-
// Single-find_email registry providers that the bulk pipeline does NOT already cover.
|
|
8
|
-
// Used as a fallback waterfall for residual misses after Prospeo + FullEnrich + Findymail + Icypeas.
|
|
9
|
-
const SINGLE_ONLY_FIND_EMAIL_PROVIDERS = ['limadata-work-email', 'blitzapi', 'limadata-work-email-linkedin', 'linkupapi'];
|
|
10
|
-
// Chunk inputs of >10 people into independent waterfalls. Empirically, Prospeo bulk on 25-50
|
|
11
|
-
// names regularly exceeds the 30s client timeout; 10 keeps each Prospeo call well under it.
|
|
12
|
-
export const FIND_EMAILS_CHUNK_SIZE = 10;
|
|
13
|
-
// Concurrency cap keeps peak in-flight calls (per-chunk fan-out × concurrent chunks) under
|
|
14
|
-
// the undici Agent's 32-connection budget (client.ts).
|
|
15
|
-
const CHUNK_CONCURRENCY = 3;
|
|
16
|
-
// Pulls a string email from any of the provider-specific response shapes used in the
|
|
17
|
-
// find_email registry (registry.ts:1228-1413). Keep in sync with the providers covered there.
|
|
18
|
-
function extractEmail(data) {
|
|
19
|
-
if (!data || typeof data !== 'object')
|
|
20
|
-
return null;
|
|
21
|
-
const d = data;
|
|
22
|
-
if (typeof d.email === 'string' && d.email.includes('@'))
|
|
23
|
-
return d.email;
|
|
24
|
-
if (Array.isArray(d.emails) && typeof d.emails[0] === 'string' && d.emails[0].includes('@'))
|
|
25
|
-
return d.emails[0];
|
|
26
|
-
const person = d.person;
|
|
27
|
-
const personEmail = person?.email;
|
|
28
|
-
if (typeof personEmail?.email === 'string' && personEmail.email.includes('@'))
|
|
29
|
-
return personEmail.email;
|
|
30
|
-
const nested = d.data;
|
|
31
|
-
if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
|
|
32
|
-
const inner = nested.email;
|
|
33
|
-
if (typeof inner === 'string' && inner.includes('@'))
|
|
34
|
-
return inner;
|
|
35
|
-
}
|
|
36
|
-
if (Array.isArray(nested) && nested[0] && typeof nested[0] === 'object') {
|
|
37
|
-
const first = nested[0];
|
|
38
|
-
if (Array.isArray(first.emails) && typeof first.emails[0] === 'string' && first.emails[0].includes('@')) {
|
|
39
|
-
return first.emails[0];
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
2
|
+
import { callVerb } from '../verb-client.js';
|
|
3
|
+
import { FIND_EMAILS_PROVIDERS } from '../utils/provider-resolver.js';
|
|
44
4
|
export const findEmailsName = 'find_emails';
|
|
45
5
|
export const findEmailsDescription = 'Find professional emails for multiple people in one batch. ' +
|
|
46
|
-
'
|
|
47
|
-
'
|
|
48
|
-
'Much faster than calling find_email one-by-one. Max 50 people per call — ' +
|
|
49
|
-
`inputs are split into chunks of ${FIND_EMAILS_CHUNK_SIZE} internally for reliability, so larger batches work transparently. ` +
|
|
6
|
+
'Runs the managed email waterfall in parallel across all people — ' +
|
|
7
|
+
'much faster than calling find_email one-by-one. Max 50 people per call. ' +
|
|
50
8
|
'Each person needs a unique id to match results back. ' +
|
|
51
9
|
'Always pass first_name, last_name, and domain — they are the primary enrichment signal. ' +
|
|
52
10
|
'Also pass linkedin_url when available, but never rely on it alone as some providers cannot resolve vanity URLs. ' +
|
|
53
|
-
'ColdIQ automatically picks the best waterfall — pass use_providers only if you need specific tools.
|
|
54
|
-
'Response includes `_meta.batch_status` (complete|partial|failed) and per-provider call stats so callers can ' +
|
|
55
|
-
'tell a real "no coverage" result apart from a provider-level failure.';
|
|
11
|
+
'ColdIQ automatically picks the best waterfall — pass use_providers only if you need specific tools.';
|
|
56
12
|
export const findEmailsSchema = {
|
|
57
13
|
people: z
|
|
58
14
|
.array(z.object({
|
|
@@ -67,380 +23,9 @@ export const findEmailsSchema = {
|
|
|
67
23
|
.describe('People to find emails for (max 50)'),
|
|
68
24
|
use_providers: z.array(z.string()).optional().describe(`Optional ordered list of providers to use. Leave empty to let ColdIQ automatically run the best waterfall — recommended for most use cases. Available providers: ${FIND_EMAILS_PROVIDERS.join(', ')}. Provider names are matched fuzzily, so minor typos are tolerated.`),
|
|
69
25
|
};
|
|
70
|
-
function newBatchStats() {
|
|
71
|
-
return {
|
|
72
|
-
prospeo: { attempted: 0, failed: 0 },
|
|
73
|
-
fullenrich: { attempted: 0, failed: 0 },
|
|
74
|
-
findymail: { attempted: 0, failed: 0 },
|
|
75
|
-
icypeas: { attempted: 0, failed: 0 },
|
|
76
|
-
single_fallback: { attempted: 0, failed: 0 },
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
function mergeStats(into, from) {
|
|
80
|
-
for (const key of Object.keys(into)) {
|
|
81
|
-
into[key].attempted += from[key].attempted;
|
|
82
|
-
into[key].failed += from[key].failed;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
function totalFailures(s) {
|
|
86
|
-
let n = 0;
|
|
87
|
-
for (const key of Object.keys(s))
|
|
88
|
-
n += s[key].failed;
|
|
89
|
-
return n;
|
|
90
|
-
}
|
|
91
|
-
// A call counts as a "failure" when callApi never received a usable response: network error,
|
|
92
|
-
// abort/timeout (status === 0), or upstream 5xx. Upstream 4xx is a data-shape problem, not a
|
|
93
|
-
// provider outage — we don't surface it as a batch-level failure.
|
|
94
|
-
function isCallFailure(res) {
|
|
95
|
-
return !res.ok && (res.status === 0 || res.status >= 500);
|
|
96
|
-
}
|
|
97
|
-
function sleep(ms) {
|
|
98
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
99
|
-
}
|
|
100
|
-
function missesOf(people, results) {
|
|
101
|
-
return people.filter((p) => !results.find((r) => r.id === p.id)?.email);
|
|
102
|
-
}
|
|
103
|
-
function chunkArray(arr, size) {
|
|
104
|
-
if (arr.length <= size)
|
|
105
|
-
return [arr];
|
|
106
|
-
const out = [];
|
|
107
|
-
for (let i = 0; i < arr.length; i += size)
|
|
108
|
-
out.push(arr.slice(i, i + size));
|
|
109
|
-
return out;
|
|
110
|
-
}
|
|
111
|
-
async function withConcurrency(items, concurrency, fn) {
|
|
112
|
-
const results = new Array(items.length);
|
|
113
|
-
let cursor = 0;
|
|
114
|
-
const workerCount = Math.min(concurrency, items.length);
|
|
115
|
-
const workers = Array.from({ length: workerCount }, async () => {
|
|
116
|
-
while (true) {
|
|
117
|
-
const i = cursor++;
|
|
118
|
-
if (i >= items.length)
|
|
119
|
-
return;
|
|
120
|
-
results[i] = await fn(items[i], i);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
await Promise.all(workers);
|
|
124
|
-
return results;
|
|
125
|
-
}
|
|
126
|
-
async function prospeoBulkStep(chunk, results, stats) {
|
|
127
|
-
const bulkBody = {
|
|
128
|
-
data: chunk.map((p) => p.linkedin_url
|
|
129
|
-
? { identifier: p.id, linkedin_url: p.linkedin_url }
|
|
130
|
-
: { identifier: p.id, first_name: p.first_name, last_name: p.last_name, company_name: p.domain }),
|
|
131
|
-
};
|
|
132
|
-
stats.prospeo.attempted += 1;
|
|
133
|
-
const bulkRes = await callApi('POST', '/prospeo/bulk-enrich-person', bulkBody);
|
|
134
|
-
if (isCallFailure(bulkRes))
|
|
135
|
-
stats.prospeo.failed += 1;
|
|
136
|
-
if (!bulkRes.ok)
|
|
137
|
-
return;
|
|
138
|
-
const data = bulkRes.data;
|
|
139
|
-
for (const item of data.results ?? []) {
|
|
140
|
-
const email = item.person?.email?.email;
|
|
141
|
-
if (typeof email === 'string' && email.includes('@')) {
|
|
142
|
-
const hit = results.find((r) => r.id === item.identifier);
|
|
143
|
-
if (hit) {
|
|
144
|
-
hit.email = email;
|
|
145
|
-
hit.provider = 'prospeo';
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
async function fullEnrichStep(misses, results, stats) {
|
|
151
|
-
stats.fullenrich.attempted += 1;
|
|
152
|
-
const feBody = {
|
|
153
|
-
name: 'mcp-enrich-batch',
|
|
154
|
-
data: misses.map((p) => ({
|
|
155
|
-
custom_id: p.id,
|
|
156
|
-
first_name: p.first_name,
|
|
157
|
-
last_name: p.last_name,
|
|
158
|
-
domain: p.domain,
|
|
159
|
-
...(p.linkedin_url ? { linkedin_url: p.linkedin_url } : {}),
|
|
160
|
-
enrich_fields: ['contact.emails'],
|
|
161
|
-
})),
|
|
162
|
-
};
|
|
163
|
-
const feCreateRes = await callApi('POST', '/fullenrich/contact/enrich/bulk', feBody);
|
|
164
|
-
if (!feCreateRes.ok) {
|
|
165
|
-
if (isCallFailure(feCreateRes))
|
|
166
|
-
stats.fullenrich.failed += 1;
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
const enrichmentId = feCreateRes.data.enrichment_id;
|
|
170
|
-
if (!enrichmentId) {
|
|
171
|
-
// No id returned but POST 2xx — treat as a soft skip, not a network failure.
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
// Tightened from 90s → 45s: Step 3 runs in parallel and typically fills misses
|
|
175
|
-
// faster, so FullEnrich's marginal value decays past this point.
|
|
176
|
-
const deadline = Date.now() + 45_000;
|
|
177
|
-
// Bail out once the poll endpoint fails repeatedly (e.g. upstream 502s) instead
|
|
178
|
-
// of hammering it for the full 45s. A poll that keeps erroring will never return
|
|
179
|
-
// data, and this branch gates the chunk's critical path (Promise.allSettled in
|
|
180
|
-
// processChunk), so polling to the deadline added ~30s of pure latency with zero
|
|
181
|
-
// emails. Mirrors the executor's COLDIQ_MAX_POLL_ERRORS guard (executor.ts).
|
|
182
|
-
const maxPollErrors = parseInt(process.env.COLDIQ_MAX_POLL_ERRORS ?? '3', 10);
|
|
183
|
-
let consecutivePollErrors = 0;
|
|
184
|
-
while (Date.now() < deadline) {
|
|
185
|
-
await sleep(2000);
|
|
186
|
-
const pollRes = await callApi('GET', `/fullenrich/contact/enrich/bulk/${enrichmentId}`);
|
|
187
|
-
if (!pollRes.ok) {
|
|
188
|
-
consecutivePollErrors += 1;
|
|
189
|
-
if (consecutivePollErrors >= maxPollErrors) {
|
|
190
|
-
stats.fullenrich.failed += 1;
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
consecutivePollErrors = 0;
|
|
196
|
-
const pd = pollRes.data;
|
|
197
|
-
const status = pd.status;
|
|
198
|
-
if (status !== 'DONE' && status !== 'FAILED')
|
|
199
|
-
continue;
|
|
200
|
-
if (status === 'DONE') {
|
|
201
|
-
const feItems = pd.data;
|
|
202
|
-
if (Array.isArray(feItems)) {
|
|
203
|
-
for (const item of feItems) {
|
|
204
|
-
const personId = item.custom_id;
|
|
205
|
-
const hit = personId ? results.find((r) => r.id === personId) : undefined;
|
|
206
|
-
if (!hit || hit.email)
|
|
207
|
-
continue;
|
|
208
|
-
const emails = item.emails;
|
|
209
|
-
if (Array.isArray(emails) && emails.length > 0 && typeof emails[0] === 'string' && emails[0].includes('@')) {
|
|
210
|
-
hit.email = emails[0];
|
|
211
|
-
hit.provider = 'fullenrich';
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
// Polling deadline reached without DONE/FAILED — count as a failure so the caller
|
|
219
|
-
// sees fullenrich didn't actually finish.
|
|
220
|
-
stats.fullenrich.failed += 1;
|
|
221
|
-
}
|
|
222
|
-
async function findymailIcypeasStep(misses, results, stats, allowedProviders) {
|
|
223
|
-
const useFindymail = !allowedProviders || allowedProviders.includes('findymail');
|
|
224
|
-
const useIcypeas = !allowedProviders || allowedProviders.includes('icypeas');
|
|
225
|
-
await Promise.all(misses.map(async (person) => {
|
|
226
|
-
const hit = results.find((r) => r.id === person.id);
|
|
227
|
-
if (!hit)
|
|
228
|
-
return;
|
|
229
|
-
// Skip if the parallel FullEnrich branch already filled this person.
|
|
230
|
-
if (hit.email)
|
|
231
|
-
return;
|
|
232
|
-
if (useFindymail) {
|
|
233
|
-
const fullName = [person.first_name, person.last_name].filter(Boolean).join(' ');
|
|
234
|
-
stats.findymail.attempted += 1;
|
|
235
|
-
const fmRes = await callApi('POST', '/findymail/search/name', {
|
|
236
|
-
name: fullName,
|
|
237
|
-
domain: person.domain,
|
|
238
|
-
});
|
|
239
|
-
if (isCallFailure(fmRes))
|
|
240
|
-
stats.findymail.failed += 1;
|
|
241
|
-
if (!hit.email && fmRes.ok) {
|
|
242
|
-
const d = fmRes.data;
|
|
243
|
-
if (typeof d.email === 'string' && d.email.includes('@')) {
|
|
244
|
-
hit.email = d.email;
|
|
245
|
-
hit.provider = 'findymail';
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
if (hit.email || !useIcypeas)
|
|
251
|
-
return;
|
|
252
|
-
stats.icypeas.attempted += 1;
|
|
253
|
-
const icyRes = await callApi('POST', '/icypeas/email-search', {
|
|
254
|
-
firstname: person.first_name,
|
|
255
|
-
lastname: person.last_name,
|
|
256
|
-
domainOrCompany: person.domain,
|
|
257
|
-
});
|
|
258
|
-
if (isCallFailure(icyRes))
|
|
259
|
-
stats.icypeas.failed += 1;
|
|
260
|
-
if (!hit.email && icyRes.ok) {
|
|
261
|
-
const d = icyRes.data;
|
|
262
|
-
const email = typeof d.email === 'string' && d.email.includes('@')
|
|
263
|
-
? d.email
|
|
264
|
-
: Array.isArray(d.emails) && typeof d.emails[0] === 'string' && d.emails[0].includes('@')
|
|
265
|
-
? d.emails[0]
|
|
266
|
-
: null;
|
|
267
|
-
if (email) {
|
|
268
|
-
hit.email = email;
|
|
269
|
-
hit.provider = 'icypeas';
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}));
|
|
273
|
-
}
|
|
274
|
-
async function singleFallbackStep(stragglers, results, stats, fallbackProviders) {
|
|
275
|
-
if (fallbackProviders.length === 0 || stragglers.length === 0)
|
|
276
|
-
return;
|
|
277
|
-
await Promise.all(stragglers.map(async (person) => {
|
|
278
|
-
const hit = results.find((r) => r.id === person.id);
|
|
279
|
-
if (!hit || hit.email)
|
|
280
|
-
return;
|
|
281
|
-
const singleInput = {
|
|
282
|
-
first_name: person.first_name,
|
|
283
|
-
last_name: person.last_name,
|
|
284
|
-
domain: person.domain,
|
|
285
|
-
linkedin_url: person.linkedin_url,
|
|
286
|
-
};
|
|
287
|
-
stats.single_fallback.attempted += 1;
|
|
288
|
-
// Per-person 30s ceiling so one slow provider doesn't block the rest.
|
|
289
|
-
const exec = executeWithFallback('find_email', singleInput, { providers: fallbackProviders });
|
|
290
|
-
const timeout = new Promise((resolve) => setTimeout(() => resolve(null), 30_000));
|
|
291
|
-
const raced = await Promise.race([exec, timeout]);
|
|
292
|
-
if (!raced) {
|
|
293
|
-
// Race timed out — none of the fallback providers returned in time.
|
|
294
|
-
stats.single_fallback.failed += 1;
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
if (isExecutionError(raced)) {
|
|
298
|
-
// Every fallback provider returned an error. Only count as `failed` when at least
|
|
299
|
-
// one of them looked like a real network/upstream failure — providers that responded
|
|
300
|
-
// 200 with no result are legitimate "no coverage", not a batch failure.
|
|
301
|
-
const hadRealFailure = raced.providers_tried.some((p) => p.status === 0 || p.status >= 500);
|
|
302
|
-
if (hadRealFailure)
|
|
303
|
-
stats.single_fallback.failed += 1;
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
const email = extractEmail(raced.data);
|
|
307
|
-
if (email && !hit.email) {
|
|
308
|
-
hit.email = email;
|
|
309
|
-
hit.provider = raced._meta.provider;
|
|
310
|
-
}
|
|
311
|
-
}));
|
|
312
|
-
}
|
|
313
|
-
async function processChunk(chunk, allowedProviders, isConstrained) {
|
|
314
|
-
const results = chunk.map((p) => ({ id: p.id, email: null, provider: null }));
|
|
315
|
-
const stats = newBatchStats();
|
|
316
|
-
// Step 1: Prospeo bulk — 1 call for everyone in this chunk.
|
|
317
|
-
if (!isConstrained || allowedProviders.includes('prospeo')) {
|
|
318
|
-
await prospeoBulkStep(chunk, results, stats);
|
|
319
|
-
}
|
|
320
|
-
// Steps 2 & 3 run concurrently for misses.
|
|
321
|
-
// Step 2: FullEnrich bulk async (slow tail, better European coverage)
|
|
322
|
-
// Step 3: per-person FindyMail → IcyPeas waterfall
|
|
323
|
-
// Both branches write to the shared `results` array; every write site checks
|
|
324
|
-
// `if (hit.email)` first so whichever provider arrives first wins and the
|
|
325
|
-
// other does not overwrite.
|
|
326
|
-
const misses = missesOf(chunk, results);
|
|
327
|
-
if (misses.length > 0) {
|
|
328
|
-
const steps = [];
|
|
329
|
-
if (!isConstrained || allowedProviders.includes('fullenrich')) {
|
|
330
|
-
steps.push(fullEnrichStep(misses, results, stats));
|
|
331
|
-
}
|
|
332
|
-
if (!isConstrained || allowedProviders.includes('findymail') || allowedProviders.includes('icypeas')) {
|
|
333
|
-
steps.push(findymailIcypeasStep(misses, results, stats, isConstrained ? allowedProviders : undefined));
|
|
334
|
-
}
|
|
335
|
-
if (steps.length > 0)
|
|
336
|
-
await Promise.allSettled(steps);
|
|
337
|
-
}
|
|
338
|
-
// Step 4 — single-find_email fallback for stragglers.
|
|
339
|
-
// Bulk covers Prospeo + FullEnrich + FindyMail + IcyPeas. The single-find_email registry
|
|
340
|
-
// (registry.ts:1228-1413) additionally covers LimaData, BlitzAPI, LimaData-LinkedIn, LinkupAPI.
|
|
341
|
-
// Without this step, agents would observe bulk return 0 and fall back to N+1 single calls.
|
|
342
|
-
const stragglers = missesOf(chunk, results);
|
|
343
|
-
if (stragglers.length > 0) {
|
|
344
|
-
const fallbackProviders = isConstrained
|
|
345
|
-
? allowedProviders.filter((p) => SINGLE_ONLY_FIND_EMAIL_PROVIDERS.includes(p))
|
|
346
|
-
: [...SINGLE_ONLY_FIND_EMAIL_PROVIDERS];
|
|
347
|
-
await singleFallbackStep(stragglers, results, stats, fallbackProviders);
|
|
348
|
-
}
|
|
349
|
-
return { results, stats };
|
|
350
|
-
}
|
|
351
|
-
function computeBatchStatus(found, total, stats) {
|
|
352
|
-
const failures = totalFailures(stats);
|
|
353
|
-
if (failures === 0)
|
|
354
|
-
return 'complete';
|
|
355
|
-
if (found === 0 && total > 0)
|
|
356
|
-
return 'failed';
|
|
357
|
-
return 'partial';
|
|
358
|
-
}
|
|
359
26
|
export async function findEmailsHandler(input) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
if (!resolved.ok) {
|
|
364
|
-
return { content: [{ type: 'text', text: JSON.stringify(resolved.error) }], isError: true };
|
|
365
|
-
}
|
|
366
|
-
const allowedProviders = resolved.providers;
|
|
367
|
-
const isConstrained = allowedProviders.length > 0;
|
|
368
|
-
const chunks = chunkArray(people, FIND_EMAILS_CHUNK_SIZE);
|
|
369
|
-
const chunkOutputs = await withConcurrency(chunks, CHUNK_CONCURRENCY, (chunk) => processChunk(chunk, allowedProviders, isConstrained));
|
|
370
|
-
const results = chunkOutputs.flatMap((c) => c.results);
|
|
371
|
-
const aggregateStats = newBatchStats();
|
|
372
|
-
for (const c of chunkOutputs)
|
|
373
|
-
mergeStats(aggregateStats, c.stats);
|
|
374
|
-
const found = results.filter((r) => r.email !== null).length;
|
|
375
|
-
const batchStatus = computeBatchStatus(found, people.length, aggregateStats);
|
|
376
|
-
// Constrained-mode behaviour preserved: if the caller pinned providers and got zero, push back.
|
|
377
|
-
if (isConstrained && found === 0) {
|
|
378
|
-
const err = buildAllFailedError(allowedProviders, 'find_emails', FIND_EMAILS_PROVIDERS);
|
|
379
|
-
return { content: [{ type: 'text', text: JSON.stringify(err) }], isError: true };
|
|
380
|
-
}
|
|
381
|
-
const meta = {
|
|
382
|
-
providers: aggregateStats,
|
|
383
|
-
batch_status: batchStatus,
|
|
384
|
-
chunk_size: FIND_EMAILS_CHUNK_SIZE,
|
|
385
|
-
chunk_count: chunks.length,
|
|
386
|
-
};
|
|
387
|
-
if (resolved.matchedFrom && Object.keys(resolved.matchedFrom).length > 0) {
|
|
388
|
-
meta.matchedFrom = resolved.matchedFrom;
|
|
389
|
-
}
|
|
390
|
-
// Batch-level selection insight: the per-person waterfall returns a provider per
|
|
391
|
-
// result, so attribute the batch to the provider that resolved the most emails.
|
|
392
|
-
// Prospeo is the primary bulk step (Step 1); anything else means we relied on a
|
|
393
|
-
// fallback step, so soften the wording.
|
|
394
|
-
if (found > 0) {
|
|
395
|
-
const winCounts = new Map();
|
|
396
|
-
for (const r of results) {
|
|
397
|
-
if (r.email && r.provider)
|
|
398
|
-
winCounts.set(r.provider, (winCounts.get(r.provider) ?? 0) + 1);
|
|
399
|
-
}
|
|
400
|
-
// Tie-break deterministically by waterfall rank: scan in FIND_EMAILS_PROVIDERS
|
|
401
|
-
// order and replace only on a strictly greater count, so an equal-count primary
|
|
402
|
-
// (Prospeo, Step 1) is never displaced by a later fallback step — keeps the
|
|
403
|
-
// attribution stable regardless of people-input order.
|
|
404
|
-
let dominant;
|
|
405
|
-
let best = 0;
|
|
406
|
-
for (const id of FIND_EMAILS_PROVIDERS) {
|
|
407
|
-
const count = winCounts.get(id) ?? 0;
|
|
408
|
-
if (count > best) {
|
|
409
|
-
best = count;
|
|
410
|
-
dominant = id;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
if (dominant) {
|
|
414
|
-
const insight = buildSelectionInsight('find_emails', dominant, restInput, {
|
|
415
|
-
// Steps 2-4 only run on Prospeo's misses, so a non-Prospeo winner is a
|
|
416
|
-
// genuine fallthrough — unless the caller pinned providers (no Prospeo step),
|
|
417
|
-
// in which case the pinnedByUser branch governs the wording anyway.
|
|
418
|
-
wasFallback: dominant !== 'prospeo' && !isConstrained,
|
|
419
|
-
pinnedByUser: isConstrained,
|
|
420
|
-
});
|
|
421
|
-
if (insight) {
|
|
422
|
-
meta.selection_insight = insight.insight;
|
|
423
|
-
if (insight.signals.length > 0)
|
|
424
|
-
meta.selection_signals = insight.signals;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
// Surface branded provider names per person so users never see a raw slug.
|
|
429
|
-
const brandedResults = results.map((r) => ({
|
|
430
|
-
...r,
|
|
431
|
-
provider_name: r.provider ? providerDisplayName(r.provider) : null,
|
|
432
|
-
}));
|
|
433
|
-
// Surface the silent-failure case the user reported: 200 OK with all-nulls is misleading
|
|
434
|
-
// when the nulls were caused by provider failures rather than legitimate no-coverage.
|
|
435
|
-
const isError = batchStatus === 'failed';
|
|
436
|
-
return {
|
|
437
|
-
content: [
|
|
438
|
-
{
|
|
439
|
-
type: 'text',
|
|
440
|
-
text: JSON.stringify({ data: { results: brandedResults, found, total: people.length }, _meta: meta }),
|
|
441
|
-
},
|
|
442
|
-
],
|
|
443
|
-
...(isError ? { isError: true } : {}),
|
|
444
|
-
};
|
|
27
|
+
// Bulk verb returns results positionally with no id echo — re-attach each
|
|
28
|
+
// person's `id` so callers can still match results back.
|
|
29
|
+
return callVerb('/email/find', input, { bulkField: 'people', reattachIdField: 'id' });
|
|
445
30
|
}
|
|
446
31
|
//# sourceMappingURL=find-emails.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-emails.js","sourceRoot":"","sources":["../../src/tools/find-emails.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"find-emails.js","sourceRoot":"","sources":["../../src/tools/find-emails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAErE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAChC,6DAA6D;IAC7D,mEAAmE;IACnE,0EAA0E;IAC1E,uDAAuD;IACvD,0FAA0F;IAC1F,kHAAkH;IAClH,qGAAqG,CAAA;AAEvG,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;QACjG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC5E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;KAC9H,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,oCAAoC,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oKAAoK,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CAClU,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA8B;IACpE,0EAA0E;IAC1E,yDAAyD;IACzD,OAAO,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;AACvF,CAAC"}
|
|
@@ -15,16 +15,10 @@ export declare const findInfluencersSchema: {
|
|
|
15
15
|
use_providers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
16
16
|
};
|
|
17
17
|
export declare function findInfluencersHandler(input: Record<string, unknown>): Promise<{
|
|
18
|
-
content: {
|
|
18
|
+
content: [{
|
|
19
19
|
type: "text";
|
|
20
20
|
text: string;
|
|
21
|
-
}
|
|
22
|
-
isError
|
|
23
|
-
} | {
|
|
24
|
-
content: {
|
|
25
|
-
type: "text";
|
|
26
|
-
text: string;
|
|
27
|
-
}[];
|
|
28
|
-
isError?: undefined;
|
|
21
|
+
}];
|
|
22
|
+
isError?: boolean;
|
|
29
23
|
}>;
|
|
30
24
|
//# sourceMappingURL=find-influencers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-influencers.d.ts","sourceRoot":"","sources":["../../src/tools/find-influencers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,QAE6U,CAAA;AAEpX,eAAO,MAAM,qBAAqB;;;;;;;;;;;;CAkBjC,CAAA;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"find-influencers.d.ts","sourceRoot":"","sources":["../../src/tools/find-influencers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,eAAO,MAAM,0BAA0B,QAE6U,CAAA;AAEpX,eAAO,MAAM,qBAAqB;;;;;;;;;;;;CAkBjC,CAAA;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAE1E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { callVerb } from '../verb-client.js';
|
|
3
|
+
import { getProvidersForCapability } from '../utils/provider-resolver.js';
|
|
4
4
|
export const findInfluencersName = 'find_influencers';
|
|
5
5
|
export const findInfluencersDescription = 'Discover and find influencers/creators on Instagram, YouTube, TikTok, Twitch, Twitter, and OnlyFans via 2 providers (Influencers Club Similar, Influencers Club Discovery). Routes by input: handle set → lookalike search (influencers_similar) runs first; no handle → keyword/filter discovery. Filters: location, gender, type (creator/business), AI natural language search, sort. Cost: 1 credit per result returned. ' +
|
|
6
6
|
'LIMITATIONS: LinkedIn is not a supported platform (the underlying creator index has no LinkedIn coverage) — for B2B/LinkedIn prospecting use extract_post_engagement to pull engagers off a specific LinkedIn post instead. There is no follower-count range filter; to bias toward a follower tier, set sort_by="number_of_followers" and filter the returned list client-side.';
|
|
@@ -24,15 +24,6 @@ export const findInfluencersSchema = {
|
|
|
24
24
|
use_providers: z.array(z.string()).optional().describe(`Optional ordered list of providers to use. Leave empty to let ColdIQ automatically pick the best tool for your inputs — recommended for most use cases. Available providers: ${getProvidersForCapability('find_influencers').join(', ')}. Provider names are matched fuzzily, so minor typos are tolerated.`),
|
|
25
25
|
};
|
|
26
26
|
export async function findInfluencersHandler(input) {
|
|
27
|
-
|
|
28
|
-
const resolved = resolvePreferredProviders('find_influencers', restInput, rawUseProviders);
|
|
29
|
-
if (!resolved.ok) {
|
|
30
|
-
return { content: [{ type: 'text', text: JSON.stringify(resolved.error) }], isError: true };
|
|
31
|
-
}
|
|
32
|
-
const result = await executeWithFallback('find_influencers', restInput, { providers: resolved.providers, matchedFrom: resolved.matchedFrom });
|
|
33
|
-
if (isExecutionError(result)) {
|
|
34
|
-
return { content: [{ type: 'text', text: JSON.stringify(result) }], isError: true };
|
|
35
|
-
}
|
|
36
|
-
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
|
|
27
|
+
return callVerb('/influencers/find', input);
|
|
37
28
|
}
|
|
38
29
|
//# sourceMappingURL=find-influencers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-influencers.js","sourceRoot":"","sources":["../../src/tools/find-influencers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"find-influencers.js","sourceRoot":"","sources":["../../src/tools/find-influencers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAEzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAErD,MAAM,CAAC,MAAM,0BAA0B,GACrC,+ZAA+Z;IAC/Z,kXAAkX,CAAA;AAEpX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SAClF,QAAQ,CAAC,kBAAkB,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;SAChD,QAAQ,CAAC,sDAAsD,CAAC;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SAChD,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnF,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC7B,QAAQ,CAAC,oFAAoF,CAAC;IACjG,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;SACrC,QAAQ,CAAC,2DAA2D,CAAC;IACxE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC1B,QAAQ,CAAC,gFAAgF,CAAC;IAC7F,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gLAAgL,yBAAyB,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE,CAAC;CACtW,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA8B;IACzE,OAAO,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -14,15 +14,10 @@ export declare const findPeopleSchema: {
|
|
|
14
14
|
use_providers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
15
15
|
};
|
|
16
16
|
export declare function findPeopleHandler(input: Record<string, unknown>): Promise<{
|
|
17
|
-
content: {
|
|
17
|
+
content: [{
|
|
18
18
|
type: "text";
|
|
19
19
|
text: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
content: {
|
|
23
|
-
type: "text";
|
|
24
|
-
text: string;
|
|
25
|
-
}[];
|
|
26
|
-
isError: boolean;
|
|
20
|
+
}];
|
|
21
|
+
isError?: boolean;
|
|
27
22
|
}>;
|
|
28
23
|
//# sourceMappingURL=find-people.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-people.d.ts","sourceRoot":"","sources":["../../src/tools/find-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"find-people.d.ts","sourceRoot":"","sources":["../../src/tools/find-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAE3C,eAAO,MAAM,qBAAqB,QAWiJ,CAAA;AAEnL,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAW5B,CAAA;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;GAErE"}
|