@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.
- package/README.md +8 -1
- package/dist/bin.js +49 -0
- 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;
|