@signaliz/cli 1.0.17 → 1.0.18

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 +8 -1
  2. package/dist/bin.js +49 -0
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -7,6 +7,12 @@ provider routing for Nango-managed customer API destinations, MCP/Ops
7
7
  observability, enrichment primitives, and live email verification at 0.02 fresh
8
8
  enrichment credits when a new verification is needed.
9
9
 
10
+ Monthly plans include unlimited cache search, Campaign Builder, API, MCP, CLI,
11
+ Ops, and integrations. Team is the $499/month public plan and adds unlimited
12
+ live Find People and Find Companies in Signaliz; Agency stays $999/month with
13
+ higher credits and throughput. Fresh credits are used only when Signaliz
14
+ creates, verifies, or fetches new premium data.
15
+
10
16
  Fresh enrichment throughput now allows Free 60/min, Builder 300/min, Team
11
17
  600/min, Agency 1,000/min, and Pay-As-You-Go 1,000/min, with a 5,000/hour
12
18
  workspace safety cap.
@@ -183,7 +189,8 @@ signaliz lead local \
183
189
  # Poll async lead jobs
184
190
  signaliz lead status <job_id>
185
191
 
186
- # Verify or find emails
192
+ # Verify or find emails. `email find` uses the V3 waterfall:
193
+ # primary discovery, secondary enrichment, verified guesses, then paid fallback if needed.
187
194
  signaliz email verify jane@example.com
188
195
  signaliz email verify-batch --emails jane@example.com,sam@example.com
189
196
  signaliz email status <job_id>
package/dist/bin.js CHANGED
@@ -479,6 +479,32 @@ function layerCommand(layer) {
479
479
  const normalized = String(layer || "sender").trim() || "sender";
480
480
  return `signaliz connect --layer ${normalized}`;
481
481
  }
482
+ function campaignSourcePlanRecord(result) {
483
+ const root = record(result);
484
+ const plan = record(root.sourcePlan ?? root.source_plan);
485
+ if (Object.keys(plan).length > 0) return plan;
486
+ return record(record(root.plan).source_plan);
487
+ }
488
+ function campaignSourceRouteRecords(result) {
489
+ const root = record(result);
490
+ const plan = campaignSourcePlanRecord(result);
491
+ return firstArray(root.sourceRoutes, root.source_routes, plan.routes).filter((route) => route && typeof route === "object" && !Array.isArray(route)).sort((a, b) => Number(a.priority ?? 0) - Number(b.priority ?? 0));
492
+ }
493
+ function campaignSourceSummary(result) {
494
+ const plan = campaignSourcePlanRecord(result);
495
+ if (Object.keys(plan).length === 0) return void 0;
496
+ const decision = record(plan.route_decision);
497
+ const intent = capitalizeLabel(plan.intent);
498
+ const reason = String(decision.selected_reason || "").trim();
499
+ return [intent, reason].filter(Boolean).join(" - ");
500
+ }
501
+ function campaignSourceRouteLine(route) {
502
+ const role = capitalizeLabel(route.role);
503
+ const tool = labelize(route.tool || "source");
504
+ const providers = firstArray(route.providers).map(labelize).filter(Boolean).join(" + ");
505
+ const fallback = typeof route.fallback_when === "string" && route.fallback_when.trim() ? ` (${route.fallback_when.trim()})` : "";
506
+ return `${role ? `${role}: ` : ""}${tool}${providers ? ` via ${providers}` : ""}${fallback}`;
507
+ }
482
508
  function blockedRouteLayers(result) {
483
509
  const root = record(result);
484
510
  const providerActivation = record(root.provider_activation);
@@ -2892,6 +2918,11 @@ async function campaignBuild() {
2892
2918
  console.log("\u2713 Campaign dry-run plan ready");
2893
2919
  console.log(` Requested: ${result.requestedTargetCount ?? config.targetCount ?? 50} leads`);
2894
2920
  console.log(` Planned: ${result.plannedTargetCount ?? result.requestedTargetCount ?? config.targetCount ?? 50} leads`);
2921
+ const sourceSummary = campaignSourceSummary(result);
2922
+ if (sourceSummary) console.log(` Source: ${sourceSummary}`);
2923
+ for (const [index, route] of campaignSourceRouteRecords(result).slice(0, 4).entries()) {
2924
+ console.log(` Route ${index + 1}: ${campaignSourceRouteLine(route)}`);
2925
+ }
2895
2926
  if (result.estimatedCredits !== void 0) console.log(` Credits: ~${result.estimatedCredits}`);
2896
2927
  if (result.estimatedDurationSeconds !== void 0) console.log(` Duration: ~${result.estimatedDurationSeconds}s`);
2897
2928
  if (result.learningHoldout?.enabled) console.log(` Holdout: enabled (${Math.round(Number(result.learningHoldout.control_percentage || 0) * 100)}% control)`);
@@ -4227,6 +4258,7 @@ function printCampaignAgentBuildStatus(status) {
4227
4258
  if (status.campaignId) console.log(`Campaign ID: ${status.campaignId}`);
4228
4259
  console.log(`Status: ${status.status}`);
4229
4260
  console.log(`Phase: ${status.currentPhase || "N/A"}`);
4261
+ if (status.terminalState?.kind) console.log(`Terminal: ${status.terminalState.kind}`);
4230
4262
  console.log(`Rows: ${status.recordsSucceeded}/${status.recordsTotal} succeeded, ${status.recordsFailed} failed`);
4231
4263
  printCampaignCustomerRowCounts(status);
4232
4264
  console.log(`Artifacts: ${status.artifactCount}`);
@@ -4260,11 +4292,13 @@ function printCampaignAgentBuildReview(review) {
4260
4292
  console.log(`Campaign: ${status.name || review.campaignBuildId}`);
4261
4293
  console.log(`Status: ${summary.status || status.status}`);
4262
4294
  console.log(`Phase: ${summary.phase || status.currentPhase || "N/A"}`);
4295
+ console.log(`Terminal state: ${summary.terminalState || status.terminalState?.kind || "unknown"}`);
4263
4296
  console.log(`Rows: ${summary.sampledRows || 0} sampled, ${summary.availableRows || 0} available`);
4264
4297
  console.log(`Qualified: ${summary.qualifiedRows || 0}`);
4265
4298
  console.log(`Emails: ${summary.rowsWithEmail || 0}`);
4266
4299
  console.log(`Copy ready: ${summary.copyReadyRows || 0}`);
4267
4300
  console.log(`Artifacts: ${summary.artifactCount || 0}`);
4301
+ printCampaignAgentNorthStarScorecard(review.northStarScorecard);
4268
4302
  if (review.campaignBuildId) printCampaignArtifactDownloadHint(status, review.campaignBuildId);
4269
4303
  console.log(`Delivery approval ready: ${summary.readyForDeliveryApproval === true ? "yes" : "no"}`);
4270
4304
  const gates = Array.isArray(review.gates) ? review.gates : [];
@@ -4285,6 +4319,21 @@ function printCampaignAgentBuildReview(review) {
4285
4319
  for (const action of nextActions) console.log(`- ${action}`);
4286
4320
  }
4287
4321
  }
4322
+ function printCampaignAgentNorthStarScorecard(scorecard) {
4323
+ const card = record(scorecard);
4324
+ if (!card.version) return;
4325
+ const score = card.score === null || card.score === void 0 ? "pending" : `${card.score}%`;
4326
+ console.log(`North Star: ${String(card.status || "unknown")} (${score})`);
4327
+ if (card.moatState) console.log(`Moat state: ${card.moatState}`);
4328
+ const metrics = Array.isArray(card.metrics) ? card.metrics : [];
4329
+ if (metrics.length) {
4330
+ console.log("\nNorth Star gates:");
4331
+ for (const metric of metrics.slice(0, 12)) {
4332
+ const item = record(metric);
4333
+ console.log(`- ${String(item.status || "review").toUpperCase()} ${item.label || item.id}: ${item.detail || ""}`);
4334
+ }
4335
+ }
4336
+ }
4288
4337
  function createCampaignAgentBuildReview(status, rows, artifacts) {
4289
4338
  const rowList = Array.isArray(rows?.rows) ? rows.rows : [];
4290
4339
  const sampledRows = rowList.length;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaliz/cli",
3
- "version": "1.0.17",
3
+ "version": "1.0.18",
4
4
  "description": "Signaliz CLI — GTM Kernel, Nango routes, MCP, and enrichment operations.",
5
5
  "bin": {
6
6
  "signaliz": "dist/bin.js"