@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.
Files changed (51) hide show
  1. package/dist/client.d.ts.map +1 -1
  2. package/dist/client.js +26 -1
  3. package/dist/client.js.map +1 -1
  4. package/dist/executor.d.ts.map +1 -1
  5. package/dist/executor.js +50 -13
  6. package/dist/executor.js.map +1 -1
  7. package/dist/registry.d.ts +4 -1
  8. package/dist/registry.d.ts.map +1 -1
  9. package/dist/registry.js +154 -33
  10. package/dist/registry.js.map +1 -1
  11. package/dist/tools/enrich-company.js +4 -4
  12. package/dist/tools/enrich-company.js.map +1 -1
  13. package/dist/tools/enrich-person.js +3 -3
  14. package/dist/tools/enrich-person.js.map +1 -1
  15. package/dist/tools/fetch-page-content.js +3 -3
  16. package/dist/tools/fetch-page-content.js.map +1 -1
  17. package/dist/tools/find-email.js +4 -4
  18. package/dist/tools/find-email.js.map +1 -1
  19. package/dist/tools/find-emails.d.ts.map +1 -1
  20. package/dist/tools/find-emails.js +71 -5
  21. package/dist/tools/find-emails.js.map +1 -1
  22. package/dist/tools/find-influencers.js +3 -3
  23. package/dist/tools/find-influencers.js.map +1 -1
  24. package/dist/tools/find-people.js +5 -5
  25. package/dist/tools/find-people.js.map +1 -1
  26. package/dist/tools/find-phone.js +4 -4
  27. package/dist/tools/find-phone.js.map +1 -1
  28. package/dist/tools/find-signals.js +5 -5
  29. package/dist/tools/find-signals.js.map +1 -1
  30. package/dist/tools/search-ads.js +3 -3
  31. package/dist/tools/search-ads.js.map +1 -1
  32. package/dist/tools/search-companies.js +3 -3
  33. package/dist/tools/search-companies.js.map +1 -1
  34. package/dist/tools/search-jobs.js +4 -4
  35. package/dist/tools/search-jobs.js.map +1 -1
  36. package/dist/tools/search-places.js +3 -3
  37. package/dist/tools/search-places.js.map +1 -1
  38. package/dist/tools/search-reddit.js +3 -3
  39. package/dist/tools/search-reddit.js.map +1 -1
  40. package/dist/tools/search-seo.js +3 -3
  41. package/dist/tools/search-seo.js.map +1 -1
  42. package/dist/tools/search-web.js +3 -3
  43. package/dist/tools/search-web.js.map +1 -1
  44. package/dist/tools/verify-email.js +3 -3
  45. package/dist/tools/verify-email.js.map +1 -1
  46. package/package.json +2 -1
  47. package/src/executor.ts +25 -1
  48. package/src/registry.ts +32 -0
  49. package/tests/executor.test.ts +51 -0
  50. package/tests/registry-find-people.test.ts +66 -0
  51. package/tests/tools/find-people.test.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAKD,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAQjE;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,CAsCtB"}
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 = { method, headers };
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,IAAI,OAAe,CAAA;AACnB,IAAI,OAAe,CAAA;AAEnB,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,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;AACvC,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,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAE7C,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,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"}
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"}
@@ -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;AAmH3B,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"}
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
- result = await callApi(provider.method, provider.endpoint, payload.body, payload.queryParams);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
@@ -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 copy sorted by priority (lower = first).
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
@@ -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;AAs5FD;;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;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,EAAE,CAIpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,GAAG,aAAa,EAAE,CAW5E"}
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 industries require exact taxonomy matches free-text values like
131
- // "SaaS" produce empty results. Fold industries into keywords for flexible matching.
132
- const keywords = [
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
- keywords: keywords.length > 0 ? keywords : undefined,
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' && typeof d.nb_jobs_complete === 'number' && d.nb_jobs_complete > 0));
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
- // Continuously growing backoff: fast first probe (3s), then ramp up indefinitely
911
- // never plateaus, but the cumulative delay is bounded by timeoutMs.
912
- // Schedule: 3s, 7s, 15s, 25s, 35s, 45s, 55s, 65s, +10s per attempt thereafter.
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
- return d._id ?? d.search_id;
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: 5000,
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: 3000,
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: 5_000,
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: 5_000,
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: 5_000,
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: 5_000,
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 copy sorted by priority (lower = first).
3128
+ * Returns a frozen sorted copy cached after the first call (registry is static).
3021
3129
  */
3022
3130
  export function getProviders(capability) {
3023
- const providers = registry[capability];
3024
- if (!providers)
3025
- throw new Error(`Unknown capability: ${capability}`);
3026
- return [...providers].sort((a, b) => a.priority - b.priority);
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
- const providers = getProviders('search_web');
3033
- if (preferNeural) {
3034
- // Put Exa first when neural is requested
3035
- return providers.sort((a, b) => {
3036
- if (a.id === 'exa')
3037
- return -1;
3038
- if (b.id === 'exa')
3039
- return 1;
3040
- return a.priority - b.priority;
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 providers;
3164
+ return cached;
3044
3165
  }
3045
3166
  //# sourceMappingURL=registry.js.map