@signaliz/sdk 1.0.52 → 1.0.54

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.
@@ -70,7 +70,11 @@ function publicRetryDetails(body) {
70
70
  const details = {
71
71
  ...body?.retry_eligible !== void 0 ? { retry_eligible: body.retry_eligible } : {},
72
72
  ...body?.retry_after !== void 0 ? { retry_after: body.retry_after } : {},
73
- ...body?.retry_after_seconds !== void 0 ? { retry_after_seconds: body.retry_after_seconds } : {}
73
+ ...body?.retry_after_seconds !== void 0 ? { retry_after_seconds: body.retry_after_seconds } : {},
74
+ ...body?.run_id !== void 0 ? { run_id: body.run_id } : {},
75
+ ...body?.signal_run_id !== void 0 ? { signal_run_id: body.signal_run_id } : {},
76
+ ...body?.company_signal_run_id !== void 0 ? { company_signal_run_id: body.company_signal_run_id } : {},
77
+ ...body?.resume_context_persisted !== void 0 ? { resume_context_persisted: body.resume_context_persisted } : {}
74
78
  };
75
79
  return Object.keys(details).length > 0 ? details : void 0;
76
80
  }
@@ -495,6 +499,14 @@ var Signaliz = class {
495
499
  assertTerminalSignalResponse(data, "Company Signals");
496
500
  return normalizeCompanySignalResult(params, data);
497
501
  }
502
+ async discoverSignals(params) {
503
+ validateSignalDiscoveryParams(params);
504
+ const data = await this.client.post(
505
+ "api/v1/signals",
506
+ signalDiscoveryRequestBody(params)
507
+ );
508
+ return normalizeSignalDiscoveryResult(params, data);
509
+ }
498
510
  async enrichCompanies(companies, options) {
499
511
  validateBatchSize(companies);
500
512
  companies.forEach((params) => validateCoreProductMaxWaitMs(params.maxWaitMs));
@@ -555,10 +567,7 @@ var Signaliz = class {
555
567
  request: signalToCopyRequestBody(params)
556
568
  }));
557
569
  const uniqueRequests = deduplicated.uniqueItems;
558
- const requiresFreshResearch = uniqueRequests.some(
559
- (request) => request.skipCache === true || request.enableDeepSearch === true
560
- );
561
- const uniqueResults = uniqueRequests.length > 25 && !requiresFreshResearch ? await this.runRecoverableSignalCopyBatch(uniqueRequests, options) : await this.runSignalCopyBatchChunks(uniqueRequests, options);
570
+ const uniqueResults = await this.runSignalCopyBatchChunks(uniqueRequests, options);
562
571
  const results = requests.map((_, index) => ({
563
572
  ...uniqueResults[deduplicated.sourceIndexByInput[index]],
564
573
  index
@@ -589,7 +598,7 @@ var Signaliz = class {
589
598
  for (let offset = 0; offset < uniqueRequests.length; offset += 25) {
590
599
  chunks.push({ offset, requests: uniqueRequests.slice(offset, offset + 25) });
591
600
  }
592
- const { serverConcurrency, chunkConcurrency } = batchConcurrencyPlan(options);
601
+ const { serverConcurrency, chunkConcurrency } = batchConcurrencyPlan(options, 25, 25);
593
602
  const chunkBatch = await runBatch(
594
603
  chunks,
595
604
  (chunk) => this.runSignalCopyBatchChunk(chunk.requests, serverConcurrency),
@@ -684,35 +693,6 @@ var Signaliz = class {
684
693
  if (seen.size !== requests.length) throw new Error(`${label} batch returned incomplete indexed results`);
685
694
  return rows;
686
695
  }
687
- async runRecoverableSignalCopyBatch(requests, options) {
688
- const rows = await this.runRecoverableCoreBatchJob(
689
- "api/v1/signal-to-copy",
690
- requests.map(signalToCopyRequestBody),
691
- "Signal to Copy",
692
- 100,
693
- 20 * 6e4,
694
- options?.idempotencyKey
695
- );
696
- const results = new Array(requests.length);
697
- for (const row of rows) {
698
- const index = Number(row.index);
699
- if (recoverableJobRowFailed(row)) {
700
- results[index] = batchItemFailure(
701
- index,
702
- row.error || row._error || row.message || row.failure_reason || "Signal to Copy item failed",
703
- row
704
- );
705
- continue;
706
- }
707
- try {
708
- assertTerminalSignalResponse(row, "Signal to Copy");
709
- results[index] = { index, success: true, data: normalizeSignalToCopyResult(row) };
710
- } catch (error) {
711
- results[index] = batchItemFailure(index, error instanceof Error ? error.message : String(error), row);
712
- }
713
- }
714
- return results;
715
- }
716
696
  async runSignalCopyBatchChunk(requests, concurrency, rowRateLimitAttempt = 0) {
717
697
  const results = new Array(requests.length);
718
698
  const rateLimited = [];
@@ -762,12 +742,11 @@ var Signaliz = class {
762
742
  return results;
763
743
  }
764
744
  async runCoreBatchRound(path2, tasks, options, rowRateLimitAttempt = 0) {
765
- const { serverConcurrency, chunkConcurrency } = batchConcurrencyPlan(options);
745
+ const { serverConcurrency, chunkConcurrency } = path2 === "api/v1/company-signals" ? batchConcurrencyPlan(options, 25, 25) : batchConcurrencyPlan(options);
766
746
  const deduplicated = dedupeExactBatchItems(tasks, (task) => JSON.stringify(task.request));
767
747
  const uniqueTasks = deduplicated.uniqueItems;
768
- const recoverableBatch = path2 === "api/v1/find-email" ? { label: "Find Email", pageSize: 500, maxWaitMs: 20 * 6e4 } : path2 === "api/v1/verify-email" ? { label: "Verify Email", pageSize: 500, maxWaitMs: 20 * 6e4 } : path2 === "api/v1/company-signals" ? { label: "Company Signals", pageSize: 25, maxWaitMs: 20 * 6e4 } : void 0;
769
- const containsSignalRunRecovery = path2 === "api/v1/company-signals" && uniqueTasks.some((task) => Boolean(task.request.signal_run_id));
770
- if (recoverableBatch && uniqueTasks.length > 25 && !containsSignalRunRecovery) {
748
+ const recoverableBatch = path2 === "api/v1/find-email" ? { label: "Find Email", pageSize: 500, maxWaitMs: 20 * 6e4 } : path2 === "api/v1/verify-email" ? { label: "Verify Email", pageSize: 500, maxWaitMs: 20 * 6e4 } : void 0;
749
+ if (path2 !== "api/v1/company-signals" && recoverableBatch && uniqueTasks.length > 25) {
771
750
  const rows = await this.runRecoverableCoreBatchJob(
772
751
  path2,
773
752
  uniqueTasks.map((task) => task.request),
@@ -1032,6 +1011,7 @@ function companySignalRequestBody(params) {
1032
1011
  enable_outreach_intelligence: params.enableOutreachIntelligence,
1033
1012
  enable_predictive_intelligence: params.enablePredictiveIntelligence,
1034
1013
  skip_cache: params.skipCache,
1014
+ include_candidate_evidence: params.includeCandidateEvidence,
1035
1015
  wait_for_result: true,
1036
1016
  max_wait_ms: params.maxWaitMs,
1037
1017
  dry_run: params.dryRun,
@@ -1049,7 +1029,6 @@ function normalizeCompanySignalResult(params, data) {
1049
1029
  domain: data.company?.domain ?? params.companyDomain ?? null
1050
1030
  },
1051
1031
  signals: rawSignals.map((signal) => {
1052
- const metadata = signal.metadata && typeof signal.metadata === "object" && !Array.isArray(signal.metadata) ? signal.metadata : void 0;
1053
1032
  return {
1054
1033
  id: signal.id,
1055
1034
  title: signal.title ?? "",
@@ -1058,43 +1037,160 @@ function normalizeCompanySignalResult(params, data) {
1058
1037
  date: signal.date ?? null,
1059
1038
  detectedAt: signal.detected_at ?? null,
1060
1039
  datePrecision: signal.date_precision,
1061
- hasSpecificDate: signal.has_specific_date ?? metadata?.has_specific_date,
1062
1040
  sourceUrl: signal.source_url ?? signal.url ?? null,
1063
1041
  sourceType: signal.source_type,
1064
- sourceProvenance: signal.source_provenance,
1065
1042
  confidence: signal.confidence ?? signal.confidence_score ?? null,
1066
- entityConfidence: signal.entity_confidence ?? metadata?.entity_confidence ?? null,
1067
1043
  signalFamily: signal.signal_family,
1068
1044
  eventType: signal.signal_event_type,
1069
1045
  eventLabel: signal.signal_event_label,
1070
- classification: signal.signal_classification ?? null,
1071
- derived: signal.derived === true,
1072
- evidencePublishedDate: signal.evidence_published_date ?? metadata?.evidence_published_date ?? null,
1073
- signalFeedSource: signal.signal_feed_source ?? metadata?.signal_feed_source,
1074
- metadata
1046
+ classification: signal.signal_classification ?? null
1075
1047
  };
1076
1048
  }),
1077
1049
  signalCount: data.signal_count ?? data.total_signals ?? rawSignals.length,
1078
1050
  signalSummary: data.signal_summary ?? null,
1079
- signalSummarySource: data.signal_summary_source,
1080
1051
  intelligence: data.intelligence ?? null,
1081
1052
  copyFuel: data.copy_fuel ?? null,
1082
1053
  evidenceValidation: data.evidence_validation,
1083
- evidenceSources: data.evidence_sources,
1084
- credits: data.credits,
1085
- creditsUsed: data.credits_used,
1086
- costUsd: data.cost_usd,
1087
- billingMetadata: data.billing_metadata,
1088
- resultReturnedFrom: data.result_returned_from,
1089
- cacheHit: data.cache_hit,
1090
- freshEnrichmentUsed: data.fresh_enrichment_used,
1091
- liveProviderCalled: data.live_provider_called,
1092
- aiProviderCalled: data.ai_provider_called,
1093
- byoAiUsed: data.byo_ai_used,
1094
- metadata: data.metadata,
1054
+ evidenceSources: data.metadata?.evidence_sources ?? data.evidence_sources,
1055
+ evidenceCount: data.evidence_count,
1056
+ evidenceCountTotal: data.evidence_count_total,
1057
+ evidenceSourcesOmitted: data.evidence_sources_omitted,
1058
+ evidenceScope: data.evidence_scope,
1095
1059
  raw: data
1096
1060
  };
1097
1061
  }
1062
+ var SIGNAL_DISCOVERY_SOURCES = /* @__PURE__ */ new Set(["web", "news"]);
1063
+ var SIGNAL_DISCOVERY_STATUSES = /* @__PURE__ */ new Set([
1064
+ "planned",
1065
+ "queued",
1066
+ "processing",
1067
+ "completed",
1068
+ "completed_with_warnings",
1069
+ "failed"
1070
+ ]);
1071
+ function validateSignalDiscoveryParams(params) {
1072
+ const runId = typeof params.signalSearchRunId === "string" ? params.signalSearchRunId.trim() : "";
1073
+ const query = typeof params.query === "string" ? params.query.trim() : "";
1074
+ if (!runId && !query) {
1075
+ throw new TypeError("Signals Everything requires query or signalSearchRunId");
1076
+ }
1077
+ if (query && (query.length < 2 || query.length > 2e3)) {
1078
+ throw new RangeError("query must contain between 2 and 2000 characters");
1079
+ }
1080
+ if (params.limit !== void 0 && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 1e3)) {
1081
+ throw new RangeError("limit must be an integer between 1 and 1000");
1082
+ }
1083
+ if (params.lookbackDays !== void 0 && (!Number.isInteger(params.lookbackDays) || params.lookbackDays < 1 || params.lookbackDays > 365)) {
1084
+ throw new RangeError("lookbackDays must be an integer between 1 and 365");
1085
+ }
1086
+ if (params.sources !== void 0 && (!Array.isArray(params.sources) || params.sources.length < 1 || params.sources.length > 2 || params.sources.some((source) => !SIGNAL_DISCOVERY_SOURCES.has(source)))) {
1087
+ throw new TypeError("sources must contain only web or news");
1088
+ }
1089
+ }
1090
+ function signalDiscoveryRequestBody(params) {
1091
+ const runId = typeof params.signalSearchRunId === "string" ? params.signalSearchRunId.trim() : "";
1092
+ if (runId) {
1093
+ return compact({
1094
+ signal_search_run_id: runId,
1095
+ dry_run: params.dryRun,
1096
+ idempotency_key: params.idempotencyKey
1097
+ });
1098
+ }
1099
+ return compact({
1100
+ query: params.query?.trim(),
1101
+ limit: params.limit ?? 100,
1102
+ sources: params.sources,
1103
+ lookback_days: params.lookbackDays,
1104
+ dry_run: params.dryRun,
1105
+ idempotency_key: params.idempotencyKey
1106
+ });
1107
+ }
1108
+ function normalizeSignalDiscoveryResult(params, data) {
1109
+ const rawSignals = Array.isArray(data.signals) ? data.signals : [];
1110
+ const rawStatus = String(data.status || "").toLowerCase();
1111
+ const status = SIGNAL_DISCOVERY_STATUSES.has(rawStatus) ? rawStatus : rawSignals.length > 0 ? "completed" : "failed";
1112
+ const signals = rawSignals.map(normalizeSignalDiscoverySignal);
1113
+ return {
1114
+ success: data.success !== false,
1115
+ status,
1116
+ capability: "signals_everything",
1117
+ signalSearchRunId: String(data.signal_search_run_id ?? params.signalSearchRunId ?? ""),
1118
+ query: String(data.query ?? params.query ?? ""),
1119
+ requestedCount: Number(data.requested_count ?? params.limit ?? 100),
1120
+ nextPollAfterSeconds: typeof data.next_poll_after_seconds === "number" ? data.next_poll_after_seconds : void 0,
1121
+ signals,
1122
+ signalCount: signals.length,
1123
+ sourceLanes: Array.isArray(data.source_lanes) ? data.source_lanes.filter((lane) => typeof lane === "string") : void 0,
1124
+ evidenceValidation: data.evidence_validation && typeof data.evidence_validation === "object" ? data.evidence_validation : void 0,
1125
+ costGuardrail: normalizeSignalDiscoveryCostGuardrail(data.cost_guardrail),
1126
+ warnings: Array.isArray(data.warnings) ? data.warnings.filter((warning) => typeof warning === "string") : void 0,
1127
+ raw: data
1128
+ };
1129
+ }
1130
+ function normalizeSignalDiscoveryCostGuardrail(value) {
1131
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
1132
+ const guardrail = value;
1133
+ const maxCost = Number(guardrail.max_cost_per_qualified_signal_usd);
1134
+ const withinLimit = guardrail.within_limit === true;
1135
+ if (!Number.isFinite(maxCost)) return void 0;
1136
+ const numberOrNullable = (candidate) => {
1137
+ if (candidate === null) return null;
1138
+ const numeric = Number(candidate);
1139
+ return Number.isFinite(numeric) ? numeric : void 0;
1140
+ };
1141
+ const numberOrUndefined = (candidate) => {
1142
+ const numeric = Number(candidate);
1143
+ return Number.isFinite(numeric) ? numeric : void 0;
1144
+ };
1145
+ return {
1146
+ maxCostPerQualifiedSignalUsd: maxCost,
1147
+ projectedSourceCostUsd: numberOrNullable(guardrail.projected_source_cost_usd),
1148
+ maxSourceCostUsd: numberOrNullable(guardrail.max_source_cost_usd),
1149
+ projectedCostPerRequestedCompanySignalUsd: numberOrNullable(
1150
+ guardrail.projected_cost_per_requested_company_signal_usd
1151
+ ),
1152
+ sourceCostUsd: numberOrNullable(guardrail.source_cost_usd),
1153
+ costSource: ["observed", "catalog_bounded", "mixed", "unavailable"].includes(String(guardrail.cost_source)) ? String(guardrail.cost_source) : void 0,
1154
+ qualifiedCompanySignalCount: numberOrUndefined(guardrail.qualified_company_signal_count),
1155
+ returnedCompanySignalCount: numberOrUndefined(guardrail.returned_company_signal_count),
1156
+ costPerQualifiedSignalUsd: numberOrNullable(guardrail.cost_per_qualified_signal_usd),
1157
+ withinLimit
1158
+ };
1159
+ }
1160
+ function normalizeSignalDiscoverySignal(value) {
1161
+ const signal = value && typeof value === "object" && !Array.isArray(value) ? value : {};
1162
+ const company = signal.company && typeof signal.company === "object" && !Array.isArray(signal.company) ? signal.company : {};
1163
+ const companyName = String(company.name ?? signal.company_name ?? "").trim();
1164
+ const companyDomain = String(company.domain ?? signal.company_domain ?? "").trim();
1165
+ if (!companyName || !companyDomain) {
1166
+ throw new Error("Signals Everything response violated the company attribution contract.");
1167
+ }
1168
+ return {
1169
+ id: signal.id,
1170
+ company: {
1171
+ name: companyName,
1172
+ domain: companyDomain,
1173
+ linkedinUrl: company.linkedin_url ?? signal.company_linkedin_url ?? void 0
1174
+ },
1175
+ title: signal.title ?? "",
1176
+ type: signal.type ?? signal.signal_type ?? "unknown",
1177
+ summary: signal.summary ?? signal.content ?? signal.description ?? "",
1178
+ eventDate: signal.event_date ?? signal.date ?? signal.signal_date ?? null,
1179
+ evidence: Array.isArray(signal.evidence) ? signal.evidence.map((item) => ({
1180
+ url: String(item?.url ?? ""),
1181
+ publishedAt: String(item?.published_at ?? item?.publishedAt ?? ""),
1182
+ source: String(item?.source ?? "")
1183
+ })).filter((item) => Boolean(item.url)) : [],
1184
+ content: signal.summary ?? signal.content ?? signal.description ?? "",
1185
+ date: signal.event_date ?? signal.date ?? signal.signal_date ?? null,
1186
+ detectedAt: signal.event_date ?? signal.detected_at ?? null,
1187
+ sourceUrl: signal.source_url ?? signal.url ?? null,
1188
+ sourceType: signal.source_type ?? null,
1189
+ confidence: signal.confidence ?? signal.confidence_score ?? null,
1190
+ classification: signal.signal_classification ?? signal.classification ?? null,
1191
+ raw: signal
1192
+ };
1193
+ }
1098
1194
  function validateBatchSize(items) {
1099
1195
  if (!Array.isArray(items) || items.length === 0) {
1100
1196
  throw new Error("Signaliz batch requests require at least one item");
@@ -1110,9 +1206,9 @@ function validatedBatchConcurrency(options) {
1110
1206
  }
1111
1207
  return concurrency;
1112
1208
  }
1113
- function batchConcurrencyPlan(options) {
1114
- const concurrency = validatedBatchConcurrency(options);
1115
- const serverConcurrency = Math.min(10, concurrency);
1209
+ function batchConcurrencyPlan(options, defaultConcurrency = 10, maximumServerConcurrency = 10) {
1210
+ const concurrency = options?.concurrency === void 0 ? defaultConcurrency : validatedBatchConcurrency(options);
1211
+ const serverConcurrency = Math.min(maximumServerConcurrency, concurrency);
1116
1212
  return {
1117
1213
  serverConcurrency,
1118
1214
  chunkConcurrency: Math.max(1, Math.floor(concurrency / serverConcurrency))
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Signaliz
4
- } from "./chunk-IFHOCPIP.mjs";
4
+ } from "./chunk-W4JH6JJA.mjs";
5
5
 
6
6
  // src/mcp-config.ts
7
7
  import * as fs from "fs";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@signaliz/sdk",
3
- "version": "1.0.52",
4
- "description": "Signaliz SDK for Find Email, Verify Email, Company Signal Enrichment, and Signal to Copy AI.",
3
+ "version": "1.0.54",
4
+ "description": "Signaliz SDK for Signals Everything, Find Email, Verify Email, Company Signal Enrichment, and Signal to Copy AI.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
@@ -24,7 +24,8 @@
24
24
  "email-finder",
25
25
  "email-verification",
26
26
  "company-signals",
27
- "signal-to-copy"
27
+ "signal-to-copy",
28
+ "signals-everything"
28
29
  ],
29
30
  "license": "MIT",
30
31
  "repository": {