@signaliz/cli 1.0.9 → 1.0.11

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 (2) hide show
  1. package/dist/bin.js +120 -0
  2. package/package.json +1 -1
package/dist/bin.js CHANGED
@@ -1077,6 +1077,14 @@ Campaign Builder:
1077
1077
  campaign-agent dry-run Execute build_campaign with dry_run=true
1078
1078
  campaign-agent build-approved
1079
1079
  Launch only after explicit approval metadata
1080
+ campaign-agent status <id>
1081
+ Inspect a campaign-agent build
1082
+ campaign-agent rows <id>
1083
+ Retrieve reviewable rows
1084
+ campaign-agent artifacts <id>
1085
+ List generated artifacts
1086
+ campaign-agent approve <id>
1087
+ Approve a reviewed delivery destination
1080
1088
 
1081
1089
  campaign scope Scope a workspace/account campaign into a markdown brief + dry-run args
1082
1090
  --prompt "..." Campaign request or outcome (required)
@@ -2785,6 +2793,10 @@ Strategy-template campaign builder:
2785
2793
  commit-plan Dry-run or write a reviewed GTM campaign object
2786
2794
  dry-run Execute build_campaign with dry_run=true
2787
2795
  build-approved Launch only after explicit approval metadata
2796
+ status Inspect a campaign-agent build
2797
+ rows Retrieve reviewable campaign-agent rows
2798
+ artifacts List generated artifacts
2799
+ approve Approve a reviewed delivery destination
2788
2800
 
2789
2801
  Examples:
2790
2802
  signaliz campaign-agent init --strategy-template non-medical-home-care --target-count 250 --use-local-leads --json > campaign-request.json
@@ -2794,6 +2806,8 @@ Examples:
2794
2806
  signaliz campaign-agent dry-run --goal "Build a local services campaign" --target-count 250 --use-local-leads --json
2795
2807
  signaliz campaign-agent build-approved --goal "Build a strategy-template campaign" --confirm-launch --approve-all --approved-by operator@example.com --spend-limit 500
2796
2808
  signaliz campaign-agent build-approved --request-file campaign-builder-agent-request.json --confirm-launch --approve-all --approved-by operator@example.com --spend-limit 500 --wait --approve-delivery --delivery-destination-type json
2809
+ signaliz campaign-agent status <campaign_build_id> --json
2810
+ signaliz campaign-agent rows <campaign_build_id> --limit 100 --json
2797
2811
 
2798
2812
  Plan options:
2799
2813
  --goal TEXT Campaign goal or brief
@@ -2846,6 +2860,10 @@ async function campaignAgent(sub, rest) {
2846
2860
  process.stdout.write(CAMPAIGN_AGENT_HELP);
2847
2861
  return;
2848
2862
  }
2863
+ if (["status", "rows", "artifacts", "approve", "approve-delivery"].includes(sub)) {
2864
+ await campaignAgentReview(sub, rest);
2865
+ return;
2866
+ }
2849
2867
  if (!["init", "template", "request-template", "new", "plan", "proof", "smoke", "commit-plan", "dry-run", "build-approved", "launch-approved"].includes(sub)) {
2850
2868
  process.stdout.write(CAMPAIGN_AGENT_HELP);
2851
2869
  return;
@@ -2949,6 +2967,64 @@ async function campaignAgent(sub, rest) {
2949
2967
  }
2950
2968
  return output(plan, () => printCampaignAgentPlan(plan));
2951
2969
  }
2970
+ async function campaignAgentReview(sub, rest) {
2971
+ const flags = parseCommandFlags(rest);
2972
+ const buildId = rest[0] && !rest[0].startsWith("--") ? rest[0] : commandStringFlag(flags, "campaign-build-id", "build-id");
2973
+ if (!buildId) die(`campaign-agent ${sub} requires <campaign_build_id> or --campaign-build-id`);
2974
+ const sdk = getSdk();
2975
+ const agent = sdk.campaignBuilderAgent;
2976
+ const campaigns = sdk.campaigns || {};
2977
+ if (sub === "status") {
2978
+ const status = await (agent.getBuildStatus?.bind(agent) || campaigns.status?.bind(campaigns) || campaigns.getCampaignBuildStatus?.bind(campaigns))?.(buildId);
2979
+ if (!status) die("campaign-agent status requires a compatible @signaliz/sdk campaign status API");
2980
+ return output(status, () => printCampaignAgentBuildStatus(status));
2981
+ }
2982
+ if (sub === "rows") {
2983
+ const rowOptions = {
2984
+ limit: commandNumberFlag(flags, "limit"),
2985
+ cursor: commandStringFlag(flags, "cursor"),
2986
+ segment: commandStringFlag(flags, "segment"),
2987
+ rowStatus: commandStringFlag(flags, "row-status"),
2988
+ qualified: commandBooleanFlag(flags, "qualified") ? true : commandBooleanFlag(flags, "disqualified") ? false : void 0
2989
+ };
2990
+ const result2 = await (agent.getBuildRows?.bind(agent) || campaigns.rows?.bind(campaigns) || campaigns.getCampaignBuildRows?.bind(campaigns))?.(buildId, rowOptions);
2991
+ if (!result2) die("campaign-agent rows requires a compatible @signaliz/sdk campaign rows API");
2992
+ const operatorResult = {
2993
+ ...result2,
2994
+ rows: formatCampaignRowsForOperator(result2.rows)
2995
+ };
2996
+ return output(operatorResult, () => printCampaignAgentRows(operatorResult));
2997
+ }
2998
+ if (sub === "artifacts") {
2999
+ const artifacts = await (agent.listBuildArtifacts?.bind(agent) || campaigns.artifacts?.bind(campaigns) || campaigns.listCampaignBuildArtifacts?.bind(campaigns))?.(buildId);
3000
+ if (!artifacts) die("campaign-agent artifacts requires a compatible @signaliz/sdk campaign artifacts API");
3001
+ return output(artifacts, () => {
3002
+ if (artifacts.length === 0) {
3003
+ console.log("No artifacts yet.");
3004
+ hint(`signaliz campaign-agent status ${buildId}`);
3005
+ return;
3006
+ }
3007
+ for (const artifact of artifacts) {
3008
+ console.log(`${artifact.artifactType || "artifact"} - ${artifact.rowCount} rows${artifact.signedUrl ? `
3009
+ ${artifact.signedUrl}` : ""}`);
3010
+ }
3011
+ });
3012
+ }
3013
+ const destinationType = commandStringFlag(flags, "destination-type", "delivery-destination-type", "type");
3014
+ if (!destinationType || !["json", "csv", "webhook"].includes(destinationType)) {
3015
+ die("campaign-agent approve requires --destination-type json|csv|webhook");
3016
+ }
3017
+ const deliveryOptions = {
3018
+ destinationId: commandStringFlag(flags, "destination-id", "delivery-destination-id"),
3019
+ destinationConfig: campaignAgentJsonObjectInput(flags, ["destination-config", "delivery-config"], ["destination-config-file", "delivery-config-file"])
3020
+ };
3021
+ const result = await (agent.approveDelivery?.bind(agent) || campaigns.approveCampaignDelivery?.bind(campaigns))?.(buildId, destinationType, deliveryOptions);
3022
+ if (!result) die("campaign-agent approve requires a compatible @signaliz/sdk campaign delivery API");
3023
+ return output(result, () => {
3024
+ console.log(`Delivery ${result.status}: ${result.destinationType}`);
3025
+ if (result.message) console.log(result.message);
3026
+ });
3027
+ }
2952
3028
  function campaignAgentRequestTemplateFromFlags(flags, rest) {
2953
3029
  const goal = commandStringFlag(flags, "goal", "brief") || promptArg(rest) || "Build a strategy-template campaign for mature operators in the target ICP.";
2954
3030
  const request = campaignAgentRequestFromFlags(goal, flags, { includeDefaults: true });
@@ -3257,6 +3333,50 @@ function printCampaignAgentExecution(plan, result) {
3257
3333
  console.log("\nResult:");
3258
3334
  console.log(JSON.stringify(result, null, 2));
3259
3335
  }
3336
+ function printCampaignAgentBuildStatus(status) {
3337
+ console.log(`Campaign: ${status.name || status.campaignBuildId}`);
3338
+ if (status.campaignId) console.log(`Campaign ID: ${status.campaignId}`);
3339
+ console.log(`Status: ${status.status}`);
3340
+ console.log(`Phase: ${status.currentPhase || "N/A"}`);
3341
+ console.log(`Rows: ${status.recordsSucceeded}/${status.recordsTotal} succeeded, ${status.recordsFailed} failed`);
3342
+ console.log(`Artifacts: ${status.artifactCount}`);
3343
+ if (status.triggerRunId) console.log(`Trigger: ${status.triggerRunId}`);
3344
+ if (Array.isArray(status.warnings) && status.warnings.length) {
3345
+ console.log(`Warnings: ${status.warnings.length}`);
3346
+ for (const warning of status.warnings.slice(0, 3)) console.log(` - ${warning}`);
3347
+ }
3348
+ if (Array.isArray(status.errors) && status.errors.length) {
3349
+ console.log(`Errors: ${status.errors.length}`);
3350
+ for (const error of status.errors.slice(0, 3)) console.log(` - ${error}`);
3351
+ }
3352
+ if (status.status === "completed") {
3353
+ hint(`signaliz campaign-agent rows ${status.campaignBuildId} --limit 100`);
3354
+ } else if (status.status === "pending_approval") {
3355
+ hint(`signaliz campaign-agent approve ${status.campaignBuildId} --destination-type webhook`);
3356
+ } else if ((status.status === "running" || status.status === "queued") && status.triggerRunId) {
3357
+ hint(`signaliz ops run-status ${status.triggerRunId} --watch`);
3358
+ }
3359
+ }
3360
+ function printCampaignAgentRows(result) {
3361
+ if (!Array.isArray(result.rows) || result.rows.length === 0) {
3362
+ console.log("No rows found.");
3363
+ return;
3364
+ }
3365
+ console.table(result.rows.map((row) => ({
3366
+ email: row.email || "",
3367
+ name: row.name || "",
3368
+ title: row.title || "",
3369
+ company: row.company || row.domain || "",
3370
+ segment: row.segment || "",
3371
+ status: row.status || "",
3372
+ score: row.score ?? ""
3373
+ })));
3374
+ console.log(`
3375
+ Showing ${result.rows.length} row(s)${result.hasMore ? " (more available)" : ""}`);
3376
+ if (result.nextCursor) {
3377
+ hint(`signaliz campaign-agent rows ${result.campaignBuildId} --limit ${result.pageSize || 50} --cursor ${result.nextCursor}`);
3378
+ }
3379
+ }
3260
3380
  function createCampaignAgentProofReceipt(plan, result) {
3261
3381
  const strategyMemory = record(plan.strategyMemoryStatus);
3262
3382
  const dryRunResult = record(result);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaliz/cli",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "Signaliz CLI — GTM Kernel, Nango routes, MCP, and enrichment operations.",
5
5
  "bin": {
6
6
  "signaliz": "dist/bin.js"