@revfleet/hscli 0.5.3

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 (329) hide show
  1. package/CHANGELOG.md +466 -0
  2. package/LICENSE +21 -0
  3. package/README.md +287 -0
  4. package/SECURITY.md +68 -0
  5. package/dist/cli.d.ts +8 -0
  6. package/dist/cli.js +192 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/account/index.d.ts +3 -0
  9. package/dist/commands/account/index.js +65 -0
  10. package/dist/commands/account/index.js.map +1 -0
  11. package/dist/commands/api/index.d.ts +3 -0
  12. package/dist/commands/api/index.js +35 -0
  13. package/dist/commands/api/index.js.map +1 -0
  14. package/dist/commands/auth/index.d.ts +3 -0
  15. package/dist/commands/auth/index.js +229 -0
  16. package/dist/commands/auth/index.js.map +1 -0
  17. package/dist/commands/automation/index.d.ts +3 -0
  18. package/dist/commands/automation/index.js +119 -0
  19. package/dist/commands/automation/index.js.map +1 -0
  20. package/dist/commands/cms/blog-settings.d.ts +3 -0
  21. package/dist/commands/cms/blog-settings.js +70 -0
  22. package/dist/commands/cms/blog-settings.js.map +1 -0
  23. package/dist/commands/cms/content-ops.d.ts +13 -0
  24. package/dist/commands/cms/content-ops.js +262 -0
  25. package/dist/commands/cms/content-ops.js.map +1 -0
  26. package/dist/commands/cms/hubdb.d.ts +3 -0
  27. package/dist/commands/cms/hubdb.js +55 -0
  28. package/dist/commands/cms/hubdb.js.map +1 -0
  29. package/dist/commands/cms/index.d.ts +3 -0
  30. package/dist/commands/cms/index.js +119 -0
  31. package/dist/commands/cms/index.js.map +1 -0
  32. package/dist/commands/cms/source-code.d.ts +3 -0
  33. package/dist/commands/cms/source-code.js +101 -0
  34. package/dist/commands/cms/source-code.js.map +1 -0
  35. package/dist/commands/communication-preferences/index.d.ts +3 -0
  36. package/dist/commands/communication-preferences/index.js +107 -0
  37. package/dist/commands/communication-preferences/index.js.map +1 -0
  38. package/dist/commands/conversations/index.d.ts +3 -0
  39. package/dist/commands/conversations/index.js +233 -0
  40. package/dist/commands/conversations/index.js.map +1 -0
  41. package/dist/commands/crm/associations.d.ts +3 -0
  42. package/dist/commands/crm/associations.js +180 -0
  43. package/dist/commands/crm/associations.js.map +1 -0
  44. package/dist/commands/crm/cards.d.ts +3 -0
  45. package/dist/commands/crm/cards.js +72 -0
  46. package/dist/commands/crm/cards.js.map +1 -0
  47. package/dist/commands/crm/carts.d.ts +3 -0
  48. package/dist/commands/crm/carts.js +5 -0
  49. package/dist/commands/crm/carts.js.map +1 -0
  50. package/dist/commands/crm/communications.d.ts +3 -0
  51. package/dist/commands/crm/communications.js +5 -0
  52. package/dist/commands/crm/communications.js.map +1 -0
  53. package/dist/commands/crm/companies.d.ts +3 -0
  54. package/dist/commands/crm/companies.js +5 -0
  55. package/dist/commands/crm/companies.js.map +1 -0
  56. package/dist/commands/crm/contacts.d.ts +3 -0
  57. package/dist/commands/crm/contacts.js +5 -0
  58. package/dist/commands/crm/contacts.js.map +1 -0
  59. package/dist/commands/crm/custom-objects.d.ts +3 -0
  60. package/dist/commands/crm/custom-objects.js +83 -0
  61. package/dist/commands/crm/custom-objects.js.map +1 -0
  62. package/dist/commands/crm/dated.d.ts +9 -0
  63. package/dist/commands/crm/dated.js +247 -0
  64. package/dist/commands/crm/dated.js.map +1 -0
  65. package/dist/commands/crm/deals.d.ts +3 -0
  66. package/dist/commands/crm/deals.js +5 -0
  67. package/dist/commands/crm/deals.js.map +1 -0
  68. package/dist/commands/crm/describe.d.ts +3 -0
  69. package/dist/commands/crm/describe.js +89 -0
  70. package/dist/commands/crm/describe.js.map +1 -0
  71. package/dist/commands/crm/discounts.d.ts +3 -0
  72. package/dist/commands/crm/discounts.js +5 -0
  73. package/dist/commands/crm/discounts.js.map +1 -0
  74. package/dist/commands/crm/engagements.d.ts +3 -0
  75. package/dist/commands/crm/engagements.js +8 -0
  76. package/dist/commands/crm/engagements.js.map +1 -0
  77. package/dist/commands/crm/fees.d.ts +3 -0
  78. package/dist/commands/crm/fees.js +5 -0
  79. package/dist/commands/crm/fees.js.map +1 -0
  80. package/dist/commands/crm/goals.d.ts +3 -0
  81. package/dist/commands/crm/goals.js +30 -0
  82. package/dist/commands/crm/goals.js.map +1 -0
  83. package/dist/commands/crm/imports.d.ts +3 -0
  84. package/dist/commands/crm/imports.js +45 -0
  85. package/dist/commands/crm/imports.js.map +1 -0
  86. package/dist/commands/crm/index.d.ts +3 -0
  87. package/dist/commands/crm/index.js +64 -0
  88. package/dist/commands/crm/index.js.map +1 -0
  89. package/dist/commands/crm/invoices.d.ts +3 -0
  90. package/dist/commands/crm/invoices.js +5 -0
  91. package/dist/commands/crm/invoices.js.map +1 -0
  92. package/dist/commands/crm/leads.d.ts +3 -0
  93. package/dist/commands/crm/leads.js +5 -0
  94. package/dist/commands/crm/leads.js.map +1 -0
  95. package/dist/commands/crm/line-items.d.ts +3 -0
  96. package/dist/commands/crm/line-items.js +5 -0
  97. package/dist/commands/crm/line-items.js.map +1 -0
  98. package/dist/commands/crm/orders.d.ts +3 -0
  99. package/dist/commands/crm/orders.js +5 -0
  100. package/dist/commands/crm/orders.js.map +1 -0
  101. package/dist/commands/crm/owners.d.ts +3 -0
  102. package/dist/commands/crm/owners.js +22 -0
  103. package/dist/commands/crm/owners.js.map +1 -0
  104. package/dist/commands/crm/payments.d.ts +3 -0
  105. package/dist/commands/crm/payments.js +5 -0
  106. package/dist/commands/crm/payments.js.map +1 -0
  107. package/dist/commands/crm/pipelines.d.ts +3 -0
  108. package/dist/commands/crm/pipelines.js +70 -0
  109. package/dist/commands/crm/pipelines.js.map +1 -0
  110. package/dist/commands/crm/products.d.ts +3 -0
  111. package/dist/commands/crm/products.js +5 -0
  112. package/dist/commands/crm/products.js.map +1 -0
  113. package/dist/commands/crm/properties.d.ts +3 -0
  114. package/dist/commands/crm/properties.js +103 -0
  115. package/dist/commands/crm/properties.js.map +1 -0
  116. package/dist/commands/crm/quotes.d.ts +3 -0
  117. package/dist/commands/crm/quotes.js +5 -0
  118. package/dist/commands/crm/quotes.js.map +1 -0
  119. package/dist/commands/crm/shared.d.ts +17 -0
  120. package/dist/commands/crm/shared.js +256 -0
  121. package/dist/commands/crm/shared.js.map +1 -0
  122. package/dist/commands/crm/subscriptions.d.ts +3 -0
  123. package/dist/commands/crm/subscriptions.js +5 -0
  124. package/dist/commands/crm/subscriptions.js.map +1 -0
  125. package/dist/commands/crm/sync.d.ts +3 -0
  126. package/dist/commands/crm/sync.js +116 -0
  127. package/dist/commands/crm/sync.js.map +1 -0
  128. package/dist/commands/crm/taxes.d.ts +3 -0
  129. package/dist/commands/crm/taxes.js +5 -0
  130. package/dist/commands/crm/taxes.js.map +1 -0
  131. package/dist/commands/crm/tickets.d.ts +3 -0
  132. package/dist/commands/crm/tickets.js +5 -0
  133. package/dist/commands/crm/tickets.js.map +1 -0
  134. package/dist/commands/crm/users.d.ts +3 -0
  135. package/dist/commands/crm/users.js +5 -0
  136. package/dist/commands/crm/users.js.map +1 -0
  137. package/dist/commands/doctor/index.d.ts +3 -0
  138. package/dist/commands/doctor/index.js +232 -0
  139. package/dist/commands/doctor/index.js.map +1 -0
  140. package/dist/commands/domains/shared.d.ts +13 -0
  141. package/dist/commands/domains/shared.js +56 -0
  142. package/dist/commands/domains/shared.js.map +1 -0
  143. package/dist/commands/email-events/index.d.ts +3 -0
  144. package/dist/commands/email-events/index.js +77 -0
  145. package/dist/commands/email-events/index.js.map +1 -0
  146. package/dist/commands/events/index.d.ts +3 -0
  147. package/dist/commands/events/index.js +80 -0
  148. package/dist/commands/events/index.js.map +1 -0
  149. package/dist/commands/exports/index.d.ts +3 -0
  150. package/dist/commands/exports/index.js +45 -0
  151. package/dist/commands/exports/index.js.map +1 -0
  152. package/dist/commands/extensions/index.d.ts +3 -0
  153. package/dist/commands/extensions/index.js +118 -0
  154. package/dist/commands/extensions/index.js.map +1 -0
  155. package/dist/commands/feature-flags/index.d.ts +3 -0
  156. package/dist/commands/feature-flags/index.js +65 -0
  157. package/dist/commands/feature-flags/index.js.map +1 -0
  158. package/dist/commands/files/folders.d.ts +3 -0
  159. package/dist/commands/files/folders.js +74 -0
  160. package/dist/commands/files/folders.js.map +1 -0
  161. package/dist/commands/files/index.d.ts +3 -0
  162. package/dist/commands/files/index.js +30 -0
  163. package/dist/commands/files/index.js.map +1 -0
  164. package/dist/commands/forms/index.d.ts +3 -0
  165. package/dist/commands/forms/index.js +37 -0
  166. package/dist/commands/forms/index.js.map +1 -0
  167. package/dist/commands/integrations/index.d.ts +3 -0
  168. package/dist/commands/integrations/index.js +64 -0
  169. package/dist/commands/integrations/index.js.map +1 -0
  170. package/dist/commands/integrators/index.d.ts +3 -0
  171. package/dist/commands/integrators/index.js +79 -0
  172. package/dist/commands/integrators/index.js.map +1 -0
  173. package/dist/commands/legacy/index.d.ts +13 -0
  174. package/dist/commands/legacy/index.js +254 -0
  175. package/dist/commands/legacy/index.js.map +1 -0
  176. package/dist/commands/legacy-v1/index.d.ts +29 -0
  177. package/dist/commands/legacy-v1/index.js +568 -0
  178. package/dist/commands/legacy-v1/index.js.map +1 -0
  179. package/dist/commands/lists/index.d.ts +3 -0
  180. package/dist/commands/lists/index.js +148 -0
  181. package/dist/commands/lists/index.js.map +1 -0
  182. package/dist/commands/marketing/ads.d.ts +3 -0
  183. package/dist/commands/marketing/ads.js +45 -0
  184. package/dist/commands/marketing/ads.js.map +1 -0
  185. package/dist/commands/marketing/behavioral-events.d.ts +3 -0
  186. package/dist/commands/marketing/behavioral-events.js +38 -0
  187. package/dist/commands/marketing/behavioral-events.js.map +1 -0
  188. package/dist/commands/marketing/events.d.ts +3 -0
  189. package/dist/commands/marketing/events.js +69 -0
  190. package/dist/commands/marketing/events.js.map +1 -0
  191. package/dist/commands/marketing/index.d.ts +3 -0
  192. package/dist/commands/marketing/index.js +55 -0
  193. package/dist/commands/marketing/index.js.map +1 -0
  194. package/dist/commands/marketing/landing-pages.d.ts +3 -0
  195. package/dist/commands/marketing/landing-pages.js +48 -0
  196. package/dist/commands/marketing/landing-pages.js.map +1 -0
  197. package/dist/commands/marketing/seo.d.ts +3 -0
  198. package/dist/commands/marketing/seo.js +35 -0
  199. package/dist/commands/marketing/seo.js.map +1 -0
  200. package/dist/commands/marketing/social.d.ts +3 -0
  201. package/dist/commands/marketing/social.js +45 -0
  202. package/dist/commands/marketing/social.js.map +1 -0
  203. package/dist/commands/marketing/subscriptions.d.ts +3 -0
  204. package/dist/commands/marketing/subscriptions.js +27 -0
  205. package/dist/commands/marketing/subscriptions.js.map +1 -0
  206. package/dist/commands/marketing/transactional.d.ts +3 -0
  207. package/dist/commands/marketing/transactional.js +30 -0
  208. package/dist/commands/marketing/transactional.js.map +1 -0
  209. package/dist/commands/marketing-emails-v1/index.d.ts +3 -0
  210. package/dist/commands/marketing-emails-v1/index.js +72 -0
  211. package/dist/commands/marketing-emails-v1/index.js.map +1 -0
  212. package/dist/commands/mcp.d.ts +2 -0
  213. package/dist/commands/mcp.js +10 -0
  214. package/dist/commands/mcp.js.map +1 -0
  215. package/dist/commands/media-bridge/index.d.ts +3 -0
  216. package/dist/commands/media-bridge/index.js +209 -0
  217. package/dist/commands/media-bridge/index.js.map +1 -0
  218. package/dist/commands/reporting/index.d.ts +3 -0
  219. package/dist/commands/reporting/index.js +73 -0
  220. package/dist/commands/reporting/index.js.map +1 -0
  221. package/dist/commands/sales/calling.d.ts +3 -0
  222. package/dist/commands/sales/calling.js +32 -0
  223. package/dist/commands/sales/calling.js.map +1 -0
  224. package/dist/commands/sales/index.d.ts +3 -0
  225. package/dist/commands/sales/index.js +10 -0
  226. package/dist/commands/sales/index.js.map +1 -0
  227. package/dist/commands/sales/meetings.d.ts +3 -0
  228. package/dist/commands/sales/meetings.js +37 -0
  229. package/dist/commands/sales/meetings.js.map +1 -0
  230. package/dist/commands/sales/sequences.d.ts +3 -0
  231. package/dist/commands/sales/sequences.js +78 -0
  232. package/dist/commands/sales/sequences.js.map +1 -0
  233. package/dist/commands/seed/cms.d.ts +6 -0
  234. package/dist/commands/seed/cms.js +204 -0
  235. package/dist/commands/seed/cms.js.map +1 -0
  236. package/dist/commands/seed/commerce.d.ts +3 -0
  237. package/dist/commands/seed/commerce.js +117 -0
  238. package/dist/commands/seed/commerce.js.map +1 -0
  239. package/dist/commands/seed/context.d.ts +8 -0
  240. package/dist/commands/seed/context.js +76 -0
  241. package/dist/commands/seed/context.js.map +1 -0
  242. package/dist/commands/seed/crm-core.d.ts +3 -0
  243. package/dist/commands/seed/crm-core.js +137 -0
  244. package/dist/commands/seed/crm-core.js.map +1 -0
  245. package/dist/commands/seed/data.d.ts +73 -0
  246. package/dist/commands/seed/data.js +49 -0
  247. package/dist/commands/seed/data.js.map +1 -0
  248. package/dist/commands/seed/engagements.d.ts +3 -0
  249. package/dist/commands/seed/engagements.js +89 -0
  250. package/dist/commands/seed/engagements.js.map +1 -0
  251. package/dist/commands/seed/index.d.ts +3 -0
  252. package/dist/commands/seed/index.js +95 -0
  253. package/dist/commands/seed/index.js.map +1 -0
  254. package/dist/commands/seed/infra.d.ts +6 -0
  255. package/dist/commands/seed/infra.js +163 -0
  256. package/dist/commands/seed/infra.js.map +1 -0
  257. package/dist/commands/seed/marketing.d.ts +3 -0
  258. package/dist/commands/seed/marketing.js +172 -0
  259. package/dist/commands/seed/marketing.js.map +1 -0
  260. package/dist/commands/seed/shared.d.ts +8 -0
  261. package/dist/commands/seed/shared.js +37 -0
  262. package/dist/commands/seed/shared.js.map +1 -0
  263. package/dist/commands/seed/types.d.ts +44 -0
  264. package/dist/commands/seed/types.js +2 -0
  265. package/dist/commands/seed/types.js.map +1 -0
  266. package/dist/commands/service/chatflows.d.ts +3 -0
  267. package/dist/commands/service/chatflows.js +30 -0
  268. package/dist/commands/service/chatflows.js.map +1 -0
  269. package/dist/commands/service/index.d.ts +3 -0
  270. package/dist/commands/service/index.js +25 -0
  271. package/dist/commands/service/index.js.map +1 -0
  272. package/dist/commands/service/knowledge-base.d.ts +3 -0
  273. package/dist/commands/service/knowledge-base.js +19 -0
  274. package/dist/commands/service/knowledge-base.js.map +1 -0
  275. package/dist/commands/service/pipelines.d.ts +3 -0
  276. package/dist/commands/service/pipelines.js +36 -0
  277. package/dist/commands/service/pipelines.js.map +1 -0
  278. package/dist/commands/settings/index.d.ts +3 -0
  279. package/dist/commands/settings/index.js +149 -0
  280. package/dist/commands/settings/index.js.map +1 -0
  281. package/dist/commands/site-search/index.d.ts +3 -0
  282. package/dist/commands/site-search/index.js +36 -0
  283. package/dist/commands/site-search/index.js.map +1 -0
  284. package/dist/commands/timeline/index.d.ts +3 -0
  285. package/dist/commands/timeline/index.js +32 -0
  286. package/dist/commands/timeline/index.js.map +1 -0
  287. package/dist/commands/webhooks/index.d.ts +3 -0
  288. package/dist/commands/webhooks/index.js +41 -0
  289. package/dist/commands/webhooks/index.js.map +1 -0
  290. package/dist/commands/workflows/index.d.ts +3 -0
  291. package/dist/commands/workflows/index.js +13 -0
  292. package/dist/commands/workflows/index.js.map +1 -0
  293. package/dist/core/auth.d.ts +33 -0
  294. package/dist/core/auth.js +137 -0
  295. package/dist/core/auth.js.map +1 -0
  296. package/dist/core/capabilities.d.ts +60 -0
  297. package/dist/core/capabilities.js +559 -0
  298. package/dist/core/capabilities.js.map +1 -0
  299. package/dist/core/http.d.ts +47 -0
  300. package/dist/core/http.js +433 -0
  301. package/dist/core/http.js.map +1 -0
  302. package/dist/core/output.d.ts +23 -0
  303. package/dist/core/output.js +197 -0
  304. package/dist/core/output.js.map +1 -0
  305. package/dist/core/permissions.d.ts +9 -0
  306. package/dist/core/permissions.js +27 -0
  307. package/dist/core/permissions.js.map +1 -0
  308. package/dist/core/plugins.d.ts +42 -0
  309. package/dist/core/plugins.js +94 -0
  310. package/dist/core/plugins.js.map +1 -0
  311. package/dist/core/policy.d.ts +2 -0
  312. package/dist/core/policy.js +38 -0
  313. package/dist/core/policy.js.map +1 -0
  314. package/dist/core/schema-cache.d.ts +56 -0
  315. package/dist/core/schema-cache.js +338 -0
  316. package/dist/core/schema-cache.js.map +1 -0
  317. package/dist/core/schemas.d.ts +96 -0
  318. package/dist/core/schemas.js +104 -0
  319. package/dist/core/schemas.js.map +1 -0
  320. package/dist/core/urls.d.ts +50 -0
  321. package/dist/core/urls.js +122 -0
  322. package/dist/core/urls.js.map +1 -0
  323. package/dist/core/vault.d.ts +37 -0
  324. package/dist/core/vault.js +143 -0
  325. package/dist/core/vault.js.map +1 -0
  326. package/dist/mcp/server.d.ts +5 -0
  327. package/dist/mcp/server.js +680 -0
  328. package/dist/mcp/server.js.map +1 -0
  329. package/package.json +84 -0
@@ -0,0 +1,163 @@
1
+ import { errorReason, safeAssociate, safeCreate } from "./shared.js";
2
+ /**
3
+ * Portal infrastructure: custom pipelines, custom object schemas, timeline
4
+ * event templates, webhook subscriptions, workflow (Ops Hub Pro+).
5
+ */
6
+ export async function seedInfra(ctx, result) {
7
+ const { client, runSuffix } = ctx;
8
+ // --- Custom deal pipeline ---
9
+ try {
10
+ const rec = await safeCreate(client, "/crm/v3/pipelines/deals", {
11
+ label: `HubCLI Seed Pipeline ${runSuffix}`,
12
+ displayOrder: 99,
13
+ stages: [
14
+ { label: "Lead", metadata: { probability: "0.1" }, displayOrder: 0 },
15
+ { label: "Qualified", metadata: { probability: "0.3" }, displayOrder: 1 },
16
+ { label: "Proposal", metadata: { probability: "0.7" }, displayOrder: 2 },
17
+ { label: "Won", metadata: { probability: "1.0" }, displayOrder: 3 },
18
+ ],
19
+ });
20
+ if (rec)
21
+ result.created.push({ type: "pipeline:deals", name: `HubCLI Seed Pipeline ${runSuffix}`, id: rec.id });
22
+ }
23
+ catch (err) {
24
+ result.skipped.push({ type: "pipeline:deals", name: "HubCLI Seed Pipeline", reason: errorReason(err) });
25
+ }
26
+ // --- Custom ticket pipeline ---
27
+ try {
28
+ const rec = await safeCreate(client, "/crm/v3/pipelines/tickets", {
29
+ label: `HubCLI Seed Ticket Pipeline ${runSuffix}`,
30
+ displayOrder: 99,
31
+ stages: [
32
+ { label: "New", metadata: { ticketState: "OPEN" }, displayOrder: 0 },
33
+ { label: "Waiting on Contact", metadata: { ticketState: "OPEN" }, displayOrder: 1 },
34
+ { label: "Closed", metadata: { ticketState: "CLOSED" }, displayOrder: 2 },
35
+ ],
36
+ });
37
+ if (rec)
38
+ result.created.push({ type: "pipeline:tickets", name: `HubCLI Seed Ticket Pipeline ${runSuffix}`, id: rec.id });
39
+ }
40
+ catch (err) {
41
+ result.skipped.push({ type: "pipeline:tickets", name: "HubCLI Seed Ticket Pipeline", reason: errorReason(err) });
42
+ }
43
+ // --- Workflow (Ops Hub Pro+; tier-locked on Free) ---
44
+ try {
45
+ const rec = await safeCreate(client, "/automation/v4/flows", {
46
+ name: `HubCLI Seed Workflow ${runSuffix}`,
47
+ type: "WORKFLOW",
48
+ flowType: "CONTACT_FLOW",
49
+ objectTypeId: "0-1",
50
+ isEnabled: false,
51
+ });
52
+ if (rec)
53
+ result.created.push({ type: "workflow", name: `HubCLI Seed Workflow ${runSuffix}`, id: rec.id });
54
+ }
55
+ catch (err) {
56
+ result.skipped.push({ type: "workflow", name: "HubCLI Seed Workflow", reason: `${errorReason(err)} (Ops Hub Pro+ required)` });
57
+ }
58
+ // --- Timeline event template + one event (best-effort; dev-only in practice) ---
59
+ try {
60
+ const tmplRec = await safeCreate(client, "/crm/v3/timeline/event-templates", {
61
+ name: "hubcli_seed_event",
62
+ objectType: "contacts",
63
+ headerTemplate: "HubCLI Seed Event",
64
+ detailTemplate: "Event created by hubcli seed for testing.",
65
+ });
66
+ if (tmplRec) {
67
+ result.created.push({ type: "timeline_template", name: "hubcli_seed_event", id: tmplRec.id });
68
+ if (ctx.contactIds[0]) {
69
+ try {
70
+ const evRec = await safeCreate(client, "/crm/v3/timeline/events", {
71
+ eventTemplateId: tmplRec.id,
72
+ objectId: ctx.contactIds[0],
73
+ tokens: {},
74
+ });
75
+ if (evRec)
76
+ result.created.push({ type: "timeline_event", name: "HubCLI Seed Event", id: evRec.id });
77
+ }
78
+ catch { /* skip */ }
79
+ }
80
+ }
81
+ }
82
+ catch (err) {
83
+ result.skipped.push({ type: "timeline_template", name: "hubcli_seed_event", reason: errorReason(err) });
84
+ }
85
+ // --- Webhook subscription (dev-app context required) ---
86
+ try {
87
+ const rec = await safeCreate(client, "/webhooks/v3/subscriptions", {
88
+ eventType: "contact.creation",
89
+ propertyName: "",
90
+ active: false,
91
+ });
92
+ if (rec)
93
+ result.created.push({ type: "webhook_subscription", name: "contact.creation (inactive)", id: rec.id });
94
+ }
95
+ catch (err) {
96
+ result.skipped.push({ type: "webhook_subscription", name: "contact.creation", reason: errorReason(err) });
97
+ }
98
+ // --- Integrators timeline template (app-dev; best-effort) ---
99
+ try {
100
+ const rec = await safeCreate(client, `/integrators/timeline/v3/${runSuffix}/event/templates`, {
101
+ name: `hubcli_seed_template_${runSuffix}`,
102
+ objectType: "contacts",
103
+ headerTemplate: "HubCLI Seed Event",
104
+ detailTemplate: "Event emitted by hubcli seed.",
105
+ });
106
+ if (rec)
107
+ result.created.push({ type: "integrator_timeline_template", name: `hubcli_seed_template_${runSuffix}`, id: rec.id });
108
+ }
109
+ catch (err) {
110
+ result.skipped.push({ type: "integrator_timeline_template", name: "hubcli_seed_template", reason: errorReason(err) });
111
+ }
112
+ // --- Custom object schema (if none exist on portal) ---
113
+ if (ctx.customSchemas.length === 0) {
114
+ try {
115
+ const rec = await safeCreate(client, "/crm/v3/schemas", {
116
+ name: `hubcli_seed_object_${runSuffix}`,
117
+ labels: { singular: `Seed Object ${runSuffix}`, plural: `Seed Objects ${runSuffix}` },
118
+ primaryDisplayProperty: "name",
119
+ requiredProperties: ["name"],
120
+ searchableProperties: ["name"],
121
+ properties: [{ name: "name", label: "Name", type: "string", fieldType: "text" }],
122
+ associatedObjects: ["CONTACT"],
123
+ });
124
+ if (rec) {
125
+ result.created.push({ type: "custom_object_schema", name: `hubcli_seed_object_${runSuffix}`, id: rec.id });
126
+ try {
127
+ const objRec = await safeCreate(client, `/crm/v3/objects/hubcli_seed_object_${runSuffix}`, {
128
+ properties: { name: `Sample ${runSuffix}` },
129
+ });
130
+ if (objRec)
131
+ result.created.push({ type: `custom:hubcli_seed_object_${runSuffix}`, name: `Sample ${runSuffix}`, id: objRec.id });
132
+ }
133
+ catch { /* skip */ }
134
+ }
135
+ }
136
+ catch (err) {
137
+ result.skipped.push({ type: "custom_object_schema", name: "hubcli_seed_object", reason: errorReason(err) });
138
+ }
139
+ }
140
+ // --- Sample record per existing custom object schema ---
141
+ for (const schema of ctx.customSchemas) {
142
+ const props = { [schema.primaryDisplayProperty]: `Seed — ${schema.name} sample` };
143
+ const rec = await safeCreate(client, `/crm/v3/objects/${schema.objectTypeId}`, { properties: props });
144
+ if (rec) {
145
+ result.created.push({
146
+ type: `custom:${schema.name}`,
147
+ name: props[schema.primaryDisplayProperty],
148
+ id: rec.id,
149
+ url: ctx.recordUrl(schema.objectTypeId, rec.id),
150
+ });
151
+ if (ctx.companyIds[0]) {
152
+ const status = await safeAssociate(client, schema.objectTypeId, rec.id, "companies", ctx.companyIds[0]);
153
+ if (status === "ok") {
154
+ result.associations.push({ from: `${schema.name}:${rec.id}`, to: `company:${ctx.companyIds[0]}`, status });
155
+ }
156
+ else {
157
+ result.tips.push(`Association ${schema.name} ↔ companies not configured. Create it in HubSpot Settings → Data Management → Associations, then run: hubcli crm associations create ${schema.name} ${rec.id} companies ${ctx.companyIds[0]} --force`);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../../src/commands/seed/infra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SeedContext, SeedResult } from "./types.js";
2
+ /** Form, campaign, static list, custom property + group, marketing email draft, file import. */
3
+ export declare function seedMarketing(ctx: SeedContext, result: SeedResult): Promise<void>;
@@ -0,0 +1,172 @@
1
+ import { errorReason, futureDate, nowIso, safeCreate } from "./shared.js";
2
+ /** Form, campaign, static list, custom property + group, marketing email draft, file import. */
3
+ export async function seedMarketing(ctx, result) {
4
+ const { client, runSuffix } = ctx;
5
+ // --- Marketing Form (discover an active subscription type first) ---
6
+ try {
7
+ let subTypeId;
8
+ try {
9
+ const defs = await client.request("/communication-preferences/v3/definitions");
10
+ const activeSub = defs.subscriptionDefinitions?.find(s => s.active !== false);
11
+ if (activeSub?.id)
12
+ subTypeId = Number(activeSub.id);
13
+ }
14
+ catch { /* no subs */ }
15
+ if (subTypeId) {
16
+ const formName = `HubCLI Seed Contact Form ${runSuffix}`;
17
+ const now = nowIso();
18
+ const rec = await safeCreate(client, "/marketing/v3/forms/", {
19
+ name: formName,
20
+ formType: "hubspot",
21
+ archived: false,
22
+ createdAt: now,
23
+ updatedAt: now,
24
+ fieldGroups: [{
25
+ groupType: "default_group",
26
+ richTextType: "text",
27
+ fields: [
28
+ { objectTypeId: "0-1", name: "email", label: "Email", required: true, hidden: false, fieldType: "email", validation: { blockedEmailDomains: [], useDefaultBlockList: false } },
29
+ { objectTypeId: "0-1", name: "firstname", label: "First name", required: false, hidden: false, fieldType: "single_line_text" },
30
+ ],
31
+ }],
32
+ configuration: {
33
+ allowLinkToResetForEditors: false, archivable: true, cloneable: true,
34
+ createNewContactForNewEmail: true, editable: true, language: "en",
35
+ notifyContactOwner: false, notifyRecipients: [],
36
+ postSubmitAction: { type: "thank_you", value: "Thanks!" },
37
+ recaptchaEnabled: false, prePopulateKnownValues: false,
38
+ },
39
+ displayOptions: { renderRawHtml: false, theme: "default_style", submitButtonText: "Submit" },
40
+ legalConsentOptions: {
41
+ type: "legitimate_interest",
42
+ lawfulBasis: "lead",
43
+ privacyText: "HubCLI seed test form — not for production use.",
44
+ subscriptionTypeIds: [subTypeId],
45
+ },
46
+ });
47
+ if (rec)
48
+ result.created.push({ type: "form", name: formName, id: rec.id });
49
+ }
50
+ else {
51
+ result.skipped.push({ type: "form", name: "HubCLI Seed Form", reason: "no active subscription type on portal" });
52
+ }
53
+ }
54
+ catch (err) {
55
+ result.skipped.push({ type: "form", name: "HubCLI Seed Form", reason: errorReason(err) });
56
+ }
57
+ // --- Marketing campaign ---
58
+ try {
59
+ const rec = await safeCreate(client, "/marketing/v3/campaigns", {
60
+ properties: {
61
+ hs_name: `HubCLI Seed Campaign ${runSuffix}`,
62
+ hs_start_date: new Date().toISOString().split("T")[0],
63
+ hs_end_date: futureDate(60),
64
+ },
65
+ });
66
+ if (rec)
67
+ result.created.push({ type: "campaign", name: `HubCLI Seed Campaign ${runSuffix}`, id: rec.id });
68
+ }
69
+ catch (err) {
70
+ result.skipped.push({ type: "campaign", name: "HubCLI Seed Campaign", reason: `${errorReason(err)} (needs Marketing Hub Starter+)` });
71
+ }
72
+ // --- Static contact list ---
73
+ try {
74
+ const listName = `HubCLI Seed — Sample Contacts ${runSuffix}`;
75
+ const rec = await safeCreate(client, "/crm/v3/lists", {
76
+ name: listName,
77
+ processingType: "MANUAL",
78
+ objectTypeId: "0-1",
79
+ });
80
+ if (rec) {
81
+ result.created.push({ type: "list", name: listName, id: rec.id });
82
+ const validContacts = ctx.contactIds.filter((c) => Boolean(c));
83
+ if (validContacts.length > 0) {
84
+ try {
85
+ await client.request(`/crm/v3/lists/${rec.id}/memberships/add`, { method: "PUT", body: validContacts });
86
+ result.associations.push({ from: `list:${rec.id}`, to: `contacts:${validContacts.length}`, status: "ok" });
87
+ }
88
+ catch { /* ignore */ }
89
+ }
90
+ }
91
+ }
92
+ catch (err) {
93
+ result.skipped.push({ type: "list", name: "HubCLI Seed List", reason: errorReason(err) });
94
+ }
95
+ // --- Custom property group + property on contacts ---
96
+ try {
97
+ const rec = await safeCreate(client, "/crm/v3/properties/contacts/groups", {
98
+ name: "hubcli_seed_group",
99
+ label: "HubCLI Seed",
100
+ displayOrder: -1,
101
+ });
102
+ if (rec)
103
+ result.created.push({ type: "property_group", name: "hubcli_seed_group", id: "hubcli_seed_group" });
104
+ }
105
+ catch (err) {
106
+ result.skipped.push({ type: "property_group", name: "hubcli_seed_group", reason: errorReason(err) });
107
+ }
108
+ try {
109
+ const rec = await safeCreate(client, "/crm/v3/properties/contacts", {
110
+ name: "hubcli_seed_tag",
111
+ label: "HubCLI Seed Tag",
112
+ type: "string",
113
+ fieldType: "text",
114
+ groupName: "hubcli_seed_group",
115
+ description: "Tag set by hubcli seed command for testing.",
116
+ });
117
+ if (rec)
118
+ result.created.push({ type: "property", name: "hubcli_seed_tag", id: "hubcli_seed_tag" });
119
+ }
120
+ catch (err) {
121
+ result.skipped.push({ type: "property", name: "hubcli_seed_tag", reason: errorReason(err) });
122
+ }
123
+ // --- Marketing email (draft) ---
124
+ try {
125
+ const mktgEmailName = `HubCLI Seed Email ${runSuffix}`;
126
+ const rec = await safeCreate(client, "/marketing/v3/emails/", {
127
+ name: mktgEmailName,
128
+ subject: "Test from HubCLI seed",
129
+ language: "en",
130
+ subcategory: "batch",
131
+ sendOnPublish: false,
132
+ useRssHeadlineAsSubject: false,
133
+ content: { html: "<p>Test content from hubcli seed.</p>" },
134
+ subscriptionDetails: { subscriptionId: 0 },
135
+ });
136
+ if (rec)
137
+ result.created.push({ type: "marketing_email", name: mktgEmailName, id: rec.id });
138
+ }
139
+ catch (err) {
140
+ result.skipped.push({ type: "marketing_email", name: "HubCLI Seed Email", reason: errorReason(err) });
141
+ }
142
+ // --- File upload via URL import ---
143
+ try {
144
+ const rec = await client.request("/files/v3/files/import-from-url/async", {
145
+ method: "POST",
146
+ body: {
147
+ access: "PUBLIC_NOT_INDEXABLE",
148
+ name: `hubcli-seed-${runSuffix}.ico`,
149
+ url: "https://www.hubspot.com/favicon.ico",
150
+ folderPath: "/hubcli-seed",
151
+ },
152
+ });
153
+ if (rec?.id)
154
+ result.created.push({ type: "file_import_task", name: `hubcli-seed-${runSuffix}.ico`, id: rec.id });
155
+ }
156
+ catch (err) {
157
+ result.skipped.push({ type: "file_import_task", name: "hubcli-seed file", reason: errorReason(err) });
158
+ }
159
+ // --- Transactional SMTP token (Marketing Hub Pro+; expected fail on Free) ---
160
+ try {
161
+ const rec = await safeCreate(client, "/marketing/v3/transactional/smtp-tokens", {
162
+ createContact: false,
163
+ campaignName: `HubCLI Seed ${runSuffix}`,
164
+ });
165
+ if (rec)
166
+ result.created.push({ type: "smtp_token", name: `HubCLI Seed Campaign ${runSuffix}`, id: rec.id });
167
+ }
168
+ catch (err) {
169
+ result.skipped.push({ type: "smtp_token", name: "HubCLI Seed Campaign", reason: errorReason(err) });
170
+ }
171
+ }
172
+ //# sourceMappingURL=marketing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing.js","sourceRoot":"","sources":["../../../src/commands/seed/marketing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { HubSpotClient } from "../../core/http.js";
2
+ export declare function safeCreate(client: HubSpotClient, path: string, body: unknown): Promise<{
3
+ id: string;
4
+ } | null>;
5
+ export declare function safeAssociate(client: HubSpotClient, fromType: string, fromId: string, toType: string, toId: string): Promise<string>;
6
+ export declare function futureDate(daysFromNow: number): string;
7
+ export declare function nowIso(): string;
8
+ export declare function errorReason(err: unknown): string;
@@ -0,0 +1,37 @@
1
+ import { CliError } from "../../core/output.js";
2
+ export async function safeCreate(client, path, body) {
3
+ try {
4
+ const res = await client.request(path, { method: "POST", body });
5
+ if (res?.id)
6
+ return { id: res.id };
7
+ return null;
8
+ }
9
+ catch (err) {
10
+ if (err instanceof CliError && err.status === 409)
11
+ return null;
12
+ throw err;
13
+ }
14
+ }
15
+ export async function safeAssociate(client, fromType, fromId, toType, toId) {
16
+ try {
17
+ await client.request(`/crm/v4/objects/${fromType}/${fromId}/associations/default/${toType}/${toId}`, { method: "PUT" });
18
+ return "ok";
19
+ }
20
+ catch (err) {
21
+ if (err instanceof CliError && err.status === 400)
22
+ return "no_default_association";
23
+ throw err;
24
+ }
25
+ }
26
+ export function futureDate(daysFromNow) {
27
+ const d = new Date();
28
+ d.setDate(d.getDate() + daysFromNow);
29
+ return d.toISOString().split("T")[0];
30
+ }
31
+ export function nowIso() {
32
+ return new Date().toISOString();
33
+ }
34
+ export function errorReason(err) {
35
+ return err instanceof CliError ? `${err.code}:${err.status}` : "error";
36
+ }
37
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/seed/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAqB,EAAE,IAAY,EAAE,IAAa;IACjF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAoB,CAAC;QACpF,IAAI,GAAG,EAAE,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC/D,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAqB,EAAE,QAAgB,EAAE,MAAc,EAAE,MAAc,EAAE,IAAY;IACvH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAClB,mBAAmB,QAAQ,IAAI,MAAM,yBAAyB,MAAM,IAAI,IAAI,EAAE,EAC9E,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,wBAAwB,CAAC;QACnF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACzE,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { HubSpotClient } from "../../core/http.js";
2
+ import type { CliContext } from "../../core/output.js";
3
+ import type { PortalContext } from "../../core/urls.js";
4
+ export interface SeedResult {
5
+ created: Array<{
6
+ type: string;
7
+ name: string;
8
+ id: string;
9
+ url?: string;
10
+ }>;
11
+ associations: Array<{
12
+ from: string;
13
+ to: string;
14
+ status: string;
15
+ }>;
16
+ skipped: Array<{
17
+ type: string;
18
+ name: string;
19
+ reason: string;
20
+ }>;
21
+ tips: string[];
22
+ }
23
+ export interface SeedContext {
24
+ cliCtx: CliContext;
25
+ client: HubSpotClient;
26
+ portal: PortalContext | null;
27
+ runSuffix: string;
28
+ ownerId?: string;
29
+ dealPipeline?: string;
30
+ dealStage?: string;
31
+ ticketPipeline?: string;
32
+ ticketStage?: string;
33
+ customSchemas: Array<{
34
+ name: string;
35
+ objectTypeId: string;
36
+ primaryDisplayProperty: string;
37
+ }>;
38
+ contactIds: (string | null)[];
39
+ companyIds: (string | null)[];
40
+ dealIds: (string | null)[];
41
+ ticketIds: (string | null)[];
42
+ productIds: (string | null)[];
43
+ recordUrl: (objectTypeId: string, recordId: string) => string | undefined;
44
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/seed/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../../core/output.js";
3
+ export declare function registerChatflows(service: Command, getCtx: () => CliContext): void;
@@ -0,0 +1,30 @@
1
+ import { createClient } from "../../core/http.js";
2
+ import { printResult } from "../../core/output.js";
3
+ import { appendOptional, encodePathSegment, parseNumberFlag } from "../crm/shared.js";
4
+ export function registerChatflows(service, getCtx) {
5
+ const chatflows = service.command("chatflows").description("Chatflows / chat widgets");
6
+ chatflows
7
+ .command("list")
8
+ .option("--limit <n>", "Max records", "50")
9
+ .option("--after <cursor>", "Paging cursor")
10
+ .action(async (opts) => {
11
+ const ctx = getCtx();
12
+ const client = createClient(ctx.profile);
13
+ const params = new URLSearchParams();
14
+ params.set("limit", String(parseNumberFlag(opts.limit, "--limit")));
15
+ appendOptional(params, "after", opts.after);
16
+ const res = await client.request(`/conversations/v3/chatflows?${params.toString()}`);
17
+ printResult(ctx, res);
18
+ });
19
+ chatflows
20
+ .command("get")
21
+ .argument("<chatflowId>")
22
+ .action(async (chatflowId) => {
23
+ const ctx = getCtx();
24
+ const client = createClient(ctx.profile);
25
+ const id = encodePathSegment(chatflowId, "chatflowId");
26
+ const res = await client.request(`/conversations/v3/chatflows/${id}`);
27
+ printResult(ctx, res);
28
+ });
29
+ }
30
+ //# sourceMappingURL=chatflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatflows.js","sourceRoot":"","sources":["../../../src/commands/service/chatflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEtF,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAAwB;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAEvF,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QACpE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,+BAA+B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrF,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,cAAc,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QACtE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../../core/output.js";
3
+ export declare function registerService(program: Command, getCtx: () => CliContext): void;
@@ -0,0 +1,25 @@
1
+ import { registerResource } from "../domains/shared.js";
2
+ import { registerChatflows } from "./chatflows.js";
3
+ import { registerTicketPipelines } from "./pipelines.js";
4
+ import { registerKnowledgeBase } from "./knowledge-base.js";
5
+ export function registerService(program, getCtx) {
6
+ const service = program.command("service").description("HubSpot Service APIs");
7
+ registerResource(service, getCtx, {
8
+ name: "conversations",
9
+ description: "Conversation threads",
10
+ listPath: "/conversations/v3/conversations/threads",
11
+ itemPath: (id) => `/conversations/v3/conversations/threads/${id}`,
12
+ });
13
+ registerResource(service, getCtx, {
14
+ name: "feedback",
15
+ description: "Feedback submissions",
16
+ listPath: "/crm/v3/objects/feedback_submissions",
17
+ itemPath: (id) => `/crm/v3/objects/feedback_submissions/${id}`,
18
+ createPath: "/crm/v3/objects/feedback_submissions",
19
+ updatePath: (id) => `/crm/v3/objects/feedback_submissions/${id}`,
20
+ });
21
+ registerChatflows(service, getCtx);
22
+ registerTicketPipelines(service, getCtx);
23
+ registerKnowledgeBase(service, getCtx);
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/service/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,MAAwB;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAE/E,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE;QAChC,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,yCAAyC;QACnD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,2CAA2C,EAAE,EAAE;KAClE,CAAC,CAAC;IAEH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE;QAChC,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,sCAAsC;QAChD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,wCAAwC,EAAE,EAAE;QAC9D,UAAU,EAAE,sCAAsC;QAClD,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,wCAAwC,EAAE,EAAE;KACjE,CAAC,CAAC;IAEH,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../../core/output.js";
3
+ export declare function registerKnowledgeBase(service: Command, getCtx: () => CliContext): void;
@@ -0,0 +1,19 @@
1
+ import { createClient } from "../../core/http.js";
2
+ import { printResult } from "../../core/output.js";
3
+ export function registerKnowledgeBase(service, getCtx) {
4
+ const kb = service.command("kb").description("Knowledge base (best-effort, API may not be publicly available)");
5
+ kb.command("status")
6
+ .description("Check knowledge base availability")
7
+ .action(async () => {
8
+ const ctx = getCtx();
9
+ const client = createClient(ctx.profile);
10
+ try {
11
+ const res = await client.request("/cms/v3/blogs/posts?contentGroupId=kb&limit=1");
12
+ printResult(ctx, res);
13
+ }
14
+ catch (err) {
15
+ printResult(ctx, { status: "unavailable", message: "Knowledge base API is not available or not configured", error: err instanceof Error ? err.message : String(err) });
16
+ }
17
+ });
18
+ }
19
+ //# sourceMappingURL=knowledge-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-base.js","sourceRoot":"","sources":["../../../src/commands/service/knowledge-base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,MAAwB;IAC9E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,iEAAiE,CAAC,CAAC;IAEhH,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;YAClF,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,uDAAuD,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzK,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../../core/output.js";
3
+ export declare function registerTicketPipelines(service: Command, getCtx: () => CliContext): void;
@@ -0,0 +1,36 @@
1
+ import { createClient } from "../../core/http.js";
2
+ import { printResult } from "../../core/output.js";
3
+ import { encodePathSegment } from "../crm/shared.js";
4
+ export function registerTicketPipelines(service, getCtx) {
5
+ const pipelines = service.command("pipelines").description("Ticket pipelines and stages");
6
+ pipelines
7
+ .command("list")
8
+ .action(async () => {
9
+ const ctx = getCtx();
10
+ const client = createClient(ctx.profile);
11
+ const res = await client.request("/crm/v3/pipelines/tickets");
12
+ printResult(ctx, res);
13
+ });
14
+ pipelines
15
+ .command("get")
16
+ .argument("<pipelineId>")
17
+ .action(async (pipelineId) => {
18
+ const ctx = getCtx();
19
+ const client = createClient(ctx.profile);
20
+ const id = encodePathSegment(pipelineId, "pipelineId");
21
+ const res = await client.request(`/crm/v3/pipelines/tickets/${id}`);
22
+ printResult(ctx, res);
23
+ });
24
+ pipelines
25
+ .command("stages")
26
+ .argument("<pipelineId>")
27
+ .description("List stages for a ticket pipeline")
28
+ .action(async (pipelineId) => {
29
+ const ctx = getCtx();
30
+ const client = createClient(ctx.profile);
31
+ const id = encodePathSegment(pipelineId, "pipelineId");
32
+ const res = await client.request(`/crm/v3/pipelines/tickets/${id}/stages`);
33
+ printResult(ctx, res);
34
+ });
35
+ }
36
+ //# sourceMappingURL=pipelines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipelines.js","sourceRoot":"","sources":["../../../src/commands/service/pipelines.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,MAAwB;IAChF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE1F,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC9D,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,cAAc,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACpE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,cAAc,CAAC;SACxB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;QAC3E,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliContext } from "../../core/output.js";
3
+ export declare function registerSettings(program: Command, getCtx: () => CliContext): void;