@revfleet/hscli 0.8.12 → 0.9.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 (153) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/README.md +220 -10
  3. package/dist/cli.js +27 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/agent/contracts.d.ts +3 -0
  6. package/dist/commands/agent/contracts.js +139 -0
  7. package/dist/commands/agent/contracts.js.map +1 -0
  8. package/dist/commands/agent/index.d.ts +3 -0
  9. package/dist/commands/agent/index.js +188 -0
  10. package/dist/commands/agent/index.js.map +1 -0
  11. package/dist/commands/agent/recipes.d.ts +13 -0
  12. package/dist/commands/agent/recipes.js +108 -0
  13. package/dist/commands/agent/recipes.js.map +1 -0
  14. package/dist/commands/agent/runner.d.ts +16 -0
  15. package/dist/commands/agent/runner.js +165 -0
  16. package/dist/commands/agent/runner.js.map +1 -0
  17. package/dist/commands/auth/index.js +64 -7
  18. package/dist/commands/auth/index.js.map +1 -1
  19. package/dist/commands/automation/index.js +30 -0
  20. package/dist/commands/automation/index.js.map +1 -1
  21. package/dist/commands/backup/index.d.ts +12 -0
  22. package/dist/commands/backup/index.js +459 -0
  23. package/dist/commands/backup/index.js.map +1 -0
  24. package/dist/commands/cms/content-ops.js +1 -1
  25. package/dist/commands/cms/content-ops.js.map +1 -1
  26. package/dist/commands/communication-preferences/index.js +207 -7
  27. package/dist/commands/communication-preferences/index.js.map +1 -1
  28. package/dist/commands/content-permissions/index.d.ts +22 -0
  29. package/dist/commands/content-permissions/index.js +141 -0
  30. package/dist/commands/content-permissions/index.js.map +1 -0
  31. package/dist/commands/context/index.d.ts +3 -0
  32. package/dist/commands/context/index.js +182 -0
  33. package/dist/commands/context/index.js.map +1 -0
  34. package/dist/commands/crm/associations.js +38 -0
  35. package/dist/commands/crm/associations.js.map +1 -1
  36. package/dist/commands/crm/custom-objects.js +39 -2
  37. package/dist/commands/crm/custom-objects.js.map +1 -1
  38. package/dist/commands/crm/dated.js +3 -3
  39. package/dist/commands/crm/dated.js.map +1 -1
  40. package/dist/commands/crm/migration.js +210 -2
  41. package/dist/commands/crm/migration.js.map +1 -1
  42. package/dist/commands/crm/properties.js +2 -1
  43. package/dist/commands/crm/properties.js.map +1 -1
  44. package/dist/commands/crm/property-batch.d.ts +1 -0
  45. package/dist/commands/crm/property-batch.js +44 -5
  46. package/dist/commands/crm/property-batch.js.map +1 -1
  47. package/dist/commands/crm/shared.js +21 -2
  48. package/dist/commands/crm/shared.js.map +1 -1
  49. package/dist/commands/crm/sync.js +1 -1
  50. package/dist/commands/crm/sync.js.map +1 -1
  51. package/dist/commands/doctor/index.js +193 -0
  52. package/dist/commands/doctor/index.js.map +1 -1
  53. package/dist/commands/email-tracking/index.d.ts +16 -0
  54. package/dist/commands/email-tracking/index.js +314 -0
  55. package/dist/commands/email-tracking/index.js.map +1 -0
  56. package/dist/commands/extensions/index.js +1 -1
  57. package/dist/commands/extensions/index.js.map +1 -1
  58. package/dist/commands/forms/index.js +15 -2
  59. package/dist/commands/forms/index.js.map +1 -1
  60. package/dist/commands/forms/legacy-v2.d.ts +7 -2
  61. package/dist/commands/forms/legacy-v2.js +103 -7
  62. package/dist/commands/forms/legacy-v2.js.map +1 -1
  63. package/dist/commands/guide/index.d.ts +1 -1
  64. package/dist/commands/guide/index.js +37 -4
  65. package/dist/commands/guide/index.js.map +1 -1
  66. package/dist/commands/internal/catalog.d.ts +1 -0
  67. package/dist/commands/internal/catalog.js +2 -0
  68. package/dist/commands/internal/catalog.js.map +1 -0
  69. package/dist/commands/internal/index.d.ts +26 -0
  70. package/dist/commands/internal/index.js +823 -0
  71. package/dist/commands/internal/index.js.map +1 -0
  72. package/dist/commands/internal-session.d.ts +15 -0
  73. package/dist/commands/internal-session.js +152 -0
  74. package/dist/commands/internal-session.js.map +1 -0
  75. package/dist/commands/lists/index.js +1 -1
  76. package/dist/commands/lists/index.js.map +1 -1
  77. package/dist/commands/marketing/email-audit.d.ts +32 -0
  78. package/dist/commands/marketing/email-audit.js +121 -0
  79. package/dist/commands/marketing/email-audit.js.map +1 -0
  80. package/dist/commands/marketing/index.js +2 -0
  81. package/dist/commands/marketing/index.js.map +1 -1
  82. package/dist/commands/mcp.js +5 -3
  83. package/dist/commands/mcp.js.map +1 -1
  84. package/dist/commands/playbooks/index.d.ts +3 -0
  85. package/dist/commands/playbooks/index.js +228 -0
  86. package/dist/commands/playbooks/index.js.map +1 -0
  87. package/dist/commands/portals/index.d.ts +3 -0
  88. package/dist/commands/portals/index.js +132 -0
  89. package/dist/commands/portals/index.js.map +1 -0
  90. package/dist/commands/reports/index.d.ts +3 -0
  91. package/dist/commands/reports/index.js +479 -0
  92. package/dist/commands/reports/index.js.map +1 -0
  93. package/dist/commands/sales-content/index.d.ts +13 -0
  94. package/dist/commands/sales-content/index.js +59 -0
  95. package/dist/commands/sales-content/index.js.map +1 -0
  96. package/dist/commands/sales-templates/index.d.ts +3 -0
  97. package/dist/commands/sales-templates/index.js +88 -0
  98. package/dist/commands/sales-templates/index.js.map +1 -0
  99. package/dist/commands/seed/cms.js +28 -45
  100. package/dist/commands/seed/cms.js.map +1 -1
  101. package/dist/commands/sequences/index.d.ts +18 -0
  102. package/dist/commands/sequences/index.js +263 -0
  103. package/dist/commands/sequences/index.js.map +1 -0
  104. package/dist/commands/settings/index.js +450 -102
  105. package/dist/commands/settings/index.js.map +1 -1
  106. package/dist/commands/settings/site-settings.d.ts +3 -0
  107. package/dist/commands/settings/site-settings.js +106 -0
  108. package/dist/commands/settings/site-settings.js.map +1 -0
  109. package/dist/commands/ui/index.js +14 -4
  110. package/dist/commands/ui/index.js.map +1 -1
  111. package/dist/commands/workflows/index.js +2 -0
  112. package/dist/commands/workflows/index.js.map +1 -1
  113. package/dist/commands/workflows/preflight.d.ts +23 -0
  114. package/dist/commands/workflows/preflight.js +295 -0
  115. package/dist/commands/workflows/preflight.js.map +1 -0
  116. package/dist/core/action-contract.d.ts +43 -0
  117. package/dist/core/action-contract.js +207 -0
  118. package/dist/core/action-contract.js.map +1 -0
  119. package/dist/core/auth.d.ts +6 -0
  120. package/dist/core/auth.js +85 -0
  121. package/dist/core/auth.js.map +1 -1
  122. package/dist/core/http.d.ts +8 -0
  123. package/dist/core/http.js +37 -5
  124. package/dist/core/http.js.map +1 -1
  125. package/dist/core/id-maps.d.ts +27 -0
  126. package/dist/core/id-maps.js +204 -0
  127. package/dist/core/id-maps.js.map +1 -0
  128. package/dist/core/output.d.ts +2 -1
  129. package/dist/core/output.js +34 -0
  130. package/dist/core/output.js.map +1 -1
  131. package/dist/mcp/profiles.d.ts +14 -0
  132. package/dist/mcp/profiles.js +68 -0
  133. package/dist/mcp/profiles.js.map +1 -0
  134. package/dist/mcp/server.d.ts +5 -3
  135. package/dist/mcp/server.js +22 -5
  136. package/dist/mcp/server.js.map +1 -1
  137. package/docs/CAPABILITY_LIBRARY.md +29 -8
  138. package/docs/COMMAND_TREE.md +96 -17
  139. package/docs/COMPARISON.md +8 -5
  140. package/docs/COOKBOOK.md +124 -5
  141. package/docs/INTERNAL-ENDPOINTS-DISCOVERY.md +813 -0
  142. package/docs/INTERNAL-ENDPOINTS.md +371 -0
  143. package/docs/INTERNAL_ENDPOINTS.md +243 -0
  144. package/docs/MARKETING_SETUP.md +21 -1
  145. package/docs/MCP.md +28 -89
  146. package/docs/MCP_TOOL_CATALOG.md +192 -0
  147. package/docs/MIGRATION_ADAPTERS.md +115 -0
  148. package/docs/PORTAL_BACKUP.md +212 -0
  149. package/docs/PUBLISHING.md +1 -1
  150. package/docs/SALES_CONTENT_INTERNAL_PUNCH_LIST.md +504 -0
  151. package/docs/TUTORIALS/secure-agent-writes.md +49 -0
  152. package/docs/WHY_HOW_WHAT.md +10 -4
  153. package/package.json +4 -2
@@ -0,0 +1,479 @@
1
+ import { createClient } from "../../core/http.js";
2
+ import { CliError, printResult } from "../../core/output.js";
3
+ import { encodePathSegment } from "../crm/shared.js";
4
+ const DEFAULT_PAGE_SIZE = 100;
5
+ const DEFAULT_LIMIT = 1_000;
6
+ const MAX_OBJECT_PAGE_SIZE = 100;
7
+ const MAX_BATCH_READ_SIZE = 100;
8
+ const LARGE_PROPERTY_READ_THRESHOLD = 80;
9
+ const DEFAULT_EMAIL_EVENT_TYPES = ["SENT", "DELIVERED", "BOUNCE", "OPEN", "CLICK", "DROPPED", "SUPPRESSED", "DEFERRED"];
10
+ const HARD_BOUNCE_CATEGORIES = new Set([
11
+ "UNKNOWN_USER",
12
+ "POLICY",
13
+ "SPAM",
14
+ "DMARC",
15
+ "FILTERED",
16
+ "SENDING_DOMAIN_MISCONFIGURATION",
17
+ ]);
18
+ const SOFT_BOUNCE_CATEGORIES = new Set([
19
+ "THROTTLED",
20
+ "TEMPORARY_PROBLEM",
21
+ "MAILBOX_FULL",
22
+ "MAILBOX_MISCONFIGURATION",
23
+ "IP_REPUTATION",
24
+ "DOMAIN_REPUTATION",
25
+ "TIMEOUT",
26
+ "DNS_FAILURE",
27
+ ]);
28
+ export function registerReports(program, getCtx) {
29
+ const reports = program.command("reports").description("Reusable reporting pulls and audit recipes");
30
+ const pull = reports.command("pull").description("Run a report recipe and print json/table/csv/yaml output");
31
+ pull
32
+ .command("object-fill-rate")
33
+ .description("Fill rate for selected or all properties on a CRM object")
34
+ .requiredOption("--object <type>", "CRM object type, e.g. contacts, companies, deals, tickets, or 2-123")
35
+ .option("--properties <csv>", "Property names. Omit to use every non-archived property in the object schema")
36
+ .option("--limit <n>", "Max records to sample", String(DEFAULT_LIMIT))
37
+ .option("--page-size <n>", "CRM page size, max 100", String(DEFAULT_PAGE_SIZE))
38
+ .option("--archived <bool>", "Include archived records (true/false)", "false")
39
+ .action(async (opts) => {
40
+ const ctx = getCtx();
41
+ const client = createClient(ctx.profile);
42
+ const objectType = parseRequired(opts.object, "--object");
43
+ const schema = await maybeFetchPropertySchema(client, objectType, opts.properties);
44
+ const properties = opts.properties ? splitCsv(opts.properties) : schema.map((property) => property.name).filter(Boolean);
45
+ if (properties.length === 0)
46
+ throw new CliError("INVALID_FLAG", "--properties resolved to an empty property list");
47
+ const records = await fetchObjectRecords(client, objectType, properties, {
48
+ limit: parsePositiveInt(opts.limit, "--limit"),
49
+ pageSize: parsePageSize(opts.pageSize),
50
+ archived: parseBoolean(opts.archived, "--archived"),
51
+ });
52
+ const schemaByName = new Map(schema.map((property) => [property.name, property]));
53
+ const results = buildFillRateRows(records, properties, schemaByName);
54
+ printResult(ctx, {
55
+ recipe: "object-fill-rate",
56
+ objectType,
57
+ sampled: records.length,
58
+ properties: properties.length,
59
+ results,
60
+ });
61
+ });
62
+ pull
63
+ .command("property-distribution")
64
+ .description("Distribution/top values for one CRM object property")
65
+ .requiredOption("--object <type>", "CRM object type, e.g. contacts, companies, deals, tickets, or 2-123")
66
+ .requiredOption("--property <name>", "Property name")
67
+ .option("--limit <n>", "Max records to sample", String(DEFAULT_LIMIT))
68
+ .option("--page-size <n>", "CRM page size, max 100", String(DEFAULT_PAGE_SIZE))
69
+ .option("--top <n>", "Max values to return", "100")
70
+ .option("--archived <bool>", "Include archived records (true/false)", "false")
71
+ .action(async (opts) => {
72
+ const ctx = getCtx();
73
+ const client = createClient(ctx.profile);
74
+ const objectType = parseRequired(opts.object, "--object");
75
+ const property = parseRequired(opts.property, "--property");
76
+ const records = await fetchObjectRecords(client, objectType, [property], {
77
+ limit: parsePositiveInt(opts.limit, "--limit"),
78
+ pageSize: parsePageSize(opts.pageSize),
79
+ archived: parseBoolean(opts.archived, "--archived"),
80
+ });
81
+ const report = buildPropertyDistribution(records, property, parsePositiveInt(opts.top, "--top"));
82
+ printResult(ctx, {
83
+ recipe: "property-distribution",
84
+ objectType,
85
+ property,
86
+ sampled: records.length,
87
+ ...report,
88
+ });
89
+ });
90
+ pull
91
+ .command("email-recipients")
92
+ .description("Per-recipient marketing email event pull for campaign ids")
93
+ .requiredOption("--campaign-ids <csv>", "Marketing email campaign ids")
94
+ .option("--event-types <csv>", `Event types (${DEFAULT_EMAIL_EVENT_TYPES.join(",")})`, DEFAULT_EMAIL_EVENT_TYPES.join(","))
95
+ .option("--contact-properties <csv>", "Optional contact properties to enrich by email")
96
+ .option("--limit-per-event <n>", "Max events per campaign/event type", "100000")
97
+ .option("--page-size <n>", "Email event API page size", "1000")
98
+ .option("--start-timestamp <ms>", "Earliest event epoch ms")
99
+ .option("--end-timestamp <ms>", "Latest event epoch ms")
100
+ .action(async (opts) => {
101
+ const ctx = getCtx();
102
+ const client = createClient(ctx.profile);
103
+ const campaignIds = splitCsv(opts.campaignIds);
104
+ const eventTypes = splitCsv(opts.eventTypes).map((eventType) => eventType.toUpperCase());
105
+ const contactProperties = opts.contactProperties ? splitCsv(opts.contactProperties) : [];
106
+ const recipients = await pullEmailRecipients(client, {
107
+ campaignIds,
108
+ eventTypes,
109
+ limitPerEvent: parsePositiveInt(opts.limitPerEvent, "--limit-per-event"),
110
+ pageSize: parsePositiveInt(opts.pageSize, "--page-size"),
111
+ startTimestamp: opts.startTimestamp,
112
+ endTimestamp: opts.endTimestamp,
113
+ });
114
+ if (contactProperties.length > 0) {
115
+ await enrichRecipientsWithContacts(client, recipients, contactProperties);
116
+ }
117
+ printResult(ctx, {
118
+ recipe: "email-recipients",
119
+ campaigns: campaignIds,
120
+ eventTypes,
121
+ contactProperties,
122
+ results: recipients.map(formatEmailRecipient),
123
+ });
124
+ });
125
+ pull
126
+ .command("source-target-parity")
127
+ .description("Compare object counts between two auth profiles")
128
+ .requiredOption("--source-profile <name>", "Source auth profile")
129
+ .requiredOption("--target-profile <name>", "Target/sandbox auth profile")
130
+ .requiredOption("--objects <csv>", "Object types to compare")
131
+ .option("--filters <json>", "Optional CRM search filterGroups JSON applied to every object")
132
+ .action(async (opts) => {
133
+ const ctx = getCtx();
134
+ const sourceProfile = parseRequired(opts.sourceProfile, "--source-profile");
135
+ const targetProfile = parseRequired(opts.targetProfile, "--target-profile");
136
+ const sourceClient = createClient(sourceProfile);
137
+ const targetClient = createClient(targetProfile);
138
+ const objectTypes = splitCsv(opts.objects);
139
+ const filterGroups = opts.filters ? parseJson(opts.filters, "--filters") : undefined;
140
+ const results = [];
141
+ for (const objectType of objectTypes) {
142
+ const sourceTotal = await countObject(sourceClient, objectType, filterGroups);
143
+ const targetTotal = await countObject(targetClient, objectType, filterGroups);
144
+ results.push({
145
+ objectType,
146
+ sourceTotal,
147
+ targetTotal,
148
+ delta: targetTotal - sourceTotal,
149
+ parityRatio: sourceTotal === 0 ? (targetTotal === 0 ? 1 : null) : targetTotal / sourceTotal,
150
+ });
151
+ }
152
+ printResult(ctx, {
153
+ recipe: "source-target-parity",
154
+ sourceProfile,
155
+ targetProfile,
156
+ results,
157
+ });
158
+ });
159
+ }
160
+ async function maybeFetchPropertySchema(client, objectType, explicitProperties) {
161
+ if (explicitProperties)
162
+ return [];
163
+ const objectSegment = encodePathSegment(objectType, "object");
164
+ const res = await client.request(`/crm/v3/properties/${objectSegment}`);
165
+ const properties = asRecord(res).results;
166
+ if (!Array.isArray(properties))
167
+ return [];
168
+ return properties
169
+ .filter((property) => Boolean(property && typeof property === "object"))
170
+ .filter((property) => Boolean(property.name) && !property.archived)
171
+ .map((property) => ({ ...property, name: String(property.name) }));
172
+ }
173
+ async function fetchObjectRecords(client, objectType, properties, opts) {
174
+ if (properties.length > LARGE_PROPERTY_READ_THRESHOLD) {
175
+ const ids = await fetchObjectIds(client, objectType, opts);
176
+ return batchReadObjectRecords(client, objectType, ids, properties);
177
+ }
178
+ const objectSegment = encodePathSegment(objectType, "object");
179
+ const results = [];
180
+ let after;
181
+ while (results.length < opts.limit) {
182
+ const params = new URLSearchParams();
183
+ params.set("limit", String(Math.min(opts.pageSize, opts.limit - results.length)));
184
+ params.set("archived", String(opts.archived));
185
+ params.set("properties", properties.join(","));
186
+ if (after)
187
+ params.set("after", after);
188
+ const page = await client.request(`/crm/v3/objects/${objectSegment}?${params.toString()}`);
189
+ for (const row of page.results ?? []) {
190
+ results.push({ id: row.id, properties: row.properties ?? {} });
191
+ if (results.length >= opts.limit)
192
+ break;
193
+ }
194
+ after = page.paging?.next?.after;
195
+ if (!after || (page.results ?? []).length === 0)
196
+ break;
197
+ }
198
+ return results;
199
+ }
200
+ async function fetchObjectIds(client, objectType, opts) {
201
+ const objectSegment = encodePathSegment(objectType, "object");
202
+ const ids = [];
203
+ let after;
204
+ while (ids.length < opts.limit) {
205
+ const params = new URLSearchParams();
206
+ params.set("limit", String(Math.min(opts.pageSize, opts.limit - ids.length)));
207
+ params.set("archived", String(opts.archived));
208
+ if (after)
209
+ params.set("after", after);
210
+ const page = await client.request(`/crm/v3/objects/${objectSegment}?${params.toString()}`);
211
+ for (const row of page.results ?? []) {
212
+ if (row.id)
213
+ ids.push(row.id);
214
+ if (ids.length >= opts.limit)
215
+ break;
216
+ }
217
+ after = page.paging?.next?.after;
218
+ if (!after || (page.results ?? []).length === 0)
219
+ break;
220
+ }
221
+ return ids;
222
+ }
223
+ async function batchReadObjectRecords(client, objectType, ids, properties) {
224
+ const objectSegment = encodePathSegment(objectType, "object");
225
+ const out = [];
226
+ for (let i = 0; i < ids.length; i += MAX_BATCH_READ_SIZE) {
227
+ const inputs = ids.slice(i, i + MAX_BATCH_READ_SIZE).map((id) => ({ id }));
228
+ const res = await client.request(`/crm/v3/objects/${objectSegment}/batch/read`, {
229
+ method: "POST",
230
+ permissionMode: "read",
231
+ body: { properties, inputs },
232
+ });
233
+ for (const row of res.results ?? []) {
234
+ out.push({ id: row.id, properties: row.properties ?? {} });
235
+ }
236
+ }
237
+ return out;
238
+ }
239
+ function buildFillRateRows(records, properties, schemaByName) {
240
+ return properties.map((property) => {
241
+ const filled = records.filter((record) => !isBlank(record.properties[property])).length;
242
+ const blank = records.length - filled;
243
+ const schema = schemaByName.get(property);
244
+ return compactObject({
245
+ property,
246
+ label: schema?.label,
247
+ type: schema?.type,
248
+ fieldType: schema?.fieldType,
249
+ filled,
250
+ blank,
251
+ fillRate: records.length === 0 ? 0 : filled / records.length,
252
+ });
253
+ });
254
+ }
255
+ function buildPropertyDistribution(records, property, top) {
256
+ const counts = new Map();
257
+ let blank = 0;
258
+ for (const record of records) {
259
+ const value = record.properties[property];
260
+ if (isBlank(value)) {
261
+ blank += 1;
262
+ continue;
263
+ }
264
+ for (const part of splitPropertyValue(value)) {
265
+ counts.set(part, (counts.get(part) ?? 0) + 1);
266
+ }
267
+ }
268
+ const results = [...counts.entries()]
269
+ .map(([value, count], index) => ({ value, count, percent: records.length === 0 ? 0 : count / records.length, index }))
270
+ .sort((a, b) => b.count - a.count || a.index - b.index)
271
+ .slice(0, top);
272
+ return { blank, distinct: counts.size, results: results.map(({ index: _index, ...row }) => row) };
273
+ }
274
+ async function pullEmailRecipients(client, opts) {
275
+ const byKey = new Map();
276
+ for (const campaignId of opts.campaignIds) {
277
+ for (const eventType of opts.eventTypes) {
278
+ const events = await fetchEmailEvents(client, campaignId, eventType, opts);
279
+ for (const event of events) {
280
+ const email = normalizeEmail(event.recipient ?? event.email ?? event.recipientEmail);
281
+ if (!email)
282
+ continue;
283
+ const key = `${campaignId}\n${email}`;
284
+ const row = byKey.get(key) ?? {
285
+ campaignId,
286
+ email,
287
+ events: new Set(),
288
+ bounceCategories: new Set(),
289
+ bounceStatuses: new Set(),
290
+ };
291
+ row.events.add((event.type ?? eventType).toUpperCase());
292
+ if (event.created !== undefined) {
293
+ row.firstEventAt = row.firstEventAt === undefined ? event.created : Math.min(row.firstEventAt, event.created);
294
+ row.lastEventAt = row.lastEventAt === undefined ? event.created : Math.max(row.lastEventAt, event.created);
295
+ }
296
+ if ((event.type ?? eventType).toUpperCase() === "BOUNCE") {
297
+ for (const category of bounceCategories(event))
298
+ row.bounceCategories.add(category);
299
+ for (const status of bounceStatuses(event))
300
+ row.bounceStatuses.add(status);
301
+ }
302
+ byKey.set(key, row);
303
+ }
304
+ }
305
+ }
306
+ return [...byKey.values()].sort((a, b) => a.campaignId.localeCompare(b.campaignId) || a.email.localeCompare(b.email));
307
+ }
308
+ async function fetchEmailEvents(client, campaignId, eventType, opts) {
309
+ const out = [];
310
+ let offset;
311
+ while (out.length < opts.limitPerEvent) {
312
+ const params = new URLSearchParams();
313
+ params.set("campaignId", campaignId);
314
+ params.set("eventType", eventType);
315
+ params.set("limit", String(Math.min(opts.pageSize, opts.limitPerEvent - out.length)));
316
+ if (opts.startTimestamp)
317
+ params.set("startTimestamp", opts.startTimestamp);
318
+ if (opts.endTimestamp)
319
+ params.set("endTimestamp", opts.endTimestamp);
320
+ if (offset)
321
+ params.set("offset", offset);
322
+ const page = await client.request(`/email/public/v1/events?${params.toString()}`);
323
+ const events = page.events ?? page.results ?? [];
324
+ out.push(...events.slice(0, opts.limitPerEvent - out.length));
325
+ offset = page.offset;
326
+ if (!page.hasMore || !offset || events.length === 0)
327
+ break;
328
+ }
329
+ return out;
330
+ }
331
+ async function enrichRecipientsWithContacts(client, recipients, properties) {
332
+ const emails = [...new Set(recipients.map((recipient) => recipient.email))];
333
+ const byEmail = new Map();
334
+ const requestedProperties = new Set(properties);
335
+ const readProperties = [...new Set(["email", ...properties])];
336
+ for (let i = 0; i < emails.length; i += MAX_BATCH_READ_SIZE) {
337
+ const inputs = emails.slice(i, i + MAX_BATCH_READ_SIZE).map((email) => ({ id: email }));
338
+ const res = await client.request("/crm/v3/objects/contacts/batch/read", {
339
+ method: "POST",
340
+ permissionMode: "read",
341
+ body: { idProperty: "email", properties: readProperties, inputs },
342
+ });
343
+ for (const row of res.results ?? []) {
344
+ const email = normalizeEmail(row.properties?.email);
345
+ if (!email)
346
+ continue;
347
+ const emitted = Object.fromEntries(Object.entries(row.properties ?? {}).filter(([key]) => requestedProperties.has(key)));
348
+ byEmail.set(email, emitted);
349
+ }
350
+ }
351
+ for (const recipient of recipients) {
352
+ recipient.contactProperties = byEmail.get(recipient.email);
353
+ }
354
+ }
355
+ function formatEmailRecipient(row) {
356
+ const events = [...row.events].sort();
357
+ const received = events.some((event) => event === "DELIVERED" || event === "OPEN" || event === "CLICK");
358
+ const hardBounce = isHardBounce(row);
359
+ const softBounce = !hardBounce && isSoftBounce(row);
360
+ const notDeliveredReason = received
361
+ ? ""
362
+ : hardBounce
363
+ ? "Hard bounce"
364
+ : softBounce
365
+ ? "Soft bounce"
366
+ : events.includes("SUPPRESSED")
367
+ ? "Suppressed"
368
+ : events.includes("DROPPED")
369
+ ? "Dropped"
370
+ : events.includes("DEFERRED")
371
+ ? "Deferred"
372
+ : events.includes("SENT")
373
+ ? "Sent, no delivery event"
374
+ : "";
375
+ return compactObject({
376
+ campaignId: row.campaignId,
377
+ email: row.email,
378
+ events,
379
+ received,
380
+ hardBounce,
381
+ softBounce,
382
+ notDeliveredReason,
383
+ contactProperties: row.contactProperties,
384
+ });
385
+ }
386
+ async function countObject(client, objectType, filterGroups) {
387
+ const objectSegment = encodePathSegment(objectType, "object");
388
+ const body = { limit: 1 };
389
+ if (filterGroups !== undefined)
390
+ body.filterGroups = Array.isArray(filterGroups) ? filterGroups : [filterGroups];
391
+ const res = await client.request(`/crm/v3/objects/${objectSegment}/search`, {
392
+ method: "POST",
393
+ permissionMode: "read",
394
+ body,
395
+ });
396
+ return Number(res.total ?? 0);
397
+ }
398
+ function isHardBounce(row) {
399
+ return [...row.bounceStatuses].some((status) => status.startsWith("5"))
400
+ || [...row.bounceCategories].some((category) => HARD_BOUNCE_CATEGORIES.has(category));
401
+ }
402
+ function isSoftBounce(row) {
403
+ return [...row.bounceStatuses].some((status) => status.startsWith("4"))
404
+ || [...row.bounceCategories].some((category) => SOFT_BOUNCE_CATEGORIES.has(category))
405
+ || row.events.has("BOUNCE");
406
+ }
407
+ function bounceCategories(event) {
408
+ const raw = event.category;
409
+ if (!raw)
410
+ return [];
411
+ return String(raw).split(/[,;]/).map((category) => category.trim().toUpperCase()).filter(Boolean);
412
+ }
413
+ function bounceStatuses(event) {
414
+ const explicit = event.status !== undefined ? [String(event.status)] : [];
415
+ const fromResponse = String(event.response ?? "").match(/\b[45]\d{2}\b/g) ?? [];
416
+ return [...new Set([...explicit, ...fromResponse])];
417
+ }
418
+ function splitPropertyValue(value) {
419
+ if (Array.isArray(value))
420
+ return value.map(String).map((part) => part.trim()).filter(Boolean);
421
+ return String(value).split(";").map((part) => part.trim()).filter(Boolean);
422
+ }
423
+ function isBlank(value) {
424
+ if (value === null || value === undefined)
425
+ return true;
426
+ if (Array.isArray(value))
427
+ return value.length === 0;
428
+ if (typeof value === "string")
429
+ return value.trim() === "";
430
+ return false;
431
+ }
432
+ function splitCsv(raw) {
433
+ return String(raw ?? "")
434
+ .split(",")
435
+ .map((value) => value.trim())
436
+ .filter(Boolean);
437
+ }
438
+ function parseRequired(raw, flagName) {
439
+ const value = raw?.trim();
440
+ if (!value)
441
+ throw new CliError("INVALID_FLAG", `${flagName} is required`);
442
+ return value;
443
+ }
444
+ function parsePositiveInt(raw, flagName) {
445
+ const parsed = Number(raw);
446
+ if (!Number.isInteger(parsed) || parsed < 1)
447
+ throw new CliError("INVALID_FLAG", `${flagName} must be a positive integer`);
448
+ return parsed;
449
+ }
450
+ function parsePageSize(raw) {
451
+ return Math.min(MAX_OBJECT_PAGE_SIZE, parsePositiveInt(raw, "--page-size"));
452
+ }
453
+ function parseBoolean(raw, flagName) {
454
+ if (raw === undefined)
455
+ return false;
456
+ if (raw === "true")
457
+ return true;
458
+ if (raw === "false")
459
+ return false;
460
+ throw new CliError("INVALID_FLAG", `${flagName} must be true or false`);
461
+ }
462
+ function parseJson(raw, flagName) {
463
+ try {
464
+ return JSON.parse(raw);
465
+ }
466
+ catch {
467
+ throw new CliError("INVALID_JSON", `${flagName} must be valid JSON`);
468
+ }
469
+ }
470
+ function normalizeEmail(value) {
471
+ return String(value ?? "").trim().toLowerCase();
472
+ }
473
+ function asRecord(value) {
474
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
475
+ }
476
+ function compactObject(input) {
477
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
478
+ }
479
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/reports/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ import type { HubSpotClient } from "../../core/http.js";
3
+ import type { CliContext } from "../../core/output.js";
4
+ import { type BrowserSessionOptions } from "../internal-session.js";
5
+ export interface SalesContentSearchOptions extends BrowserSessionOptions {
6
+ type?: string;
7
+ owner?: string;
8
+ query?: string;
9
+ limit?: string;
10
+ offset?: string;
11
+ }
12
+ export declare function searchSalesContent(client: HubSpotClient, portalId: string, options: SalesContentSearchOptions): Promise<unknown>;
13
+ export declare function registerSalesContent(program: Command, getCtx: () => CliContext): void;
@@ -0,0 +1,59 @@
1
+ import { CliError, printResult } from "../../core/output.js";
2
+ import { parseNumberFlag } from "../crm/shared.js";
3
+ import { addBrowserSessionOptions, resolveBrowserSession } from "../internal-session.js";
4
+ export async function searchSalesContent(client, portalId, options) {
5
+ const body = {
6
+ query: options.query ?? "",
7
+ limit: parseNumberFlag(options.limit ?? "100", "--limit"),
8
+ offset: parseOffset(options.offset ?? "0"),
9
+ };
10
+ const res = await client.request(`/api/salescontentsearch/v2/search?portalId=${encodeURIComponent(portalId)}`, { method: "POST", body, permissionMode: "read" });
11
+ return filterSalesContentResponse(res, options.type, options.owner);
12
+ }
13
+ export function registerSalesContent(program, getCtx) {
14
+ const salesContent = program
15
+ .command("sales-content")
16
+ .description("Internal HubSpot sales-content discovery (sequences, templates, playbooks, documents, snippets)");
17
+ addBrowserSessionOptions(salesContent
18
+ .command("search")
19
+ .option("--type <type>", "Filter contentType client-side, e.g. SEQUENCE|TEMPLATE|PLAYBOOK")
20
+ .option("--owner <id>", "Filter owner/user id client-side")
21
+ .option("--query <query>", "Search query", "")
22
+ .option("--limit <n>", "Page size", "100")
23
+ .option("--offset <n>", "Offset", "0")).action(async (opts) => {
24
+ const ctx = getCtx();
25
+ const session = resolveBrowserSession(ctx, opts, "Sales-content internal search", true);
26
+ const res = await searchSalesContent(session.client, session.portalId, opts);
27
+ printResult(ctx, res);
28
+ });
29
+ }
30
+ function parseOffset(raw) {
31
+ const parsed = Number(raw);
32
+ if (!Number.isInteger(parsed) || parsed < 0) {
33
+ throw new CliError("INVALID_FLAG", "--offset must be a non-negative integer");
34
+ }
35
+ return parsed;
36
+ }
37
+ function filterSalesContentResponse(value, type, owner) {
38
+ if (!isRecord(value) || !Array.isArray(value.results))
39
+ return value;
40
+ const expectedType = type?.trim().toUpperCase();
41
+ const expectedOwner = owner?.trim();
42
+ const results = value.results.filter((item) => {
43
+ if (!isRecord(item))
44
+ return false;
45
+ if (expectedType && String(item.contentType ?? "").toUpperCase() !== expectedType)
46
+ return false;
47
+ if (expectedOwner) {
48
+ const ownerValue = item.ownerId ?? item.owner ?? item.userId ?? item.createdBy;
49
+ if (String(ownerValue ?? "") !== expectedOwner)
50
+ return false;
51
+ }
52
+ return true;
53
+ });
54
+ return { ...value, results };
55
+ }
56
+ function isRecord(value) {
57
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sales-content/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAA8B,MAAM,wBAAwB,CAAC;AAUrH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAqB,EACrB,QAAgB,EAChB,OAAkC;IAElC,MAAM,IAAI,GAAG;QACX,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,SAAS,CAAC;QACzD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;KAC3C,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAC9B,8CAA8C,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAC5E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CACjD,CAAC;IACF,OAAO,0BAA0B,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,MAAwB;IAC7E,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iGAAiG,CAAC,CAAC;IAElH,wBAAwB,CACtB,YAAY;SACT,OAAO,CAAC,QAAQ,CAAC;SACjB,MAAM,CAAC,eAAe,EAAE,iEAAiE,CAAC;SAC1F,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,cAAc,EAAE,EAAE,CAAC;SAC7C,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,GAAG,CAAC,CACzC,CAAC,MAAM,CAAC,KAAK,EAAE,IAA+B,EAAE,EAAE;QACjD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC;QACxF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAS,EAAE,IAAI,CAAC,CAAC;QAC9E,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,yCAAyC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc,EAAE,IAAa,EAAE,KAAc;IAC/E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,YAAY,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,YAAY;YAAE,OAAO,KAAK,CAAC;QAChG,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC;YAC/E,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,KAAK,aAAa;gBAAE,OAAO,KAAK,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../../core/output.js";
3
+ export declare function registerSalesTemplates(program: Command, getCtx: () => CliContext): void;