@arcsend/cli 1.0.0 → 1.1.0

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/index.js +224 -46
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -958,36 +958,48 @@ var campaigns = {
958
958
  params: [{ name: "id", positional: true, desc: "campaign id" }, ...replyFilters],
959
959
  output: { columns: REPLY_COLS, headers: REPLY_HDRS, noun: "reply(ies)" }
960
960
  },
961
- // Account assignment
961
+ // Sender-account assignment (by email — additive attach/detach, or full replace)
962
962
  {
963
963
  name: "accounts",
964
- summary: "List sending accounts assigned to a campaign.",
964
+ summary: "List sender accounts assigned to a campaign.",
965
965
  method: "GET",
966
- path: "/campaigns/:id/accounts",
966
+ path: "/campaigns/:id/sender-accounts",
967
967
  params: [{ name: "id", positional: true, desc: "campaign id" }],
968
- output: { columns: ["id", "email", "status", "daily_limit"], headers: ["ID", "Email", "Status", "Limit"], noun: "account(s)" }
968
+ output: { columns: ["email", "status", "daily_limit", "is_paused"], headers: ["Email", "Status", "Limit", "Paused"], noun: "account(s)" }
969
969
  },
970
970
  {
971
- name: "assign",
972
- summary: "Set the campaign's sending accounts (REPLACES the current set).",
971
+ name: "attach",
972
+ summary: "Attach sender accounts to a campaign by email (additive \u2014 keeps existing).",
973
973
  method: "POST",
974
- path: "/campaigns/:id/accounts",
974
+ path: "/campaigns/:id/sender-accounts/attach",
975
975
  params: [
976
- { name: "id", positional: true, echoBody: true, apiName: "campaign_id", desc: "campaign id" },
977
- { name: "ids", type: "csv", required: true, apiName: "account_ids", desc: "comma-separated account ids (full replace set)" }
976
+ { name: "id", positional: true, desc: "campaign id" },
977
+ { name: "emails", type: "csv", required: true, desc: "comma-separated sender-account emails to attach" }
978
978
  ],
979
- success: "Accounts assigned."
979
+ success: "Sender accounts attached."
980
980
  },
981
981
  {
982
- name: "unassign",
983
- summary: "Remove specific sending accounts from a campaign.",
982
+ name: "detach",
983
+ summary: "Detach specific sender accounts from a campaign, by email.",
984
984
  method: "POST",
985
- path: "/campaigns/:id/accounts/batch-unassign",
985
+ path: "/campaigns/:id/sender-accounts/detach",
986
+ params: [
987
+ { name: "id", positional: true, desc: "campaign id" },
988
+ { name: "emails", type: "csv", required: true, desc: "comma-separated sender-account emails to detach" }
989
+ ],
990
+ success: "Sender accounts detached."
991
+ },
992
+ {
993
+ name: "replace",
994
+ summary: "Replace the campaign's entire sender-account set with exactly these emails.",
995
+ method: "PUT",
996
+ path: "/campaigns/:id/sender-accounts",
997
+ confirm: "Replace ALL of this campaign's sender accounts with the provided set?",
986
998
  params: [
987
999
  { name: "id", positional: true, desc: "campaign id" },
988
- { name: "ids", type: "csv", required: true, apiName: "account_ids", desc: "comma-separated account ids to remove" }
1000
+ { name: "emails", type: "csv", required: true, desc: "comma-separated sender-account emails (full replace set)" }
989
1001
  ],
990
- success: "Accounts unassigned."
1002
+ success: "Sender accounts replaced."
991
1003
  }
992
1004
  ],
993
1005
  subgroups: [
@@ -1134,16 +1146,181 @@ var campaigns = {
1134
1146
  ]
1135
1147
  };
1136
1148
 
1149
+ // src/defs/subsequences.ts
1150
+ var TRIGGERS = "replied | sentiment_interested | sentiment_not_interested | sentiment_not_now | sentiment_question | sentiment_referral | reply_keyword | no_reply | lead_status";
1151
+ var subsequences = {
1152
+ name: "subsequences",
1153
+ summary: "In-campaign branches. A lead matching a trigger (reply/sentiment/keyword/no-reply) is moved off the main line onto its own mini-sequence. Max 10 per campaign.",
1154
+ commands: [
1155
+ {
1156
+ name: "list",
1157
+ summary: "List a campaign's subsequences.",
1158
+ method: "GET",
1159
+ path: "/campaigns/:campaign/subsequences",
1160
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }],
1161
+ output: { columns: ["id", "name", "trigger_type", "is_active"], headers: ["ID", "Name", "Trigger", "Active"], noun: "subsequence(s)" }
1162
+ },
1163
+ {
1164
+ name: "create",
1165
+ summary: "Create a subsequence (max 10 per campaign).",
1166
+ method: "POST",
1167
+ path: "/campaigns/:campaign/subsequences",
1168
+ params: [
1169
+ { name: "campaign", positional: true, desc: "campaign id" },
1170
+ { name: "name", required: true, desc: "subsequence name" },
1171
+ { name: "triggerType", required: true, apiName: "trigger_type", desc: TRIGGERS },
1172
+ { name: "triggerConfig", type: "json", apiName: "trigger_config", desc: `JSON config \u2014 {"keyword":"pricing"} for reply_keyword, {"status":"meeting_booked"} for lead_status` },
1173
+ { name: "delayDays", type: "number", apiName: "initial_delay_days", desc: "wait days before the first step" },
1174
+ { name: "delayHours", type: "number", apiName: "initial_delay_hours", desc: "wait hours before the first step" }
1175
+ ],
1176
+ success: "Subsequence created."
1177
+ },
1178
+ {
1179
+ name: "get",
1180
+ summary: "Show one subsequence.",
1181
+ method: "GET",
1182
+ path: "/campaigns/:campaign/subsequences/:id",
1183
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }, { name: "id", positional: true, desc: "subsequence id" }]
1184
+ },
1185
+ {
1186
+ name: "update",
1187
+ summary: "Update a subsequence (name, trigger config, delay, or active state). trigger_type is immutable.",
1188
+ method: "PATCH",
1189
+ path: "/campaigns/:campaign/subsequences/:id",
1190
+ params: [
1191
+ { name: "campaign", positional: true, desc: "campaign id" },
1192
+ { name: "id", positional: true, desc: "subsequence id" },
1193
+ { name: "name", desc: "new name" },
1194
+ { name: "triggerConfig", type: "json", apiName: "trigger_config", desc: "new trigger config JSON" },
1195
+ { name: "delayDays", type: "number", apiName: "initial_delay_days", desc: "wait days before the first step" },
1196
+ { name: "delayHours", type: "number", apiName: "initial_delay_hours", desc: "wait hours before the first step" },
1197
+ { name: "active", type: "tri", negFlag: "--inactive", apiName: "is_active", desc: "activate / pause the subsequence" }
1198
+ ],
1199
+ success: "Subsequence updated."
1200
+ },
1201
+ {
1202
+ name: "delete",
1203
+ summary: "Delete a subsequence (its steps go too; its leads return to the main line).",
1204
+ method: "DELETE",
1205
+ path: "/campaigns/:campaign/subsequences/:id",
1206
+ confirm: "Delete this subsequence?",
1207
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }, { name: "id", positional: true, desc: "subsequence id" }],
1208
+ success: "Deleted."
1209
+ },
1210
+ {
1211
+ name: "move",
1212
+ summary: "Move leads (by email) onto a subsequence. Cancels their queued main-line sends. Fails if the subsequence is paused.",
1213
+ method: "POST",
1214
+ path: "/campaigns/:campaign/subsequences/:id/move",
1215
+ params: [
1216
+ { name: "campaign", positional: true, desc: "campaign id" },
1217
+ { name: "id", positional: true, desc: "subsequence id" },
1218
+ { name: "emails", type: "csv", required: true, desc: "comma-separated lead emails to move" }
1219
+ ],
1220
+ success: "Leads moved."
1221
+ },
1222
+ {
1223
+ name: "remove",
1224
+ summary: "Remove leads (by email) from a subsequence, releasing them to the main line.",
1225
+ method: "POST",
1226
+ path: "/campaigns/:campaign/subsequences/:id/remove",
1227
+ params: [
1228
+ { name: "campaign", positional: true, desc: "campaign id" },
1229
+ { name: "id", positional: true, desc: "subsequence id" },
1230
+ { name: "emails", type: "csv", required: true, desc: "comma-separated lead emails to remove" }
1231
+ ],
1232
+ success: "Leads removed."
1233
+ },
1234
+ {
1235
+ name: "pause",
1236
+ summary: "Pause a subsequence \u2014 no new leads enter and its steps freeze until resumed.",
1237
+ method: "POST",
1238
+ path: "/campaigns/:campaign/subsequences/:id/pause",
1239
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }, { name: "id", positional: true, desc: "subsequence id" }],
1240
+ success: "Paused."
1241
+ },
1242
+ {
1243
+ name: "resume",
1244
+ summary: "Resume a paused subsequence.",
1245
+ method: "POST",
1246
+ path: "/campaigns/:campaign/subsequences/:id/resume",
1247
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }, { name: "id", positional: true, desc: "subsequence id" }],
1248
+ success: "Resumed."
1249
+ }
1250
+ ],
1251
+ subgroups: [
1252
+ {
1253
+ name: "steps",
1254
+ summary: "The email steps inside a subsequence. Step 1 needs a subject; every step needs a body. Spintax {a|b} and {{variables}} are supported.",
1255
+ commands: [
1256
+ {
1257
+ name: "list",
1258
+ summary: "List a subsequence's steps.",
1259
+ method: "GET",
1260
+ path: "/campaigns/:campaign/subsequences/:id/steps",
1261
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }, { name: "id", positional: true, desc: "subsequence id" }],
1262
+ output: { columns: ["step_number", "variant", "subject", "delay_days", "delay_hours"], headers: ["Step", "Var", "Subject", "Days", "Hrs"], noun: "step(s)" }
1263
+ },
1264
+ {
1265
+ name: "add",
1266
+ summary: "Add an email step to a subsequence.",
1267
+ method: "POST",
1268
+ path: "/campaigns/:campaign/subsequences/:id/steps",
1269
+ params: [
1270
+ { name: "campaign", positional: true, desc: "campaign id" },
1271
+ { name: "id", positional: true, desc: "subsequence id" },
1272
+ { name: "step", type: "number", required: true, apiName: "step_number", desc: "step number (1 = first)" },
1273
+ { name: "body", required: true, desc: "email body (spintax + {{vars}} allowed)" },
1274
+ { name: "subject", desc: "subject line (required on step 1)" },
1275
+ { name: "delayDays", type: "number", apiName: "delay_days", desc: "days after the previous step" },
1276
+ { name: "delayHours", type: "number", apiName: "delay_hours", desc: "additional hours" },
1277
+ { name: "variant", desc: "A/B variant: A, B, C, or D (default A)" },
1278
+ { name: "splitWeight", type: "number", apiName: "split_weight", desc: "A/B weight 1-100 (blank = equal split)" }
1279
+ ],
1280
+ success: "Step added."
1281
+ },
1282
+ {
1283
+ name: "update",
1284
+ summary: "Update a subsequence step.",
1285
+ method: "PATCH",
1286
+ path: "/campaigns/:campaign/subsequences/:id/steps/:step",
1287
+ params: [
1288
+ { name: "campaign", positional: true, desc: "campaign id" },
1289
+ { name: "id", positional: true, desc: "subsequence id" },
1290
+ { name: "step", positional: true, desc: "sequence step id" },
1291
+ { name: "stepNumber", type: "number", apiName: "step_number", desc: "step number" },
1292
+ { name: "subject", desc: "subject line" },
1293
+ { name: "body", desc: "email body" },
1294
+ { name: "delayDays", type: "number", apiName: "delay_days", desc: "days after the previous step" },
1295
+ { name: "delayHours", type: "number", apiName: "delay_hours", desc: "additional hours" },
1296
+ { name: "splitWeight", type: "number", apiName: "split_weight", desc: "A/B weight 1-100" }
1297
+ ],
1298
+ success: "Step updated."
1299
+ },
1300
+ {
1301
+ name: "delete",
1302
+ summary: "Delete a subsequence step.",
1303
+ method: "DELETE",
1304
+ path: "/campaigns/:campaign/subsequences/:id/steps/:step",
1305
+ confirm: "Delete this step?",
1306
+ params: [{ name: "campaign", positional: true, desc: "campaign id" }, { name: "id", positional: true, desc: "subsequence id" }, { name: "step", positional: true, desc: "sequence step id" }],
1307
+ success: "Deleted."
1308
+ }
1309
+ ]
1310
+ }
1311
+ ]
1312
+ };
1313
+
1137
1314
  // src/defs/accounts.ts
1138
1315
  var accounts = {
1139
1316
  name: "accounts",
1140
- summary: "Sending accounts (mailboxes). Connect/reconnect happens in the app; here you list, inspect, edit, scan, and remove them.",
1317
+ summary: "Sending accounts (mailboxes), addressed by email. Connect/reconnect happens in the app; here you list, inspect, edit, scan, and remove them.",
1141
1318
  commands: [
1142
1319
  {
1143
1320
  name: "list",
1144
1321
  summary: "List sending accounts with operational filters.",
1145
1322
  method: "GET",
1146
- path: "/accounts",
1323
+ path: "/sender-accounts",
1147
1324
  paged: true,
1148
1325
  params: [
1149
1326
  { name: "status", desc: "connected|connecting|disconnected|error" },
@@ -1159,25 +1336,25 @@ var accounts = {
1159
1336
  },
1160
1337
  {
1161
1338
  name: "get",
1162
- summary: "Show one account in full.",
1339
+ summary: "Show one sender account in full.",
1163
1340
  method: "GET",
1164
- path: "/accounts/:id",
1165
- params: [{ name: "id", positional: true, desc: "account id" }]
1341
+ path: "/sender-accounts/:email",
1342
+ params: [{ name: "email", positional: true, desc: "sender-account email" }]
1166
1343
  },
1167
1344
  {
1168
1345
  name: "stats",
1169
- summary: "Sending stats for one account.",
1346
+ summary: "Sending stats for one sender account.",
1170
1347
  method: "GET",
1171
- path: "/accounts/:id/stats",
1172
- params: [{ name: "id", positional: true, desc: "account id" }]
1348
+ path: "/sender-accounts/:email/stats",
1349
+ params: [{ name: "email", positional: true, desc: "sender-account email" }]
1173
1350
  },
1174
1351
  {
1175
1352
  name: "update",
1176
- summary: "Edit an account: sender name, daily limit (1\u201350), pause state, or tags.",
1353
+ summary: "Edit a sender account: sender name, daily limit (1\u201350), pause state, or tags.",
1177
1354
  method: "PATCH",
1178
- path: "/accounts/:id",
1355
+ path: "/sender-accounts/:email",
1179
1356
  params: [
1180
- { name: "id", positional: true, desc: "account id" },
1357
+ { name: "email", positional: true, desc: "sender-account email" },
1181
1358
  { name: "senderName", apiName: "sender_name", desc: "the From display name" },
1182
1359
  { name: "dailyLimit", type: "number", apiName: "daily_limit", desc: "emails/day, 1\u201350 (default 5)" },
1183
1360
  { name: "paused", type: "tri", negFlag: "--active", apiName: "is_paused", desc: "pause (stop sending) / re-activate the account" },
@@ -1188,12 +1365,12 @@ var accounts = {
1188
1365
  },
1189
1366
  {
1190
1367
  name: "bulk-action",
1191
- summary: "Apply one action (pause/unpause/delete) to up to 200 accounts.",
1368
+ summary: "Apply one action (pause/unpause/delete) to up to 200 sender accounts, by email.",
1192
1369
  method: "POST",
1193
- path: "/accounts/bulk-action",
1370
+ path: "/sender-accounts/bulk-action",
1194
1371
  confirm: "Apply this action to all listed accounts?",
1195
1372
  params: [
1196
- { name: "ids", type: "csv", required: true, apiName: "account_ids", desc: "comma-separated account ids (1\u2013200)" },
1373
+ { name: "emails", type: "csv", required: true, desc: "comma-separated sender-account emails (1\u2013200)" },
1197
1374
  { name: "action", required: true, desc: "pause|unpause|delete" }
1198
1375
  ],
1199
1376
  success: "Applied."
@@ -1202,17 +1379,17 @@ var accounts = {
1202
1379
  name: "dns-check",
1203
1380
  summary: "Run an SPF/DKIM/DMARC check on the account's sending domain.",
1204
1381
  method: "POST",
1205
- path: "/accounts/:id/dns-check",
1206
- params: [{ name: "id", positional: true, desc: "account id" }],
1382
+ path: "/sender-accounts/:email/dns-check",
1383
+ params: [{ name: "email", positional: true, desc: "sender-account email" }],
1207
1384
  success: "DNS check run."
1208
1385
  },
1209
1386
  {
1210
1387
  name: "delete",
1211
- summary: "Delete (disconnect) an account.",
1388
+ summary: "Delete (disconnect) a sender account.",
1212
1389
  method: "DELETE",
1213
- path: "/accounts/:id",
1390
+ path: "/sender-accounts/:email",
1214
1391
  confirm: "Delete this account?",
1215
- params: [{ name: "id", positional: true, desc: "account id" }],
1392
+ params: [{ name: "email", positional: true, desc: "sender-account email" }],
1216
1393
  success: "Deleted."
1217
1394
  }
1218
1395
  ]
@@ -1558,24 +1735,24 @@ var warmup = {
1558
1735
  name: "list",
1559
1736
  summary: "List accounts with their warmup status.",
1560
1737
  method: "GET",
1561
- path: "/warmup/accounts",
1738
+ path: "/warmup/sender-accounts",
1562
1739
  paged: true,
1563
1740
  params: [{ name: "active", type: "tri", negFlag: "--inactive", apiName: "is_active", desc: "only warming / only not-warming" }],
1564
- output: { columns: ["id", "email", "warmup_enabled", "warmup_score"], headers: ["ID", "Email", "Enabled", "Score"], noun: "account(s)" }
1741
+ output: { columns: ["email", "warmup_enabled", "warmup_score", "days_warming"], headers: ["Email", "Enabled", "Score", "Days"], noun: "account(s)" }
1565
1742
  },
1566
1743
  {
1567
1744
  name: "get",
1568
1745
  summary: "Show one account's warmup detail.",
1569
1746
  method: "GET",
1570
- path: "/warmup/accounts/:id",
1571
- params: [{ name: "id", positional: true, desc: "account id" }]
1747
+ path: "/warmup/sender-accounts/:email",
1748
+ params: [{ name: "email", positional: true, desc: "sender-account email" }]
1572
1749
  },
1573
1750
  {
1574
1751
  name: "enable",
1575
1752
  summary: "Enable warmup for an account (must be connected). Optionally set targets.",
1576
1753
  method: "POST",
1577
- path: "/warmup/accounts/:id/enable",
1578
- params: [{ name: "id", positional: true, desc: "account id" }, ...warmupSettings],
1754
+ path: "/warmup/sender-accounts/:email/enable",
1755
+ params: [{ name: "email", positional: true, desc: "sender-account email" }, ...warmupSettings],
1579
1756
  validate: "warmup.settings",
1580
1757
  success: "Warmup enabled."
1581
1758
  },
@@ -1583,16 +1760,16 @@ var warmup = {
1583
1760
  name: "disable",
1584
1761
  summary: "Disable warmup for an account (cancels pending warmup sends).",
1585
1762
  method: "POST",
1586
- path: "/warmup/accounts/:id/disable",
1587
- params: [{ name: "id", positional: true, desc: "account id" }],
1763
+ path: "/warmup/sender-accounts/:email/disable",
1764
+ params: [{ name: "email", positional: true, desc: "sender-account email" }],
1588
1765
  success: "Warmup disabled."
1589
1766
  },
1590
1767
  {
1591
1768
  name: "settings",
1592
1769
  summary: "Update warmup targets for an account.",
1593
1770
  method: "PATCH",
1594
- path: "/warmup/accounts/:id/settings",
1595
- params: [{ name: "id", positional: true, desc: "account id" }, ...warmupSettings],
1771
+ path: "/warmup/sender-accounts/:email/settings",
1772
+ params: [{ name: "email", positional: true, desc: "sender-account email" }, ...warmupSettings],
1596
1773
  validate: "warmup.settings",
1597
1774
  success: "Warmup settings updated."
1598
1775
  },
@@ -1601,8 +1778,8 @@ var warmup = {
1601
1778
  name: "history",
1602
1779
  summary: "Warmup send/receive history for an account.",
1603
1780
  method: "GET",
1604
- path: "/warmup/history/:id",
1605
- params: [{ name: "id", positional: true, desc: "account id" }, { name: "limit", type: "number", default: "50", desc: "rows (default 50)" }]
1781
+ path: "/warmup/sender-accounts/:email/history",
1782
+ params: [{ name: "email", positional: true, desc: "sender-account email" }, { name: "limit", type: "number", default: "50", desc: "rows (default 50)" }]
1606
1783
  }
1607
1784
  ]
1608
1785
  };
@@ -2016,6 +2193,7 @@ var workspaces = {
2016
2193
  var groups = [
2017
2194
  workspaces,
2018
2195
  campaigns,
2196
+ subsequences,
2019
2197
  accounts,
2020
2198
  leads,
2021
2199
  inbox,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcsend/cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "ArcSend — cold email automation from your terminal",
5
5
  "type": "module",
6
6
  "bin": {