@signaliz/sdk 1.0.22 → 1.0.24

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/README.md CHANGED
@@ -23,6 +23,8 @@ const signaliz = new Signaliz({
23
23
  const found = await signaliz.findEmail({
24
24
  companyDomain: 'example.com',
25
25
  fullName: 'Jane Doe',
26
+ // Optional: bypass cached email and verification data for a fresh-provider run.
27
+ skipCache: true,
26
28
  });
27
29
 
28
30
  const verified = await signaliz.verifyEmail(found.email!);
@@ -32,12 +34,24 @@ const signals = await signaliz.enrichCompanySignals({
32
34
  researchPrompt: 'expansion priorities',
33
35
  });
34
36
 
37
+ // Persist a no-wait run ID and resume it later without duplicate spend.
38
+ const queuedSignals = await signaliz.enrichCompanySignals({
39
+ companyDomain: 'example.com',
40
+ waitForResult: false,
41
+ });
42
+ const resumedSignals = await signaliz.enrichCompanySignals({
43
+ signalRunId: queuedSignals.signalRunId,
44
+ });
45
+
35
46
  const copy = await signaliz.signalToCopy({
36
47
  companyDomain: 'example.com',
37
48
  personName: 'Jane Doe',
38
49
  title: 'VP Sales',
39
50
  campaignOffer: 'pipeline intelligence',
40
51
  researchPrompt: 'expansion priorities',
52
+ // Cache-first and shallow by default; opt into either behavior explicitly.
53
+ skipCache: false,
54
+ enableDeepSearch: false,
41
55
  });
42
56
  ```
43
57
 
@@ -54,11 +68,16 @@ const copyBatch = await signaliz.createSignalCopyBatch(copyRequests, { concurren
54
68
 
55
69
  Each batch accepts up to 5,000 items. Company Signal Enrichment transparently
56
70
  resumes long-running research through the same `/company-signals` endpoint;
57
- callers never need an internal Trigger.dev status URL.
71
+ callers never need an internal Trigger.dev status URL. The SDK follows the
72
+ server's adaptive polling hints by default and still honors `pollIntervalMs`
73
+ when a caller explicitly overrides the cadence.
58
74
 
59
75
  Company Signal Enrichment defaults `online` and `enableDeepSearch` to `true`
60
76
  unless the caller explicitly disables them. Signal to Copy AI returns three
61
77
  complete, evidence-backed email variations when supported signals are available.
78
+ Signal to Copy is cache-first and defaults `enableDeepSearch` to `false` so it
79
+ normally finishes within an agent turn; set `skipCache` or `enableDeepSearch`
80
+ only when fresh or deeper research is required.
62
81
  Unclassified evidence is returned by signal enrichment but is not used to
63
82
  generate outreach copy.
64
83
 
@@ -359,7 +359,8 @@ var Signaliz = class {
359
359
  first_name: params.firstName,
360
360
  last_name: params.lastName,
361
361
  linkedin_url: params.linkedinUrl,
362
- company_name: params.companyName
362
+ company_name: params.companyName,
363
+ skip_cache: params.skipCache
363
364
  }));
364
365
  const email = typeof data.email === "string" && data.email.trim() ? data.email.trim() : null;
365
366
  const found = Boolean(email) && data.found !== false;
@@ -401,6 +402,7 @@ var Signaliz = class {
401
402
  async enrichCompanySignals(params) {
402
403
  const online = params.online ?? true;
403
404
  const request = compact({
405
+ signal_run_id: params.signalRunId,
404
406
  company_domain: params.companyDomain,
405
407
  company_name: params.companyName,
406
408
  research_prompt: params.researchPrompt,
@@ -412,15 +414,17 @@ var Signaliz = class {
412
414
  enable_outreach_intelligence: params.enableOutreachIntelligence,
413
415
  enable_predictive_intelligence: params.enablePredictiveIntelligence,
414
416
  skip_cache: params.skipCache,
415
- wait_for_result: params.waitForResult !== false,
417
+ // REST always returns a resumable run instead of holding the connection;
418
+ // waitForResult controls this SDK's polling loop below.
419
+ wait_for_result: false,
416
420
  max_wait_ms: params.maxWaitMs
417
421
  });
418
422
  let data = await this.client.post("api/v1/company-signals", request);
419
423
  if (params.waitForResult !== false && data.run_id && isPendingSignalResponse(data)) {
420
424
  const maxWaitMs = Math.max(1e3, params.maxWaitMs ?? 20 * 6e4);
421
- const pollIntervalMs = Math.max(250, params.pollIntervalMs ?? 2e3);
422
425
  const startedAt = Date.now();
423
426
  while (Date.now() - startedAt < maxWaitMs) {
427
+ if (!await waitForNextSignalPoll(data, params.pollIntervalMs, startedAt, maxWaitMs)) break;
424
428
  const status = await this.client.post("api/v1/company-signals", {
425
429
  ...request,
426
430
  signal_run_id: data.run_id
@@ -436,7 +440,7 @@ var Signaliz = class {
436
440
  data = status.output ?? status.result ?? status.data ?? status;
437
441
  break;
438
442
  }
439
- await sleep2(pollIntervalMs);
443
+ data = status;
440
444
  }
441
445
  if (isPendingSignalResponse(data)) {
442
446
  throw new Error(`Company signal enrichment ${data.run_id} did not complete within ${maxWaitMs}ms`);
@@ -444,6 +448,8 @@ var Signaliz = class {
444
448
  }
445
449
  return {
446
450
  success: data.success ?? true,
451
+ status: data.status,
452
+ signalRunId: data.signal_run_id ?? data.run_id,
447
453
  company: {
448
454
  name: data.company?.name ?? params.companyName ?? null,
449
455
  domain: data.company?.domain ?? params.companyDomain ?? null
@@ -475,15 +481,16 @@ var Signaliz = class {
475
481
  title: params.title,
476
482
  campaign_offer: params.campaignOffer,
477
483
  research_prompt: params.researchPrompt,
478
- signal_run_id: params.signalRunId
484
+ signal_run_id: params.signalRunId,
485
+ skip_cache: params.skipCache,
486
+ enable_deep_search: params.enableDeepSearch
479
487
  });
480
488
  let data = await this.client.post("api/v1/signal-to-copy", request);
481
489
  if (params.waitForResult !== false && data.run_id && isPendingSignalResponse(data)) {
482
490
  const maxWaitMs = Math.max(1e3, params.maxWaitMs ?? 20 * 6e4);
483
- const pollIntervalMs = Math.max(250, params.pollIntervalMs ?? 2e3);
484
491
  const startedAt = Date.now();
485
492
  while (Date.now() - startedAt < maxWaitMs) {
486
- await sleep2(pollIntervalMs);
493
+ if (!await waitForNextSignalPoll(data, params.pollIntervalMs, startedAt, maxWaitMs)) break;
487
494
  data = await this.client.post("api/v1/signal-to-copy", {
488
495
  ...request,
489
496
  signal_run_id: data.run_id
@@ -543,6 +550,19 @@ function isCompletedSignalRun(data) {
543
550
  function isFailedSignalRun(data) {
544
551
  return ["failed", "error", "cancelled", "canceled", "crashed", "timed_out"].includes(String(data.status || "").toLowerCase());
545
552
  }
553
+ function signalPollDelayMs(data, override) {
554
+ if (override !== void 0) return Math.max(250, override);
555
+ const retryAfterMs = Number(data.retry_after_ms);
556
+ const nextPollSeconds = Number(data.next_poll_after_seconds);
557
+ const hinted = Number.isFinite(retryAfterMs) && retryAfterMs > 0 ? retryAfterMs : Number.isFinite(nextPollSeconds) && nextPollSeconds > 0 ? nextPollSeconds * 1e3 : 2e3;
558
+ return Math.min(6e4, Math.max(250, hinted));
559
+ }
560
+ async function waitForNextSignalPoll(data, override, startedAt, maxWaitMs) {
561
+ const remainingMs = maxWaitMs - (Date.now() - startedAt);
562
+ if (remainingMs <= 0) return false;
563
+ await sleep2(Math.min(signalPollDelayMs(data, override), remainingMs));
564
+ return Date.now() - startedAt < maxWaitMs;
565
+ }
546
566
  function sleep2(ms) {
547
567
  return new Promise((resolve) => setTimeout(resolve, ms));
548
568
  }
package/dist/index.d.mts CHANGED
@@ -38,6 +38,8 @@ interface FindEmailParams {
38
38
  lastName?: string;
39
39
  linkedinUrl?: string;
40
40
  companyName?: string;
41
+ /** Bypass cached email and verification data for a fresh-provider run. */
42
+ skipCache?: boolean;
41
43
  }
42
44
  interface FindEmailResult {
43
45
  success: boolean;
@@ -63,6 +65,8 @@ interface VerifyEmailResult {
63
65
  raw: Record<string, unknown>;
64
66
  }
65
67
  interface CompanySignalEnrichmentParams {
68
+ /** Resume an existing enrichment without creating another provider run. */
69
+ signalRunId?: string;
66
70
  companyDomain?: string;
67
71
  companyName?: string;
68
72
  researchPrompt?: string;
@@ -93,6 +97,8 @@ interface CompanySignal {
93
97
  }
94
98
  interface CompanySignalEnrichmentResult {
95
99
  success: boolean;
100
+ status?: string;
101
+ signalRunId?: string;
96
102
  company: {
97
103
  name: string | null;
98
104
  domain: string | null;
@@ -111,6 +117,10 @@ interface SignalToCopyParams {
111
117
  campaignOffer: string;
112
118
  researchPrompt?: string;
113
119
  signalRunId?: string;
120
+ /** Bypass cached company signals and start fresh research. */
121
+ skipCache?: boolean;
122
+ /** Opt into slower deep research. Defaults to false. */
123
+ enableDeepSearch?: boolean;
114
124
  waitForResult?: boolean;
115
125
  maxWaitMs?: number;
116
126
  pollIntervalMs?: number;
package/dist/index.d.ts CHANGED
@@ -38,6 +38,8 @@ interface FindEmailParams {
38
38
  lastName?: string;
39
39
  linkedinUrl?: string;
40
40
  companyName?: string;
41
+ /** Bypass cached email and verification data for a fresh-provider run. */
42
+ skipCache?: boolean;
41
43
  }
42
44
  interface FindEmailResult {
43
45
  success: boolean;
@@ -63,6 +65,8 @@ interface VerifyEmailResult {
63
65
  raw: Record<string, unknown>;
64
66
  }
65
67
  interface CompanySignalEnrichmentParams {
68
+ /** Resume an existing enrichment without creating another provider run. */
69
+ signalRunId?: string;
66
70
  companyDomain?: string;
67
71
  companyName?: string;
68
72
  researchPrompt?: string;
@@ -93,6 +97,8 @@ interface CompanySignal {
93
97
  }
94
98
  interface CompanySignalEnrichmentResult {
95
99
  success: boolean;
100
+ status?: string;
101
+ signalRunId?: string;
96
102
  company: {
97
103
  name: string | null;
98
104
  domain: string | null;
@@ -111,6 +117,10 @@ interface SignalToCopyParams {
111
117
  campaignOffer: string;
112
118
  researchPrompt?: string;
113
119
  signalRunId?: string;
120
+ /** Bypass cached company signals and start fresh research. */
121
+ skipCache?: boolean;
122
+ /** Opt into slower deep research. Defaults to false. */
123
+ enableDeepSearch?: boolean;
114
124
  waitForResult?: boolean;
115
125
  maxWaitMs?: number;
116
126
  pollIntervalMs?: number;
package/dist/index.js CHANGED
@@ -386,7 +386,8 @@ var Signaliz = class {
386
386
  first_name: params.firstName,
387
387
  last_name: params.lastName,
388
388
  linkedin_url: params.linkedinUrl,
389
- company_name: params.companyName
389
+ company_name: params.companyName,
390
+ skip_cache: params.skipCache
390
391
  }));
391
392
  const email = typeof data.email === "string" && data.email.trim() ? data.email.trim() : null;
392
393
  const found = Boolean(email) && data.found !== false;
@@ -428,6 +429,7 @@ var Signaliz = class {
428
429
  async enrichCompanySignals(params) {
429
430
  const online = params.online ?? true;
430
431
  const request = compact({
432
+ signal_run_id: params.signalRunId,
431
433
  company_domain: params.companyDomain,
432
434
  company_name: params.companyName,
433
435
  research_prompt: params.researchPrompt,
@@ -439,15 +441,17 @@ var Signaliz = class {
439
441
  enable_outreach_intelligence: params.enableOutreachIntelligence,
440
442
  enable_predictive_intelligence: params.enablePredictiveIntelligence,
441
443
  skip_cache: params.skipCache,
442
- wait_for_result: params.waitForResult !== false,
444
+ // REST always returns a resumable run instead of holding the connection;
445
+ // waitForResult controls this SDK's polling loop below.
446
+ wait_for_result: false,
443
447
  max_wait_ms: params.maxWaitMs
444
448
  });
445
449
  let data = await this.client.post("api/v1/company-signals", request);
446
450
  if (params.waitForResult !== false && data.run_id && isPendingSignalResponse(data)) {
447
451
  const maxWaitMs = Math.max(1e3, params.maxWaitMs ?? 20 * 6e4);
448
- const pollIntervalMs = Math.max(250, params.pollIntervalMs ?? 2e3);
449
452
  const startedAt = Date.now();
450
453
  while (Date.now() - startedAt < maxWaitMs) {
454
+ if (!await waitForNextSignalPoll(data, params.pollIntervalMs, startedAt, maxWaitMs)) break;
451
455
  const status = await this.client.post("api/v1/company-signals", {
452
456
  ...request,
453
457
  signal_run_id: data.run_id
@@ -463,7 +467,7 @@ var Signaliz = class {
463
467
  data = status.output ?? status.result ?? status.data ?? status;
464
468
  break;
465
469
  }
466
- await sleep2(pollIntervalMs);
470
+ data = status;
467
471
  }
468
472
  if (isPendingSignalResponse(data)) {
469
473
  throw new Error(`Company signal enrichment ${data.run_id} did not complete within ${maxWaitMs}ms`);
@@ -471,6 +475,8 @@ var Signaliz = class {
471
475
  }
472
476
  return {
473
477
  success: data.success ?? true,
478
+ status: data.status,
479
+ signalRunId: data.signal_run_id ?? data.run_id,
474
480
  company: {
475
481
  name: data.company?.name ?? params.companyName ?? null,
476
482
  domain: data.company?.domain ?? params.companyDomain ?? null
@@ -502,15 +508,16 @@ var Signaliz = class {
502
508
  title: params.title,
503
509
  campaign_offer: params.campaignOffer,
504
510
  research_prompt: params.researchPrompt,
505
- signal_run_id: params.signalRunId
511
+ signal_run_id: params.signalRunId,
512
+ skip_cache: params.skipCache,
513
+ enable_deep_search: params.enableDeepSearch
506
514
  });
507
515
  let data = await this.client.post("api/v1/signal-to-copy", request);
508
516
  if (params.waitForResult !== false && data.run_id && isPendingSignalResponse(data)) {
509
517
  const maxWaitMs = Math.max(1e3, params.maxWaitMs ?? 20 * 6e4);
510
- const pollIntervalMs = Math.max(250, params.pollIntervalMs ?? 2e3);
511
518
  const startedAt = Date.now();
512
519
  while (Date.now() - startedAt < maxWaitMs) {
513
- await sleep2(pollIntervalMs);
520
+ if (!await waitForNextSignalPoll(data, params.pollIntervalMs, startedAt, maxWaitMs)) break;
514
521
  data = await this.client.post("api/v1/signal-to-copy", {
515
522
  ...request,
516
523
  signal_run_id: data.run_id
@@ -570,6 +577,19 @@ function isCompletedSignalRun(data) {
570
577
  function isFailedSignalRun(data) {
571
578
  return ["failed", "error", "cancelled", "canceled", "crashed", "timed_out"].includes(String(data.status || "").toLowerCase());
572
579
  }
580
+ function signalPollDelayMs(data, override) {
581
+ if (override !== void 0) return Math.max(250, override);
582
+ const retryAfterMs = Number(data.retry_after_ms);
583
+ const nextPollSeconds = Number(data.next_poll_after_seconds);
584
+ const hinted = Number.isFinite(retryAfterMs) && retryAfterMs > 0 ? retryAfterMs : Number.isFinite(nextPollSeconds) && nextPollSeconds > 0 ? nextPollSeconds * 1e3 : 2e3;
585
+ return Math.min(6e4, Math.max(250, hinted));
586
+ }
587
+ async function waitForNextSignalPoll(data, override, startedAt, maxWaitMs) {
588
+ const remainingMs = maxWaitMs - (Date.now() - startedAt);
589
+ if (remainingMs <= 0) return false;
590
+ await sleep2(Math.min(signalPollDelayMs(data, override), remainingMs));
591
+ return Date.now() - startedAt < maxWaitMs;
592
+ }
573
593
  function sleep2(ms) {
574
594
  return new Promise((resolve) => setTimeout(resolve, ms));
575
595
  }
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Signaliz,
3
3
  SignalizError
4
- } from "./chunk-UBQDPJGW.mjs";
4
+ } from "./chunk-GWTSOG6D.mjs";
5
5
  export {
6
6
  Signaliz,
7
7
  SignalizError
@@ -390,7 +390,8 @@ var Signaliz = class {
390
390
  first_name: params.firstName,
391
391
  last_name: params.lastName,
392
392
  linkedin_url: params.linkedinUrl,
393
- company_name: params.companyName
393
+ company_name: params.companyName,
394
+ skip_cache: params.skipCache
394
395
  }));
395
396
  const email = typeof data.email === "string" && data.email.trim() ? data.email.trim() : null;
396
397
  const found = Boolean(email) && data.found !== false;
@@ -432,6 +433,7 @@ var Signaliz = class {
432
433
  async enrichCompanySignals(params) {
433
434
  const online = params.online ?? true;
434
435
  const request = compact({
436
+ signal_run_id: params.signalRunId,
435
437
  company_domain: params.companyDomain,
436
438
  company_name: params.companyName,
437
439
  research_prompt: params.researchPrompt,
@@ -443,15 +445,17 @@ var Signaliz = class {
443
445
  enable_outreach_intelligence: params.enableOutreachIntelligence,
444
446
  enable_predictive_intelligence: params.enablePredictiveIntelligence,
445
447
  skip_cache: params.skipCache,
446
- wait_for_result: params.waitForResult !== false,
448
+ // REST always returns a resumable run instead of holding the connection;
449
+ // waitForResult controls this SDK's polling loop below.
450
+ wait_for_result: false,
447
451
  max_wait_ms: params.maxWaitMs
448
452
  });
449
453
  let data = await this.client.post("api/v1/company-signals", request);
450
454
  if (params.waitForResult !== false && data.run_id && isPendingSignalResponse(data)) {
451
455
  const maxWaitMs = Math.max(1e3, params.maxWaitMs ?? 20 * 6e4);
452
- const pollIntervalMs = Math.max(250, params.pollIntervalMs ?? 2e3);
453
456
  const startedAt = Date.now();
454
457
  while (Date.now() - startedAt < maxWaitMs) {
458
+ if (!await waitForNextSignalPoll(data, params.pollIntervalMs, startedAt, maxWaitMs)) break;
455
459
  const status = await this.client.post("api/v1/company-signals", {
456
460
  ...request,
457
461
  signal_run_id: data.run_id
@@ -467,7 +471,7 @@ var Signaliz = class {
467
471
  data = status.output ?? status.result ?? status.data ?? status;
468
472
  break;
469
473
  }
470
- await sleep2(pollIntervalMs);
474
+ data = status;
471
475
  }
472
476
  if (isPendingSignalResponse(data)) {
473
477
  throw new Error(`Company signal enrichment ${data.run_id} did not complete within ${maxWaitMs}ms`);
@@ -475,6 +479,8 @@ var Signaliz = class {
475
479
  }
476
480
  return {
477
481
  success: data.success ?? true,
482
+ status: data.status,
483
+ signalRunId: data.signal_run_id ?? data.run_id,
478
484
  company: {
479
485
  name: data.company?.name ?? params.companyName ?? null,
480
486
  domain: data.company?.domain ?? params.companyDomain ?? null
@@ -506,15 +512,16 @@ var Signaliz = class {
506
512
  title: params.title,
507
513
  campaign_offer: params.campaignOffer,
508
514
  research_prompt: params.researchPrompt,
509
- signal_run_id: params.signalRunId
515
+ signal_run_id: params.signalRunId,
516
+ skip_cache: params.skipCache,
517
+ enable_deep_search: params.enableDeepSearch
510
518
  });
511
519
  let data = await this.client.post("api/v1/signal-to-copy", request);
512
520
  if (params.waitForResult !== false && data.run_id && isPendingSignalResponse(data)) {
513
521
  const maxWaitMs = Math.max(1e3, params.maxWaitMs ?? 20 * 6e4);
514
- const pollIntervalMs = Math.max(250, params.pollIntervalMs ?? 2e3);
515
522
  const startedAt = Date.now();
516
523
  while (Date.now() - startedAt < maxWaitMs) {
517
- await sleep2(pollIntervalMs);
524
+ if (!await waitForNextSignalPoll(data, params.pollIntervalMs, startedAt, maxWaitMs)) break;
518
525
  data = await this.client.post("api/v1/signal-to-copy", {
519
526
  ...request,
520
527
  signal_run_id: data.run_id
@@ -574,6 +581,19 @@ function isCompletedSignalRun(data) {
574
581
  function isFailedSignalRun(data) {
575
582
  return ["failed", "error", "cancelled", "canceled", "crashed", "timed_out"].includes(String(data.status || "").toLowerCase());
576
583
  }
584
+ function signalPollDelayMs(data, override) {
585
+ if (override !== void 0) return Math.max(250, override);
586
+ const retryAfterMs = Number(data.retry_after_ms);
587
+ const nextPollSeconds = Number(data.next_poll_after_seconds);
588
+ const hinted = Number.isFinite(retryAfterMs) && retryAfterMs > 0 ? retryAfterMs : Number.isFinite(nextPollSeconds) && nextPollSeconds > 0 ? nextPollSeconds * 1e3 : 2e3;
589
+ return Math.min(6e4, Math.max(250, hinted));
590
+ }
591
+ async function waitForNextSignalPoll(data, override, startedAt, maxWaitMs) {
592
+ const remainingMs = maxWaitMs - (Date.now() - startedAt);
593
+ if (remainingMs <= 0) return false;
594
+ await sleep2(Math.min(signalPollDelayMs(data, override), remainingMs));
595
+ return Date.now() - startedAt < maxWaitMs;
596
+ }
577
597
  function sleep2(ms) {
578
598
  return new Promise((resolve) => setTimeout(resolve, ms));
579
599
  }
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Signaliz
4
- } from "./chunk-UBQDPJGW.mjs";
4
+ } from "./chunk-GWTSOG6D.mjs";
5
5
 
6
6
  // src/mcp-config.ts
7
7
  import * as fs from "fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaliz/sdk",
3
- "version": "1.0.22",
3
+ "version": "1.0.24",
4
4
  "description": "Signaliz SDK for Find Email, Verify Email, Company Signal Enrichment, and Signal to Copy AI.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",