@signaliz/cli 1.0.58 → 1.0.61

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 (3) hide show
  1. package/README.md +7 -4
  2. package/dist/bin.js +38 -14
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -115,7 +115,8 @@ REST, MCP, SDK, and CLI recovery. The four row-oriented core products use one
115
115
  recoverable REST job for inputs larger than 25; the CLI waits by default or
116
116
  returns `job_id`, `idempotency_key`, and an exact resume command with
117
117
  `--no-wait`. Find Email, Verify Email, and Company Signal Enrichment use 25-row
118
- pages; Signal to Copy uses 100-row pages. Durable Signal to Copy jobs use
118
+ pages; Signal to Copy uses 100-row pages. Large Find Email and Verify Email
119
+ batches honor `--max-wait-ms` and `--poll-interval-ms`. Durable Signal to Copy jobs use
119
120
  persisted, eligible company-signal data only and never start live providers or
120
121
  deep research. Large Copy inputs with fresh, deep, skip-cache, per-row
121
122
  idempotency, or synchronous-only controls fail locally before HTTP; split those
@@ -127,9 +128,11 @@ diagnostics; use `--include-candidate-evidence` only with batches of at most 25.
127
128
  Every command uses the authenticated workspace. Find Email and Verify Email
128
129
  honor that workspace's configured cache window; eligible hits cost 0 credits,
129
130
  while fresh discovery or verification is charged on every plan. Builder, Team,
130
- Agency, and Pay-As-You-Go include fresh Company Signals and Signal to Copy. Those plans
131
- still check eligible workspace signal data first even when Company Signals is
132
- set to No cache. `--lookback-days` remains a hard evidence-age bound for both
131
+ Agency, and Pay-As-You-Go include fresh Company Signals. Team and Agency also
132
+ include Unlimited Signal to Copy AI; Signal to Copy remains callable on other
133
+ plans under the standard product contract. These plans still check eligible
134
+ workspace signal data first even when Company Signals is set to No cache.
135
+ `--lookback-days` remains a hard evidence-age bound for both
133
136
  cached and fresh Company Signals and Signal to Copy results.
134
137
 
135
138
  Signals Everything is a query-first company discovery command rather than a
package/dist/bin.js CHANGED
@@ -95,6 +95,12 @@ function numberFlag(name) {
95
95
  if (!Number.isFinite(parsed)) fail(`--${name} must be a number`);
96
96
  return parsed;
97
97
  }
98
+ function requireIntegerInRange(value, name, minimum, maximum) {
99
+ if (value === void 0) return;
100
+ if (!Number.isInteger(value) || value < minimum || value > maximum) {
101
+ throw new RangeError(`${name} must be an integer between ${minimum} and ${maximum}`);
102
+ }
103
+ }
98
104
  function csvFlag(name) {
99
105
  const value = flag(name);
100
106
  return value?.split(",").map((item) => item.trim()).filter(Boolean);
@@ -491,9 +497,9 @@ function normalizeSignalsEverythingResult(request, value) {
491
497
  source: stringValue(item.source)
492
498
  };
493
499
  }).filter((item) => Boolean(item.url)) : [];
494
- const eventDate = stringValue(signal.event_date || signal.date) || evidence[0]?.publishedAt || "";
495
- const sourceUrl = stringValue(signal.source_url || signal.url) || evidence[0]?.url || null;
496
- if (!eventDate || !sourceUrl || !evidence.some((item) => Boolean(item.publishedAt))) {
500
+ const eventDate = stringValue(signal.event_date || signal.date);
501
+ const sourceUrl = stringValue(signal.source_url || signal.url);
502
+ if (!eventDate || !sourceUrl || !evidence.some((item) => item.url === sourceUrl && item.publishedAt === eventDate)) {
497
503
  throw new Error("Signals Everything response violated the dated-evidence and source-URL contract.");
498
504
  }
499
505
  return {
@@ -516,6 +522,7 @@ function normalizeSignalsEverythingResult(request, value) {
516
522
  const status = statuses.has(statusValue) ? statusValue : signals2.length > 0 ? "completed" : "failed";
517
523
  const guardrail = record(value.cost_guardrail);
518
524
  const maxCost = numberValue(guardrail.max_cost_per_qualified_signal_usd);
525
+ const costSource = stringValue(guardrail.cost_source);
519
526
  const identityCostSource = stringValue(guardrail.identity_cost_source);
520
527
  const warnings = Array.isArray(value.warnings) ? value.warnings.filter((warning) => typeof warning === "string") : void 0;
521
528
  return {
@@ -533,6 +540,13 @@ function normalizeSignalsEverythingResult(request, value) {
533
540
  ...maxCost === void 0 ? {} : {
534
541
  costGuardrail: {
535
542
  maxCostPerQualifiedSignalUsd: maxCost,
543
+ projectedSourceCostUsd: nullableNumberValue(guardrail.projected_source_cost_usd),
544
+ maxSourceCostUsd: nullableNumberValue(guardrail.max_source_cost_usd),
545
+ projectedCostPerRequestedCompanySignalUsd: nullableNumberValue(
546
+ guardrail.projected_cost_per_requested_company_signal_usd
547
+ ),
548
+ sourceCostUsd: nullableNumberValue(guardrail.source_cost_usd),
549
+ costSource: ["observed", "catalog_preflight", "catalog_bounded", "mixed", "unavailable"].includes(costSource) ? costSource : void 0,
536
550
  costPerQualifiedSignalUsd: nullableNumberValue(guardrail.cost_per_qualified_signal_usd),
537
551
  identityResolutionCostUsd: nullableNumberValue(guardrail.identity_resolution_cost_usd),
538
552
  identityCostSource: [
@@ -541,7 +555,13 @@ function normalizeSignalsEverythingResult(request, value) {
541
555
  "not_used",
542
556
  "unavailable"
543
557
  ].includes(identityCostSource) ? identityCostSource : void 0,
544
- identityProviderRequests: numberValue(guardrail.identity_provider_requests)
558
+ identityProviderRequests: numberValue(guardrail.identity_provider_requests),
559
+ qualifiedCompanySignalCount: numberValue(guardrail.qualified_company_signal_count),
560
+ returnedCompanySignalCount: numberValue(guardrail.returned_company_signal_count),
561
+ availableCompanySignalCount: numberValue(guardrail.available_company_signal_count),
562
+ acquisitionCandidateLimit: numberValue(guardrail.acquisition_candidate_limit),
563
+ minimumQualifiedCompanySignals: numberValue(guardrail.minimum_qualified_company_signals),
564
+ withinLimit: guardrail.within_limit === true
545
565
  }
546
566
  },
547
567
  ...warnings?.length ? { warnings } : {},
@@ -693,8 +713,7 @@ async function findEmail() {
693
713
  "linkedin-url",
694
714
  "company-name",
695
715
  "run-id",
696
- "skip-cache",
697
- "idempotency-key"
716
+ "skip-cache"
698
717
  ].filter(hasFlag);
699
718
  if (conflicts.length > 0) {
700
719
  fail(`Find Email --job-id cannot be combined with ${conflicts.map((name) => `--${name}`).join(", ")}.`);
@@ -703,7 +722,8 @@ async function findEmail() {
703
722
  pageSize: numberFlag("page-size"),
704
723
  maxWaitMs: numberFlag("max-wait-ms"),
705
724
  pollIntervalMs: numberFlag("poll-interval-ms"),
706
- compactDuplicates: !hasFlag("expand-duplicates")
725
+ compactDuplicates: !hasFlag("expand-duplicates"),
726
+ idempotencyKey: flag("idempotency-key")
707
727
  });
708
728
  batchOutput(customerEmailBatch(result2, "find"));
709
729
  return;
@@ -792,7 +812,6 @@ async function verifyEmail(args) {
792
812
  "email",
793
813
  "verification-run-id",
794
814
  "skip-cache",
795
- "idempotency-key",
796
815
  "no-wait"
797
816
  ].filter(hasFlag);
798
817
  if (positionalEmail || conflicts.length > 0) {
@@ -806,7 +825,8 @@ async function verifyEmail(args) {
806
825
  pageSize: numberFlag("page-size"),
807
826
  maxWaitMs: numberFlag("max-wait-ms"),
808
827
  pollIntervalMs: numberFlag("poll-interval-ms"),
809
- compactDuplicates: !hasFlag("expand-duplicates")
828
+ compactDuplicates: !hasFlag("expand-duplicates"),
829
+ idempotencyKey: flag("idempotency-key")
810
830
  });
811
831
  batchOutput(customerEmailBatch(result2, "verify"));
812
832
  return;
@@ -937,8 +957,8 @@ async function companySignals() {
937
957
  companyName: row.companyName || row.company_name || row.name,
938
958
  researchPrompt: row.researchPrompt || row.research_prompt || flag("research-prompt") || flag("prompt"),
939
959
  signalTypes: row.signalTypes || row.signal_types || csvFlag("signal-types"),
940
- targetSignalCount: row.targetSignalCount || row.target_signal_count || numberFlag("target-signal-count"),
941
- lookbackDays: row.lookbackDays || row.lookback_days || numberFlag("lookback-days"),
960
+ targetSignalCount: row.targetSignalCount ?? row.target_signal_count ?? numberFlag("target-signal-count"),
961
+ lookbackDays: row.lookbackDays ?? row.lookback_days ?? numberFlag("lookback-days"),
942
962
  online,
943
963
  enableDeepSearch: row.enableDeepSearch ?? row.enable_deep_search ?? (online && !hasFlag("shallow")),
944
964
  searchMode: companySignalSearchMode(row.searchMode ?? row.search_mode ?? flag("search-mode")),
@@ -947,10 +967,14 @@ async function companySignals() {
947
967
  enablePredictiveIntelligence: row.enablePredictiveIntelligence ?? row.enable_predictive_intelligence,
948
968
  skipCache: row.skipCache ?? row.skip_cache ?? hasFlag("skip-cache"),
949
969
  includeCandidateEvidence: row.includeCandidateEvidence ?? row.include_candidate_evidence ?? hasFlag("include-candidate-evidence"),
950
- maxWaitMs: row.maxWaitMs || row.max_wait_ms || (durableBatch ? void 0 : numberFlag("max-wait-ms")),
970
+ maxWaitMs: row.maxWaitMs ?? row.max_wait_ms ?? (durableBatch ? void 0 : numberFlag("max-wait-ms")),
951
971
  idempotencyKey: row.idempotencyKey || row.idempotency_key
952
972
  };
953
973
  });
974
+ for (const request2 of requests) {
975
+ requireIntegerInRange(request2.targetSignalCount, "targetSignalCount", 1, 15);
976
+ requireIntegerInRange(request2.lookbackDays, "lookbackDays", 1, 365);
977
+ }
954
978
  if (hasFlag("dry-run")) {
955
979
  if (hasFlag("no-wait")) fail("Company Signals --no-wait cannot be combined with --dry-run.");
956
980
  const result3 = await createClient().enrichCompanies(requests, { ...batchOptions(), dryRun: true });
@@ -1181,11 +1205,11 @@ async function signalToCopy() {
1181
1205
  title: row.title,
1182
1206
  campaignOffer: row.campaignOffer || row.campaign_offer || row.offer,
1183
1207
  researchPrompt: row.researchPrompt || row.research_prompt || flag("research-prompt") || flag("prompt"),
1184
- lookbackDays: row.lookbackDays || row.lookback_days || numberFlag("lookback-days"),
1208
+ lookbackDays: row.lookbackDays ?? row.lookback_days ?? numberFlag("lookback-days"),
1185
1209
  signalRunId: row.signalRunId || row.signal_run_id,
1186
1210
  skipCache: row.skipCache ?? row.skip_cache ?? hasFlag("skip-cache"),
1187
1211
  enableDeepSearch: row.enableDeepSearch ?? row.enable_deep_search ?? hasFlag("deep-search"),
1188
- maxWaitMs: row.maxWaitMs || row.max_wait_ms || (durableBatch ? void 0 : numberFlag("max-wait-ms")),
1212
+ maxWaitMs: row.maxWaitMs ?? row.max_wait_ms ?? (durableBatch ? void 0 : numberFlag("max-wait-ms")),
1189
1213
  idempotencyKey: row.idempotencyKey || row.idempotency_key
1190
1214
  };
1191
1215
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaliz/cli",
3
- "version": "1.0.58",
3
+ "version": "1.0.61",
4
4
  "description": "Signaliz CLI for Signals Everything, Find Email, Verify Email, Company Signal Enrichment, and Signal to Copy AI.",
5
5
  "bin": {
6
6
  "signaliz": "dist/bin.js"
@@ -29,7 +29,7 @@
29
29
  "node": ">=18"
30
30
  },
31
31
  "dependencies": {
32
- "@signaliz/sdk": "^1.0.62"
32
+ "@signaliz/sdk": "^1.0.63"
33
33
  },
34
34
  "devDependencies": {
35
35
  "tsup": "^8.0.0",