@coldiq/mcp 0.1.14 → 0.1.16
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 +26 -1
- package/dist/client.js.map +1 -1
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +50 -13
- package/dist/executor.js.map +1 -1
- package/dist/registry.d.ts +4 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +154 -33
- package/dist/registry.js.map +1 -1
- package/dist/tools/enrich-company.js +4 -4
- package/dist/tools/enrich-company.js.map +1 -1
- package/dist/tools/enrich-person.js +3 -3
- package/dist/tools/enrich-person.js.map +1 -1
- package/dist/tools/fetch-page-content.js +3 -3
- package/dist/tools/fetch-page-content.js.map +1 -1
- package/dist/tools/find-email.js +4 -4
- package/dist/tools/find-email.js.map +1 -1
- package/dist/tools/find-emails.d.ts.map +1 -1
- package/dist/tools/find-emails.js +71 -5
- package/dist/tools/find-emails.js.map +1 -1
- package/dist/tools/find-influencers.js +3 -3
- package/dist/tools/find-influencers.js.map +1 -1
- package/dist/tools/find-people.js +5 -5
- package/dist/tools/find-people.js.map +1 -1
- package/dist/tools/find-phone.js +4 -4
- package/dist/tools/find-phone.js.map +1 -1
- package/dist/tools/find-signals.js +5 -5
- package/dist/tools/find-signals.js.map +1 -1
- package/dist/tools/search-ads.js +3 -3
- package/dist/tools/search-ads.js.map +1 -1
- package/dist/tools/search-companies.js +3 -3
- package/dist/tools/search-companies.js.map +1 -1
- package/dist/tools/search-jobs.js +4 -4
- package/dist/tools/search-jobs.js.map +1 -1
- package/dist/tools/search-places.js +3 -3
- package/dist/tools/search-places.js.map +1 -1
- package/dist/tools/search-reddit.js +3 -3
- package/dist/tools/search-reddit.js.map +1 -1
- package/dist/tools/search-seo.js +3 -3
- package/dist/tools/search-seo.js.map +1 -1
- package/dist/tools/search-web.js +3 -3
- package/dist/tools/search-web.js.map +1 -1
- package/dist/tools/verify-email.js +3 -3
- package/dist/tools/verify-email.js.map +1 -1
- package/package.json +2 -1
- package/src/executor.ts +25 -1
- package/src/registry.ts +32 -0
- package/tests/executor.test.ts +51 -0
- package/tests/registry-find-people.test.ts +66 -0
- package/tests/tools/find-people.test.ts +3 -3
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAMD,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAqBjE;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,WAAW,CAAC,CAoDtB"}
|
package/dist/client.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
+
import { Agent, setGlobalDispatcher } from 'undici';
|
|
1
2
|
let _apiUrl;
|
|
2
3
|
let _apiKey;
|
|
4
|
+
let _httpTimeoutMs;
|
|
3
5
|
export function initClient(apiUrl, apiKey) {
|
|
4
6
|
_apiUrl = apiUrl ?? process.env.COLDIQ_API_URL ?? 'https://api.coldiq.com';
|
|
5
7
|
_apiKey = apiKey ?? process.env.COLDIQ_API_KEY ?? '';
|
|
8
|
+
_httpTimeoutMs = parseInt(process.env.COLDIQ_HTTP_TIMEOUT_MS ?? '30000', 10);
|
|
6
9
|
if (!_apiKey) {
|
|
7
10
|
throw new Error('COLDIQ_API_KEY is required — set it in .mcp.json env or as an environment variable');
|
|
8
11
|
}
|
|
9
12
|
// Strip trailing slash
|
|
10
13
|
_apiUrl = _apiUrl.replace(/\/+$/, '');
|
|
14
|
+
// Tune the global undici dispatcher: keep-alive + connection pool.
|
|
15
|
+
// pipelining: 1 — Cloudflare front-door does not reliably support HTTP/1.1 pipelining.
|
|
16
|
+
// connections: 32 — covers worst-case find_emails fan-out (50 people × 2 providers).
|
|
17
|
+
setGlobalDispatcher(new Agent({
|
|
18
|
+
keepAliveTimeout: 30_000,
|
|
19
|
+
keepAliveMaxTimeout: 60_000,
|
|
20
|
+
connections: 32,
|
|
21
|
+
pipelining: 1,
|
|
22
|
+
}));
|
|
11
23
|
}
|
|
12
24
|
export async function callApi(method, path, body, queryParams) {
|
|
13
25
|
const url = new URL(`${_apiUrl}/v1${path}`);
|
|
@@ -20,7 +32,11 @@ export async function callApi(method, path, body, queryParams) {
|
|
|
20
32
|
const headers = {
|
|
21
33
|
Authorization: `Bearer ${_apiKey}`,
|
|
22
34
|
};
|
|
23
|
-
const init = {
|
|
35
|
+
const init = {
|
|
36
|
+
method,
|
|
37
|
+
headers,
|
|
38
|
+
signal: AbortSignal.timeout(_httpTimeoutMs),
|
|
39
|
+
};
|
|
24
40
|
if (method === 'POST' && body !== undefined) {
|
|
25
41
|
headers['Content-Type'] = 'application/json';
|
|
26
42
|
init.body = JSON.stringify(body);
|
|
@@ -37,6 +53,15 @@ export async function callApi(method, path, body, queryParams) {
|
|
|
37
53
|
return { ok: res.ok, status: res.status, data };
|
|
38
54
|
}
|
|
39
55
|
catch (err) {
|
|
56
|
+
const isTimeout = err instanceof Error &&
|
|
57
|
+
(err.name === 'AbortError' || err.name === 'TimeoutError');
|
|
58
|
+
if (isTimeout) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
status: 0,
|
|
62
|
+
data: { error: 'Request timed out' },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
40
65
|
if (process.env.COLDIQ_DEBUG) {
|
|
41
66
|
console.error(`[coldiq:debug] network error: ${err instanceof Error ? err.message : String(err)}`);
|
|
42
67
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAQnD,IAAI,OAAe,CAAA;AACnB,IAAI,OAAe,CAAA;AACnB,IAAI,cAAsB,CAAA;AAE1B,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,MAAe;IACzD,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;IAC1E,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAA;IACpD,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAA;IAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IACvG,CAAC;IACD,uBAAuB;IACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAErC,mEAAmE;IACnE,uFAAuF;IACvF,qFAAqF;IACrF,mBAAmB,CACjB,IAAI,KAAK,CAAC;QACR,gBAAgB,EAAE,MAAM;QACxB,mBAAmB,EAAE,MAAM;QAC3B,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,CAAC;KACd,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAsB,EACtB,IAAY,EACZ,IAAc,EACd,WAAoC;IAEpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,MAAM,IAAI,EAAE,CAAC,CAAA;IAC3C,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,OAAO,EAAE;KACnC,CAAA;IAED,MAAM,IAAI,GAAgB;QACxB,MAAM;QACN,OAAO;QACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC;KAC5C,CAAA;IAED,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAA;QAC7C,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAA;QAChD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GACb,GAAG,YAAY,KAAK;YACpB,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC,CAAA;QAC5D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,CAAC;gBACT,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;aACrC,CAAA;QACH,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACpG,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;SACjC,CAAA;IACH,CAAC;AACH,CAAC"}
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACrC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3E,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iGAAiG;IACjG,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,iBAAS,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,MAAM,IAAI,cAAc,CAE5F;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACrC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3E,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iGAAiG;IACjG,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,iBAAS,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,MAAM,IAAI,cAAc,CAE5F;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAiK3B,MAAM,WAAW,cAAc;IAC7B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,GAAG,cAAc,CAAC,CAsH3C"}
|
package/dist/executor.js
CHANGED
|
@@ -22,6 +22,8 @@ function debug(msg) {
|
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
23
23
|
async function executeAsync(provider, payload) {
|
|
24
24
|
const asyncCfg = provider.async;
|
|
25
|
+
const firstPollMs = parseInt(process.env.COLDIQ_FIRST_POLL_MS ?? '750', 10);
|
|
26
|
+
const maxPollErrors = parseInt(process.env.COLDIQ_MAX_POLL_ERRORS ?? '3', 10);
|
|
25
27
|
// Step 1: create the job
|
|
26
28
|
debug(`${provider.id} async: creating job...`);
|
|
27
29
|
const createRes = await callApi(provider.method, provider.endpoint, payload.body, payload.queryParams);
|
|
@@ -40,25 +42,43 @@ async function executeAsync(provider, payload) {
|
|
|
40
42
|
if (!jobId)
|
|
41
43
|
return { ok: false, data: { error: 'Empty job ID from async response' } };
|
|
42
44
|
debug(`${provider.id} async: job created (${jobId}), polling...`);
|
|
43
|
-
// Step 3: poll until complete or timeout
|
|
45
|
+
// Step 3: poll until complete or timeout.
|
|
46
|
+
// First probe fires quickly — capped by both COLDIQ_FIRST_POLL_MS and the provider's
|
|
47
|
+
// configured first interval, so tests that set a short pollIntervalMs aren't blocked
|
|
48
|
+
// by the default 750ms.
|
|
44
49
|
const deadline = Date.now() + asyncCfg.timeoutMs;
|
|
45
50
|
let pollCount = 0;
|
|
51
|
+
let consecutivePollErrors = 0;
|
|
52
|
+
const configuredFirstInterval = typeof asyncCfg.pollIntervalMs === 'function'
|
|
53
|
+
? asyncCfg.pollIntervalMs(1)
|
|
54
|
+
: asyncCfg.pollIntervalMs;
|
|
55
|
+
await sleep(Math.min(firstPollMs, configuredFirstInterval));
|
|
46
56
|
while (Date.now() < deadline) {
|
|
57
|
+
const pollRes = await callApi('GET', asyncCfg.pollEndpoint(jobId));
|
|
58
|
+
pollCount++;
|
|
59
|
+
if (!pollRes.ok) {
|
|
60
|
+
consecutivePollErrors++;
|
|
61
|
+
if (consecutivePollErrors >= maxPollErrors) {
|
|
62
|
+
log(`${provider.id} async: poll failing (${consecutivePollErrors} consecutive errors), skipping`);
|
|
63
|
+
return { ok: false, data: { error: `Poll endpoint failed ${consecutivePollErrors} consecutive times` } };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
consecutivePollErrors = 0;
|
|
68
|
+
const status = pollRes.data.status ?? 'unknown';
|
|
69
|
+
const progress = pollRes.data.progress_percentage ?? '?';
|
|
70
|
+
debug(`${provider.id} async: poll #${pollCount} — status=${status}, progress=${progress}%`);
|
|
71
|
+
if (asyncCfg.isComplete(pollRes.data)) {
|
|
72
|
+
debug(`${provider.id} async: complete`);
|
|
73
|
+
return pollRes;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (Date.now() >= deadline)
|
|
77
|
+
break;
|
|
47
78
|
const interval = typeof asyncCfg.pollIntervalMs === 'function'
|
|
48
79
|
? asyncCfg.pollIntervalMs(pollCount + 1)
|
|
49
80
|
: asyncCfg.pollIntervalMs;
|
|
50
81
|
await sleep(interval);
|
|
51
|
-
pollCount++;
|
|
52
|
-
const pollRes = await callApi('GET', asyncCfg.pollEndpoint(jobId));
|
|
53
|
-
if (!pollRes.ok)
|
|
54
|
-
continue; // transient poll errors — retry
|
|
55
|
-
const status = pollRes.data.status ?? 'unknown';
|
|
56
|
-
const progress = pollRes.data.progress_percentage ?? '?';
|
|
57
|
-
debug(`${provider.id} async: poll #${pollCount} — status=${status}, progress=${progress}%`);
|
|
58
|
-
if (asyncCfg.isComplete(pollRes.data)) {
|
|
59
|
-
debug(`${provider.id} async: complete`);
|
|
60
|
-
return pollRes;
|
|
61
|
-
}
|
|
62
82
|
}
|
|
63
83
|
debug(`${provider.id} async: timed out after ${asyncCfg.timeoutMs / 1000}s`);
|
|
64
84
|
return { ok: false, data: { error: `Async operation timed out after ${asyncCfg.timeoutMs / 1000}s` } };
|
|
@@ -69,6 +89,16 @@ function sleep(ms) {
|
|
|
69
89
|
// ---------------------------------------------------------------------------
|
|
70
90
|
// Execute a single provider
|
|
71
91
|
// ---------------------------------------------------------------------------
|
|
92
|
+
// Per-provider sync wall-clock cap. Most providers return "no result" in <5s when
|
|
93
|
+
// they have no match; a slow provider returning empty late only delays the next
|
|
94
|
+
// fallback. Capping keeps a 9-provider waterfall walk bounded — at most ~90s end-
|
|
95
|
+
// to-end when every provider misses, vs. multi-minute stalls observed in production
|
|
96
|
+
// before this cap. Override via COLDIQ_SYNC_PROVIDER_TIMEOUT_MS for debugging/tests.
|
|
97
|
+
// Read each call so tests can adjust without module reloads. Does NOT apply to
|
|
98
|
+
// async providers — their own pollIntervalMs/timeoutMs govern.
|
|
99
|
+
function syncProviderTimeoutMs() {
|
|
100
|
+
return parseInt(process.env.COLDIQ_SYNC_PROVIDER_TIMEOUT_MS ?? '10000', 10);
|
|
101
|
+
}
|
|
72
102
|
async function executeSingle(provider, input) {
|
|
73
103
|
const start = Date.now();
|
|
74
104
|
let payload;
|
|
@@ -87,7 +117,14 @@ async function executeSingle(provider, input) {
|
|
|
87
117
|
result = { ...asyncResult, status: asyncResult.ok ? 200 : 500 };
|
|
88
118
|
}
|
|
89
119
|
else {
|
|
90
|
-
|
|
120
|
+
const cap = syncProviderTimeoutMs();
|
|
121
|
+
const call = callApi(provider.method, provider.endpoint, payload.body, payload.queryParams);
|
|
122
|
+
const timeout = new Promise((resolve) => setTimeout(() => resolve({
|
|
123
|
+
ok: false,
|
|
124
|
+
status: 0,
|
|
125
|
+
data: { error: `Provider exceeded ${cap}ms sync cap` },
|
|
126
|
+
}), cap));
|
|
127
|
+
result = await Promise.race([call, timeout]);
|
|
91
128
|
}
|
|
92
129
|
return { ...result, latencyMs: Date.now() - start };
|
|
93
130
|
}
|
package/dist/executor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAqBnE,SAAS,gBAAgB,CAAC,MAAwC;IAChE,OAAO,OAAO,IAAI,MAAM,IAAI,iBAAiB,IAAI,MAAM,CAAA;AACzD,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAE3B,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,mEAAmE;AACnE,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;AAClC,CAAC;AAED,sFAAsF;AACtF,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAA;IACxC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,KAAK,UAAU,YAAY,CACzB,QAAuB,EACvB,OAAiE;IAEjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -41,6 +41,8 @@ export interface ProviderEntry {
|
|
|
41
41
|
}
|
|
42
42
|
export type Capability = 'search_companies' | 'find_people' | 'find_email' | 'verify_email' | 'find_phone' | 'enrich_company' | 'enrich_person' | 'search_web' | 'search_jobs' | 'search_ads' | 'search_places' | 'find_influencers' | 'search_reddit' | 'search_seo' | 'find_signals' | 'fetch_page_content';
|
|
43
43
|
export declare function isoCountryToName(code: string): string;
|
|
44
|
+
export declare function nameToIsoCountry(input: string): string | undefined;
|
|
45
|
+
export declare function coerceCountriesToIso(values: readonly string[] | undefined): string[];
|
|
44
46
|
/**
|
|
45
47
|
* Return the ordered provider IDs for a capability (for documentation / resolver).
|
|
46
48
|
*/
|
|
@@ -52,11 +54,12 @@ export declare function listCapabilityProviderIds(capability: Capability): strin
|
|
|
52
54
|
export declare function getProviderApplicabilityGuard(capability: Capability, providerId: string): ((input: Record<string, unknown>) => boolean) | undefined;
|
|
53
55
|
/**
|
|
54
56
|
* Get the ordered provider list for a capability.
|
|
55
|
-
* Returns a
|
|
57
|
+
* Returns a frozen sorted copy — cached after the first call (registry is static).
|
|
56
58
|
*/
|
|
57
59
|
export declare function getProviders(capability: Capability): ProviderEntry[];
|
|
58
60
|
/**
|
|
59
61
|
* Get providers for search_web, reordering for neural search preference.
|
|
62
|
+
* Result is cached per preferNeural value — registry is static.
|
|
60
63
|
*/
|
|
61
64
|
export declare function getSearchWebProviders(preferNeural: boolean): ProviderEntry[];
|
|
62
65
|
//# sourceMappingURL=registry.d.ts.map
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;IACpC;;;;OAIG;IACH,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IACtD,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;IACtC,kDAAkD;IAClD,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACvG,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;IACrC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;IAC1D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;CACxE;AAED,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,aAAa,GACb,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,oBAAoB,CAAA;AA0CxB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;IACpC;;;;OAIG;IACH,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IACtD,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;IACtC,kDAAkD;IAClD,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACvG,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;IACrC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;IAC1D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;CACxE;AAED,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,aAAa,GACb,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,oBAAoB,CAAA;AA0CxB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAgCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAclE;AAKD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAGpF;AAm8FD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE,CAE1E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,MAAM,GACjB,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,SAAS,CAI3D;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,EAAE,CASpE;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,GAAG,aAAa,EAAE,CAkB5E"}
|
package/dist/registry.js
CHANGED
|
@@ -46,6 +46,65 @@ export function isoCountryToName(code) {
|
|
|
46
46
|
return code;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
+
// Reverse lookup: English country name → ISO 3166-1 alpha-2. Built lazily on first use.
|
|
50
|
+
// Agents routinely pass "Brazil" / "United States" instead of "BR" / "US" — without this
|
|
51
|
+
// coercion, downstream providers that require ISO codes (LeadsFactory, BlitzAPI) silently
|
|
52
|
+
// skip the filter.
|
|
53
|
+
let _nameToCode;
|
|
54
|
+
function buildNameToCode() {
|
|
55
|
+
const map = new Map();
|
|
56
|
+
// Iterate all ISO-2 codes A-Z × A-Z; keep those Intl.DisplayNames resolves.
|
|
57
|
+
for (let a = 65; a <= 90; a++) {
|
|
58
|
+
for (let b = 65; b <= 90; b++) {
|
|
59
|
+
const code = String.fromCharCode(a, b);
|
|
60
|
+
try {
|
|
61
|
+
const name = _displayNames.of(code);
|
|
62
|
+
if (name && name !== code)
|
|
63
|
+
map.set(name.toLowerCase(), code);
|
|
64
|
+
}
|
|
65
|
+
catch { /* skip */ }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Common aliases not covered by Intl.DisplayNames defaults.
|
|
69
|
+
map.set('usa', 'US');
|
|
70
|
+
map.set('uk', 'GB');
|
|
71
|
+
map.set('south korea', 'KR');
|
|
72
|
+
map.set('north korea', 'KP');
|
|
73
|
+
map.set('russia', 'RU');
|
|
74
|
+
map.set('iran', 'IR');
|
|
75
|
+
map.set('syria', 'SY');
|
|
76
|
+
map.set('uae', 'AE');
|
|
77
|
+
map.set('emirates', 'AE');
|
|
78
|
+
return map;
|
|
79
|
+
}
|
|
80
|
+
export function nameToIsoCountry(input) {
|
|
81
|
+
if (typeof input !== 'string' || input.length === 0)
|
|
82
|
+
return undefined;
|
|
83
|
+
if (!_nameToCode)
|
|
84
|
+
_nameToCode = buildNameToCode();
|
|
85
|
+
// Check aliases first — "UK" matches the ISO-2 regex but is not a valid code (GB is).
|
|
86
|
+
const aliased = _nameToCode.get(input.trim().toLowerCase());
|
|
87
|
+
if (aliased)
|
|
88
|
+
return aliased;
|
|
89
|
+
if (_ALPHA2_RE.test(input)) {
|
|
90
|
+
const upper = input.toUpperCase();
|
|
91
|
+
// Only accept if Intl actually resolves it — rejects "ZZ" etc.
|
|
92
|
+
try {
|
|
93
|
+
if (_displayNames.of(upper))
|
|
94
|
+
return upper;
|
|
95
|
+
}
|
|
96
|
+
catch { /* fall through */ }
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
// Coerce a list of strings (mix of ISO-2 codes and country names) into ISO-2 codes.
|
|
101
|
+
// Unrecognized inputs are dropped (rather than passed through) so providers don't
|
|
102
|
+
// receive garbage like { code: "Brazil", name: "Brazil" }.
|
|
103
|
+
export function coerceCountriesToIso(values) {
|
|
104
|
+
if (!values?.length)
|
|
105
|
+
return [];
|
|
106
|
+
return values.map((v) => nameToIsoCountry(v)).filter((c) => typeof c === 'string');
|
|
107
|
+
}
|
|
49
108
|
function readNested(obj, path) {
|
|
50
109
|
return path.split('.').reduce((acc, key) => (acc && typeof acc === 'object' ? acc[key] : undefined), obj);
|
|
51
110
|
}
|
|
@@ -127,9 +186,12 @@ const searchCompaniesProviders = [
|
|
|
127
186
|
method: 'POST',
|
|
128
187
|
priority: 1,
|
|
129
188
|
mapParams: (input) => {
|
|
130
|
-
// CompanyEnrich
|
|
131
|
-
//
|
|
132
|
-
|
|
189
|
+
// CompanyEnrich's `keywords` body field is a tag filter that does not match
|
|
190
|
+
// brand names — sending "wework" returns global defaults instead of WeWork.
|
|
191
|
+
// Route free-text input through `query` (full-text on company name + domain).
|
|
192
|
+
// Industries are folded into the same string because CompanyEnrich's `industries`
|
|
193
|
+
// field requires exact taxonomy matches and rejects free-text like "SaaS".
|
|
194
|
+
const queryTerms = [
|
|
133
195
|
...(input.keywords ?? []),
|
|
134
196
|
...(input.industries ?? []),
|
|
135
197
|
];
|
|
@@ -143,7 +205,7 @@ const searchCompaniesProviders = [
|
|
|
143
205
|
return {
|
|
144
206
|
body: {
|
|
145
207
|
countries: input.countries,
|
|
146
|
-
|
|
208
|
+
query: queryTerms.length > 0 ? queryTerms.join(' ') : undefined,
|
|
147
209
|
technologies: isNonEmptyArray(input.technologies) ? input.technologies : undefined,
|
|
148
210
|
employees: input.min_employees || input.max_employees
|
|
149
211
|
? [{ from: input.min_employees, to: input.max_employees }]
|
|
@@ -886,6 +948,14 @@ const findPeopleProviders = [
|
|
|
886
948
|
? [...groups.values()].map((titles) => ({ job_title: titles.join(', ') }))
|
|
887
949
|
: [{ job_title: 'Decision Maker' }];
|
|
888
950
|
const hasLinkedInUrls = isNonEmptyArray(input.company_linkedin_urls);
|
|
951
|
+
// LF natively scopes contacts by person location via country_codes. Coerce
|
|
952
|
+
// input.locations (which agents pass as a mix of ISO-2 codes "BR" and country
|
|
953
|
+
// names "Brazil") to ISO-2 first — LF rejects/ignores anything else and silently
|
|
954
|
+
// returns unfiltered global results.
|
|
955
|
+
const isoCodes = coerceCountriesToIso(input.locations);
|
|
956
|
+
const country_codes = isoCodes.length > 0
|
|
957
|
+
? isoCodes.map((code) => ({ code, name: isoCountryToName(code) }))
|
|
958
|
+
: undefined;
|
|
889
959
|
return {
|
|
890
960
|
body: {
|
|
891
961
|
...(hasLinkedInUrls && { company_linkedin_urls: input.company_linkedin_urls }),
|
|
@@ -896,6 +966,7 @@ const findPeopleProviders = [
|
|
|
896
966
|
search: {
|
|
897
967
|
max_persona_results: input.limit ?? 25,
|
|
898
968
|
personas,
|
|
969
|
+
...(country_codes && { country_codes }),
|
|
899
970
|
},
|
|
900
971
|
},
|
|
901
972
|
};
|
|
@@ -903,23 +974,24 @@ const findPeopleProviders = [
|
|
|
903
974
|
hasResult: (data) => {
|
|
904
975
|
const d = data;
|
|
905
976
|
return (isNonEmptyArray(d.companies_personas) ||
|
|
906
|
-
(d.status === 'SUCCESSFUL' &&
|
|
977
|
+
(d.status === 'SUCCESSFUL' && d.nb_jobs_complete != null && d.nb_jobs_complete > 0));
|
|
907
978
|
},
|
|
908
979
|
async: {
|
|
909
980
|
pollEndpoint: (id) => `/leadsfactory/contact-finder/searches/${id}`,
|
|
910
|
-
//
|
|
911
|
-
//
|
|
912
|
-
|
|
913
|
-
pollIntervalMs: (attempt) => attempt === 1 ? 3000 : attempt === 2 ? 7000 : 15000 + (attempt - 3) * 10000,
|
|
981
|
+
// Growing backoff: fast early probes, then steady growth bounded by timeoutMs.
|
|
982
|
+
// Schedule: 2s, 5s, 12s, 20s, 28s, 36s, +8s per attempt thereafter.
|
|
983
|
+
pollIntervalMs: (attempt) => attempt === 1 ? 2000 : attempt === 2 ? 5000 : 12000 + (attempt - 3) * 8000,
|
|
914
984
|
timeoutMs: 300_000, // 5 minutes
|
|
915
985
|
isComplete: (data) => {
|
|
916
986
|
const d = data;
|
|
917
987
|
const status = d.status;
|
|
918
|
-
return status === 'SUCCESSFUL' || status === 'FAILED';
|
|
988
|
+
return status === 'SUCCESSFUL' || status === 'FAILED' || status === 'INVALID_URL';
|
|
919
989
|
},
|
|
920
990
|
extractId: (response) => {
|
|
921
991
|
const d = response;
|
|
922
|
-
|
|
992
|
+
// LeadsFactory's upstream returns the ObjectId as `id`; the short `search_id`
|
|
993
|
+
// cannot be used as the GET param (upstream rejects it as "not a valid ObjectId").
|
|
994
|
+
return d.id ?? d.search_id;
|
|
923
995
|
},
|
|
924
996
|
},
|
|
925
997
|
},
|
|
@@ -942,6 +1014,41 @@ const findPeopleProviders = [
|
|
|
942
1014
|
const d = data;
|
|
943
1015
|
return isNonEmptyArray(d.people) || isNonEmptyArray(d.contacts);
|
|
944
1016
|
},
|
|
1017
|
+
// Apollo's `q_organization_domains` is a soft hint — when titles match strongly,
|
|
1018
|
+
// Apollo returns people from other companies whose title fits (e.g. a CEO seller
|
|
1019
|
+
// on the Hotmart platform, or a random Brazilian CEO when filtering by WeWork).
|
|
1020
|
+
// Strict-filter post-hoc by the person's actual employer domain when the caller
|
|
1021
|
+
// supplied company identifiers.
|
|
1022
|
+
postFilter: (data, input) => {
|
|
1023
|
+
const wantDomains = (input.company_domains ?? [])
|
|
1024
|
+
.map((d) => d.toLowerCase().replace(/^https?:\/\//, '').replace(/^www\./, '').split('/')[0])
|
|
1025
|
+
.filter(Boolean);
|
|
1026
|
+
const wantLinkedIns = (input.company_linkedin_urls ?? [])
|
|
1027
|
+
.map((u) => u.toLowerCase().replace(/^https?:\/\//, '').replace(/^www\./, '').replace(/\/+$/, ''))
|
|
1028
|
+
.filter(Boolean);
|
|
1029
|
+
if (wantDomains.length === 0 && wantLinkedIns.length === 0)
|
|
1030
|
+
return data;
|
|
1031
|
+
const d = { ...data };
|
|
1032
|
+
const people = d.people ?? [];
|
|
1033
|
+
d.people = people.filter((p) => {
|
|
1034
|
+
const org = p.organization;
|
|
1035
|
+
const orgWebsite = org?.website_url?.toLowerCase()
|
|
1036
|
+
.replace(/^https?:\/\//, '').replace(/^www\./, '').split('/')[0];
|
|
1037
|
+
const orgLinkedIn = org?.linkedin_url?.toLowerCase()
|
|
1038
|
+
.replace(/^https?:\/\//, '').replace(/^www\./, '').replace(/\/+$/, '');
|
|
1039
|
+
// Keep only if the person's employer matches one of the requested companies.
|
|
1040
|
+
// Lenient when the field is missing — providers occasionally omit org details
|
|
1041
|
+
// but the person is still a match (e.g. found via name+title lookup).
|
|
1042
|
+
if (orgWebsite && wantDomains.length > 0 && wantDomains.includes(orgWebsite))
|
|
1043
|
+
return true;
|
|
1044
|
+
if (orgLinkedIn && wantLinkedIns.length > 0 && wantLinkedIns.some((u) => orgLinkedIn === u))
|
|
1045
|
+
return true;
|
|
1046
|
+
// If we have org info but neither matches, drop. If we have no org info at all, drop too —
|
|
1047
|
+
// safer to lose an unverified record than to include a false positive.
|
|
1048
|
+
return false;
|
|
1049
|
+
});
|
|
1050
|
+
return d;
|
|
1051
|
+
},
|
|
945
1052
|
},
|
|
946
1053
|
{
|
|
947
1054
|
id: 'pdl',
|
|
@@ -1299,7 +1406,7 @@ const findEmailProviders = [
|
|
|
1299
1406
|
return d.enrichment_id;
|
|
1300
1407
|
},
|
|
1301
1408
|
pollEndpoint: (id) => `/fullenrich/contact/enrich/bulk/${id}`,
|
|
1302
|
-
pollIntervalMs:
|
|
1409
|
+
pollIntervalMs: 2500,
|
|
1303
1410
|
timeoutMs: 60_000,
|
|
1304
1411
|
isComplete: (data) => {
|
|
1305
1412
|
const d = data;
|
|
@@ -1395,7 +1502,7 @@ const verifyEmailProviders = [
|
|
|
1395
1502
|
throw new Error('Instantly verification response has no email field');
|
|
1396
1503
|
},
|
|
1397
1504
|
pollEndpoint: (email) => `/instantly/email-verification/${encodeURIComponent(email)}`,
|
|
1398
|
-
pollIntervalMs:
|
|
1505
|
+
pollIntervalMs: 1500,
|
|
1399
1506
|
timeoutMs: 30_000,
|
|
1400
1507
|
isComplete: (data) => {
|
|
1401
1508
|
const d = data;
|
|
@@ -1808,7 +1915,7 @@ function _hasJobFilter(input, keys) {
|
|
|
1808
1915
|
});
|
|
1809
1916
|
}
|
|
1810
1917
|
const _jobsSharedAsync = {
|
|
1811
|
-
pollIntervalMs:
|
|
1918
|
+
pollIntervalMs: (attempt) => (attempt === 1 ? 1500 : attempt <= 3 ? 2500 : 4000),
|
|
1812
1919
|
timeoutMs: 300_000,
|
|
1813
1920
|
extractId: (data) => {
|
|
1814
1921
|
const jobId = data.jobId;
|
|
@@ -1938,7 +2045,7 @@ const searchJobsProviders = [
|
|
|
1938
2045
|
// search_ads
|
|
1939
2046
|
// ---------------------------------------------------------------------------
|
|
1940
2047
|
const _adsSharedAsync = {
|
|
1941
|
-
pollIntervalMs:
|
|
2048
|
+
pollIntervalMs: (attempt) => (attempt === 1 ? 1500 : attempt <= 3 ? 2500 : 4000),
|
|
1942
2049
|
timeoutMs: 300_000,
|
|
1943
2050
|
extractId: (data) => {
|
|
1944
2051
|
const jobId = data.jobId;
|
|
@@ -2114,7 +2221,7 @@ function _hasAny(input, keys) {
|
|
|
2114
2221
|
return false;
|
|
2115
2222
|
}
|
|
2116
2223
|
const _placesSharedAsync = {
|
|
2117
|
-
pollIntervalMs:
|
|
2224
|
+
pollIntervalMs: (attempt) => (attempt === 1 ? 1500 : attempt <= 3 ? 2500 : 4000),
|
|
2118
2225
|
timeoutMs: 300_000,
|
|
2119
2226
|
extractId: (data) => {
|
|
2120
2227
|
const jobId = data.jobId;
|
|
@@ -2283,7 +2390,7 @@ const findInfluencersProviders = [
|
|
|
2283
2390
|
// search_reddit
|
|
2284
2391
|
// ---------------------------------------------------------------------------
|
|
2285
2392
|
const _redditSharedAsync = {
|
|
2286
|
-
pollIntervalMs:
|
|
2393
|
+
pollIntervalMs: (attempt) => (attempt === 1 ? 1500 : attempt <= 3 ? 2500 : 4000),
|
|
2287
2394
|
timeoutMs: 300_000,
|
|
2288
2395
|
extractId: (data) => {
|
|
2289
2396
|
const jobId = data.jobId;
|
|
@@ -3015,31 +3122,45 @@ export function getProviderApplicabilityGuard(capability, providerId) {
|
|
|
3015
3122
|
return undefined;
|
|
3016
3123
|
return providers.find((p) => p.id === providerId)?.isApplicable;
|
|
3017
3124
|
}
|
|
3125
|
+
const _providersCache = new Map();
|
|
3018
3126
|
/**
|
|
3019
3127
|
* Get the ordered provider list for a capability.
|
|
3020
|
-
* Returns a
|
|
3128
|
+
* Returns a frozen sorted copy — cached after the first call (registry is static).
|
|
3021
3129
|
*/
|
|
3022
3130
|
export function getProviders(capability) {
|
|
3023
|
-
|
|
3024
|
-
if (!
|
|
3025
|
-
|
|
3026
|
-
|
|
3131
|
+
let cached = _providersCache.get(capability);
|
|
3132
|
+
if (!cached) {
|
|
3133
|
+
const providers = registry[capability];
|
|
3134
|
+
if (!providers)
|
|
3135
|
+
throw new Error(`Unknown capability: ${capability}`);
|
|
3136
|
+
cached = Object.freeze([...providers].sort((a, b) => a.priority - b.priority));
|
|
3137
|
+
_providersCache.set(capability, cached);
|
|
3138
|
+
}
|
|
3139
|
+
return cached;
|
|
3027
3140
|
}
|
|
3141
|
+
const _searchWebProvidersCache = new Map();
|
|
3028
3142
|
/**
|
|
3029
3143
|
* Get providers for search_web, reordering for neural search preference.
|
|
3144
|
+
* Result is cached per preferNeural value — registry is static.
|
|
3030
3145
|
*/
|
|
3031
3146
|
export function getSearchWebProviders(preferNeural) {
|
|
3032
|
-
|
|
3033
|
-
if (
|
|
3034
|
-
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3147
|
+
let cached = _searchWebProvidersCache.get(preferNeural);
|
|
3148
|
+
if (!cached) {
|
|
3149
|
+
const base = getProviders('search_web');
|
|
3150
|
+
if (preferNeural) {
|
|
3151
|
+
cached = Object.freeze([...base].sort((a, b) => {
|
|
3152
|
+
if (a.id === 'exa')
|
|
3153
|
+
return -1;
|
|
3154
|
+
if (b.id === 'exa')
|
|
3155
|
+
return 1;
|
|
3156
|
+
return a.priority - b.priority;
|
|
3157
|
+
}));
|
|
3158
|
+
}
|
|
3159
|
+
else {
|
|
3160
|
+
cached = base;
|
|
3161
|
+
}
|
|
3162
|
+
_searchWebProvidersCache.set(preferNeural, cached);
|
|
3042
3163
|
}
|
|
3043
|
-
return
|
|
3164
|
+
return cached;
|
|
3044
3165
|
}
|
|
3045
3166
|
//# sourceMappingURL=registry.js.map
|